vue-file-selector
Version:
File selector component that supports drag-n-drop for VueJs 3
1 lines • 18.5 kB
Source Map (JSON)
{"version":3,"file":"index.js","sources":["../src/FileSelector.vue","../src/FileSelector.vue?vue&type=template&id=a9865f18&lang.js","../src/index.ts"],"sourcesContent":["<template>\n <div class=\"fs-file-selector\"\n :class=\"{ 'fs-drag-enter': isDragEnter }\">\n <div class=\"fs-loader\" v-show=\"isLoading\">\n <slot name=\"loader\">\n Loading...\n </slot>\n </div>\n\n <div class=\"fs-droppable\"\n ref=\"fsDroppable\"\n :style=\"{ height: height + 'px' }\"\n @dragenter.stop.prevent=\"isDragEnter = true\"\n @dragover.stop.prevent=\"() => {}\"\n @dragleave.stop.prevent=\"isDragEnter = false\"\n @drop.stop.prevent=\"handleDrop\">\n <input\n ref=\"fileRef\"\n type=\"file\"\n tabindex=\"-1\"\n :multiple=\"multiple\"\n :accept=\"acceptExtensions\"\n @change=\"handleFilesChange\" />\n <slot name=\"top\"></slot>\n\n <div href=\"#\" class=\"fs-btn-select\" @click=\"$refs.fileRef.click()\">\n <slot>Select</slot>\n </div>\n\n <slot name=\"bottom\"></slot>\n </div>\n </div>\n</template>\n\n\n<script lang=\"ts\">\nimport { defineComponent, ref } from 'vue';\nimport { FsValidationResult } from './types';\n\nexport default defineComponent({\n name: 'FileSelector',\n props: {\n multiple: {\n type: Boolean,\n default: false,\n },\n\n isLoading: {\n type: Boolean,\n default: false,\n },\n\n acceptExtensions: {\n type: String,\n default: '',\n },\n\n maxFileSize: { // in bytes\n type: Number,\n default: NaN,\n },\n\n height: {\n type: Number,\n default: NaN,\n },\n\n validateFn: {\n type: Function,\n default: () => true,\n },\n },\n setup() {\n const isDragEnter = ref(false);\n\n return {\n isDragEnter,\n };\n },\n methods: {\n handleFilesChange(e: InputEvent) {\n const el = e.target as HTMLInputElement;\n\n if (!el.files || el.files?.length === 0) {\n return;\n }\n\n this.preprocessFiles(Array.from(el.files));\n },\n\n handleDrop(e: DragEvent) {\n this.isDragEnter = false;\n\n this.preprocessFiles(Array.from(e.dataTransfer?.files || []));\n },\n\n preprocessFiles(files: File[]) {\n const result = this.validate(files);\n this.$emit('validated', result, files);\n\n // validation\n if (result === true) {\n this.$emit('changed', files);\n }\n\n // clear selected files\n const fileRef = this.$refs.fileRef as HTMLInputElement;\n\n if (fileRef) {\n fileRef.value = '';\n }\n },\n\n validate(files: File[]): FsValidationResult {\n // file selection\n if (!this.multiple && files.length > 1) {\n return 'MULTIFILES_ERROR';\n }\n\n // extension\n if (!this.checkFileExtensions(files)) {\n return 'EXTENSION_ERROR';\n }\n\n // file size\n if (!this.checkFileSize(files)) {\n return 'FILE_SIZE_ERROR';\n }\n\n // custom validation\n return this.validateFn(files);\n },\n\n checkFileExtensions(files: File[]) {\n // get non-empty, unique extension items\n const extList = [...new Set(\n this.acceptExtensions.toLowerCase()\n .split(',')\n .filter(Boolean),\n )];\n\n // check if the selected files are in supported extensions\n const invalidFileIndex = files.findIndex(file => {\n const ext = `.${file.name.toLowerCase().split('.').pop()}`;\n\n return !extList.includes(ext);\n });\n\n // all exts are valid\n return invalidFileIndex === -1;\n },\n\n checkFileSize(files: File[]) {\n if (Number.isNaN(this.maxFileSize)) {\n return true;\n }\n\n // find invalid file size\n const invalidFileIndex = files.findIndex(file => file.size > this.maxFileSize);\n\n // all file size are valid\n return invalidFileIndex === -1;\n },\n },\n});\n</script>\n","<template>\n <div class=\"fs-file-selector\"\n :class=\"{ 'fs-drag-enter': isDragEnter }\">\n <div class=\"fs-loader\" v-show=\"isLoading\">\n <slot name=\"loader\">\n Loading...\n </slot>\n </div>\n\n <div class=\"fs-droppable\"\n ref=\"fsDroppable\"\n :style=\"{ height: height + 'px' }\"\n @dragenter.stop.prevent=\"isDragEnter = true\"\n @dragover.stop.prevent=\"() => {}\"\n @dragleave.stop.prevent=\"isDragEnter = false\"\n @drop.stop.prevent=\"handleDrop\">\n <input\n ref=\"fileRef\"\n type=\"file\"\n tabindex=\"-1\"\n :multiple=\"multiple\"\n :accept=\"acceptExtensions\"\n @change=\"handleFilesChange\" />\n <slot name=\"top\"></slot>\n\n <div href=\"#\" class=\"fs-btn-select\" @click=\"$refs.fileRef.click()\">\n <slot>Select</slot>\n </div>\n\n <slot name=\"bottom\"></slot>\n </div>\n </div>\n</template>\n\n\n<script lang=\"ts\">\nimport { defineComponent, ref } from 'vue';\nimport { FsValidationResult } from './types';\n\nexport default defineComponent({\n name: 'FileSelector',\n props: {\n multiple: {\n type: Boolean,\n default: false,\n },\n\n isLoading: {\n type: Boolean,\n default: false,\n },\n\n acceptExtensions: {\n type: String,\n default: '',\n },\n\n maxFileSize: { // in bytes\n type: Number,\n default: NaN,\n },\n\n height: {\n type: Number,\n default: NaN,\n },\n\n validateFn: {\n type: Function,\n default: () => true,\n },\n },\n setup() {\n const isDragEnter = ref(false);\n\n return {\n isDragEnter,\n };\n },\n methods: {\n handleFilesChange(e: InputEvent) {\n const el = e.target as HTMLInputElement;\n\n if (!el.files || el.files?.length === 0) {\n return;\n }\n\n this.preprocessFiles(Array.from(el.files));\n },\n\n handleDrop(e: DragEvent) {\n this.isDragEnter = false;\n\n this.preprocessFiles(Array.from(e.dataTransfer?.files || []));\n },\n\n preprocessFiles(files: File[]) {\n const result = this.validate(files);\n this.$emit('validated', result, files);\n\n // validation\n if (result === true) {\n this.$emit('changed', files);\n }\n\n // clear selected files\n const fileRef = this.$refs.fileRef as HTMLInputElement;\n\n if (fileRef) {\n fileRef.value = '';\n }\n },\n\n validate(files: File[]): FsValidationResult {\n // file selection\n if (!this.multiple && files.length > 1) {\n return 'MULTIFILES_ERROR';\n }\n\n // extension\n if (!this.checkFileExtensions(files)) {\n return 'EXTENSION_ERROR';\n }\n\n // file size\n if (!this.checkFileSize(files)) {\n return 'FILE_SIZE_ERROR';\n }\n\n // custom validation\n return this.validateFn(files);\n },\n\n checkFileExtensions(files: File[]) {\n // get non-empty, unique extension items\n const extList = [...new Set(\n this.acceptExtensions.toLowerCase()\n .split(',')\n .filter(Boolean),\n )];\n\n // check if the selected files are in supported extensions\n const invalidFileIndex = files.findIndex(file => {\n const ext = `.${file.name.toLowerCase().split('.').pop()}`;\n\n return !extList.includes(ext);\n });\n\n // all exts are valid\n return invalidFileIndex === -1;\n },\n\n checkFileSize(files: File[]) {\n if (Number.isNaN(this.maxFileSize)) {\n return true;\n }\n\n // find invalid file size\n const invalidFileIndex = files.findIndex(file => file.size > this.maxFileSize);\n\n // all file size are valid\n return invalidFileIndex === -1;\n },\n },\n});\n</script>\n","import './main.scss';\n\nimport { App, Plugin } from 'vue';\nimport component from './FileSelector.vue';\n\nexport * from './types';\n\nconst FileSelector: Plugin = {\n install(app: App) {\n app.component('FileSelector', component);\n },\n};\n\n\nexport default FileSelector;\n"],"names":["script","defineComponent","name","props","multiple","type","Boolean","default","isLoading","acceptExtensions","String","maxFileSize","Number","NaN","height","validateFn","Function","setup","isDragEnter","ref","methods","handleFilesChange","e","el","target","files","length","this","preprocessFiles","Array","from","handleDrop","dataTransfer","result","validate","$emit","fileRef","$refs","value","checkFileExtensions","checkFileSize","extList","Set","toLowerCase","split","filter","findIndex","file","ext","pop","includes","isNaN","size","_hoisted_1","class","_createElementBlock","createElementBlock","_normalizeClass","normalizeClass","_ctx","_withDirectives","_createElementVNode","_renderSlot","style","onDragenter","onDragover","onDragleave","onDrop","args","tabindex","accept","onChange","$slots","href","onClick","_cache","$event","click","FileSelector","install","app","component"],"mappings":"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"}