From 6fec7e7326f4ee7454f590fc700f4369540d3589 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Fr=C3=A9mont?= Date: Thu, 21 May 2026 15:21:23 +0200 Subject: [PATCH 1/3] feat(Sylius): Search in the choose media modal --- .../assets/js/components/mediaSelector.js | 57 ++++++++++++++++++- src/Bridge/Sylius/public/entrypoints.json | 2 +- .../joli-media-sylius-admin.0ec877e4.js | 1 - .../joli-media-sylius-admin.dc8dd6d7.js | 1 + src/Bridge/Sylius/public/manifest.json | 2 +- .../Admin/Controller/MediaAdminController.php | 52 +++++++++++++++-- .../templates/admin/media/choose.html.twig | 10 ++++ .../shared/layout/base/scripts.html.twig | 2 +- .../JoliMediaSyliusBundle.en.yaml | 2 + .../JoliMediaSyliusBundle.fr.yaml | 2 + 10 files changed, 119 insertions(+), 12 deletions(-) delete mode 100644 src/Bridge/Sylius/public/joli-media-sylius-admin.0ec877e4.js create mode 100644 src/Bridge/Sylius/public/joli-media-sylius-admin.dc8dd6d7.js diff --git a/src/Bridge/Sylius/assets/js/components/mediaSelector.js b/src/Bridge/Sylius/assets/js/components/mediaSelector.js index 2bafc57e..260386ba 100644 --- a/src/Bridge/Sylius/assets/js/components/mediaSelector.js +++ b/src/Bridge/Sylius/assets/js/components/mediaSelector.js @@ -132,6 +132,51 @@ const configureMediaChoiceContainer = (mediaChoiceContainer) => { }; let currentFolderPath = getCurrentFolderPath(); + let currentSearchValue = ''; + + const getSearchUrl = (baseUrl) => { + if (!currentSearchValue) return baseUrl; + const separator = baseUrl.includes('?') ? '&' : '?'; + return `${baseUrl}${separator}search=${encodeURIComponent(currentSearchValue)}`; + }; + + const setupSearch = () => { + const currentModalEl = document.getElementById(`modal-media-choice_${id}`); + if (!currentModalEl) return; + + const searchForm = currentModalEl.querySelector('.joli-media-search-form'); + const searchInput = currentModalEl.querySelector('.joli-media-search-input'); + if (!searchForm || !searchInput) return; + + 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(); + currentSearchValue = newInput.value.trim(); + const basePath = getBasePath(); + const url = currentFolderPath + ? `${basePath}/${currentFolderPath}` + : basePath; + fetchFolder(getSearchUrl(url)).then(configureModal); + }); + + newInput.addEventListener('search', () => { + if (!newInput.value) { + currentSearchValue = ''; + const basePath = getBasePath(); + const url = currentFolderPath + ? `${basePath}/${currentFolderPath}` + : basePath; + fetchFolder(url).then(configureModal); + } + }); + }; const configureModal = (html) => { const currentModalEl = document.getElementById(`modal-media-choice_${id}`); @@ -143,6 +188,7 @@ const configureMediaChoiceContainer = (mediaChoiceContainer) => { currentModalContent.innerHTML = html; updateBreadcrumb(currentFolderPath); setupCreateFolder(); + setupSearch(); }; const closeModal = () => { @@ -197,7 +243,7 @@ const getParentControllers = (element) => { const url = currentFolderPath ? `${basePath}/${currentFolderPath}` : basePath; - fetchFolder(url).then(configureModal); + fetchFolder(getSearchUrl(url)).then(configureModal); }; const handleModalClick = (event) => { @@ -212,7 +258,7 @@ const getParentControllers = (element) => { return; } - const href = target.attributes.href.value; + let href = target.attributes.href.value; if ( target.dataset.mediaTemplate !== undefined && @@ -248,6 +294,7 @@ const getParentControllers = (element) => { } else { currentFolderPath = folderPath; updateBreadcrumb(currentFolderPath); + href = getSearchUrl(href); } } @@ -284,6 +331,7 @@ const getParentControllers = (element) => { fetchFolder(editButton.href).then((html) => { if (modalBody) modalBody.innerHTML = html; setupCreateFolder(); + setupSearch(); const bsModal = bootstrap.Modal.getOrCreateInstance(modalEl); bsModal.show(); }); @@ -354,6 +402,11 @@ const getParentControllers = (element) => { parentPathInput.value = currentFolderPath; + const searchInput = createForm.querySelector('.directory-create-search'); + if (searchInput) { + searchInput.value = currentSearchValue; + } + fetch(createForm.action, { method: 'POST', body: new FormData(createForm), diff --git a/src/Bridge/Sylius/public/entrypoints.json b/src/Bridge/Sylius/public/entrypoints.json index 69473f93..3141bc9e 100644 --- a/src/Bridge/Sylius/public/entrypoints.json +++ b/src/Bridge/Sylius/public/entrypoints.json @@ -5,7 +5,7 @@ "./joli-media-sylius-admin.2f351929.css" ], "js": [ - "./joli-media-sylius-admin.0ec877e4.js" + "./joli-media-sylius-admin.dc8dd6d7.js" ] } } diff --git a/src/Bridge/Sylius/public/joli-media-sylius-admin.0ec877e4.js b/src/Bridge/Sylius/public/joli-media-sylius-admin.0ec877e4.js deleted file mode 100644 index 3247fe6b..00000000 --- a/src/Bridge/Sylius/public/joli-media-sylius-admin.0ec877e4.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{var e={264(){document.addEventListener("show.bs.modal",function(e){e.target.parentElement!==document.body&&document.body.appendChild(e.target)})}},t={};function i(n){var a=t[n];if(void 0!==a)return a.exports;var r=t[n]={exports:{}};return e[n](r,r.exports,i),r.exports}(()=>{"use strict";i(264);var e=function(e){for(var t=e;t&&t!==document.body;){if(t.dataset.controller&&t.dataset.controller.includes("live-collection"))return!0;t=t.parentElement}return!1},t=function(t){var i=t.dataset.mediaId,n=t.querySelector('[id^="joli-media-container_"]'),a=t.querySelector(".joli-media-choice-delete"),r=t.querySelector(".joli-media-choice-edit"),s=t.querySelector('[id="'.concat(i,'"]')),o=document.getElementById("modal-media-choice_".concat(i));if(o&&a&&r&&s&&n&&("true"!==o.dataset.moved||"true"!==t.dataset.configured)){if("true"!==o.dataset.moved&&(document.body.appendChild(o),o.dataset.moved="true"),!t.dataset.configured)if(t.dataset.configured="true",n&&!e(t))new MutationObserver(function(){var e=n.querySelectorAll(".media-preview");e.length>1&&e.forEach(function(t,i){i').concat("Media Library",""),s.length>0){var l="";s.forEach(function(e,t){t>0&&(l+="/"),l+=e;var i=decodeURIComponent(e);if(o+='/',t===s.length-1)o+=''.concat(i,"");else{var n="".concat(r,"/").concat(l);o+='').concat(i,"")}})}a.innerHTML=o}},c=function(){return r.dataset.basePath||r.href.split("?")[0]},u=function(){var e=new URL(r.href,window.location.origin).searchParams.get("key")||"";if(!e){var t=r.href.match(/\/media\/choose(?:\/(.+))?$/);t&&t[1]&&(e=t[1])}return e}(),h=function(e){var t=document.getElementById("modal-media-choice_".concat(i));if(t){var n=t.querySelector(".modal-body");n&&(n.innerHTML=e,d(u),m())}},p=function(i){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;"true"!==t.dataset.settingValue&&(t.dataset.settingValue="true",s.value=i,t.dataset.mediaValue=i,a&&(t.dataset.mediaTemplate=a,t.classList.remove("empty"),n&&!e(t)&&(n.innerHTML=a)),s.dispatchEvent(new Event("change",{bubbles:!0})),setTimeout(function(){t.dataset.settingValue="false"},100))},m=function(){var e=document.getElementById("modal-media-choice_".concat(i));if(e){var t=e.querySelector('[data-component="directory-create"]'),n=e.querySelector('[data-component="directory-create-form"]');if(n){var a=n.querySelector(".directory-create-input"),r=n.querySelector(".directory-create-cancel-btn"),s=n.querySelector(".directory-create-parent-path");null==t||t.addEventListener("click",function(e){e.preventDefault(),n.classList.toggle("d-none"),n.classList.contains("d-none")||a.focus()}),null==r||r.addEventListener("click",function(){n.classList.add("d-none"),a.value=""}),n.addEventListener("submit",function(e){e.preventDefault(),e.stopImmediatePropagation(),a.value.trim()&&(s.value=u,fetch(n.action,{method:"POST",body:new FormData(n),headers:{"X-Requested-With":"XMLHttpRequest"}}).then(function(e){return e.text()}).then(function(e){h(e)}).catch(function(e){console.error("Error creating directory:",e)}))}),null==a||a.addEventListener("keydown",function(e){"Escape"===e.key&&(n.classList.add("d-none"),a.value="")})}}};o.dataset.handlersAttached||(a.addEventListener("click",function(e){e.preventDefault(),t.classList.add("empty"),t.dataset.mediaTemplate="",t.dataset.mediaValue="";var a=document.getElementById("template-null-label-".concat(i));return n.innerHTML="",a&&n.appendChild(a.content.cloneNode(!0)),p(""),!1}),r.addEventListener("click",function(e){e.preventDefault();var t=document.getElementById("modal-media-choice_".concat(i));if(t){var n=t.querySelector(".modal-body");return n&&(n.innerHTML=""),l(r.href).then(function(e){n&&(n.innerHTML=e),m(),bootstrap.Modal.getOrCreateInstance(t).show()}),!1}}),o.dataset.handlersAttached="true"),t._handleModalClick=function(e){var t=e.target.closest("a");if(null!==t&&"A"===t.tagName&&void 0!==t.attributes.href&&0!==t.attributes.href.length){var n=t.attributes.href.value;if(void 0===t.dataset.mediaTemplate||void 0===t.dataset.mediaUrl){if("#"!==n){if(t.closest(".folder-modal-breadcrumb")||t.closest(".gallery-grid--folders")||t.closest(".gallery-grid-item")||t.closest(".pagination")||n.match(/\/media\/choose/)){var a=new URL(n,window.location.origin).searchParams.get("key")||"";if(!a){var r=n.match(/\/media\/choose(?:\/(.+))?$/);r&&r[1]&&(a=r[1])}t.closest(".pagination")?u=a:d(u=a)}e.preventDefault(),e.stopPropagation(),l(n).then(h)}}else{e.preventDefault(),e.stopPropagation(),p(t.dataset.mediaUrl,t.dataset.mediaTemplate);var s=document.getElementById("modal-media-choice_".concat(i));null!=s&&s.classList.contains("show")&&function(){var e=document.getElementById("modal-media-choice_".concat(i));if(e){var t=bootstrap.Modal.getInstance(e)||bootstrap.Modal.getOrCreateInstance(e);t&&t.hide()}}()}}},t._handleModalSubmit=function(e){e.preventDefault(),e.stopPropagation();var t=e.target.closest("form"),i=t.action,n=new FormData(t);fetch(i,{method:"POST",body:n,headers:{"X-Requested-With":"XMLHttpRequest"}}).then(function(e){return e.text()}).then(h)},t.dataset.configured=!0}};document.addEventListener("click",function(e){var i=e.target.closest(".joli-media-choice-edit");if(i){var n=i.closest(".js-joli-media-choice-container");n&&"true"!==n.dataset.configured&&t(n)}var a=e.target.closest('[id^="modal-media-choice_"]');if(a){var r=a.id.match(/modal-media-choice_(.+)/);if(r){var s=r[1],o=document.querySelector('.js-joli-media-choice-container[data-media-id="'.concat(s,'"]'));o&&"true"===o.dataset.configured&&o._handleModalClick&&o._handleModalClick(e)}}}),document.addEventListener("submit",function(e){var t=e.target.closest('[id^="modal-media-choice_"]');if(t){var i=t.id.match(/modal-media-choice_(.+)/);if(i){var n=i[1],a=document.querySelector('.js-joli-media-choice-container[data-media-id="'.concat(n,'"]'));a&&"true"===a.dataset.configured&&a._handleModalSubmit&&a._handleModalSubmit(e)}}});var n=function(){var e=new Set;document.querySelectorAll('[id^="modal-media-choice_"]').forEach(function(t){e.has(t.id)?t.remove():e.add(t.id)}),document.querySelectorAll(".js-joli-media-choice-container").forEach(function(e){void 0===e.dataset.configured&&t(e)})};document.addEventListener("DOMContentLoaded",n),document.addEventListener("turbo:frame-load",n),document.addEventListener("turbo:stream-render",n),document.addEventListener("turbo:streams:append",n),document.addEventListener("turbo:streams:prepend",n),document.addEventListener("turbo:before-stream-render",n),document.addEventListener("ux:autocomplete:initialize",n);var a=null;new MutationObserver(function(){clearTimeout(a),a=setTimeout(n,50)}).observe(document.body,{childList:!0,subtree:!0});const r=n;class s{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=l.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 a={srcX:0,srcY:0,srcWidth:e.width,srcHeight:e.height},r=e.width/e.height;null==t&&null==i?(t=a.srcWidth,i=a.srcHeight):null==t?t=i*r:null==i&&(i=t/r);let s=(t=Math.min(t,a.srcWidth))/(i=Math.min(i,a.srcHeight));if(a.srcWidth>t||a.srcHeight>i)if("crop"===n)r>s?(a.srcHeight=e.height,a.srcWidth=a.srcHeight*s):(a.srcWidth=e.width,a.srcHeight=a.srcWidth/s);else{if("contain"!==n)throw new Error(`Unknown resizeMethod '${n}'`);r>s?i=t/r:t=i*r}return a.srcX=(e.width-a.srcWidth)/2,a.srcY=(e.height-a.srcHeight)/2,a.trgWidth=t,a.trgHeight=i,a},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=l.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=l.createElement(`${this.options.dictRemoveFile}`),e.previewElement.appendChild(e._removeLink));let i=t=>(t.preventDefault(),t.stopPropagation(),e.status===l.UPLOADING?this.options.dictCancelUploadConfirmation?l.confirm(this.options.dictCancelUploadConfirmation,()=>this.removeFile(e)):this.removeFile(e):this.options.dictRemoveFileConfirmation?l.confirm(this.options.dictRemoveFileConfirmation,()=>this.removeFile(e)):this.removeFile(e));for(let t of e.previewElement.querySelectorAll("[data-dz-remove]"))t.addEventListener("click",i)}},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 l extends s{static initClass(){this.prototype.Emitter=s,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,t){let i,n;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.");l.instances.push(this),this.element.dropzone=this;let a=null!=(n=l.optionsForElement(this.element))?n:{};if(this.options=Object.assign({},o,a,null!=t?t:{}),this.options.previewTemplate=this.options.previewTemplate.replace(/\n*/g,""),this.options.forceFallback||!l.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()),(i=this.getExistingFallback())&&i.parentNode&&i.parentNode.removeChild(i),!1!==this.options.previewsContainer&&(this.options.previewsContainer?this.previewsContainer=l.getElement(this.options.previewsContainer,"previewsContainer"):this.previewsContainer=this.element),this.options.clickable&&(!0===this.options.clickable?this.clickableElements=[this.element]:this.clickableElements=l.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(l.QUEUED)}getUploadingFiles(){return this.getFilesWithStatus(l.UPLOADING)}getAddedFiles(){return this.getFilesWithStatus(l.ADDED)}getActiveFiles(){return this.files.filter(e=>e.status===l.UPLOADING||e.status===l.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(l.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",l.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||l.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,l.instances.splice(l.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 i='
';this.options.dictFallbackText&&(i+=`

${this.options.dictFallbackText}

`),i+=`
`;let n=l.createElement(i);return"FORM"!==this.element.tagName?(t=l.createElement(`
`),t.appendChild(n)):(this.element.setAttribute("enctype","multipart/form-data"),this.element.setAttribute("method",this.options.method)),null!=t?t:n}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 a=0;a=Math.pow(this.options.filesizeBase,4-a)/10){t=e/Math.pow(this.options.filesizeBase,4-a),i=r;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},a=0;var r=()=>i.readEntries(e=>{if(e.length>0){for(let i of e)i.isFile?(++a,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}`);r()}else 0===a&&this.emit("emptyfolder",t);return null},n);return r()}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)):l.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():l.uuidv4(),progress:0,total:e.size,bytesSent:0,filename:this._renameFile(e)},this.files.push(e),e.status=l.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!==l.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=l.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===l.UPLOADING&&this.cancelUpload(e),this.files=d(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!==l.UPLOADING||e)&&this.removeFile(t);return null}resizeImage(e,t,i,n,a){return this.createThumbnail(e,t,i,n,!0,(t,i)=>{if(null==i)return a(e);{let{resizeMimeType:t}=this.options;null==t&&(t=e.type);let n=i.toDataURL(t,this.options.resizeQuality);return"image/jpeg"!==t&&"image/jpg"!==t||(n=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 a=0,r="";for(;a{e.dataURL=o.result,"image/svg+xml"!==e.type&&"image/gif"!==e.type?this.createThumbnailFromUrl(e,t,i,n,a,r,void 0,s):null!=r&&r(o.result)},o.readAsDataURL(e)}displayExistingFile(e,t,i,n,a=!0){if(this.emit("addedfile",e),this.emit("complete",e),a){let a=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,a,n)}else this.emit("thumbnail",e,t),i&&i()}createThumbnailFromUrl(e,t,i,n,a,r,s,o=!1){let l=document.createElement("img");s&&(l.crossOrigin=s),a="from-image"!=getComputedStyle(document.body).imageOrientation&&a,l.onload=()=>{let s=e=>e(1);return"undefined"!=typeof EXIF&&null!==EXIF&&a&&(s=e=>EXIF.getData(l,function(){return e(EXIF.getTag(this,"Orientation"))})),s(a=>{e.width=l.width,e.height=l.height;let s=this.options.resize.call(this,e,t,i,n),o=document.createElement("canvas"),d=o.getContext("2d");switch(o.width=s.trgWidth,o.height=s.trgHeight,a>4&&(o.width=s.trgHeight,o.height=s.trgWidth),a){case 2:d.translate(o.width,0),d.scale(-1,1);break;case 3:d.translate(o.width,o.height),d.rotate(Math.PI);break;case 4:d.translate(0,o.height),d.scale(1,-1);break;case 5:d.rotate(.5*Math.PI),d.scale(1,-1);break;case 6:d.rotate(.5*Math.PI),d.translate(0,-o.width);break;case 7:d.rotate(.5*Math.PI),d.translate(o.height,-o.width),d.scale(-1,1);break;case 8:d.rotate(-.5*Math.PI),d.translate(-o.height,0)}u(d,l,null!=s.srcX?s.srcX:0,null!=s.srcY?s.srcY:0,s.srcWidth,s.srcHeight,null!=s.trgX?s.trgX:0,null!=s.trgY?s.trgY:0,s.trgWidth,s.trgHeight);let c=o.toDataURL("image/png");if(null!=r)return r(c,o)})},null!=r&&(l.onerror=r);var d=e.dataURL;return o&&(d=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,a="";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===l.UPLOADING){let t=this._getFilesWithXhr(e.xhr);for(let e of t)e.status=l.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!==l.ADDED&&e.status!==l.QUEUED||(e.status=l.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 i=e[0],n=t[0];i.upload.chunks=[];let a=()=>{let t=0;for(;void 0!==i.upload.chunks[t];)t++;if(t>=i.upload.totalChunkCount)return;let a=t*this.options.chunkSize,r=Math.min(a+this.options.chunkSize,n.size),s={name:this._getParamName(0),data:n.webkitSlice?n.webkitSlice(a,r):n.slice(a,r),filename:i.upload.filename,chunkIndex:t};i.upload.chunks[t]={file:i,index:t,dataBlock:s,status:l.UPLOADING,progress:0,retries:0},this._uploadData(e,[s])};if(i.upload.finishedChunkUpload=(t,n)=>{let r=!0;t.status=l.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,n,null)})},this.options.parallelChunkUploads){const e=Math.min(!0===this.options.parallelChunkUploads?this.options.parallelUploads:this.options.parallelChunkUploads,i.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 r=this.options.defaultHeaders?{Accept:"application/json","Cache-Control":"no-cache","X-Requested-With":"XMLHttpRequest"}:{};this.options.binaryBody&&(r["Content-Type"]=e[0].type),this.options.headers&&Object.assign(r,this.options.headers);for(let e in r){let t=r[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[a]=r,++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],a=this._getChunk(n,t);i?(a.progress=100*i.loaded/i.total,a.total=i.total,a.bytesSent=i.loaded):(a.progress=100,a.bytesSent=a.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))}}l.initClass(),l.options={},l.optionsForElement=function(e){return e.getAttribute("id")&&void 0!==l.options?l.options[c(e.getAttribute("id"))]:void 0},l.instances=[],l.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},l.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 i of e)!1!==l.optionsForElement(i)?t.push(new l(i)):t.push(void 0);return t})()},l.isBrowserSupported=function(){return"undefined"!=typeof Promise},l.dataURItoBlob=function(e){let t=atob(e.split(",")[1]),i=e.split(",")[0].split(":")[1].split(";")[0],n=new ArrayBuffer(t.length),a=new Uint8Array(n);for(let e=0,i=t.length,n=0<=i;n?e<=i:e>=i;n?e++:e--)a[e]=t.charCodeAt(e);return new Blob([n],{type:i})};const d=(e,t)=>e.filter(e=>e!==t).map(e=>e),c=e=>e.replace(/[\-_](\w)/g,e=>e.charAt(1).toUpperCase());l.createElement=function(e){let t=document.createElement("div");return t.innerHTML=e,t.childNodes[0]},l.elementInside=function(e,t){if(e===t)return!0;for(;e=e.parentNode;)if(e===t)return!0;return!1},l.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},l.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},l.confirm=function(e,t,i){return window.confirm(e)?t():null!=i?i():void 0},l.isValidFile=function(e,t){if(!t)return!0;t=t.split(",");let i=e.type,n=i.replace(/\/.*$/,"");for(let a of t)if(a=a.trim(),"."===a.charAt(0)){if(-1!==e.name.toLowerCase().indexOf(a.toLowerCase(),e.name.length-a.length))return!0}else if(/\/\*$/.test(a)){if(n===a.replace(/\/.*$/,""))return!0}else if(i===a)return!0;return!1},"undefined"!=typeof jQuery&&null!==jQuery&&(jQuery.fn.dropzone=function(e){return this.each(function(){return new l(this,e)})}),l.ADDED="added",l.QUEUED="queued",l.ACCEPTED=l.QUEUED,l.UPLOADING="uploading",l.PROCESSING=l.UPLOADING,l.CANCELED="canceled",l.ERROR="error",l.SUCCESS="success";var u=function(e,t,i,n,a,r,s,o,l,d){let c=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:a}=n.getImageData(1,0,1,t),r=0,s=t,o=t;for(;o>r;)0===a[4*(o-1)+3]?s=o:r=o,o=s+r>>1;let l=o/t;return 0===l?1:l}(t);return e.drawImage(t,i,n,a,r,s,o,l,d/c)};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){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 m(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):{},i=e.querySelector(".dz-preview-template"),n={addRemoveLinks:!1,maxFilesize:20,paramName:"upload[file]",previewTemplate:i?i.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 a=n.files[0],r=e.previewElement.querySelector("[data-dz-link]");r.href=a.link,r.setAttribute("data-media-folder",a.mediaFolder),r.setAttribute("data-media-url",a.mediaUrl),r.setAttribute("data-media-template",a.mediaTemplate),a.mediaPreview&&(e.previewElement.querySelector("[data-dz-thumbnail]").remove(),r.innerHTML=a.mediaPreview),document.dispatchEvent(new CustomEvent("media-uploaded",{detail:{folder:a.mediaFolder}}))}}})}};return new l(e,m(m({},n),t))}return null};const g=function(){document.querySelectorAll("[data-clipboard-target]").forEach(function(e){e.addEventListener("click",function(e){e.preventDefault();var t=e.currentTarget,i=t.querySelector(".btn-label"),n=i.textContent;navigator.clipboard.writeText(document.querySelector(t.dataset.clipboardTarget).innerText).then(function(){t.classList.add("is-copied"),t.dataset.clipboardCopied&&(i.textContent=t.dataset.clipboardCopied),setTimeout(function(){t.classList.remove("is-copied"),i.textContent=n},1e3)})})})};const y=function(){var e=document.querySelector('[data-component="directory-create-form"]'),t=null==e?void 0:e.querySelector(".directory-create-input"),i=null==e?void 0:e.querySelector(".directory-create-cancel-btn");e&&(e.classList.add("d-none"),document.addEventListener("click",function(i){i.target.closest('[data-component="directory-create"]')&&(i.preventDefault(),e.classList.toggle("d-none"),e.classList.contains("d-none")||t.focus())}),e.addEventListener("submit",function(e){t.value.trim()||e.preventDefault()}),null==i||i.addEventListener("click",function(){e.classList.add("d-none"),t.value=""}),null==t||t.addEventListener("keydown",function(i){"Escape"===i.key&&(e.classList.add("d-none"),t.value="")}))};const b=function(){var e=document.querySelector('[data-component*="directory-list"]'),t=document.querySelector('[data-component="directory-rename-form"]'),i=null==t?void 0:t.querySelector(".directory-rename-input"),n=null==t?void 0:t.querySelector(".directory-rename-cancel-btn");document.addEventListener("click",function(e){e.target.closest(".directory-rename-header-btn")&&(e.preventDefault(),null==t||t.classList.toggle("d-none"),null!=t&&t.classList.contains("d-none")||(i.focus(),i.select()))}),null==t||t.addEventListener("submit",function(e){var n,a=i.value.trim();if(a){var r=(null===(n=t.querySelector('input[name="oldPath"]'))||void 0===n?void 0:n.value)||"",s=(r.includes("/")?r.substring(0,r.lastIndexOf("/")+1):"")+a,o=t.querySelector('input[name="newPath"]');o||((o=document.createElement("input")).type="hidden",o.name="newPath",t.appendChild(o)),o.value=s}else e.preventDefault()}),null==n||n.addEventListener("click",function(){t.classList.add("d-none"),i.value=""}),null==i||i.addEventListener("keydown",function(e){"Escape"===e.key&&(t.classList.add("d-none"),i.value="")}),e&&(e.addEventListener("click",function(e){var t=e.target.closest(".directory-rename-btn");if(t){var i=t.closest("tr").querySelector(".directory-name").closest("td"),n=i.querySelector(".directory-name"),a=i.querySelector(".directory-rename-form");n.classList.add("d-none"),a.classList.remove("d-none");var r=a.querySelector(".directory-rename-input");r.dataset.original=r.value,r.focus(),r.select()}}),e.addEventListener("click",function(e){var t=e.target.closest(".directory-rename-cancel-btn");if(t){var i=t.closest(".directory-rename-form"),n=i.parentElement.querySelector(".directory-name"),a=i.querySelector(".directory-rename-input");a.value=a.dataset.original,i.classList.add("d-none"),n.classList.remove("d-none")}}),e.addEventListener("submit",function(e){if(e.target.classList.contains("directory-rename-form")){e.preventDefault();var t=e.target,i=t.closest("td"),n=i.closest("tr"),a=i.querySelector(".directory-name"),r=t.querySelector(".directory-rename-input"),s=r.value.trim(),o=r.dataset.original;if(!s||s===o)return t.classList.add("d-none"),void a.classList.remove("d-none");var l=n.dataset.directory,d=(l.includes("/")?l.substring(0,l.lastIndexOf("/")+1):"")+s,c=t.querySelector('input[name="oldPath"]');c&&(c.value=l);var u=t.querySelector('input[name="newPath"]');u&&(u.value=d),t.submit()}}),e.addEventListener("keydown",function(e){if(e.target.classList.contains("directory-rename-input")&&"Escape"===e.key){var t=e.target.closest(".directory-rename-form"),i=t.parentElement.querySelector(".directory-name");e.target.value=e.target.dataset.original,t.classList.add("d-none"),i.classList.remove("d-none")}}))};const E=function(){var e=document.querySelector('[data-component*="media-list"]'),t=document.querySelector('[data-component*="media-rename"]');if(e||t){var i=function(e,t){var i,n;if(t)i=e.querySelector(".media-rename-form"),n=e.querySelector(".media-name");else{var a=e.querySelector(".media-rename-cancel-btn");if(!a)return;n=(i=a.closest(".media-rename-form")).parentElement.querySelector(".media-name")}var r=i.querySelector(".media-rename-input");r.value=r.dataset.original,i.classList.add("d-none"),n.classList.remove("d-none")},n=function(e,t,i){if(e.target.classList.contains("media-rename-form")){e.preventDefault();var n=e.target,a=n.querySelector(".media-rename-input"),r=a.value.trim(),s=a.dataset.original;if(!r||r===s)return n.classList.add("d-none"),void(i?t.querySelector(".media-name").classList.remove("d-none"):n.parentElement.querySelector(".media-name").classList.remove("d-none"));var o=n.querySelector('input[name="oldPath"]').value,l=(o.includes("/")?o.substring(0,o.lastIndexOf("/")+1):"")+r,d=n.querySelector('input[name="newPath"]');d&&(d.value=l),n.submit()}},a=function(e,t,i){if(e.target.classList.contains("media-rename-input")&&"Escape"===e.key){var n=e.target.closest(".media-rename-form"),a=i?t.querySelector(".media-name"):n.parentElement.querySelector(".media-name");e.target.value=e.target.dataset.original,n.classList.add("d-none"),a.classList.remove("d-none")}};e&&(e.querySelectorAll("tr.item").forEach(function(e){var t=e.querySelector(".media-name");if(t){var i,n=t.textContent.trim(),a=(null===(i=document.querySelector('meta[name="current-key"]'))||void 0===i?void 0:i.content)||"",r=a?"".concat(a,"/").concat(n):n;e.dataset.media=r}}),e.addEventListener("click",function(t){var n=t.target.closest(".media-rename-btn");if(n){var a=n.closest("tr").querySelector(".media-name").closest("td"),r=a.querySelector(".media-name"),s=a.querySelector(".media-rename-form");r.classList.add("d-none"),s.classList.remove("d-none");var o=s.querySelector(".media-rename-input");o.dataset.original=o.value,o.focus(),o.select()}t.target.closest(".media-rename-cancel-btn")&&i(e,!1)}),e.addEventListener("submit",function(t){return n(t,e,!1)}),e.addEventListener("keydown",function(t){return a(t,e,!1)})),t&&(t.addEventListener("click",function(e){e.target.closest(".media-rename-btn")&&function(e,t){var i=e.querySelector(".media-rename-btn");if(i){var n,a;if(t)n=e.querySelector(".media-name"),a=e.querySelector(".media-rename-form");else{var r=i.closest("tr").querySelector(".media-name").closest("td");n=r.querySelector(".media-name"),a=r.querySelector(".media-rename-form")}n.classList.add("d-none"),a.classList.remove("d-none");var s=a.querySelector(".media-rename-input");s.dataset.original=s.value,s.focus(),s.select()}}(t,!0),e.target.closest(".media-rename-cancel-btn")&&i(t,!0)}),t.addEventListener("submit",function(e){return n(e,t,!0)}),t.addEventListener("keydown",function(e){return a(e,t,!0)})),document.addEventListener("click",function(e){var t=e.target.closest(".media-rename-btn");if(t&&!t.closest('[data-component*="media-list"]')){var i=t.closest(".row");if(i){var n=i.querySelector('[data-component*="media-rename"]'),a=null==n?void 0:n.querySelector(".media-name"),r=null==n?void 0:n.querySelector(".media-rename-form");if(a&&r){a.classList.add("d-none"),r.classList.remove("d-none");var s=r.querySelector(".media-rename-input");s.dataset.original=s.value,s.focus(),s.select()}}}})}};var L="joli-media-tabs-active";const w=function(){var e=document.querySelector('[data-bs-toggle="tabs"]');if(e){e.addEventListener("shown.bs.tab",function(e){var t=e.target.getAttribute("href");t&&localStorage.setItem(L,t.replace("#",""))}),function(){var t=localStorage.getItem(L);if(t){var i=e.querySelector('[href="#'.concat(t,'"]'));if(i)new bootstrap.Tab(i).show()}}()}};var k=function(e){var t,i=document.getElementById("modal-folder-choice");if(i){0;var n,a,r,s,o=i.querySelector(".modal-body"),l=null==o?void 0:o.querySelector(".folder-list-container"),d=(null===(t=e.closest("[data-media-key]"))||void 0===t?void 0:t.dataset.mediaKey)||"",c=function(e){return fetch(e,{headers:{"X-Requested-With":"XMLHttpRequest"}}).then(function(e){return e.text()})},u=e.dataset.folder||"",h=function(t){var n=i.querySelector(".folder-modal-breadcrumb");if(n){var a=e.getAttribute("href")||"",r=t?t.split("/").filter(function(e){return e}):[],s="";if(s+='').concat("Media Library",""),r.length>0){var o="";r.forEach(function(e,t){t>0&&(o+="/"),o+=e;var i=decodeURIComponent(e);if(s+='/',t===r.length-1)s+=''.concat(i,"");else{var n=a.replace(/\/$/,"")+"/"+encodeURIComponent(o);s+='').concat(i,"")}})}n.innerHTML=s}},p=function(e){l&&(l.innerHTML=e,h(u),m())},m=function(){var e=i.querySelector(".folder-modal-breadcrumb");null==e||e.addEventListener("click",function(e){var t=e.target.closest("a[data-folder-path]");if(t){e.preventDefault(),e.stopPropagation();var i=t.getAttribute("href");if(i&&!i.endsWith("#")){var n=new URL(i,window.location.origin).searchParams.get("key")||"";h(u=n),c(i).then(p)}}});var t=null==l?void 0:l.querySelector(".folder-parent a");null==t||t.addEventListener("click",function(e){e.preventDefault(),e.stopPropagation();var i=t.dataset.folderPath||"",n=t.getAttribute("href");n&&!n.endsWith("#")&&(h(u=i),c(n).then(p))});var n=null==l?void 0:l.querySelectorAll("a[data-folder-path]");null==n||n.forEach(function(e){e.addEventListener("click",function(t){t.preventDefault(),t.stopPropagation();var i=e.dataset.folderPath||"",n=e.getAttribute("href");n&&!n.endsWith("#")&&(h(u=i),c(n).then(p))})});var a=i.querySelector(".folder-move-btn");a&&(a.dataset.folderPath=u,a.addEventListener("click",function(e){e.preventDefault(),e.stopPropagation(),function(e){var t=document.querySelector("#move-form");if(t){var i=t.querySelector('input[name="from"]'),n=t.querySelector('input[name="to"]');i&&(i.value=d),n&&(n.value=e||""),t.submit()}}(u)}))};n=i.querySelector('[data-component="folder-create"]'),a=i.querySelector(".folder-create-form"),r=i.querySelector(".folder-create-input"),s=i.querySelector(".folder-create-cancel"),null==n||n.addEventListener("click",function(e){e.preventDefault(),a.classList.toggle("d-none"),a.classList.contains("d-none")||r.focus()}),null==s||s.addEventListener("click",function(){a.classList.add("d-none"),r.value=""}),null==a||a.addEventListener("submit",function(e){if(e.preventDefault(),r.value.trim()){var t=a.querySelector('input[name="parentPath"]');t&&(t.value=u);var i=new FormData(a);i.append("_mode","folder_choice"),fetch(a.action,{method:"POST",body:i,headers:{"X-Requested-With":"XMLHttpRequest"}}).then(function(e){return e.text()}).then(function(e){l&&(l.innerHTML=e,h(u),m()),a.classList.add("d-none"),r.value=""}).catch(function(e){console.error("Error:",e)})}}),null==r||r.addEventListener("keydown",function(e){"Escape"===e.key&&(a.classList.add("d-none"),r.value="")});var f=e.getAttribute("href")||"",v=f;u&&(v=f.replace(/\/$/,"")+"/"+encodeURIComponent(u)),h(u),c(v).then(p),new bootstrap.Modal(i).show()}};const S=function(){document.querySelectorAll("[data-component=media-move]").forEach(function(e){e.addEventListener("click",function(t){t.preventDefault(),k(e)})})};document.addEventListener("DOMContentLoaded",function(){r(),w(),g(),y(),b(),E(),S();var e=null;document.addEventListener("click",function(t){var i=t.target.closest('[data-component="media-add"]');if(i){var n;t.preventDefault(),t.stopPropagation();var a=null===(n=i.closest(".joli-media-choose-container, .joli-media-header-tools"))||void 0===n?void 0:n.querySelector(".dropzone-container");if(!a)return;a.classList.toggle("dropzone-active");var r,s=a.querySelector('[data-component="dropzone"]');if(!s)return;if(a.classList.contains("dropzone-initialized")||(e=v(s),a.classList.add("dropzone-initialized")),!a.classList.contains("dropzone-active"))null===(r=e)||void 0===r||r.removeAllFiles(!0)}})})})()})(); \ No newline at end of file diff --git a/src/Bridge/Sylius/public/joli-media-sylius-admin.dc8dd6d7.js b/src/Bridge/Sylius/public/joli-media-sylius-admin.dc8dd6d7.js new file mode 100644 index 00000000..9bbae676 --- /dev/null +++ b/src/Bridge/Sylius/public/joli-media-sylius-admin.dc8dd6d7.js @@ -0,0 +1 @@ +(()=>{var e={264(){document.addEventListener("show.bs.modal",function(e){e.target.parentElement!==document.body&&document.body.appendChild(e.target)})}},t={};function i(n){var a=t[n];if(void 0!==a)return a.exports;var r=t[n]={exports:{}};return e[n](r,r.exports,i),r.exports}(()=>{"use strict";i(264);var e=function(e){for(var t=e;t&&t!==document.body;){if(t.dataset.controller&&t.dataset.controller.includes("live-collection"))return!0;t=t.parentElement}return!1},t=function(t){var i=t.dataset.mediaId,n=t.querySelector('[id^="joli-media-container_"]'),a=t.querySelector(".joli-media-choice-delete"),r=t.querySelector(".joli-media-choice-edit"),o=t.querySelector('[id="'.concat(i,'"]')),s=document.getElementById("modal-media-choice_".concat(i));if(s&&a&&r&&o&&n&&("true"!==s.dataset.moved||"true"!==t.dataset.configured)){if("true"!==s.dataset.moved&&(document.body.appendChild(s),s.dataset.moved="true"),!t.dataset.configured)if(t.dataset.configured="true",n&&!e(t))new MutationObserver(function(){var e=n.querySelectorAll(".media-preview");e.length>1&&e.forEach(function(t,i){i').concat("Media Library",""),o.length>0){var l="";o.forEach(function(e,t){t>0&&(l+="/"),l+=e;var i=decodeURIComponent(e);if(s+='/',t===o.length-1)s+=''.concat(i,"");else{var n="".concat(r,"/").concat(l);s+='').concat(i,"")}})}a.innerHTML=s}},c=function(){return r.dataset.basePath||r.href.split("?")[0]},u=function(){var e=new URL(r.href,window.location.origin).searchParams.get("key")||"";if(!e){var t=r.href.match(/\/media\/choose(?:\/(.+))?$/);t&&t[1]&&(e=t[1])}return e}(),h="",p=function(e){if(!h)return e;var t=e.includes("?")?"&":"?";return"".concat(e).concat(t,"search=").concat(encodeURIComponent(h))},m=function(){var e=document.getElementById("modal-media-choice_".concat(i));if(e){var t=e.querySelector(".joli-media-search-form"),n=e.querySelector(".joli-media-search-input");if(t&&n){h=n.value;var a=t.cloneNode(!0);t.parentNode.replaceChild(a,t);var r=a.querySelector(".joli-media-search-input");a.addEventListener("submit",function(e){e.preventDefault(),e.stopPropagation(),h=r.value.trim();var t=c(),i=u?"".concat(t,"/").concat(u):t;l(p(i)).then(f)}),r.addEventListener("search",function(){if(!r.value){h="";var e=c(),t=u?"".concat(e,"/").concat(u):e;l(t).then(f)}})}}},f=function(e){var t=document.getElementById("modal-media-choice_".concat(i));if(t){var n=t.querySelector(".modal-body");n&&(n.innerHTML=e,d(u),g(),m())}},v=function(i){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;"true"!==t.dataset.settingValue&&(t.dataset.settingValue="true",o.value=i,t.dataset.mediaValue=i,a&&(t.dataset.mediaTemplate=a,t.classList.remove("empty"),n&&!e(t)&&(n.innerHTML=a)),o.dispatchEvent(new Event("change",{bubbles:!0})),setTimeout(function(){t.dataset.settingValue="false"},100))},g=function(){var e=document.getElementById("modal-media-choice_".concat(i));if(e){var t=e.querySelector('[data-component="directory-create"]'),n=e.querySelector('[data-component="directory-create-form"]');if(n){var a=n.querySelector(".directory-create-input"),r=n.querySelector(".directory-create-cancel-btn"),o=n.querySelector(".directory-create-parent-path");null==t||t.addEventListener("click",function(e){e.preventDefault(),n.classList.toggle("d-none"),n.classList.contains("d-none")||a.focus()}),null==r||r.addEventListener("click",function(){n.classList.add("d-none"),a.value=""}),n.addEventListener("submit",function(e){if(e.preventDefault(),e.stopImmediatePropagation(),a.value.trim()){o.value=u;var t=n.querySelector(".directory-create-search");t&&(t.value=h),fetch(n.action,{method:"POST",body:new FormData(n),headers:{"X-Requested-With":"XMLHttpRequest"}}).then(function(e){return e.text()}).then(function(e){f(e)}).catch(function(e){console.error("Error creating directory:",e)})}}),null==a||a.addEventListener("keydown",function(e){"Escape"===e.key&&(n.classList.add("d-none"),a.value="")})}}};s.dataset.handlersAttached||(a.addEventListener("click",function(e){e.preventDefault(),t.classList.add("empty"),t.dataset.mediaTemplate="",t.dataset.mediaValue="";var a=document.getElementById("template-null-label-".concat(i));return n.innerHTML="",a&&n.appendChild(a.content.cloneNode(!0)),v(""),!1}),r.addEventListener("click",function(e){e.preventDefault();var t=document.getElementById("modal-media-choice_".concat(i));if(t){var n=t.querySelector(".modal-body");return n&&(n.innerHTML=""),l(r.href).then(function(e){n&&(n.innerHTML=e),g(),m(),bootstrap.Modal.getOrCreateInstance(t).show()}),!1}}),s.dataset.handlersAttached="true"),t._handleModalClick=function(e){var t=e.target.closest("a");if(null!==t&&"A"===t.tagName&&void 0!==t.attributes.href&&0!==t.attributes.href.length){var n=t.attributes.href.value;if(void 0===t.dataset.mediaTemplate||void 0===t.dataset.mediaUrl){if("#"!==n){if(t.closest(".folder-modal-breadcrumb")||t.closest(".gallery-grid--folders")||t.closest(".gallery-grid-item")||t.closest(".pagination")||n.match(/\/media\/choose/)){var a=new URL(n,window.location.origin).searchParams.get("key")||"";if(!a){var r=n.match(/\/media\/choose(?:\/(.+))?$/);r&&r[1]&&(a=r[1])}t.closest(".pagination")?u=a:(d(u=a),n=p(n))}e.preventDefault(),e.stopPropagation(),l(n).then(f)}}else{e.preventDefault(),e.stopPropagation(),v(t.dataset.mediaUrl,t.dataset.mediaTemplate);var o=document.getElementById("modal-media-choice_".concat(i));null!=o&&o.classList.contains("show")&&function(){var e=document.getElementById("modal-media-choice_".concat(i));if(e){var t=bootstrap.Modal.getInstance(e)||bootstrap.Modal.getOrCreateInstance(e);t&&t.hide()}}()}}},t._handleModalSubmit=function(e){e.preventDefault(),e.stopPropagation();var t=e.target.closest("form"),i=t.action,n=new FormData(t);fetch(i,{method:"POST",body:n,headers:{"X-Requested-With":"XMLHttpRequest"}}).then(function(e){return e.text()}).then(f)},t.dataset.configured=!0}};document.addEventListener("click",function(e){var i=e.target.closest(".joli-media-choice-edit");if(i){var n=i.closest(".js-joli-media-choice-container");n&&"true"!==n.dataset.configured&&t(n)}var a=e.target.closest('[id^="modal-media-choice_"]');if(a){var r=a.id.match(/modal-media-choice_(.+)/);if(r){var o=r[1],s=document.querySelector('.js-joli-media-choice-container[data-media-id="'.concat(o,'"]'));s&&"true"===s.dataset.configured&&s._handleModalClick&&s._handleModalClick(e)}}}),document.addEventListener("submit",function(e){var t=e.target.closest('[id^="modal-media-choice_"]');if(t){var i=t.id.match(/modal-media-choice_(.+)/);if(i){var n=i[1],a=document.querySelector('.js-joli-media-choice-container[data-media-id="'.concat(n,'"]'));a&&"true"===a.dataset.configured&&a._handleModalSubmit&&a._handleModalSubmit(e)}}});var n=function(){var e=new Set;document.querySelectorAll('[id^="modal-media-choice_"]').forEach(function(t){e.has(t.id)?t.remove():e.add(t.id)}),document.querySelectorAll(".js-joli-media-choice-container").forEach(function(e){void 0===e.dataset.configured&&t(e)})};document.addEventListener("DOMContentLoaded",n),document.addEventListener("turbo:frame-load",n),document.addEventListener("turbo:stream-render",n),document.addEventListener("turbo:streams:append",n),document.addEventListener("turbo:streams:prepend",n),document.addEventListener("turbo:before-stream-render",n),document.addEventListener("ux:autocomplete:initialize",n);var a=null;new MutationObserver(function(){clearTimeout(a),a=setTimeout(n,50)}).observe(document.body,{childList:!0,subtree:!0});const r=n;class o{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=l.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 a={srcX:0,srcY:0,srcWidth:e.width,srcHeight:e.height},r=e.width/e.height;null==t&&null==i?(t=a.srcWidth,i=a.srcHeight):null==t?t=i*r:null==i&&(i=t/r);let o=(t=Math.min(t,a.srcWidth))/(i=Math.min(i,a.srcHeight));if(a.srcWidth>t||a.srcHeight>i)if("crop"===n)r>o?(a.srcHeight=e.height,a.srcWidth=a.srcHeight*o):(a.srcWidth=e.width,a.srcHeight=a.srcWidth/o);else{if("contain"!==n)throw new Error(`Unknown resizeMethod '${n}'`);r>o?i=t/r:t=i*r}return a.srcX=(e.width-a.srcWidth)/2,a.srcY=(e.height-a.srcHeight)/2,a.trgWidth=t,a.trgHeight=i,a},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=l.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=l.createElement(`${this.options.dictRemoveFile}`),e.previewElement.appendChild(e._removeLink));let i=t=>(t.preventDefault(),t.stopPropagation(),e.status===l.UPLOADING?this.options.dictCancelUploadConfirmation?l.confirm(this.options.dictCancelUploadConfirmation,()=>this.removeFile(e)):this.removeFile(e):this.options.dictRemoveFileConfirmation?l.confirm(this.options.dictRemoveFileConfirmation,()=>this.removeFile(e)):this.removeFile(e));for(let t of e.previewElement.querySelectorAll("[data-dz-remove]"))t.addEventListener("click",i)}},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 l extends o{static initClass(){this.prototype.Emitter=o,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,t){let i,n;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.");l.instances.push(this),this.element.dropzone=this;let a=null!=(n=l.optionsForElement(this.element))?n:{};if(this.options=Object.assign({},s,a,null!=t?t:{}),this.options.previewTemplate=this.options.previewTemplate.replace(/\n*/g,""),this.options.forceFallback||!l.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()),(i=this.getExistingFallback())&&i.parentNode&&i.parentNode.removeChild(i),!1!==this.options.previewsContainer&&(this.options.previewsContainer?this.previewsContainer=l.getElement(this.options.previewsContainer,"previewsContainer"):this.previewsContainer=this.element),this.options.clickable&&(!0===this.options.clickable?this.clickableElements=[this.element]:this.clickableElements=l.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(l.QUEUED)}getUploadingFiles(){return this.getFilesWithStatus(l.UPLOADING)}getAddedFiles(){return this.getFilesWithStatus(l.ADDED)}getActiveFiles(){return this.files.filter(e=>e.status===l.UPLOADING||e.status===l.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(l.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",l.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||l.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,l.instances.splice(l.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 i='
';this.options.dictFallbackText&&(i+=`

${this.options.dictFallbackText}

`),i+=`
`;let n=l.createElement(i);return"FORM"!==this.element.tagName?(t=l.createElement(`
`),t.appendChild(n)):(this.element.setAttribute("enctype","multipart/form-data"),this.element.setAttribute("method",this.options.method)),null!=t?t:n}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 a=0;a=Math.pow(this.options.filesizeBase,4-a)/10){t=e/Math.pow(this.options.filesizeBase,4-a),i=r;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},a=0;var r=()=>i.readEntries(e=>{if(e.length>0){for(let i of e)i.isFile?(++a,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}`);r()}else 0===a&&this.emit("emptyfolder",t);return null},n);return r()}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)):l.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():l.uuidv4(),progress:0,total:e.size,bytesSent:0,filename:this._renameFile(e)},this.files.push(e),e.status=l.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!==l.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=l.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===l.UPLOADING&&this.cancelUpload(e),this.files=d(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!==l.UPLOADING||e)&&this.removeFile(t);return null}resizeImage(e,t,i,n,a){return this.createThumbnail(e,t,i,n,!0,(t,i)=>{if(null==i)return a(e);{let{resizeMimeType:t}=this.options;null==t&&(t=e.type);let n=i.toDataURL(t,this.options.resizeQuality);return"image/jpeg"!==t&&"image/jpg"!==t||(n=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 a=0,r="";for(;a{e.dataURL=s.result,"image/svg+xml"!==e.type&&"image/gif"!==e.type?this.createThumbnailFromUrl(e,t,i,n,a,r,void 0,o):null!=r&&r(s.result)},s.readAsDataURL(e)}displayExistingFile(e,t,i,n,a=!0){if(this.emit("addedfile",e),this.emit("complete",e),a){let a=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,a,n)}else this.emit("thumbnail",e,t),i&&i()}createThumbnailFromUrl(e,t,i,n,a,r,o,s=!1){let l=document.createElement("img");o&&(l.crossOrigin=o),a="from-image"!=getComputedStyle(document.body).imageOrientation&&a,l.onload=()=>{let o=e=>e(1);return"undefined"!=typeof EXIF&&null!==EXIF&&a&&(o=e=>EXIF.getData(l,function(){return e(EXIF.getTag(this,"Orientation"))})),o(a=>{e.width=l.width,e.height=l.height;let o=this.options.resize.call(this,e,t,i,n),s=document.createElement("canvas"),d=s.getContext("2d");switch(s.width=o.trgWidth,s.height=o.trgHeight,a>4&&(s.width=o.trgHeight,s.height=o.trgWidth),a){case 2:d.translate(s.width,0),d.scale(-1,1);break;case 3:d.translate(s.width,s.height),d.rotate(Math.PI);break;case 4:d.translate(0,s.height),d.scale(1,-1);break;case 5:d.rotate(.5*Math.PI),d.scale(1,-1);break;case 6:d.rotate(.5*Math.PI),d.translate(0,-s.width);break;case 7:d.rotate(.5*Math.PI),d.translate(s.height,-s.width),d.scale(-1,1);break;case 8:d.rotate(-.5*Math.PI),d.translate(-s.height,0)}u(d,l,null!=o.srcX?o.srcX:0,null!=o.srcY?o.srcY:0,o.srcWidth,o.srcHeight,null!=o.trgX?o.trgX:0,null!=o.trgY?o.trgY:0,o.trgWidth,o.trgHeight);let c=s.toDataURL("image/png");if(null!=r)return r(c,s)})},null!=r&&(l.onerror=r);var d=e.dataURL;return s&&(d=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,a="";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===l.UPLOADING){let t=this._getFilesWithXhr(e.xhr);for(let e of t)e.status=l.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!==l.ADDED&&e.status!==l.QUEUED||(e.status=l.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 i=e[0],n=t[0];i.upload.chunks=[];let a=()=>{let t=0;for(;void 0!==i.upload.chunks[t];)t++;if(t>=i.upload.totalChunkCount)return;let a=t*this.options.chunkSize,r=Math.min(a+this.options.chunkSize,n.size),o={name:this._getParamName(0),data:n.webkitSlice?n.webkitSlice(a,r):n.slice(a,r),filename:i.upload.filename,chunkIndex:t};i.upload.chunks[t]={file:i,index:t,dataBlock:o,status:l.UPLOADING,progress:0,retries:0},this._uploadData(e,[o])};if(i.upload.finishedChunkUpload=(t,n)=>{let r=!0;t.status=l.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,n,null)})},this.options.parallelChunkUploads){const e=Math.min(!0===this.options.parallelChunkUploads?this.options.parallelUploads:this.options.parallelChunkUploads,i.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 r=this.options.defaultHeaders?{Accept:"application/json","Cache-Control":"no-cache","X-Requested-With":"XMLHttpRequest"}:{};this.options.binaryBody&&(r["Content-Type"]=e[0].type),this.options.headers&&Object.assign(r,this.options.headers);for(let e in r){let t=r[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[a]=r,++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],a=this._getChunk(n,t);i?(a.progress=100*i.loaded/i.total,a.total=i.total,a.bytesSent=i.loaded):(a.progress=100,a.bytesSent=a.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))}}l.initClass(),l.options={},l.optionsForElement=function(e){return e.getAttribute("id")&&void 0!==l.options?l.options[c(e.getAttribute("id"))]:void 0},l.instances=[],l.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},l.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 i of e)!1!==l.optionsForElement(i)?t.push(new l(i)):t.push(void 0);return t})()},l.isBrowserSupported=function(){return"undefined"!=typeof Promise},l.dataURItoBlob=function(e){let t=atob(e.split(",")[1]),i=e.split(",")[0].split(":")[1].split(";")[0],n=new ArrayBuffer(t.length),a=new Uint8Array(n);for(let e=0,i=t.length,n=0<=i;n?e<=i:e>=i;n?e++:e--)a[e]=t.charCodeAt(e);return new Blob([n],{type:i})};const d=(e,t)=>e.filter(e=>e!==t).map(e=>e),c=e=>e.replace(/[\-_](\w)/g,e=>e.charAt(1).toUpperCase());l.createElement=function(e){let t=document.createElement("div");return t.innerHTML=e,t.childNodes[0]},l.elementInside=function(e,t){if(e===t)return!0;for(;e=e.parentNode;)if(e===t)return!0;return!1},l.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},l.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},l.confirm=function(e,t,i){return window.confirm(e)?t():null!=i?i():void 0},l.isValidFile=function(e,t){if(!t)return!0;t=t.split(",");let i=e.type,n=i.replace(/\/.*$/,"");for(let a of t)if(a=a.trim(),"."===a.charAt(0)){if(-1!==e.name.toLowerCase().indexOf(a.toLowerCase(),e.name.length-a.length))return!0}else if(/\/\*$/.test(a)){if(n===a.replace(/\/.*$/,""))return!0}else if(i===a)return!0;return!1},"undefined"!=typeof jQuery&&null!==jQuery&&(jQuery.fn.dropzone=function(e){return this.each(function(){return new l(this,e)})}),l.ADDED="added",l.QUEUED="queued",l.ACCEPTED=l.QUEUED,l.UPLOADING="uploading",l.PROCESSING=l.UPLOADING,l.CANCELED="canceled",l.ERROR="error",l.SUCCESS="success";var u=function(e,t,i,n,a,r,o,s,l,d){let c=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:a}=n.getImageData(1,0,1,t),r=0,o=t,s=t;for(;s>r;)0===a[4*(s-1)+3]?o=s:r=s,s=o+r>>1;let l=s/t;return 0===l?1:l}(t);return e.drawImage(t,i,n,a,r,o,s,l,d/c)};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){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 m(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):{},i=e.querySelector(".dz-preview-template"),n={addRemoveLinks:!1,maxFilesize:20,paramName:"upload[file]",previewTemplate:i?i.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 a=n.files[0],r=e.previewElement.querySelector("[data-dz-link]");r.href=a.link,r.setAttribute("data-media-folder",a.mediaFolder),r.setAttribute("data-media-url",a.mediaUrl),r.setAttribute("data-media-template",a.mediaTemplate),a.mediaPreview&&(e.previewElement.querySelector("[data-dz-thumbnail]").remove(),r.innerHTML=a.mediaPreview),document.dispatchEvent(new CustomEvent("media-uploaded",{detail:{folder:a.mediaFolder}}))}}})}};return new l(e,m(m({},n),t))}return null};const g=function(){document.querySelectorAll("[data-clipboard-target]").forEach(function(e){e.addEventListener("click",function(e){e.preventDefault();var t=e.currentTarget,i=t.querySelector(".btn-label"),n=i.textContent;navigator.clipboard.writeText(document.querySelector(t.dataset.clipboardTarget).innerText).then(function(){t.classList.add("is-copied"),t.dataset.clipboardCopied&&(i.textContent=t.dataset.clipboardCopied),setTimeout(function(){t.classList.remove("is-copied"),i.textContent=n},1e3)})})})};const y=function(){var e=document.querySelector('[data-component="directory-create-form"]'),t=null==e?void 0:e.querySelector(".directory-create-input"),i=null==e?void 0:e.querySelector(".directory-create-cancel-btn");e&&(e.classList.add("d-none"),document.addEventListener("click",function(i){i.target.closest('[data-component="directory-create"]')&&(i.preventDefault(),e.classList.toggle("d-none"),e.classList.contains("d-none")||t.focus())}),e.addEventListener("submit",function(e){t.value.trim()||e.preventDefault()}),null==i||i.addEventListener("click",function(){e.classList.add("d-none"),t.value=""}),null==t||t.addEventListener("keydown",function(i){"Escape"===i.key&&(e.classList.add("d-none"),t.value="")}))};const b=function(){var e=document.querySelector('[data-component*="directory-list"]'),t=document.querySelector('[data-component="directory-rename-form"]'),i=null==t?void 0:t.querySelector(".directory-rename-input"),n=null==t?void 0:t.querySelector(".directory-rename-cancel-btn");document.addEventListener("click",function(e){e.target.closest(".directory-rename-header-btn")&&(e.preventDefault(),null==t||t.classList.toggle("d-none"),null!=t&&t.classList.contains("d-none")||(i.focus(),i.select()))}),null==t||t.addEventListener("submit",function(e){var n,a=i.value.trim();if(a){var r=(null===(n=t.querySelector('input[name="oldPath"]'))||void 0===n?void 0:n.value)||"",o=(r.includes("/")?r.substring(0,r.lastIndexOf("/")+1):"")+a,s=t.querySelector('input[name="newPath"]');s||((s=document.createElement("input")).type="hidden",s.name="newPath",t.appendChild(s)),s.value=o}else e.preventDefault()}),null==n||n.addEventListener("click",function(){t.classList.add("d-none"),i.value=""}),null==i||i.addEventListener("keydown",function(e){"Escape"===e.key&&(t.classList.add("d-none"),i.value="")}),e&&(e.addEventListener("click",function(e){var t=e.target.closest(".directory-rename-btn");if(t){var i=t.closest("tr").querySelector(".directory-name").closest("td"),n=i.querySelector(".directory-name"),a=i.querySelector(".directory-rename-form");n.classList.add("d-none"),a.classList.remove("d-none");var r=a.querySelector(".directory-rename-input");r.dataset.original=r.value,r.focus(),r.select()}}),e.addEventListener("click",function(e){var t=e.target.closest(".directory-rename-cancel-btn");if(t){var i=t.closest(".directory-rename-form"),n=i.parentElement.querySelector(".directory-name"),a=i.querySelector(".directory-rename-input");a.value=a.dataset.original,i.classList.add("d-none"),n.classList.remove("d-none")}}),e.addEventListener("submit",function(e){if(e.target.classList.contains("directory-rename-form")){e.preventDefault();var t=e.target,i=t.closest("td"),n=i.closest("tr"),a=i.querySelector(".directory-name"),r=t.querySelector(".directory-rename-input"),o=r.value.trim(),s=r.dataset.original;if(!o||o===s)return t.classList.add("d-none"),void a.classList.remove("d-none");var l=n.dataset.directory,d=(l.includes("/")?l.substring(0,l.lastIndexOf("/")+1):"")+o,c=t.querySelector('input[name="oldPath"]');c&&(c.value=l);var u=t.querySelector('input[name="newPath"]');u&&(u.value=d),t.submit()}}),e.addEventListener("keydown",function(e){if(e.target.classList.contains("directory-rename-input")&&"Escape"===e.key){var t=e.target.closest(".directory-rename-form"),i=t.parentElement.querySelector(".directory-name");e.target.value=e.target.dataset.original,t.classList.add("d-none"),i.classList.remove("d-none")}}))};const E=function(){var e=document.querySelector('[data-component*="media-list"]'),t=document.querySelector('[data-component*="media-rename"]');if(e||t){var i=function(e,t){var i,n;if(t)i=e.querySelector(".media-rename-form"),n=e.querySelector(".media-name");else{var a=e.querySelector(".media-rename-cancel-btn");if(!a)return;n=(i=a.closest(".media-rename-form")).parentElement.querySelector(".media-name")}var r=i.querySelector(".media-rename-input");r.value=r.dataset.original,i.classList.add("d-none"),n.classList.remove("d-none")},n=function(e,t,i){if(e.target.classList.contains("media-rename-form")){e.preventDefault();var n=e.target,a=n.querySelector(".media-rename-input"),r=a.value.trim(),o=a.dataset.original;if(!r||r===o)return n.classList.add("d-none"),void(i?t.querySelector(".media-name").classList.remove("d-none"):n.parentElement.querySelector(".media-name").classList.remove("d-none"));var s=n.querySelector('input[name="oldPath"]').value,l=(s.includes("/")?s.substring(0,s.lastIndexOf("/")+1):"")+r,d=n.querySelector('input[name="newPath"]');d&&(d.value=l),n.submit()}},a=function(e,t,i){if(e.target.classList.contains("media-rename-input")&&"Escape"===e.key){var n=e.target.closest(".media-rename-form"),a=i?t.querySelector(".media-name"):n.parentElement.querySelector(".media-name");e.target.value=e.target.dataset.original,n.classList.add("d-none"),a.classList.remove("d-none")}};e&&(e.querySelectorAll("tr.item").forEach(function(e){var t=e.querySelector(".media-name");if(t){var i,n=t.textContent.trim(),a=(null===(i=document.querySelector('meta[name="current-key"]'))||void 0===i?void 0:i.content)||"",r=a?"".concat(a,"/").concat(n):n;e.dataset.media=r}}),e.addEventListener("click",function(t){var n=t.target.closest(".media-rename-btn");if(n){var a=n.closest("tr").querySelector(".media-name").closest("td"),r=a.querySelector(".media-name"),o=a.querySelector(".media-rename-form");r.classList.add("d-none"),o.classList.remove("d-none");var s=o.querySelector(".media-rename-input");s.dataset.original=s.value,s.focus(),s.select()}t.target.closest(".media-rename-cancel-btn")&&i(e,!1)}),e.addEventListener("submit",function(t){return n(t,e,!1)}),e.addEventListener("keydown",function(t){return a(t,e,!1)})),t&&(t.addEventListener("click",function(e){e.target.closest(".media-rename-btn")&&function(e,t){var i=e.querySelector(".media-rename-btn");if(i){var n,a;if(t)n=e.querySelector(".media-name"),a=e.querySelector(".media-rename-form");else{var r=i.closest("tr").querySelector(".media-name").closest("td");n=r.querySelector(".media-name"),a=r.querySelector(".media-rename-form")}n.classList.add("d-none"),a.classList.remove("d-none");var o=a.querySelector(".media-rename-input");o.dataset.original=o.value,o.focus(),o.select()}}(t,!0),e.target.closest(".media-rename-cancel-btn")&&i(t,!0)}),t.addEventListener("submit",function(e){return n(e,t,!0)}),t.addEventListener("keydown",function(e){return a(e,t,!0)})),document.addEventListener("click",function(e){var t=e.target.closest(".media-rename-btn");if(t&&!t.closest('[data-component*="media-list"]')){var i=t.closest(".row");if(i){var n=i.querySelector('[data-component*="media-rename"]'),a=null==n?void 0:n.querySelector(".media-name"),r=null==n?void 0:n.querySelector(".media-rename-form");if(a&&r){a.classList.add("d-none"),r.classList.remove("d-none");var o=r.querySelector(".media-rename-input");o.dataset.original=o.value,o.focus(),o.select()}}}})}};var L="joli-media-tabs-active";const w=function(){var e=document.querySelector('[data-bs-toggle="tabs"]');if(e){e.addEventListener("shown.bs.tab",function(e){var t=e.target.getAttribute("href");t&&localStorage.setItem(L,t.replace("#",""))}),function(){var t=localStorage.getItem(L);if(t){var i=e.querySelector('[href="#'.concat(t,'"]'));if(i)new bootstrap.Tab(i).show()}}()}};var k=function(e){var t,i=document.getElementById("modal-folder-choice");if(i){0;var n,a,r,o,s=i.querySelector(".modal-body"),l=null==s?void 0:s.querySelector(".folder-list-container"),d=(null===(t=e.closest("[data-media-key]"))||void 0===t?void 0:t.dataset.mediaKey)||"",c=function(e){return fetch(e,{headers:{"X-Requested-With":"XMLHttpRequest"}}).then(function(e){return e.text()})},u=e.dataset.folder||"",h=function(t){var n=i.querySelector(".folder-modal-breadcrumb");if(n){var a=e.getAttribute("href")||"",r=t?t.split("/").filter(function(e){return e}):[],o="";if(o+='').concat("Media Library",""),r.length>0){var s="";r.forEach(function(e,t){t>0&&(s+="/"),s+=e;var i=decodeURIComponent(e);if(o+='/',t===r.length-1)o+=''.concat(i,"");else{var n=a.replace(/\/$/,"")+"/"+encodeURIComponent(s);o+='').concat(i,"")}})}n.innerHTML=o}},p=function(e){l&&(l.innerHTML=e,h(u),m())},m=function(){var e=i.querySelector(".folder-modal-breadcrumb");null==e||e.addEventListener("click",function(e){var t=e.target.closest("a[data-folder-path]");if(t){e.preventDefault(),e.stopPropagation();var i=t.getAttribute("href");if(i&&!i.endsWith("#")){var n=new URL(i,window.location.origin).searchParams.get("key")||"";h(u=n),c(i).then(p)}}});var t=null==l?void 0:l.querySelector(".folder-parent a");null==t||t.addEventListener("click",function(e){e.preventDefault(),e.stopPropagation();var i=t.dataset.folderPath||"",n=t.getAttribute("href");n&&!n.endsWith("#")&&(h(u=i),c(n).then(p))});var n=null==l?void 0:l.querySelectorAll("a[data-folder-path]");null==n||n.forEach(function(e){e.addEventListener("click",function(t){t.preventDefault(),t.stopPropagation();var i=e.dataset.folderPath||"",n=e.getAttribute("href");n&&!n.endsWith("#")&&(h(u=i),c(n).then(p))})});var a=i.querySelector(".folder-move-btn");a&&(a.dataset.folderPath=u,a.addEventListener("click",function(e){e.preventDefault(),e.stopPropagation(),function(e){var t=document.querySelector("#move-form");if(t){var i=t.querySelector('input[name="from"]'),n=t.querySelector('input[name="to"]');i&&(i.value=d),n&&(n.value=e||""),t.submit()}}(u)}))};n=i.querySelector('[data-component="folder-create"]'),a=i.querySelector(".folder-create-form"),r=i.querySelector(".folder-create-input"),o=i.querySelector(".folder-create-cancel"),null==n||n.addEventListener("click",function(e){e.preventDefault(),a.classList.toggle("d-none"),a.classList.contains("d-none")||r.focus()}),null==o||o.addEventListener("click",function(){a.classList.add("d-none"),r.value=""}),null==a||a.addEventListener("submit",function(e){if(e.preventDefault(),r.value.trim()){var t=a.querySelector('input[name="parentPath"]');t&&(t.value=u);var i=new FormData(a);i.append("_mode","folder_choice"),fetch(a.action,{method:"POST",body:i,headers:{"X-Requested-With":"XMLHttpRequest"}}).then(function(e){return e.text()}).then(function(e){l&&(l.innerHTML=e,h(u),m()),a.classList.add("d-none"),r.value=""}).catch(function(e){console.error("Error:",e)})}}),null==r||r.addEventListener("keydown",function(e){"Escape"===e.key&&(a.classList.add("d-none"),r.value="")});var f=e.getAttribute("href")||"",v=f;u&&(v=f.replace(/\/$/,"")+"/"+encodeURIComponent(u)),h(u),c(v).then(p),new bootstrap.Modal(i).show()}};const S=function(){document.querySelectorAll("[data-component=media-move]").forEach(function(e){e.addEventListener("click",function(t){t.preventDefault(),k(e)})})};document.addEventListener("DOMContentLoaded",function(){r(),w(),g(),y(),b(),E(),S();var e=null;document.addEventListener("click",function(t){var i=t.target.closest('[data-component="media-add"]');if(i){var n;t.preventDefault(),t.stopPropagation();var a=null===(n=i.closest(".joli-media-choose-container, .joli-media-header-tools"))||void 0===n?void 0:n.querySelector(".dropzone-container");if(!a)return;a.classList.toggle("dropzone-active");var r,o=a.querySelector('[data-component="dropzone"]');if(!o)return;if(a.classList.contains("dropzone-initialized")||(e=v(o),a.classList.add("dropzone-initialized")),!a.classList.contains("dropzone-active"))null===(r=e)||void 0===r||r.removeAllFiles(!0)}})})})()})(); \ No newline at end of file diff --git a/src/Bridge/Sylius/public/manifest.json b/src/Bridge/Sylius/public/manifest.json index 5fe83c3f..d57a81c4 100644 --- a/src/Bridge/Sylius/public/manifest.json +++ b/src/Bridge/Sylius/public/manifest.json @@ -1,4 +1,4 @@ { "joli-media-sylius-admin.css": "./joli-media-sylius-admin.2f351929.css", - "joli-media-sylius-admin.js": "./joli-media-sylius-admin.0ec877e4.js" + "joli-media-sylius-admin.js": "./joli-media-sylius-admin.dc8dd6d7.js" } \ No newline at end of file diff --git a/src/Bridge/Sylius/src/Admin/Controller/MediaAdminController.php b/src/Bridge/Sylius/src/Admin/Controller/MediaAdminController.php index fae340a3..1e917c28 100644 --- a/src/Bridge/Sylius/src/Admin/Controller/MediaAdminController.php +++ b/src/Bridge/Sylius/src/Admin/Controller/MediaAdminController.php @@ -66,6 +66,7 @@ public function createDirectory(Request $request): Response $csrfToken = $request->request->getString('_csrf_token'); $parentPath = urldecode(Resolver::normalizePath($request->request->getString('parentPath'))); $name = trim($request->request->getString('name')); + $searchValue = $request->request->getString('_search', ''); if (!$this->csrfTokenManager->isTokenValid(new CsrfToken('media_create_directory', $csrfToken))) { $this->addFlash('error', $this->translator->trans('directory.create_failure', [ @@ -108,7 +109,7 @@ public function createDirectory(Request $request): Response return $this->renderFolderChoiceHtml($parentPath); } - return $this->renderChooseHtml($parentPath); + return $this->renderChooseHtml($parentPath, $searchValue); } return $this->redirect($request->headers->get('referer') ?? $this->generateUrl('joli_media_sylius_admin_explore')); @@ -374,6 +375,9 @@ public function choose(Request $request, string $key = ''): Response $request->attributes->set('currentKey', $currentKey); $parentKey = '' !== $currentKey ? (($pos = strrpos($currentKey, '/')) !== false ? substr($currentKey, 0, $pos) : '') : ''; + $searchValue = $request->query->all('criteria')['search']['value'] ?? $request->query->getString('search', ''); + $hasSearch = '' !== $searchValue; + $perPage = $this->config->getPaginationSizes()[0] ?? 10; try { @@ -383,17 +387,32 @@ public function choose(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) { $directories = []; } + $mediaFilter = null; + if ($hasSearch) { + $mediaFilter = static fn ($media): bool => str_contains(strtolower($media->getPath()), strtolower($searchValue)); + } + if ($request->isXmlHttpRequest()) { try { $paginatedMedias = $this->getOriginalStorage()->listMediasPaginated( $currentKey, + recursive: $hasSearch, perPage: $perPage, + filter: $mediaFilter, ); $medias = $paginatedMedias['items']; } catch (\OutOfRangeException) { @@ -414,8 +433,10 @@ public function choose(Request $request, string $key = ''): Response try { $paginatedMedias = $this->getOriginalStorage()->listMediasPaginated( $currentKey, + recursive: $hasSearch, page: $page, perPage: $perPage, + filter: $mediaFilter, ); $medias = new Pagerfanta(new FixedAdapter($paginatedMedias['total'], $paginatedMedias['items'])); $medias->setCurrentPage($page); @@ -428,6 +449,7 @@ public function choose(Request $request, string $key = ''): Response 'current_key' => $currentKey, 'directories' => $directories, 'medias' => $medias, + 'search' => $searchValue, 'create_media_form' => $this->createUploadForm($currentKey)->createView(), 'config' => $this->config, 'csrf_token_create' => $this->csrfTokenManager->getToken('media_create_directory')->getValue(), @@ -550,8 +572,10 @@ private function redirectAfterRename(Request $request, string $oldPath, string $ return $this->redirectToRoute('joli_media_sylius_admin_explore', ['key' => $newPath]); } - private function renderChooseHtml(string $currentKey): Response + private function renderChooseHtml(string $currentKey, string $searchValue = ''): Response { + $hasSearch = '' !== $searchValue; + try { $trashPath = $this->getOriginalStorage()->getTrashPath(); @@ -559,16 +583,31 @@ private function renderChooseHtml(string $currentKey): 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) { $directories = []; } + $mediaFilter = null; + if ($hasSearch) { + $mediaFilter = static fn ($media): bool => str_contains(strtolower($media->getPath()), strtolower($searchValue)); + } + try { $paginatedMedias = $this->getOriginalStorage()->listMediasPaginated( $currentKey, + recursive: $hasSearch, perPage: $this->config->getPaginationSizes()[0] ?? 10, + filter: $mediaFilter, ); $medias = new Pagerfanta(new FixedAdapter($paginatedMedias['total'], $paginatedMedias['items'])); $medias->setCurrentPage(1); @@ -581,6 +620,7 @@ private function renderChooseHtml(string $currentKey): Response 'current_key' => $currentKey, 'directories' => $directories, 'medias' => $medias, + 'search' => $searchValue, 'create_media_form' => $this->createUploadForm($currentKey)->createView(), 'config' => $this->config, 'csrf_token_create' => $this->csrfTokenManager->getToken('media_create_directory')->getValue(), diff --git a/src/Bridge/Sylius/templates/admin/media/choose.html.twig b/src/Bridge/Sylius/templates/admin/media/choose.html.twig index c5cc4d74..21738bab 100644 --- a/src/Bridge/Sylius/templates/admin/media/choose.html.twig +++ b/src/Bridge/Sylius/templates/admin/media/choose.html.twig @@ -40,6 +40,15 @@ + +
+
From 1cfc4eca5f9fed19a64eac14c44671d43a64d73d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Fr=C3=A9mont?= Date: Thu, 21 May 2026 17:28:22 +0200 Subject: [PATCH 3/3] Add PHPUnit tests --- .../templates/admin/media/choose.html.twig | 4 +-- .../Controller/MediaAdminControllerTest.php | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/Bridge/Sylius/templates/admin/media/choose.html.twig b/src/Bridge/Sylius/templates/admin/media/choose.html.twig index 69975655..66674a88 100644 --- a/src/Bridge/Sylius/templates/admin/media/choose.html.twig +++ b/src/Bridge/Sylius/templates/admin/media/choose.html.twig @@ -98,7 +98,7 @@ {% if directories|length > 0 %}