{"version":3,"sources":["components/dropzone.js"],"names":["dmx","Component","extends","initialData","file","files","lastError","attributes","accept","type","String","default","required","Boolean","message","thumbs","thumb-width","Number","thumb-height","methods","remove","id","this","reset","render","node","form","$node","idx","dmxExtraData","Array","isArray","dmxExtraElements","push","document","createElement","className","innerHTML","props","dropzone","style","cssText","classList","add","appendChild","addEventListener","click","bind","dragover","dragenter","dragleave","drop","change","dom","replace","requestAnimationFrame","addSubmitHandler","console","warn","dmxComponent","submit","update","data","length","name","event","addFiles","target","value","ea","preventDefault","stopPropagation","dataTransfer","effectAllowed","e","dropEffect","items","webkitGetAsEntry","addFilesFromItems","getValidationRules","rules","i","attribute","test","rule","substr","toLowerCase","getAttribute","param","validate","errorMessage","_validate","setErrorMessage","set","updateData","split","some","charAt","match","RegExp","size","j","err","getElementById","bootstrap4forms","bootstrap3forms","insertAdjacentElement","textContent","element","multiple","hasAttribute","validity","forEach","thumb","parentNode","removeChild","index","findIndex","info","splice","requestUpdate","createThumb","title","setProperty","parseInt","filename","filesize","formatSize","number","decimals","binary","isNaN","isFinite","base","suffix","n","Math","pow","round","resize","src","cb","img","tWidth","tHeight","onload","canvas","ctx","getContext","sWidth","width","sHeight","height","min","tRatio","sx","sy","drawImage","toDataURL","addFile","date","lastModified","Date","lastModifiedDate","toISOString","dataUrl","indexOf","reader","FileReader","result","readAsDataURL","concat","array","item","entry","isFile","getAsFile","isDirectory","addFilesFromDirectory","kind","directory","path","createReader","readEntries","entries","fullPath","error"],"mappings":"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","file":"../dmxDropzone/dmxDropzone.js","sourcesContent":["dmx.Component('dropzone', {\r\n\r\n extends: 'input',\r\n\r\n initialData: {\r\n file: null,\r\n files: [],\r\n lastError: ''\r\n },\r\n\r\n attributes: {\r\n accept: {\r\n type: String,\r\n default: ''\r\n },\r\n\r\n required: {\r\n type: Boolean,\r\n default: false\r\n },\r\n\r\n message: {\r\n type: String,\r\n default: 'Drop files here or click to upload.'\r\n },\r\n\r\n 'thumbs': {\r\n type: String,\r\n default: 'true'\r\n },\r\n\r\n 'thumb-width': {\r\n type: Number,\r\n default: 100\r\n },\r\n\r\n 'thumb-height': {\r\n type: Number,\r\n default: 100\r\n }\r\n },\r\n\r\n methods: {\r\n remove: function(id) {\r\n this.remove(id);\r\n },\r\n\r\n reset: function() {\r\n this.reset();\r\n }\r\n },\r\n\r\n render: function(node) {\r\n this.form = this.$node.form;\r\n this.idx = 0;\r\n\r\n if (!this.form || !this.form.dmxExtraData) {\r\n console.warn('Filedrop can only work on a serverconnect form!');\r\n return;\r\n }\r\n\r\n if (Array.isArray(this.form.dmxExtraElements)) {\r\n this.form.dmxExtraElements.push(this);\r\n }\r\n\r\n this.message = document.createElement('div');\r\n this.message.className = 'dmxDropzoneMessage';\r\n this.message.innerHTML = this.props.message;\r\n\r\n this.dropzone = document.createElement('div');\r\n this.dropzone.style.cssText = this.$node.style.cssText;\r\n this.dropzone.className = this.$node.className;\r\n this.dropzone.classList.add('dmxDropzone');\r\n this.dropzone.appendChild(this.message);\r\n\r\n this.dropzone.addEventListener('click', this.click.bind(this));\r\n\r\n this.dropzone.addEventListener('dragover', this.dragover.bind(this));\r\n this.dropzone.addEventListener('dragenter', this.dragenter.bind(this));\r\n this.dropzone.addEventListener('dragleave', this.dragleave.bind(this));\r\n this.dropzone.addEventListener('drop', this.drop.bind(this));\r\n\r\n this.$node.addEventListener('change', this.change.bind(this));\r\n //this.form.addEventListener('submit', this.submit.bind(this));\r\n this.form.addEventListener('reset', this.reset.bind(this));\r\n\r\n dmx.dom.replace(this.$node, this.dropzone);\r\n\r\n requestAnimationFrame(this.addSubmitHandler.bind(this));\r\n },\r\n\r\n addSubmitHandler: function() {\r\n this.form.dmxComponent.addEventListener('submit', this.submit.bind(this));\r\n },\r\n\r\n update: function(props) {\r\n var message = this.props.message;\r\n\r\n this.$node.accept = this.props.accept;\r\n\r\n if (this.data.files.length) {\r\n message += ' (' + this.data.files.length + ' files)';\r\n } else if (this.data.file) {\r\n message += ' (' + this.data.file.name + ')';\r\n }\r\n\r\n if (this.message && this.message.innerHTML != message) {\r\n this.message.innerHTML = message;\r\n }\r\n },\r\n\r\n click: function(event) {\r\n this.$node.click();\r\n },\r\n\r\n change: function(event) {\r\n this.addFiles(event.target.files);\r\n this.$node.value = '';\r\n this.$node.type = '';\r\n this.$node.type = 'file';\r\n },\r\n\r\n dragover: function(event) {\r\n // prevent default to allow drop\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n var ea;\r\n try { ea = event.dataTransfer.effectAllowed; } catch(e) {}\r\n\r\n event.dataTransfer.dropEffect = (ea == 'move' || ea == 'linkMove') ? 'move' : 'copy';\r\n },\r\n\r\n dragenter: function(event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.dropzone.classList.add('dmxDropzoneHover');\r\n },\r\n\r\n dragleave: function(event) {\r\n this.dropzone.classList.remove('dmxDropzoneHover');\r\n },\r\n\r\n drop: function(event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.dropzone.classList.remove('dmxDropzoneHover');\r\n\r\n if (!event.dataTransfer) return;\r\n\r\n var files = event.dataTransfer.files;\r\n\r\n if (files.length) {\r\n var items = event.dataTransfer.items;\r\n\r\n if (items && items.length && items[0].webkitGetAsEntry) {\r\n this.addFilesFromItems(items);\r\n } else {\r\n this.addFiles(files);\r\n }\r\n }\r\n },\r\n\r\n getValidationRules: function() {\r\n var rules = [];\r\n\r\n for (var i = 0; i < this.$node.attributes.length; i++) {\r\n var attribute = this.$node.attributes[i];\r\n\r\n if (/^data-rule-/.test(attribute.name)) {\r\n var rule = attribute.name.substr(10).toLowerCase();\r\n var message = this.$node.getAttribute('data-msg-' + rule);\r\n var param = attribute.value;\r\n rules.push({ rule: rule, param: param, message: message });\r\n }\r\n }\r\n\r\n return rules;\r\n },\r\n\r\n validate: function() {\r\n var errorMessage = this._validate();\r\n\r\n if (errorMessage) {\r\n this.setErrorMessage(errorMessage);\r\n this.set('invalid', true);\r\n this.set('validationMessage', errorMessage);\r\n return;\r\n }\r\n\r\n this.setErrorMessage('');\r\n this.set('invalid', false);\r\n this.set('validationMessage', '');\r\n \r\n this.updateData();\r\n},\r\n\r\n _validate: function(file) {\r\n if (!file) {\r\n if (this.props.required && !this.data.files.length) {\r\n return this.$node.getAttribute('data-msg-required') || 'This field is required.';\r\n }\r\n\r\n return null;\r\n }\r\n\r\n if (this.props.accept) {\r\n if (!this.props.accept.split(/\\s*,\\s*/g).some(function(type) {\r\n if (type.charAt(0) == '.') {\r\n if (file.name.match(new RegExp('\\\\' + type + '$', 'i'))) {\r\n return true;\r\n }\r\n } else if (/(audio|video|image)\\/\\*/i.test(type)) {\r\n if (file.type.match(new RegExp('^' + type.replace(/\\*/g, '.*') + '$', 'i'))) {\r\n return true;\r\n }\r\n } else {\r\n if (file.type.toLowerCase() == type.toLowerCase()) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n })) {\r\n return this.$node.getAttribute('data-msg-accept') || 'This file type is not allowed for upload.';\r\n }\r\n }\r\n\r\n var rules = this.getValidationRules();\r\n\r\n for (var i = 0; i < rules.length; i++) {\r\n var rule = rules[i].rule;\r\n var param = rules[i].param;\r\n var message = rules[i].message;\r\n\r\n switch (rule) {\r\n case 'minsize':\r\n if (file.size < param) {\r\n return (message || 'Please select a file of at least {0} bytes.').replace('{0}', param);\r\n }\r\n break;\r\n\r\n case 'maxsize':\r\n if (file.size > param) {\r\n return (message || 'Please select a file of no more than {0} bytes.').replace('{0}', param);\r\n }\r\n break;\r\n\r\n case 'maxtotalsize':\r\n var size = 0;\r\n for (var j = 0; j < this.data.files.length; j++) {\r\n size += this.data.files[j].size;\r\n }\r\n if (size + file.size > param) {\r\n return (message || 'Total size of selected files should be no more than {0} bytes.').replace('{0}', param);\r\n }\r\n break;\r\n\r\n case 'maxfiles':\r\n if (this.data.files.length >= param) {\r\n return (message || 'Please select no more than {0} files.').replace('{0}', param);\r\n }\r\n break;\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n setErrorMessage: function(message) {\r\n var id = 'dmxValidationError' + this.form.getAttribute('id') + (this.$node.getAttribute('name') || this.$node.getAttribute('id'));\r\n var err = document.getElementById(id);\r\n\r\n if (!err) {\r\n err = document.createElement(dmx.bootstrap4forms ? 'div' : 'span');\r\n err.id = id;\r\n err.className = dmx.bootstrap4forms ? 'invalid-feedback' : dmx.bootstrap3forms ? 'help-block' : 'dmxValidator-error';\r\n this.dropzone.insertAdjacentElement('afterend', err);\r\n }\r\n\r\n if (dmx.bootstrap4forms) {\r\n this.dropzone.classList.add('form-control');\r\n if (message) {\r\n this.dropzone.classList.remove('is-valid');\r\n this.dropzone.classList.add('is-invalid');\r\n } else {\r\n this.dropzone.classList.remove('is-invalid');\r\n this.dropzone.classList.add('is-valid');\r\n }\r\n }\r\n\r\n err.textContent = message;\r\n },\r\n\r\n submit: function(event) {\r\n if (dmx.rules) {\r\n this.setErrorMessage('');\r\n\r\n var element = {\r\n type: 'file',\r\n files: this.$node.multiple ? this.data.files : (this.data.file ? [this.data.file] : [])\r\n };\r\n\r\n if (this.$node.hasAttribute('required') && !element.files.length) {\r\n var message = this.$node.getAttribute('data-msg-required') || 'This field is required.';\r\n this.setErrorMessage(message);\r\n event.preventDefault();\r\n return false;\r\n }\r\n\r\n var rules = this.getValidationRules();\r\n\r\n for (var i = 0; i < rules.length; i++) {\r\n var rule = rules[i].rule;\r\n var param = rules[i].param;\r\n\r\n if (dmx.rules[rule]) {\r\n if (!dmx.rules[rule].validity(element, param)) {\r\n var message = rules[i].message || dmx.rules[rule].message;\r\n if (Array.isArray(param)) {\r\n message = message.replace(/\\{(\\d)\\}/g, function(match, i) {\r\n return param[i];\r\n });\r\n } else {\r\n message = message.replace(/\\{0\\}/g, param);\r\n }\r\n\r\n this.setErrorMessage(message);\r\n\r\n event.preventDefault();\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n },\r\n\r\n reset: function() {\r\n if (this.form.dmxExtraData[this.$node.name]) {\r\n if (Array.isArray(this.form.dmxExtraData[this.$node.name])) {\r\n this.form.dmxExtraData[this.$node.name].forEach(function(file) {\r\n if (file.thumb) file.thumb.remove();\r\n });\r\n } else if (this.form.dmxExtraData[this.$node.name].thumb) {\r\n this.form.dmxExtraData[this.$node.name].thumb.remove();\r\n }\r\n }\r\n\r\n var id = 'dmxValidationError' + this.form.getAttribute('id') + (this.$node.getAttribute('name') || this.$node.getAttribute('id'));\r\n var err = document.getElementById(id);\r\n\r\n if (err && err.parentNode) {\r\n err.parentNode.removeChild(err);\r\n }\r\n\r\n if (dmx.bootstrap4forms) {\r\n this.dropzone.classList.remove('is-valid');\r\n this.dropzone.classList.remove('is-invalid');\r\n }\r\n\r\n this.form.dmxExtraData[this.$node.name] = null;\r\n this.set('files', []);\r\n this.set('file', null);\r\n },\r\n\r\n remove: function(id, event) {\r\n if (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n\r\n if (this.$node.multiple) {\r\n var index = this.data.files.findIndex(function(info) {\r\n return info.id == id;\r\n });\r\n\r\n if (index != -1) {\r\n this.data.files.splice(index, 1);\r\n this.form.dmxExtraData[this.$node.name][index].thumb.remove();\r\n this.form.dmxExtraData[this.$node.name].splice(index, 1);\r\n dmx.requestUpdate();\r\n }\r\n } else if (this.data.file) {\r\n this.data.file = null;\r\n this.form.dmxExtraData[this.$node.name].thumb.remove();\r\n this.form.dmxExtraData[this.$node.name] = null;\r\n dmx.requestUpdate();\r\n }\r\n },\r\n\r\n createThumb: function(file) {\r\n var thumb = document.createElement('div');\r\n thumb.className = 'dmxDropzoneThumb';\r\n thumb.title = file.name;\r\n thumb.style.setProperty('width', (parseInt(this.props['thumb-width']) || 100) + 'px');\r\n thumb.style.setProperty('height', (parseInt(this.props['thumb-height']) || 100) + 'px');\r\n thumb.addEventListener('click', this.remove.bind(this, file.id));\r\n\r\n var filename = document.createElement('div');\r\n filename.className = 'dmxDropzoneFilename';\r\n filename.textContent = file.name;\r\n thumb.appendChild(filename);\r\n\r\n var filesize = document.createElement('div');\r\n filesize.className = 'dmxDropzoneFilesize';\r\n filesize.textContent = this.formatSize(file.size);\r\n thumb.appendChild(filesize);\r\n\r\n file.thumb = thumb;\r\n\r\n this.dropzone.appendChild(thumb);\r\n },\r\n\r\n formatSize: function(number, decimals, binary) {\r\n if (isNaN(number) || !isFinite(number)) return 'Invalid Size';\r\n\r\n decimals = decimals || 1;\r\n\r\n var base = binary ? 1024 : 1000;\r\n var suffix = binary ? ['KiB', 'MiB', 'GiB', 'TiB'] : ['KB', 'MB', 'GB', 'TB'];\r\n\r\n for (var i = 3; i >= 0; i--) {\r\n var n = Math.pow(base, i + 1);\r\n if (number >= n) {\r\n number /= n;\r\n var pow = Math.pow(10, decimals);\r\n number = Math.round(number * pow) / pow;\r\n return number + suffix[i];\r\n }\r\n }\r\n\r\n return number + 'B';\r\n },\r\n\r\n resize: function(src, cb) {\r\n var img = document.createElement('img');\r\n\r\n var tWidth = parseInt(this.props['thumb-width']) || 100;\r\n var tHeight = parseInt(this.props['thumb-height']) || 100;\r\n\r\n img.onload = function() {\r\n var canvas = document.createElement('canvas');\r\n var ctx = canvas.getContext('2d');\r\n\r\n var sWidth = img.width;\r\n var sHeight = img.height;\r\n\r\n tWidth = Math.min(tWidth, sWidth);\r\n tHeight = Math.min(tHeight, sHeight);\r\n\r\n var sRatio = sWidth / sHeight;\r\n var tRatio = tWidth / tHeight;\r\n\r\n if (sWidth > tWidth || sHeight > tHeight) {\r\n if (sRatio > tRatio) {\r\n sWidth = sHeight * tRatio;\r\n } else {\r\n sHeight = sWidth / tRatio;\r\n }\r\n }\r\n\r\n canvas.width = tWidth;\r\n canvas.height = tHeight;\r\n\r\n var sx = (img.width - sWidth) / 2;\r\n var sy = (img.height - sHeight) / 2;\r\n\r\n ctx.drawImage(img, sx, sy, sWidth, sHeight, 0, 0, tWidth, tHeight);\r\n\r\n cb(canvas.toDataURL());\r\n };\r\n img.src = src;\r\n },\r\n\r\n addFile: function(file) {\r\n var errorMessage = this._validate(file);\r\n\r\n if (errorMessage) {\r\n this.setErrorMessage(errorMessage);\r\n return;\r\n }\r\n\r\n this.setErrorMessage('');\r\n\r\n if (this.$node.multiple) {\r\n this.form.dmxExtraData[this.$node.name] = this.form.dmxExtraData[this.$node.name] || [];\r\n this.form.dmxExtraData[this.$node.name].push(file);\r\n } else {\r\n this.remove();\r\n this.form.dmxExtraData[this.$node.name] = file;\r\n }\r\n\r\n file.id = ++this.idx\r\n\r\n var info = {\r\n id: file.id,\r\n date: (file.lastModified ? new Date(file.lastModified) : file.lastModifiedDate).toISOString(),\r\n name: file.name,\r\n size: file.size,\r\n type: file.type,\r\n dataUrl: null\r\n };\r\n\r\n if (this.props.thumbs != 'false') {\r\n this.createThumb(file);\r\n }\r\n\r\n if (file.type.indexOf('image/') !== -1 && !file.reader) {\r\n file.reader = new FileReader();\r\n\r\n file.reader.onload = function(event) {\r\n info.dataUrl = event.target.result;\r\n if (file.thumb) {\r\n this.resize(info.dataUrl, function(dataUrl) {\r\n file.thumb.style.setProperty('background-image', 'url(' + dataUrl + ')');\r\n });\r\n }\r\n dmx.requestUpdate();\r\n }.bind(this);\r\n\r\n file.reader.readAsDataURL(file);\r\n }\r\n\r\n if (this.$node.multiple) {\r\n this.set('files', this.data.files.concat([info]));\r\n } else {\r\n this.set('file', info);\r\n }\r\n },\r\n\r\n addFiles: function(files) {\r\n dmx.array(files).forEach(function(file) {\r\n this.addFile(file);\r\n }, this);\r\n },\r\n\r\n addFilesFromItems: function(items) {\r\n dmx.array(items).forEach(function(item) {\r\n var entry;\r\n if (item.webkitGetAsEntry && (entry = item.webkitGetAsEntry())) {\r\n if (entry.isFile) {\r\n this.addFile(item.getAsFile());\r\n } else if (entry.isDirectory) {\r\n this.addFilesFromDirectory(entry);\r\n }\r\n } else if (item.getAsFile) {\r\n if (!item.kind || item.kind == 'file') {\r\n this.addFile(item.getAsFile());\r\n }\r\n }\r\n }, this);\r\n },\r\n\r\n addFilesFromDirectory: function(directory, path) {\r\n var reader = directory.createReader();\r\n var readEntries = function() {\r\n reader.readEntries(function(entries) {\r\n if (entries.length) {\r\n entries.forEach(function(entry) {\r\n if (entry.isFile) {\r\n entry.file(function(file) {\r\n file.fullPath = path + '/' + file.name;\r\n this.addFile(file);\r\n }.bind(this));\r\n } else if (entry.isDirectory) {\r\n this.addFilesFromDirectory(entry, path + '/' + entry.name);\r\n }\r\n }, this);\r\n }\r\n\r\n readEntries();\r\n }.bind(this), function(error) {\r\n console.warn(error);\r\n }.bind(this));\r\n }.bind(this);\r\n\r\n readEntries();\r\n }\r\n\r\n});\r\n"]}