55 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <div class="custom-file">
 | |
|     <input type="file"
 | |
|            class="custom-file-input"
 | |
|            id="customFileLang"
 | |
|            lang="en"
 | |
|            v-bind="$attrs"
 | |
|            v-on="listeners"
 | |
|     />
 | |
|     <label class="custom-file-label" for="customFileLang">
 | |
|       {{label}}
 | |
|     </label>
 | |
|   </div>
 | |
| </template>
 | |
| <script>
 | |
|   export default {
 | |
|     name: 'file-input',
 | |
|     inheritAttrs: false,
 | |
|     props: {
 | |
|       initialLabel: {
 | |
|         type: String,
 | |
|         default: 'Select file'
 | |
|       }
 | |
|     },
 | |
|     data() {
 | |
|       return {
 | |
|         files: []
 | |
|       }
 | |
|     },
 | |
|     computed: {
 | |
|       listeners() {
 | |
|         return {
 | |
|           ...this.$listeners,
 | |
|           change: this.fileChange
 | |
|         }
 | |
|       },
 | |
|       label() {
 | |
|         let fileNames = [];
 | |
|         for (let file of this.files) {
 | |
|           fileNames.push(file.name)
 | |
|         }
 | |
|         return fileNames.length ? fileNames.join(', ') : this.initialLabel
 | |
|       }
 | |
|     },
 | |
|     methods: {
 | |
|       fileChange(evt) {
 | |
|         this.files = evt.target.files
 | |
|         this.$emit('change', this.files)
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| </script>
 | |
| <style>
 | |
| </style>
 |