UNPKG

@cnamts/vue-dot

Version:

Implementation of our Design System for the French Health Insurance

95 lines (71 loc) 1.8 kB
import Component, { mixins } from 'vue-class-component'; import { FileValidation } from './fileValidation'; import { Refs } from '../../../types'; import { HTMLInputEvent } from '../types'; const MixinsDeclaration = mixins(FileValidation); @Component export class FileUploadCore extends MixinsDeclaration { $refs!: Refs<{ vdInputEl: HTMLInputElement; }>; dragover = false; inputValueChanged(event: HTMLInputEvent): void { if (!event.target) { return; } const files = event.target.files; this.selfReset(); if (!files || !files.length) { return; } if (this.ifTooManyFiles(files)) { return; } for (let i = 0; i < files.length; i++) { this.validateAndSaveFiles(files[i]); } this.emitChangeEvent(); } emitChangeEvent(): void { if (!this.error) { const eventValue = this.multiple ? this.files : this.files[0]; this.$emit('change', eventValue); } // Reset file input after everything for IE this.$refs.vdInputEl.value = ''; } dropHandler(e: DragEvent): void { this.selfReset(); const data = e.dataTransfer; if (!data) { return; } const files = data.items || data.files; if (this.ifTooManyFiles(files)) { return; } if (data.items) { // Use DataTransferItemList interface to access the file(s) for (let i = 0; i < data.items.length; i++) { if (data.items[i].kind === 'file') { const file = data.items[i].getAsFile(); if (!file) { return; } this.validateAndSaveFiles(file); } } } else { // Use DataTransfer interface to access the file(s) for (let i = 0; i < data.files.length; i++) { this.validateAndSaveFiles(data.files[i]); } } this.emitChangeEvent(); } selfReset(): void { this.dragover = false; this.error = false; this.files = []; } }