| <template> |
| <div class="custom-form-file-container"> |
| <label> |
| <b-form-file |
| :id="id" |
| v-model="file" |
| :accept="accept" |
| :disabled="disabled" |
| :state="state" |
| plain |
| @input="$emit('input', file)" |
| > |
| </b-form-file> |
| <span |
| class="add-file-btn btn" |
| :class="{ |
| disabled, |
| 'btn-secondary': isSecondary, |
| 'btn-primary': !isSecondary, |
| }" |
| > |
| {{ $t('global.fileUpload.browseText') }} |
| </span> |
| <slot name="invalid"></slot> |
| </label> |
| <div v-if="file" class="clear-selected-file px-3 py-2 mt-2"> |
| {{ file ? file.name : '' }} |
| <b-button |
| variant="light" |
| class="px-2 ml-auto" |
| :disabled="disabled" |
| @click="file = null" |
| ><icon-close :title="$t('global.fileUpload.clearSelectedFile')" /><span |
| class="sr-only" |
| >{{ $t('global.fileUpload.clearSelectedFile') }}</span |
| > |
| </b-button> |
| </div> |
| </div> |
| </template> |
| |
| <script> |
| import { BFormFile } from 'bootstrap-vue'; |
| import IconClose from '@carbon/icons-vue/es/close/20'; |
| import { useI18n } from 'vue-i18n'; |
| |
| export default { |
| name: 'FormFile', |
| components: { BFormFile, IconClose }, |
| props: { |
| id: { |
| type: String, |
| default: '', |
| }, |
| disabled: { |
| type: Boolean, |
| default: false, |
| }, |
| accept: { |
| type: String, |
| default: '', |
| }, |
| state: { |
| type: Boolean, |
| default: true, |
| }, |
| variant: { |
| type: String, |
| default: 'secondary', |
| }, |
| }, |
| data() { |
| return { |
| $t: useI18n().t, |
| file: null, |
| }; |
| }, |
| computed: { |
| isSecondary() { |
| return this.variant === 'secondary'; |
| }, |
| }, |
| }; |
| </script> |
| |
| <style lang="scss" scoped> |
| @import '@/assets/styles/bmc/helpers/_index.scss'; |
| @import '@/assets/styles/bootstrap/_helpers.scss'; |
| |
| .form-control-file { |
| opacity: 0; |
| height: 0; |
| &:focus + span { |
| box-shadow: |
| inset 0 0 0 3px theme-color('primary'), |
| inset 0 0 0 5px $white; |
| } |
| } |
| |
| // Get mouse pointer on complete element |
| .add-file-btn { |
| position: relative; |
| &.disabled { |
| border-color: gray('400'); |
| background-color: gray('400'); |
| color: gray('600'); |
| box-shadow: none !important; |
| } |
| } |
| |
| .clear-selected-file { |
| display: flex; |
| align-items: center; |
| background-color: theme-color('light'); |
| word-break: break-all; // break long file name into multiple lines |
| .btn { |
| width: 36px; |
| height: 36px; |
| display: flex; |
| align-items: center; |
| |
| &:focus { |
| box-shadow: inset 0 0 0 2px theme-color('primary'); |
| } |
| } |
| } |
| </style> |