diff --git a/public/js/components/Form/Upload/Dms.js b/public/js/components/Form/Upload/Dms.js new file mode 100644 index 000000000..1c2f476e8 --- /dev/null +++ b/public/js/components/Form/Upload/Dms.js @@ -0,0 +1,85 @@ +export default { + emits: [ + 'update:modelValue' + ], + props: { + modelValue: { + type: [ FileList, Array ], + required: true + }, + multiple: Boolean, + id: String, + name: String + }, + methods: { + stringifyFile(file) { + return JSON.stringify({ + lastModified: file.lastModified, + lastModifiedDate: file.lastModifiedDate, + name: file.name, + size: file.size, + type: file.type + }); + }, + addFiles(event) { + if (!this.multiple) + return this.$emit('update:modelValue', event.target.files); + + const dt = new DataTransfer(); + const doubles = []; + for (var file of this.modelValue) { + dt.items.add(file); + doubles.push(this.stringifyFile(file)); + } + for (var file of event.target.files) { + // NOTE(chris): deep check (with FileReader) would require an async function so we only check the basic attributes + if (doubles.indexOf(this.stringifyFile(file)) < 0) + dt.items.add(file); + } + this.$emit('update:modelValue', dt.files); + }, + removeFile(id) { + const fileToRemove = Array.from(this.modelValue)[id]; + + const dt = new DataTransfer(); + for (var file of this.modelValue) { + if (file !== fileToRemove) + dt.items.add(file); + } + this.$emit('update:modelValue', dt.files); + } + }, + watch: { + modelValue(n) { + if (n instanceof FileList) + return this.$refs.upload.files = n; + + const dt = new DataTransfer(); + const dms = []; + for (var file of n) { + if (file instanceof File) { + dt.items.add(file); + } else { + const dmsFile = new File([JSON.stringify(file)], file.name, { + type: 'application/x.fhc-dms+json' + }); + dt.items.add(dmsFile); + } + } + this.$emit('update:modelValue', dt.files); + } + }, + template: ` +
+ + +
` +} \ No newline at end of file