diff --git a/src/Bridge/SonataAdmin/assets/js/components/mediaSelector.js b/src/Bridge/SonataAdmin/assets/js/components/mediaSelector.js index 158b01ac..92e0807d 100644 --- a/src/Bridge/SonataAdmin/assets/js/components/mediaSelector.js +++ b/src/Bridge/SonataAdmin/assets/js/components/mediaSelector.js @@ -11,6 +11,7 @@ const MediaSelector = class { this.modal = false; this.modalContent = false; this.currentFolder = false; + this.currentSearchValue = ''; } fetchFolder = (url) => { @@ -18,9 +19,43 @@ const MediaSelector = class { return fetch(url).then((response) => response.text()); }; + getSearchUrl = (baseUrl) => { + if (!this.currentSearchValue) return baseUrl; + const separator = baseUrl.includes('?') ? '&' : '?'; + return `${baseUrl}${separator}search=${encodeURIComponent(this.currentSearchValue)}`; + }; + + setupSearch = () => { + const searchForm = this.modalContent.querySelector('.joli-media-search-form'); + const searchInput = this.modalContent.querySelector('.joli-media-search-input'); + if (!searchForm || !searchInput) return; + + this.currentSearchValue = searchInput.value; + + const newSearchForm = searchForm.cloneNode(true); + searchForm.parentNode.replaceChild(newSearchForm, searchForm); + + const newInput = newSearchForm.querySelector('.joli-media-search-input'); + + newSearchForm.addEventListener('submit', (e) => { + e.preventDefault(); + e.stopPropagation(); + this.currentSearchValue = newInput.value.trim(); + this.fetchFolder(this.getSearchUrl(this.currentFolder)).then(this.configureModal); + }); + + newInput.addEventListener('search', () => { + if (!newInput.value) { + this.currentSearchValue = ''; + this.fetchFolder(this.currentFolder).then(this.configureModal); + } + }); + }; + configureModal = (html) => { this.modalContent.innerHTML = html; Admin.shared_setup(this.modal); + this.setupSearch(); }; handleModalClick = (event) => { @@ -41,7 +76,7 @@ const MediaSelector = class { if (target.dataset.mediaTemplate === undefined || target.dataset.mediaUrl === undefined) { // this is not a selectable media - this.fetchFolder(target.attributes.href.value).then(this.configureModal); + this.fetchFolder(this.getSearchUrl(target.attributes.href.value)).then(this.configureModal); return; } @@ -57,6 +92,11 @@ const MediaSelector = class { event.stopPropagation(); const form = event.target.closest("form"); + + if (form && form.dataset.component === 'media-search') { + return; + } + const formData = new FormData(form); const url = form.action; @@ -98,8 +138,10 @@ const MediaSelector = class { } this.modalContent.innerHTML = ''; + this.currentSearchValue = ''; + this.currentFolder = this.editButton.attributes.href.value + '/' + this.editButton.dataset.folder; - this.fetchFolder(this.editButton.attributes.href.value + '/' + this.editButton.dataset.folder).then((html) => { + this.fetchFolder(this.currentFolder).then((html) => { this.configureModal(html); jQuery(this.modal).modal(); Admin.setup_list_modal(this.modal); diff --git a/src/Bridge/SonataAdmin/assets/styles/media-choice.css b/src/Bridge/SonataAdmin/assets/styles/media-choice.css index 32a6ea14..b3f684e2 100644 --- a/src/Bridge/SonataAdmin/assets/styles/media-choice.css +++ b/src/Bridge/SonataAdmin/assets/styles/media-choice.css @@ -22,3 +22,7 @@ display: none; } } + +.joli-media-search { + padding: 15px; +} diff --git a/src/Bridge/SonataAdmin/public/entrypoints.json b/src/Bridge/SonataAdmin/public/entrypoints.json index f354d796..cce0af46 100644 --- a/src/Bridge/SonataAdmin/public/entrypoints.json +++ b/src/Bridge/SonataAdmin/public/entrypoints.json @@ -2,10 +2,10 @@ "entrypoints": { "joli-media-sonata-admin": { "css": [ - "./joli-media-sonata-admin.501cbd68.css" + "./joli-media-sonata-admin.b1b110a9.css" ], "js": [ - "./joli-media-sonata-admin.4deda32b.js" + "./joli-media-sonata-admin.27ab3a73.js" ] } } diff --git a/src/Bridge/SonataAdmin/public/joli-media-sonata-admin.4deda32b.js b/src/Bridge/SonataAdmin/public/joli-media-sonata-admin.27ab3a73.js similarity index 80% rename from src/Bridge/SonataAdmin/public/joli-media-sonata-admin.4deda32b.js rename to src/Bridge/SonataAdmin/public/joli-media-sonata-admin.27ab3a73.js index bed1feea..47430955 100644 --- a/src/Bridge/SonataAdmin/public/joli-media-sonata-admin.4deda32b.js +++ b/src/Bridge/SonataAdmin/public/joli-media-sonata-admin.27ab3a73.js @@ -1 +1 @@ -(()=>{"use strict";class e{on(e,t){return this._callbacks=this._callbacks||{},this._callbacks[e]||(this._callbacks[e]=[]),this._callbacks[e].push(t),this}emit(e,...t){this._callbacks=this._callbacks||{};let i=this._callbacks[e];if(i)for(let e of i)e.apply(this,t);return this.element&&this.element.dispatchEvent(this.makeEvent("dropzone:"+e,{args:t})),this}makeEvent(e,t){let i={bubbles:!0,cancelable:!0,detail:t};if("function"==typeof window.CustomEvent)return new CustomEvent(e,i);var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,i.bubbles,i.cancelable,i.detail),n}off(e,t){if(!this._callbacks||0===arguments.length)return this._callbacks={},this;let i=this._callbacks[e];if(!i)return this;if(1===arguments.length)return delete this._callbacks[e],this;for(let e=0;et(),chunksUploaded:function(e,t){t()},binaryBody:!1,fallback(){let e;this.element.className=`${this.element.className} dz-browser-not-supported`;for(let t of this.element.getElementsByTagName("div"))if(/(^| )dz-message($| )/.test(t.className)){e=t,t.className="dz-message";break}e||(e=i.createElement('
'),this.element.appendChild(e));let t=e.getElementsByTagName("span")[0];return t&&(null!=t.textContent?t.textContent=this.options.dictFallbackMessage:null!=t.innerText&&(t.innerText=this.options.dictFallbackMessage)),this.element.appendChild(this.getFallbackForm())},resize(e,t,i,n){let s={srcX:0,srcY:0,srcWidth:e.width,srcHeight:e.height},o=e.width/e.height;null==t&&null==i?(t=s.srcWidth,i=s.srcHeight):null==t?t=i*o:null==i&&(i=t/o);let l=(t=Math.min(t,s.srcWidth))/(i=Math.min(i,s.srcHeight));if(s.srcWidth>t||s.srcHeight>i)if("crop"===n)o>l?(s.srcHeight=e.height,s.srcWidth=s.srcHeight*l):(s.srcWidth=e.width,s.srcHeight=s.srcWidth/l);else{if("contain"!==n)throw new Error(`Unknown resizeMethod '${n}'`);o>l?i=t/o:t=i*o}return s.srcX=(e.width-s.srcWidth)/2,s.srcY=(e.height-s.srcHeight)/2,s.trgWidth=t,s.trgHeight=i,s},transformFile(e,t){return(this.options.resizeWidth||this.options.resizeHeight)&&e.type.match(/image.*/)?this.resizeImage(e,this.options.resizeWidth,this.options.resizeHeight,this.options.resizeMethod,t):t(e)},previewTemplate:'\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n \n \n \n
\n
\n \n \n \n
\n
',drop(e){return this.element.classList.remove("dz-drag-hover")},dragstart(e){},dragend(e){return this.element.classList.remove("dz-drag-hover")},dragenter(e){return this.element.classList.add("dz-drag-hover")},dragover(e){return this.element.classList.add("dz-drag-hover")},dragleave(e){return this.element.classList.remove("dz-drag-hover")},paste(e){},reset(){return this.element.classList.remove("dz-started")},addedfile(e){if(this.element===this.previewsContainer&&this.element.classList.add("dz-started"),this.previewsContainer&&!this.options.disablePreviews){for(var t of(e.previewElement=i.createElement(this.options.previewTemplate.trim()),e.previewTemplate=e.previewElement,this.previewsContainer.appendChild(e.previewElement),e.previewElement.querySelectorAll("[data-dz-name]")))t.textContent=e.name;for(t of e.previewElement.querySelectorAll("[data-dz-size]"))t.innerHTML=this.filesize(e.size);this.options.addRemoveLinks&&(e._removeLink=i.createElement(`${this.options.dictRemoveFile}`),e.previewElement.appendChild(e._removeLink));let n=t=>(t.preventDefault(),t.stopPropagation(),e.status===i.UPLOADING?this.options.dictCancelUploadConfirmation?i.confirm(this.options.dictCancelUploadConfirmation,()=>this.removeFile(e)):this.removeFile(e):this.options.dictRemoveFileConfirmation?i.confirm(this.options.dictRemoveFileConfirmation,()=>this.removeFile(e)):this.removeFile(e));for(let t of e.previewElement.querySelectorAll("[data-dz-remove]"))t.addEventListener("click",n)}},removedfile(e){return null!=e.previewElement&&null!=e.previewElement.parentNode&&e.previewElement.parentNode.removeChild(e.previewElement),this._updateMaxFilesReachedClass()},thumbnail(e,t){if(e.previewElement){e.previewElement.classList.remove("dz-file-preview");for(let i of e.previewElement.querySelectorAll("[data-dz-thumbnail]"))i.alt=e.name,i.src=t;return setTimeout(()=>e.previewElement.classList.add("dz-image-preview"),1)}},error(e,t){if(e.previewElement){e.previewElement.classList.add("dz-error"),"string"!=typeof t&&t.error&&(t=t.error);for(let i of e.previewElement.querySelectorAll("[data-dz-errormessage]"))i.textContent=t}},errormultiple(){},processing(e){if(e.previewElement&&(e.previewElement.classList.add("dz-processing"),e._removeLink))return e._removeLink.innerHTML=this.options.dictCancelUpload},processingmultiple(){},uploadprogress(e,t,i){if(e.previewElement)for(let i of e.previewElement.querySelectorAll("[data-dz-uploadprogress]"))"PROGRESS"===i.nodeName?i.value=t:i.style.width=`${t}%`},totaluploadprogress(){},sending(){},sendingmultiple(){},success(e){if(e.previewElement)return e.previewElement.classList.add("dz-success")},successmultiple(){},canceled(e){return this.emit("error",e,this.options.dictUploadCanceled)},canceledmultiple(){},complete(e){if(e._removeLink&&(e._removeLink.innerHTML=this.options.dictRemoveFile),e.previewElement)return e.previewElement.classList.add("dz-complete")},completemultiple(){},maxfilesexceeded(){},maxfilesreached(){},queuecomplete(){},addedfiles(){},emptyfolder(){}};class i extends e{static initClass(){this.prototype.Emitter=e,this.prototype.events=["drop","dragstart","dragend","dragenter","dragover","dragleave","addedfile","addedfiles","removedfile","thumbnail","error","errormultiple","processing","processingmultiple","uploadprogress","totaluploadprogress","sending","sendingmultiple","success","successmultiple","canceled","canceledmultiple","complete","completemultiple","reset","maxfilesexceeded","maxfilesreached","queuecomplete","emptyfolder"],this.prototype._thumbnailQueue=[],this.prototype._processingThumbnail=!1}constructor(e,n){let s,o;if(super(),this.element=e,this.clickableElements=[],this.listeners=[],this.files=[],"string"==typeof this.element&&(this.element=document.querySelector(this.element)),null===this.element||!this.element instanceof HTMLElement)throw new Error("Invalid dropzone element: not an instance of HTMLElement.");if(this.element.dropzone)throw new Error("Dropzone already attached.");i.instances.push(this),this.element.dropzone=this;let l=null!=(o=i.optionsForElement(this.element))?o:{};if(this.options=Object.assign({},t,l,null!=n?n:{}),this.options.previewTemplate=this.options.previewTemplate.replace(/\n*/g,""),this.options.forceFallback||!i.isBrowserSupported())return this.options.fallback.call(this);if(null==this.options.url&&(this.options.url=this.element.getAttribute("action")),!this.options.url)throw new Error("No URL provided.");if(this.options.uploadMultiple&&this.options.chunking)throw new Error("You cannot set both: uploadMultiple and chunking.");if(this.options.binaryBody&&this.options.uploadMultiple)throw new Error("You cannot set both: binaryBody and uploadMultiple.");"string"==typeof this.options.method&&(this.options.method=this.options.method.toUpperCase()),(s=this.getExistingFallback())&&s.parentNode&&s.parentNode.removeChild(s),!1!==this.options.previewsContainer&&(this.options.previewsContainer?this.previewsContainer=i.getElement(this.options.previewsContainer,"previewsContainer"):this.previewsContainer=this.element),this.options.clickable&&(!0===this.options.clickable?this.clickableElements=[this.element]:this.clickableElements=i.getElements(this.options.clickable,"clickable")),this.init()}getAcceptedFiles(){return this.files.filter(e=>e.accepted).map(e=>e)}getRejectedFiles(){return this.files.filter(e=>!e.accepted).map(e=>e)}getFilesWithStatus(e){return this.files.filter(t=>t.status===e).map(e=>e)}getQueuedFiles(){return this.getFilesWithStatus(i.QUEUED)}getUploadingFiles(){return this.getFilesWithStatus(i.UPLOADING)}getAddedFiles(){return this.getFilesWithStatus(i.ADDED)}getActiveFiles(){return this.files.filter(e=>e.status===i.UPLOADING||e.status===i.QUEUED).map(e=>e)}init(){if("form"===this.element.tagName&&this.element.setAttribute("enctype","multipart/form-data"),this.element.classList.contains("dropzone")&&!this.element.querySelector(".dz-message")&&this.element.appendChild(i.createElement(`
`)),this.clickableElements.length){let e=()=>{this.hiddenFileInput&&this.hiddenFileInput.parentNode?.removeChild(this.hiddenFileInput),this.hiddenFileInput=document.createElement("input"),this.hiddenFileInput.setAttribute("type","file"),this.hiddenFileInput.setAttribute("form",this.element.id),(null===this.options.maxFiles||this.options.maxFiles>1)&&this.hiddenFileInput.setAttribute("multiple","multiple"),this.hiddenFileInput.className="dz-hidden-input",null!==this.options.acceptedFiles&&this.hiddenFileInput.setAttribute("accept",this.options.acceptedFiles),null!==this.options.capture&&this.hiddenFileInput.setAttribute("capture",this.options.capture),this.hiddenFileInput.setAttribute("tabindex","-1"),this.hiddenFileInput.setAttribute("aria-label","dropzone hidden input"),this.hiddenFileInput.style.visibility="hidden",this.hiddenFileInput.style.position="absolute",this.hiddenFileInput.style.top="0",this.hiddenFileInput.style.left="0",this.hiddenFileInput.style.height="0",this.hiddenFileInput.style.width="0",i.getElement(this.options.hiddenInputContainer,"hiddenInputContainer").appendChild(this.hiddenFileInput),this.hiddenFileInput.addEventListener("change",()=>{let{files:t}=this.hiddenFileInput;if(t.length)for(let e of t)this.addFile(e);this.emit("addedfiles",t),e()})};e()}this.URL=null!==window.URL?window.URL:window.webkitURL;for(let e of this.events)this.on(e,this.options[e]);this.on("uploadprogress",()=>this.updateTotalUploadProgress()),this.on("removedfile",()=>this.updateTotalUploadProgress()),this.on("canceled",e=>this.emit("complete",e)),this.on("complete",e=>{if(0===this.getAddedFiles().length&&0===this.getUploadingFiles().length&&0===this.getQueuedFiles().length)return setTimeout(()=>this.emit("queuecomplete"),0)});let e=function(e){if(function(e){return e.dataTransfer.types&&e.dataTransfer.types.includes("Files")}(e))return e.stopPropagation(),e.preventDefault()};return this.listeners=[{element:this.element,events:{dragstart:e=>this.emit("dragstart",e),dragenter:t=>(e(t),this.emit("dragenter",t)),dragover:t=>{const i=t.dataTransfer.effectAllowed;return t.dataTransfer.dropEffect="move"===i||"linkMove"===i?"move":"copy",e(t),this.emit("dragover",t)},dragleave:e=>this.emit("dragleave",e),drop:t=>(e(t),this.drop(t)),dragend:e=>this.emit("dragend",e)}}],this.clickableElements.forEach(e=>this.listeners.push({element:e,events:{click:t=>((e!==this.element||t.target===this.element||i.elementInside(t.target,this.element.querySelector(".dz-message")))&&this.hiddenFileInput.click(),!0)}})),this.enable(),this.options.init.call(this)}destroy(){return this.disable(),this.removeAllFiles(!0),(null!=this.hiddenFileInput?this.hiddenFileInput.parentNode:void 0)&&(this.hiddenFileInput.parentNode.removeChild(this.hiddenFileInput),this.hiddenFileInput=null),delete this.element.dropzone,i.instances.splice(i.instances.indexOf(this),1)}updateTotalUploadProgress(){let e,t=0,i=0;if(this.getActiveFiles().length){for(let e of this.getActiveFiles())t+=e.upload.bytesSent,i+=e.upload.total;e=100*t/i}else e=100;return this.emit("totaluploadprogress",e,i,t)}_getParamName(e){return"function"==typeof this.options.paramName?this.options.paramName(e):`${this.options.paramName}${this.options.uploadMultiple?`[${e}]`:""}`}_renameFile(e){const t={...e,name:e.name.replace(/\u202F/g," ")};return"function"!=typeof this.options.renameFile?t.name:this.options.renameFile(t)}getFallbackForm(){let e,t;if(e=this.getExistingFallback())return e;let n='
';this.options.dictFallbackText&&(n+=`

${this.options.dictFallbackText}

`),n+=`
`;let s=i.createElement(n);return"FORM"!==this.element.tagName?(t=i.createElement(`
`),t.appendChild(s)):(this.element.setAttribute("enctype","multipart/form-data"),this.element.setAttribute("method",this.options.method)),null!=t?t:s}getExistingFallback(){let e=function(e){for(let t of e)if(/(^| )fallback($| )/.test(t.className))return t};for(let i of["div","form"]){var t;if(t=e(this.element.getElementsByTagName(i)))return t}}setupEventListeners(){return this.listeners.map(e=>(()=>{let t=[];for(let i in e.events){let n=e.events[i];t.push(e.element.addEventListener(i,n,!1))}return t})())}removeEventListeners(){return this.listeners.map(e=>(()=>{let t=[];for(let i in e.events){let n=e.events[i];t.push(e.element.removeEventListener(i,n,!1))}return t})())}disable(){return this.clickableElements.forEach(e=>e.classList.remove("dz-clickable")),this.removeEventListeners(),this.disabled=!0,this.files.map(e=>this.cancelUpload(e))}enable(){return delete this.disabled,this.clickableElements.forEach(e=>e.classList.add("dz-clickable")),this.setupEventListeners()}filesize(e){let t=0,i="b";if(e>0){let n=["tb","gb","mb","kb","b"];for(let s=0;s=Math.pow(this.options.filesizeBase,4-s)/10){t=e/Math.pow(this.options.filesizeBase,4-s),i=o;break}}t=Math.round(10*t)/10}return`${t} ${this.options.dictFileSizeUnits[i]}`}_updateMaxFilesReachedClass(){return null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(this.getAcceptedFiles().length===this.options.maxFiles&&this.emit("maxfilesreached",this.files),this.element.classList.add("dz-max-files-reached")):this.element.classList.remove("dz-max-files-reached")}drop(e){if(!e.dataTransfer)return;this.emit("drop",e);let t=[];for(let i=0;ie.items,null!=t?i(t):void 0))return;var t,i;this.emit("paste",e);let{items:n}=e.clipboardData;return n.length?this._addFilesFromItems(n):void 0}handleFiles(e){for(let t of e)this.addFile(t)}_addFilesFromItems(e){return(()=>{let t=[];for(let n of e){var i;null!=n.webkitGetAsEntry&&(i=n.webkitGetAsEntry())?i.isFile?t.push(this.addFile(n.getAsFile())):i.isDirectory?t.push(this._addFilesFromDirectory(i,i.name)):t.push(void 0):null!=n.getAsFile&&(null==n.kind||"file"===n.kind)?t.push(this.addFile(n.getAsFile())):t.push(void 0)}return t})()}_addFilesFromDirectory(e,t){let i=e.createReader(),n=e=>{return t=console,i="log",n=t=>t.log(e),null!=t&&"function"==typeof t[i]?n(t,i):void 0;var t,i,n},s=0;var o=()=>i.readEntries(e=>{if(e.length>0){for(let i of e)i.isFile?(++s,i.file(e=>{if(!this.options.ignoreHiddenFiles||"."!==e.name.substring(0,1))return e.fullPath=`${t}/${e.name}`,this.addFile(e)})):i.isDirectory&&this._addFilesFromDirectory(i,`${t}/${i.name}`);o()}else 0===s&&this.emit("emptyfolder",t);return null},n);return o()}accept(e,t){this.options.maxFilesize&&e.size>1048576*this.options.maxFilesize?t(this.options.dictFileTooBig.replace("{{filesize}}",Math.round(e.size/1024/10.24)/100).replace("{{maxFilesize}}",this.options.maxFilesize)):i.isValidFile(e,this.options.acceptedFiles)?null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(t(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}",this.options.maxFiles)),this.emit("maxfilesexceeded",e)):this.options.accept.call(this,e,t):t(this.options.dictInvalidFileType)}addFile(e){e.upload={uuid:window.isSecureContext?self.crypto.randomUUID():i.uuidv4(),progress:0,total:e.size,bytesSent:0,filename:this._renameFile(e)},this.files.push(e),e.status=i.ADDED,this.emit("addedfile",e),this._enqueueThumbnail(e),this.accept(e,t=>{t?(e.accepted=!1,this._errorProcessing([e],t)):(e.accepted=!0,this.options.autoQueue&&this.enqueueFile(e)),this._updateMaxFilesReachedClass()})}enqueueFiles(e){for(let t of e)this.enqueueFile(t);return null}enqueueFile(e){if(e.status!==i.ADDED||!0!==e.accepted)throw new Error("This file can't be queued because it has already been processed or was rejected.");if(e.status=i.QUEUED,this.options.autoProcessQueue)return setTimeout(()=>this.processQueue(),0)}_enqueueThumbnail(e){if(this.options.createImageThumbnails&&e.type.match(/image.*/)&&e.size<=1048576*this.options.maxThumbnailFilesize)return this._thumbnailQueue.push(e),setTimeout(()=>this._processThumbnailQueue(),0)}_processThumbnailQueue(){if(this._processingThumbnail||0===this._thumbnailQueue.length)return;this._processingThumbnail=!0;let e=this._thumbnailQueue.shift();return this.createThumbnail(e,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,!0,t=>(this.emit("thumbnail",e,t),this._processingThumbnail=!1,this._processThumbnailQueue()))}removeFile(e){if(e.status===i.UPLOADING&&this.cancelUpload(e),this.files=n(this.files,e),this.emit("removedfile",e),0===this.files.length)return this.emit("reset")}removeAllFiles(e){null==e&&(e=!1);for(let t of this.files.slice())(t.status!==i.UPLOADING||e)&&this.removeFile(t);return null}resizeImage(e,t,n,s,o){return this.createThumbnail(e,t,n,s,!0,(t,n)=>{if(null==n)return o(e);{let{resizeMimeType:t}=this.options;null==t&&(t=e.type);let s=n.toDataURL(t,this.options.resizeQuality);return"image/jpeg"!==t&&"image/jpg"!==t||(s=function(e,t){var i="data:image/jpeg;base64,";if(!e.startsWith(i)||!t.startsWith(i))return t;var n=window.atob(e.slice(i.length));if(!n.startsWith("ÿØÿ"))return t;var s=0,o="";for(;s{e.dataURL=r.result,"image/svg+xml"!==e.type&&"image/gif"!==e.type?this.createThumbnailFromUrl(e,t,i,n,s,o,void 0,l):null!=o&&o(r.result)},r.readAsDataURL(e)}displayExistingFile(e,t,i,n,s=!0){if(this.emit("addedfile",e),this.emit("complete",e),s){let s=t=>{this.emit("thumbnail",e,t),i&&i()};e.dataURL=t,this.createThumbnailFromUrl(e,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,this.options.fixOrientation,s,n)}else this.emit("thumbnail",e,t),i&&i()}createThumbnailFromUrl(e,t,i,n,s,l,r,a=!1){let d=document.createElement("img");r&&(d.crossOrigin=r),s="from-image"!=getComputedStyle(document.body).imageOrientation&&s,d.onload=()=>{let r=e=>e(1);return"undefined"!=typeof EXIF&&null!==EXIF&&s&&(r=e=>EXIF.getData(d,function(){return e(EXIF.getTag(this,"Orientation"))})),r(s=>{e.width=d.width,e.height=d.height;let r=this.options.resize.call(this,e,t,i,n),a=document.createElement("canvas"),u=a.getContext("2d");switch(a.width=r.trgWidth,a.height=r.trgHeight,s>4&&(a.width=r.trgHeight,a.height=r.trgWidth),s){case 2:u.translate(a.width,0),u.scale(-1,1);break;case 3:u.translate(a.width,a.height),u.rotate(Math.PI);break;case 4:u.translate(0,a.height),u.scale(1,-1);break;case 5:u.rotate(.5*Math.PI),u.scale(1,-1);break;case 6:u.rotate(.5*Math.PI),u.translate(0,-a.width);break;case 7:u.rotate(.5*Math.PI),u.translate(a.height,-a.width),u.scale(-1,1);break;case 8:u.rotate(-.5*Math.PI),u.translate(-a.height,0)}o(u,d,null!=r.srcX?r.srcX:0,null!=r.srcY?r.srcY:0,r.srcWidth,r.srcHeight,null!=r.trgX?r.trgX:0,null!=r.trgY?r.trgY:0,r.trgWidth,r.trgHeight);let h=a.toDataURL("image/png");if(null!=l)return l(h,a)})},null!=l&&(d.onerror=l);var u=e.dataURL;return a&&(u=function(e){var t="data:image/jpeg;base64,";if(!e.startsWith(t))return e;var i=window.atob(e.slice(t.length));if(!i.startsWith("ÿØÿ"))return e;var n=0,s="";for(;n=e)return;let n=this.getQueuedFiles();if(n.length>0){if(this.options.uploadMultiple)return this.processFiles(n.slice(0,e-t));for(;it.xhr===e).map(e=>e)}cancelUpload(e){if(e.status===i.UPLOADING){let t=this._getFilesWithXhr(e.xhr);for(let e of t)e.status=i.CANCELED;void 0!==e.xhr&&e.xhr.abort();for(let e of t)this.emit("canceled",e);this.options.uploadMultiple&&this.emit("canceledmultiple",t)}else e.status!==i.ADDED&&e.status!==i.QUEUED||(e.status=i.CANCELED,this.emit("canceled",e),this.options.uploadMultiple&&this.emit("canceledmultiple",[e]));if(this.options.autoProcessQueue)return this.processQueue()}resolveOption(e,...t){return"function"==typeof e?e.apply(this,t):e}uploadFile(e){return this.uploadFiles([e])}uploadFiles(e){this._transformFiles(e,t=>{if(this.options.chunking){let i=t[0];e[0].upload.chunked=this.options.chunking&&(this.options.forceChunking||i.size>this.options.chunkSize),e[0].upload.totalChunkCount=Math.ceil(i.size/this.options.chunkSize),0===i.size&&(e[0].upload.totalChunkCount=1)}if(e[0].upload.chunked){let n=e[0],s=t[0];n.upload.chunks=[];let o=()=>{let t=0;for(;void 0!==n.upload.chunks[t];)t++;if(t>=n.upload.totalChunkCount)return;let o=t*this.options.chunkSize,l=Math.min(o+this.options.chunkSize,s.size),r={name:this._getParamName(0),data:s.webkitSlice?s.webkitSlice(o,l):s.slice(o,l),filename:n.upload.filename,chunkIndex:t};n.upload.chunks[t]={file:n,index:t,dataBlock:r,status:i.UPLOADING,progress:0,retries:0},this._uploadData(e,[r])};if(n.upload.finishedChunkUpload=(t,s)=>{let l=!0;t.status=i.SUCCESS,t.dataBlock=null,t.response=t.xhr.responseText,t.responseHeaders=t.xhr.getAllResponseHeaders(),t.xhr=null;for(let e=0;e{this._finished(e,s,null)})},this.options.parallelChunkUploads){const e=Math.min(!0===this.options.parallelChunkUploads?this.options.parallelUploads:this.options.parallelChunkUploads,n.upload.totalChunkCount);for(let t=0;t{this._finishedUploading(e,i,t)},i.ontimeout=()=>{this._handleUploadError(e,i,`Request timedout after ${this.options.timeout/1e3} seconds`)},i.onerror=()=>{this._handleUploadError(e,i)},(null!=i.upload?i.upload:i).onprogress=t=>this._updateFilesUploadProgress(e,i,t);let o=this.options.defaultHeaders?{Accept:"application/json","Cache-Control":"no-cache","X-Requested-With":"XMLHttpRequest"}:{};this.options.binaryBody&&(o["Content-Type"]=e[0].type),this.options.headers&&Object.assign(o,this.options.headers);for(let e in o){let t=o[e];t&&i.setRequestHeader(e,t)}if(this.options.binaryBody){for(let t of e)this.emit("sending",t,i);this.options.uploadMultiple&&this.emit("sendingmultiple",e,i),this.submitRequest(i,null,e)}else{let n=new FormData;if(this.options.params){let t=this.options.params;"function"==typeof t&&(t=t.call(this,e,i,e[0].upload.chunked?this._getChunk(e[0],i):null));for(let e in t){let i=t[e];if(Array.isArray(i))for(let t=0;t{i[s]=o,++n===e.length&&t(i)})}_addFormElementData(e){if("FORM"===this.element.tagName)for(let t of this.element.querySelectorAll("input, textarea, select, button")){let i=t.getAttribute("name"),n=t.getAttribute("type");if(n&&(n=n.toLowerCase()),null!=i)if("SELECT"===t.tagName&&t.hasAttribute("multiple"))for(let n of t.options)n.selected&&e.append(i,n.value);else(!n||"checkbox"!==n&&"radio"!==n||t.checked)&&e.append(i,t.value)}}_updateFilesUploadProgress(e,t,i){if(e[0].upload.chunked){let n=e[0],s=this._getChunk(n,t);i?(s.progress=100*i.loaded/i.total,s.total=i.total,s.bytesSent=i.loaded):(s.progress=100,s.bytesSent=s.total),n.upload.progress=0,n.upload.total=0,n.upload.bytesSent=0;for(let e=0;e(+e^crypto.getRandomValues(new Uint8Array(1))[0]&15>>+e/4).toString(16))}}i.initClass(),i.options={},i.optionsForElement=function(e){return e.getAttribute("id")&&void 0!==i.options?i.options[s(e.getAttribute("id"))]:void 0},i.instances=[],i.forElement=function(e){if("string"==typeof e&&(e=document.querySelector(e)),null==(null!=e?e.dropzone:void 0))throw new Error("No Dropzone found for given element. This is probably because you're trying to access it before Dropzone had the time to initialize. Use the `init` option to setup any additional observers on your Dropzone.");return e.dropzone},i.discover=function(){let e;if(document.querySelectorAll)e=document.querySelectorAll(".dropzone");else{e=[];let t=t=>(()=>{let i=[];for(let n of t)/(^| )dropzone($| )/.test(n.className)?i.push(e.push(n)):i.push(void 0);return i})();t(document.getElementsByTagName("div")),t(document.getElementsByTagName("form"))}return(()=>{let t=[];for(let n of e)!1!==i.optionsForElement(n)?t.push(new i(n)):t.push(void 0);return t})()},i.isBrowserSupported=function(){return"undefined"!=typeof Promise},i.dataURItoBlob=function(e){let t=atob(e.split(",")[1]),i=e.split(",")[0].split(":")[1].split(";")[0],n=new ArrayBuffer(t.length),s=new Uint8Array(n);for(let e=0,i=t.length,n=0<=i;n?e<=i:e>=i;n?e++:e--)s[e]=t.charCodeAt(e);return new Blob([n],{type:i})};const n=(e,t)=>e.filter(e=>e!==t).map(e=>e),s=e=>e.replace(/[\-_](\w)/g,e=>e.charAt(1).toUpperCase());i.createElement=function(e){let t=document.createElement("div");return t.innerHTML=e,t.childNodes[0]},i.elementInside=function(e,t){if(e===t)return!0;for(;e=e.parentNode;)if(e===t)return!0;return!1},i.getElement=function(e,t){let i;if("string"==typeof e?i=document.querySelector(e):null!=e.nodeType&&(i=e),null==i)throw new Error(`Invalid \`${t}\` option provided. Please provide a CSS selector or a plain HTML element.`);return i},i.getElements=function(e,t){let i,n;if(e instanceof Array){n=[];try{for(i of e)n.push(this.getElement(i,t))}catch(e){n=null}}else if("string"==typeof e)for(i of(n=[],document.querySelectorAll(e)))n.push(i);else null!=e.nodeType&&(n=[e]);if(null==n||!n.length)throw new Error(`Invalid \`${t}\` option provided. Please provide a CSS selector, a plain HTML element or a list of those.`);return n},i.confirm=function(e,t,i){return window.confirm(e)?t():null!=i?i():void 0},i.isValidFile=function(e,t){if(!t)return!0;t=t.split(",");let i=e.type,n=i.replace(/\/.*$/,"");for(let s of t)if(s=s.trim(),"."===s.charAt(0)){if(-1!==e.name.toLowerCase().indexOf(s.toLowerCase(),e.name.length-s.length))return!0}else if(/\/\*$/.test(s)){if(n===s.replace(/\/.*$/,""))return!0}else if(i===s)return!0;return!1},"undefined"!=typeof jQuery&&null!==jQuery&&(jQuery.fn.dropzone=function(e){return this.each(function(){return new i(this,e)})}),i.ADDED="added",i.QUEUED="queued",i.ACCEPTED=i.QUEUED,i.UPLOADING="uploading",i.PROCESSING=i.UPLOADING,i.CANCELED="canceled",i.ERROR="error",i.SUCCESS="success";var o=function(e,t,i,n,s,o,l,r,a,d){let u=function(e){let t=e.naturalHeight,i=document.createElement("canvas");i.width=1,i.height=t;let n=i.getContext("2d");n.drawImage(e,0,0);let{data:s}=n.getImageData(1,0,1,t),o=0,l=t,r=t;for(;r>o;)0===s[4*(r-1)+3]?l=r:o=r,r=l+o>>1;let a=r/t;return 0===a?1:a}(t);return e.drawImage(t,i,n,s,o,l,r,a,d/u)};function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function r(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),i.push.apply(i,n)}return i}function a(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:null;if(null===e&&(e=document.querySelector("[data-component=dropzone]")),e){var t=e.dataset.dropzoneConfig?JSON.parse(e.dataset.dropzoneConfig):{},n={addRemoveLinks:!1,maxFilesize:20,paramName:"upload[file]",previewTemplate:e.querySelector(".dz-preview-template").innerHTML,thumbnailWidth:180,thumbnailHeight:109,sending:function(e,t){e.previewElement&&(t.onreadystatechange=function(){if(4===t.readyState&&200===t.status){var i,n=JSON.parse(t.responseText);if(null!=n&&null!==(i=n.files[0])&&void 0!==i&&i.link){var s=n.files[0],o=e.previewElement.querySelector("[data-dz-link]");o.href=s.link,o.setAttribute("data-media-folder",s.mediaFolder),o.setAttribute("data-media-url",s.mediaUrl),o.setAttribute("data-media-template",s.mediaTemplate),s.mediaPreview&&(e.previewElement.querySelector("[data-dz-thumbnail]").remove(),o.innerHTML=s.mediaPreview)}}})}};return new i(e,a(a({},n),t))}return null};function h(e){return h="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},h(e)}function p(e,t){for(var i=0;i{"use strict";class e{on(e,t){return this._callbacks=this._callbacks||{},this._callbacks[e]||(this._callbacks[e]=[]),this._callbacks[e].push(t),this}emit(e,...t){this._callbacks=this._callbacks||{};let i=this._callbacks[e];if(i)for(let e of i)e.apply(this,t);return this.element&&this.element.dispatchEvent(this.makeEvent("dropzone:"+e,{args:t})),this}makeEvent(e,t){let i={bubbles:!0,cancelable:!0,detail:t};if("function"==typeof window.CustomEvent)return new CustomEvent(e,i);var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,i.bubbles,i.cancelable,i.detail),n}off(e,t){if(!this._callbacks||0===arguments.length)return this._callbacks={},this;let i=this._callbacks[e];if(!i)return this;if(1===arguments.length)return delete this._callbacks[e],this;for(let e=0;et(),chunksUploaded:function(e,t){t()},binaryBody:!1,fallback(){let e;this.element.className=`${this.element.className} dz-browser-not-supported`;for(let t of this.element.getElementsByTagName("div"))if(/(^| )dz-message($| )/.test(t.className)){e=t,t.className="dz-message";break}e||(e=i.createElement('
'),this.element.appendChild(e));let t=e.getElementsByTagName("span")[0];return t&&(null!=t.textContent?t.textContent=this.options.dictFallbackMessage:null!=t.innerText&&(t.innerText=this.options.dictFallbackMessage)),this.element.appendChild(this.getFallbackForm())},resize(e,t,i,n){let s={srcX:0,srcY:0,srcWidth:e.width,srcHeight:e.height},o=e.width/e.height;null==t&&null==i?(t=s.srcWidth,i=s.srcHeight):null==t?t=i*o:null==i&&(i=t/o);let r=(t=Math.min(t,s.srcWidth))/(i=Math.min(i,s.srcHeight));if(s.srcWidth>t||s.srcHeight>i)if("crop"===n)o>r?(s.srcHeight=e.height,s.srcWidth=s.srcHeight*r):(s.srcWidth=e.width,s.srcHeight=s.srcWidth/r);else{if("contain"!==n)throw new Error(`Unknown resizeMethod '${n}'`);o>r?i=t/o:t=i*o}return s.srcX=(e.width-s.srcWidth)/2,s.srcY=(e.height-s.srcHeight)/2,s.trgWidth=t,s.trgHeight=i,s},transformFile(e,t){return(this.options.resizeWidth||this.options.resizeHeight)&&e.type.match(/image.*/)?this.resizeImage(e,this.options.resizeWidth,this.options.resizeHeight,this.options.resizeMethod,t):t(e)},previewTemplate:'\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n \n \n \n
\n
\n \n \n \n
\n
',drop(e){return this.element.classList.remove("dz-drag-hover")},dragstart(e){},dragend(e){return this.element.classList.remove("dz-drag-hover")},dragenter(e){return this.element.classList.add("dz-drag-hover")},dragover(e){return this.element.classList.add("dz-drag-hover")},dragleave(e){return this.element.classList.remove("dz-drag-hover")},paste(e){},reset(){return this.element.classList.remove("dz-started")},addedfile(e){if(this.element===this.previewsContainer&&this.element.classList.add("dz-started"),this.previewsContainer&&!this.options.disablePreviews){for(var t of(e.previewElement=i.createElement(this.options.previewTemplate.trim()),e.previewTemplate=e.previewElement,this.previewsContainer.appendChild(e.previewElement),e.previewElement.querySelectorAll("[data-dz-name]")))t.textContent=e.name;for(t of e.previewElement.querySelectorAll("[data-dz-size]"))t.innerHTML=this.filesize(e.size);this.options.addRemoveLinks&&(e._removeLink=i.createElement(`${this.options.dictRemoveFile}`),e.previewElement.appendChild(e._removeLink));let n=t=>(t.preventDefault(),t.stopPropagation(),e.status===i.UPLOADING?this.options.dictCancelUploadConfirmation?i.confirm(this.options.dictCancelUploadConfirmation,()=>this.removeFile(e)):this.removeFile(e):this.options.dictRemoveFileConfirmation?i.confirm(this.options.dictRemoveFileConfirmation,()=>this.removeFile(e)):this.removeFile(e));for(let t of e.previewElement.querySelectorAll("[data-dz-remove]"))t.addEventListener("click",n)}},removedfile(e){return null!=e.previewElement&&null!=e.previewElement.parentNode&&e.previewElement.parentNode.removeChild(e.previewElement),this._updateMaxFilesReachedClass()},thumbnail(e,t){if(e.previewElement){e.previewElement.classList.remove("dz-file-preview");for(let i of e.previewElement.querySelectorAll("[data-dz-thumbnail]"))i.alt=e.name,i.src=t;return setTimeout(()=>e.previewElement.classList.add("dz-image-preview"),1)}},error(e,t){if(e.previewElement){e.previewElement.classList.add("dz-error"),"string"!=typeof t&&t.error&&(t=t.error);for(let i of e.previewElement.querySelectorAll("[data-dz-errormessage]"))i.textContent=t}},errormultiple(){},processing(e){if(e.previewElement&&(e.previewElement.classList.add("dz-processing"),e._removeLink))return e._removeLink.innerHTML=this.options.dictCancelUpload},processingmultiple(){},uploadprogress(e,t,i){if(e.previewElement)for(let i of e.previewElement.querySelectorAll("[data-dz-uploadprogress]"))"PROGRESS"===i.nodeName?i.value=t:i.style.width=`${t}%`},totaluploadprogress(){},sending(){},sendingmultiple(){},success(e){if(e.previewElement)return e.previewElement.classList.add("dz-success")},successmultiple(){},canceled(e){return this.emit("error",e,this.options.dictUploadCanceled)},canceledmultiple(){},complete(e){if(e._removeLink&&(e._removeLink.innerHTML=this.options.dictRemoveFile),e.previewElement)return e.previewElement.classList.add("dz-complete")},completemultiple(){},maxfilesexceeded(){},maxfilesreached(){},queuecomplete(){},addedfiles(){},emptyfolder(){}};class i extends e{static initClass(){this.prototype.Emitter=e,this.prototype.events=["drop","dragstart","dragend","dragenter","dragover","dragleave","addedfile","addedfiles","removedfile","thumbnail","error","errormultiple","processing","processingmultiple","uploadprogress","totaluploadprogress","sending","sendingmultiple","success","successmultiple","canceled","canceledmultiple","complete","completemultiple","reset","maxfilesexceeded","maxfilesreached","queuecomplete","emptyfolder"],this.prototype._thumbnailQueue=[],this.prototype._processingThumbnail=!1}constructor(e,n){let s,o;if(super(),this.element=e,this.clickableElements=[],this.listeners=[],this.files=[],"string"==typeof this.element&&(this.element=document.querySelector(this.element)),null===this.element||!this.element instanceof HTMLElement)throw new Error("Invalid dropzone element: not an instance of HTMLElement.");if(this.element.dropzone)throw new Error("Dropzone already attached.");i.instances.push(this),this.element.dropzone=this;let r=null!=(o=i.optionsForElement(this.element))?o:{};if(this.options=Object.assign({},t,r,null!=n?n:{}),this.options.previewTemplate=this.options.previewTemplate.replace(/\n*/g,""),this.options.forceFallback||!i.isBrowserSupported())return this.options.fallback.call(this);if(null==this.options.url&&(this.options.url=this.element.getAttribute("action")),!this.options.url)throw new Error("No URL provided.");if(this.options.uploadMultiple&&this.options.chunking)throw new Error("You cannot set both: uploadMultiple and chunking.");if(this.options.binaryBody&&this.options.uploadMultiple)throw new Error("You cannot set both: binaryBody and uploadMultiple.");"string"==typeof this.options.method&&(this.options.method=this.options.method.toUpperCase()),(s=this.getExistingFallback())&&s.parentNode&&s.parentNode.removeChild(s),!1!==this.options.previewsContainer&&(this.options.previewsContainer?this.previewsContainer=i.getElement(this.options.previewsContainer,"previewsContainer"):this.previewsContainer=this.element),this.options.clickable&&(!0===this.options.clickable?this.clickableElements=[this.element]:this.clickableElements=i.getElements(this.options.clickable,"clickable")),this.init()}getAcceptedFiles(){return this.files.filter(e=>e.accepted).map(e=>e)}getRejectedFiles(){return this.files.filter(e=>!e.accepted).map(e=>e)}getFilesWithStatus(e){return this.files.filter(t=>t.status===e).map(e=>e)}getQueuedFiles(){return this.getFilesWithStatus(i.QUEUED)}getUploadingFiles(){return this.getFilesWithStatus(i.UPLOADING)}getAddedFiles(){return this.getFilesWithStatus(i.ADDED)}getActiveFiles(){return this.files.filter(e=>e.status===i.UPLOADING||e.status===i.QUEUED).map(e=>e)}init(){if("form"===this.element.tagName&&this.element.setAttribute("enctype","multipart/form-data"),this.element.classList.contains("dropzone")&&!this.element.querySelector(".dz-message")&&this.element.appendChild(i.createElement(`
`)),this.clickableElements.length){let e=()=>{this.hiddenFileInput&&this.hiddenFileInput.parentNode?.removeChild(this.hiddenFileInput),this.hiddenFileInput=document.createElement("input"),this.hiddenFileInput.setAttribute("type","file"),this.hiddenFileInput.setAttribute("form",this.element.id),(null===this.options.maxFiles||this.options.maxFiles>1)&&this.hiddenFileInput.setAttribute("multiple","multiple"),this.hiddenFileInput.className="dz-hidden-input",null!==this.options.acceptedFiles&&this.hiddenFileInput.setAttribute("accept",this.options.acceptedFiles),null!==this.options.capture&&this.hiddenFileInput.setAttribute("capture",this.options.capture),this.hiddenFileInput.setAttribute("tabindex","-1"),this.hiddenFileInput.setAttribute("aria-label","dropzone hidden input"),this.hiddenFileInput.style.visibility="hidden",this.hiddenFileInput.style.position="absolute",this.hiddenFileInput.style.top="0",this.hiddenFileInput.style.left="0",this.hiddenFileInput.style.height="0",this.hiddenFileInput.style.width="0",i.getElement(this.options.hiddenInputContainer,"hiddenInputContainer").appendChild(this.hiddenFileInput),this.hiddenFileInput.addEventListener("change",()=>{let{files:t}=this.hiddenFileInput;if(t.length)for(let e of t)this.addFile(e);this.emit("addedfiles",t),e()})};e()}this.URL=null!==window.URL?window.URL:window.webkitURL;for(let e of this.events)this.on(e,this.options[e]);this.on("uploadprogress",()=>this.updateTotalUploadProgress()),this.on("removedfile",()=>this.updateTotalUploadProgress()),this.on("canceled",e=>this.emit("complete",e)),this.on("complete",e=>{if(0===this.getAddedFiles().length&&0===this.getUploadingFiles().length&&0===this.getQueuedFiles().length)return setTimeout(()=>this.emit("queuecomplete"),0)});let e=function(e){if(function(e){return e.dataTransfer.types&&e.dataTransfer.types.includes("Files")}(e))return e.stopPropagation(),e.preventDefault()};return this.listeners=[{element:this.element,events:{dragstart:e=>this.emit("dragstart",e),dragenter:t=>(e(t),this.emit("dragenter",t)),dragover:t=>{const i=t.dataTransfer.effectAllowed;return t.dataTransfer.dropEffect="move"===i||"linkMove"===i?"move":"copy",e(t),this.emit("dragover",t)},dragleave:e=>this.emit("dragleave",e),drop:t=>(e(t),this.drop(t)),dragend:e=>this.emit("dragend",e)}}],this.clickableElements.forEach(e=>this.listeners.push({element:e,events:{click:t=>((e!==this.element||t.target===this.element||i.elementInside(t.target,this.element.querySelector(".dz-message")))&&this.hiddenFileInput.click(),!0)}})),this.enable(),this.options.init.call(this)}destroy(){return this.disable(),this.removeAllFiles(!0),(null!=this.hiddenFileInput?this.hiddenFileInput.parentNode:void 0)&&(this.hiddenFileInput.parentNode.removeChild(this.hiddenFileInput),this.hiddenFileInput=null),delete this.element.dropzone,i.instances.splice(i.instances.indexOf(this),1)}updateTotalUploadProgress(){let e,t=0,i=0;if(this.getActiveFiles().length){for(let e of this.getActiveFiles())t+=e.upload.bytesSent,i+=e.upload.total;e=100*t/i}else e=100;return this.emit("totaluploadprogress",e,i,t)}_getParamName(e){return"function"==typeof this.options.paramName?this.options.paramName(e):`${this.options.paramName}${this.options.uploadMultiple?`[${e}]`:""}`}_renameFile(e){const t={...e,name:e.name.replace(/\u202F/g," ")};return"function"!=typeof this.options.renameFile?t.name:this.options.renameFile(t)}getFallbackForm(){let e,t;if(e=this.getExistingFallback())return e;let n='
';this.options.dictFallbackText&&(n+=`

${this.options.dictFallbackText}

`),n+=`
`;let s=i.createElement(n);return"FORM"!==this.element.tagName?(t=i.createElement(`
`),t.appendChild(s)):(this.element.setAttribute("enctype","multipart/form-data"),this.element.setAttribute("method",this.options.method)),null!=t?t:s}getExistingFallback(){let e=function(e){for(let t of e)if(/(^| )fallback($| )/.test(t.className))return t};for(let i of["div","form"]){var t;if(t=e(this.element.getElementsByTagName(i)))return t}}setupEventListeners(){return this.listeners.map(e=>(()=>{let t=[];for(let i in e.events){let n=e.events[i];t.push(e.element.addEventListener(i,n,!1))}return t})())}removeEventListeners(){return this.listeners.map(e=>(()=>{let t=[];for(let i in e.events){let n=e.events[i];t.push(e.element.removeEventListener(i,n,!1))}return t})())}disable(){return this.clickableElements.forEach(e=>e.classList.remove("dz-clickable")),this.removeEventListeners(),this.disabled=!0,this.files.map(e=>this.cancelUpload(e))}enable(){return delete this.disabled,this.clickableElements.forEach(e=>e.classList.add("dz-clickable")),this.setupEventListeners()}filesize(e){let t=0,i="b";if(e>0){let n=["tb","gb","mb","kb","b"];for(let s=0;s=Math.pow(this.options.filesizeBase,4-s)/10){t=e/Math.pow(this.options.filesizeBase,4-s),i=o;break}}t=Math.round(10*t)/10}return`${t} ${this.options.dictFileSizeUnits[i]}`}_updateMaxFilesReachedClass(){return null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(this.getAcceptedFiles().length===this.options.maxFiles&&this.emit("maxfilesreached",this.files),this.element.classList.add("dz-max-files-reached")):this.element.classList.remove("dz-max-files-reached")}drop(e){if(!e.dataTransfer)return;this.emit("drop",e);let t=[];for(let i=0;ie.items,null!=t?i(t):void 0))return;var t,i;this.emit("paste",e);let{items:n}=e.clipboardData;return n.length?this._addFilesFromItems(n):void 0}handleFiles(e){for(let t of e)this.addFile(t)}_addFilesFromItems(e){return(()=>{let t=[];for(let n of e){var i;null!=n.webkitGetAsEntry&&(i=n.webkitGetAsEntry())?i.isFile?t.push(this.addFile(n.getAsFile())):i.isDirectory?t.push(this._addFilesFromDirectory(i,i.name)):t.push(void 0):null!=n.getAsFile&&(null==n.kind||"file"===n.kind)?t.push(this.addFile(n.getAsFile())):t.push(void 0)}return t})()}_addFilesFromDirectory(e,t){let i=e.createReader(),n=e=>{return t=console,i="log",n=t=>t.log(e),null!=t&&"function"==typeof t[i]?n(t,i):void 0;var t,i,n},s=0;var o=()=>i.readEntries(e=>{if(e.length>0){for(let i of e)i.isFile?(++s,i.file(e=>{if(!this.options.ignoreHiddenFiles||"."!==e.name.substring(0,1))return e.fullPath=`${t}/${e.name}`,this.addFile(e)})):i.isDirectory&&this._addFilesFromDirectory(i,`${t}/${i.name}`);o()}else 0===s&&this.emit("emptyfolder",t);return null},n);return o()}accept(e,t){this.options.maxFilesize&&e.size>1048576*this.options.maxFilesize?t(this.options.dictFileTooBig.replace("{{filesize}}",Math.round(e.size/1024/10.24)/100).replace("{{maxFilesize}}",this.options.maxFilesize)):i.isValidFile(e,this.options.acceptedFiles)?null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(t(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}",this.options.maxFiles)),this.emit("maxfilesexceeded",e)):this.options.accept.call(this,e,t):t(this.options.dictInvalidFileType)}addFile(e){e.upload={uuid:window.isSecureContext?self.crypto.randomUUID():i.uuidv4(),progress:0,total:e.size,bytesSent:0,filename:this._renameFile(e)},this.files.push(e),e.status=i.ADDED,this.emit("addedfile",e),this._enqueueThumbnail(e),this.accept(e,t=>{t?(e.accepted=!1,this._errorProcessing([e],t)):(e.accepted=!0,this.options.autoQueue&&this.enqueueFile(e)),this._updateMaxFilesReachedClass()})}enqueueFiles(e){for(let t of e)this.enqueueFile(t);return null}enqueueFile(e){if(e.status!==i.ADDED||!0!==e.accepted)throw new Error("This file can't be queued because it has already been processed or was rejected.");if(e.status=i.QUEUED,this.options.autoProcessQueue)return setTimeout(()=>this.processQueue(),0)}_enqueueThumbnail(e){if(this.options.createImageThumbnails&&e.type.match(/image.*/)&&e.size<=1048576*this.options.maxThumbnailFilesize)return this._thumbnailQueue.push(e),setTimeout(()=>this._processThumbnailQueue(),0)}_processThumbnailQueue(){if(this._processingThumbnail||0===this._thumbnailQueue.length)return;this._processingThumbnail=!0;let e=this._thumbnailQueue.shift();return this.createThumbnail(e,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,!0,t=>(this.emit("thumbnail",e,t),this._processingThumbnail=!1,this._processThumbnailQueue()))}removeFile(e){if(e.status===i.UPLOADING&&this.cancelUpload(e),this.files=n(this.files,e),this.emit("removedfile",e),0===this.files.length)return this.emit("reset")}removeAllFiles(e){null==e&&(e=!1);for(let t of this.files.slice())(t.status!==i.UPLOADING||e)&&this.removeFile(t);return null}resizeImage(e,t,n,s,o){return this.createThumbnail(e,t,n,s,!0,(t,n)=>{if(null==n)return o(e);{let{resizeMimeType:t}=this.options;null==t&&(t=e.type);let s=n.toDataURL(t,this.options.resizeQuality);return"image/jpeg"!==t&&"image/jpg"!==t||(s=function(e,t){var i="data:image/jpeg;base64,";if(!e.startsWith(i)||!t.startsWith(i))return t;var n=window.atob(e.slice(i.length));if(!n.startsWith("ÿØÿ"))return t;var s=0,o="";for(;s{e.dataURL=l.result,"image/svg+xml"!==e.type&&"image/gif"!==e.type?this.createThumbnailFromUrl(e,t,i,n,s,o,void 0,r):null!=o&&o(l.result)},l.readAsDataURL(e)}displayExistingFile(e,t,i,n,s=!0){if(this.emit("addedfile",e),this.emit("complete",e),s){let s=t=>{this.emit("thumbnail",e,t),i&&i()};e.dataURL=t,this.createThumbnailFromUrl(e,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,this.options.fixOrientation,s,n)}else this.emit("thumbnail",e,t),i&&i()}createThumbnailFromUrl(e,t,i,n,s,r,l,a=!1){let d=document.createElement("img");l&&(d.crossOrigin=l),s="from-image"!=getComputedStyle(document.body).imageOrientation&&s,d.onload=()=>{let l=e=>e(1);return"undefined"!=typeof EXIF&&null!==EXIF&&s&&(l=e=>EXIF.getData(d,function(){return e(EXIF.getTag(this,"Orientation"))})),l(s=>{e.width=d.width,e.height=d.height;let l=this.options.resize.call(this,e,t,i,n),a=document.createElement("canvas"),u=a.getContext("2d");switch(a.width=l.trgWidth,a.height=l.trgHeight,s>4&&(a.width=l.trgHeight,a.height=l.trgWidth),s){case 2:u.translate(a.width,0),u.scale(-1,1);break;case 3:u.translate(a.width,a.height),u.rotate(Math.PI);break;case 4:u.translate(0,a.height),u.scale(1,-1);break;case 5:u.rotate(.5*Math.PI),u.scale(1,-1);break;case 6:u.rotate(.5*Math.PI),u.translate(0,-a.width);break;case 7:u.rotate(.5*Math.PI),u.translate(a.height,-a.width),u.scale(-1,1);break;case 8:u.rotate(-.5*Math.PI),u.translate(-a.height,0)}o(u,d,null!=l.srcX?l.srcX:0,null!=l.srcY?l.srcY:0,l.srcWidth,l.srcHeight,null!=l.trgX?l.trgX:0,null!=l.trgY?l.trgY:0,l.trgWidth,l.trgHeight);let h=a.toDataURL("image/png");if(null!=r)return r(h,a)})},null!=r&&(d.onerror=r);var u=e.dataURL;return a&&(u=function(e){var t="data:image/jpeg;base64,";if(!e.startsWith(t))return e;var i=window.atob(e.slice(t.length));if(!i.startsWith("ÿØÿ"))return e;var n=0,s="";for(;n=e)return;let n=this.getQueuedFiles();if(n.length>0){if(this.options.uploadMultiple)return this.processFiles(n.slice(0,e-t));for(;it.xhr===e).map(e=>e)}cancelUpload(e){if(e.status===i.UPLOADING){let t=this._getFilesWithXhr(e.xhr);for(let e of t)e.status=i.CANCELED;void 0!==e.xhr&&e.xhr.abort();for(let e of t)this.emit("canceled",e);this.options.uploadMultiple&&this.emit("canceledmultiple",t)}else e.status!==i.ADDED&&e.status!==i.QUEUED||(e.status=i.CANCELED,this.emit("canceled",e),this.options.uploadMultiple&&this.emit("canceledmultiple",[e]));if(this.options.autoProcessQueue)return this.processQueue()}resolveOption(e,...t){return"function"==typeof e?e.apply(this,t):e}uploadFile(e){return this.uploadFiles([e])}uploadFiles(e){this._transformFiles(e,t=>{if(this.options.chunking){let i=t[0];e[0].upload.chunked=this.options.chunking&&(this.options.forceChunking||i.size>this.options.chunkSize),e[0].upload.totalChunkCount=Math.ceil(i.size/this.options.chunkSize),0===i.size&&(e[0].upload.totalChunkCount=1)}if(e[0].upload.chunked){let n=e[0],s=t[0];n.upload.chunks=[];let o=()=>{let t=0;for(;void 0!==n.upload.chunks[t];)t++;if(t>=n.upload.totalChunkCount)return;let o=t*this.options.chunkSize,r=Math.min(o+this.options.chunkSize,s.size),l={name:this._getParamName(0),data:s.webkitSlice?s.webkitSlice(o,r):s.slice(o,r),filename:n.upload.filename,chunkIndex:t};n.upload.chunks[t]={file:n,index:t,dataBlock:l,status:i.UPLOADING,progress:0,retries:0},this._uploadData(e,[l])};if(n.upload.finishedChunkUpload=(t,s)=>{let r=!0;t.status=i.SUCCESS,t.dataBlock=null,t.response=t.xhr.responseText,t.responseHeaders=t.xhr.getAllResponseHeaders(),t.xhr=null;for(let e=0;e{this._finished(e,s,null)})},this.options.parallelChunkUploads){const e=Math.min(!0===this.options.parallelChunkUploads?this.options.parallelUploads:this.options.parallelChunkUploads,n.upload.totalChunkCount);for(let t=0;t{this._finishedUploading(e,i,t)},i.ontimeout=()=>{this._handleUploadError(e,i,`Request timedout after ${this.options.timeout/1e3} seconds`)},i.onerror=()=>{this._handleUploadError(e,i)},(null!=i.upload?i.upload:i).onprogress=t=>this._updateFilesUploadProgress(e,i,t);let o=this.options.defaultHeaders?{Accept:"application/json","Cache-Control":"no-cache","X-Requested-With":"XMLHttpRequest"}:{};this.options.binaryBody&&(o["Content-Type"]=e[0].type),this.options.headers&&Object.assign(o,this.options.headers);for(let e in o){let t=o[e];t&&i.setRequestHeader(e,t)}if(this.options.binaryBody){for(let t of e)this.emit("sending",t,i);this.options.uploadMultiple&&this.emit("sendingmultiple",e,i),this.submitRequest(i,null,e)}else{let n=new FormData;if(this.options.params){let t=this.options.params;"function"==typeof t&&(t=t.call(this,e,i,e[0].upload.chunked?this._getChunk(e[0],i):null));for(let e in t){let i=t[e];if(Array.isArray(i))for(let t=0;t{i[s]=o,++n===e.length&&t(i)})}_addFormElementData(e){if("FORM"===this.element.tagName)for(let t of this.element.querySelectorAll("input, textarea, select, button")){let i=t.getAttribute("name"),n=t.getAttribute("type");if(n&&(n=n.toLowerCase()),null!=i)if("SELECT"===t.tagName&&t.hasAttribute("multiple"))for(let n of t.options)n.selected&&e.append(i,n.value);else(!n||"checkbox"!==n&&"radio"!==n||t.checked)&&e.append(i,t.value)}}_updateFilesUploadProgress(e,t,i){if(e[0].upload.chunked){let n=e[0],s=this._getChunk(n,t);i?(s.progress=100*i.loaded/i.total,s.total=i.total,s.bytesSent=i.loaded):(s.progress=100,s.bytesSent=s.total),n.upload.progress=0,n.upload.total=0,n.upload.bytesSent=0;for(let e=0;e(+e^crypto.getRandomValues(new Uint8Array(1))[0]&15>>+e/4).toString(16))}}i.initClass(),i.options={},i.optionsForElement=function(e){return e.getAttribute("id")&&void 0!==i.options?i.options[s(e.getAttribute("id"))]:void 0},i.instances=[],i.forElement=function(e){if("string"==typeof e&&(e=document.querySelector(e)),null==(null!=e?e.dropzone:void 0))throw new Error("No Dropzone found for given element. This is probably because you're trying to access it before Dropzone had the time to initialize. Use the `init` option to setup any additional observers on your Dropzone.");return e.dropzone},i.discover=function(){let e;if(document.querySelectorAll)e=document.querySelectorAll(".dropzone");else{e=[];let t=t=>(()=>{let i=[];for(let n of t)/(^| )dropzone($| )/.test(n.className)?i.push(e.push(n)):i.push(void 0);return i})();t(document.getElementsByTagName("div")),t(document.getElementsByTagName("form"))}return(()=>{let t=[];for(let n of e)!1!==i.optionsForElement(n)?t.push(new i(n)):t.push(void 0);return t})()},i.isBrowserSupported=function(){return"undefined"!=typeof Promise},i.dataURItoBlob=function(e){let t=atob(e.split(",")[1]),i=e.split(",")[0].split(":")[1].split(";")[0],n=new ArrayBuffer(t.length),s=new Uint8Array(n);for(let e=0,i=t.length,n=0<=i;n?e<=i:e>=i;n?e++:e--)s[e]=t.charCodeAt(e);return new Blob([n],{type:i})};const n=(e,t)=>e.filter(e=>e!==t).map(e=>e),s=e=>e.replace(/[\-_](\w)/g,e=>e.charAt(1).toUpperCase());i.createElement=function(e){let t=document.createElement("div");return t.innerHTML=e,t.childNodes[0]},i.elementInside=function(e,t){if(e===t)return!0;for(;e=e.parentNode;)if(e===t)return!0;return!1},i.getElement=function(e,t){let i;if("string"==typeof e?i=document.querySelector(e):null!=e.nodeType&&(i=e),null==i)throw new Error(`Invalid \`${t}\` option provided. Please provide a CSS selector or a plain HTML element.`);return i},i.getElements=function(e,t){let i,n;if(e instanceof Array){n=[];try{for(i of e)n.push(this.getElement(i,t))}catch(e){n=null}}else if("string"==typeof e)for(i of(n=[],document.querySelectorAll(e)))n.push(i);else null!=e.nodeType&&(n=[e]);if(null==n||!n.length)throw new Error(`Invalid \`${t}\` option provided. Please provide a CSS selector, a plain HTML element or a list of those.`);return n},i.confirm=function(e,t,i){return window.confirm(e)?t():null!=i?i():void 0},i.isValidFile=function(e,t){if(!t)return!0;t=t.split(",");let i=e.type,n=i.replace(/\/.*$/,"");for(let s of t)if(s=s.trim(),"."===s.charAt(0)){if(-1!==e.name.toLowerCase().indexOf(s.toLowerCase(),e.name.length-s.length))return!0}else if(/\/\*$/.test(s)){if(n===s.replace(/\/.*$/,""))return!0}else if(i===s)return!0;return!1},"undefined"!=typeof jQuery&&null!==jQuery&&(jQuery.fn.dropzone=function(e){return this.each(function(){return new i(this,e)})}),i.ADDED="added",i.QUEUED="queued",i.ACCEPTED=i.QUEUED,i.UPLOADING="uploading",i.PROCESSING=i.UPLOADING,i.CANCELED="canceled",i.ERROR="error",i.SUCCESS="success";var o=function(e,t,i,n,s,o,r,l,a,d){let u=function(e){let t=e.naturalHeight,i=document.createElement("canvas");i.width=1,i.height=t;let n=i.getContext("2d");n.drawImage(e,0,0);let{data:s}=n.getImageData(1,0,1,t),o=0,r=t,l=t;for(;l>o;)0===s[4*(l-1)+3]?r=l:o=l,l=r+o>>1;let a=l/t;return 0===a?1:a}(t);return e.drawImage(t,i,n,s,o,r,l,a,d/u)};function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}function l(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),i.push.apply(i,n)}return i}function a(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:null;if(null===e&&(e=document.querySelector("[data-component=dropzone]")),e){var t=e.dataset.dropzoneConfig?JSON.parse(e.dataset.dropzoneConfig):{},n={addRemoveLinks:!1,maxFilesize:20,paramName:"upload[file]",previewTemplate:e.querySelector(".dz-preview-template").innerHTML,thumbnailWidth:180,thumbnailHeight:109,sending:function(e,t){e.previewElement&&(t.onreadystatechange=function(){if(4===t.readyState&&200===t.status){var i,n=JSON.parse(t.responseText);if(null!=n&&null!==(i=n.files[0])&&void 0!==i&&i.link){var s=n.files[0],o=e.previewElement.querySelector("[data-dz-link]");o.href=s.link,o.setAttribute("data-media-folder",s.mediaFolder),o.setAttribute("data-media-url",s.mediaUrl),o.setAttribute("data-media-template",s.mediaTemplate),s.mediaPreview&&(e.previewElement.querySelector("[data-dz-thumbnail]").remove(),o.innerHTML=s.mediaPreview)}}})}};return new i(e,a(a({},n),t))}return null};function h(e){return h="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},h(e)}function c(e,t){for(var i=0;iquery->getString('search', ''); + $hasSearch = '' !== $searchValue; + try { $trashPath = $this->getOriginalStorage()->getTrashPath(); @@ -255,8 +258,16 @@ public function list(Request $request, string $key = ''): Response throw new ForbiddenPathException($trashPath); } - $directories = $this->getOriginalStorage()->listDirectories($currentKey, recursive: false); - natcasesort($directories); + $dirFilter = null; + if ($hasSearch) { + $dirFilter = static fn (string $a): bool => str_contains(strtolower($a), strtolower($searchValue)); + } + + $directories = $this->getOriginalStorage()->listDirectories($currentKey, recursive: $hasSearch, filter: $dirFilter); + + if (!$hasSearch) { + natcasesort($directories); + } } catch (ForbiddenPathException|PathTraversalDetected|UnableToListContents) { $this->addFlash( 'sonata_flash_error', @@ -278,12 +289,18 @@ public function list(Request $request, string $key = ''): Response $routeName = $request->attributes->get('_route') ?? 'joli_media_sonata_admin_explore'; + $mediaFilter = null; + if ($hasSearch) { + $mediaFilter = static fn ($media): bool => str_contains(strtolower($media->getPath()), strtolower($searchValue)); + } + try { $paginatedMedias = $this->getOriginalStorage()->listMediasPaginated( $currentKey, - recursive: false, + recursive: $hasSearch, page: $request->query->getInt('page', 1), perPage: $this->config->getPaginationSize(), + filter: $mediaFilter, ); } catch (\OutOfRangeException) { throw new BadRequestException('The requested page number is out of range.'); @@ -306,6 +323,7 @@ public function list(Request $request, string $key = ''): Response 'pager' => $pager, 'parent_key' => \dirname($currentKey), 'rename_directory_form' => $this->createRenameDirectoryForm($key)->createView(), + 'search' => $searchValue, ])); } diff --git a/src/Bridge/SonataAdmin/templates/list.html.twig b/src/Bridge/SonataAdmin/templates/list.html.twig index e756dad4..8d885212 100644 --- a/src/Bridge/SonataAdmin/templates/list.html.twig +++ b/src/Bridge/SonataAdmin/templates/list.html.twig @@ -87,6 +87,18 @@ {% block content %} {{ block('content_header') }} + {% if 'choose' in base_template or 'explore' in base_template %} + + {% endif %}