views/mdc/assets/js/components/file-inputs.js
import {VBaseComponent, hookupComponents} from './base-component';
import {eventHandlerMixin} from './mixins/event-handler';
import {dirtyableMixin} from './mixins/dirtyable';
export function initFileInputs(e) {
console.debug('\tFile Inputs');
hookupComponents(e, '.v-file-input', VFileInput, null);
}
export class VFileInput extends dirtyableMixin(eventHandlerMixin(VBaseComponent)) {
constructor(element, mdcComponent) {
super(element, mdcComponent);
this.input = element.querySelector('input[type=file]');
this.accept = element.dataset.accept;
this.preview = JSON.parse(element.dataset.preview);
['change'].forEach((e) => {
element.addEventListener(e, (e) => this.handleFileSelection(e),
false);
});
this.originalValue = this.input.value;
}
prepareSubmit(params) {
params.push([this.name(), this.value()]);
}
name() {
return this.input.name;
}
value() {
return this.input.files[0];
}
previewComponent(e) {
if (!this.preview) return null;
for (const previewId of this.preview) {
const elem = this.root.querySelector(`#${previewId}`);
if (elem && elem.vComponent && elem.vComponent.preview) {
this.file = e.target.files[0];
const fr = new FileReader();
fr.onload = (e) => {
this.previewSelection(e, elem.vComponent);
};
if (this.accept.startsWith('text')) {
fr.readAsText(this.file);
}
else {
fr.readAsDataURL(this.file);
}
}
else {
console.warn(
`WARNING: Unable to find previewable element with id: ${previewId}
1) Make sure you have an element with that id on your page
2) Make sure the Componenet or Plugin supports the preview option for the request mime type`);
}
}
}
previewSelection(e, previewComp) {
previewComp.preview(e.target.result, this.accepts, this.file);
}
isDirty() {
return this.dirtyable && this.input.value !== this.originalValue;
}
// From an example based on: https://www.quirksmode.org/dom/inputfile.html
handleFileSelection(e) {
this.previewComponent(e);
}
}