huply 0.0.11 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -5
- package/dist/huply.cjs.js +1 -1
- package/dist/huply.cjs.js.map +1 -1
- package/dist/huply.es.js +46 -21
- package/dist/huply.es.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -185,21 +185,26 @@ new Huply(el, options).init();
|
|
|
185
185
|
|
|
186
186
|
#### preloadedFiles
|
|
187
187
|
|
|
188
|
+
Sets the preloaded files (e.g. from database). Size - Value in bytes.
|
|
189
|
+
|
|
188
190
|
```
|
|
189
191
|
const options = {
|
|
190
192
|
...
|
|
191
193
|
preloadedFiles: [
|
|
192
194
|
{
|
|
193
195
|
url: 'https://cdn.pixabay.com/photo/2022/03/06/05/30/clouds-7050884_960_720.jpg',
|
|
194
|
-
name: 'test.jpg'
|
|
196
|
+
name: 'test.jpg',
|
|
197
|
+
size: 20000000
|
|
195
198
|
},
|
|
196
199
|
{
|
|
197
200
|
url: 'https://cdn.pixabay.com/photo/2021/12/27/14/39/tulips-6897351_960_720.jpg',
|
|
198
|
-
name: 'test2.jpg'
|
|
201
|
+
name: 'test2.jpg',
|
|
202
|
+
size: 10000000
|
|
199
203
|
},
|
|
200
204
|
{
|
|
201
|
-
url: 'data:
|
|
202
|
-
name: 'url-as-data-url.jpg'
|
|
205
|
+
url: 'data:image/jpeg;base64, ...',
|
|
206
|
+
name: 'url-as-data-url.jpg',
|
|
207
|
+
size: 10000000
|
|
203
208
|
},
|
|
204
209
|
],
|
|
205
210
|
...
|
|
@@ -249,7 +254,7 @@ Add parameters as data-attributes:
|
|
|
249
254
|
data-max-files="3"
|
|
250
255
|
data-upload-url="http://huply-be.loc/api/upload"
|
|
251
256
|
data-delete-url="http://huply-be.loc/api/upload/{{filename}}"
|
|
252
|
-
data-preloaded-files='[{"url":"https://cdn.pixabay.com/photo/2022/03/06/05/30/clouds-7050884_960_720.jpg","name":"test.jpg"},{"url":"https://cdn.pixabay.com/photo/2021/12/27/14/39/tulips-6897351_960_720.jpg","name":"test2.jpg"},{"url":"https://cdn.pixabay.com/photo/2020/03/26/10/58/norway-4970080_960_720.jpg","name":"test3.jpg"}]'
|
|
257
|
+
data-preloaded-files='base64-encoded string (Decoded: [{"url":"https://cdn.pixabay.com/photo/2022/03/06/05/30/clouds-7050884_960_720.jpg","name":"test.jpg"},{"url":"https://cdn.pixabay.com/photo/2021/12/27/14/39/tulips-6897351_960_720.jpg","name":"test2.jpg"},{"url":"https://cdn.pixabay.com/photo/2020/03/26/10/58/norway-4970080_960_720.jpg","name":"test3.jpg"}])'
|
|
253
258
|
data-chunk-size="3"
|
|
254
259
|
/>
|
|
255
260
|
```
|
package/dist/huply.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var V=Object.defineProperty;var A=Object.getOwnPropertySymbols;var k=Object.prototype.hasOwnProperty,I=Object.prototype.propertyIsEnumerable;var f=(n,e,t)=>e in n?V(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,v=(n,e)=>{for(var t in e||(e={}))k.call(e,t)&&f(n,t,e[t]);if(A)for(var t of A(e))I.call(e,t)&&f(n,t,e[t]);return n};var l=(n,e,t)=>(f(n,typeof e!="symbol"?e+"":e,t),t);function L(n){return n!=null&&n.constructor===Object}function N(n){return n instanceof Element}function F(n){return n!==void 0}function R(n){return n!=null&&!!(n%1)}function $(n){return n!=null&&parseInt(n,10)===n}class m{constructor(e){l(this,"store");this.store=e}request(e,t){let s=new XMLHttpRequest;return this.store.options.withCredentials&&(s.withCredentials=this.store.options.withCredentials),s.open(e,t),L(this.store.options.headers)&&Object.entries(this.store.options.headers).forEach(i=>{s.setRequestHeader(i[0],i[1])}),s}}class P{constructor(e){l(this,"store");this.store=e}upload(){const e=this.store.getFilesWaiting();e.length&&e.forEach(t=>{t.status="uploading",t.uploadProcess=0,this.store.updateFileItem(t),this.store.options.chunkSize?this.sendChunkedFile(t,0):this.sendFile(t)})}sendChunkedFile(e,t){var s;if(this.store.options.chunkSize&&e.size&&e.data){const i=this.store.options.chunkSize*1024*1024,a=t+i,o=a+1,r=Math.min(a,e.size),h=e.data.slice(t,o);let d=new m(this.store).request("POST",this.store.options.uploadUrl);const u="bytes "+t+"-"+r+"/"+e.size;d.setRequestHeader("Content-Range",u),d.addEventListener("load",()=>{if(d.status===200){if(d.response){const g=JSON.parse(d.response);g.filename&&(e.name=g.filename)}e.size&&(e.uploadProcess=Math.min(Math.ceil(a/e.size*100),100)),r===e.size?(e.status="uploaded",this.store.updateFileItem(e),this.upload()):(this.store.updateFileItem(e),this.sendChunkedFile(e,o))}else e.status="error",this.store.updateFileItem(e),this.upload()});let c=new FormData;c.append("file",h,e.name),((s=this.store.options)==null?void 0:s.maxFileSize)&&c.append("max_file_size",this.store.options.maxFileSize*1024),d.send(c)}}sendFile(e){return e.status="uploading",e.uploadProcess=0,this.store.updateFileItem(e),new Promise((t,s)=>{var o;let i=new m(this.store).request("POST",this.store.options.uploadUrl);i.setRequestHeader("accept","application/json"),i.upload.addEventListener("progress",r=>{e.uploadProcess=r.loaded/r.total*100,this.store.updateFileItem(e)}),i.addEventListener("load",()=>{if(i.status===200){if(t(i.response),i.response){const r=JSON.parse(i.response);r.filename&&(e.name=r.filename)}e.status="uploaded",this.store.updateFileItem(e),this.upload()}else s(i.response),e.status="error",this.store.updateFileItem(e),this.upload()});let a=new FormData;e.data&&a.append("file",e.data),((o=this.store.options)==null?void 0:o.maxFileSize)&&a.append("max_file_size",this.store.options.maxFileSize*1024),i.send(a)})}}function p(n,e){if(F(window.huplyTranslations[n])){let t=window.huplyTranslations[n];return e&&Object.entries(e).forEach(s=>{t=t.replace("{{"+s[0]+"}}",s[1])}),t}else return"{{"+n+"}}"}class q{constructor(e){l(this,"store");this.store=e}checkFileSize(e){var t;return!(((t=this.store.options)==null?void 0:t.maxFileSize)&&e.size>this.store.options.maxFileSize*1024*1024)}checkFileType(e){const t=e.name.split(".");return this.store.options.allowedFileTypes.includes("."+t[t.length-1].toLowerCase())}isValidFile(e){const t=[];return this.checkFileSize(e)||t.push({msg:p("fileItemStatusErrorFileSize",{maxFileSize:this.store.options.maxFileSize})}),this.checkFileType(e)||t.push({msg:p("fileItemStatusErrorFileType",{allowedFileTypes:this.store.options.allowedFileTypes.join(",")})}),t}}function j(){return Math.random().toString(36).substring(2)+Date.now().toString(36)}function B(n){let e=0;const t=Number(n);return R(t)?e=t.toFixed(2).replace(".",","):$(t)&&(e=t),e}class C{constructor(e){l(this,"store");this.store=e}generateFileItem(e){return new Promise(t=>{let s={id:j(),name:e.name,size:e.size,sizeMb:e.size?e.size/1024/1024:0,sizeKb:e.size?Number((e.size/1024).toFixed(0)):0,status:"waiting",uploadProcess:0,data:e,url:""};this.checkIfIsImage(e.name)&&s.size&&s.size<=this.store.maxSizeImageView?this.getDataUrlFromFile(e).then(i=>{s.url=i,t(s)}):t(s)})}getDataUrlFromFile(e){return new Promise(t=>{const s=new FileReader;s.readAsDataURL(e),s.addEventListener("load",function(){t(s.result)},!1)})}getBlobFromUrl(e){return new Promise((t,s)=>{const i=new m(this.store).request("GET",e);i.responseType="blob",i.send(),i.addEventListener("load",()=>{i.status===200?t(i.response):s(!1)})})}checkIfIsImage(e){const t=e.split(".");return this.store.imgExt.includes("."+t[t.length-1])}}class J{constructor(e,t){l(this,"el");var s,i;this.el=e.cloneNode(!0),this.el.setAttribute("name",`${e.getAttribute("name")}_real'`),this.el.classList.add("huply-input"),((s=t.options)==null?void 0:s.allowedFileTypes)&&this.el.setAttribute("accept",(i=t.options)==null?void 0:i.allowedFileTypes.join(",")),this.el.addEventListener("change",a=>{a.preventDefault(),a.target&&[...a.target.files].forEach(o=>{const h=new q(t).isValidFile(o);new C(t).generateFileItem(o).then(d=>{t.addFileItem(d),h.length!==0&&(d.status="error",d.statusMsg=h.map(u=>u.msg).join(", "),t.updateFileItem(d)),new P(t).upload()})})})}render(){return this.el}}class K{constructor(e,t){l(this,"fileItem");l(this,"listElement");l(this,"store");this.fileItem=e,this.store=t,this.store.events.subscribe("fileItemUpdate",s=>{this.fileItem.id===s.id&&(this.updateHeadline(s),this.updateSubline(s),this.updateListEl(s))}),this.store.events.subscribe("fileDeleted",s=>{this.fileItem.id===s.id&&this.listElement.remove()})}render(){const e=this.getListEl();e.appendChild(this.getVisual());const t=document.createElement("div");return t.appendChild(this.getHeadline()),t.appendChild(this.getSubline()),e.appendChild(t),e.appendChild(this.getActions()),this.listElement=e,e}getListEl(){const e=document.createElement("li");return e.classList.add("huply-file-item"),e}updateListEl(e){this.listElement.classList.remove("is-uploading"),this.listElement.classList.remove("is-preloaded"),this.listElement.classList.remove("is-error"),this.listElement.classList.remove("is-deleted"),e.status==="uploading"?this.listElement.classList.add("is-uploading"):e.status==="preloaded"?this.listElement.classList.add("is-preloaded"):e.status==="error"?this.listElement.classList.add("is-error"):e.status==="uploaded"?this.listElement.classList.add("is-uploaded"):e.status==="deleted"&&this.listElement.classList.add("is-deleted")}getSubline(){const e=document.createElement("p");return e.classList.add("huply-file-item-subline"),e.textContent=p("fileItemStatusWaiting"),e}updateSubline(e){var s;const t=this.listElement.querySelector(".huply-file-item-subline");t&&(e.status==="uploading"?e.uploadProcess&&(t.textContent=p("fileItemStatusUploading")+" ("+e.uploadProcess.toFixed(0)+"%)"):e.status==="error"?t.textContent=(s=e.statusMsg)!=null?s:p("fileItemStatusError"):(e.status==="uploaded"||e.status==="preloaded")&&(t.textContent=e.sizeMb&&e.sizeMb<1?`${e.sizeKb} KB`:`${B(e.sizeMb)} MB`))}getHeadline(){const e=document.createElement("p");return e.textContent=this.fileItem.name,e.classList.add("huply-file-item-headline"),e}updateHeadline(e){const t=this.listElement.querySelector(".huply-file-item-headline");t&&(t.textContent=e.name)}getVisual(){const e=document.createElement("div");if(e.classList.add("huply-file-item-visual"),new C(this.store).checkIfIsImage(this.fileItem.name))if(this.fileItem.url){const s=document.createElement("img");s.classList.add("is-hidden"),e.appendChild(s),s.setAttribute("src",this.fileItem.url),setTimeout(()=>{s.classList.remove("is-hidden")},5)}else e.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M152 120c-26.51 0-48 21.49-48 48s21.49 48 48 48s48-21.49 48-48S178.5 120 152 120zM447.1 32h-384C28.65 32-.0091 60.65-.0091 96v320c0 35.35 28.65 64 63.1 64h384c35.35 0 64-28.65 64-64V96C511.1 60.65 483.3 32 447.1 32zM463.1 409.3l-136.8-185.9C323.8 218.8 318.1 216 312 216c-6.113 0-11.82 2.768-15.21 7.379l-106.6 144.1l-37.09-46.1c-3.441-4.279-8.934-6.809-14.77-6.809c-5.842 0-11.33 2.529-14.78 6.809l-75.52 93.81c0-.0293 0 .0293 0 0L47.99 96c0-8.822 7.178-16 16-16h384c8.822 0 16 7.178 16 16V409.3z"/></svg>';else e.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><path d="M365.3 93.38l-74.63-74.64C278.6 6.743 262.3 0 245.4 0L64-.0001c-35.35 0-64 28.65-64 64l.0065 384c0 35.35 28.65 64 64 64H320c35.2 0 64-28.8 64-64V138.6C384 121.7 377.3 105.4 365.3 93.38zM320 464H64.02c-8.836 0-15.1-7.163-16-15.1L48 64.13c-.0004-8.837 7.163-16 16-16h160L224 128c0 17.67 14.33 32 32 32h79.1v288C336 456.8 328.8 464 320 464z"/></svg>';return e}getActions(){const e=document.createElement("div");e.classList.add("huply-file-item-actions");const t=this.getDeleteAction();return e.appendChild(t),e}getDeleteAction(){const e=document.createElement("a");return e.setAttribute("href","#"),e.classList.add("huply-file-item-actions-delete"),e.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M424 80C437.3 80 448 90.75 448 104C448 117.3 437.3 128 424 128H412.4L388.4 452.7C385.9 486.1 358.1 512 324.6 512H123.4C89.92 512 62.09 486.1 59.61 452.7L35.56 128H24C10.75 128 0 117.3 0 104C0 90.75 10.75 80 24 80H93.82L130.5 24.94C140.9 9.357 158.4 0 177.1 0H270.9C289.6 0 307.1 9.358 317.5 24.94L354.2 80H424zM177.1 48C174.5 48 171.1 49.34 170.5 51.56L151.5 80H296.5L277.5 51.56C276 49.34 273.5 48 270.9 48H177.1zM364.3 128H83.69L107.5 449.2C108.1 457.5 115.1 464 123.4 464H324.6C332.9 464 339.9 457.5 340.5 449.2L364.3 128z"/></svg>',e.addEventListener("click",t=>{t.preventDefault(),this.store.deleteFileItem(this.fileItem)}),e}}class _{constructor(e){l(this,"fileList");l(this,"store");this.store=e,this.fileList=document.createElement("ul"),this.fileList.classList.add("huply-file-list"),this.store.options.multiple&&e.events.subscribe("fileAdded",t=>{this.addChild(t)})}render(){return this.fileList}addChild(e){const t=new K(e,this.store);this.fileList.appendChild(t.render())}}class O{constructor(e){l(this,"store");l(this,"dropzone");l(this,"headline");l(this,"subline");l(this,"uploadIcon");l(this,"deleteIcon");l(this,"descWrapper");l(this,"baseCssClass","");this.store=e,this.store.options.multiple||(e.events.subscribe("fileItemUpdate",t=>{this.updateHeadline(t),this.updateSubline(t),this.updateUploadIcon(t),this.updateDeleteIcon(t),this.updateDescriptionWrapper(t)}),e.events.subscribe("fileDeleted",t=>{this.updateHeadline(t),this.updateSubline(t),this.updateUploadIcon(t),this.updateDeleteIcon(t),this.updateDescriptionWrapper(t)}))}render(){return this.dropzone=document.createElement("div"),this.baseCssClass&&this.dropzone.classList.add(this.baseCssClass),this.getTemplate(),this.setEvents(),this.dropzone}getTemplate(){}setEvents(){this.dropzone&&(this.dropzone.addEventListener("click",()=>{var e;(e=this.store.components.input)==null||e.click()}),this.dropzone.addEventListener("dragover",e=>{var t;e.preventDefault(),(t=this.dropzone)==null||t.classList.add("is-dragover")}),this.dropzone.addEventListener("dragleave",e=>{var t;e.preventDefault(),(t=this.dropzone)==null||t.classList.remove("is-dragover")}),this.dropzone.addEventListener("drop",e=>{e.preventDefault();const t=new P(this.store);if(e.dataTransfer)for(var s=0;s<e.dataTransfer.items.length;s++){const i=e.dataTransfer.items[s].getAsFile();if(i){const o=new q(this.store).isValidFile(i);new C(this.store).generateFileItem(i).then(r=>{this.store.addFileItem(r),o.length!==0&&(r.status="error",r.statusMsg=o.map(h=>h.msg).join(", "),this.store.updateFileItem(r)),t.upload()})}}}))}getDescriptionWrapper(){return this.descWrapper=document.createElement("div"),this.descWrapper.classList.add(this.baseCssClass+"-desc"),this.descWrapper}updateDescriptionWrapper(e){this.descWrapper&&(this.descWrapper.classList.remove("is-uploading"),this.descWrapper.classList.remove("is-preloaded"),this.descWrapper.classList.remove("is-error"),this.descWrapper.classList.remove("is-uploaded"),e.status==="uploading"?this.descWrapper.classList.add("is-uploading"):e.status==="preloaded"?this.descWrapper.classList.add("is-preloaded"):e.status==="error"?this.descWrapper.classList.add("is-error"):e.status==="uploaded"&&this.descWrapper.classList.add("is-uploaded"))}getUploadIcon(){return this.uploadIcon=document.createElement("div"),this.uploadIcon.classList.add(this.baseCssClass+"-icon-upload"),this.uploadIcon.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path d="M303 175C312.4 165.7 327.6 165.7 336.1 175L416.1 255C426.3 264.4 426.3 279.6 416.1 288.1C407.6 298.3 392.4 298.3 383 288.1L344 249.9V384C344 397.3 333.3 408 320 408C306.7 408 296 397.3 296 384V249.9L256.1 288.1C247.6 298.3 232.4 298.3 223 288.1C213.7 279.6 213.7 264.4 223 255L303 175zM144 480C64.47 480 0 415.5 0 336C0 273.3 40.07 219.1 96 200.2V200C96 107.2 171.2 32 264 32C314.9 32 360.4 54.6 391.3 90.31C406.2 83.68 422.6 80 440 80C506.3 80 560 133.7 560 200C560 206.6 559.5 213 558.5 219.3C606.5 240.3 640 288.3 640 344C640 416.4 583.4 475.6 512 479.8V480H144zM264 80C197.7 80 144 133.7 144 200L144 234.1L111.1 245.5C74.64 258.7 48 294.3 48 336C48 389 90.98 432 144 432H506.6L509.2 431.8C555.4 429.2 592 390.8 592 344C592 308 570.4 276.9 539.2 263.3L505.1 248.4L511.1 211.7C511.7 207.9 512 204 512 200C512 160.2 479.8 128 440 128C429.5 128 419.6 130.2 410.8 134.2L378.2 148.7L354.9 121.7C332.8 96.08 300.3 80 263.1 80L264 80z"/></svg>',this.uploadIcon}updateUploadIcon(e){this.uploadIcon&&(e.status==="uploading"&&e.uploadProcess===0?this.uploadIcon.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M264 24C264 10.75 274.7 0 288 0C429.4 0 544 114.6 544 256C544 302.6 531.5 346.4 509.7 384C503.1 395.5 488.4 399.4 476.9 392.8C465.5 386.2 461.5 371.5 468.2 360C485.9 329.4 496 293.9 496 255.1C496 141.1 402.9 47.1 288 47.1C274.7 47.1 264 37.25 264 23.1V24z"/></svg>':e.status==="error"?this.uploadIcon.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 464c-114.7 0-208-93.31-208-208S141.3 48 256 48s208 93.31 208 208S370.7 464 256 464zM256 304c13.25 0 24-10.75 24-24v-128C280 138.8 269.3 128 256 128S232 138.8 232 152v128C232 293.3 242.8 304 256 304zM256 337.1c-17.36 0-31.44 14.08-31.44 31.44C224.6 385.9 238.6 400 256 400s31.44-14.08 31.44-31.44C287.4 351.2 273.4 337.1 256 337.1z"/></svg>':e.status==="uploaded"?this.uploadIcon.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M243.8 339.8C232.9 350.7 215.1 350.7 204.2 339.8L140.2 275.8C129.3 264.9 129.3 247.1 140.2 236.2C151.1 225.3 168.9 225.3 179.8 236.2L224 280.4L332.2 172.2C343.1 161.3 360.9 161.3 371.8 172.2C382.7 183.1 382.7 200.9 371.8 211.8L243.8 339.8zM512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM256 48C141.1 48 48 141.1 48 256C48 370.9 141.1 464 256 464C370.9 464 464 370.9 464 256C464 141.1 370.9 48 256 48z"/></svg>':e.status==="deleted"&&this.store.getFilesUploading().length===0?this.uploadIcon.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path d="M303 175C312.4 165.7 327.6 165.7 336.1 175L416.1 255C426.3 264.4 426.3 279.6 416.1 288.1C407.6 298.3 392.4 298.3 383 288.1L344 249.9V384C344 397.3 333.3 408 320 408C306.7 408 296 397.3 296 384V249.9L256.1 288.1C247.6 298.3 232.4 298.3 223 288.1C213.7 279.6 213.7 264.4 223 255L303 175zM144 480C64.47 480 0 415.5 0 336C0 273.3 40.07 219.1 96 200.2V200C96 107.2 171.2 32 264 32C314.9 32 360.4 54.6 391.3 90.31C406.2 83.68 422.6 80 440 80C506.3 80 560 133.7 560 200C560 206.6 559.5 213 558.5 219.3C606.5 240.3 640 288.3 640 344C640 416.4 583.4 475.6 512 479.8V480H144zM264 80C197.7 80 144 133.7 144 200L144 234.1L111.1 245.5C74.64 258.7 48 294.3 48 336C48 389 90.98 432 144 432H506.6L509.2 431.8C555.4 429.2 592 390.8 592 344C592 308 570.4 276.9 539.2 263.3L505.1 248.4L511.1 211.7C511.7 207.9 512 204 512 200C512 160.2 479.8 128 440 128C429.5 128 419.6 130.2 410.8 134.2L378.2 148.7L354.9 121.7C332.8 96.08 300.3 80 263.1 80L264 80z"/></svg>':e.status==="preloaded"&&(this.uploadIcon.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M454.7 288.1c-12.78-3.75-26.06 3.594-29.75 16.31C403.3 379.9 333.8 432 255.1 432c-66.53 0-126.8-38.28-156.5-96h100.4c13.25 0 24-10.75 24-24S213.2 288 199.9 288h-160c-13.25 0-24 10.75-24 24v160c0 13.25 10.75 24 24 24s24-10.75 24-24v-102.1C103.7 436.4 176.1 480 255.1 480c99 0 187.4-66.31 215.1-161.3C474.8 305.1 467.4 292.7 454.7 288.1zM472 16C458.8 16 448 26.75 448 40v102.1C408.3 75.55 335.8 32 256 32C157 32 68.53 98.31 40.91 193.3C37.19 206 44.5 219.3 57.22 223c12.84 3.781 26.09-3.625 29.75-16.31C108.7 132.1 178.2 80 256 80c66.53 0 126.8 38.28 156.5 96H312C298.8 176 288 186.8 288 200S298.8 224 312 224h160c13.25 0 24-10.75 24-24v-160C496 26.75 485.3 16 472 16z"/></svg>'))}getDeleteIcon(){return this.deleteIcon=document.createElement("a"),this.deleteIcon.setAttribute("href","#"),this.deleteIcon.classList.add(this.baseCssClass+"-icon-delete"),this.deleteIcon.classList.add("is-hidden"),this.deleteIcon.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M424 80C437.3 80 448 90.75 448 104C448 117.3 437.3 128 424 128H412.4L388.4 452.7C385.9 486.1 358.1 512 324.6 512H123.4C89.92 512 62.09 486.1 59.61 452.7L35.56 128H24C10.75 128 0 117.3 0 104C0 90.75 10.75 80 24 80H93.82L130.5 24.94C140.9 9.357 158.4 0 177.1 0H270.9C289.6 0 307.1 9.358 317.5 24.94L354.2 80H424zM177.1 48C174.5 48 171.1 49.34 170.5 51.56L151.5 80H296.5L277.5 51.56C276 49.34 273.5 48 270.9 48H177.1zM364.3 128H83.69L107.5 449.2C108.1 457.5 115.1 464 123.4 464H324.6C332.9 464 339.9 457.5 340.5 449.2L364.3 128z"/></svg>',this.deleteIcon.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation();const t=this.store.files.findIndex(s=>{var i;return((i=this.deleteIcon)==null?void 0:i.getAttribute("data-file-id"))==s.id});t!==-1&&this.store.deleteFileItem(this.store.files[t])}),this.deleteIcon}updateDeleteIcon(e){this.deleteIcon&&(e.status==="uploaded"||e.status==="preloaded"?(this.deleteIcon.classList.remove("is-hidden"),this.deleteIcon.setAttribute("data-file-id",e.id)):this.deleteIcon.classList.add("is-hidden"))}getHeadline(){return this.headline=document.createElement("p"),this.headline.classList.add(this.baseCssClass+"-headline"),this.headline.innerHTML=this.getHeadlineText(),this.headline}getHeadlineText(){var e;return`<strong>${((e=this.store)==null?void 0:e.options.multiple)?p("chooseFiles"):p("chooseFile")}</strong>`}updateHeadline(e){this.headline&&(e.status==="deleted"?this.headline.innerHTML=this.getHeadlineText():this.headline.innerHTML=`<strong>${e.name}</strong>`)}getSubline(){return this.subline=document.createElement("p"),this.subline.innerText=this.getSublineText(),this.subline.classList.add(this.baseCssClass+"-subline"),this.subline}getSublineText(){var t,s;const e=[];return e.push(p("allowedFileTypes",{allowedFileTypes:(t=this.store)==null?void 0:t.options.allowedFileTypes})),e.push(p("maxFileSize",{maxFileSize:(s=this.store)==null?void 0:s.options.maxFileSize})),e.join(", ")}updateSubline(e){var t;this.subline&&(this.subline.classList.remove("is-uploading"),this.subline.classList.remove("is-preloaded"),this.subline.classList.remove("is-error"),this.subline.classList.remove("is-uploaded"),e.status==="uploading"&&e.uploadProcess?this.subline.innerHTML=p("fileItemStatusUploading")+" ("+e.uploadProcess.toFixed(0)+"%)":e.status==="error"?this.subline.innerHTML=(t=e.statusMsg)!=null?t:p("fileItemStatusError"):e.status==="uploaded"||e.status==="preloaded"?this.subline.textContent=e.sizeMb&&e.sizeMb<1?`${e.sizeKb} KB`:`${B(e.sizeMb)} MB`:this.subline.innerHTML=this.getSublineText())}}class G extends O{constructor(e){super(e);l(this,"baseCssClass","huply-dropzone-lg")}getTemplate(){if(this.dropzone){this.dropzone.appendChild(this.getDeleteIcon());const e=this.getDescriptionWrapper();return e.appendChild(this.getUploadIcon()),e.appendChild(this.getHeadline()),e.appendChild(this.getSubline()),this.dropzone.appendChild(e),this.dropzone}}}class X extends O{constructor(e){super(e);l(this,"baseCssClass","huply-dropzone-sm");this.store.options.multiple||(e.events.subscribe("fileItemUpdate",t=>{this.updateWrapper(t)}),e.events.subscribe("fileDeleted",t=>{this.updateWrapper(t)}))}getTemplate(){if(this.dropzone){const e=this.getWrapper();return e.appendChild(this.getHeadline()),e.appendChild(this.getSubline()),e.appendChild(this.getUploadIcon()),e.appendChild(this.getDeleteIcon()),this.dropzone.appendChild(e),this.dropzone}}getWrapper(){return this.descWrapper=document.createElement("div"),this.descWrapper.classList.add("huply-dropzone-sm-wrapper"),this.descWrapper}updateWrapper(e){this.descWrapper&&(this.descWrapper.classList.remove("is-uploading"),this.descWrapper.classList.remove("is-preloaded"),this.descWrapper.classList.remove("is-error"),this.descWrapper.classList.remove("is-uploaded"),e.status==="uploading"?this.descWrapper.classList.add("is-uploading"):e.status==="preloaded"?this.descWrapper.classList.add("is-preloaded"):e.status==="error"?this.descWrapper.classList.add("is-error"):e.status==="uploaded"&&this.descWrapper.classList.add("is-uploaded"))}}class Q{constructor(e,t){l(this,"el");l(this,"input");this.el=e,this.input=document.createElement("input"),t.events.subscribe("fileItemUpdate",()=>{this.input.setAttribute("value",JSON.stringify(t.getCategorizedFiles()))}),t.events.subscribe("fileDeleted",()=>{this.input.setAttribute("value",JSON.stringify(t.getCategorizedFiles()))})}render(){this.input.setAttribute("type","hidden");const e=this.el.getAttribute("name");return e&&this.input.setAttribute("name",e),this.input}}class Y{constructor(e,t){l(this,"el");l(this,"store");this.el=e,this.store=t}render(){const e=document.createElement("div");e.classList.add("huply-wrapper");const t=new J(this.el,this.store).render();e.appendChild(t);const s=new Q(this.el,this.store).render();e.appendChild(s);let i;this.store.options.dropzoneTheme==="sm"?(i=new X(this.store),e.appendChild(i.render())):(i=new G(this.store),e.appendChild(i.render()));const a=new _(this.store);return e.appendChild(a.render()),this.store.setComponent("input",t),this.store.setComponent("dropzone",i),this.store.setComponent("fileList",a),e}}var Z={chooseFiles:"Dateien ausw\xE4hlen",chooseFile:"Datei ausw\xE4hlen",allowedFileTypes:"Erlaubte Dateitypen: {{allowedFileTypes}}",maxFileSize:"Maximale Dateigr\xF6\xDFe: {{maxFileSize}} MB",fileItemStatusWaiting:"In Warteschlange",fileItemStatusUploading:"Wird hochgeladen",fileItemStatusUploaded:"Erfolgreich hochgeladen",fileItemStatusPreloaded:"Bereits hochgeladen",fileItemStatusError:"Ein Fehler ist aufgetreten.",fileItemStatusErrorFileSize:"Die Dateigr\xF6\xDFe \xFCberschreitet die Maximalgr\xF6\xDFe: {{maxFileSize}} MB",fileItemStatusErrorFileType:"Der Dateityp ist nicht erlaubt. Erlaubte Dateitypen: {{allowedFileTypes}}",delete:"L\xF6schen"},ee={chooseFiles:"Choose files",chooseFile:"Choose file",allowedFileTypes:"Allowed file types: {{allowedFileTypes}}",maxFileSize:"Maximum file size: {{maxFileSize}} MB",fileItemStatusWaiting:"In queue",fileItemStatusUploading:"Uploading ...",fileItemStatusUploaded:"Uploaded",fileItemStatusPreloaded:"Already uploaded",fileItemStatusError:"An error occured.",fileItemStatusErrorFileSize:"The file size exceeds the maximum size: {{maxFileSize}} MB",fileItemStatusErrorFileType:"The file type is not allowed. Allowed file types: {{allowedFileTypes}}",delete:"Delete"};class te{constructor(){l(this,"events",{})}subscribe(e,t){return F(this.events[e])||(this.events[e]=[]),this.events[e].push(t)}publish(e,t={}){return F(this.events[e])?this.events[e].map(s=>s(t)):[]}}class se{constructor(){l(this,"events");l(this,"files");l(this,"components");l(this,"translations");l(this,"options");l(this,"maxSizeImageView");l(this,"imgExt");this.events=new te,this.components={},this.files=[],this.translations={},this.options={allowedFileTypes:[],multiple:!1,uploadUrl:"",dropzoneTheme:"lg"},this.maxSizeImageView=2e6,this.imgExt=[".jpg",".jpeg",".png"]}addFileItem(e){!this.options.multiple&&this.files.length&&this.files.forEach(t=>{this.deleteFileItem(t)}),this.files.push(e),this.events.publish("fileAdded",e)}updateFileItem(e){const t=this.files.findIndex(s=>s.id===e.id);t!==-1&&(this.files[t]=e,this.events.publish("fileItemUpdate",e),e.status==="uploaded"&&(this.events.publish("fileUploaded",e),this.getFilesUploading().length===0&&this.events.publish("filesUploaded",e)))}deleteFileItem(e){if(this.options.deleteUrl&&e.status==="uploaded"){let t=new m(this).request("DELETE",this.options.deleteUrl.replace("{{filename}}",encodeURI(e.name)));t.setRequestHeader("accept","application/json");let s=new FormData;s.append("filename",e.name),t.send(s),t.addEventListener("load",()=>{t.status===200?(this.files=this.files.filter(i=>e.id!==i.id),e.status="deleted",this.events.publish("fileDeleted",e)):(e.status="error",this.events.publish("fileItemUpdate",e))})}else e.status="deleted",this.events.publish("fileDeleted",e)}getCategorizedFiles(){return{uploaded:this.getFilesUploaded(),preloaded:this.getFilesPreloaded(),deleted:this.getFilesDeleted()}}getFilesDeleted(){return this.files.filter(e=>e.status==="deleted")}getFilesPreloaded(){return this.files.filter(e=>e.status==="preloaded")}getFilesUploaded(){return this.files.filter(e=>e.status==="uploaded")}getFilesWaiting(){return this.files.filter(e=>e.status==="waiting")}getFilesUploading(){return this.files.filter(e=>e.status==="uploading")}setComponent(e,t){this.components[e]=t}setTranslations(e){this.translations=e}setOptions(e){this.options=e}}class ie{constructor(e,t){l(this,"options");l(this,"el");l(this,"store");var i;if(!N(e))throw new Error('Selected element is not type of "Element". Current type: '+typeof e);this.el=e,this.store=new se,this.options=this.parseOptions(t),this.options&&this.store.setOptions(this.options),this.validateOptions(this.options);const s={de:Z,en:ee};if(L(window.huplyTranslations))this.store.setTranslations(window.huplyTranslations);else{const a=(i=document.querySelector("html"))==null?void 0:i.getAttribute("lang");a==="en"||a==="de"?(window.huplyTranslations=s[this.options.lang],this.store.setTranslations(s[this.options.lang])):(window.huplyTranslations=s.en,this.store.setTranslations(s.en))}return this}init(){var e,t,s;if(this.el){const i=new Y(this.el,this.store).render();((e=this.el)==null?void 0:e.parentNode)&&this.el.parentNode.replaceChild(i,this.el),this.el=i.querySelector(this.el.tagName)}if((s=(t=this.options)==null?void 0:t.preloadedFiles)==null?void 0:s.length){const i=new C(this.store);this.options.preloadedFiles.forEach(a=>{a.url&&i.getBlobFromUrl(a.url).then(o=>{i.generateFileItem(new File([o],a.name)).then(r=>{this.store.addFileItem(r),r.status="preloaded",this.store.updateFileItem(r)})})})}return this}parseOptions(e){var z,b,S,E,x,T,M,H,y,U,D,W;let t={multiple:!1,maxConcurrentUploads:3,maxFileSize:5,lang:"de",uploadUrl:"",deleteUrl:"",allowedFileTypes:[".jpg",".jpeg",".png",".pdf",".zip",".mp4"],dropzoneTheme:"lg"};L(e)&&(t=v(v({},t),e)),t.multiple=(z=this.el)==null?void 0:z.hasAttribute("multiple");const s=(b=this.el)==null?void 0:b.getAttribute("data-dropzone-theme");s&&(t.dropzoneTheme=s);const i=(S=this.el)==null?void 0:S.getAttribute("data-max-concurrent-uploads");i&&(t.maxConcurrentUploads=Number(i));const a=(E=this.el)==null?void 0:E.getAttribute("data-max-file-size");a&&(t.maxFileSize=Number(a));const o=(x=this.el)==null?void 0:x.getAttribute("data-upload-url");o&&(t.uploadUrl=o);const r=(T=this.el)==null?void 0:T.getAttribute("data-delete-url");r&&(t.deleteUrl=r);const h=(M=this.el)==null?void 0:M.getAttribute("data-headers");h&&(t.headers=JSON.parse(h));const d=(H=this.el)==null?void 0:H.getAttribute("data-preloaded-files");d&&(t.preloadedFiles=JSON.parse(d));const u=(y=this.el)==null?void 0:y.getAttribute("data-lang");u&&(t.lang=u);const c=(U=this.el)==null?void 0:U.getAttribute("data-translations");c&&(t.translations=JSON.parse(c));const g=(D=this.el)==null?void 0:D.getAttribute("accept");g&&(t.allowedFileTypes=g.split(","));const w=(W=this.el)==null?void 0:W.getAttribute("data-chunk-size");return w&&(t.chunkSize=Number(w)),t}validateOptions(e){if(!e.uploadUrl||e.uploadUrl.length===0)throw new Error('Option "uploadUrl" not set');if(!e.deleteUrl||e.deleteUrl.length===0)throw new Error('Option "deleteUrl" not set')}on(e,t){this.store.events.subscribe(e,t)}}module.exports=ie;
|
|
1
|
+
"use strict";var k=Object.defineProperty;var A=Object.getOwnPropertySymbols;var N=Object.prototype.hasOwnProperty,R=Object.prototype.propertyIsEnumerable;var f=(n,e,t)=>e in n?k(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,F=(n,e)=>{for(var t in e||(e={}))N.call(e,t)&&f(n,t,e[t]);if(A)for(var t of A(e))R.call(e,t)&&f(n,t,e[t]);return n};var l=(n,e,t)=>(f(n,typeof e!="symbol"?e+"":e,t),t);function v(n){return n!=null&&n.constructor===Object}function $(n){return n instanceof Element}function L(n){return n!==void 0}function j(n){return n!=null&&!!(n%1)}function J(n){return n!=null&&parseInt(n,10)===n}class m{constructor(e){l(this,"store");this.store=e}request(e,t){let s=new XMLHttpRequest;return this.store.options.withCredentials&&(s.withCredentials=this.store.options.withCredentials),s.open(e,t),v(this.store.options.headers)&&Object.entries(this.store.options.headers).forEach(i=>{s.setRequestHeader(i[0],i[1])}),s}}class I{constructor(e){l(this,"store");this.store=e}upload(){const e=this.store.getFilesWaiting();e.length&&e.forEach(t=>{t.status="uploading",t.uploadProcess=0,this.store.updateFileItem(t),this.store.options.chunkSize?this.sendChunkedFile(t,0):this.sendFile(t)})}sendChunkedFile(e,t){var s;if(this.store.options.chunkSize&&e.size&&e.data){const i=this.store.options.chunkSize*1024*1024,a=t+i,r=a+1,o=Math.min(a,e.size),h=e.data.slice(t,r);let d=new m(this.store).request("POST",this.store.options.uploadUrl);const u="bytes "+t+"-"+o+"/"+e.size;d.setRequestHeader("Content-Range",u),d.addEventListener("load",()=>{if(d.status===200){if(d.response){const g=JSON.parse(d.response);g.filename&&(e.name=g.filename)}e.size&&(e.uploadProcess=Math.min(Math.ceil(a/e.size*100),100)),o===e.size?(e.status="uploaded",this.store.updateFileItem(e),this.upload()):(this.store.updateFileItem(e),this.sendChunkedFile(e,r))}else e.status="error",this.store.updateFileItem(e),this.upload()});let c=new FormData;c.append("file",h,e.name),((s=this.store.options)==null?void 0:s.maxFileSize)&&c.append("max_file_size",this.store.options.maxFileSize*1024),d.send(c)}}sendFile(e){return e.status="uploading",e.uploadProcess=0,this.store.updateFileItem(e),new Promise((t,s)=>{var r;let i=new m(this.store).request("POST",this.store.options.uploadUrl);i.setRequestHeader("accept","application/json"),i.upload.addEventListener("progress",o=>{e.uploadProcess=o.loaded/o.total*100,this.store.updateFileItem(e)}),i.addEventListener("load",()=>{if(i.status===200){if(t(i.response),i.response){const o=JSON.parse(i.response);o.filename&&(e.name=o.filename)}e.status="uploaded",this.store.updateFileItem(e),this.upload()}else s(i.response),e.status="error",this.store.updateFileItem(e),this.upload()});let a=new FormData;e.data&&a.append("file",e.data),((r=this.store.options)==null?void 0:r.maxFileSize)&&a.append("max_file_size",this.store.options.maxFileSize*1024),i.send(a)})}}function p(n,e){if(L(window.huplyTranslations[n])){let t=window.huplyTranslations[n];return e&&Object.entries(e).forEach(s=>{t=t.replace("{{"+s[0]+"}}",s[1])}),t}else return"{{"+n+"}}"}class q{constructor(e){l(this,"store");this.store=e}checkFileSize(e){var t;return!(((t=this.store.options)==null?void 0:t.maxFileSize)&&e.size>this.store.options.maxFileSize*1024*1024)}checkFileType(e){const t=e.name.split(".");return this.store.options.allowedFileTypes.includes("."+t[t.length-1].toLowerCase())}isValidFile(e){const t=[];return this.checkFileSize(e)||t.push({msg:p("fileItemStatusErrorFileSize",{maxFileSize:this.store.options.maxFileSize})}),this.checkFileType(e)||t.push({msg:p("fileItemStatusErrorFileType",{allowedFileTypes:this.store.options.allowedFileTypes.join(",")})}),t}}function P(){return Math.random().toString(36).substring(2)+Date.now().toString(36)}function B(n){let e=0;const t=Number(n);return j(t)?e=t.toFixed(2).replace(".",","):J(t)&&(e=t),e}class C{constructor(e){l(this,"store");this.store=e}generateFileItemFromFile(e){return new Promise(t=>{var i;let s={id:P(),name:e.name,size:(i=e.size)!=null?i:0,sizeMb:e.size?e.size/1024/1024:0,sizeKb:e.size?Number((e.size/1024).toFixed(0)):0,status:"waiting",uploadProcess:0,data:e};this.checkIfIsImage(e.name)&&s.size&&s.size<=this.store.maxSizeImageView?this.getDataUrlFromFile(e).then(a=>{s.url=a,t(s)}):t(s)})}generateFileItemFromPreloaded(e){return new Promise(t=>{var i;let s={id:P(),name:e.name,size:(i=e.size)!=null?i:0,sizeMb:e.size?e.size/1024/1024:0,sizeKb:e.size?Number((e.size/1024).toFixed(0)):0,uploadProcess:0,status:"preloaded"};this.checkIfIsImage(e.name)&&s.size&&s.size<=this.store.maxSizeImageView&&e.url?this.getBlobFromUrl(e.url).then(a=>{this.getDataUrlFromFile(a).then(r=>{s.url=r,t(s)})}):t(s)})}getDataUrlFromFile(e){return new Promise(t=>{const s=new FileReader;s.readAsDataURL(e),s.addEventListener("load",function(){t(s.result)},!1)})}getBlobFromUrl(e){return new Promise((t,s)=>{const i=new m(this.store).request("GET",e);i.responseType="blob",i.send(),i.addEventListener("load",()=>{i.status===200?t(i.response):s(!1)})})}checkIfIsImage(e){const t=e.split(".");return this.store.imgExt.includes("."+t[t.length-1])}}class K{constructor(e,t){l(this,"el");var s,i;this.el=e.cloneNode(!0),this.el.setAttribute("name",`${e.getAttribute("name")}_real'`),this.el.classList.add("huply-input"),((s=t.options)==null?void 0:s.allowedFileTypes)&&this.el.setAttribute("accept",(i=t.options)==null?void 0:i.allowedFileTypes.join(",")),this.el.addEventListener("change",a=>{a.preventDefault(),a.target&&[...a.target.files].forEach(r=>{const h=new q(t).isValidFile(r);new C(t).generateFileItemFromFile(r).then(d=>{t.addFileItem(d),h.length!==0&&(d.status="error",d.statusMsg=h.map(u=>u.msg).join(", "),t.updateFileItem(d)),new I(t).upload()})})})}render(){return this.el}}class _{constructor(e,t){l(this,"fileItem");l(this,"listElement");l(this,"store");this.fileItem=e,this.store=t,this.store.events.subscribe("fileItemUpdate",s=>{this.fileItem.id===s.id&&(this.updateHeadline(s),this.updateSubline(s),this.updateListEl(s))}),this.store.events.subscribe("fileDeleted",s=>{this.fileItem.id===s.id&&this.listElement.remove()})}render(){const e=this.getListEl();e.appendChild(this.getVisual());const t=document.createElement("div");return t.appendChild(this.getHeadline()),t.appendChild(this.getSubline()),e.appendChild(t),e.appendChild(this.getActions()),this.listElement=e,e}getListEl(){const e=document.createElement("li");return e.classList.add("huply-file-item"),e}updateListEl(e){this.listElement.classList.remove("is-uploading"),this.listElement.classList.remove("is-preloaded"),this.listElement.classList.remove("is-error"),this.listElement.classList.remove("is-deleted"),e.status==="uploading"?this.listElement.classList.add("is-uploading"):e.status==="preloaded"?this.listElement.classList.add("is-preloaded"):e.status==="error"?this.listElement.classList.add("is-error"):e.status==="uploaded"?this.listElement.classList.add("is-uploaded"):e.status==="deleted"&&this.listElement.classList.add("is-deleted")}getSubline(){const e=document.createElement("p");return e.classList.add("huply-file-item-subline"),e.textContent=p("fileItemStatusWaiting"),e}updateSubline(e){var s;const t=this.listElement.querySelector(".huply-file-item-subline");t&&(e.status==="uploading"?e.uploadProcess&&(t.textContent=p("fileItemStatusUploading")+" ("+e.uploadProcess.toFixed(0)+"%)"):e.status==="error"?t.textContent=(s=e.statusMsg)!=null?s:p("fileItemStatusError"):(e.status==="uploaded"||e.status==="preloaded")&&(t.textContent=e.sizeMb&&e.sizeMb<1?`${e.sizeKb} KB`:`${B(e.sizeMb)} MB`))}getHeadline(){const e=document.createElement("p");return e.textContent=this.fileItem.name,e.classList.add("huply-file-item-headline"),e}updateHeadline(e){const t=this.listElement.querySelector(".huply-file-item-headline");t&&(t.textContent=e.name)}getVisual(){const e=document.createElement("div");if(e.classList.add("huply-file-item-visual"),new C(this.store).checkIfIsImage(this.fileItem.name))if(this.fileItem.url){const s=document.createElement("img");s.classList.add("is-hidden"),e.appendChild(s),s.setAttribute("src",this.fileItem.url),setTimeout(()=>{s.classList.remove("is-hidden")},5)}else e.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M152 120c-26.51 0-48 21.49-48 48s21.49 48 48 48s48-21.49 48-48S178.5 120 152 120zM447.1 32h-384C28.65 32-.0091 60.65-.0091 96v320c0 35.35 28.65 64 63.1 64h384c35.35 0 64-28.65 64-64V96C511.1 60.65 483.3 32 447.1 32zM463.1 409.3l-136.8-185.9C323.8 218.8 318.1 216 312 216c-6.113 0-11.82 2.768-15.21 7.379l-106.6 144.1l-37.09-46.1c-3.441-4.279-8.934-6.809-14.77-6.809c-5.842 0-11.33 2.529-14.78 6.809l-75.52 93.81c0-.0293 0 .0293 0 0L47.99 96c0-8.822 7.178-16 16-16h384c8.822 0 16 7.178 16 16V409.3z"/></svg>';else e.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><path d="M365.3 93.38l-74.63-74.64C278.6 6.743 262.3 0 245.4 0L64-.0001c-35.35 0-64 28.65-64 64l.0065 384c0 35.35 28.65 64 64 64H320c35.2 0 64-28.8 64-64V138.6C384 121.7 377.3 105.4 365.3 93.38zM320 464H64.02c-8.836 0-15.1-7.163-16-15.1L48 64.13c-.0004-8.837 7.163-16 16-16h160L224 128c0 17.67 14.33 32 32 32h79.1v288C336 456.8 328.8 464 320 464z"/></svg>';return e}getActions(){const e=document.createElement("div");e.classList.add("huply-file-item-actions");const t=this.getDeleteAction();return e.appendChild(t),e}getDeleteAction(){const e=document.createElement("a");return e.setAttribute("href","#"),e.classList.add("huply-file-item-actions-delete"),e.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M424 80C437.3 80 448 90.75 448 104C448 117.3 437.3 128 424 128H412.4L388.4 452.7C385.9 486.1 358.1 512 324.6 512H123.4C89.92 512 62.09 486.1 59.61 452.7L35.56 128H24C10.75 128 0 117.3 0 104C0 90.75 10.75 80 24 80H93.82L130.5 24.94C140.9 9.357 158.4 0 177.1 0H270.9C289.6 0 307.1 9.358 317.5 24.94L354.2 80H424zM177.1 48C174.5 48 171.1 49.34 170.5 51.56L151.5 80H296.5L277.5 51.56C276 49.34 273.5 48 270.9 48H177.1zM364.3 128H83.69L107.5 449.2C108.1 457.5 115.1 464 123.4 464H324.6C332.9 464 339.9 457.5 340.5 449.2L364.3 128z"/></svg>',e.addEventListener("click",t=>{t.preventDefault(),this.store.deleteFileItem(this.fileItem)}),e}}class G{constructor(e){l(this,"fileList");l(this,"store");this.store=e,this.fileList=document.createElement("ul"),this.fileList.classList.add("huply-file-list"),this.store.options.multiple&&e.events.subscribe("fileAdded",t=>{this.addChild(t)})}render(){return this.fileList}addChild(e){const t=new _(e,this.store);this.fileList.appendChild(t.render())}}class O{constructor(e){l(this,"store");l(this,"dropzone");l(this,"headline");l(this,"subline");l(this,"uploadIcon");l(this,"deleteIcon");l(this,"descWrapper");l(this,"baseCssClass","");this.store=e,this.store.options.multiple||(e.events.subscribe("fileItemUpdate",t=>{this.updateHeadline(t),this.updateSubline(t),this.updateUploadIcon(t),this.updateDeleteIcon(t),this.updateDescriptionWrapper(t)}),e.events.subscribe("fileDeleted",t=>{this.updateHeadline(t),this.updateSubline(t),this.updateUploadIcon(t),this.updateDeleteIcon(t),this.updateDescriptionWrapper(t)}))}render(){return this.dropzone=document.createElement("div"),this.baseCssClass&&this.dropzone.classList.add(this.baseCssClass),this.getTemplate(),this.setEvents(),this.dropzone}getTemplate(){}setEvents(){this.dropzone&&(this.dropzone.addEventListener("click",()=>{var e;(e=this.store.components.input)==null||e.click()}),this.dropzone.addEventListener("dragover",e=>{var t;e.preventDefault(),(t=this.dropzone)==null||t.classList.add("is-dragover")}),this.dropzone.addEventListener("dragleave",e=>{var t;e.preventDefault(),(t=this.dropzone)==null||t.classList.remove("is-dragover")}),this.dropzone.addEventListener("drop",e=>{e.preventDefault();const t=new I(this.store);if(e.dataTransfer)for(var s=0;s<e.dataTransfer.items.length;s++){const i=e.dataTransfer.items[s].getAsFile();if(i){const r=new q(this.store).isValidFile(i);new C(this.store).generateFileItemFromFile(i).then(o=>{this.store.addFileItem(o),r.length!==0&&(o.status="error",o.statusMsg=r.map(h=>h.msg).join(", "),this.store.updateFileItem(o)),t.upload()})}}}))}getDescriptionWrapper(){return this.descWrapper=document.createElement("div"),this.descWrapper.classList.add(this.baseCssClass+"-desc"),this.descWrapper}updateDescriptionWrapper(e){this.descWrapper&&(this.descWrapper.classList.remove("is-uploading"),this.descWrapper.classList.remove("is-preloaded"),this.descWrapper.classList.remove("is-error"),this.descWrapper.classList.remove("is-uploaded"),e.status==="uploading"?this.descWrapper.classList.add("is-uploading"):e.status==="preloaded"?this.descWrapper.classList.add("is-preloaded"):e.status==="error"?this.descWrapper.classList.add("is-error"):e.status==="uploaded"&&this.descWrapper.classList.add("is-uploaded"))}getUploadIcon(){return this.uploadIcon=document.createElement("div"),this.uploadIcon.classList.add(this.baseCssClass+"-icon-upload"),this.uploadIcon.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path d="M303 175C312.4 165.7 327.6 165.7 336.1 175L416.1 255C426.3 264.4 426.3 279.6 416.1 288.1C407.6 298.3 392.4 298.3 383 288.1L344 249.9V384C344 397.3 333.3 408 320 408C306.7 408 296 397.3 296 384V249.9L256.1 288.1C247.6 298.3 232.4 298.3 223 288.1C213.7 279.6 213.7 264.4 223 255L303 175zM144 480C64.47 480 0 415.5 0 336C0 273.3 40.07 219.1 96 200.2V200C96 107.2 171.2 32 264 32C314.9 32 360.4 54.6 391.3 90.31C406.2 83.68 422.6 80 440 80C506.3 80 560 133.7 560 200C560 206.6 559.5 213 558.5 219.3C606.5 240.3 640 288.3 640 344C640 416.4 583.4 475.6 512 479.8V480H144zM264 80C197.7 80 144 133.7 144 200L144 234.1L111.1 245.5C74.64 258.7 48 294.3 48 336C48 389 90.98 432 144 432H506.6L509.2 431.8C555.4 429.2 592 390.8 592 344C592 308 570.4 276.9 539.2 263.3L505.1 248.4L511.1 211.7C511.7 207.9 512 204 512 200C512 160.2 479.8 128 440 128C429.5 128 419.6 130.2 410.8 134.2L378.2 148.7L354.9 121.7C332.8 96.08 300.3 80 263.1 80L264 80z"/></svg>',this.uploadIcon}updateUploadIcon(e){this.uploadIcon&&(e.status==="uploading"&&e.uploadProcess===0?this.uploadIcon.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M264 24C264 10.75 274.7 0 288 0C429.4 0 544 114.6 544 256C544 302.6 531.5 346.4 509.7 384C503.1 395.5 488.4 399.4 476.9 392.8C465.5 386.2 461.5 371.5 468.2 360C485.9 329.4 496 293.9 496 255.1C496 141.1 402.9 47.1 288 47.1C274.7 47.1 264 37.25 264 23.1V24z"/></svg>':e.status==="error"?this.uploadIcon.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 464c-114.7 0-208-93.31-208-208S141.3 48 256 48s208 93.31 208 208S370.7 464 256 464zM256 304c13.25 0 24-10.75 24-24v-128C280 138.8 269.3 128 256 128S232 138.8 232 152v128C232 293.3 242.8 304 256 304zM256 337.1c-17.36 0-31.44 14.08-31.44 31.44C224.6 385.9 238.6 400 256 400s31.44-14.08 31.44-31.44C287.4 351.2 273.4 337.1 256 337.1z"/></svg>':e.status==="uploaded"?this.uploadIcon.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M243.8 339.8C232.9 350.7 215.1 350.7 204.2 339.8L140.2 275.8C129.3 264.9 129.3 247.1 140.2 236.2C151.1 225.3 168.9 225.3 179.8 236.2L224 280.4L332.2 172.2C343.1 161.3 360.9 161.3 371.8 172.2C382.7 183.1 382.7 200.9 371.8 211.8L243.8 339.8zM512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM256 48C141.1 48 48 141.1 48 256C48 370.9 141.1 464 256 464C370.9 464 464 370.9 464 256C464 141.1 370.9 48 256 48z"/></svg>':e.status==="deleted"&&this.store.getFilesUploading().length===0?this.uploadIcon.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path d="M303 175C312.4 165.7 327.6 165.7 336.1 175L416.1 255C426.3 264.4 426.3 279.6 416.1 288.1C407.6 298.3 392.4 298.3 383 288.1L344 249.9V384C344 397.3 333.3 408 320 408C306.7 408 296 397.3 296 384V249.9L256.1 288.1C247.6 298.3 232.4 298.3 223 288.1C213.7 279.6 213.7 264.4 223 255L303 175zM144 480C64.47 480 0 415.5 0 336C0 273.3 40.07 219.1 96 200.2V200C96 107.2 171.2 32 264 32C314.9 32 360.4 54.6 391.3 90.31C406.2 83.68 422.6 80 440 80C506.3 80 560 133.7 560 200C560 206.6 559.5 213 558.5 219.3C606.5 240.3 640 288.3 640 344C640 416.4 583.4 475.6 512 479.8V480H144zM264 80C197.7 80 144 133.7 144 200L144 234.1L111.1 245.5C74.64 258.7 48 294.3 48 336C48 389 90.98 432 144 432H506.6L509.2 431.8C555.4 429.2 592 390.8 592 344C592 308 570.4 276.9 539.2 263.3L505.1 248.4L511.1 211.7C511.7 207.9 512 204 512 200C512 160.2 479.8 128 440 128C429.5 128 419.6 130.2 410.8 134.2L378.2 148.7L354.9 121.7C332.8 96.08 300.3 80 263.1 80L264 80z"/></svg>':e.status==="preloaded"&&(this.uploadIcon.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M454.7 288.1c-12.78-3.75-26.06 3.594-29.75 16.31C403.3 379.9 333.8 432 255.1 432c-66.53 0-126.8-38.28-156.5-96h100.4c13.25 0 24-10.75 24-24S213.2 288 199.9 288h-160c-13.25 0-24 10.75-24 24v160c0 13.25 10.75 24 24 24s24-10.75 24-24v-102.1C103.7 436.4 176.1 480 255.1 480c99 0 187.4-66.31 215.1-161.3C474.8 305.1 467.4 292.7 454.7 288.1zM472 16C458.8 16 448 26.75 448 40v102.1C408.3 75.55 335.8 32 256 32C157 32 68.53 98.31 40.91 193.3C37.19 206 44.5 219.3 57.22 223c12.84 3.781 26.09-3.625 29.75-16.31C108.7 132.1 178.2 80 256 80c66.53 0 126.8 38.28 156.5 96H312C298.8 176 288 186.8 288 200S298.8 224 312 224h160c13.25 0 24-10.75 24-24v-160C496 26.75 485.3 16 472 16z"/></svg>'))}getDeleteIcon(){return this.deleteIcon=document.createElement("a"),this.deleteIcon.setAttribute("href","#"),this.deleteIcon.classList.add(this.baseCssClass+"-icon-delete"),this.deleteIcon.classList.add("is-hidden"),this.deleteIcon.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M424 80C437.3 80 448 90.75 448 104C448 117.3 437.3 128 424 128H412.4L388.4 452.7C385.9 486.1 358.1 512 324.6 512H123.4C89.92 512 62.09 486.1 59.61 452.7L35.56 128H24C10.75 128 0 117.3 0 104C0 90.75 10.75 80 24 80H93.82L130.5 24.94C140.9 9.357 158.4 0 177.1 0H270.9C289.6 0 307.1 9.358 317.5 24.94L354.2 80H424zM177.1 48C174.5 48 171.1 49.34 170.5 51.56L151.5 80H296.5L277.5 51.56C276 49.34 273.5 48 270.9 48H177.1zM364.3 128H83.69L107.5 449.2C108.1 457.5 115.1 464 123.4 464H324.6C332.9 464 339.9 457.5 340.5 449.2L364.3 128z"/></svg>',this.deleteIcon.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation();const t=this.store.files.findIndex(s=>{var i;return((i=this.deleteIcon)==null?void 0:i.getAttribute("data-file-id"))==s.id});t!==-1&&this.store.deleteFileItem(this.store.files[t])}),this.deleteIcon}updateDeleteIcon(e){this.deleteIcon&&(e.status==="uploaded"||e.status==="preloaded"?(this.deleteIcon.classList.remove("is-hidden"),this.deleteIcon.setAttribute("data-file-id",e.id)):this.deleteIcon.classList.add("is-hidden"))}getHeadline(){return this.headline=document.createElement("p"),this.headline.classList.add(this.baseCssClass+"-headline"),this.headline.innerHTML=this.getHeadlineText(),this.headline}getHeadlineText(){var e;return`<strong>${((e=this.store)==null?void 0:e.options.multiple)?p("chooseFiles"):p("chooseFile")}</strong>`}updateHeadline(e){this.headline&&(e.status==="deleted"?this.headline.innerHTML=this.getHeadlineText():this.headline.innerHTML=`<strong>${e.name}</strong>`)}getSubline(){return this.subline=document.createElement("p"),this.subline.innerText=this.getSublineText(),this.subline.classList.add(this.baseCssClass+"-subline"),this.subline}getSublineText(){var t,s;const e=[];return e.push(p("allowedFileTypes",{allowedFileTypes:(t=this.store)==null?void 0:t.options.allowedFileTypes})),e.push(p("maxFileSize",{maxFileSize:(s=this.store)==null?void 0:s.options.maxFileSize})),e.join(", ")}updateSubline(e){var t;this.subline&&(this.subline.classList.remove("is-uploading"),this.subline.classList.remove("is-preloaded"),this.subline.classList.remove("is-error"),this.subline.classList.remove("is-uploaded"),e.status==="uploading"&&e.uploadProcess?this.subline.innerHTML=p("fileItemStatusUploading")+" ("+e.uploadProcess.toFixed(0)+"%)":e.status==="error"?this.subline.innerHTML=(t=e.statusMsg)!=null?t:p("fileItemStatusError"):e.status==="uploaded"||e.status==="preloaded"?this.subline.textContent=e.sizeMb&&e.sizeMb<1?`${e.sizeKb} KB`:`${B(e.sizeMb)} MB`:this.subline.innerHTML=this.getSublineText())}}class X extends O{constructor(e){super(e);l(this,"baseCssClass","huply-dropzone-lg")}getTemplate(){if(this.dropzone){this.dropzone.appendChild(this.getDeleteIcon());const e=this.getDescriptionWrapper();return e.appendChild(this.getUploadIcon()),e.appendChild(this.getHeadline()),e.appendChild(this.getSubline()),this.dropzone.appendChild(e),this.dropzone}}}class Q extends O{constructor(e){super(e);l(this,"baseCssClass","huply-dropzone-sm");this.store.options.multiple||(e.events.subscribe("fileItemUpdate",t=>{this.updateWrapper(t)}),e.events.subscribe("fileDeleted",t=>{this.updateWrapper(t)}))}getTemplate(){if(this.dropzone){const e=this.getWrapper();return e.appendChild(this.getHeadline()),e.appendChild(this.getSubline()),e.appendChild(this.getUploadIcon()),e.appendChild(this.getDeleteIcon()),this.dropzone.appendChild(e),this.dropzone}}getWrapper(){return this.descWrapper=document.createElement("div"),this.descWrapper.classList.add("huply-dropzone-sm-wrapper"),this.descWrapper}updateWrapper(e){this.descWrapper&&(this.descWrapper.classList.remove("is-uploading"),this.descWrapper.classList.remove("is-preloaded"),this.descWrapper.classList.remove("is-error"),this.descWrapper.classList.remove("is-uploaded"),e.status==="uploading"?this.descWrapper.classList.add("is-uploading"):e.status==="preloaded"?this.descWrapper.classList.add("is-preloaded"):e.status==="error"?this.descWrapper.classList.add("is-error"):e.status==="uploaded"&&this.descWrapper.classList.add("is-uploaded"))}}class Y{constructor(e,t){l(this,"el");l(this,"input");this.el=e,this.input=document.createElement("input"),t.events.subscribe("fileItemUpdate",()=>{this.input.setAttribute("value",JSON.stringify(t.getCategorizedFiles()))}),t.events.subscribe("fileDeleted",()=>{this.input.setAttribute("value",JSON.stringify(t.getCategorizedFiles()))})}render(){this.input.setAttribute("type","hidden");const e=this.el.getAttribute("name");return e&&this.input.setAttribute("name",e),this.input}}class Z{constructor(e,t){l(this,"el");l(this,"store");this.el=e,this.store=t}render(){const e=document.createElement("div");e.classList.add("huply-wrapper");const t=new K(this.el,this.store).render();e.appendChild(t);const s=new Y(this.el,this.store).render();e.appendChild(s);let i;this.store.options.dropzoneTheme==="sm"?(i=new Q(this.store),e.appendChild(i.render())):(i=new X(this.store),e.appendChild(i.render()));const a=new G(this.store);return e.appendChild(a.render()),this.store.setComponent("input",t),this.store.setComponent("dropzone",i),this.store.setComponent("fileList",a),e}}var ee={chooseFiles:"Dateien ausw\xE4hlen",chooseFile:"Datei ausw\xE4hlen",allowedFileTypes:"Erlaubte Dateitypen: {{allowedFileTypes}}",maxFileSize:"Maximale Dateigr\xF6\xDFe: {{maxFileSize}} MB",fileItemStatusWaiting:"In Warteschlange",fileItemStatusUploading:"Wird hochgeladen",fileItemStatusUploaded:"Erfolgreich hochgeladen",fileItemStatusPreloaded:"Bereits hochgeladen",fileItemStatusError:"Ein Fehler ist aufgetreten.",fileItemStatusErrorFileSize:"Die Dateigr\xF6\xDFe \xFCberschreitet die Maximalgr\xF6\xDFe: {{maxFileSize}} MB",fileItemStatusErrorFileType:"Der Dateityp ist nicht erlaubt. Erlaubte Dateitypen: {{allowedFileTypes}}",delete:"L\xF6schen"},te={chooseFiles:"Choose files",chooseFile:"Choose file",allowedFileTypes:"Allowed file types: {{allowedFileTypes}}",maxFileSize:"Maximum file size: {{maxFileSize}} MB",fileItemStatusWaiting:"In queue",fileItemStatusUploading:"Uploading ...",fileItemStatusUploaded:"Uploaded",fileItemStatusPreloaded:"Already uploaded",fileItemStatusError:"An error occured.",fileItemStatusErrorFileSize:"The file size exceeds the maximum size: {{maxFileSize}} MB",fileItemStatusErrorFileType:"The file type is not allowed. Allowed file types: {{allowedFileTypes}}",delete:"Delete"};class se{constructor(){l(this,"events",{})}subscribe(e,t){return L(this.events[e])||(this.events[e]=[]),this.events[e].push(t)}publish(e,t={}){return L(this.events[e])?this.events[e].map(s=>s(t)):[]}}class ie{constructor(){l(this,"events");l(this,"files");l(this,"components");l(this,"translations");l(this,"options");l(this,"maxSizeImageView");l(this,"imgExt");this.events=new se,this.components={},this.files=[],this.translations={},this.options={allowedFileTypes:[],multiple:!1,uploadUrl:"",dropzoneTheme:"lg"},this.maxSizeImageView=2e6,this.imgExt=[".jpg",".jpeg",".png"]}addFileItem(e){!this.options.multiple&&this.files.length&&this.files.forEach(t=>{this.deleteFileItem(t)}),this.files.push(e),this.events.publish("fileAdded",e)}updateFileItem(e){const t=this.files.findIndex(s=>s.id===e.id);t!==-1&&(this.files[t]=e,this.events.publish("fileItemUpdate",e),e.status==="uploaded"&&(this.events.publish("fileUploaded",e),this.getFilesUploading().length===0&&this.events.publish("filesUploaded",e)))}deleteFileItem(e){if(this.options.deleteUrl&&e.status==="uploaded"){let t=new m(this).request("DELETE",this.options.deleteUrl.replace("{{filename}}",encodeURI(e.name)));t.setRequestHeader("accept","application/json");let s=new FormData;s.append("filename",e.name),t.send(s),t.addEventListener("load",()=>{t.status===200?(this.files=this.files.filter(i=>e.id!==i.id),e.status="deleted",this.events.publish("fileDeleted",e)):(e.status="error",this.events.publish("fileItemUpdate",e))})}else e.status="deleted",this.events.publish("fileDeleted",e)}getCategorizedFiles(){return{uploaded:this.getFilesUploaded(),preloaded:this.getFilesPreloaded(),deleted:this.getFilesDeleted()}}getFilesDeleted(){return this.files.filter(e=>e.status==="deleted")}getFilesPreloaded(){return this.files.filter(e=>e.status==="preloaded")}getFilesUploaded(){return this.files.filter(e=>e.status==="uploaded")}getFilesWaiting(){return this.files.filter(e=>e.status==="waiting")}getFilesUploading(){return this.files.filter(e=>e.status==="uploading")}setComponent(e,t){this.components[e]=t}setTranslations(e){this.translations=e}setOptions(e){this.options=e}}class ne{constructor(e,t){l(this,"options");l(this,"el");l(this,"store");var i;if(!$(e))throw new Error('Selected element is not type of "Element". Current type: '+typeof e);this.el=e,this.store=new ie,this.options=this.parseOptions(t),this.options&&this.store.setOptions(this.options),this.validateOptions(this.options);const s={de:ee,en:te};if(v(window.huplyTranslations))this.store.setTranslations(window.huplyTranslations);else{const a=(i=document.querySelector("html"))==null?void 0:i.getAttribute("lang");a==="en"||a==="de"?(window.huplyTranslations=s[this.options.lang],this.store.setTranslations(s[this.options.lang])):(window.huplyTranslations=s.en,this.store.setTranslations(s.en))}return this}init(){var e,t,s;if(this.el){const i=new Z(this.el,this.store).render();((e=this.el)==null?void 0:e.parentNode)&&this.el.parentNode.replaceChild(i,this.el),this.el=i.querySelector(this.el.tagName)}if((s=(t=this.options)==null?void 0:t.preloadedFiles)==null?void 0:s.length){const i=new C(this.store);this.options.preloadedFiles.forEach(a=>{i.generateFileItemFromPreloaded(a).then(r=>{this.store.addFileItem(r),r.status="preloaded",this.store.updateFileItem(r)})})}return this}parseOptions(e){var w,b,S,E,x,T,M,H,y,U,D,W;let t={multiple:!1,maxConcurrentUploads:3,maxFileSize:5,lang:"de",uploadUrl:"",deleteUrl:"",allowedFileTypes:[".jpg",".jpeg",".png",".pdf",".zip",".mp4"],dropzoneTheme:"lg"};v(e)&&(t=F(F({},t),e)),t.multiple=(w=this.el)==null?void 0:w.hasAttribute("multiple");const s=(b=this.el)==null?void 0:b.getAttribute("data-dropzone-theme");s&&(t.dropzoneTheme=s);const i=(S=this.el)==null?void 0:S.getAttribute("data-max-concurrent-uploads");i&&(t.maxConcurrentUploads=Number(i));const a=(E=this.el)==null?void 0:E.getAttribute("data-max-file-size");a&&(t.maxFileSize=Number(a));const r=(x=this.el)==null?void 0:x.getAttribute("data-upload-url");r&&(t.uploadUrl=r);const o=(T=this.el)==null?void 0:T.getAttribute("data-delete-url");o&&(t.deleteUrl=o);const h=(M=this.el)==null?void 0:M.getAttribute("data-headers");h&&(t.headers=JSON.parse(h));const d=(H=this.el)==null?void 0:H.getAttribute("data-preloaded-files");if(d)try{const V=atob(d);t.preloadedFiles=JSON.parse(V)}catch{t.preloadedFiles=[]}const u=(y=this.el)==null?void 0:y.getAttribute("data-lang");u&&(t.lang=u);const c=(U=this.el)==null?void 0:U.getAttribute("data-translations");c&&(t.translations=JSON.parse(c));const g=(D=this.el)==null?void 0:D.getAttribute("accept");g&&(t.allowedFileTypes=g.split(","));const z=(W=this.el)==null?void 0:W.getAttribute("data-chunk-size");return z&&(t.chunkSize=Number(z)),t}validateOptions(e){if(!e.uploadUrl||e.uploadUrl.length===0)throw new Error('Option "uploadUrl" not set');if(!e.deleteUrl||e.deleteUrl.length===0)throw new Error('Option "deleteUrl" not set')}on(e,t){this.store.events.subscribe(e,t)}}module.exports=ne;
|
|
2
2
|
//# sourceMappingURL=huply.cjs.js.map
|
package/dist/huply.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"huply.cjs.js","sources":["../src/helpers/TypeHelper.ts","../src/services/HttpRequestService.ts","../src/services/UploadService.ts","../src/helpers/LangHelper.ts","../src/services/FileValidationService.ts","../src/helpers/OutputHelper.ts","../src/services/FileService.ts","../src/components/FileInputComponent.ts","../src/components/FileListItemComponent.ts","../src/components/FileListComponent.ts","../src/components/FileDropzoneComponent.ts","../src/components/FileDropzoneLgComponent.ts","../src/components/FileDropzoneSmallComponent.ts","../src/components/FileInputHiddenComponent.ts","../src/components/WrapperComponent.ts","../src/lang/de.ts","../src/lang/en.ts","../src/store/PubSub.ts","../src/store/AppStore.ts","../src/main.ts"],"sourcesContent":["function isObject(obj: any): boolean {\n return obj !== undefined && obj !== null && obj.constructor === Object;\n}\n\nfunction isElement(el: any): boolean {\n return el instanceof Element;\n}\n\nfunction isArray(arr: any): boolean {\n return arr !== undefined && arr !== null && arr.constructor === Array;\n}\n\nfunction isPromise(p: any): boolean {\n return typeof p === 'object' && typeof p.then === 'function';\n}\n\nfunction returnsPromise(f: any): boolean {\n return f.constructor.name === 'AsyncFunction' || (typeof f === 'function' && isPromise(f()));\n}\n\nfunction isFunction(f: any): boolean {\n return f instanceof Function;\n}\n\nfunction isset(obj: any): boolean {\n return obj !== undefined;\n}\n\nfunction isFloat(obj: any): boolean {\n return obj !== undefined && obj !== null && !!(obj % 1);\n}\n\nfunction isInteger(obj: any): boolean {\n return obj !== undefined && obj !== null && parseInt(obj, 10) === obj;\n}\n\n\nexport { isObject, isElement, isArray, returnsPromise, isFunction, isset, isFloat, isInteger };\n","import AppStore from \"../store/AppStore\";\nimport {isObject} from \"../helpers/TypeHelper\";\n\nexport default class HttpRequestService {\n private store: AppStore;\n\n constructor(store: AppStore) {\n this.store = store;\n }\n\n request(method: string, url: string): XMLHttpRequest {\n let request = new XMLHttpRequest();\n if(this.store.options.withCredentials) {\n request.withCredentials = this.store.options.withCredentials;\n }\n request.open(method, url);\n if(isObject(this.store.options.headers)) {\n // @ts-ignore\n Object.entries(this.store.options.headers).forEach((item) => {\n // @ts-ignore\n request.setRequestHeader(item[0], item[1]);\n });\n }\n\n return request;\n }\n}\n","import AppStore from \"../store/AppStore\";\nimport FileItemInterface from \"../interfaces/FileItemInterface\";\nimport HttpRequestService from \"./HttpRequestService\";\n\nexport default class UploadService {\n private store: AppStore;\n\n constructor(store: AppStore) {\n this.store = store;\n }\n\n upload() {\n const filesWaiting = this.store.getFilesWaiting();\n if(filesWaiting.length) {\n filesWaiting.forEach((fileItem) => {\n // Set uploading status\n fileItem.status = 'uploading';\n fileItem.uploadProcess = 0;\n this.store.updateFileItem(fileItem);\n\n if(this.store.options.chunkSize) {\n this.sendChunkedFile(fileItem, 0);\n } else {\n this.sendFile(fileItem);\n }\n });\n }\n }\n\n sendChunkedFile(fileItem: FileItemInterface, start: number) {\n\n if(this.store.options.chunkSize && fileItem.size && fileItem.data) {\n // Slicing file\n const sliceSize = this.store.options.chunkSize * 1024 * 1024;\n const sliceEnd = start + sliceSize;\n const nextSlice = sliceEnd + 1;\n const chunkEnd = Math.min(sliceEnd , fileItem.size);\n const chunk = fileItem.data.slice(start, nextSlice);\n\n // Check if upload is complete\n let request = new HttpRequestService(this.store).request('POST', this.store.options.uploadUrl);\n const contentRange = \"bytes \"+ start+\"-\"+ chunkEnd+\"/\"+fileItem.size;\n request.setRequestHeader(\"Content-Range\",contentRange);\n\n // request finished event\n request.addEventListener('load', () => {\n if(request.status === 200) {\n if(request.response) {\n const resp = JSON.parse(request.response);\n if(resp.filename) {\n fileItem.name = resp.filename;\n }\n }\n\n if(fileItem.size) {\n fileItem.uploadProcess = Math.min(Math.ceil((sliceEnd / fileItem.size) * 100), 100);\n }\n\n if(chunkEnd === fileItem.size) {\n fileItem.status = 'uploaded';\n this.store.updateFileItem(fileItem);\n this.upload();\n } else {\n this.store.updateFileItem(fileItem);\n this.sendChunkedFile(fileItem, nextSlice);\n }\n\n } else {\n fileItem.status = 'error';\n this.store.updateFileItem(fileItem);\n this.upload();\n }\n });\n\n let data = new FormData();\n data.append('file', chunk, fileItem.name);\n if(this.store.options?.maxFileSize) {\n // @ts-ignore\n data.append('max_file_size', this.store.options.maxFileSize * 1024);\n }\n\n request.send(data);\n }\n }\n\n sendFile(fileItem: FileItemInterface) {\n fileItem.status = 'uploading';\n fileItem.uploadProcess = 0;\n this.store.updateFileItem(fileItem);\n\n return new Promise((resolve, reject) => {\n let request = new HttpRequestService(this.store).request('POST', this.store.options.uploadUrl);\n request.setRequestHeader('accept', 'application/json');\n\n // upload progress event\n request.upload.addEventListener('progress', (e) => {\n // upload progress as percentage\n fileItem.uploadProcess = (e.loaded / e.total)*100;\n this.store.updateFileItem(fileItem);\n });\n\n // request finished event\n request.addEventListener('load', () => {\n if(request.status === 200) {\n resolve(request.response);\n if(request.response) {\n const resp = JSON.parse(request.response);\n if(resp.filename) {\n fileItem.name = resp.filename;\n }\n }\n fileItem.status = 'uploaded';\n this.store.updateFileItem(fileItem);\n this.upload();\n } else {\n reject(request.response);\n fileItem.status = 'error';\n this.store.updateFileItem(fileItem);\n this.upload();\n }\n });\n\n let data = new FormData();\n if(fileItem.data) {\n data.append('file', fileItem.data);\n }\n if(this.store.options?.maxFileSize) {\n // @ts-ignore\n data.append('max_file_size', this.store.options.maxFileSize * 1024);\n }\n\n request.send(data);\n });\n }\n\n}\n","import {isset} from \"./TypeHelper\";\nimport {CustomWindowInterface} from \"../interfaces/CustomWindowInterface\";\ndeclare let window: CustomWindowInterface;\n\nfunction $t(key: string, replacer?: object) {\n if(isset(window.huplyTranslations[key])) {\n let translation = window.huplyTranslations[key];\n if(replacer) {\n Object.entries(replacer).forEach((value) => {\n translation = translation.replace('{{'+value[0]+'}}', value[1]);\n });\n }\n\n return translation;\n } else {\n return '{{'+key+'}}';\n }\n\n\n}\n\nexport {$t};\n","import AppStore from \"../store/AppStore\";\nimport {$t} from \"../helpers/LangHelper\";\nimport ErrorInterface from \"../interfaces/ErrorInterface\";\n\nexport default class FileValidationService {\n private store: AppStore;\n\n constructor(store: AppStore) {\n this.store = store;\n }\n\n checkFileSize(fileItem: File): boolean {\n return !(this.store.options?.maxFileSize && fileItem.size > (this.store.options.maxFileSize * 1024 * 1024));\n }\n\n checkFileType(fileItem: File): boolean {\n const fileItemParts = fileItem.name.split('.');\n return this.store.options.allowedFileTypes.includes('.'+fileItemParts[fileItemParts.length - 1].toLowerCase());\n }\n\n isValidFile(fileItem: File): Array<ErrorInterface> {\n const errorBag: Array<ErrorInterface> = [];\n\n if(!this.checkFileSize(fileItem)) {\n errorBag.push({\n msg: $t('fileItemStatusErrorFileSize', {maxFileSize : this.store.options.maxFileSize})\n });\n }\n\n if(!this.checkFileType(fileItem)) {\n errorBag.push({\n msg: $t('fileItemStatusErrorFileType', {allowedFileTypes : this.store.options.allowedFileTypes.join(',')})\n });\n }\n\n return errorBag;\n }\n}\n","import {isFloat, isInteger} from \"./TypeHelper\";\n\nfunction generateUniqueId() {\n return Math.random().toString(36).substring(2) + Date.now().toString(36);\n}\n\nfunction getHumanNumber(value: number | string): string | number {\n let number: string | number = 0;\n const valueCasted = Number(value);\n if (isFloat(valueCasted)) {\n number = valueCasted.toFixed(2).replace('.', ',');\n } else if (isInteger(valueCasted)) {\n number = valueCasted;\n }\n\n return number;\n}\n\nexport {\n generateUniqueId,\n getHumanNumber\n};\n","import FileItemInterface from \"../interfaces/FileItemInterface\";\nimport {generateUniqueId} from \"../helpers/OutputHelper\";\nimport AppStore from \"../store/AppStore\";\nimport HttpRequestService from \"./HttpRequestService\";\n\nexport default class FileService {\n\n private store: AppStore;\n\n constructor(store: AppStore) {\n this.store = store;\n }\n\n generateFileItem(file: File): Promise<FileItemInterface> {\n return new Promise<FileItemInterface>((resolve) => {\n let fileItem: FileItemInterface = {\n id: generateUniqueId(),\n name: file.name,\n size: file.size,\n sizeMb: file.size ? (file.size / 1024 / 1024) : 0,\n sizeKb: file.size ? Number((file.size / 1024).toFixed(0)) : 0,\n status: 'waiting',\n uploadProcess: 0,\n data: file,\n url: ''\n }\n\n if (this.checkIfIsImage(file.name) && fileItem.size && fileItem.size <= this.store.maxSizeImageView) {\n this.getDataUrlFromFile(file).then((dataUrl) => {\n fileItem.url = dataUrl;\n resolve(fileItem);\n });\n } else {\n resolve(fileItem);\n }\n });\n }\n\n getDataUrlFromFile(file: File | Blob): Promise<string> {\n return new Promise<string>((resolve) => {\n const reader = new FileReader();\n reader.readAsDataURL(file);\n\n reader.addEventListener(\"load\", function () {\n // @ts-ignore\n resolve(reader.result);\n }, false);\n });\n }\n\n getBlobFromUrl(url: string): Promise<Blob> {\n\n return new Promise<Blob>((resolve, reject) => {\n const request = new HttpRequestService(this.store).request('GET', url);\n request.responseType = 'blob';\n request.send();\n request.addEventListener('load', () => {\n if (request.status === 200) {\n resolve(request.response);\n } else {\n reject(false);\n }\n });\n });\n }\n\n checkIfIsImage(filename: string): boolean {\n const splittedFilename = filename.split('.');\n const imgExt = this.store.imgExt;\n\n return imgExt.includes('.'+splittedFilename[splittedFilename.length - 1]);\n }\n}\n","import AppStore from \"../store/AppStore\";\nimport UploadService from \"../services/UploadService\";\nimport FileValidationService from \"../services/FileValidationService\";\nimport FileService from \"../services/FileService\";\n\nclass FileInputComponent {\n private el: HTMLInputElement;\n\n constructor(el: Element, store: AppStore) {\n this.el = el.cloneNode(true) as HTMLInputElement;\n\n // Add default class to input\n this.el.setAttribute('name', `${el.getAttribute('name')}_real'`);\n\n // Add default class to input\n this.el.classList.add('huply-input');\n\n // Add accept - Attribute\n if(store.options?.allowedFileTypes) {\n this.el.setAttribute('accept', store.options?.allowedFileTypes.join(','));\n }\n\n // File added\n this.el.addEventListener('change', (e) => {\n e.preventDefault();\n\n if(e.target) {\n // @ts-ignore\n [...e.target.files].forEach((item) => {\n // Validate file\n const validationService = new FileValidationService(store);\n const validationMsg = validationService.isValidFile(item);\n new FileService(store).generateFileItem(item).then((fileItem) => {\n store.addFileItem(fileItem);\n\n // Check for errors\n if(validationMsg.length !== 0) {\n fileItem.status = 'error';\n fileItem.statusMsg = validationMsg.map((item) => item.msg).join(', ');\n store.updateFileItem(fileItem);\n }\n\n new UploadService(store).upload();\n });\n });\n }\n\n });\n }\n\n render(): HTMLInputElement {\n return this.el;\n }\n}\n\n\nexport default FileInputComponent;\n","import FileItemInterface from \"../interfaces/FileItemInterface\";\nimport {$t} from \"../helpers/LangHelper\";\nimport AppStore from \"../store/AppStore\";\nimport FileService from \"../services/FileService\";\nimport {getHumanNumber} from \"../helpers/OutputHelper\";\n\nclass FileListComponent {\n private fileItem: FileItemInterface;\n private listElement!: HTMLElement;\n private store: AppStore;\n\n constructor(fileItem: FileItemInterface, store: AppStore) {\n this.fileItem = fileItem;\n this.store = store;\n\n // Listen to status changes\n this.store.events.subscribe('fileItemUpdate', (fileItem: FileItemInterface) => {\n if(this.fileItem.id === fileItem.id) {\n this.updateHeadline(fileItem);\n this.updateSubline(fileItem);\n this.updateListEl(fileItem);\n }\n });\n\n this.store.events.subscribe('fileDeleted', (fileItem: FileItemInterface) => {\n if(this.fileItem.id === fileItem.id) {\n this.listElement.remove();\n }\n });\n }\n\n render(): HTMLElement {\n const li = this.getListEl();\n\n // Image or icon\n li.appendChild(this.getVisual())\n\n // Description\n const descriptionEl = document.createElement('div');\n\n // Generate name tag\n descriptionEl.appendChild(this.getHeadline());\n\n // Generate subline tag\n descriptionEl.appendChild(this.getSubline());\n\n li.appendChild(descriptionEl);\n\n // Actions\n li.appendChild(this.getActions());\n\n this.listElement = li;\n\n return li;\n }\n\n getListEl(): HTMLElement {\n const li = document.createElement('li');\n li.classList.add('huply-file-item');\n\n return li;\n }\n\n updateListEl(fileItem: FileItemInterface) {\n this.listElement.classList.remove('is-uploading');\n this.listElement.classList.remove('is-preloaded');\n this.listElement.classList.remove('is-error');\n this.listElement.classList.remove('is-deleted');\n\n if(fileItem.status === 'uploading') {\n this.listElement.classList.add('is-uploading');\n } else if(fileItem.status === 'preloaded') {\n this.listElement.classList.add('is-preloaded');\n } else if(fileItem.status === 'error') {\n this.listElement.classList.add('is-error');\n } else if(fileItem.status === 'uploaded') {\n this.listElement.classList.add('is-uploaded');\n } else if(fileItem.status === 'deleted') {\n this.listElement.classList.add('is-deleted');\n }\n }\n\n getSubline(): HTMLElement {\n const sublineEl = document.createElement('p');\n sublineEl.classList.add('huply-file-item-subline');\n sublineEl.textContent = $t('fileItemStatusWaiting');\n\n return sublineEl;\n }\n\n updateSubline(fileItem: FileItemInterface) {\n const subline = this.listElement.querySelector('.huply-file-item-subline');\n if (subline) {\n if (fileItem.status === 'uploading') {\n if (fileItem.uploadProcess) {\n subline.textContent = $t('fileItemStatusUploading') + ' (' + fileItem.uploadProcess.toFixed(0) + '%)';\n }\n } else if (fileItem.status === 'error') {\n subline.textContent = fileItem.statusMsg ?? $t('fileItemStatusError');\n } else if (fileItem.status === 'uploaded' || fileItem.status === 'preloaded') {\n subline.textContent = fileItem.sizeMb && fileItem.sizeMb < 1 ? `${fileItem.sizeKb} KB` : `${getHumanNumber(fileItem.sizeMb)} MB`;\n }\n }\n }\n\n getHeadline(): HTMLElement {\n const nameEl = document.createElement('p');\n nameEl.textContent = this.fileItem.name;\n nameEl.classList.add('huply-file-item-headline');\n\n return nameEl;\n }\n\n updateHeadline(fileItem: FileItemInterface) {\n const headline = this.listElement.querySelector('.huply-file-item-headline');\n if(headline) {\n headline.textContent = fileItem.name;\n }\n }\n\n getVisual(): HTMLElement {\n const visiualEl = document.createElement('div');\n visiualEl.classList.add('huply-file-item-visual');\n const fileService = new FileService(this.store);\n\n // Check if file is image\n if(fileService.checkIfIsImage(this.fileItem.name)) {\n if(this.fileItem.url) {\n const imgEl = document.createElement('img');\n imgEl.classList.add('is-hidden');\n visiualEl.appendChild(imgEl);\n imgEl.setAttribute('src', this.fileItem.url);\n setTimeout(() => {\n imgEl.classList.remove('is-hidden');\n }, 5);\n } else {\n visiualEl.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M152 120c-26.51 0-48 21.49-48 48s21.49 48 48 48s48-21.49 48-48S178.5 120 152 120zM447.1 32h-384C28.65 32-.0091 60.65-.0091 96v320c0 35.35 28.65 64 63.1 64h384c35.35 0 64-28.65 64-64V96C511.1 60.65 483.3 32 447.1 32zM463.1 409.3l-136.8-185.9C323.8 218.8 318.1 216 312 216c-6.113 0-11.82 2.768-15.21 7.379l-106.6 144.1l-37.09-46.1c-3.441-4.279-8.934-6.809-14.77-6.809c-5.842 0-11.33 2.529-14.78 6.809l-75.52 93.81c0-.0293 0 .0293 0 0L47.99 96c0-8.822 7.178-16 16-16h384c8.822 0 16 7.178 16 16V409.3z\"/></svg>';\n }\n } else {\n visiualEl.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 384 512\"><path d=\"M365.3 93.38l-74.63-74.64C278.6 6.743 262.3 0 245.4 0L64-.0001c-35.35 0-64 28.65-64 64l.0065 384c0 35.35 28.65 64 64 64H320c35.2 0 64-28.8 64-64V138.6C384 121.7 377.3 105.4 365.3 93.38zM320 464H64.02c-8.836 0-15.1-7.163-16-15.1L48 64.13c-.0004-8.837 7.163-16 16-16h160L224 128c0 17.67 14.33 32 32 32h79.1v288C336 456.8 328.8 464 320 464z\"/></svg>';\n }\n\n return visiualEl;\n }\n\n getActions(): HTMLElement {\n const actionsEl = document.createElement('div');\n actionsEl.classList.add('huply-file-item-actions');\n const deleteEl = this.getDeleteAction();\n actionsEl.appendChild(deleteEl);\n\n return actionsEl;\n }\n\n getDeleteAction(): HTMLElement {\n const deleteEl = document.createElement('a');\n deleteEl.setAttribute('href', '#');\n deleteEl.classList.add('huply-file-item-actions-delete');\n deleteEl.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><path d=\"M424 80C437.3 80 448 90.75 448 104C448 117.3 437.3 128 424 128H412.4L388.4 452.7C385.9 486.1 358.1 512 324.6 512H123.4C89.92 512 62.09 486.1 59.61 452.7L35.56 128H24C10.75 128 0 117.3 0 104C0 90.75 10.75 80 24 80H93.82L130.5 24.94C140.9 9.357 158.4 0 177.1 0H270.9C289.6 0 307.1 9.358 317.5 24.94L354.2 80H424zM177.1 48C174.5 48 171.1 49.34 170.5 51.56L151.5 80H296.5L277.5 51.56C276 49.34 273.5 48 270.9 48H177.1zM364.3 128H83.69L107.5 449.2C108.1 457.5 115.1 464 123.4 464H324.6C332.9 464 339.9 457.5 340.5 449.2L364.3 128z\"/></svg>';\n deleteEl.addEventListener('click', (e) => {\n e.preventDefault();\n this.store.deleteFileItem(this.fileItem);\n });\n\n return deleteEl;\n }\n\n}\n\nexport default FileListComponent;\n","import FileListItemComponent from \"./FileListItemComponent\";\nimport FileItemInterface from \"../interfaces/FileItemInterface\";\nimport AppStore from \"../store/AppStore\";\n\nclass FileListComponent {\n\n private fileList: Element;\n private store: AppStore;\n\n constructor(store: AppStore) {\n this.store = store;\n\n // Generate ul element\n this.fileList = document.createElement('ul');\n this.fileList.classList.add('huply-file-list');\n\n // Check if file is added and add new file item to list\n // Show list, if more than 1 file allowed\n if(this.store.options.multiple) {\n store.events.subscribe('fileAdded', (fileItem: FileItemInterface) => {\n this.addChild(fileItem);\n });\n }\n }\n\n render() {\n return this.fileList;\n }\n\n addChild(fileItem: FileItemInterface) {\n const fileListItemComponent = new FileListItemComponent(fileItem, this.store);\n this.fileList.appendChild(fileListItemComponent.render());\n }\n}\n\nexport default FileListComponent;\n","import AppStore from \"../store/AppStore\";\nimport {$t} from \"../helpers/LangHelper\";\nimport FileItemInterface from \"../interfaces/FileItemInterface\";\nimport UploadService from \"../services/UploadService\";\nimport FileValidationService from \"../services/FileValidationService\";\nimport FileService from \"../services/FileService\";\nimport {getHumanNumber} from \"../helpers/OutputHelper\";\n\nclass FileDropzoneComponent {\n protected store: AppStore;\n protected dropzone: HTMLElement | undefined;\n protected headline: HTMLElement | undefined;\n protected subline: HTMLElement | undefined;\n protected uploadIcon: HTMLElement | undefined;\n protected deleteIcon: HTMLElement | undefined;\n protected descWrapper: HTMLElement | undefined;\n protected baseCssClass: string = '';\n\n constructor(store: AppStore) {\n this.store = store;\n\n // Check if file is added and add new file item to list\n // Show list, if more than 1 file allowed\n if(!this.store.options.multiple) {\n store.events.subscribe('fileItemUpdate', (fileItem: FileItemInterface) => {\n this.updateHeadline(fileItem);\n this.updateSubline(fileItem);\n this.updateUploadIcon(fileItem);\n this.updateDeleteIcon(fileItem);\n this.updateDescriptionWrapper(fileItem);\n });\n\n store.events.subscribe('fileDeleted', (fileItem: FileItemInterface) => {\n this.updateHeadline(fileItem);\n this.updateSubline(fileItem);\n this.updateUploadIcon(fileItem);\n this.updateDeleteIcon(fileItem);\n this.updateDescriptionWrapper(fileItem);\n });\n }\n }\n\n render() {\n this.dropzone = document.createElement('div');\n if(this.baseCssClass) {\n this.dropzone.classList.add(this.baseCssClass);\n }\n\n this.getTemplate();\n\n this.setEvents();\n\n return this.dropzone;\n }\n\n getTemplate(): HTMLElement | void {}\n\n setEvents(): void {\n if(this.dropzone) {\n // Click event\n this.dropzone.addEventListener('click', () => {\n this.store.components.input?.click();\n });\n\n // Dragover\n this.dropzone.addEventListener('dragover', (e) => {\n e.preventDefault();\n this.dropzone?.classList.add('is-dragover');\n });\n\n // Dragleave\n this.dropzone.addEventListener('dragleave', (e) => {\n e.preventDefault();\n this.dropzone?.classList.remove('is-dragover');\n });\n\n // Drop\n this.dropzone.addEventListener('drop', (e) => {\n e.preventDefault();\n const uploadService = new UploadService(this.store);\n if(e.dataTransfer) {\n for (var i=0; i < e.dataTransfer.items.length; i++) {\n const item = e.dataTransfer.items[i].getAsFile();\n if(item) {\n // Validate file\n const validationService = new FileValidationService(this.store);\n const validationMsg = validationService.isValidFile(item);\n new FileService(this.store).generateFileItem(item).then((fileItem) => {\n this.store.addFileItem(fileItem);\n\n // Check for errors\n if(validationMsg.length !== 0) {\n fileItem.status = 'error';\n fileItem.statusMsg = validationMsg.map((item) => item.msg).join(', ')\n this.store.updateFileItem(fileItem);\n }\n\n uploadService.upload();\n });\n }\n }\n }\n });\n }\n }\n\n getDescriptionWrapper() {\n this.descWrapper = document.createElement('div');\n this.descWrapper.classList.add(this.baseCssClass+'-desc');\n\n return this.descWrapper;\n }\n\n updateDescriptionWrapper(fileItem: FileItemInterface) {\n if(this.descWrapper) {\n this.descWrapper.classList.remove('is-uploading');\n this.descWrapper.classList.remove('is-preloaded');\n this.descWrapper.classList.remove('is-error');\n this.descWrapper.classList.remove('is-uploaded');\n\n if(fileItem.status === 'uploading') {\n this.descWrapper.classList.add('is-uploading');\n } else if(fileItem.status === 'preloaded') {\n this.descWrapper.classList.add('is-preloaded');\n } else if(fileItem.status === 'error') {\n this.descWrapper.classList.add('is-error');\n } else if(fileItem.status === 'uploaded') {\n this.descWrapper.classList.add('is-uploaded');\n }\n }\n }\n\n getUploadIcon(): HTMLElement {\n this.uploadIcon = document.createElement('div');\n this.uploadIcon.classList.add(this.baseCssClass+'-icon-upload');\n this.uploadIcon.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 512\"><path d=\"M303 175C312.4 165.7 327.6 165.7 336.1 175L416.1 255C426.3 264.4 426.3 279.6 416.1 288.1C407.6 298.3 392.4 298.3 383 288.1L344 249.9V384C344 397.3 333.3 408 320 408C306.7 408 296 397.3 296 384V249.9L256.1 288.1C247.6 298.3 232.4 298.3 223 288.1C213.7 279.6 213.7 264.4 223 255L303 175zM144 480C64.47 480 0 415.5 0 336C0 273.3 40.07 219.1 96 200.2V200C96 107.2 171.2 32 264 32C314.9 32 360.4 54.6 391.3 90.31C406.2 83.68 422.6 80 440 80C506.3 80 560 133.7 560 200C560 206.6 559.5 213 558.5 219.3C606.5 240.3 640 288.3 640 344C640 416.4 583.4 475.6 512 479.8V480H144zM264 80C197.7 80 144 133.7 144 200L144 234.1L111.1 245.5C74.64 258.7 48 294.3 48 336C48 389 90.98 432 144 432H506.6L509.2 431.8C555.4 429.2 592 390.8 592 344C592 308 570.4 276.9 539.2 263.3L505.1 248.4L511.1 211.7C511.7 207.9 512 204 512 200C512 160.2 479.8 128 440 128C429.5 128 419.6 130.2 410.8 134.2L378.2 148.7L354.9 121.7C332.8 96.08 300.3 80 263.1 80L264 80z\"/></svg>`;\n\n return this.uploadIcon;\n }\n\n updateUploadIcon(fileItem: FileItemInterface) {\n if(this.uploadIcon) {\n if(fileItem.status === 'uploading' && fileItem.uploadProcess === 0) {\n this.uploadIcon.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 576 512\"><path d=\"M264 24C264 10.75 274.7 0 288 0C429.4 0 544 114.6 544 256C544 302.6 531.5 346.4 509.7 384C503.1 395.5 488.4 399.4 476.9 392.8C465.5 386.2 461.5 371.5 468.2 360C485.9 329.4 496 293.9 496 255.1C496 141.1 402.9 47.1 288 47.1C274.7 47.1 264 37.25 264 23.1V24z\"/></svg>';\n } else if(fileItem.status === 'error') {\n this.uploadIcon.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 464c-114.7 0-208-93.31-208-208S141.3 48 256 48s208 93.31 208 208S370.7 464 256 464zM256 304c13.25 0 24-10.75 24-24v-128C280 138.8 269.3 128 256 128S232 138.8 232 152v128C232 293.3 242.8 304 256 304zM256 337.1c-17.36 0-31.44 14.08-31.44 31.44C224.6 385.9 238.6 400 256 400s31.44-14.08 31.44-31.44C287.4 351.2 273.4 337.1 256 337.1z\"/></svg>';\n } else if(fileItem.status === 'uploaded') {\n this.uploadIcon.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M243.8 339.8C232.9 350.7 215.1 350.7 204.2 339.8L140.2 275.8C129.3 264.9 129.3 247.1 140.2 236.2C151.1 225.3 168.9 225.3 179.8 236.2L224 280.4L332.2 172.2C343.1 161.3 360.9 161.3 371.8 172.2C382.7 183.1 382.7 200.9 371.8 211.8L243.8 339.8zM512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM256 48C141.1 48 48 141.1 48 256C48 370.9 141.1 464 256 464C370.9 464 464 370.9 464 256C464 141.1 370.9 48 256 48z\"/></svg>';\n } else if(fileItem.status === 'deleted' && this.store.getFilesUploading().length === 0) {\n this.uploadIcon.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 512\"><path d=\"M303 175C312.4 165.7 327.6 165.7 336.1 175L416.1 255C426.3 264.4 426.3 279.6 416.1 288.1C407.6 298.3 392.4 298.3 383 288.1L344 249.9V384C344 397.3 333.3 408 320 408C306.7 408 296 397.3 296 384V249.9L256.1 288.1C247.6 298.3 232.4 298.3 223 288.1C213.7 279.6 213.7 264.4 223 255L303 175zM144 480C64.47 480 0 415.5 0 336C0 273.3 40.07 219.1 96 200.2V200C96 107.2 171.2 32 264 32C314.9 32 360.4 54.6 391.3 90.31C406.2 83.68 422.6 80 440 80C506.3 80 560 133.7 560 200C560 206.6 559.5 213 558.5 219.3C606.5 240.3 640 288.3 640 344C640 416.4 583.4 475.6 512 479.8V480H144zM264 80C197.7 80 144 133.7 144 200L144 234.1L111.1 245.5C74.64 258.7 48 294.3 48 336C48 389 90.98 432 144 432H506.6L509.2 431.8C555.4 429.2 592 390.8 592 344C592 308 570.4 276.9 539.2 263.3L505.1 248.4L511.1 211.7C511.7 207.9 512 204 512 200C512 160.2 479.8 128 440 128C429.5 128 419.6 130.2 410.8 134.2L378.2 148.7L354.9 121.7C332.8 96.08 300.3 80 263.1 80L264 80z\"/></svg>`;\n } else if(fileItem.status === 'preloaded') {\n this.uploadIcon.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><!--! Font Awesome Pro 6.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d=\"M454.7 288.1c-12.78-3.75-26.06 3.594-29.75 16.31C403.3 379.9 333.8 432 255.1 432c-66.53 0-126.8-38.28-156.5-96h100.4c13.25 0 24-10.75 24-24S213.2 288 199.9 288h-160c-13.25 0-24 10.75-24 24v160c0 13.25 10.75 24 24 24s24-10.75 24-24v-102.1C103.7 436.4 176.1 480 255.1 480c99 0 187.4-66.31 215.1-161.3C474.8 305.1 467.4 292.7 454.7 288.1zM472 16C458.8 16 448 26.75 448 40v102.1C408.3 75.55 335.8 32 256 32C157 32 68.53 98.31 40.91 193.3C37.19 206 44.5 219.3 57.22 223c12.84 3.781 26.09-3.625 29.75-16.31C108.7 132.1 178.2 80 256 80c66.53 0 126.8 38.28 156.5 96H312C298.8 176 288 186.8 288 200S298.8 224 312 224h160c13.25 0 24-10.75 24-24v-160C496 26.75 485.3 16 472 16z\"/></svg>';\n }\n }\n }\n\n getDeleteIcon(): HTMLElement {\n this.deleteIcon = document.createElement('a');\n this.deleteIcon.setAttribute('href', '#');\n this.deleteIcon.classList.add(this.baseCssClass+'-icon-delete');\n this.deleteIcon.classList.add('is-hidden');\n this.deleteIcon.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><path d=\"M424 80C437.3 80 448 90.75 448 104C448 117.3 437.3 128 424 128H412.4L388.4 452.7C385.9 486.1 358.1 512 324.6 512H123.4C89.92 512 62.09 486.1 59.61 452.7L35.56 128H24C10.75 128 0 117.3 0 104C0 90.75 10.75 80 24 80H93.82L130.5 24.94C140.9 9.357 158.4 0 177.1 0H270.9C289.6 0 307.1 9.358 317.5 24.94L354.2 80H424zM177.1 48C174.5 48 171.1 49.34 170.5 51.56L151.5 80H296.5L277.5 51.56C276 49.34 273.5 48 270.9 48H177.1zM364.3 128H83.69L107.5 449.2C108.1 457.5 115.1 464 123.4 464H324.6C332.9 464 339.9 457.5 340.5 449.2L364.3 128z\"/></svg>`;\n this.deleteIcon.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n const fileIndex = this.store.files.findIndex((currentItem) => this.deleteIcon?.getAttribute('data-file-id') == currentItem.id);\n if(fileIndex !== -1) {\n this.store.deleteFileItem(this.store.files[fileIndex]);\n }\n });\n\n return this.deleteIcon;\n }\n\n updateDeleteIcon(fileItem: FileItemInterface) {\n if(this.deleteIcon) {\n if(fileItem.status === 'uploaded' || fileItem.status === 'preloaded') {\n this.deleteIcon.classList.remove('is-hidden');\n this.deleteIcon.setAttribute('data-file-id', fileItem.id);\n } else {\n this.deleteIcon.classList.add('is-hidden');\n }\n }\n }\n\n getHeadline(): HTMLElement {\n this.headline = document.createElement('p');\n this.headline.classList.add(this.baseCssClass+'-headline');\n this.headline.innerHTML = this.getHeadlineText();\n\n return this.headline;\n }\n\n getHeadlineText(): string {\n return `<strong>${this.store?.options.multiple ? $t('chooseFiles') : $t('chooseFile')}</strong>`;\n }\n\n updateHeadline(fileItem: FileItemInterface) {\n if(this.headline) {\n if(fileItem.status === 'deleted') {\n this.headline.innerHTML = this.getHeadlineText();\n } else {\n this.headline.innerHTML = `<strong>${fileItem.name}</strong>`;\n }\n }\n }\n\n getSubline(): HTMLElement {\n this.subline = document.createElement('p');\n this.subline.innerText = this.getSublineText();\n this.subline.classList.add(this.baseCssClass+'-subline');\n\n return this.subline;\n }\n\n getSublineText(): string {\n const sublineParts = [];\n sublineParts.push($t('allowedFileTypes', {allowedFileTypes: this.store?.options.allowedFileTypes}));\n sublineParts.push($t('maxFileSize', {maxFileSize: this.store?.options.maxFileSize}));\n return sublineParts.join(', ');\n }\n\n updateSubline(fileItem: FileItemInterface) {\n if(this.subline) {\n this.subline.classList.remove('is-uploading');\n this.subline.classList.remove('is-preloaded');\n this.subline.classList.remove('is-error');\n this.subline.classList.remove('is-uploaded');\n\n if(fileItem.status === 'uploading' && fileItem.uploadProcess) {\n this.subline.innerHTML = $t('fileItemStatusUploading') + ' ('+fileItem.uploadProcess.toFixed(0)+'%)';\n } else if(fileItem.status === 'error') {\n this.subline.innerHTML = fileItem.statusMsg ?? $t('fileItemStatusError');\n } else if(fileItem.status === 'uploaded' || fileItem.status === 'preloaded') {\n this.subline.textContent = fileItem.sizeMb && fileItem.sizeMb < 1 ? `${fileItem.sizeKb} KB` : `${getHumanNumber(fileItem.sizeMb)} MB`;\n } else {\n this.subline.innerHTML = this.getSublineText();\n }\n }\n }\n}\n\nexport default FileDropzoneComponent;\n","import AppStore from \"../store/AppStore\";\nimport FileDropzoneComponent from \"./FileDropzoneComponent\";\n\nclass FileDropzoneLgComponent extends FileDropzoneComponent{\n protected baseCssClass = 'huply-dropzone-lg';\n\n constructor(store: AppStore) {\n super(store);\n }\n\n getTemplate(): HTMLElement | void {\n\n if(this.dropzone) {\n // Delete icon\n this.dropzone.appendChild(this.getDeleteIcon());\n\n // Wrapper\n const dropzoneDescriptionWrapper = this.getDescriptionWrapper();\n\n // Icon\n dropzoneDescriptionWrapper.appendChild(this.getUploadIcon());\n\n // Headline\n dropzoneDescriptionWrapper.appendChild(this.getHeadline());\n\n // Subline\n dropzoneDescriptionWrapper.appendChild(this.getSubline());\n\n this.dropzone.appendChild(dropzoneDescriptionWrapper);\n\n return this.dropzone;\n }\n }\n}\n\nexport default FileDropzoneLgComponent;\n","import AppStore from \"../store/AppStore\";\nimport FileDropzoneComponent from \"./FileDropzoneComponent\";\nimport FileItemInterface from \"../interfaces/FileItemInterface\";\n\nclass FileDropzoneSmallComponent extends FileDropzoneComponent {\n protected baseCssClass = 'huply-dropzone-sm';\n\n constructor(store: AppStore) {\n super(store);\n\n if(!this.store.options.multiple) {\n store.events.subscribe('fileItemUpdate', (fileItem: FileItemInterface) => {\n this.updateWrapper(fileItem);\n });\n\n store.events.subscribe('fileDeleted', (fileItem: FileItemInterface) => {\n this.updateWrapper(fileItem);\n });\n }\n }\n\n getTemplate(): HTMLElement | void {\n if(this.dropzone) {\n // Wrapper\n const dropzoneWrapper = this.getWrapper();\n\n // Headline\n dropzoneWrapper.appendChild(this.getHeadline());\n\n // Subline\n dropzoneWrapper.appendChild(this.getSubline());\n\n // Icon upload\n dropzoneWrapper.appendChild(this.getUploadIcon());\n\n // Icon delete\n dropzoneWrapper.appendChild(this.getDeleteIcon());\n\n this.dropzone.appendChild(dropzoneWrapper);\n\n return this.dropzone;\n }\n }\n\n\n getWrapper() {\n this.descWrapper = document.createElement('div');\n this.descWrapper.classList.add('huply-dropzone-sm-wrapper');\n\n return this.descWrapper;\n }\n\n updateWrapper(fileItem: FileItemInterface) {\n if(this.descWrapper) {\n this.descWrapper.classList.remove('is-uploading');\n this.descWrapper.classList.remove('is-preloaded');\n this.descWrapper.classList.remove('is-error');\n this.descWrapper.classList.remove('is-uploaded');\n\n if(fileItem.status === 'uploading') {\n this.descWrapper.classList.add('is-uploading');\n } else if(fileItem.status === 'preloaded') {\n this.descWrapper.classList.add('is-preloaded');\n } else if(fileItem.status === 'error') {\n this.descWrapper.classList.add('is-error');\n } else if(fileItem.status === 'uploaded') {\n this.descWrapper.classList.add('is-uploaded');\n }\n }\n }\n}\n\nexport default FileDropzoneSmallComponent;\n","import AppStore from \"../store/AppStore\";\n\nclass FileInputHiddenComponent {\n private el: HTMLElement;\n private input: HTMLInputElement;\n\n constructor(el: HTMLElement, store: AppStore) {\n this.el = el;\n this.input = document.createElement('input');\n\n store.events.subscribe('fileItemUpdate', () => {\n this.input.setAttribute('value', JSON.stringify(store.getCategorizedFiles()));\n });\n\n store.events.subscribe('fileDeleted', () => {\n this.input.setAttribute('value', JSON.stringify(store.getCategorizedFiles()));\n });\n }\n\n render(): HTMLInputElement {\n this.input.setAttribute('type', 'hidden');\n const nameAttr = this.el.getAttribute('name');\n if(nameAttr) {\n this.input.setAttribute('name', nameAttr);\n }\n return this.input;\n }\n}\n\n\nexport default FileInputHiddenComponent;\n","import FileInputComponent from \"./FileInputComponent\";\nimport FileListComponent from \"./FileListComponent\";\nimport FileDropzoneLgComponent from \"./FileDropzoneLgComponent\";\nimport FileDropzoneSmallComponent from \"./FileDropzoneSmallComponent\";\nimport FileInputHiddenComponent from \"./FileInputHiddenComponent\";\nimport AppStore from \"../store/AppStore\";\n\nclass WrapperComponent {\n private el: HTMLElement;\n private store: AppStore;\n\n constructor(el: HTMLElement, store: AppStore) {\n this.el = el;\n this.store = store;\n }\n\n render() {\n const wrapper = document.createElement('div');\n wrapper.classList.add('huply-wrapper');\n\n // Add input file field\n // Clone input / Identical input element cannot be replaced if it is an anchestor of parent\n const inputComponent = new FileInputComponent(this.el, this.store).render();\n wrapper.appendChild(inputComponent);\n\n // Add input hidden field with file information\n const inputHiddenComponent = new FileInputHiddenComponent(this.el, this.store).render();\n wrapper.appendChild(inputHiddenComponent);\n\n // Add dropzone\n let dropzoneComponent;\n if(this.store.options.dropzoneTheme === 'sm') {\n dropzoneComponent = new FileDropzoneSmallComponent(this.store);\n wrapper.appendChild(dropzoneComponent.render());\n } else {\n dropzoneComponent = new FileDropzoneLgComponent(this.store);\n wrapper.appendChild(dropzoneComponent.render());\n }\n\n // Add file list\n const fileListComponent = new FileListComponent(this.store);\n wrapper.appendChild(fileListComponent.render());\n\n // Add elements to store\n this.store.setComponent('input', inputComponent);\n this.store.setComponent('dropzone', dropzoneComponent);\n this.store.setComponent('fileList', fileListComponent);\n\n return wrapper;\n }\n}\n\n\nexport default WrapperComponent;\n","export default {\n chooseFiles: 'Dateien auswählen',\n chooseFile: 'Datei auswählen',\n allowedFileTypes: 'Erlaubte Dateitypen: {{allowedFileTypes}}',\n maxFileSize: 'Maximale Dateigröße: {{maxFileSize}} MB',\n fileItemStatusWaiting: \"In Warteschlange\",\n fileItemStatusUploading: \"Wird hochgeladen\",\n fileItemStatusUploaded: \"Erfolgreich hochgeladen\",\n fileItemStatusPreloaded: \"Bereits hochgeladen\",\n fileItemStatusError: \"Ein Fehler ist aufgetreten.\",\n fileItemStatusErrorFileSize: \"Die Dateigröße überschreitet die Maximalgröße: {{maxFileSize}} MB\",\n fileItemStatusErrorFileType: \"Der Dateityp ist nicht erlaubt. Erlaubte Dateitypen: {{allowedFileTypes}}\",\n delete: \"Löschen\"\n}\n","export default {\n chooseFiles: 'Choose files',\n chooseFile: 'Choose file',\n allowedFileTypes: 'Allowed file types: {{allowedFileTypes}}',\n maxFileSize: 'Maximum file size: {{maxFileSize}} MB',\n fileItemStatusWaiting: \"In queue\",\n fileItemStatusUploading: \"Uploading ...\",\n fileItemStatusUploaded: \"Uploaded\",\n fileItemStatusPreloaded: \"Already uploaded\",\n fileItemStatusError: \"An error occured.\",\n fileItemStatusErrorFileSize: \"The file size exceeds the maximum size: {{maxFileSize}} MB\",\n fileItemStatusErrorFileType: \"The file type is not allowed. Allowed file types: {{allowedFileTypes}}\",\n delete: \"Delete\"\n}\n","import {isset} from \"../helpers/TypeHelper\";\n\nexport default class PubSub {\n private events: {\n // eslint-disable-next-line no-unused-vars\n [key: string]: Array<(data: object) => void>\n } = {};\n\n constructor() {}\n\n subscribe(event: string, callback: any) {\n if (!isset(this.events[event])) {\n this.events[event] = [];\n }\n\n return this.events[event].push(callback);\n }\n\n publish(event: string, data = {}) {\n if (!isset(this.events[event])) {\n return [];\n }\n\n return this.events[event].map(callback => callback(data));\n }\n}\n","import PubSub from \"./PubSub\";\nimport FileItemInterface from \"../interfaces/FileItemInterface\";\nimport FileDropzoneComponent from \"../components/FileDropzoneComponent\";\nimport FileListComponent from \"../components/FileListComponent\";\nimport HuplyOptionsInterface from \"../interfaces/HuplyOptionsInterface\";\nimport FileDropzoneSmallComponent from \"../components/FileDropzoneSmallComponent\";\nimport HttpRequestService from \"../services/HttpRequestService\";\n\nclass AppStore {\n events: PubSub;\n files: Array<FileItemInterface>;\n components: {\n input?: HTMLInputElement,\n dropzone?: HTMLElement,\n fileList?: HTMLElement\n };\n translations: Object;\n options: HuplyOptionsInterface;\n maxSizeImageView: number;\n imgExt: Array<string>;\n\n constructor() {\n this.events = new PubSub();\n this.components = {};\n this.files = [];\n this.translations = {};\n this.options = {\n allowedFileTypes: [],\n multiple: false,\n uploadUrl: '',\n dropzoneTheme: 'lg'\n };\n this.maxSizeImageView = 2000000;\n this.imgExt = ['.jpg', '.jpeg', '.png'];\n }\n\n addFileItem(fileItem: FileItemInterface) {\n if (\n !this.options.multiple &&\n this.files.length\n ) {\n this.files.forEach((fileItem) => {\n this.deleteFileItem(fileItem);\n });\n }\n this.files.push(fileItem);\n this.events.publish('fileAdded', fileItem);\n }\n\n updateFileItem(fileItem: FileItemInterface) {\n const fileIndex = this.files.findIndex((findItem) => findItem.id === fileItem.id);\n if(fileIndex !== -1) {\n this.files[fileIndex] = fileItem;\n this.events.publish('fileItemUpdate', fileItem);\n\n // Check if file is uploaded\n if(fileItem.status === 'uploaded') {\n this.events.publish('fileUploaded', fileItem);\n\n // Check if all files are uploaded\n if(this.getFilesUploading().length === 0) {\n this.events.publish('filesUploaded', fileItem);\n }\n }\n }\n }\n\n deleteFileItem(fileItem: FileItemInterface) {\n if(this.options.deleteUrl && fileItem.status === 'uploaded') {\n let request = new HttpRequestService(this).request('DELETE', this.options.deleteUrl.replace('{{filename}}', encodeURI(fileItem.name)));\n request.setRequestHeader('accept', 'application/json');\n\n let data = new FormData();\n data.append('filename', fileItem.name);\n request.send(data);\n\n // request finished event\n request.addEventListener('load', () => {\n if(request.status === 200) {\n this.files = this.files.filter((item) => fileItem.id !== item.id);\n\n fileItem.status = 'deleted';\n this.events.publish('fileDeleted', fileItem);\n } else {\n fileItem.status = 'error';\n this.events.publish('fileItemUpdate', fileItem);\n }\n });\n } else {\n fileItem.status = 'deleted';\n this.events.publish('fileDeleted', fileItem);\n }\n }\n\n getCategorizedFiles() {\n return {\n uploaded: this.getFilesUploaded(),\n preloaded: this.getFilesPreloaded(),\n deleted: this.getFilesDeleted(),\n };\n }\n\n getFilesDeleted() {\n return this.files.filter((item) => item.status === 'deleted');\n }\n\n getFilesPreloaded() {\n return this.files.filter((item) => item.status === 'preloaded');\n }\n\n getFilesUploaded() {\n return this.files.filter((item) => item.status === 'uploaded');\n }\n\n getFilesWaiting() {\n return this.files.filter((item) => item.status === 'waiting');\n }\n\n getFilesUploading() {\n return this.files.filter((item) => item.status === 'uploading');\n }\n\n setComponent(key: string, component: FileListComponent | FileDropzoneComponent | FileDropzoneSmallComponent | Node) {\n // @ts-ignore\n this.components[key] = component;\n }\n\n setTranslations(translations: Object) {\n this.translations = translations\n }\n\n setOptions(options: HuplyOptionsInterface) {\n this.options = options;\n }\n}\n\nexport default AppStore;\n","import './assets/css/style.scss';\nimport HuplyOptionsInterface from \"./interfaces/HuplyOptionsInterface\";\nimport {isElement, isObject} from \"./helpers/TypeHelper\";\nimport WrapperComponent from \"./components/WrapperComponent\";\nimport de from \"./lang/de\";\nimport en from \"./lang/en\";\nimport AppStore from \"./store/AppStore\";\nimport { CustomWindowInterface } from \"./interfaces/CustomWindowInterface\";\nimport FileService from \"./services/FileService\";\ndeclare let window: CustomWindowInterface;\n\n// eslint-disable-next-line no-unused-vars\nexport default class Huply {\n\n public options?: HuplyOptionsInterface;\n public el: HTMLElement | null;\n private store: AppStore;\n\n public constructor(el: HTMLElement, options?: HuplyOptionsInterface) {\n if(!isElement(el)) {\n throw new Error('Selected element is not type of \"Element\". Current type: '+ typeof el);\n }\n\n this.el = el;\n\n // Initialize store\n this.store = new AppStore();\n\n // Parse options\n this.options = this.parseOptions(options);\n\n // Set options to store\n if(this.options) {\n this.store.setOptions(this.options);\n }\n\n // Validate options\n this.validateOptions(this.options);\n\n // Available Translations\n const defaultTranslations = {\n 'de': de,\n 'en': en,\n };\n\n // Set translations\n // Check if translations set\n // * via options global window object\n // * via options attribute\n if(isObject(window.huplyTranslations)) {\n this.store.setTranslations(window.huplyTranslations);\n } else {\n const lang = document.querySelector('html')?.getAttribute('lang');\n if(lang === 'en' || lang === 'de') {\n // @ts-ignore\n window.huplyTranslations = defaultTranslations[this.options.lang];\n // @ts-ignore\n this.store.setTranslations(defaultTranslations[this.options.lang]);\n } else {\n window.huplyTranslations = defaultTranslations['en'];\n this.store.setTranslations(defaultTranslations['en']);\n }\n }\n\n return this;\n }\n\n init() {\n // Render Layout\n // Replace input with wrapper\n if(this.el) {\n const wrapper = new WrapperComponent(this.el, this.store).render();\n if(this.el?.parentNode) {\n this.el.parentNode.replaceChild(wrapper, this.el);\n }\n\n // Get the new generated input element\n this.el = wrapper.querySelector(this.el.tagName);\n }\n\n // Add preloaded files\n if(this.options?.preloadedFiles?.length) {\n const fileService = new FileService(this.store);\n this.options.preloadedFiles.forEach((fileItem) => {\n if(fileItem.url) {\n fileService.getBlobFromUrl(fileItem.url).then((blob) => {\n fileService.generateFileItem(new File([blob], fileItem.name)).then((newItem) => {\n this.store.addFileItem( newItem);\n newItem.status = 'preloaded';\n this.store.updateFileItem( newItem);\n });\n });\n }\n });\n }\n\n return this;\n }\n\n parseOptions(options: HuplyOptionsInterface | undefined): HuplyOptionsInterface {\n\n // Set default options\n let defaultOptions: HuplyOptionsInterface = {\n multiple: false,\n maxConcurrentUploads: 3,\n maxFileSize: 5,\n lang: 'de',\n uploadUrl: '',\n deleteUrl: '',\n allowedFileTypes: ['.jpg', '.jpeg', '.png', '.pdf', '.zip', '.mp4'],\n dropzoneTheme: 'lg'\n };\n\n // Merge default options with individual options\n if(isObject(options)) {\n defaultOptions = {...defaultOptions, ...options};\n }\n\n // Check for data-attributes\n defaultOptions.multiple = this.el?.hasAttribute('multiple');\n\n const dropzoneTheme = this.el?.getAttribute('data-dropzone-theme');\n if(dropzoneTheme) {\n defaultOptions.dropzoneTheme = dropzoneTheme;\n }\n\n const maxConcurrentUploads = this.el?.getAttribute('data-max-concurrent-uploads');\n if(maxConcurrentUploads) {\n defaultOptions.maxConcurrentUploads = Number(maxConcurrentUploads);\n }\n\n const maxFileSize = this.el?.getAttribute('data-max-file-size');\n if(maxFileSize) {\n defaultOptions.maxFileSize = Number(maxFileSize);\n }\n\n const uploadUrl = this.el?.getAttribute('data-upload-url');\n if(uploadUrl) {\n defaultOptions.uploadUrl = uploadUrl;\n }\n\n const deleteUrl = this.el?.getAttribute('data-delete-url');\n if(deleteUrl) {\n defaultOptions.deleteUrl = deleteUrl;\n }\n\n const headers = this.el?.getAttribute('data-headers');\n if(headers) {\n defaultOptions.headers = JSON.parse(headers);\n }\n\n const preloadedFiles = this.el?.getAttribute('data-preloaded-files');\n if(preloadedFiles) {\n defaultOptions.preloadedFiles = JSON.parse(preloadedFiles);\n }\n\n const lang = this.el?.getAttribute('data-lang');\n if(lang) {\n defaultOptions.lang = lang;\n }\n\n const translations = this.el?.getAttribute('data-translations');\n if(translations) {\n defaultOptions.translations = JSON.parse(translations);\n }\n\n const allowedFileTypes = this.el?.getAttribute('accept');\n if(allowedFileTypes) {\n defaultOptions.allowedFileTypes = allowedFileTypes.split(',');\n }\n\n const chunkSize = this.el?.getAttribute('data-chunk-size');\n if(chunkSize) {\n defaultOptions.chunkSize = Number(chunkSize);\n }\n\n return defaultOptions;\n }\n\n validateOptions(options: HuplyOptionsInterface) {\n // Check for uploadUrl existence\n if(!options.uploadUrl || options.uploadUrl.length === 0) {\n throw new Error('Option \"uploadUrl\" not set');\n }\n\n // Check for deleteUrl existence\n if(!options.deleteUrl || options.deleteUrl.length === 0) {\n throw new Error('Option \"deleteUrl\" not set');\n }\n }\n\n on(eventName: string, listener: any) {\n this.store.events.subscribe(eventName, listener);\n }\n}\n"],"names":["FileListItemComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"huply.cjs.js","sources":["../src/helpers/TypeHelper.ts","../src/services/HttpRequestService.ts","../src/services/UploadService.ts","../src/helpers/LangHelper.ts","../src/services/FileValidationService.ts","../src/helpers/OutputHelper.ts","../src/services/FileService.ts","../src/components/FileInputComponent.ts","../src/components/FileListItemComponent.ts","../src/components/FileListComponent.ts","../src/components/FileDropzoneComponent.ts","../src/components/FileDropzoneLgComponent.ts","../src/components/FileDropzoneSmallComponent.ts","../src/components/FileInputHiddenComponent.ts","../src/components/WrapperComponent.ts","../src/lang/de.ts","../src/lang/en.ts","../src/store/PubSub.ts","../src/store/AppStore.ts","../src/main.ts"],"sourcesContent":["function isObject(obj: any): boolean {\n return obj !== undefined && obj !== null && obj.constructor === Object;\n}\n\nfunction isElement(el: any): boolean {\n return el instanceof Element;\n}\n\nfunction isArray(arr: any): boolean {\n return arr !== undefined && arr !== null && arr.constructor === Array;\n}\n\nfunction isPromise(p: any): boolean {\n return typeof p === 'object' && typeof p.then === 'function';\n}\n\nfunction returnsPromise(f: any): boolean {\n return f.constructor.name === 'AsyncFunction' || (typeof f === 'function' && isPromise(f()));\n}\n\nfunction isFunction(f: any): boolean {\n return f instanceof Function;\n}\n\nfunction isset(obj: any): boolean {\n return obj !== undefined;\n}\n\nfunction isFloat(obj: any): boolean {\n return obj !== undefined && obj !== null && !!(obj % 1);\n}\n\nfunction isInteger(obj: any): boolean {\n return obj !== undefined && obj !== null && parseInt(obj, 10) === obj;\n}\n\n\nexport { isObject, isElement, isArray, returnsPromise, isFunction, isset, isFloat, isInteger };\n","import AppStore from \"../store/AppStore\";\nimport {isObject} from \"../helpers/TypeHelper\";\n\nexport default class HttpRequestService {\n private store: AppStore;\n\n constructor(store: AppStore) {\n this.store = store;\n }\n\n request(method: string, url: string): XMLHttpRequest {\n let request = new XMLHttpRequest();\n if(this.store.options.withCredentials) {\n request.withCredentials = this.store.options.withCredentials;\n }\n request.open(method, url);\n if(isObject(this.store.options.headers)) {\n // @ts-ignore\n Object.entries(this.store.options.headers).forEach((item) => {\n // @ts-ignore\n request.setRequestHeader(item[0], item[1]);\n });\n }\n\n return request;\n }\n}\n","import AppStore from \"../store/AppStore\";\nimport FileItemInterface from \"../interfaces/FileItemInterface\";\nimport HttpRequestService from \"./HttpRequestService\";\n\nexport default class UploadService {\n private store: AppStore;\n\n constructor(store: AppStore) {\n this.store = store;\n }\n\n upload() {\n const filesWaiting = this.store.getFilesWaiting();\n if(filesWaiting.length) {\n filesWaiting.forEach((fileItem) => {\n // Set uploading status\n fileItem.status = 'uploading';\n fileItem.uploadProcess = 0;\n this.store.updateFileItem(fileItem);\n\n if(this.store.options.chunkSize) {\n this.sendChunkedFile(fileItem, 0);\n } else {\n this.sendFile(fileItem);\n }\n });\n }\n }\n\n sendChunkedFile(fileItem: FileItemInterface, start: number) {\n\n if(this.store.options.chunkSize && fileItem.size && fileItem.data) {\n // Slicing file\n const sliceSize = this.store.options.chunkSize * 1024 * 1024;\n const sliceEnd = start + sliceSize;\n const nextSlice = sliceEnd + 1;\n const chunkEnd = Math.min(sliceEnd , fileItem.size);\n const chunk = fileItem.data.slice(start, nextSlice);\n\n // Check if upload is complete\n let request = new HttpRequestService(this.store).request('POST', this.store.options.uploadUrl);\n const contentRange = \"bytes \"+ start+\"-\"+ chunkEnd+\"/\"+fileItem.size;\n request.setRequestHeader(\"Content-Range\",contentRange);\n\n // request finished event\n request.addEventListener('load', () => {\n if(request.status === 200) {\n if(request.response) {\n const resp = JSON.parse(request.response);\n if(resp.filename) {\n fileItem.name = resp.filename;\n }\n }\n\n if(fileItem.size) {\n fileItem.uploadProcess = Math.min(Math.ceil((sliceEnd / fileItem.size) * 100), 100);\n }\n\n if(chunkEnd === fileItem.size) {\n fileItem.status = 'uploaded';\n this.store.updateFileItem(fileItem);\n this.upload();\n } else {\n this.store.updateFileItem(fileItem);\n this.sendChunkedFile(fileItem, nextSlice);\n }\n\n } else {\n fileItem.status = 'error';\n this.store.updateFileItem(fileItem);\n this.upload();\n }\n });\n\n let data = new FormData();\n data.append('file', chunk, fileItem.name);\n if(this.store.options?.maxFileSize) {\n // @ts-ignore\n data.append('max_file_size', this.store.options.maxFileSize * 1024);\n }\n\n request.send(data);\n }\n }\n\n sendFile(fileItem: FileItemInterface) {\n fileItem.status = 'uploading';\n fileItem.uploadProcess = 0;\n this.store.updateFileItem(fileItem);\n\n return new Promise((resolve, reject) => {\n let request = new HttpRequestService(this.store).request('POST', this.store.options.uploadUrl);\n request.setRequestHeader('accept', 'application/json');\n\n // upload progress event\n request.upload.addEventListener('progress', (e) => {\n // upload progress as percentage\n fileItem.uploadProcess = (e.loaded / e.total)*100;\n this.store.updateFileItem(fileItem);\n });\n\n // request finished event\n request.addEventListener('load', () => {\n if(request.status === 200) {\n resolve(request.response);\n if(request.response) {\n const resp = JSON.parse(request.response);\n if(resp.filename) {\n fileItem.name = resp.filename;\n }\n }\n fileItem.status = 'uploaded';\n this.store.updateFileItem(fileItem);\n this.upload();\n } else {\n reject(request.response);\n fileItem.status = 'error';\n this.store.updateFileItem(fileItem);\n this.upload();\n }\n });\n\n let data = new FormData();\n if(fileItem.data) {\n data.append('file', fileItem.data);\n }\n if(this.store.options?.maxFileSize) {\n // @ts-ignore\n data.append('max_file_size', this.store.options.maxFileSize * 1024);\n }\n\n request.send(data);\n });\n }\n\n}\n","import {isset} from \"./TypeHelper\";\nimport {CustomWindowInterface} from \"../interfaces/CustomWindowInterface\";\ndeclare let window: CustomWindowInterface;\n\nfunction $t(key: string, replacer?: object) {\n if(isset(window.huplyTranslations[key])) {\n let translation = window.huplyTranslations[key];\n if(replacer) {\n Object.entries(replacer).forEach((value) => {\n translation = translation.replace('{{'+value[0]+'}}', value[1]);\n });\n }\n\n return translation;\n } else {\n return '{{'+key+'}}';\n }\n\n\n}\n\nexport {$t};\n","import AppStore from \"../store/AppStore\";\nimport {$t} from \"../helpers/LangHelper\";\nimport ErrorInterface from \"../interfaces/ErrorInterface\";\n\nexport default class FileValidationService {\n private store: AppStore;\n\n constructor(store: AppStore) {\n this.store = store;\n }\n\n checkFileSize(fileItem: File): boolean {\n return !(this.store.options?.maxFileSize && fileItem.size > (this.store.options.maxFileSize * 1024 * 1024));\n }\n\n checkFileType(fileItem: File): boolean {\n const fileItemParts = fileItem.name.split('.');\n return this.store.options.allowedFileTypes.includes('.'+fileItemParts[fileItemParts.length - 1].toLowerCase());\n }\n\n isValidFile(fileItem: File): Array<ErrorInterface> {\n const errorBag: Array<ErrorInterface> = [];\n\n if(!this.checkFileSize(fileItem)) {\n errorBag.push({\n msg: $t('fileItemStatusErrorFileSize', {maxFileSize : this.store.options.maxFileSize})\n });\n }\n\n if(!this.checkFileType(fileItem)) {\n errorBag.push({\n msg: $t('fileItemStatusErrorFileType', {allowedFileTypes : this.store.options.allowedFileTypes.join(',')})\n });\n }\n\n return errorBag;\n }\n}\n","import {isFloat, isInteger} from \"./TypeHelper\";\n\nfunction generateUniqueId() {\n return Math.random().toString(36).substring(2) + Date.now().toString(36);\n}\n\nfunction getHumanNumber(value: number | string): string | number {\n let number: string | number = 0;\n const valueCasted = Number(value);\n if (isFloat(valueCasted)) {\n number = valueCasted.toFixed(2).replace('.', ',');\n } else if (isInteger(valueCasted)) {\n number = valueCasted;\n }\n\n return number;\n}\n\nexport {\n generateUniqueId,\n getHumanNumber\n};\n","import FileItemInterface from \"../interfaces/FileItemInterface\";\nimport {generateUniqueId} from \"../helpers/OutputHelper\";\nimport AppStore from \"../store/AppStore\";\nimport HttpRequestService from \"./HttpRequestService\";\nimport PreloadedFileItemInterface from \"../interfaces/PreloadedFileItemInterface\";\n\nexport default class FileService {\n\n private store: AppStore;\n\n constructor(store: AppStore) {\n this.store = store;\n }\n\n generateFileItemFromFile(file: File): Promise<FileItemInterface> {\n return new Promise<FileItemInterface>((resolve) => {\n let fileItem: FileItemInterface = {\n id: generateUniqueId(),\n name: file.name,\n size: file.size ?? 0,\n sizeMb: file.size ? (file.size / 1024 / 1024) : 0,\n sizeKb: file.size ? Number((file.size / 1024).toFixed(0)) : 0,\n status: 'waiting',\n uploadProcess: 0,\n data: file,\n }\n\n // Get data url of image\n if (\n this.checkIfIsImage(file.name)\n && fileItem.size\n && fileItem.size <= this.store.maxSizeImageView\n ) {\n this.getDataUrlFromFile(file).then((dataUrl) => {\n fileItem.url = dataUrl;\n resolve(fileItem);\n });\n } else {\n resolve(fileItem);\n }\n });\n }\n\n generateFileItemFromPreloaded(file: PreloadedFileItemInterface): Promise<FileItemInterface> {\n return new Promise<FileItemInterface>((resolve) => {\n let fileItem: FileItemInterface = {\n id: generateUniqueId(),\n name: file.name,\n size: file.size ?? 0,\n sizeMb: file.size ? (file.size / 1024 / 1024) : 0,\n sizeKb: file.size ? Number((file.size / 1024).toFixed(0)) : 0,\n uploadProcess: 0,\n status: 'preloaded'\n }\n\n // Get data url of image\n if (\n this.checkIfIsImage(file.name)\n && fileItem.size\n && fileItem.size <= this.store.maxSizeImageView\n && file.url\n ) {\n this.getBlobFromUrl(file.url).then((blob) => {\n this.getDataUrlFromFile(blob).then((dataUrl) => {\n fileItem.url = dataUrl;\n resolve(fileItem);\n });\n });\n } else {\n resolve(fileItem);\n }\n });\n }\n\n getDataUrlFromFile(file: File | Blob): Promise<string> {\n return new Promise<string>((resolve) => {\n const reader = new FileReader();\n reader.readAsDataURL(file);\n\n reader.addEventListener(\"load\", function () {\n // @ts-ignore\n resolve(reader.result);\n }, false);\n });\n }\n\n getBlobFromUrl(url: string): Promise<Blob> {\n\n return new Promise<Blob>((resolve, reject) => {\n const request = new HttpRequestService(this.store).request('GET', url);\n request.responseType = 'blob';\n request.send();\n request.addEventListener('load', () => {\n if (request.status === 200) {\n resolve(request.response);\n } else {\n reject(false);\n }\n });\n });\n }\n\n checkIfIsImage(filename: string): boolean {\n const splittedFilename = filename.split('.');\n const imgExt = this.store.imgExt;\n\n return imgExt.includes('.'+splittedFilename[splittedFilename.length - 1]);\n }\n}\n","import AppStore from \"../store/AppStore\";\nimport UploadService from \"../services/UploadService\";\nimport FileValidationService from \"../services/FileValidationService\";\nimport FileService from \"../services/FileService\";\n\nclass FileInputComponent {\n private el: HTMLInputElement;\n\n constructor(el: Element, store: AppStore) {\n this.el = el.cloneNode(true) as HTMLInputElement;\n\n // Add default class to input\n this.el.setAttribute('name', `${el.getAttribute('name')}_real'`);\n\n // Add default class to input\n this.el.classList.add('huply-input');\n\n // Add accept - Attribute\n if(store.options?.allowedFileTypes) {\n this.el.setAttribute('accept', store.options?.allowedFileTypes.join(','));\n }\n\n // File added\n this.el.addEventListener('change', (e) => {\n e.preventDefault();\n\n if(e.target) {\n // @ts-ignore\n [...e.target.files].forEach((item) => {\n // Validate file\n const validationService = new FileValidationService(store);\n const validationMsg = validationService.isValidFile(item);\n new FileService(store).generateFileItemFromFile(item).then((fileItem) => {\n store.addFileItem(fileItem);\n\n // Check for errors\n if(validationMsg.length !== 0) {\n fileItem.status = 'error';\n fileItem.statusMsg = validationMsg.map((item) => item.msg).join(', ');\n store.updateFileItem(fileItem);\n }\n\n new UploadService(store).upload();\n });\n });\n }\n\n });\n }\n\n render(): HTMLInputElement {\n return this.el;\n }\n}\n\n\nexport default FileInputComponent;\n","import FileItemInterface from \"../interfaces/FileItemInterface\";\nimport {$t} from \"../helpers/LangHelper\";\nimport AppStore from \"../store/AppStore\";\nimport FileService from \"../services/FileService\";\nimport {getHumanNumber} from \"../helpers/OutputHelper\";\n\nclass FileListComponent {\n private fileItem: FileItemInterface;\n private listElement!: HTMLElement;\n private store: AppStore;\n\n constructor(fileItem: FileItemInterface, store: AppStore) {\n this.fileItem = fileItem;\n this.store = store;\n\n // Listen to status changes\n this.store.events.subscribe('fileItemUpdate', (fileItem: FileItemInterface) => {\n if(this.fileItem.id === fileItem.id) {\n this.updateHeadline(fileItem);\n this.updateSubline(fileItem);\n this.updateListEl(fileItem);\n }\n });\n\n this.store.events.subscribe('fileDeleted', (fileItem: FileItemInterface) => {\n if(this.fileItem.id === fileItem.id) {\n this.listElement.remove();\n }\n });\n }\n\n render(): HTMLElement {\n const li = this.getListEl();\n\n // Image or icon\n li.appendChild(this.getVisual())\n\n // Description\n const descriptionEl = document.createElement('div');\n\n // Generate name tag\n descriptionEl.appendChild(this.getHeadline());\n\n // Generate subline tag\n descriptionEl.appendChild(this.getSubline());\n\n li.appendChild(descriptionEl);\n\n // Actions\n li.appendChild(this.getActions());\n\n this.listElement = li;\n\n return li;\n }\n\n getListEl(): HTMLElement {\n const li = document.createElement('li');\n li.classList.add('huply-file-item');\n\n return li;\n }\n\n updateListEl(fileItem: FileItemInterface) {\n this.listElement.classList.remove('is-uploading');\n this.listElement.classList.remove('is-preloaded');\n this.listElement.classList.remove('is-error');\n this.listElement.classList.remove('is-deleted');\n\n if(fileItem.status === 'uploading') {\n this.listElement.classList.add('is-uploading');\n } else if(fileItem.status === 'preloaded') {\n this.listElement.classList.add('is-preloaded');\n } else if(fileItem.status === 'error') {\n this.listElement.classList.add('is-error');\n } else if(fileItem.status === 'uploaded') {\n this.listElement.classList.add('is-uploaded');\n } else if(fileItem.status === 'deleted') {\n this.listElement.classList.add('is-deleted');\n }\n }\n\n getSubline(): HTMLElement {\n const sublineEl = document.createElement('p');\n sublineEl.classList.add('huply-file-item-subline');\n sublineEl.textContent = $t('fileItemStatusWaiting');\n\n return sublineEl;\n }\n\n updateSubline(fileItem: FileItemInterface) {\n const sublineEl = this.listElement.querySelector('.huply-file-item-subline');\n if (sublineEl) {\n if (fileItem.status === 'uploading') {\n if (fileItem.uploadProcess) {\n sublineEl.textContent = $t('fileItemStatusUploading') + ' (' + fileItem.uploadProcess.toFixed(0) + '%)';\n }\n } else if (fileItem.status === 'error') {\n sublineEl.textContent = fileItem.statusMsg ?? $t('fileItemStatusError');\n } else if (fileItem.status === 'uploaded' || fileItem.status === 'preloaded') {\n sublineEl.textContent = fileItem.sizeMb && fileItem.sizeMb < 1 ? `${fileItem.sizeKb} KB` : `${getHumanNumber(fileItem.sizeMb)} MB`;\n }\n }\n }\n\n getHeadline(): HTMLElement {\n const nameEl = document.createElement('p');\n nameEl.textContent = this.fileItem.name;\n nameEl.classList.add('huply-file-item-headline');\n\n return nameEl;\n }\n\n updateHeadline(fileItem: FileItemInterface) {\n const headline = this.listElement.querySelector('.huply-file-item-headline');\n if(headline) {\n headline.textContent = fileItem.name;\n }\n }\n\n getVisual(): HTMLElement {\n const visiualEl = document.createElement('div');\n visiualEl.classList.add('huply-file-item-visual');\n const fileService = new FileService(this.store);\n\n // Check if file is image\n if(fileService.checkIfIsImage(this.fileItem.name)) {\n if(this.fileItem.url) {\n const imgEl = document.createElement('img');\n imgEl.classList.add('is-hidden');\n visiualEl.appendChild(imgEl);\n imgEl.setAttribute('src', this.fileItem.url);\n setTimeout(() => {\n imgEl.classList.remove('is-hidden');\n }, 5);\n } else {\n visiualEl.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M152 120c-26.51 0-48 21.49-48 48s21.49 48 48 48s48-21.49 48-48S178.5 120 152 120zM447.1 32h-384C28.65 32-.0091 60.65-.0091 96v320c0 35.35 28.65 64 63.1 64h384c35.35 0 64-28.65 64-64V96C511.1 60.65 483.3 32 447.1 32zM463.1 409.3l-136.8-185.9C323.8 218.8 318.1 216 312 216c-6.113 0-11.82 2.768-15.21 7.379l-106.6 144.1l-37.09-46.1c-3.441-4.279-8.934-6.809-14.77-6.809c-5.842 0-11.33 2.529-14.78 6.809l-75.52 93.81c0-.0293 0 .0293 0 0L47.99 96c0-8.822 7.178-16 16-16h384c8.822 0 16 7.178 16 16V409.3z\"/></svg>';\n }\n } else {\n visiualEl.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 384 512\"><path d=\"M365.3 93.38l-74.63-74.64C278.6 6.743 262.3 0 245.4 0L64-.0001c-35.35 0-64 28.65-64 64l.0065 384c0 35.35 28.65 64 64 64H320c35.2 0 64-28.8 64-64V138.6C384 121.7 377.3 105.4 365.3 93.38zM320 464H64.02c-8.836 0-15.1-7.163-16-15.1L48 64.13c-.0004-8.837 7.163-16 16-16h160L224 128c0 17.67 14.33 32 32 32h79.1v288C336 456.8 328.8 464 320 464z\"/></svg>';\n }\n\n return visiualEl;\n }\n\n getActions(): HTMLElement {\n const actionsEl = document.createElement('div');\n actionsEl.classList.add('huply-file-item-actions');\n const deleteEl = this.getDeleteAction();\n actionsEl.appendChild(deleteEl);\n\n return actionsEl;\n }\n\n getDeleteAction(): HTMLElement {\n const deleteEl = document.createElement('a');\n deleteEl.setAttribute('href', '#');\n deleteEl.classList.add('huply-file-item-actions-delete');\n deleteEl.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><path d=\"M424 80C437.3 80 448 90.75 448 104C448 117.3 437.3 128 424 128H412.4L388.4 452.7C385.9 486.1 358.1 512 324.6 512H123.4C89.92 512 62.09 486.1 59.61 452.7L35.56 128H24C10.75 128 0 117.3 0 104C0 90.75 10.75 80 24 80H93.82L130.5 24.94C140.9 9.357 158.4 0 177.1 0H270.9C289.6 0 307.1 9.358 317.5 24.94L354.2 80H424zM177.1 48C174.5 48 171.1 49.34 170.5 51.56L151.5 80H296.5L277.5 51.56C276 49.34 273.5 48 270.9 48H177.1zM364.3 128H83.69L107.5 449.2C108.1 457.5 115.1 464 123.4 464H324.6C332.9 464 339.9 457.5 340.5 449.2L364.3 128z\"/></svg>';\n deleteEl.addEventListener('click', (e) => {\n e.preventDefault();\n this.store.deleteFileItem(this.fileItem);\n });\n\n return deleteEl;\n }\n\n}\n\nexport default FileListComponent;\n","import FileListItemComponent from \"./FileListItemComponent\";\nimport FileItemInterface from \"../interfaces/FileItemInterface\";\nimport AppStore from \"../store/AppStore\";\n\nclass FileListComponent {\n\n private fileList: Element;\n private store: AppStore;\n\n constructor(store: AppStore) {\n this.store = store;\n\n // Generate ul element\n this.fileList = document.createElement('ul');\n this.fileList.classList.add('huply-file-list');\n\n // Check if file is added and add new file item to list\n // Show list, if more than 1 file allowed\n if(this.store.options.multiple) {\n store.events.subscribe('fileAdded', (fileItem: FileItemInterface) => {\n this.addChild(fileItem);\n });\n }\n }\n\n render() {\n return this.fileList;\n }\n\n addChild(fileItem: FileItemInterface) {\n const fileListItemComponent = new FileListItemComponent(fileItem, this.store);\n this.fileList.appendChild(fileListItemComponent.render());\n }\n}\n\nexport default FileListComponent;\n","import AppStore from \"../store/AppStore\";\nimport {$t} from \"../helpers/LangHelper\";\nimport FileItemInterface from \"../interfaces/FileItemInterface\";\nimport UploadService from \"../services/UploadService\";\nimport FileValidationService from \"../services/FileValidationService\";\nimport FileService from \"../services/FileService\";\nimport {getHumanNumber} from \"../helpers/OutputHelper\";\n\nclass FileDropzoneComponent {\n protected store: AppStore;\n protected dropzone: HTMLElement | undefined;\n protected headline: HTMLElement | undefined;\n protected subline: HTMLElement | undefined;\n protected uploadIcon: HTMLElement | undefined;\n protected deleteIcon: HTMLElement | undefined;\n protected descWrapper: HTMLElement | undefined;\n protected baseCssClass: string = '';\n\n constructor(store: AppStore) {\n this.store = store;\n\n // Check if file is added and add new file item to list\n // Show list, if more than 1 file allowed\n if(!this.store.options.multiple) {\n store.events.subscribe('fileItemUpdate', (fileItem: FileItemInterface) => {\n this.updateHeadline(fileItem);\n this.updateSubline(fileItem);\n this.updateUploadIcon(fileItem);\n this.updateDeleteIcon(fileItem);\n this.updateDescriptionWrapper(fileItem);\n });\n\n store.events.subscribe('fileDeleted', (fileItem: FileItemInterface) => {\n this.updateHeadline(fileItem);\n this.updateSubline(fileItem);\n this.updateUploadIcon(fileItem);\n this.updateDeleteIcon(fileItem);\n this.updateDescriptionWrapper(fileItem);\n });\n }\n }\n\n render() {\n this.dropzone = document.createElement('div');\n if(this.baseCssClass) {\n this.dropzone.classList.add(this.baseCssClass);\n }\n\n this.getTemplate();\n\n this.setEvents();\n\n return this.dropzone;\n }\n\n getTemplate(): HTMLElement | void {}\n\n setEvents(): void {\n if(this.dropzone) {\n // Click event\n this.dropzone.addEventListener('click', () => {\n this.store.components.input?.click();\n });\n\n // Dragover\n this.dropzone.addEventListener('dragover', (e) => {\n e.preventDefault();\n this.dropzone?.classList.add('is-dragover');\n });\n\n // Dragleave\n this.dropzone.addEventListener('dragleave', (e) => {\n e.preventDefault();\n this.dropzone?.classList.remove('is-dragover');\n });\n\n // Drop\n this.dropzone.addEventListener('drop', (e) => {\n e.preventDefault();\n const uploadService = new UploadService(this.store);\n if(e.dataTransfer) {\n for (var i=0; i < e.dataTransfer.items.length; i++) {\n const item = e.dataTransfer.items[i].getAsFile();\n if(item) {\n // Validate file\n const validationService = new FileValidationService(this.store);\n const validationMsg = validationService.isValidFile(item);\n new FileService(this.store).generateFileItemFromFile(item).then((fileItem) => {\n this.store.addFileItem(fileItem);\n\n // Check for errors\n if(validationMsg.length !== 0) {\n fileItem.status = 'error';\n fileItem.statusMsg = validationMsg.map((item) => item.msg).join(', ')\n this.store.updateFileItem(fileItem);\n }\n\n uploadService.upload();\n });\n }\n }\n }\n });\n }\n }\n\n getDescriptionWrapper() {\n this.descWrapper = document.createElement('div');\n this.descWrapper.classList.add(this.baseCssClass+'-desc');\n\n return this.descWrapper;\n }\n\n updateDescriptionWrapper(fileItem: FileItemInterface) {\n if(this.descWrapper) {\n this.descWrapper.classList.remove('is-uploading');\n this.descWrapper.classList.remove('is-preloaded');\n this.descWrapper.classList.remove('is-error');\n this.descWrapper.classList.remove('is-uploaded');\n\n if(fileItem.status === 'uploading') {\n this.descWrapper.classList.add('is-uploading');\n } else if(fileItem.status === 'preloaded') {\n this.descWrapper.classList.add('is-preloaded');\n } else if(fileItem.status === 'error') {\n this.descWrapper.classList.add('is-error');\n } else if(fileItem.status === 'uploaded') {\n this.descWrapper.classList.add('is-uploaded');\n }\n }\n }\n\n getUploadIcon(): HTMLElement {\n this.uploadIcon = document.createElement('div');\n this.uploadIcon.classList.add(this.baseCssClass+'-icon-upload');\n this.uploadIcon.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 512\"><path d=\"M303 175C312.4 165.7 327.6 165.7 336.1 175L416.1 255C426.3 264.4 426.3 279.6 416.1 288.1C407.6 298.3 392.4 298.3 383 288.1L344 249.9V384C344 397.3 333.3 408 320 408C306.7 408 296 397.3 296 384V249.9L256.1 288.1C247.6 298.3 232.4 298.3 223 288.1C213.7 279.6 213.7 264.4 223 255L303 175zM144 480C64.47 480 0 415.5 0 336C0 273.3 40.07 219.1 96 200.2V200C96 107.2 171.2 32 264 32C314.9 32 360.4 54.6 391.3 90.31C406.2 83.68 422.6 80 440 80C506.3 80 560 133.7 560 200C560 206.6 559.5 213 558.5 219.3C606.5 240.3 640 288.3 640 344C640 416.4 583.4 475.6 512 479.8V480H144zM264 80C197.7 80 144 133.7 144 200L144 234.1L111.1 245.5C74.64 258.7 48 294.3 48 336C48 389 90.98 432 144 432H506.6L509.2 431.8C555.4 429.2 592 390.8 592 344C592 308 570.4 276.9 539.2 263.3L505.1 248.4L511.1 211.7C511.7 207.9 512 204 512 200C512 160.2 479.8 128 440 128C429.5 128 419.6 130.2 410.8 134.2L378.2 148.7L354.9 121.7C332.8 96.08 300.3 80 263.1 80L264 80z\"/></svg>`;\n\n return this.uploadIcon;\n }\n\n updateUploadIcon(fileItem: FileItemInterface) {\n if(this.uploadIcon) {\n if(fileItem.status === 'uploading' && fileItem.uploadProcess === 0) {\n this.uploadIcon.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 576 512\"><path d=\"M264 24C264 10.75 274.7 0 288 0C429.4 0 544 114.6 544 256C544 302.6 531.5 346.4 509.7 384C503.1 395.5 488.4 399.4 476.9 392.8C465.5 386.2 461.5 371.5 468.2 360C485.9 329.4 496 293.9 496 255.1C496 141.1 402.9 47.1 288 47.1C274.7 47.1 264 37.25 264 23.1V24z\"/></svg>';\n } else if(fileItem.status === 'error') {\n this.uploadIcon.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 464c-114.7 0-208-93.31-208-208S141.3 48 256 48s208 93.31 208 208S370.7 464 256 464zM256 304c13.25 0 24-10.75 24-24v-128C280 138.8 269.3 128 256 128S232 138.8 232 152v128C232 293.3 242.8 304 256 304zM256 337.1c-17.36 0-31.44 14.08-31.44 31.44C224.6 385.9 238.6 400 256 400s31.44-14.08 31.44-31.44C287.4 351.2 273.4 337.1 256 337.1z\"/></svg>';\n } else if(fileItem.status === 'uploaded') {\n this.uploadIcon.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M243.8 339.8C232.9 350.7 215.1 350.7 204.2 339.8L140.2 275.8C129.3 264.9 129.3 247.1 140.2 236.2C151.1 225.3 168.9 225.3 179.8 236.2L224 280.4L332.2 172.2C343.1 161.3 360.9 161.3 371.8 172.2C382.7 183.1 382.7 200.9 371.8 211.8L243.8 339.8zM512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM256 48C141.1 48 48 141.1 48 256C48 370.9 141.1 464 256 464C370.9 464 464 370.9 464 256C464 141.1 370.9 48 256 48z\"/></svg>';\n } else if(fileItem.status === 'deleted' && this.store.getFilesUploading().length === 0) {\n this.uploadIcon.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 512\"><path d=\"M303 175C312.4 165.7 327.6 165.7 336.1 175L416.1 255C426.3 264.4 426.3 279.6 416.1 288.1C407.6 298.3 392.4 298.3 383 288.1L344 249.9V384C344 397.3 333.3 408 320 408C306.7 408 296 397.3 296 384V249.9L256.1 288.1C247.6 298.3 232.4 298.3 223 288.1C213.7 279.6 213.7 264.4 223 255L303 175zM144 480C64.47 480 0 415.5 0 336C0 273.3 40.07 219.1 96 200.2V200C96 107.2 171.2 32 264 32C314.9 32 360.4 54.6 391.3 90.31C406.2 83.68 422.6 80 440 80C506.3 80 560 133.7 560 200C560 206.6 559.5 213 558.5 219.3C606.5 240.3 640 288.3 640 344C640 416.4 583.4 475.6 512 479.8V480H144zM264 80C197.7 80 144 133.7 144 200L144 234.1L111.1 245.5C74.64 258.7 48 294.3 48 336C48 389 90.98 432 144 432H506.6L509.2 431.8C555.4 429.2 592 390.8 592 344C592 308 570.4 276.9 539.2 263.3L505.1 248.4L511.1 211.7C511.7 207.9 512 204 512 200C512 160.2 479.8 128 440 128C429.5 128 419.6 130.2 410.8 134.2L378.2 148.7L354.9 121.7C332.8 96.08 300.3 80 263.1 80L264 80z\"/></svg>`;\n } else if(fileItem.status === 'preloaded') {\n this.uploadIcon.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><!--! Font Awesome Pro 6.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d=\"M454.7 288.1c-12.78-3.75-26.06 3.594-29.75 16.31C403.3 379.9 333.8 432 255.1 432c-66.53 0-126.8-38.28-156.5-96h100.4c13.25 0 24-10.75 24-24S213.2 288 199.9 288h-160c-13.25 0-24 10.75-24 24v160c0 13.25 10.75 24 24 24s24-10.75 24-24v-102.1C103.7 436.4 176.1 480 255.1 480c99 0 187.4-66.31 215.1-161.3C474.8 305.1 467.4 292.7 454.7 288.1zM472 16C458.8 16 448 26.75 448 40v102.1C408.3 75.55 335.8 32 256 32C157 32 68.53 98.31 40.91 193.3C37.19 206 44.5 219.3 57.22 223c12.84 3.781 26.09-3.625 29.75-16.31C108.7 132.1 178.2 80 256 80c66.53 0 126.8 38.28 156.5 96H312C298.8 176 288 186.8 288 200S298.8 224 312 224h160c13.25 0 24-10.75 24-24v-160C496 26.75 485.3 16 472 16z\"/></svg>';\n }\n }\n }\n\n getDeleteIcon(): HTMLElement {\n this.deleteIcon = document.createElement('a');\n this.deleteIcon.setAttribute('href', '#');\n this.deleteIcon.classList.add(this.baseCssClass+'-icon-delete');\n this.deleteIcon.classList.add('is-hidden');\n this.deleteIcon.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><path d=\"M424 80C437.3 80 448 90.75 448 104C448 117.3 437.3 128 424 128H412.4L388.4 452.7C385.9 486.1 358.1 512 324.6 512H123.4C89.92 512 62.09 486.1 59.61 452.7L35.56 128H24C10.75 128 0 117.3 0 104C0 90.75 10.75 80 24 80H93.82L130.5 24.94C140.9 9.357 158.4 0 177.1 0H270.9C289.6 0 307.1 9.358 317.5 24.94L354.2 80H424zM177.1 48C174.5 48 171.1 49.34 170.5 51.56L151.5 80H296.5L277.5 51.56C276 49.34 273.5 48 270.9 48H177.1zM364.3 128H83.69L107.5 449.2C108.1 457.5 115.1 464 123.4 464H324.6C332.9 464 339.9 457.5 340.5 449.2L364.3 128z\"/></svg>`;\n this.deleteIcon.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n const fileIndex = this.store.files.findIndex((currentItem) => this.deleteIcon?.getAttribute('data-file-id') == currentItem.id);\n if(fileIndex !== -1) {\n this.store.deleteFileItem(this.store.files[fileIndex]);\n }\n });\n\n return this.deleteIcon;\n }\n\n updateDeleteIcon(fileItem: FileItemInterface) {\n if(this.deleteIcon) {\n if(fileItem.status === 'uploaded' || fileItem.status === 'preloaded') {\n this.deleteIcon.classList.remove('is-hidden');\n this.deleteIcon.setAttribute('data-file-id', fileItem.id);\n } else {\n this.deleteIcon.classList.add('is-hidden');\n }\n }\n }\n\n getHeadline(): HTMLElement {\n this.headline = document.createElement('p');\n this.headline.classList.add(this.baseCssClass+'-headline');\n this.headline.innerHTML = this.getHeadlineText();\n\n return this.headline;\n }\n\n getHeadlineText(): string {\n return `<strong>${this.store?.options.multiple ? $t('chooseFiles') : $t('chooseFile')}</strong>`;\n }\n\n updateHeadline(fileItem: FileItemInterface) {\n if(this.headline) {\n if(fileItem.status === 'deleted') {\n this.headline.innerHTML = this.getHeadlineText();\n } else {\n this.headline.innerHTML = `<strong>${fileItem.name}</strong>`;\n }\n }\n }\n\n getSubline(): HTMLElement {\n this.subline = document.createElement('p');\n this.subline.innerText = this.getSublineText();\n this.subline.classList.add(this.baseCssClass+'-subline');\n\n return this.subline;\n }\n\n getSublineText(): string {\n const sublineParts = [];\n sublineParts.push($t('allowedFileTypes', {allowedFileTypes: this.store?.options.allowedFileTypes}));\n sublineParts.push($t('maxFileSize', {maxFileSize: this.store?.options.maxFileSize}));\n return sublineParts.join(', ');\n }\n\n updateSubline(fileItem: FileItemInterface) {\n if(this.subline) {\n this.subline.classList.remove('is-uploading');\n this.subline.classList.remove('is-preloaded');\n this.subline.classList.remove('is-error');\n this.subline.classList.remove('is-uploaded');\n\n if(fileItem.status === 'uploading' && fileItem.uploadProcess) {\n this.subline.innerHTML = $t('fileItemStatusUploading') + ' ('+fileItem.uploadProcess.toFixed(0)+'%)';\n } else if(fileItem.status === 'error') {\n this.subline.innerHTML = fileItem.statusMsg ?? $t('fileItemStatusError');\n } else if(fileItem.status === 'uploaded' || fileItem.status === 'preloaded') {\n this.subline.textContent = fileItem.sizeMb && fileItem.sizeMb < 1 ? `${fileItem.sizeKb} KB` : `${getHumanNumber(fileItem.sizeMb)} MB`;\n } else {\n this.subline.innerHTML = this.getSublineText();\n }\n }\n }\n}\n\nexport default FileDropzoneComponent;\n","import AppStore from \"../store/AppStore\";\nimport FileDropzoneComponent from \"./FileDropzoneComponent\";\n\nclass FileDropzoneLgComponent extends FileDropzoneComponent{\n protected baseCssClass = 'huply-dropzone-lg';\n\n constructor(store: AppStore) {\n super(store);\n }\n\n getTemplate(): HTMLElement | void {\n\n if(this.dropzone) {\n // Delete icon\n this.dropzone.appendChild(this.getDeleteIcon());\n\n // Wrapper\n const dropzoneDescriptionWrapper = this.getDescriptionWrapper();\n\n // Icon\n dropzoneDescriptionWrapper.appendChild(this.getUploadIcon());\n\n // Headline\n dropzoneDescriptionWrapper.appendChild(this.getHeadline());\n\n // Subline\n dropzoneDescriptionWrapper.appendChild(this.getSubline());\n\n this.dropzone.appendChild(dropzoneDescriptionWrapper);\n\n return this.dropzone;\n }\n }\n}\n\nexport default FileDropzoneLgComponent;\n","import AppStore from \"../store/AppStore\";\nimport FileDropzoneComponent from \"./FileDropzoneComponent\";\nimport FileItemInterface from \"../interfaces/FileItemInterface\";\n\nclass FileDropzoneSmallComponent extends FileDropzoneComponent {\n protected baseCssClass = 'huply-dropzone-sm';\n\n constructor(store: AppStore) {\n super(store);\n\n if(!this.store.options.multiple) {\n store.events.subscribe('fileItemUpdate', (fileItem: FileItemInterface) => {\n this.updateWrapper(fileItem);\n });\n\n store.events.subscribe('fileDeleted', (fileItem: FileItemInterface) => {\n this.updateWrapper(fileItem);\n });\n }\n }\n\n getTemplate(): HTMLElement | void {\n if(this.dropzone) {\n // Wrapper\n const dropzoneWrapper = this.getWrapper();\n\n // Headline\n dropzoneWrapper.appendChild(this.getHeadline());\n\n // Subline\n dropzoneWrapper.appendChild(this.getSubline());\n\n // Icon upload\n dropzoneWrapper.appendChild(this.getUploadIcon());\n\n // Icon delete\n dropzoneWrapper.appendChild(this.getDeleteIcon());\n\n this.dropzone.appendChild(dropzoneWrapper);\n\n return this.dropzone;\n }\n }\n\n\n getWrapper() {\n this.descWrapper = document.createElement('div');\n this.descWrapper.classList.add('huply-dropzone-sm-wrapper');\n\n return this.descWrapper;\n }\n\n updateWrapper(fileItem: FileItemInterface) {\n if(this.descWrapper) {\n this.descWrapper.classList.remove('is-uploading');\n this.descWrapper.classList.remove('is-preloaded');\n this.descWrapper.classList.remove('is-error');\n this.descWrapper.classList.remove('is-uploaded');\n\n if(fileItem.status === 'uploading') {\n this.descWrapper.classList.add('is-uploading');\n } else if(fileItem.status === 'preloaded') {\n this.descWrapper.classList.add('is-preloaded');\n } else if(fileItem.status === 'error') {\n this.descWrapper.classList.add('is-error');\n } else if(fileItem.status === 'uploaded') {\n this.descWrapper.classList.add('is-uploaded');\n }\n }\n }\n}\n\nexport default FileDropzoneSmallComponent;\n","import AppStore from \"../store/AppStore\";\n\nclass FileInputHiddenComponent {\n private el: HTMLElement;\n private input: HTMLInputElement;\n\n constructor(el: HTMLElement, store: AppStore) {\n this.el = el;\n this.input = document.createElement('input');\n\n store.events.subscribe('fileItemUpdate', () => {\n this.input.setAttribute('value', JSON.stringify(store.getCategorizedFiles()));\n });\n\n store.events.subscribe('fileDeleted', () => {\n this.input.setAttribute('value', JSON.stringify(store.getCategorizedFiles()));\n });\n }\n\n render(): HTMLInputElement {\n this.input.setAttribute('type', 'hidden');\n const nameAttr = this.el.getAttribute('name');\n if(nameAttr) {\n this.input.setAttribute('name', nameAttr);\n }\n return this.input;\n }\n}\n\n\nexport default FileInputHiddenComponent;\n","import FileInputComponent from \"./FileInputComponent\";\nimport FileListComponent from \"./FileListComponent\";\nimport FileDropzoneLgComponent from \"./FileDropzoneLgComponent\";\nimport FileDropzoneSmallComponent from \"./FileDropzoneSmallComponent\";\nimport FileInputHiddenComponent from \"./FileInputHiddenComponent\";\nimport AppStore from \"../store/AppStore\";\n\nclass WrapperComponent {\n private el: HTMLElement;\n private store: AppStore;\n\n constructor(el: HTMLElement, store: AppStore) {\n this.el = el;\n this.store = store;\n }\n\n render() {\n const wrapper = document.createElement('div');\n wrapper.classList.add('huply-wrapper');\n\n // Add input file field\n // Clone input / Identical input element cannot be replaced if it is an anchestor of parent\n const inputComponent = new FileInputComponent(this.el, this.store).render();\n wrapper.appendChild(inputComponent);\n\n // Add input hidden field with file information\n const inputHiddenComponent = new FileInputHiddenComponent(this.el, this.store).render();\n wrapper.appendChild(inputHiddenComponent);\n\n // Add dropzone\n let dropzoneComponent;\n if(this.store.options.dropzoneTheme === 'sm') {\n dropzoneComponent = new FileDropzoneSmallComponent(this.store);\n wrapper.appendChild(dropzoneComponent.render());\n } else {\n dropzoneComponent = new FileDropzoneLgComponent(this.store);\n wrapper.appendChild(dropzoneComponent.render());\n }\n\n // Add file list\n const fileListComponent = new FileListComponent(this.store);\n wrapper.appendChild(fileListComponent.render());\n\n // Add elements to store\n this.store.setComponent('input', inputComponent);\n this.store.setComponent('dropzone', dropzoneComponent);\n this.store.setComponent('fileList', fileListComponent);\n\n return wrapper;\n }\n}\n\n\nexport default WrapperComponent;\n","export default {\n chooseFiles: 'Dateien auswählen',\n chooseFile: 'Datei auswählen',\n allowedFileTypes: 'Erlaubte Dateitypen: {{allowedFileTypes}}',\n maxFileSize: 'Maximale Dateigröße: {{maxFileSize}} MB',\n fileItemStatusWaiting: \"In Warteschlange\",\n fileItemStatusUploading: \"Wird hochgeladen\",\n fileItemStatusUploaded: \"Erfolgreich hochgeladen\",\n fileItemStatusPreloaded: \"Bereits hochgeladen\",\n fileItemStatusError: \"Ein Fehler ist aufgetreten.\",\n fileItemStatusErrorFileSize: \"Die Dateigröße überschreitet die Maximalgröße: {{maxFileSize}} MB\",\n fileItemStatusErrorFileType: \"Der Dateityp ist nicht erlaubt. Erlaubte Dateitypen: {{allowedFileTypes}}\",\n delete: \"Löschen\"\n}\n","export default {\n chooseFiles: 'Choose files',\n chooseFile: 'Choose file',\n allowedFileTypes: 'Allowed file types: {{allowedFileTypes}}',\n maxFileSize: 'Maximum file size: {{maxFileSize}} MB',\n fileItemStatusWaiting: \"In queue\",\n fileItemStatusUploading: \"Uploading ...\",\n fileItemStatusUploaded: \"Uploaded\",\n fileItemStatusPreloaded: \"Already uploaded\",\n fileItemStatusError: \"An error occured.\",\n fileItemStatusErrorFileSize: \"The file size exceeds the maximum size: {{maxFileSize}} MB\",\n fileItemStatusErrorFileType: \"The file type is not allowed. Allowed file types: {{allowedFileTypes}}\",\n delete: \"Delete\"\n}\n","import {isset} from \"../helpers/TypeHelper\";\n\nexport default class PubSub {\n private events: {\n // eslint-disable-next-line no-unused-vars\n [key: string]: Array<(data: object) => void>\n } = {};\n\n constructor() {}\n\n subscribe(event: string, callback: any) {\n if (!isset(this.events[event])) {\n this.events[event] = [];\n }\n\n return this.events[event].push(callback);\n }\n\n publish(event: string, data = {}) {\n if (!isset(this.events[event])) {\n return [];\n }\n\n return this.events[event].map(callback => callback(data));\n }\n}\n","import PubSub from \"./PubSub\";\nimport FileItemInterface from \"../interfaces/FileItemInterface\";\nimport FileDropzoneComponent from \"../components/FileDropzoneComponent\";\nimport FileListComponent from \"../components/FileListComponent\";\nimport HuplyOptionsInterface from \"../interfaces/HuplyOptionsInterface\";\nimport FileDropzoneSmallComponent from \"../components/FileDropzoneSmallComponent\";\nimport HttpRequestService from \"../services/HttpRequestService\";\n\nclass AppStore {\n events: PubSub;\n files: Array<FileItemInterface>;\n components: {\n input?: HTMLInputElement,\n dropzone?: HTMLElement,\n fileList?: HTMLElement\n };\n translations: Object;\n options: HuplyOptionsInterface;\n maxSizeImageView: number;\n imgExt: Array<string>;\n\n constructor() {\n this.events = new PubSub();\n this.components = {};\n this.files = [];\n this.translations = {};\n this.options = {\n allowedFileTypes: [],\n multiple: false,\n uploadUrl: '',\n dropzoneTheme: 'lg'\n };\n this.maxSizeImageView = 2000000;\n this.imgExt = ['.jpg', '.jpeg', '.png'];\n }\n\n addFileItem(fileItem: FileItemInterface) {\n if (\n !this.options.multiple &&\n this.files.length\n ) {\n this.files.forEach((fileItem) => {\n this.deleteFileItem(fileItem);\n });\n }\n this.files.push(fileItem);\n this.events.publish('fileAdded', fileItem);\n }\n\n updateFileItem(fileItem: FileItemInterface) {\n const fileIndex = this.files.findIndex((findItem) => findItem.id === fileItem.id);\n if(fileIndex !== -1) {\n this.files[fileIndex] = fileItem;\n this.events.publish('fileItemUpdate', fileItem);\n\n // Check if file is uploaded\n if(fileItem.status === 'uploaded') {\n this.events.publish('fileUploaded', fileItem);\n\n // Check if all files are uploaded\n if(this.getFilesUploading().length === 0) {\n this.events.publish('filesUploaded', fileItem);\n }\n }\n }\n }\n\n deleteFileItem(fileItem: FileItemInterface) {\n if(this.options.deleteUrl && fileItem.status === 'uploaded') {\n let request = new HttpRequestService(this).request('DELETE', this.options.deleteUrl.replace('{{filename}}', encodeURI(fileItem.name)));\n request.setRequestHeader('accept', 'application/json');\n\n let data = new FormData();\n data.append('filename', fileItem.name);\n request.send(data);\n\n // request finished event\n request.addEventListener('load', () => {\n if(request.status === 200) {\n this.files = this.files.filter((item) => fileItem.id !== item.id);\n\n fileItem.status = 'deleted';\n this.events.publish('fileDeleted', fileItem);\n } else {\n fileItem.status = 'error';\n this.events.publish('fileItemUpdate', fileItem);\n }\n });\n } else {\n fileItem.status = 'deleted';\n this.events.publish('fileDeleted', fileItem);\n }\n }\n\n getCategorizedFiles() {\n return {\n uploaded: this.getFilesUploaded(),\n preloaded: this.getFilesPreloaded(),\n deleted: this.getFilesDeleted(),\n };\n }\n\n getFilesDeleted() {\n return this.files.filter((item) => item.status === 'deleted');\n }\n\n getFilesPreloaded() {\n return this.files.filter((item) => item.status === 'preloaded');\n }\n\n getFilesUploaded() {\n return this.files.filter((item) => item.status === 'uploaded');\n }\n\n getFilesWaiting() {\n return this.files.filter((item) => item.status === 'waiting');\n }\n\n getFilesUploading() {\n return this.files.filter((item) => item.status === 'uploading');\n }\n\n setComponent(key: string, component: FileListComponent | FileDropzoneComponent | FileDropzoneSmallComponent | Node) {\n // @ts-ignore\n this.components[key] = component;\n }\n\n setTranslations(translations: Object) {\n this.translations = translations\n }\n\n setOptions(options: HuplyOptionsInterface) {\n this.options = options;\n }\n}\n\nexport default AppStore;\n","import './assets/css/style.scss';\nimport HuplyOptionsInterface from \"./interfaces/HuplyOptionsInterface\";\nimport {isElement, isObject} from \"./helpers/TypeHelper\";\nimport WrapperComponent from \"./components/WrapperComponent\";\nimport de from \"./lang/de\";\nimport en from \"./lang/en\";\nimport AppStore from \"./store/AppStore\";\nimport { CustomWindowInterface } from \"./interfaces/CustomWindowInterface\";\nimport FileService from \"./services/FileService\";\ndeclare let window: CustomWindowInterface;\n\n// eslint-disable-next-line no-unused-vars\nexport default class Huply {\n\n public options?: HuplyOptionsInterface;\n public el: HTMLElement | null;\n private store: AppStore;\n\n public constructor(el: HTMLElement, options?: HuplyOptionsInterface) {\n if(!isElement(el)) {\n throw new Error('Selected element is not type of \"Element\". Current type: '+ typeof el);\n }\n\n this.el = el;\n\n // Initialize store\n this.store = new AppStore();\n\n // Parse options\n this.options = this.parseOptions(options);\n\n // Set options to store\n if(this.options) {\n this.store.setOptions(this.options);\n }\n\n // Validate options\n this.validateOptions(this.options);\n\n // Available Translations\n const defaultTranslations = {\n 'de': de,\n 'en': en,\n };\n\n // Set translations\n // Check if translations set\n // * via options global window object\n // * via options attribute\n if(isObject(window.huplyTranslations)) {\n this.store.setTranslations(window.huplyTranslations);\n } else {\n const lang = document.querySelector('html')?.getAttribute('lang');\n if(lang === 'en' || lang === 'de') {\n // @ts-ignore\n window.huplyTranslations = defaultTranslations[this.options.lang];\n // @ts-ignore\n this.store.setTranslations(defaultTranslations[this.options.lang]);\n } else {\n window.huplyTranslations = defaultTranslations['en'];\n this.store.setTranslations(defaultTranslations['en']);\n }\n }\n\n return this;\n }\n\n init() {\n // Render Layout\n // Replace input with wrapper\n if(this.el) {\n const wrapper = new WrapperComponent(this.el, this.store).render();\n if(this.el?.parentNode) {\n this.el.parentNode.replaceChild(wrapper, this.el);\n }\n\n // Get the new generated input element\n this.el = wrapper.querySelector(this.el.tagName);\n }\n\n // Add preloaded files\n if(this.options?.preloadedFiles?.length) {\n const fileService = new FileService(this.store);\n this.options.preloadedFiles.forEach((fileItem) => {\n fileService.generateFileItemFromPreloaded(fileItem).then((newItem) => {\n this.store.addFileItem( newItem);\n newItem.status = 'preloaded';\n this.store.updateFileItem( newItem);\n });\n });\n }\n\n return this;\n }\n\n parseOptions(options: HuplyOptionsInterface | undefined): HuplyOptionsInterface {\n\n // Set default options\n let defaultOptions: HuplyOptionsInterface = {\n multiple: false,\n maxConcurrentUploads: 3,\n maxFileSize: 5,\n lang: 'de',\n uploadUrl: '',\n deleteUrl: '',\n allowedFileTypes: ['.jpg', '.jpeg', '.png', '.pdf', '.zip', '.mp4'],\n dropzoneTheme: 'lg'\n };\n\n // Merge default options with individual options\n if(isObject(options)) {\n defaultOptions = {...defaultOptions, ...options};\n }\n\n // Check for data-attributes\n defaultOptions.multiple = this.el?.hasAttribute('multiple');\n\n const dropzoneTheme = this.el?.getAttribute('data-dropzone-theme');\n if(dropzoneTheme) {\n defaultOptions.dropzoneTheme = dropzoneTheme;\n }\n\n const maxConcurrentUploads = this.el?.getAttribute('data-max-concurrent-uploads');\n if(maxConcurrentUploads) {\n defaultOptions.maxConcurrentUploads = Number(maxConcurrentUploads);\n }\n\n const maxFileSize = this.el?.getAttribute('data-max-file-size');\n if(maxFileSize) {\n defaultOptions.maxFileSize = Number(maxFileSize);\n }\n\n const uploadUrl = this.el?.getAttribute('data-upload-url');\n if(uploadUrl) {\n defaultOptions.uploadUrl = uploadUrl;\n }\n\n const deleteUrl = this.el?.getAttribute('data-delete-url');\n if(deleteUrl) {\n defaultOptions.deleteUrl = deleteUrl;\n }\n\n const headers = this.el?.getAttribute('data-headers');\n if(headers) {\n defaultOptions.headers = JSON.parse(headers);\n }\n\n const preloadedFiles = this.el?.getAttribute('data-preloaded-files');\n if(preloadedFiles) {\n try {\n const decodedFiles = atob(preloadedFiles);\n defaultOptions.preloadedFiles = JSON.parse(decodedFiles);\n } catch {\n defaultOptions.preloadedFiles = [];\n }\n }\n\n const lang = this.el?.getAttribute('data-lang');\n if(lang) {\n defaultOptions.lang = lang;\n }\n\n const translations = this.el?.getAttribute('data-translations');\n if(translations) {\n defaultOptions.translations = JSON.parse(translations);\n }\n\n const allowedFileTypes = this.el?.getAttribute('accept');\n if(allowedFileTypes) {\n defaultOptions.allowedFileTypes = allowedFileTypes.split(',');\n }\n\n const chunkSize = this.el?.getAttribute('data-chunk-size');\n if(chunkSize) {\n defaultOptions.chunkSize = Number(chunkSize);\n }\n\n return defaultOptions;\n }\n\n validateOptions(options: HuplyOptionsInterface) {\n // Check for uploadUrl existence\n if(!options.uploadUrl || options.uploadUrl.length === 0) {\n throw new Error('Option \"uploadUrl\" not set');\n }\n\n // Check for deleteUrl existence\n if(!options.deleteUrl || options.deleteUrl.length === 0) {\n throw new Error('Option \"deleteUrl\" not set');\n }\n }\n\n on(eventName: string, listener: any) {\n this.store.events.subscribe(eventName, listener);\n }\n}\n"],"names":["FileListItemComponent"],"mappings":"0ZAAA,WAAkB,EAAmB,OAC1B,AAAqB,IAAQ,MAAQ,EAAI,cAAgB,OAGpE,WAAmB,EAAkB,OAC1B,aAAc,SAmBzB,WAAe,EAAmB,OACvB,KAAQ,OAGnB,WAAiB,EAAmB,OACzB,AAAqB,IAAQ,MAAQ,CAAC,IAAQ,GAGzD,WAAmB,EAAmB,OAC3B,AAAqB,IAAQ,MAAQ,SAAS,EAAK,MAAQ,SC9B9B,CAGpC,YAAY,EAAiB,CAFrB,qBAGC,MAAQ,EAGjB,QAAQ,EAAgB,EAA6B,IAC7C,GAAU,GAAI,sBACf,MAAK,MAAM,QAAQ,oBACV,gBAAkB,KAAK,MAAM,QAAQ,mBAEzC,KAAK,EAAQ,GAClB,EAAS,KAAK,MAAM,QAAQ,iBAEpB,QAAQ,KAAK,MAAM,QAAQ,SAAS,QAAQ,AAAC,GAAS,GAEjD,iBAAiB,EAAK,GAAI,EAAK,MAIxC,UCpBoB,CAG/B,YAAY,EAAiB,CAFrB,qBAGC,MAAQ,EAGjB,QAAS,MACC,GAAe,KAAK,MAAM,kBAC7B,EAAa,UACC,QAAQ,AAAC,GAAa,GAEtB,OAAS,cACT,cAAgB,OACpB,MAAM,eAAe,GAEvB,KAAK,MAAM,QAAQ,eACb,gBAAgB,EAAU,QAE1B,SAAS,KAM9B,gBAAgB,EAA6B,EAAe,UAErD,KAAK,MAAM,QAAQ,WAAa,EAAS,MAAQ,EAAS,KAAM,MAEzD,GAAY,KAAK,MAAM,QAAQ,UAAY,KAAO,KAClD,EAAW,EAAQ,EACnB,EAAY,EAAW,EACvB,EAAW,KAAK,IAAI,EAAW,EAAS,MACxC,EAAQ,EAAS,KAAK,MAAM,EAAO,MAGrC,GAAU,GAAI,GAAmB,KAAK,OAAO,QAAQ,OAAQ,KAAK,MAAM,QAAQ,gBAC9E,GAAe,SAAU,EAAM,IAAK,EAAS,IAAI,EAAS,OACxD,iBAAiB,gBAAgB,KAGjC,iBAAiB,OAAQ,IAAM,IAChC,EAAQ,SAAW,IAAK,IACpB,EAAQ,SAAU,MACX,GAAO,KAAK,MAAM,EAAQ,UAC7B,EAAK,aACK,KAAO,EAAK,UAI1B,EAAS,SACC,cAAgB,KAAK,IAAI,KAAK,KAAM,EAAW,EAAS,KAAQ,KAAM,MAGhF,IAAa,EAAS,QACZ,OAAS,gBACb,MAAM,eAAe,QACrB,gBAEA,MAAM,eAAe,QACrB,gBAAgB,EAAU,WAI1B,OAAS,aACb,MAAM,eAAe,QACrB,cAIT,GAAO,GAAI,YACV,OAAO,OAAQ,EAAO,EAAS,MACjC,SAAK,MAAM,UAAX,cAAoB,gBAEd,OAAO,gBAAiB,KAAK,MAAM,QAAQ,YAAc,QAG1D,KAAK,IAIrB,SAAS,EAA6B,UACzB,OAAS,cACT,cAAgB,OACpB,MAAM,eAAe,GAEnB,GAAI,SAAQ,CAAC,EAAS,IAAW,UAChC,GAAU,GAAI,GAAmB,KAAK,OAAO,QAAQ,OAAQ,KAAK,MAAM,QAAQ,aAC5E,iBAAiB,SAAU,sBAG3B,OAAO,iBAAiB,WAAY,AAAC,GAAM,GAEtC,cAAiB,EAAE,OAAS,EAAE,MAAO,SACzC,MAAM,eAAe,OAItB,iBAAiB,OAAQ,IAAM,IAChC,EAAQ,SAAW,IAAK,MACf,EAAQ,UACb,EAAQ,SAAU,MACX,GAAO,KAAK,MAAM,EAAQ,UAC7B,EAAK,aACK,KAAO,EAAK,YAGpB,OAAS,gBACb,MAAM,eAAe,QACrB,gBAEE,EAAQ,YACN,OAAS,aACb,MAAM,eAAe,QACrB,cAIT,GAAO,GAAI,UACZ,EAAS,QACH,OAAO,OAAQ,EAAS,MAE9B,SAAK,MAAM,UAAX,cAAoB,gBAEd,OAAO,gBAAiB,KAAK,MAAM,QAAQ,YAAc,QAG1D,KAAK,MC/HzB,WAAY,EAAa,EAAmB,IACrC,EAAM,OAAO,kBAAkB,IAAO,IACjC,GAAc,OAAO,kBAAkB,SACxC,WACQ,QAAQ,GAAU,QAAQ,AAAC,GAAU,GAC1B,EAAY,QAAQ,KAAK,EAAM,GAAG,KAAM,EAAM,MAI7D,aAEA,KAAK,EAAI,YCXmB,CAGvC,YAAY,EAAiB,CAFrB,qBAGC,MAAQ,EAGjB,cAAc,EAAyB,aAC5B,WAAO,MAAM,wBAAS,cAAe,EAAS,KAAQ,KAAK,MAAM,QAAQ,YAAc,KAAO,MAGzG,cAAc,EAAyB,MAC7B,GAAgB,EAAS,KAAK,MAAM,WACnC,MAAK,MAAM,QAAQ,iBAAiB,SAAS,IAAI,EAAc,EAAc,OAAS,GAAG,eAGpG,YAAY,EAAuC,MACzC,GAAkC,SAEpC,MAAK,cAAc,MACV,KAAK,CACV,IAAK,EAAG,8BAA+B,CAAC,YAAc,KAAK,MAAM,QAAQ,gBAI7E,KAAK,cAAc,MACV,KAAK,CACV,IAAK,EAAG,8BAA+B,CAAC,iBAAmB,KAAK,MAAM,QAAQ,iBAAiB,KAAK,SAIrG,GCjCf,YAA4B,OACjB,MAAK,SAAS,SAAS,IAAI,UAAU,GAAK,KAAK,MAAM,SAAS,IAGzE,WAAwB,EAAyC,IACzD,GAA0B,OACxB,GAAc,OAAO,SACvB,GAAQ,KACC,EAAY,QAAQ,GAAG,QAAQ,IAAK,KACtC,EAAU,OACR,GAGN,SCTsB,CAI7B,YAAY,EAAiB,CAFrB,qBAGC,MAAQ,EAGjB,yBAAyB,EAAwC,OACtD,IAAI,SAA2B,AAAC,GAAY,UAC3C,GAA8B,CAC9B,GAAI,IACJ,KAAM,EAAK,KACX,KAAM,KAAK,OAAL,OAAa,EACnB,OAAQ,EAAK,KAAQ,EAAK,KAAO,KAAO,KAAQ,EAChD,OAAQ,EAAK,KAAO,UAAa,KAAO,MAAM,QAAQ,IAAM,EAC5D,OAAQ,UACR,cAAe,EACf,KAAM,GAKN,KAAK,eAAe,EAAK,OACtB,EAAS,MACT,EAAS,MAAQ,KAAK,MAAM,sBAE1B,mBAAmB,GAAM,KAAK,AAAC,GAAY,GACnC,IAAM,IACP,OAGJ,KAKpB,8BAA8B,EAA8D,OACjF,IAAI,SAA2B,AAAC,GAAY,UAC3C,GAA8B,CAC9B,GAAI,IACJ,KAAM,EAAK,KACX,KAAM,KAAK,OAAL,OAAa,EACnB,OAAQ,EAAK,KAAQ,EAAK,KAAO,KAAO,KAAQ,EAChD,OAAQ,EAAK,KAAO,UAAa,KAAO,MAAM,QAAQ,IAAM,EAC5D,cAAe,EACf,OAAQ,aAKR,KAAK,eAAe,EAAK,OACtB,EAAS,MACT,EAAS,MAAQ,KAAK,MAAM,kBAC5B,EAAK,SAEH,eAAe,EAAK,KAAK,KAAK,AAAC,GAAS,MACpC,mBAAmB,GAAM,KAAK,AAAC,GAAY,GACnC,IAAM,IACP,SAIR,KAKpB,mBAAmB,EAAoC,OAC5C,IAAI,SAAgB,AAAC,GAAY,MAC9B,GAAS,GAAI,cACZ,cAAc,KAEd,iBAAiB,OAAQ,UAAY,GAEhC,EAAO,SAChB,MAIX,eAAe,EAA4B,OAEhC,IAAI,SAAc,CAAC,EAAS,IAAW,MACpC,GAAU,GAAI,GAAmB,KAAK,OAAO,QAAQ,MAAO,KAC1D,aAAe,SACf,SACA,iBAAiB,OAAQ,IAAM,CAC/B,EAAQ,SAAW,MACX,EAAQ,YAET,QAMvB,eAAe,EAA2B,MAChC,GAAmB,EAAS,MAAM,WAGjC,AAFQ,MAAK,MAAM,OAEZ,SAAS,IAAI,EAAiB,EAAiB,OAAS,KCrG9E,OAAyB,CAGrB,YAAY,EAAa,EAAiB,CAFlC,0BAGC,GAAK,EAAG,UAAU,SAGlB,GAAG,aAAa,OAAQ,GAAG,EAAG,aAAa,sBAG3C,GAAG,UAAU,IAAI,eAGnB,MAAM,UAAN,cAAe,wBACT,GAAG,aAAa,SAAU,KAAM,UAAN,cAAe,iBAAiB,KAAK,WAInE,GAAG,iBAAiB,SAAU,AAAC,GAAM,GACpC,iBAEC,EAAE,SAEA,GAAG,EAAE,OAAO,OAAO,QAAQ,AAAC,GAAS,MAG5B,GAAgB,AADI,GAAI,GAAsB,GACZ,YAAY,MAChD,GAAY,GAAO,yBAAyB,GAAM,KAAK,AAAC,GAAa,GAC/D,YAAY,GAGf,EAAc,SAAW,MACf,OAAS,UACT,UAAY,EAAc,IAAI,AAAC,GAAS,EAAK,KAAK,KAAK,QAC1D,eAAe,OAGrB,GAAc,GAAO,eAQ7C,QAA2B,OAChB,MAAK,IC7CpB,OAAwB,CAKpB,YAAY,EAA6B,EAAiB,CAJlD,mBACA,sBACA,qBAGC,SAAW,OACX,MAAQ,OAGR,MAAM,OAAO,UAAU,iBAAkB,AAAC,GAAgC,CACxE,KAAK,SAAS,KAAO,EAAS,UACxB,eAAe,QACf,cAAc,QACd,aAAa,WAIrB,MAAM,OAAO,UAAU,cAAe,AAAC,GAAgC,CACrE,KAAK,SAAS,KAAO,EAAS,SACxB,YAAY,WAK7B,QAAsB,MACZ,GAAK,KAAK,cAGb,YAAY,KAAK,kBAGd,GAAgB,SAAS,cAAc,gBAG/B,YAAY,KAAK,iBAGjB,YAAY,KAAK,gBAE5B,YAAY,KAGZ,YAAY,KAAK,mBAEf,YAAc,EAEZ,EAGX,WAAyB,MACf,GAAK,SAAS,cAAc,eAC/B,UAAU,IAAI,mBAEV,EAGX,aAAa,EAA6B,MACjC,YAAY,UAAU,OAAO,qBAC7B,YAAY,UAAU,OAAO,qBAC7B,YAAY,UAAU,OAAO,iBAC7B,YAAY,UAAU,OAAO,cAE/B,EAAS,SAAW,iBACd,YAAY,UAAU,IAAI,gBACzB,EAAS,SAAW,iBACrB,YAAY,UAAU,IAAI,gBACzB,EAAS,SAAW,aACrB,YAAY,UAAU,IAAI,YACzB,EAAS,SAAW,gBACrB,YAAY,UAAU,IAAI,eACzB,EAAS,SAAW,gBACrB,YAAY,UAAU,IAAI,cAIvC,YAA0B,MAChB,GAAY,SAAS,cAAc,cAC/B,UAAU,IAAI,6BACd,YAAc,EAAG,yBAEpB,EAGX,cAAc,EAA6B,YACjC,GAAY,KAAK,YAAY,cAAc,4BAC7C,IACI,EAAS,SAAW,YAChB,EAAS,kBACC,YAAc,EAAG,2BAA6B,KAAO,EAAS,cAAc,QAAQ,GAAK,MAEhG,EAAS,SAAW,UACjB,YAAc,KAAS,YAAT,OAAsB,EAAG,uBAC1C,GAAS,SAAW,YAAc,EAAS,SAAW,iBACnD,YAAc,EAAS,QAAU,EAAS,OAAS,EAAI,GAAG,EAAS,YAAc,GAAG,EAAe,EAAS,eAKlI,aAA2B,MACjB,GAAS,SAAS,cAAc,cAC/B,YAAc,KAAK,SAAS,OAC5B,UAAU,IAAI,4BAEd,EAGX,eAAe,EAA6B,MAClC,GAAW,KAAK,YAAY,cAAc,6BAC7C,MACU,YAAc,EAAS,MAIxC,WAAyB,MACf,GAAY,SAAS,cAAc,YAC/B,UAAU,IAAI,0BAIrB,AAHiB,GAAI,GAAY,KAAK,OAG1B,eAAe,KAAK,SAAS,SACrC,KAAK,SAAS,IAAK,MACZ,GAAQ,SAAS,cAAc,SAC/B,UAAU,IAAI,eACV,YAAY,KAChB,aAAa,MAAO,KAAK,SAAS,gBAC7B,IAAM,GACP,UAAU,OAAO,cACxB,UAEO,UAAY,2kBAGhB,UAAY,0aAGnB,GAGX,YAA0B,MAChB,GAAY,SAAS,cAAc,SAC/B,UAAU,IAAI,gCAClB,GAAW,KAAK,2BACZ,YAAY,GAEf,EAGX,iBAA+B,MACrB,GAAW,SAAS,cAAc,cAC/B,aAAa,OAAQ,OACrB,UAAU,IAAI,oCACd,UAAY,kmBACZ,iBAAiB,QAAU,AAAC,GAAM,GACrC,sBACG,MAAM,eAAe,KAAK,YAG5B,GChKf,OAAwB,CAKpB,YAAY,EAAiB,CAHrB,mBACA,qBAGC,MAAQ,OAGR,SAAW,SAAS,cAAc,WAClC,SAAS,UAAU,IAAI,mBAIzB,KAAK,MAAM,QAAQ,YACZ,OAAO,UAAU,YAAa,AAAC,GAAgC,MAC5D,SAAS,KAK1B,QAAS,OACE,MAAK,SAGhB,SAAS,EAA6B,MAC5B,GAAwB,GAAIA,GAAsB,EAAU,KAAK,YAClE,SAAS,YAAY,EAAsB,WCvBxD,OAA4B,CAUxB,YAAY,EAAiB,CATnB,gBACA,mBACA,mBACA,kBACA,qBACA,qBACA,sBACA,sBAAuB,SAGxB,MAAQ,EAIT,KAAK,MAAM,QAAQ,aACb,OAAO,UAAU,iBAAkB,AAAC,GAAgC,MACjE,eAAe,QACf,cAAc,QACd,iBAAiB,QACjB,iBAAiB,QACjB,yBAAyB,OAG5B,OAAO,UAAU,cAAe,AAAC,GAAgC,MAC9D,eAAe,QACf,cAAc,QACd,iBAAiB,QACjB,iBAAiB,QACjB,yBAAyB,MAK1C,QAAS,aACA,SAAW,SAAS,cAAc,OACpC,KAAK,mBACC,SAAS,UAAU,IAAI,KAAK,mBAGhC,mBAEA,YAEE,KAAK,SAGhB,aAAkC,EAElC,WAAkB,CACX,KAAK,gBAEC,SAAS,iBAAiB,QAAS,IAAM,eACrC,MAAM,WAAW,gBAAO,eAI5B,SAAS,iBAAiB,WAAY,AAAC,GAAM,SAC5C,yBACG,mBAAU,UAAU,IAAI,sBAI5B,SAAS,iBAAiB,YAAa,AAAC,GAAM,SAC7C,yBACG,mBAAU,UAAU,OAAO,sBAI/B,SAAS,iBAAiB,OAAQ,AAAC,GAAM,GACxC,sBACI,GAAgB,GAAI,GAAc,KAAK,UAC1C,EAAE,oBACQ,GAAE,EAAG,EAAI,EAAE,aAAa,MAAM,OAAQ,IAAK,MAC1C,GAAO,EAAE,aAAa,MAAM,GAAG,eAClC,EAAM,MAGC,GAAgB,AADI,GAAI,GAAsB,KAAK,OACjB,YAAY,MAChD,GAAY,KAAK,OAAO,yBAAyB,GAAM,KAAK,AAAC,GAAa,MACrE,MAAM,YAAY,GAGpB,EAAc,SAAW,MACf,OAAS,UACT,UAAY,EAAc,IAAI,AAAC,GAAS,EAAK,KAAK,KAAK,WAC3D,MAAM,eAAe,MAGhB,gBAS1C,uBAAwB,aACf,YAAc,SAAS,cAAc,YACrC,YAAY,UAAU,IAAI,KAAK,aAAa,SAE1C,KAAK,YAGhB,yBAAyB,EAA6B,CAC/C,KAAK,mBACC,YAAY,UAAU,OAAO,qBAC7B,YAAY,UAAU,OAAO,qBAC7B,YAAY,UAAU,OAAO,iBAC7B,YAAY,UAAU,OAAO,eAE/B,EAAS,SAAW,iBACd,YAAY,UAAU,IAAI,gBACzB,EAAS,SAAW,iBACrB,YAAY,UAAU,IAAI,gBACzB,EAAS,SAAW,aACrB,YAAY,UAAU,IAAI,YACzB,EAAS,SAAW,iBACrB,YAAY,UAAU,IAAI,gBAK3C,eAA6B,aACpB,WAAa,SAAS,cAAc,YACpC,WAAW,UAAU,IAAI,KAAK,aAAa,qBAC3C,WAAW,UAAY,q/BAErB,KAAK,WAGhB,iBAAiB,EAA6B,CACvC,KAAK,aACD,EAAS,SAAW,aAAe,EAAS,gBAAkB,OACxD,WAAW,UAAY,kVACtB,EAAS,SAAW,aACrB,WAAW,UAAY,ifACtB,EAAS,SAAW,gBACrB,WAAW,UAAY,iiBACtB,EAAS,SAAW,WAAa,KAAK,MAAM,oBAAoB,SAAW,OAC5E,WAAW,UAAY,q/BACtB,EAAS,SAAW,mBACrB,WAAW,UAAY,u5BAKxC,eAA6B,aACpB,WAAa,SAAS,cAAc,UACpC,WAAW,aAAa,OAAQ,UAChC,WAAW,UAAU,IAAI,KAAK,aAAa,qBAC3C,WAAW,UAAU,IAAI,kBACzB,WAAW,UAAY,qmBACvB,WAAW,iBAAiB,QAAS,AAAC,GAAM,GAC3C,mBACA,uBACI,GAAY,KAAK,MAAM,MAAM,UAAU,AAAC,UAAgB,eAAK,aAAL,cAAiB,aAAa,kBAAmB,EAAY,KACxH,IAAc,SACR,MAAM,eAAe,KAAK,MAAM,MAAM,MAI5C,KAAK,WAGhB,iBAAiB,EAA6B,CACvC,KAAK,aACD,EAAS,SAAW,YAAc,EAAS,SAAW,kBAChD,WAAW,UAAU,OAAO,kBAC5B,WAAW,aAAa,eAAgB,EAAS,UAEjD,WAAW,UAAU,IAAI,cAK1C,aAA2B,aAClB,SAAW,SAAS,cAAc,UAClC,SAAS,UAAU,IAAI,KAAK,aAAa,kBACzC,SAAS,UAAY,KAAK,kBAExB,KAAK,SAGhB,iBAA0B,aACf,WAAW,SAAK,QAAL,cAAY,QAAQ,UAAW,EAAG,eAAiB,EAAG,yBAG5E,eAAe,EAA6B,CACrC,KAAK,WACD,EAAS,SAAW,eACd,SAAS,UAAY,KAAK,uBAE1B,SAAS,UAAY,WAAW,EAAS,iBAK1D,YAA0B,aACjB,QAAU,SAAS,cAAc,UACjC,QAAQ,UAAY,KAAK,sBACzB,QAAQ,UAAU,IAAI,KAAK,aAAa,YAEtC,KAAK,QAGhB,gBAAyB,cACf,GAAe,YACR,KAAK,EAAG,mBAAoB,CAAC,iBAAkB,QAAK,QAAL,cAAY,QAAQ,sBACnE,KAAK,EAAG,cAAe,CAAC,YAAa,QAAK,QAAL,cAAY,QAAQ,eAC/D,EAAa,KAAK,MAG7B,cAAc,EAA6B,OACpC,KAAK,eACC,QAAQ,UAAU,OAAO,qBACzB,QAAQ,UAAU,OAAO,qBACzB,QAAQ,UAAU,OAAO,iBACzB,QAAQ,UAAU,OAAO,eAE3B,EAAS,SAAW,aAAe,EAAS,mBACtC,QAAQ,UAAY,EAAG,2BAA6B,KAAK,EAAS,cAAc,QAAQ,GAAG,KAC1F,EAAS,SAAW,aACrB,QAAQ,UAAY,KAAS,YAAT,OAAsB,EAAG,uBAC5C,EAAS,SAAW,YAAc,EAAS,SAAW,iBACvD,QAAQ,YAAc,EAAS,QAAU,EAAS,OAAS,EAAI,GAAG,EAAS,YAAc,GAAG,EAAe,EAAS,kBAEpH,QAAQ,UAAY,KAAK,mBCzO9C,eAAsC,EAAqB,CAGvD,YAAY,EAAiB,OACnB,GAHA,sBAAe,qBAMzB,aAAkC,IAE3B,KAAK,SAAU,MAET,SAAS,YAAY,KAAK,sBAGzB,GAA6B,KAAK,iCAGb,YAAY,KAAK,mBAGjB,YAAY,KAAK,iBAGjB,YAAY,KAAK,mBAEvC,SAAS,YAAY,GAEnB,KAAK,WC1BxB,eAAyC,EAAsB,CAG3D,YAAY,EAAiB,OACnB,GAHA,sBAAe,qBAKjB,KAAK,MAAM,QAAQ,aACb,OAAO,UAAU,iBAAkB,AAAC,GAAgC,MACjE,cAAc,OAGjB,OAAO,UAAU,cAAe,AAAC,GAAgC,MAC9D,cAAc,MAK/B,aAAkC,IAC3B,KAAK,SAAU,MAER,GAAkB,KAAK,sBAGb,YAAY,KAAK,iBAGjB,YAAY,KAAK,gBAGjB,YAAY,KAAK,mBAGjB,YAAY,KAAK,sBAE5B,SAAS,YAAY,GAEnB,KAAK,UAKpB,YAAa,aACJ,YAAc,SAAS,cAAc,YACrC,YAAY,UAAU,IAAI,6BAExB,KAAK,YAGhB,cAAc,EAA6B,CACpC,KAAK,mBACC,YAAY,UAAU,OAAO,qBAC7B,YAAY,UAAU,OAAO,qBAC7B,YAAY,UAAU,OAAO,iBAC7B,YAAY,UAAU,OAAO,eAE/B,EAAS,SAAW,iBACd,YAAY,UAAU,IAAI,gBACzB,EAAS,SAAW,iBACrB,YAAY,UAAU,IAAI,gBACzB,EAAS,SAAW,aACrB,YAAY,UAAU,IAAI,YACzB,EAAS,SAAW,iBACrB,YAAY,UAAU,IAAI,iBChE/C,OAA+B,CAI3B,YAAY,EAAiB,EAAiB,CAHtC,aACA,qBAGC,GAAK,OACL,MAAQ,SAAS,cAAc,WAE9B,OAAO,UAAU,iBAAkB,IAAM,MACtC,MAAM,aAAa,QAAS,KAAK,UAAU,EAAM,4BAGpD,OAAO,UAAU,cAAe,IAAM,MACnC,MAAM,aAAa,QAAS,KAAK,UAAU,EAAM,0BAI9D,QAA2B,MAClB,MAAM,aAAa,OAAQ,eAC1B,GAAW,KAAK,GAAG,aAAa,cACnC,SACM,MAAM,aAAa,OAAQ,GAE7B,KAAK,OClBpB,OAAuB,CAInB,YAAY,EAAiB,EAAiB,CAHtC,aACA,qBAGC,GAAK,OACL,MAAQ,EAGjB,QAAS,MACC,GAAU,SAAS,cAAc,SAC/B,UAAU,IAAI,sBAIhB,GAAiB,GAAI,GAAmB,KAAK,GAAI,KAAK,OAAO,WAC3D,YAAY,QAGd,GAAuB,GAAI,GAAyB,KAAK,GAAI,KAAK,OAAO,WACvE,YAAY,MAGhB,GACD,KAAK,MAAM,QAAQ,gBAAkB,QAChB,GAAI,GAA2B,KAAK,SAChD,YAAY,EAAkB,cAElB,GAAI,GAAwB,KAAK,SAC7C,YAAY,EAAkB,gBAIpC,GAAoB,GAAI,GAAkB,KAAK,gBAC7C,YAAY,EAAkB,eAGjC,MAAM,aAAa,QAAS,QAC5B,MAAM,aAAa,WAAY,QAC/B,MAAM,aAAa,WAAY,GAE7B,GChDf,OAAe,CACX,YAAa,uBACb,WAAY,qBACZ,iBAAkB,4CAClB,YAAa,gDACb,sBAAuB,mBACvB,wBAAyB,mBACzB,uBAAwB,0BACxB,wBAAyB,sBACzB,oBAAqB,8BACrB,4BAA6B,mFAC7B,4BAA6B,4EAC7B,OAAQ,iBCZG,CACX,YAAa,eACb,WAAY,cACZ,iBAAkB,2CAClB,YAAa,wCACb,sBAAuB,WACvB,wBAAyB,gBACzB,uBAAwB,WACxB,wBAAyB,mBACzB,oBAAqB,oBACrB,4BAA6B,6DAC7B,4BAA6B,yEAC7B,OAAQ,kBCVgB,CAMxB,aAAc,CALN,gBAGJ,IAIJ,UAAU,EAAe,EAAe,OAC/B,GAAM,KAAK,OAAO,WACd,OAAO,GAAS,IAGlB,KAAK,OAAO,GAAO,KAAK,GAGnC,QAAQ,EAAe,EAAO,GAAI,OACzB,GAAM,KAAK,OAAO,IAIhB,KAAK,OAAO,GAAO,IAAI,GAAY,EAAS,IAHxC,ICZnB,QAAe,CAaX,aAAc,CAZd,iBACA,gBACA,qBAKA,uBACA,kBACA,2BACA,sBAGS,OAAS,GAAI,SACb,WAAa,QACb,MAAQ,QACR,aAAe,QACf,QAAU,CACX,iBAAkB,GAClB,SAAU,GACV,UAAW,GACX,cAAe,WAEd,iBAAmB,SACnB,OAAS,CAAC,OAAQ,QAAS,QAGpC,YAAY,EAA6B,CAEjC,CAAC,KAAK,QAAQ,UACd,KAAK,MAAM,aAEN,MAAM,QAAQ,AAAC,GAAa,MACzB,eAAe,UAGtB,MAAM,KAAK,QACX,OAAO,QAAQ,YAAa,GAGrC,eAAe,EAA6B,MAClC,GAAY,KAAK,MAAM,UAAU,AAAC,GAAa,EAAS,KAAO,EAAS,IAC3E,IAAc,UACR,MAAM,GAAa,OACnB,OAAO,QAAQ,iBAAkB,GAGnC,EAAS,SAAW,kBACd,OAAO,QAAQ,eAAgB,GAGjC,KAAK,oBAAoB,SAAW,QAC9B,OAAO,QAAQ,gBAAiB,KAMrD,eAAe,EAA6B,IACrC,KAAK,QAAQ,WAAa,EAAS,SAAW,WAAY,IACrD,GAAU,GAAI,GAAmB,MAAM,QAAQ,SAAU,KAAK,QAAQ,UAAU,QAAQ,eAAgB,UAAU,EAAS,UACvH,iBAAiB,SAAU,uBAE/B,GAAO,GAAI,YACV,OAAO,WAAY,EAAS,QACzB,KAAK,KAGL,iBAAiB,OAAQ,IAAM,CAChC,EAAQ,SAAW,UACb,MAAQ,KAAK,MAAM,OAAO,AAAC,GAAS,EAAS,KAAO,EAAK,MAErD,OAAS,eACb,OAAO,QAAQ,cAAe,OAE1B,OAAS,aACb,OAAO,QAAQ,iBAAkB,aAIrC,OAAS,eACb,OAAO,QAAQ,cAAe,GAI3C,qBAAsB,OACX,CACH,SAAU,KAAK,mBACf,UAAW,KAAK,oBAChB,QAAS,KAAK,mBAItB,iBAAkB,OACP,MAAK,MAAM,OAAO,AAAC,GAAS,EAAK,SAAW,WAGvD,mBAAoB,OACT,MAAK,MAAM,OAAO,AAAC,GAAS,EAAK,SAAW,aAGvD,kBAAmB,OACR,MAAK,MAAM,OAAO,AAAC,GAAS,EAAK,SAAW,YAGvD,iBAAkB,OACP,MAAK,MAAM,OAAO,AAAC,GAAS,EAAK,SAAW,WAGvD,mBAAoB,OACT,MAAK,MAAM,OAAO,AAAC,GAAS,EAAK,SAAW,aAGvD,aAAa,EAAa,EAA0F,MAE3G,WAAW,GAAO,EAG3B,gBAAgB,EAAsB,MAC7B,aAAe,EAGxB,WAAW,EAAgC,MAClC,QAAU,WCxHI,CAMhB,YAAY,EAAiB,EAAiC,CAJ9D,kBACA,aACC,yBAGD,CAAC,EAAU,QACJ,IAAI,OAAM,4DAA6D,MAAO,SAGnF,GAAK,OAGL,MAAQ,GAAI,SAGZ,QAAU,KAAK,aAAa,GAG9B,KAAK,cACC,MAAM,WAAW,KAAK,cAI1B,gBAAgB,KAAK,cAGpB,GAAsB,CACxB,GAAM,GACN,GAAM,OAOP,EAAS,OAAO,wBACV,MAAM,gBAAgB,OAAO,uBAC/B,MACG,GAAO,YAAS,cAAc,UAAvB,cAAgC,aAAa,QACvD,IAAS,MAAQ,IAAS,aAElB,kBAAoB,EAAoB,KAAK,QAAQ,WAEvD,MAAM,gBAAgB,EAAoB,KAAK,QAAQ,gBAErD,kBAAoB,EAAoB,QAC1C,MAAM,gBAAgB,EAAoB,WAIhD,MAGX,MAAO,cAGA,KAAK,GAAI,MACF,GAAU,GAAI,GAAiB,KAAK,GAAI,KAAK,OAAO,SACvD,SAAK,KAAL,cAAS,kBACH,GAAG,WAAW,aAAa,EAAS,KAAK,SAI7C,GAAK,EAAQ,cAAc,KAAK,GAAG,YAIzC,WAAK,UAAL,cAAc,iBAAd,cAA8B,OAAQ,MAC/B,GAAc,GAAI,GAAY,KAAK,YACpC,QAAQ,eAAe,QAAQ,AAAC,GAAa,GAClC,8BAA8B,GAAU,KAAK,AAAC,GAAY,MAC7D,MAAM,YAAa,KAChB,OAAS,iBACZ,MAAM,eAAgB,aAKhC,MAGX,aAAa,EAAmE,gCAGxE,GAAwC,CACxC,SAAU,GACV,qBAAsB,EACtB,YAAa,EACb,KAAM,KACN,UAAW,GACX,UAAW,GACX,iBAAkB,CAAC,OAAQ,QAAS,OAAQ,OAAQ,OAAQ,QAC5D,cAAe,MAIhB,EAAS,OACS,OAAI,GAAmB,MAI7B,SAAW,QAAK,KAAL,cAAS,aAAa,iBAE1C,GAAgB,QAAK,KAAL,cAAS,aAAa,uBACzC,MACgB,cAAgB,QAG7B,GAAuB,QAAK,KAAL,cAAS,aAAa,+BAChD,MACgB,qBAAuB,OAAO,SAG3C,GAAc,QAAK,KAAL,cAAS,aAAa,sBACvC,MACgB,YAAc,OAAO,SAGlC,GAAY,QAAK,KAAL,cAAS,aAAa,mBACrC,MACgB,UAAY,QAGzB,GAAY,QAAK,KAAL,cAAS,aAAa,mBACrC,MACgB,UAAY,QAGzB,GAAU,QAAK,KAAL,cAAS,aAAa,gBACnC,MACgB,QAAU,KAAK,MAAM,SAGlC,GAAiB,QAAK,KAAL,cAAS,aAAa,2BAC1C,KACK,MACM,GAAe,KAAK,KACX,eAAiB,KAAK,MAAM,WAE5B,eAAiB,QAIlC,GAAO,QAAK,KAAL,cAAS,aAAa,aAChC,MACgB,KAAO,QAGpB,GAAe,QAAK,KAAL,cAAS,aAAa,qBACxC,MACgB,aAAe,KAAK,MAAM,SAGvC,GAAmB,QAAK,KAAL,cAAS,aAAa,UAC5C,MACgB,iBAAmB,EAAiB,MAAM,WAGvD,GAAY,QAAK,KAAL,cAAS,aAAa,yBACrC,OACgB,UAAY,OAAO,IAG/B,EAGX,gBAAgB,EAAgC,IAEzC,CAAC,EAAQ,WAAa,EAAQ,UAAU,SAAW,OAC5C,IAAI,OAAM,iCAIjB,CAAC,EAAQ,WAAa,EAAQ,UAAU,SAAW,OAC5C,IAAI,OAAM,8BAIxB,GAAG,EAAmB,EAAe,MAC5B,MAAM,OAAO,UAAU,EAAW"}
|
package/dist/huply.es.js
CHANGED
|
@@ -218,18 +218,18 @@ class FileService {
|
|
|
218
218
|
__publicField(this, "store");
|
|
219
219
|
this.store = store;
|
|
220
220
|
}
|
|
221
|
-
|
|
221
|
+
generateFileItemFromFile(file) {
|
|
222
222
|
return new Promise((resolve) => {
|
|
223
|
+
var _a;
|
|
223
224
|
let fileItem = {
|
|
224
225
|
id: generateUniqueId(),
|
|
225
226
|
name: file.name,
|
|
226
|
-
size: file.size,
|
|
227
|
+
size: (_a = file.size) != null ? _a : 0,
|
|
227
228
|
sizeMb: file.size ? file.size / 1024 / 1024 : 0,
|
|
228
229
|
sizeKb: file.size ? Number((file.size / 1024).toFixed(0)) : 0,
|
|
229
230
|
status: "waiting",
|
|
230
231
|
uploadProcess: 0,
|
|
231
|
-
data: file
|
|
232
|
-
url: ""
|
|
232
|
+
data: file
|
|
233
233
|
};
|
|
234
234
|
if (this.checkIfIsImage(file.name) && fileItem.size && fileItem.size <= this.store.maxSizeImageView) {
|
|
235
235
|
this.getDataUrlFromFile(file).then((dataUrl) => {
|
|
@@ -241,6 +241,30 @@ class FileService {
|
|
|
241
241
|
}
|
|
242
242
|
});
|
|
243
243
|
}
|
|
244
|
+
generateFileItemFromPreloaded(file) {
|
|
245
|
+
return new Promise((resolve) => {
|
|
246
|
+
var _a;
|
|
247
|
+
let fileItem = {
|
|
248
|
+
id: generateUniqueId(),
|
|
249
|
+
name: file.name,
|
|
250
|
+
size: (_a = file.size) != null ? _a : 0,
|
|
251
|
+
sizeMb: file.size ? file.size / 1024 / 1024 : 0,
|
|
252
|
+
sizeKb: file.size ? Number((file.size / 1024).toFixed(0)) : 0,
|
|
253
|
+
uploadProcess: 0,
|
|
254
|
+
status: "preloaded"
|
|
255
|
+
};
|
|
256
|
+
if (this.checkIfIsImage(file.name) && fileItem.size && fileItem.size <= this.store.maxSizeImageView && file.url) {
|
|
257
|
+
this.getBlobFromUrl(file.url).then((blob) => {
|
|
258
|
+
this.getDataUrlFromFile(blob).then((dataUrl) => {
|
|
259
|
+
fileItem.url = dataUrl;
|
|
260
|
+
resolve(fileItem);
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
} else {
|
|
264
|
+
resolve(fileItem);
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
}
|
|
244
268
|
getDataUrlFromFile(file) {
|
|
245
269
|
return new Promise((resolve) => {
|
|
246
270
|
const reader = new FileReader();
|
|
@@ -286,7 +310,7 @@ class FileInputComponent {
|
|
|
286
310
|
[...e.target.files].forEach((item) => {
|
|
287
311
|
const validationService = new FileValidationService(store);
|
|
288
312
|
const validationMsg = validationService.isValidFile(item);
|
|
289
|
-
new FileService(store).
|
|
313
|
+
new FileService(store).generateFileItemFromFile(item).then((fileItem) => {
|
|
290
314
|
store.addFileItem(fileItem);
|
|
291
315
|
if (validationMsg.length !== 0) {
|
|
292
316
|
fileItem.status = "error";
|
|
@@ -364,16 +388,16 @@ class FileListComponent$1 {
|
|
|
364
388
|
}
|
|
365
389
|
updateSubline(fileItem) {
|
|
366
390
|
var _a;
|
|
367
|
-
const
|
|
368
|
-
if (
|
|
391
|
+
const sublineEl = this.listElement.querySelector(".huply-file-item-subline");
|
|
392
|
+
if (sublineEl) {
|
|
369
393
|
if (fileItem.status === "uploading") {
|
|
370
394
|
if (fileItem.uploadProcess) {
|
|
371
|
-
|
|
395
|
+
sublineEl.textContent = $t("fileItemStatusUploading") + " (" + fileItem.uploadProcess.toFixed(0) + "%)";
|
|
372
396
|
}
|
|
373
397
|
} else if (fileItem.status === "error") {
|
|
374
|
-
|
|
398
|
+
sublineEl.textContent = (_a = fileItem.statusMsg) != null ? _a : $t("fileItemStatusError");
|
|
375
399
|
} else if (fileItem.status === "uploaded" || fileItem.status === "preloaded") {
|
|
376
|
-
|
|
400
|
+
sublineEl.textContent = fileItem.sizeMb && fileItem.sizeMb < 1 ? `${fileItem.sizeKb} KB` : `${getHumanNumber(fileItem.sizeMb)} MB`;
|
|
377
401
|
}
|
|
378
402
|
}
|
|
379
403
|
}
|
|
@@ -514,7 +538,7 @@ class FileDropzoneComponent {
|
|
|
514
538
|
if (item) {
|
|
515
539
|
const validationService = new FileValidationService(this.store);
|
|
516
540
|
const validationMsg = validationService.isValidFile(item);
|
|
517
|
-
new FileService(this.store).
|
|
541
|
+
new FileService(this.store).generateFileItemFromFile(item).then((fileItem) => {
|
|
518
542
|
this.store.addFileItem(fileItem);
|
|
519
543
|
if (validationMsg.length !== 0) {
|
|
520
544
|
fileItem.status = "error";
|
|
@@ -957,15 +981,11 @@ class Huply {
|
|
|
957
981
|
if ((_c = (_b = this.options) == null ? void 0 : _b.preloadedFiles) == null ? void 0 : _c.length) {
|
|
958
982
|
const fileService = new FileService(this.store);
|
|
959
983
|
this.options.preloadedFiles.forEach((fileItem) => {
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
this.store.updateFileItem(newItem);
|
|
966
|
-
});
|
|
967
|
-
});
|
|
968
|
-
}
|
|
984
|
+
fileService.generateFileItemFromPreloaded(fileItem).then((newItem) => {
|
|
985
|
+
this.store.addFileItem(newItem);
|
|
986
|
+
newItem.status = "preloaded";
|
|
987
|
+
this.store.updateFileItem(newItem);
|
|
988
|
+
});
|
|
969
989
|
});
|
|
970
990
|
}
|
|
971
991
|
return this;
|
|
@@ -1012,7 +1032,12 @@ class Huply {
|
|
|
1012
1032
|
}
|
|
1013
1033
|
const preloadedFiles = (_h = this.el) == null ? void 0 : _h.getAttribute("data-preloaded-files");
|
|
1014
1034
|
if (preloadedFiles) {
|
|
1015
|
-
|
|
1035
|
+
try {
|
|
1036
|
+
const decodedFiles = atob(preloadedFiles);
|
|
1037
|
+
defaultOptions.preloadedFiles = JSON.parse(decodedFiles);
|
|
1038
|
+
} catch {
|
|
1039
|
+
defaultOptions.preloadedFiles = [];
|
|
1040
|
+
}
|
|
1016
1041
|
}
|
|
1017
1042
|
const lang = (_i = this.el) == null ? void 0 : _i.getAttribute("data-lang");
|
|
1018
1043
|
if (lang) {
|
package/dist/huply.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"huply.es.js","sources":["../src/helpers/TypeHelper.ts","../src/services/HttpRequestService.ts","../src/services/UploadService.ts","../src/helpers/LangHelper.ts","../src/services/FileValidationService.ts","../src/helpers/OutputHelper.ts","../src/services/FileService.ts","../src/components/FileInputComponent.ts","../src/components/FileListItemComponent.ts","../src/components/FileListComponent.ts","../src/components/FileDropzoneComponent.ts","../src/components/FileDropzoneLgComponent.ts","../src/components/FileDropzoneSmallComponent.ts","../src/components/FileInputHiddenComponent.ts","../src/components/WrapperComponent.ts","../src/lang/de.ts","../src/lang/en.ts","../src/store/PubSub.ts","../src/store/AppStore.ts","../src/main.ts"],"sourcesContent":["function isObject(obj: any): boolean {\n return obj !== undefined && obj !== null && obj.constructor === Object;\n}\n\nfunction isElement(el: any): boolean {\n return el instanceof Element;\n}\n\nfunction isArray(arr: any): boolean {\n return arr !== undefined && arr !== null && arr.constructor === Array;\n}\n\nfunction isPromise(p: any): boolean {\n return typeof p === 'object' && typeof p.then === 'function';\n}\n\nfunction returnsPromise(f: any): boolean {\n return f.constructor.name === 'AsyncFunction' || (typeof f === 'function' && isPromise(f()));\n}\n\nfunction isFunction(f: any): boolean {\n return f instanceof Function;\n}\n\nfunction isset(obj: any): boolean {\n return obj !== undefined;\n}\n\nfunction isFloat(obj: any): boolean {\n return obj !== undefined && obj !== null && !!(obj % 1);\n}\n\nfunction isInteger(obj: any): boolean {\n return obj !== undefined && obj !== null && parseInt(obj, 10) === obj;\n}\n\n\nexport { isObject, isElement, isArray, returnsPromise, isFunction, isset, isFloat, isInteger };\n","import AppStore from \"../store/AppStore\";\nimport {isObject} from \"../helpers/TypeHelper\";\n\nexport default class HttpRequestService {\n private store: AppStore;\n\n constructor(store: AppStore) {\n this.store = store;\n }\n\n request(method: string, url: string): XMLHttpRequest {\n let request = new XMLHttpRequest();\n if(this.store.options.withCredentials) {\n request.withCredentials = this.store.options.withCredentials;\n }\n request.open(method, url);\n if(isObject(this.store.options.headers)) {\n // @ts-ignore\n Object.entries(this.store.options.headers).forEach((item) => {\n // @ts-ignore\n request.setRequestHeader(item[0], item[1]);\n });\n }\n\n return request;\n }\n}\n","import AppStore from \"../store/AppStore\";\nimport FileItemInterface from \"../interfaces/FileItemInterface\";\nimport HttpRequestService from \"./HttpRequestService\";\n\nexport default class UploadService {\n private store: AppStore;\n\n constructor(store: AppStore) {\n this.store = store;\n }\n\n upload() {\n const filesWaiting = this.store.getFilesWaiting();\n if(filesWaiting.length) {\n filesWaiting.forEach((fileItem) => {\n // Set uploading status\n fileItem.status = 'uploading';\n fileItem.uploadProcess = 0;\n this.store.updateFileItem(fileItem);\n\n if(this.store.options.chunkSize) {\n this.sendChunkedFile(fileItem, 0);\n } else {\n this.sendFile(fileItem);\n }\n });\n }\n }\n\n sendChunkedFile(fileItem: FileItemInterface, start: number) {\n\n if(this.store.options.chunkSize && fileItem.size && fileItem.data) {\n // Slicing file\n const sliceSize = this.store.options.chunkSize * 1024 * 1024;\n const sliceEnd = start + sliceSize;\n const nextSlice = sliceEnd + 1;\n const chunkEnd = Math.min(sliceEnd , fileItem.size);\n const chunk = fileItem.data.slice(start, nextSlice);\n\n // Check if upload is complete\n let request = new HttpRequestService(this.store).request('POST', this.store.options.uploadUrl);\n const contentRange = \"bytes \"+ start+\"-\"+ chunkEnd+\"/\"+fileItem.size;\n request.setRequestHeader(\"Content-Range\",contentRange);\n\n // request finished event\n request.addEventListener('load', () => {\n if(request.status === 200) {\n if(request.response) {\n const resp = JSON.parse(request.response);\n if(resp.filename) {\n fileItem.name = resp.filename;\n }\n }\n\n if(fileItem.size) {\n fileItem.uploadProcess = Math.min(Math.ceil((sliceEnd / fileItem.size) * 100), 100);\n }\n\n if(chunkEnd === fileItem.size) {\n fileItem.status = 'uploaded';\n this.store.updateFileItem(fileItem);\n this.upload();\n } else {\n this.store.updateFileItem(fileItem);\n this.sendChunkedFile(fileItem, nextSlice);\n }\n\n } else {\n fileItem.status = 'error';\n this.store.updateFileItem(fileItem);\n this.upload();\n }\n });\n\n let data = new FormData();\n data.append('file', chunk, fileItem.name);\n if(this.store.options?.maxFileSize) {\n // @ts-ignore\n data.append('max_file_size', this.store.options.maxFileSize * 1024);\n }\n\n request.send(data);\n }\n }\n\n sendFile(fileItem: FileItemInterface) {\n fileItem.status = 'uploading';\n fileItem.uploadProcess = 0;\n this.store.updateFileItem(fileItem);\n\n return new Promise((resolve, reject) => {\n let request = new HttpRequestService(this.store).request('POST', this.store.options.uploadUrl);\n request.setRequestHeader('accept', 'application/json');\n\n // upload progress event\n request.upload.addEventListener('progress', (e) => {\n // upload progress as percentage\n fileItem.uploadProcess = (e.loaded / e.total)*100;\n this.store.updateFileItem(fileItem);\n });\n\n // request finished event\n request.addEventListener('load', () => {\n if(request.status === 200) {\n resolve(request.response);\n if(request.response) {\n const resp = JSON.parse(request.response);\n if(resp.filename) {\n fileItem.name = resp.filename;\n }\n }\n fileItem.status = 'uploaded';\n this.store.updateFileItem(fileItem);\n this.upload();\n } else {\n reject(request.response);\n fileItem.status = 'error';\n this.store.updateFileItem(fileItem);\n this.upload();\n }\n });\n\n let data = new FormData();\n if(fileItem.data) {\n data.append('file', fileItem.data);\n }\n if(this.store.options?.maxFileSize) {\n // @ts-ignore\n data.append('max_file_size', this.store.options.maxFileSize * 1024);\n }\n\n request.send(data);\n });\n }\n\n}\n","import {isset} from \"./TypeHelper\";\nimport {CustomWindowInterface} from \"../interfaces/CustomWindowInterface\";\ndeclare let window: CustomWindowInterface;\n\nfunction $t(key: string, replacer?: object) {\n if(isset(window.huplyTranslations[key])) {\n let translation = window.huplyTranslations[key];\n if(replacer) {\n Object.entries(replacer).forEach((value) => {\n translation = translation.replace('{{'+value[0]+'}}', value[1]);\n });\n }\n\n return translation;\n } else {\n return '{{'+key+'}}';\n }\n\n\n}\n\nexport {$t};\n","import AppStore from \"../store/AppStore\";\nimport {$t} from \"../helpers/LangHelper\";\nimport ErrorInterface from \"../interfaces/ErrorInterface\";\n\nexport default class FileValidationService {\n private store: AppStore;\n\n constructor(store: AppStore) {\n this.store = store;\n }\n\n checkFileSize(fileItem: File): boolean {\n return !(this.store.options?.maxFileSize && fileItem.size > (this.store.options.maxFileSize * 1024 * 1024));\n }\n\n checkFileType(fileItem: File): boolean {\n const fileItemParts = fileItem.name.split('.');\n return this.store.options.allowedFileTypes.includes('.'+fileItemParts[fileItemParts.length - 1].toLowerCase());\n }\n\n isValidFile(fileItem: File): Array<ErrorInterface> {\n const errorBag: Array<ErrorInterface> = [];\n\n if(!this.checkFileSize(fileItem)) {\n errorBag.push({\n msg: $t('fileItemStatusErrorFileSize', {maxFileSize : this.store.options.maxFileSize})\n });\n }\n\n if(!this.checkFileType(fileItem)) {\n errorBag.push({\n msg: $t('fileItemStatusErrorFileType', {allowedFileTypes : this.store.options.allowedFileTypes.join(',')})\n });\n }\n\n return errorBag;\n }\n}\n","import {isFloat, isInteger} from \"./TypeHelper\";\n\nfunction generateUniqueId() {\n return Math.random().toString(36).substring(2) + Date.now().toString(36);\n}\n\nfunction getHumanNumber(value: number | string): string | number {\n let number: string | number = 0;\n const valueCasted = Number(value);\n if (isFloat(valueCasted)) {\n number = valueCasted.toFixed(2).replace('.', ',');\n } else if (isInteger(valueCasted)) {\n number = valueCasted;\n }\n\n return number;\n}\n\nexport {\n generateUniqueId,\n getHumanNumber\n};\n","import FileItemInterface from \"../interfaces/FileItemInterface\";\nimport {generateUniqueId} from \"../helpers/OutputHelper\";\nimport AppStore from \"../store/AppStore\";\nimport HttpRequestService from \"./HttpRequestService\";\n\nexport default class FileService {\n\n private store: AppStore;\n\n constructor(store: AppStore) {\n this.store = store;\n }\n\n generateFileItem(file: File): Promise<FileItemInterface> {\n return new Promise<FileItemInterface>((resolve) => {\n let fileItem: FileItemInterface = {\n id: generateUniqueId(),\n name: file.name,\n size: file.size,\n sizeMb: file.size ? (file.size / 1024 / 1024) : 0,\n sizeKb: file.size ? Number((file.size / 1024).toFixed(0)) : 0,\n status: 'waiting',\n uploadProcess: 0,\n data: file,\n url: ''\n }\n\n if (this.checkIfIsImage(file.name) && fileItem.size && fileItem.size <= this.store.maxSizeImageView) {\n this.getDataUrlFromFile(file).then((dataUrl) => {\n fileItem.url = dataUrl;\n resolve(fileItem);\n });\n } else {\n resolve(fileItem);\n }\n });\n }\n\n getDataUrlFromFile(file: File | Blob): Promise<string> {\n return new Promise<string>((resolve) => {\n const reader = new FileReader();\n reader.readAsDataURL(file);\n\n reader.addEventListener(\"load\", function () {\n // @ts-ignore\n resolve(reader.result);\n }, false);\n });\n }\n\n getBlobFromUrl(url: string): Promise<Blob> {\n\n return new Promise<Blob>((resolve, reject) => {\n const request = new HttpRequestService(this.store).request('GET', url);\n request.responseType = 'blob';\n request.send();\n request.addEventListener('load', () => {\n if (request.status === 200) {\n resolve(request.response);\n } else {\n reject(false);\n }\n });\n });\n }\n\n checkIfIsImage(filename: string): boolean {\n const splittedFilename = filename.split('.');\n const imgExt = this.store.imgExt;\n\n return imgExt.includes('.'+splittedFilename[splittedFilename.length - 1]);\n }\n}\n","import AppStore from \"../store/AppStore\";\nimport UploadService from \"../services/UploadService\";\nimport FileValidationService from \"../services/FileValidationService\";\nimport FileService from \"../services/FileService\";\n\nclass FileInputComponent {\n private el: HTMLInputElement;\n\n constructor(el: Element, store: AppStore) {\n this.el = el.cloneNode(true) as HTMLInputElement;\n\n // Add default class to input\n this.el.setAttribute('name', `${el.getAttribute('name')}_real'`);\n\n // Add default class to input\n this.el.classList.add('huply-input');\n\n // Add accept - Attribute\n if(store.options?.allowedFileTypes) {\n this.el.setAttribute('accept', store.options?.allowedFileTypes.join(','));\n }\n\n // File added\n this.el.addEventListener('change', (e) => {\n e.preventDefault();\n\n if(e.target) {\n // @ts-ignore\n [...e.target.files].forEach((item) => {\n // Validate file\n const validationService = new FileValidationService(store);\n const validationMsg = validationService.isValidFile(item);\n new FileService(store).generateFileItem(item).then((fileItem) => {\n store.addFileItem(fileItem);\n\n // Check for errors\n if(validationMsg.length !== 0) {\n fileItem.status = 'error';\n fileItem.statusMsg = validationMsg.map((item) => item.msg).join(', ');\n store.updateFileItem(fileItem);\n }\n\n new UploadService(store).upload();\n });\n });\n }\n\n });\n }\n\n render(): HTMLInputElement {\n return this.el;\n }\n}\n\n\nexport default FileInputComponent;\n","import FileItemInterface from \"../interfaces/FileItemInterface\";\nimport {$t} from \"../helpers/LangHelper\";\nimport AppStore from \"../store/AppStore\";\nimport FileService from \"../services/FileService\";\nimport {getHumanNumber} from \"../helpers/OutputHelper\";\n\nclass FileListComponent {\n private fileItem: FileItemInterface;\n private listElement!: HTMLElement;\n private store: AppStore;\n\n constructor(fileItem: FileItemInterface, store: AppStore) {\n this.fileItem = fileItem;\n this.store = store;\n\n // Listen to status changes\n this.store.events.subscribe('fileItemUpdate', (fileItem: FileItemInterface) => {\n if(this.fileItem.id === fileItem.id) {\n this.updateHeadline(fileItem);\n this.updateSubline(fileItem);\n this.updateListEl(fileItem);\n }\n });\n\n this.store.events.subscribe('fileDeleted', (fileItem: FileItemInterface) => {\n if(this.fileItem.id === fileItem.id) {\n this.listElement.remove();\n }\n });\n }\n\n render(): HTMLElement {\n const li = this.getListEl();\n\n // Image or icon\n li.appendChild(this.getVisual())\n\n // Description\n const descriptionEl = document.createElement('div');\n\n // Generate name tag\n descriptionEl.appendChild(this.getHeadline());\n\n // Generate subline tag\n descriptionEl.appendChild(this.getSubline());\n\n li.appendChild(descriptionEl);\n\n // Actions\n li.appendChild(this.getActions());\n\n this.listElement = li;\n\n return li;\n }\n\n getListEl(): HTMLElement {\n const li = document.createElement('li');\n li.classList.add('huply-file-item');\n\n return li;\n }\n\n updateListEl(fileItem: FileItemInterface) {\n this.listElement.classList.remove('is-uploading');\n this.listElement.classList.remove('is-preloaded');\n this.listElement.classList.remove('is-error');\n this.listElement.classList.remove('is-deleted');\n\n if(fileItem.status === 'uploading') {\n this.listElement.classList.add('is-uploading');\n } else if(fileItem.status === 'preloaded') {\n this.listElement.classList.add('is-preloaded');\n } else if(fileItem.status === 'error') {\n this.listElement.classList.add('is-error');\n } else if(fileItem.status === 'uploaded') {\n this.listElement.classList.add('is-uploaded');\n } else if(fileItem.status === 'deleted') {\n this.listElement.classList.add('is-deleted');\n }\n }\n\n getSubline(): HTMLElement {\n const sublineEl = document.createElement('p');\n sublineEl.classList.add('huply-file-item-subline');\n sublineEl.textContent = $t('fileItemStatusWaiting');\n\n return sublineEl;\n }\n\n updateSubline(fileItem: FileItemInterface) {\n const subline = this.listElement.querySelector('.huply-file-item-subline');\n if (subline) {\n if (fileItem.status === 'uploading') {\n if (fileItem.uploadProcess) {\n subline.textContent = $t('fileItemStatusUploading') + ' (' + fileItem.uploadProcess.toFixed(0) + '%)';\n }\n } else if (fileItem.status === 'error') {\n subline.textContent = fileItem.statusMsg ?? $t('fileItemStatusError');\n } else if (fileItem.status === 'uploaded' || fileItem.status === 'preloaded') {\n subline.textContent = fileItem.sizeMb && fileItem.sizeMb < 1 ? `${fileItem.sizeKb} KB` : `${getHumanNumber(fileItem.sizeMb)} MB`;\n }\n }\n }\n\n getHeadline(): HTMLElement {\n const nameEl = document.createElement('p');\n nameEl.textContent = this.fileItem.name;\n nameEl.classList.add('huply-file-item-headline');\n\n return nameEl;\n }\n\n updateHeadline(fileItem: FileItemInterface) {\n const headline = this.listElement.querySelector('.huply-file-item-headline');\n if(headline) {\n headline.textContent = fileItem.name;\n }\n }\n\n getVisual(): HTMLElement {\n const visiualEl = document.createElement('div');\n visiualEl.classList.add('huply-file-item-visual');\n const fileService = new FileService(this.store);\n\n // Check if file is image\n if(fileService.checkIfIsImage(this.fileItem.name)) {\n if(this.fileItem.url) {\n const imgEl = document.createElement('img');\n imgEl.classList.add('is-hidden');\n visiualEl.appendChild(imgEl);\n imgEl.setAttribute('src', this.fileItem.url);\n setTimeout(() => {\n imgEl.classList.remove('is-hidden');\n }, 5);\n } else {\n visiualEl.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M152 120c-26.51 0-48 21.49-48 48s21.49 48 48 48s48-21.49 48-48S178.5 120 152 120zM447.1 32h-384C28.65 32-.0091 60.65-.0091 96v320c0 35.35 28.65 64 63.1 64h384c35.35 0 64-28.65 64-64V96C511.1 60.65 483.3 32 447.1 32zM463.1 409.3l-136.8-185.9C323.8 218.8 318.1 216 312 216c-6.113 0-11.82 2.768-15.21 7.379l-106.6 144.1l-37.09-46.1c-3.441-4.279-8.934-6.809-14.77-6.809c-5.842 0-11.33 2.529-14.78 6.809l-75.52 93.81c0-.0293 0 .0293 0 0L47.99 96c0-8.822 7.178-16 16-16h384c8.822 0 16 7.178 16 16V409.3z\"/></svg>';\n }\n } else {\n visiualEl.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 384 512\"><path d=\"M365.3 93.38l-74.63-74.64C278.6 6.743 262.3 0 245.4 0L64-.0001c-35.35 0-64 28.65-64 64l.0065 384c0 35.35 28.65 64 64 64H320c35.2 0 64-28.8 64-64V138.6C384 121.7 377.3 105.4 365.3 93.38zM320 464H64.02c-8.836 0-15.1-7.163-16-15.1L48 64.13c-.0004-8.837 7.163-16 16-16h160L224 128c0 17.67 14.33 32 32 32h79.1v288C336 456.8 328.8 464 320 464z\"/></svg>';\n }\n\n return visiualEl;\n }\n\n getActions(): HTMLElement {\n const actionsEl = document.createElement('div');\n actionsEl.classList.add('huply-file-item-actions');\n const deleteEl = this.getDeleteAction();\n actionsEl.appendChild(deleteEl);\n\n return actionsEl;\n }\n\n getDeleteAction(): HTMLElement {\n const deleteEl = document.createElement('a');\n deleteEl.setAttribute('href', '#');\n deleteEl.classList.add('huply-file-item-actions-delete');\n deleteEl.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><path d=\"M424 80C437.3 80 448 90.75 448 104C448 117.3 437.3 128 424 128H412.4L388.4 452.7C385.9 486.1 358.1 512 324.6 512H123.4C89.92 512 62.09 486.1 59.61 452.7L35.56 128H24C10.75 128 0 117.3 0 104C0 90.75 10.75 80 24 80H93.82L130.5 24.94C140.9 9.357 158.4 0 177.1 0H270.9C289.6 0 307.1 9.358 317.5 24.94L354.2 80H424zM177.1 48C174.5 48 171.1 49.34 170.5 51.56L151.5 80H296.5L277.5 51.56C276 49.34 273.5 48 270.9 48H177.1zM364.3 128H83.69L107.5 449.2C108.1 457.5 115.1 464 123.4 464H324.6C332.9 464 339.9 457.5 340.5 449.2L364.3 128z\"/></svg>';\n deleteEl.addEventListener('click', (e) => {\n e.preventDefault();\n this.store.deleteFileItem(this.fileItem);\n });\n\n return deleteEl;\n }\n\n}\n\nexport default FileListComponent;\n","import FileListItemComponent from \"./FileListItemComponent\";\nimport FileItemInterface from \"../interfaces/FileItemInterface\";\nimport AppStore from \"../store/AppStore\";\n\nclass FileListComponent {\n\n private fileList: Element;\n private store: AppStore;\n\n constructor(store: AppStore) {\n this.store = store;\n\n // Generate ul element\n this.fileList = document.createElement('ul');\n this.fileList.classList.add('huply-file-list');\n\n // Check if file is added and add new file item to list\n // Show list, if more than 1 file allowed\n if(this.store.options.multiple) {\n store.events.subscribe('fileAdded', (fileItem: FileItemInterface) => {\n this.addChild(fileItem);\n });\n }\n }\n\n render() {\n return this.fileList;\n }\n\n addChild(fileItem: FileItemInterface) {\n const fileListItemComponent = new FileListItemComponent(fileItem, this.store);\n this.fileList.appendChild(fileListItemComponent.render());\n }\n}\n\nexport default FileListComponent;\n","import AppStore from \"../store/AppStore\";\nimport {$t} from \"../helpers/LangHelper\";\nimport FileItemInterface from \"../interfaces/FileItemInterface\";\nimport UploadService from \"../services/UploadService\";\nimport FileValidationService from \"../services/FileValidationService\";\nimport FileService from \"../services/FileService\";\nimport {getHumanNumber} from \"../helpers/OutputHelper\";\n\nclass FileDropzoneComponent {\n protected store: AppStore;\n protected dropzone: HTMLElement | undefined;\n protected headline: HTMLElement | undefined;\n protected subline: HTMLElement | undefined;\n protected uploadIcon: HTMLElement | undefined;\n protected deleteIcon: HTMLElement | undefined;\n protected descWrapper: HTMLElement | undefined;\n protected baseCssClass: string = '';\n\n constructor(store: AppStore) {\n this.store = store;\n\n // Check if file is added and add new file item to list\n // Show list, if more than 1 file allowed\n if(!this.store.options.multiple) {\n store.events.subscribe('fileItemUpdate', (fileItem: FileItemInterface) => {\n this.updateHeadline(fileItem);\n this.updateSubline(fileItem);\n this.updateUploadIcon(fileItem);\n this.updateDeleteIcon(fileItem);\n this.updateDescriptionWrapper(fileItem);\n });\n\n store.events.subscribe('fileDeleted', (fileItem: FileItemInterface) => {\n this.updateHeadline(fileItem);\n this.updateSubline(fileItem);\n this.updateUploadIcon(fileItem);\n this.updateDeleteIcon(fileItem);\n this.updateDescriptionWrapper(fileItem);\n });\n }\n }\n\n render() {\n this.dropzone = document.createElement('div');\n if(this.baseCssClass) {\n this.dropzone.classList.add(this.baseCssClass);\n }\n\n this.getTemplate();\n\n this.setEvents();\n\n return this.dropzone;\n }\n\n getTemplate(): HTMLElement | void {}\n\n setEvents(): void {\n if(this.dropzone) {\n // Click event\n this.dropzone.addEventListener('click', () => {\n this.store.components.input?.click();\n });\n\n // Dragover\n this.dropzone.addEventListener('dragover', (e) => {\n e.preventDefault();\n this.dropzone?.classList.add('is-dragover');\n });\n\n // Dragleave\n this.dropzone.addEventListener('dragleave', (e) => {\n e.preventDefault();\n this.dropzone?.classList.remove('is-dragover');\n });\n\n // Drop\n this.dropzone.addEventListener('drop', (e) => {\n e.preventDefault();\n const uploadService = new UploadService(this.store);\n if(e.dataTransfer) {\n for (var i=0; i < e.dataTransfer.items.length; i++) {\n const item = e.dataTransfer.items[i].getAsFile();\n if(item) {\n // Validate file\n const validationService = new FileValidationService(this.store);\n const validationMsg = validationService.isValidFile(item);\n new FileService(this.store).generateFileItem(item).then((fileItem) => {\n this.store.addFileItem(fileItem);\n\n // Check for errors\n if(validationMsg.length !== 0) {\n fileItem.status = 'error';\n fileItem.statusMsg = validationMsg.map((item) => item.msg).join(', ')\n this.store.updateFileItem(fileItem);\n }\n\n uploadService.upload();\n });\n }\n }\n }\n });\n }\n }\n\n getDescriptionWrapper() {\n this.descWrapper = document.createElement('div');\n this.descWrapper.classList.add(this.baseCssClass+'-desc');\n\n return this.descWrapper;\n }\n\n updateDescriptionWrapper(fileItem: FileItemInterface) {\n if(this.descWrapper) {\n this.descWrapper.classList.remove('is-uploading');\n this.descWrapper.classList.remove('is-preloaded');\n this.descWrapper.classList.remove('is-error');\n this.descWrapper.classList.remove('is-uploaded');\n\n if(fileItem.status === 'uploading') {\n this.descWrapper.classList.add('is-uploading');\n } else if(fileItem.status === 'preloaded') {\n this.descWrapper.classList.add('is-preloaded');\n } else if(fileItem.status === 'error') {\n this.descWrapper.classList.add('is-error');\n } else if(fileItem.status === 'uploaded') {\n this.descWrapper.classList.add('is-uploaded');\n }\n }\n }\n\n getUploadIcon(): HTMLElement {\n this.uploadIcon = document.createElement('div');\n this.uploadIcon.classList.add(this.baseCssClass+'-icon-upload');\n this.uploadIcon.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 512\"><path d=\"M303 175C312.4 165.7 327.6 165.7 336.1 175L416.1 255C426.3 264.4 426.3 279.6 416.1 288.1C407.6 298.3 392.4 298.3 383 288.1L344 249.9V384C344 397.3 333.3 408 320 408C306.7 408 296 397.3 296 384V249.9L256.1 288.1C247.6 298.3 232.4 298.3 223 288.1C213.7 279.6 213.7 264.4 223 255L303 175zM144 480C64.47 480 0 415.5 0 336C0 273.3 40.07 219.1 96 200.2V200C96 107.2 171.2 32 264 32C314.9 32 360.4 54.6 391.3 90.31C406.2 83.68 422.6 80 440 80C506.3 80 560 133.7 560 200C560 206.6 559.5 213 558.5 219.3C606.5 240.3 640 288.3 640 344C640 416.4 583.4 475.6 512 479.8V480H144zM264 80C197.7 80 144 133.7 144 200L144 234.1L111.1 245.5C74.64 258.7 48 294.3 48 336C48 389 90.98 432 144 432H506.6L509.2 431.8C555.4 429.2 592 390.8 592 344C592 308 570.4 276.9 539.2 263.3L505.1 248.4L511.1 211.7C511.7 207.9 512 204 512 200C512 160.2 479.8 128 440 128C429.5 128 419.6 130.2 410.8 134.2L378.2 148.7L354.9 121.7C332.8 96.08 300.3 80 263.1 80L264 80z\"/></svg>`;\n\n return this.uploadIcon;\n }\n\n updateUploadIcon(fileItem: FileItemInterface) {\n if(this.uploadIcon) {\n if(fileItem.status === 'uploading' && fileItem.uploadProcess === 0) {\n this.uploadIcon.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 576 512\"><path d=\"M264 24C264 10.75 274.7 0 288 0C429.4 0 544 114.6 544 256C544 302.6 531.5 346.4 509.7 384C503.1 395.5 488.4 399.4 476.9 392.8C465.5 386.2 461.5 371.5 468.2 360C485.9 329.4 496 293.9 496 255.1C496 141.1 402.9 47.1 288 47.1C274.7 47.1 264 37.25 264 23.1V24z\"/></svg>';\n } else if(fileItem.status === 'error') {\n this.uploadIcon.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 464c-114.7 0-208-93.31-208-208S141.3 48 256 48s208 93.31 208 208S370.7 464 256 464zM256 304c13.25 0 24-10.75 24-24v-128C280 138.8 269.3 128 256 128S232 138.8 232 152v128C232 293.3 242.8 304 256 304zM256 337.1c-17.36 0-31.44 14.08-31.44 31.44C224.6 385.9 238.6 400 256 400s31.44-14.08 31.44-31.44C287.4 351.2 273.4 337.1 256 337.1z\"/></svg>';\n } else if(fileItem.status === 'uploaded') {\n this.uploadIcon.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M243.8 339.8C232.9 350.7 215.1 350.7 204.2 339.8L140.2 275.8C129.3 264.9 129.3 247.1 140.2 236.2C151.1 225.3 168.9 225.3 179.8 236.2L224 280.4L332.2 172.2C343.1 161.3 360.9 161.3 371.8 172.2C382.7 183.1 382.7 200.9 371.8 211.8L243.8 339.8zM512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM256 48C141.1 48 48 141.1 48 256C48 370.9 141.1 464 256 464C370.9 464 464 370.9 464 256C464 141.1 370.9 48 256 48z\"/></svg>';\n } else if(fileItem.status === 'deleted' && this.store.getFilesUploading().length === 0) {\n this.uploadIcon.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 512\"><path d=\"M303 175C312.4 165.7 327.6 165.7 336.1 175L416.1 255C426.3 264.4 426.3 279.6 416.1 288.1C407.6 298.3 392.4 298.3 383 288.1L344 249.9V384C344 397.3 333.3 408 320 408C306.7 408 296 397.3 296 384V249.9L256.1 288.1C247.6 298.3 232.4 298.3 223 288.1C213.7 279.6 213.7 264.4 223 255L303 175zM144 480C64.47 480 0 415.5 0 336C0 273.3 40.07 219.1 96 200.2V200C96 107.2 171.2 32 264 32C314.9 32 360.4 54.6 391.3 90.31C406.2 83.68 422.6 80 440 80C506.3 80 560 133.7 560 200C560 206.6 559.5 213 558.5 219.3C606.5 240.3 640 288.3 640 344C640 416.4 583.4 475.6 512 479.8V480H144zM264 80C197.7 80 144 133.7 144 200L144 234.1L111.1 245.5C74.64 258.7 48 294.3 48 336C48 389 90.98 432 144 432H506.6L509.2 431.8C555.4 429.2 592 390.8 592 344C592 308 570.4 276.9 539.2 263.3L505.1 248.4L511.1 211.7C511.7 207.9 512 204 512 200C512 160.2 479.8 128 440 128C429.5 128 419.6 130.2 410.8 134.2L378.2 148.7L354.9 121.7C332.8 96.08 300.3 80 263.1 80L264 80z\"/></svg>`;\n } else if(fileItem.status === 'preloaded') {\n this.uploadIcon.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><!--! Font Awesome Pro 6.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d=\"M454.7 288.1c-12.78-3.75-26.06 3.594-29.75 16.31C403.3 379.9 333.8 432 255.1 432c-66.53 0-126.8-38.28-156.5-96h100.4c13.25 0 24-10.75 24-24S213.2 288 199.9 288h-160c-13.25 0-24 10.75-24 24v160c0 13.25 10.75 24 24 24s24-10.75 24-24v-102.1C103.7 436.4 176.1 480 255.1 480c99 0 187.4-66.31 215.1-161.3C474.8 305.1 467.4 292.7 454.7 288.1zM472 16C458.8 16 448 26.75 448 40v102.1C408.3 75.55 335.8 32 256 32C157 32 68.53 98.31 40.91 193.3C37.19 206 44.5 219.3 57.22 223c12.84 3.781 26.09-3.625 29.75-16.31C108.7 132.1 178.2 80 256 80c66.53 0 126.8 38.28 156.5 96H312C298.8 176 288 186.8 288 200S298.8 224 312 224h160c13.25 0 24-10.75 24-24v-160C496 26.75 485.3 16 472 16z\"/></svg>';\n }\n }\n }\n\n getDeleteIcon(): HTMLElement {\n this.deleteIcon = document.createElement('a');\n this.deleteIcon.setAttribute('href', '#');\n this.deleteIcon.classList.add(this.baseCssClass+'-icon-delete');\n this.deleteIcon.classList.add('is-hidden');\n this.deleteIcon.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><path d=\"M424 80C437.3 80 448 90.75 448 104C448 117.3 437.3 128 424 128H412.4L388.4 452.7C385.9 486.1 358.1 512 324.6 512H123.4C89.92 512 62.09 486.1 59.61 452.7L35.56 128H24C10.75 128 0 117.3 0 104C0 90.75 10.75 80 24 80H93.82L130.5 24.94C140.9 9.357 158.4 0 177.1 0H270.9C289.6 0 307.1 9.358 317.5 24.94L354.2 80H424zM177.1 48C174.5 48 171.1 49.34 170.5 51.56L151.5 80H296.5L277.5 51.56C276 49.34 273.5 48 270.9 48H177.1zM364.3 128H83.69L107.5 449.2C108.1 457.5 115.1 464 123.4 464H324.6C332.9 464 339.9 457.5 340.5 449.2L364.3 128z\"/></svg>`;\n this.deleteIcon.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n const fileIndex = this.store.files.findIndex((currentItem) => this.deleteIcon?.getAttribute('data-file-id') == currentItem.id);\n if(fileIndex !== -1) {\n this.store.deleteFileItem(this.store.files[fileIndex]);\n }\n });\n\n return this.deleteIcon;\n }\n\n updateDeleteIcon(fileItem: FileItemInterface) {\n if(this.deleteIcon) {\n if(fileItem.status === 'uploaded' || fileItem.status === 'preloaded') {\n this.deleteIcon.classList.remove('is-hidden');\n this.deleteIcon.setAttribute('data-file-id', fileItem.id);\n } else {\n this.deleteIcon.classList.add('is-hidden');\n }\n }\n }\n\n getHeadline(): HTMLElement {\n this.headline = document.createElement('p');\n this.headline.classList.add(this.baseCssClass+'-headline');\n this.headline.innerHTML = this.getHeadlineText();\n\n return this.headline;\n }\n\n getHeadlineText(): string {\n return `<strong>${this.store?.options.multiple ? $t('chooseFiles') : $t('chooseFile')}</strong>`;\n }\n\n updateHeadline(fileItem: FileItemInterface) {\n if(this.headline) {\n if(fileItem.status === 'deleted') {\n this.headline.innerHTML = this.getHeadlineText();\n } else {\n this.headline.innerHTML = `<strong>${fileItem.name}</strong>`;\n }\n }\n }\n\n getSubline(): HTMLElement {\n this.subline = document.createElement('p');\n this.subline.innerText = this.getSublineText();\n this.subline.classList.add(this.baseCssClass+'-subline');\n\n return this.subline;\n }\n\n getSublineText(): string {\n const sublineParts = [];\n sublineParts.push($t('allowedFileTypes', {allowedFileTypes: this.store?.options.allowedFileTypes}));\n sublineParts.push($t('maxFileSize', {maxFileSize: this.store?.options.maxFileSize}));\n return sublineParts.join(', ');\n }\n\n updateSubline(fileItem: FileItemInterface) {\n if(this.subline) {\n this.subline.classList.remove('is-uploading');\n this.subline.classList.remove('is-preloaded');\n this.subline.classList.remove('is-error');\n this.subline.classList.remove('is-uploaded');\n\n if(fileItem.status === 'uploading' && fileItem.uploadProcess) {\n this.subline.innerHTML = $t('fileItemStatusUploading') + ' ('+fileItem.uploadProcess.toFixed(0)+'%)';\n } else if(fileItem.status === 'error') {\n this.subline.innerHTML = fileItem.statusMsg ?? $t('fileItemStatusError');\n } else if(fileItem.status === 'uploaded' || fileItem.status === 'preloaded') {\n this.subline.textContent = fileItem.sizeMb && fileItem.sizeMb < 1 ? `${fileItem.sizeKb} KB` : `${getHumanNumber(fileItem.sizeMb)} MB`;\n } else {\n this.subline.innerHTML = this.getSublineText();\n }\n }\n }\n}\n\nexport default FileDropzoneComponent;\n","import AppStore from \"../store/AppStore\";\nimport FileDropzoneComponent from \"./FileDropzoneComponent\";\n\nclass FileDropzoneLgComponent extends FileDropzoneComponent{\n protected baseCssClass = 'huply-dropzone-lg';\n\n constructor(store: AppStore) {\n super(store);\n }\n\n getTemplate(): HTMLElement | void {\n\n if(this.dropzone) {\n // Delete icon\n this.dropzone.appendChild(this.getDeleteIcon());\n\n // Wrapper\n const dropzoneDescriptionWrapper = this.getDescriptionWrapper();\n\n // Icon\n dropzoneDescriptionWrapper.appendChild(this.getUploadIcon());\n\n // Headline\n dropzoneDescriptionWrapper.appendChild(this.getHeadline());\n\n // Subline\n dropzoneDescriptionWrapper.appendChild(this.getSubline());\n\n this.dropzone.appendChild(dropzoneDescriptionWrapper);\n\n return this.dropzone;\n }\n }\n}\n\nexport default FileDropzoneLgComponent;\n","import AppStore from \"../store/AppStore\";\nimport FileDropzoneComponent from \"./FileDropzoneComponent\";\nimport FileItemInterface from \"../interfaces/FileItemInterface\";\n\nclass FileDropzoneSmallComponent extends FileDropzoneComponent {\n protected baseCssClass = 'huply-dropzone-sm';\n\n constructor(store: AppStore) {\n super(store);\n\n if(!this.store.options.multiple) {\n store.events.subscribe('fileItemUpdate', (fileItem: FileItemInterface) => {\n this.updateWrapper(fileItem);\n });\n\n store.events.subscribe('fileDeleted', (fileItem: FileItemInterface) => {\n this.updateWrapper(fileItem);\n });\n }\n }\n\n getTemplate(): HTMLElement | void {\n if(this.dropzone) {\n // Wrapper\n const dropzoneWrapper = this.getWrapper();\n\n // Headline\n dropzoneWrapper.appendChild(this.getHeadline());\n\n // Subline\n dropzoneWrapper.appendChild(this.getSubline());\n\n // Icon upload\n dropzoneWrapper.appendChild(this.getUploadIcon());\n\n // Icon delete\n dropzoneWrapper.appendChild(this.getDeleteIcon());\n\n this.dropzone.appendChild(dropzoneWrapper);\n\n return this.dropzone;\n }\n }\n\n\n getWrapper() {\n this.descWrapper = document.createElement('div');\n this.descWrapper.classList.add('huply-dropzone-sm-wrapper');\n\n return this.descWrapper;\n }\n\n updateWrapper(fileItem: FileItemInterface) {\n if(this.descWrapper) {\n this.descWrapper.classList.remove('is-uploading');\n this.descWrapper.classList.remove('is-preloaded');\n this.descWrapper.classList.remove('is-error');\n this.descWrapper.classList.remove('is-uploaded');\n\n if(fileItem.status === 'uploading') {\n this.descWrapper.classList.add('is-uploading');\n } else if(fileItem.status === 'preloaded') {\n this.descWrapper.classList.add('is-preloaded');\n } else if(fileItem.status === 'error') {\n this.descWrapper.classList.add('is-error');\n } else if(fileItem.status === 'uploaded') {\n this.descWrapper.classList.add('is-uploaded');\n }\n }\n }\n}\n\nexport default FileDropzoneSmallComponent;\n","import AppStore from \"../store/AppStore\";\n\nclass FileInputHiddenComponent {\n private el: HTMLElement;\n private input: HTMLInputElement;\n\n constructor(el: HTMLElement, store: AppStore) {\n this.el = el;\n this.input = document.createElement('input');\n\n store.events.subscribe('fileItemUpdate', () => {\n this.input.setAttribute('value', JSON.stringify(store.getCategorizedFiles()));\n });\n\n store.events.subscribe('fileDeleted', () => {\n this.input.setAttribute('value', JSON.stringify(store.getCategorizedFiles()));\n });\n }\n\n render(): HTMLInputElement {\n this.input.setAttribute('type', 'hidden');\n const nameAttr = this.el.getAttribute('name');\n if(nameAttr) {\n this.input.setAttribute('name', nameAttr);\n }\n return this.input;\n }\n}\n\n\nexport default FileInputHiddenComponent;\n","import FileInputComponent from \"./FileInputComponent\";\nimport FileListComponent from \"./FileListComponent\";\nimport FileDropzoneLgComponent from \"./FileDropzoneLgComponent\";\nimport FileDropzoneSmallComponent from \"./FileDropzoneSmallComponent\";\nimport FileInputHiddenComponent from \"./FileInputHiddenComponent\";\nimport AppStore from \"../store/AppStore\";\n\nclass WrapperComponent {\n private el: HTMLElement;\n private store: AppStore;\n\n constructor(el: HTMLElement, store: AppStore) {\n this.el = el;\n this.store = store;\n }\n\n render() {\n const wrapper = document.createElement('div');\n wrapper.classList.add('huply-wrapper');\n\n // Add input file field\n // Clone input / Identical input element cannot be replaced if it is an anchestor of parent\n const inputComponent = new FileInputComponent(this.el, this.store).render();\n wrapper.appendChild(inputComponent);\n\n // Add input hidden field with file information\n const inputHiddenComponent = new FileInputHiddenComponent(this.el, this.store).render();\n wrapper.appendChild(inputHiddenComponent);\n\n // Add dropzone\n let dropzoneComponent;\n if(this.store.options.dropzoneTheme === 'sm') {\n dropzoneComponent = new FileDropzoneSmallComponent(this.store);\n wrapper.appendChild(dropzoneComponent.render());\n } else {\n dropzoneComponent = new FileDropzoneLgComponent(this.store);\n wrapper.appendChild(dropzoneComponent.render());\n }\n\n // Add file list\n const fileListComponent = new FileListComponent(this.store);\n wrapper.appendChild(fileListComponent.render());\n\n // Add elements to store\n this.store.setComponent('input', inputComponent);\n this.store.setComponent('dropzone', dropzoneComponent);\n this.store.setComponent('fileList', fileListComponent);\n\n return wrapper;\n }\n}\n\n\nexport default WrapperComponent;\n","export default {\n chooseFiles: 'Dateien auswählen',\n chooseFile: 'Datei auswählen',\n allowedFileTypes: 'Erlaubte Dateitypen: {{allowedFileTypes}}',\n maxFileSize: 'Maximale Dateigröße: {{maxFileSize}} MB',\n fileItemStatusWaiting: \"In Warteschlange\",\n fileItemStatusUploading: \"Wird hochgeladen\",\n fileItemStatusUploaded: \"Erfolgreich hochgeladen\",\n fileItemStatusPreloaded: \"Bereits hochgeladen\",\n fileItemStatusError: \"Ein Fehler ist aufgetreten.\",\n fileItemStatusErrorFileSize: \"Die Dateigröße überschreitet die Maximalgröße: {{maxFileSize}} MB\",\n fileItemStatusErrorFileType: \"Der Dateityp ist nicht erlaubt. Erlaubte Dateitypen: {{allowedFileTypes}}\",\n delete: \"Löschen\"\n}\n","export default {\n chooseFiles: 'Choose files',\n chooseFile: 'Choose file',\n allowedFileTypes: 'Allowed file types: {{allowedFileTypes}}',\n maxFileSize: 'Maximum file size: {{maxFileSize}} MB',\n fileItemStatusWaiting: \"In queue\",\n fileItemStatusUploading: \"Uploading ...\",\n fileItemStatusUploaded: \"Uploaded\",\n fileItemStatusPreloaded: \"Already uploaded\",\n fileItemStatusError: \"An error occured.\",\n fileItemStatusErrorFileSize: \"The file size exceeds the maximum size: {{maxFileSize}} MB\",\n fileItemStatusErrorFileType: \"The file type is not allowed. Allowed file types: {{allowedFileTypes}}\",\n delete: \"Delete\"\n}\n","import {isset} from \"../helpers/TypeHelper\";\n\nexport default class PubSub {\n private events: {\n // eslint-disable-next-line no-unused-vars\n [key: string]: Array<(data: object) => void>\n } = {};\n\n constructor() {}\n\n subscribe(event: string, callback: any) {\n if (!isset(this.events[event])) {\n this.events[event] = [];\n }\n\n return this.events[event].push(callback);\n }\n\n publish(event: string, data = {}) {\n if (!isset(this.events[event])) {\n return [];\n }\n\n return this.events[event].map(callback => callback(data));\n }\n}\n","import PubSub from \"./PubSub\";\nimport FileItemInterface from \"../interfaces/FileItemInterface\";\nimport FileDropzoneComponent from \"../components/FileDropzoneComponent\";\nimport FileListComponent from \"../components/FileListComponent\";\nimport HuplyOptionsInterface from \"../interfaces/HuplyOptionsInterface\";\nimport FileDropzoneSmallComponent from \"../components/FileDropzoneSmallComponent\";\nimport HttpRequestService from \"../services/HttpRequestService\";\n\nclass AppStore {\n events: PubSub;\n files: Array<FileItemInterface>;\n components: {\n input?: HTMLInputElement,\n dropzone?: HTMLElement,\n fileList?: HTMLElement\n };\n translations: Object;\n options: HuplyOptionsInterface;\n maxSizeImageView: number;\n imgExt: Array<string>;\n\n constructor() {\n this.events = new PubSub();\n this.components = {};\n this.files = [];\n this.translations = {};\n this.options = {\n allowedFileTypes: [],\n multiple: false,\n uploadUrl: '',\n dropzoneTheme: 'lg'\n };\n this.maxSizeImageView = 2000000;\n this.imgExt = ['.jpg', '.jpeg', '.png'];\n }\n\n addFileItem(fileItem: FileItemInterface) {\n if (\n !this.options.multiple &&\n this.files.length\n ) {\n this.files.forEach((fileItem) => {\n this.deleteFileItem(fileItem);\n });\n }\n this.files.push(fileItem);\n this.events.publish('fileAdded', fileItem);\n }\n\n updateFileItem(fileItem: FileItemInterface) {\n const fileIndex = this.files.findIndex((findItem) => findItem.id === fileItem.id);\n if(fileIndex !== -1) {\n this.files[fileIndex] = fileItem;\n this.events.publish('fileItemUpdate', fileItem);\n\n // Check if file is uploaded\n if(fileItem.status === 'uploaded') {\n this.events.publish('fileUploaded', fileItem);\n\n // Check if all files are uploaded\n if(this.getFilesUploading().length === 0) {\n this.events.publish('filesUploaded', fileItem);\n }\n }\n }\n }\n\n deleteFileItem(fileItem: FileItemInterface) {\n if(this.options.deleteUrl && fileItem.status === 'uploaded') {\n let request = new HttpRequestService(this).request('DELETE', this.options.deleteUrl.replace('{{filename}}', encodeURI(fileItem.name)));\n request.setRequestHeader('accept', 'application/json');\n\n let data = new FormData();\n data.append('filename', fileItem.name);\n request.send(data);\n\n // request finished event\n request.addEventListener('load', () => {\n if(request.status === 200) {\n this.files = this.files.filter((item) => fileItem.id !== item.id);\n\n fileItem.status = 'deleted';\n this.events.publish('fileDeleted', fileItem);\n } else {\n fileItem.status = 'error';\n this.events.publish('fileItemUpdate', fileItem);\n }\n });\n } else {\n fileItem.status = 'deleted';\n this.events.publish('fileDeleted', fileItem);\n }\n }\n\n getCategorizedFiles() {\n return {\n uploaded: this.getFilesUploaded(),\n preloaded: this.getFilesPreloaded(),\n deleted: this.getFilesDeleted(),\n };\n }\n\n getFilesDeleted() {\n return this.files.filter((item) => item.status === 'deleted');\n }\n\n getFilesPreloaded() {\n return this.files.filter((item) => item.status === 'preloaded');\n }\n\n getFilesUploaded() {\n return this.files.filter((item) => item.status === 'uploaded');\n }\n\n getFilesWaiting() {\n return this.files.filter((item) => item.status === 'waiting');\n }\n\n getFilesUploading() {\n return this.files.filter((item) => item.status === 'uploading');\n }\n\n setComponent(key: string, component: FileListComponent | FileDropzoneComponent | FileDropzoneSmallComponent | Node) {\n // @ts-ignore\n this.components[key] = component;\n }\n\n setTranslations(translations: Object) {\n this.translations = translations\n }\n\n setOptions(options: HuplyOptionsInterface) {\n this.options = options;\n }\n}\n\nexport default AppStore;\n","import './assets/css/style.scss';\nimport HuplyOptionsInterface from \"./interfaces/HuplyOptionsInterface\";\nimport {isElement, isObject} from \"./helpers/TypeHelper\";\nimport WrapperComponent from \"./components/WrapperComponent\";\nimport de from \"./lang/de\";\nimport en from \"./lang/en\";\nimport AppStore from \"./store/AppStore\";\nimport { CustomWindowInterface } from \"./interfaces/CustomWindowInterface\";\nimport FileService from \"./services/FileService\";\ndeclare let window: CustomWindowInterface;\n\n// eslint-disable-next-line no-unused-vars\nexport default class Huply {\n\n public options?: HuplyOptionsInterface;\n public el: HTMLElement | null;\n private store: AppStore;\n\n public constructor(el: HTMLElement, options?: HuplyOptionsInterface) {\n if(!isElement(el)) {\n throw new Error('Selected element is not type of \"Element\". Current type: '+ typeof el);\n }\n\n this.el = el;\n\n // Initialize store\n this.store = new AppStore();\n\n // Parse options\n this.options = this.parseOptions(options);\n\n // Set options to store\n if(this.options) {\n this.store.setOptions(this.options);\n }\n\n // Validate options\n this.validateOptions(this.options);\n\n // Available Translations\n const defaultTranslations = {\n 'de': de,\n 'en': en,\n };\n\n // Set translations\n // Check if translations set\n // * via options global window object\n // * via options attribute\n if(isObject(window.huplyTranslations)) {\n this.store.setTranslations(window.huplyTranslations);\n } else {\n const lang = document.querySelector('html')?.getAttribute('lang');\n if(lang === 'en' || lang === 'de') {\n // @ts-ignore\n window.huplyTranslations = defaultTranslations[this.options.lang];\n // @ts-ignore\n this.store.setTranslations(defaultTranslations[this.options.lang]);\n } else {\n window.huplyTranslations = defaultTranslations['en'];\n this.store.setTranslations(defaultTranslations['en']);\n }\n }\n\n return this;\n }\n\n init() {\n // Render Layout\n // Replace input with wrapper\n if(this.el) {\n const wrapper = new WrapperComponent(this.el, this.store).render();\n if(this.el?.parentNode) {\n this.el.parentNode.replaceChild(wrapper, this.el);\n }\n\n // Get the new generated input element\n this.el = wrapper.querySelector(this.el.tagName);\n }\n\n // Add preloaded files\n if(this.options?.preloadedFiles?.length) {\n const fileService = new FileService(this.store);\n this.options.preloadedFiles.forEach((fileItem) => {\n if(fileItem.url) {\n fileService.getBlobFromUrl(fileItem.url).then((blob) => {\n fileService.generateFileItem(new File([blob], fileItem.name)).then((newItem) => {\n this.store.addFileItem( newItem);\n newItem.status = 'preloaded';\n this.store.updateFileItem( newItem);\n });\n });\n }\n });\n }\n\n return this;\n }\n\n parseOptions(options: HuplyOptionsInterface | undefined): HuplyOptionsInterface {\n\n // Set default options\n let defaultOptions: HuplyOptionsInterface = {\n multiple: false,\n maxConcurrentUploads: 3,\n maxFileSize: 5,\n lang: 'de',\n uploadUrl: '',\n deleteUrl: '',\n allowedFileTypes: ['.jpg', '.jpeg', '.png', '.pdf', '.zip', '.mp4'],\n dropzoneTheme: 'lg'\n };\n\n // Merge default options with individual options\n if(isObject(options)) {\n defaultOptions = {...defaultOptions, ...options};\n }\n\n // Check for data-attributes\n defaultOptions.multiple = this.el?.hasAttribute('multiple');\n\n const dropzoneTheme = this.el?.getAttribute('data-dropzone-theme');\n if(dropzoneTheme) {\n defaultOptions.dropzoneTheme = dropzoneTheme;\n }\n\n const maxConcurrentUploads = this.el?.getAttribute('data-max-concurrent-uploads');\n if(maxConcurrentUploads) {\n defaultOptions.maxConcurrentUploads = Number(maxConcurrentUploads);\n }\n\n const maxFileSize = this.el?.getAttribute('data-max-file-size');\n if(maxFileSize) {\n defaultOptions.maxFileSize = Number(maxFileSize);\n }\n\n const uploadUrl = this.el?.getAttribute('data-upload-url');\n if(uploadUrl) {\n defaultOptions.uploadUrl = uploadUrl;\n }\n\n const deleteUrl = this.el?.getAttribute('data-delete-url');\n if(deleteUrl) {\n defaultOptions.deleteUrl = deleteUrl;\n }\n\n const headers = this.el?.getAttribute('data-headers');\n if(headers) {\n defaultOptions.headers = JSON.parse(headers);\n }\n\n const preloadedFiles = this.el?.getAttribute('data-preloaded-files');\n if(preloadedFiles) {\n defaultOptions.preloadedFiles = JSON.parse(preloadedFiles);\n }\n\n const lang = this.el?.getAttribute('data-lang');\n if(lang) {\n defaultOptions.lang = lang;\n }\n\n const translations = this.el?.getAttribute('data-translations');\n if(translations) {\n defaultOptions.translations = JSON.parse(translations);\n }\n\n const allowedFileTypes = this.el?.getAttribute('accept');\n if(allowedFileTypes) {\n defaultOptions.allowedFileTypes = allowedFileTypes.split(',');\n }\n\n const chunkSize = this.el?.getAttribute('data-chunk-size');\n if(chunkSize) {\n defaultOptions.chunkSize = Number(chunkSize);\n }\n\n return defaultOptions;\n }\n\n validateOptions(options: HuplyOptionsInterface) {\n // Check for uploadUrl existence\n if(!options.uploadUrl || options.uploadUrl.length === 0) {\n throw new Error('Option \"uploadUrl\" not set');\n }\n\n // Check for deleteUrl existence\n if(!options.deleteUrl || options.deleteUrl.length === 0) {\n throw new Error('Option \"deleteUrl\" not set');\n }\n }\n\n on(eventName: string, listener: any) {\n this.store.events.subscribe(eventName, listener);\n }\n}\n"],"names":["FileListItemComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"huply.es.js","sources":["../src/helpers/TypeHelper.ts","../src/services/HttpRequestService.ts","../src/services/UploadService.ts","../src/helpers/LangHelper.ts","../src/services/FileValidationService.ts","../src/helpers/OutputHelper.ts","../src/services/FileService.ts","../src/components/FileInputComponent.ts","../src/components/FileListItemComponent.ts","../src/components/FileListComponent.ts","../src/components/FileDropzoneComponent.ts","../src/components/FileDropzoneLgComponent.ts","../src/components/FileDropzoneSmallComponent.ts","../src/components/FileInputHiddenComponent.ts","../src/components/WrapperComponent.ts","../src/lang/de.ts","../src/lang/en.ts","../src/store/PubSub.ts","../src/store/AppStore.ts","../src/main.ts"],"sourcesContent":["function isObject(obj: any): boolean {\n return obj !== undefined && obj !== null && obj.constructor === Object;\n}\n\nfunction isElement(el: any): boolean {\n return el instanceof Element;\n}\n\nfunction isArray(arr: any): boolean {\n return arr !== undefined && arr !== null && arr.constructor === Array;\n}\n\nfunction isPromise(p: any): boolean {\n return typeof p === 'object' && typeof p.then === 'function';\n}\n\nfunction returnsPromise(f: any): boolean {\n return f.constructor.name === 'AsyncFunction' || (typeof f === 'function' && isPromise(f()));\n}\n\nfunction isFunction(f: any): boolean {\n return f instanceof Function;\n}\n\nfunction isset(obj: any): boolean {\n return obj !== undefined;\n}\n\nfunction isFloat(obj: any): boolean {\n return obj !== undefined && obj !== null && !!(obj % 1);\n}\n\nfunction isInteger(obj: any): boolean {\n return obj !== undefined && obj !== null && parseInt(obj, 10) === obj;\n}\n\n\nexport { isObject, isElement, isArray, returnsPromise, isFunction, isset, isFloat, isInteger };\n","import AppStore from \"../store/AppStore\";\nimport {isObject} from \"../helpers/TypeHelper\";\n\nexport default class HttpRequestService {\n private store: AppStore;\n\n constructor(store: AppStore) {\n this.store = store;\n }\n\n request(method: string, url: string): XMLHttpRequest {\n let request = new XMLHttpRequest();\n if(this.store.options.withCredentials) {\n request.withCredentials = this.store.options.withCredentials;\n }\n request.open(method, url);\n if(isObject(this.store.options.headers)) {\n // @ts-ignore\n Object.entries(this.store.options.headers).forEach((item) => {\n // @ts-ignore\n request.setRequestHeader(item[0], item[1]);\n });\n }\n\n return request;\n }\n}\n","import AppStore from \"../store/AppStore\";\nimport FileItemInterface from \"../interfaces/FileItemInterface\";\nimport HttpRequestService from \"./HttpRequestService\";\n\nexport default class UploadService {\n private store: AppStore;\n\n constructor(store: AppStore) {\n this.store = store;\n }\n\n upload() {\n const filesWaiting = this.store.getFilesWaiting();\n if(filesWaiting.length) {\n filesWaiting.forEach((fileItem) => {\n // Set uploading status\n fileItem.status = 'uploading';\n fileItem.uploadProcess = 0;\n this.store.updateFileItem(fileItem);\n\n if(this.store.options.chunkSize) {\n this.sendChunkedFile(fileItem, 0);\n } else {\n this.sendFile(fileItem);\n }\n });\n }\n }\n\n sendChunkedFile(fileItem: FileItemInterface, start: number) {\n\n if(this.store.options.chunkSize && fileItem.size && fileItem.data) {\n // Slicing file\n const sliceSize = this.store.options.chunkSize * 1024 * 1024;\n const sliceEnd = start + sliceSize;\n const nextSlice = sliceEnd + 1;\n const chunkEnd = Math.min(sliceEnd , fileItem.size);\n const chunk = fileItem.data.slice(start, nextSlice);\n\n // Check if upload is complete\n let request = new HttpRequestService(this.store).request('POST', this.store.options.uploadUrl);\n const contentRange = \"bytes \"+ start+\"-\"+ chunkEnd+\"/\"+fileItem.size;\n request.setRequestHeader(\"Content-Range\",contentRange);\n\n // request finished event\n request.addEventListener('load', () => {\n if(request.status === 200) {\n if(request.response) {\n const resp = JSON.parse(request.response);\n if(resp.filename) {\n fileItem.name = resp.filename;\n }\n }\n\n if(fileItem.size) {\n fileItem.uploadProcess = Math.min(Math.ceil((sliceEnd / fileItem.size) * 100), 100);\n }\n\n if(chunkEnd === fileItem.size) {\n fileItem.status = 'uploaded';\n this.store.updateFileItem(fileItem);\n this.upload();\n } else {\n this.store.updateFileItem(fileItem);\n this.sendChunkedFile(fileItem, nextSlice);\n }\n\n } else {\n fileItem.status = 'error';\n this.store.updateFileItem(fileItem);\n this.upload();\n }\n });\n\n let data = new FormData();\n data.append('file', chunk, fileItem.name);\n if(this.store.options?.maxFileSize) {\n // @ts-ignore\n data.append('max_file_size', this.store.options.maxFileSize * 1024);\n }\n\n request.send(data);\n }\n }\n\n sendFile(fileItem: FileItemInterface) {\n fileItem.status = 'uploading';\n fileItem.uploadProcess = 0;\n this.store.updateFileItem(fileItem);\n\n return new Promise((resolve, reject) => {\n let request = new HttpRequestService(this.store).request('POST', this.store.options.uploadUrl);\n request.setRequestHeader('accept', 'application/json');\n\n // upload progress event\n request.upload.addEventListener('progress', (e) => {\n // upload progress as percentage\n fileItem.uploadProcess = (e.loaded / e.total)*100;\n this.store.updateFileItem(fileItem);\n });\n\n // request finished event\n request.addEventListener('load', () => {\n if(request.status === 200) {\n resolve(request.response);\n if(request.response) {\n const resp = JSON.parse(request.response);\n if(resp.filename) {\n fileItem.name = resp.filename;\n }\n }\n fileItem.status = 'uploaded';\n this.store.updateFileItem(fileItem);\n this.upload();\n } else {\n reject(request.response);\n fileItem.status = 'error';\n this.store.updateFileItem(fileItem);\n this.upload();\n }\n });\n\n let data = new FormData();\n if(fileItem.data) {\n data.append('file', fileItem.data);\n }\n if(this.store.options?.maxFileSize) {\n // @ts-ignore\n data.append('max_file_size', this.store.options.maxFileSize * 1024);\n }\n\n request.send(data);\n });\n }\n\n}\n","import {isset} from \"./TypeHelper\";\nimport {CustomWindowInterface} from \"../interfaces/CustomWindowInterface\";\ndeclare let window: CustomWindowInterface;\n\nfunction $t(key: string, replacer?: object) {\n if(isset(window.huplyTranslations[key])) {\n let translation = window.huplyTranslations[key];\n if(replacer) {\n Object.entries(replacer).forEach((value) => {\n translation = translation.replace('{{'+value[0]+'}}', value[1]);\n });\n }\n\n return translation;\n } else {\n return '{{'+key+'}}';\n }\n\n\n}\n\nexport {$t};\n","import AppStore from \"../store/AppStore\";\nimport {$t} from \"../helpers/LangHelper\";\nimport ErrorInterface from \"../interfaces/ErrorInterface\";\n\nexport default class FileValidationService {\n private store: AppStore;\n\n constructor(store: AppStore) {\n this.store = store;\n }\n\n checkFileSize(fileItem: File): boolean {\n return !(this.store.options?.maxFileSize && fileItem.size > (this.store.options.maxFileSize * 1024 * 1024));\n }\n\n checkFileType(fileItem: File): boolean {\n const fileItemParts = fileItem.name.split('.');\n return this.store.options.allowedFileTypes.includes('.'+fileItemParts[fileItemParts.length - 1].toLowerCase());\n }\n\n isValidFile(fileItem: File): Array<ErrorInterface> {\n const errorBag: Array<ErrorInterface> = [];\n\n if(!this.checkFileSize(fileItem)) {\n errorBag.push({\n msg: $t('fileItemStatusErrorFileSize', {maxFileSize : this.store.options.maxFileSize})\n });\n }\n\n if(!this.checkFileType(fileItem)) {\n errorBag.push({\n msg: $t('fileItemStatusErrorFileType', {allowedFileTypes : this.store.options.allowedFileTypes.join(',')})\n });\n }\n\n return errorBag;\n }\n}\n","import {isFloat, isInteger} from \"./TypeHelper\";\n\nfunction generateUniqueId() {\n return Math.random().toString(36).substring(2) + Date.now().toString(36);\n}\n\nfunction getHumanNumber(value: number | string): string | number {\n let number: string | number = 0;\n const valueCasted = Number(value);\n if (isFloat(valueCasted)) {\n number = valueCasted.toFixed(2).replace('.', ',');\n } else if (isInteger(valueCasted)) {\n number = valueCasted;\n }\n\n return number;\n}\n\nexport {\n generateUniqueId,\n getHumanNumber\n};\n","import FileItemInterface from \"../interfaces/FileItemInterface\";\nimport {generateUniqueId} from \"../helpers/OutputHelper\";\nimport AppStore from \"../store/AppStore\";\nimport HttpRequestService from \"./HttpRequestService\";\nimport PreloadedFileItemInterface from \"../interfaces/PreloadedFileItemInterface\";\n\nexport default class FileService {\n\n private store: AppStore;\n\n constructor(store: AppStore) {\n this.store = store;\n }\n\n generateFileItemFromFile(file: File): Promise<FileItemInterface> {\n return new Promise<FileItemInterface>((resolve) => {\n let fileItem: FileItemInterface = {\n id: generateUniqueId(),\n name: file.name,\n size: file.size ?? 0,\n sizeMb: file.size ? (file.size / 1024 / 1024) : 0,\n sizeKb: file.size ? Number((file.size / 1024).toFixed(0)) : 0,\n status: 'waiting',\n uploadProcess: 0,\n data: file,\n }\n\n // Get data url of image\n if (\n this.checkIfIsImage(file.name)\n && fileItem.size\n && fileItem.size <= this.store.maxSizeImageView\n ) {\n this.getDataUrlFromFile(file).then((dataUrl) => {\n fileItem.url = dataUrl;\n resolve(fileItem);\n });\n } else {\n resolve(fileItem);\n }\n });\n }\n\n generateFileItemFromPreloaded(file: PreloadedFileItemInterface): Promise<FileItemInterface> {\n return new Promise<FileItemInterface>((resolve) => {\n let fileItem: FileItemInterface = {\n id: generateUniqueId(),\n name: file.name,\n size: file.size ?? 0,\n sizeMb: file.size ? (file.size / 1024 / 1024) : 0,\n sizeKb: file.size ? Number((file.size / 1024).toFixed(0)) : 0,\n uploadProcess: 0,\n status: 'preloaded'\n }\n\n // Get data url of image\n if (\n this.checkIfIsImage(file.name)\n && fileItem.size\n && fileItem.size <= this.store.maxSizeImageView\n && file.url\n ) {\n this.getBlobFromUrl(file.url).then((blob) => {\n this.getDataUrlFromFile(blob).then((dataUrl) => {\n fileItem.url = dataUrl;\n resolve(fileItem);\n });\n });\n } else {\n resolve(fileItem);\n }\n });\n }\n\n getDataUrlFromFile(file: File | Blob): Promise<string> {\n return new Promise<string>((resolve) => {\n const reader = new FileReader();\n reader.readAsDataURL(file);\n\n reader.addEventListener(\"load\", function () {\n // @ts-ignore\n resolve(reader.result);\n }, false);\n });\n }\n\n getBlobFromUrl(url: string): Promise<Blob> {\n\n return new Promise<Blob>((resolve, reject) => {\n const request = new HttpRequestService(this.store).request('GET', url);\n request.responseType = 'blob';\n request.send();\n request.addEventListener('load', () => {\n if (request.status === 200) {\n resolve(request.response);\n } else {\n reject(false);\n }\n });\n });\n }\n\n checkIfIsImage(filename: string): boolean {\n const splittedFilename = filename.split('.');\n const imgExt = this.store.imgExt;\n\n return imgExt.includes('.'+splittedFilename[splittedFilename.length - 1]);\n }\n}\n","import AppStore from \"../store/AppStore\";\nimport UploadService from \"../services/UploadService\";\nimport FileValidationService from \"../services/FileValidationService\";\nimport FileService from \"../services/FileService\";\n\nclass FileInputComponent {\n private el: HTMLInputElement;\n\n constructor(el: Element, store: AppStore) {\n this.el = el.cloneNode(true) as HTMLInputElement;\n\n // Add default class to input\n this.el.setAttribute('name', `${el.getAttribute('name')}_real'`);\n\n // Add default class to input\n this.el.classList.add('huply-input');\n\n // Add accept - Attribute\n if(store.options?.allowedFileTypes) {\n this.el.setAttribute('accept', store.options?.allowedFileTypes.join(','));\n }\n\n // File added\n this.el.addEventListener('change', (e) => {\n e.preventDefault();\n\n if(e.target) {\n // @ts-ignore\n [...e.target.files].forEach((item) => {\n // Validate file\n const validationService = new FileValidationService(store);\n const validationMsg = validationService.isValidFile(item);\n new FileService(store).generateFileItemFromFile(item).then((fileItem) => {\n store.addFileItem(fileItem);\n\n // Check for errors\n if(validationMsg.length !== 0) {\n fileItem.status = 'error';\n fileItem.statusMsg = validationMsg.map((item) => item.msg).join(', ');\n store.updateFileItem(fileItem);\n }\n\n new UploadService(store).upload();\n });\n });\n }\n\n });\n }\n\n render(): HTMLInputElement {\n return this.el;\n }\n}\n\n\nexport default FileInputComponent;\n","import FileItemInterface from \"../interfaces/FileItemInterface\";\nimport {$t} from \"../helpers/LangHelper\";\nimport AppStore from \"../store/AppStore\";\nimport FileService from \"../services/FileService\";\nimport {getHumanNumber} from \"../helpers/OutputHelper\";\n\nclass FileListComponent {\n private fileItem: FileItemInterface;\n private listElement!: HTMLElement;\n private store: AppStore;\n\n constructor(fileItem: FileItemInterface, store: AppStore) {\n this.fileItem = fileItem;\n this.store = store;\n\n // Listen to status changes\n this.store.events.subscribe('fileItemUpdate', (fileItem: FileItemInterface) => {\n if(this.fileItem.id === fileItem.id) {\n this.updateHeadline(fileItem);\n this.updateSubline(fileItem);\n this.updateListEl(fileItem);\n }\n });\n\n this.store.events.subscribe('fileDeleted', (fileItem: FileItemInterface) => {\n if(this.fileItem.id === fileItem.id) {\n this.listElement.remove();\n }\n });\n }\n\n render(): HTMLElement {\n const li = this.getListEl();\n\n // Image or icon\n li.appendChild(this.getVisual())\n\n // Description\n const descriptionEl = document.createElement('div');\n\n // Generate name tag\n descriptionEl.appendChild(this.getHeadline());\n\n // Generate subline tag\n descriptionEl.appendChild(this.getSubline());\n\n li.appendChild(descriptionEl);\n\n // Actions\n li.appendChild(this.getActions());\n\n this.listElement = li;\n\n return li;\n }\n\n getListEl(): HTMLElement {\n const li = document.createElement('li');\n li.classList.add('huply-file-item');\n\n return li;\n }\n\n updateListEl(fileItem: FileItemInterface) {\n this.listElement.classList.remove('is-uploading');\n this.listElement.classList.remove('is-preloaded');\n this.listElement.classList.remove('is-error');\n this.listElement.classList.remove('is-deleted');\n\n if(fileItem.status === 'uploading') {\n this.listElement.classList.add('is-uploading');\n } else if(fileItem.status === 'preloaded') {\n this.listElement.classList.add('is-preloaded');\n } else if(fileItem.status === 'error') {\n this.listElement.classList.add('is-error');\n } else if(fileItem.status === 'uploaded') {\n this.listElement.classList.add('is-uploaded');\n } else if(fileItem.status === 'deleted') {\n this.listElement.classList.add('is-deleted');\n }\n }\n\n getSubline(): HTMLElement {\n const sublineEl = document.createElement('p');\n sublineEl.classList.add('huply-file-item-subline');\n sublineEl.textContent = $t('fileItemStatusWaiting');\n\n return sublineEl;\n }\n\n updateSubline(fileItem: FileItemInterface) {\n const sublineEl = this.listElement.querySelector('.huply-file-item-subline');\n if (sublineEl) {\n if (fileItem.status === 'uploading') {\n if (fileItem.uploadProcess) {\n sublineEl.textContent = $t('fileItemStatusUploading') + ' (' + fileItem.uploadProcess.toFixed(0) + '%)';\n }\n } else if (fileItem.status === 'error') {\n sublineEl.textContent = fileItem.statusMsg ?? $t('fileItemStatusError');\n } else if (fileItem.status === 'uploaded' || fileItem.status === 'preloaded') {\n sublineEl.textContent = fileItem.sizeMb && fileItem.sizeMb < 1 ? `${fileItem.sizeKb} KB` : `${getHumanNumber(fileItem.sizeMb)} MB`;\n }\n }\n }\n\n getHeadline(): HTMLElement {\n const nameEl = document.createElement('p');\n nameEl.textContent = this.fileItem.name;\n nameEl.classList.add('huply-file-item-headline');\n\n return nameEl;\n }\n\n updateHeadline(fileItem: FileItemInterface) {\n const headline = this.listElement.querySelector('.huply-file-item-headline');\n if(headline) {\n headline.textContent = fileItem.name;\n }\n }\n\n getVisual(): HTMLElement {\n const visiualEl = document.createElement('div');\n visiualEl.classList.add('huply-file-item-visual');\n const fileService = new FileService(this.store);\n\n // Check if file is image\n if(fileService.checkIfIsImage(this.fileItem.name)) {\n if(this.fileItem.url) {\n const imgEl = document.createElement('img');\n imgEl.classList.add('is-hidden');\n visiualEl.appendChild(imgEl);\n imgEl.setAttribute('src', this.fileItem.url);\n setTimeout(() => {\n imgEl.classList.remove('is-hidden');\n }, 5);\n } else {\n visiualEl.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M152 120c-26.51 0-48 21.49-48 48s21.49 48 48 48s48-21.49 48-48S178.5 120 152 120zM447.1 32h-384C28.65 32-.0091 60.65-.0091 96v320c0 35.35 28.65 64 63.1 64h384c35.35 0 64-28.65 64-64V96C511.1 60.65 483.3 32 447.1 32zM463.1 409.3l-136.8-185.9C323.8 218.8 318.1 216 312 216c-6.113 0-11.82 2.768-15.21 7.379l-106.6 144.1l-37.09-46.1c-3.441-4.279-8.934-6.809-14.77-6.809c-5.842 0-11.33 2.529-14.78 6.809l-75.52 93.81c0-.0293 0 .0293 0 0L47.99 96c0-8.822 7.178-16 16-16h384c8.822 0 16 7.178 16 16V409.3z\"/></svg>';\n }\n } else {\n visiualEl.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 384 512\"><path d=\"M365.3 93.38l-74.63-74.64C278.6 6.743 262.3 0 245.4 0L64-.0001c-35.35 0-64 28.65-64 64l.0065 384c0 35.35 28.65 64 64 64H320c35.2 0 64-28.8 64-64V138.6C384 121.7 377.3 105.4 365.3 93.38zM320 464H64.02c-8.836 0-15.1-7.163-16-15.1L48 64.13c-.0004-8.837 7.163-16 16-16h160L224 128c0 17.67 14.33 32 32 32h79.1v288C336 456.8 328.8 464 320 464z\"/></svg>';\n }\n\n return visiualEl;\n }\n\n getActions(): HTMLElement {\n const actionsEl = document.createElement('div');\n actionsEl.classList.add('huply-file-item-actions');\n const deleteEl = this.getDeleteAction();\n actionsEl.appendChild(deleteEl);\n\n return actionsEl;\n }\n\n getDeleteAction(): HTMLElement {\n const deleteEl = document.createElement('a');\n deleteEl.setAttribute('href', '#');\n deleteEl.classList.add('huply-file-item-actions-delete');\n deleteEl.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><path d=\"M424 80C437.3 80 448 90.75 448 104C448 117.3 437.3 128 424 128H412.4L388.4 452.7C385.9 486.1 358.1 512 324.6 512H123.4C89.92 512 62.09 486.1 59.61 452.7L35.56 128H24C10.75 128 0 117.3 0 104C0 90.75 10.75 80 24 80H93.82L130.5 24.94C140.9 9.357 158.4 0 177.1 0H270.9C289.6 0 307.1 9.358 317.5 24.94L354.2 80H424zM177.1 48C174.5 48 171.1 49.34 170.5 51.56L151.5 80H296.5L277.5 51.56C276 49.34 273.5 48 270.9 48H177.1zM364.3 128H83.69L107.5 449.2C108.1 457.5 115.1 464 123.4 464H324.6C332.9 464 339.9 457.5 340.5 449.2L364.3 128z\"/></svg>';\n deleteEl.addEventListener('click', (e) => {\n e.preventDefault();\n this.store.deleteFileItem(this.fileItem);\n });\n\n return deleteEl;\n }\n\n}\n\nexport default FileListComponent;\n","import FileListItemComponent from \"./FileListItemComponent\";\nimport FileItemInterface from \"../interfaces/FileItemInterface\";\nimport AppStore from \"../store/AppStore\";\n\nclass FileListComponent {\n\n private fileList: Element;\n private store: AppStore;\n\n constructor(store: AppStore) {\n this.store = store;\n\n // Generate ul element\n this.fileList = document.createElement('ul');\n this.fileList.classList.add('huply-file-list');\n\n // Check if file is added and add new file item to list\n // Show list, if more than 1 file allowed\n if(this.store.options.multiple) {\n store.events.subscribe('fileAdded', (fileItem: FileItemInterface) => {\n this.addChild(fileItem);\n });\n }\n }\n\n render() {\n return this.fileList;\n }\n\n addChild(fileItem: FileItemInterface) {\n const fileListItemComponent = new FileListItemComponent(fileItem, this.store);\n this.fileList.appendChild(fileListItemComponent.render());\n }\n}\n\nexport default FileListComponent;\n","import AppStore from \"../store/AppStore\";\nimport {$t} from \"../helpers/LangHelper\";\nimport FileItemInterface from \"../interfaces/FileItemInterface\";\nimport UploadService from \"../services/UploadService\";\nimport FileValidationService from \"../services/FileValidationService\";\nimport FileService from \"../services/FileService\";\nimport {getHumanNumber} from \"../helpers/OutputHelper\";\n\nclass FileDropzoneComponent {\n protected store: AppStore;\n protected dropzone: HTMLElement | undefined;\n protected headline: HTMLElement | undefined;\n protected subline: HTMLElement | undefined;\n protected uploadIcon: HTMLElement | undefined;\n protected deleteIcon: HTMLElement | undefined;\n protected descWrapper: HTMLElement | undefined;\n protected baseCssClass: string = '';\n\n constructor(store: AppStore) {\n this.store = store;\n\n // Check if file is added and add new file item to list\n // Show list, if more than 1 file allowed\n if(!this.store.options.multiple) {\n store.events.subscribe('fileItemUpdate', (fileItem: FileItemInterface) => {\n this.updateHeadline(fileItem);\n this.updateSubline(fileItem);\n this.updateUploadIcon(fileItem);\n this.updateDeleteIcon(fileItem);\n this.updateDescriptionWrapper(fileItem);\n });\n\n store.events.subscribe('fileDeleted', (fileItem: FileItemInterface) => {\n this.updateHeadline(fileItem);\n this.updateSubline(fileItem);\n this.updateUploadIcon(fileItem);\n this.updateDeleteIcon(fileItem);\n this.updateDescriptionWrapper(fileItem);\n });\n }\n }\n\n render() {\n this.dropzone = document.createElement('div');\n if(this.baseCssClass) {\n this.dropzone.classList.add(this.baseCssClass);\n }\n\n this.getTemplate();\n\n this.setEvents();\n\n return this.dropzone;\n }\n\n getTemplate(): HTMLElement | void {}\n\n setEvents(): void {\n if(this.dropzone) {\n // Click event\n this.dropzone.addEventListener('click', () => {\n this.store.components.input?.click();\n });\n\n // Dragover\n this.dropzone.addEventListener('dragover', (e) => {\n e.preventDefault();\n this.dropzone?.classList.add('is-dragover');\n });\n\n // Dragleave\n this.dropzone.addEventListener('dragleave', (e) => {\n e.preventDefault();\n this.dropzone?.classList.remove('is-dragover');\n });\n\n // Drop\n this.dropzone.addEventListener('drop', (e) => {\n e.preventDefault();\n const uploadService = new UploadService(this.store);\n if(e.dataTransfer) {\n for (var i=0; i < e.dataTransfer.items.length; i++) {\n const item = e.dataTransfer.items[i].getAsFile();\n if(item) {\n // Validate file\n const validationService = new FileValidationService(this.store);\n const validationMsg = validationService.isValidFile(item);\n new FileService(this.store).generateFileItemFromFile(item).then((fileItem) => {\n this.store.addFileItem(fileItem);\n\n // Check for errors\n if(validationMsg.length !== 0) {\n fileItem.status = 'error';\n fileItem.statusMsg = validationMsg.map((item) => item.msg).join(', ')\n this.store.updateFileItem(fileItem);\n }\n\n uploadService.upload();\n });\n }\n }\n }\n });\n }\n }\n\n getDescriptionWrapper() {\n this.descWrapper = document.createElement('div');\n this.descWrapper.classList.add(this.baseCssClass+'-desc');\n\n return this.descWrapper;\n }\n\n updateDescriptionWrapper(fileItem: FileItemInterface) {\n if(this.descWrapper) {\n this.descWrapper.classList.remove('is-uploading');\n this.descWrapper.classList.remove('is-preloaded');\n this.descWrapper.classList.remove('is-error');\n this.descWrapper.classList.remove('is-uploaded');\n\n if(fileItem.status === 'uploading') {\n this.descWrapper.classList.add('is-uploading');\n } else if(fileItem.status === 'preloaded') {\n this.descWrapper.classList.add('is-preloaded');\n } else if(fileItem.status === 'error') {\n this.descWrapper.classList.add('is-error');\n } else if(fileItem.status === 'uploaded') {\n this.descWrapper.classList.add('is-uploaded');\n }\n }\n }\n\n getUploadIcon(): HTMLElement {\n this.uploadIcon = document.createElement('div');\n this.uploadIcon.classList.add(this.baseCssClass+'-icon-upload');\n this.uploadIcon.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 512\"><path d=\"M303 175C312.4 165.7 327.6 165.7 336.1 175L416.1 255C426.3 264.4 426.3 279.6 416.1 288.1C407.6 298.3 392.4 298.3 383 288.1L344 249.9V384C344 397.3 333.3 408 320 408C306.7 408 296 397.3 296 384V249.9L256.1 288.1C247.6 298.3 232.4 298.3 223 288.1C213.7 279.6 213.7 264.4 223 255L303 175zM144 480C64.47 480 0 415.5 0 336C0 273.3 40.07 219.1 96 200.2V200C96 107.2 171.2 32 264 32C314.9 32 360.4 54.6 391.3 90.31C406.2 83.68 422.6 80 440 80C506.3 80 560 133.7 560 200C560 206.6 559.5 213 558.5 219.3C606.5 240.3 640 288.3 640 344C640 416.4 583.4 475.6 512 479.8V480H144zM264 80C197.7 80 144 133.7 144 200L144 234.1L111.1 245.5C74.64 258.7 48 294.3 48 336C48 389 90.98 432 144 432H506.6L509.2 431.8C555.4 429.2 592 390.8 592 344C592 308 570.4 276.9 539.2 263.3L505.1 248.4L511.1 211.7C511.7 207.9 512 204 512 200C512 160.2 479.8 128 440 128C429.5 128 419.6 130.2 410.8 134.2L378.2 148.7L354.9 121.7C332.8 96.08 300.3 80 263.1 80L264 80z\"/></svg>`;\n\n return this.uploadIcon;\n }\n\n updateUploadIcon(fileItem: FileItemInterface) {\n if(this.uploadIcon) {\n if(fileItem.status === 'uploading' && fileItem.uploadProcess === 0) {\n this.uploadIcon.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 576 512\"><path d=\"M264 24C264 10.75 274.7 0 288 0C429.4 0 544 114.6 544 256C544 302.6 531.5 346.4 509.7 384C503.1 395.5 488.4 399.4 476.9 392.8C465.5 386.2 461.5 371.5 468.2 360C485.9 329.4 496 293.9 496 255.1C496 141.1 402.9 47.1 288 47.1C274.7 47.1 264 37.25 264 23.1V24z\"/></svg>';\n } else if(fileItem.status === 'error') {\n this.uploadIcon.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 464c-114.7 0-208-93.31-208-208S141.3 48 256 48s208 93.31 208 208S370.7 464 256 464zM256 304c13.25 0 24-10.75 24-24v-128C280 138.8 269.3 128 256 128S232 138.8 232 152v128C232 293.3 242.8 304 256 304zM256 337.1c-17.36 0-31.44 14.08-31.44 31.44C224.6 385.9 238.6 400 256 400s31.44-14.08 31.44-31.44C287.4 351.2 273.4 337.1 256 337.1z\"/></svg>';\n } else if(fileItem.status === 'uploaded') {\n this.uploadIcon.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M243.8 339.8C232.9 350.7 215.1 350.7 204.2 339.8L140.2 275.8C129.3 264.9 129.3 247.1 140.2 236.2C151.1 225.3 168.9 225.3 179.8 236.2L224 280.4L332.2 172.2C343.1 161.3 360.9 161.3 371.8 172.2C382.7 183.1 382.7 200.9 371.8 211.8L243.8 339.8zM512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM256 48C141.1 48 48 141.1 48 256C48 370.9 141.1 464 256 464C370.9 464 464 370.9 464 256C464 141.1 370.9 48 256 48z\"/></svg>';\n } else if(fileItem.status === 'deleted' && this.store.getFilesUploading().length === 0) {\n this.uploadIcon.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 512\"><path d=\"M303 175C312.4 165.7 327.6 165.7 336.1 175L416.1 255C426.3 264.4 426.3 279.6 416.1 288.1C407.6 298.3 392.4 298.3 383 288.1L344 249.9V384C344 397.3 333.3 408 320 408C306.7 408 296 397.3 296 384V249.9L256.1 288.1C247.6 298.3 232.4 298.3 223 288.1C213.7 279.6 213.7 264.4 223 255L303 175zM144 480C64.47 480 0 415.5 0 336C0 273.3 40.07 219.1 96 200.2V200C96 107.2 171.2 32 264 32C314.9 32 360.4 54.6 391.3 90.31C406.2 83.68 422.6 80 440 80C506.3 80 560 133.7 560 200C560 206.6 559.5 213 558.5 219.3C606.5 240.3 640 288.3 640 344C640 416.4 583.4 475.6 512 479.8V480H144zM264 80C197.7 80 144 133.7 144 200L144 234.1L111.1 245.5C74.64 258.7 48 294.3 48 336C48 389 90.98 432 144 432H506.6L509.2 431.8C555.4 429.2 592 390.8 592 344C592 308 570.4 276.9 539.2 263.3L505.1 248.4L511.1 211.7C511.7 207.9 512 204 512 200C512 160.2 479.8 128 440 128C429.5 128 419.6 130.2 410.8 134.2L378.2 148.7L354.9 121.7C332.8 96.08 300.3 80 263.1 80L264 80z\"/></svg>`;\n } else if(fileItem.status === 'preloaded') {\n this.uploadIcon.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><!--! Font Awesome Pro 6.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d=\"M454.7 288.1c-12.78-3.75-26.06 3.594-29.75 16.31C403.3 379.9 333.8 432 255.1 432c-66.53 0-126.8-38.28-156.5-96h100.4c13.25 0 24-10.75 24-24S213.2 288 199.9 288h-160c-13.25 0-24 10.75-24 24v160c0 13.25 10.75 24 24 24s24-10.75 24-24v-102.1C103.7 436.4 176.1 480 255.1 480c99 0 187.4-66.31 215.1-161.3C474.8 305.1 467.4 292.7 454.7 288.1zM472 16C458.8 16 448 26.75 448 40v102.1C408.3 75.55 335.8 32 256 32C157 32 68.53 98.31 40.91 193.3C37.19 206 44.5 219.3 57.22 223c12.84 3.781 26.09-3.625 29.75-16.31C108.7 132.1 178.2 80 256 80c66.53 0 126.8 38.28 156.5 96H312C298.8 176 288 186.8 288 200S298.8 224 312 224h160c13.25 0 24-10.75 24-24v-160C496 26.75 485.3 16 472 16z\"/></svg>';\n }\n }\n }\n\n getDeleteIcon(): HTMLElement {\n this.deleteIcon = document.createElement('a');\n this.deleteIcon.setAttribute('href', '#');\n this.deleteIcon.classList.add(this.baseCssClass+'-icon-delete');\n this.deleteIcon.classList.add('is-hidden');\n this.deleteIcon.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><path d=\"M424 80C437.3 80 448 90.75 448 104C448 117.3 437.3 128 424 128H412.4L388.4 452.7C385.9 486.1 358.1 512 324.6 512H123.4C89.92 512 62.09 486.1 59.61 452.7L35.56 128H24C10.75 128 0 117.3 0 104C0 90.75 10.75 80 24 80H93.82L130.5 24.94C140.9 9.357 158.4 0 177.1 0H270.9C289.6 0 307.1 9.358 317.5 24.94L354.2 80H424zM177.1 48C174.5 48 171.1 49.34 170.5 51.56L151.5 80H296.5L277.5 51.56C276 49.34 273.5 48 270.9 48H177.1zM364.3 128H83.69L107.5 449.2C108.1 457.5 115.1 464 123.4 464H324.6C332.9 464 339.9 457.5 340.5 449.2L364.3 128z\"/></svg>`;\n this.deleteIcon.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n const fileIndex = this.store.files.findIndex((currentItem) => this.deleteIcon?.getAttribute('data-file-id') == currentItem.id);\n if(fileIndex !== -1) {\n this.store.deleteFileItem(this.store.files[fileIndex]);\n }\n });\n\n return this.deleteIcon;\n }\n\n updateDeleteIcon(fileItem: FileItemInterface) {\n if(this.deleteIcon) {\n if(fileItem.status === 'uploaded' || fileItem.status === 'preloaded') {\n this.deleteIcon.classList.remove('is-hidden');\n this.deleteIcon.setAttribute('data-file-id', fileItem.id);\n } else {\n this.deleteIcon.classList.add('is-hidden');\n }\n }\n }\n\n getHeadline(): HTMLElement {\n this.headline = document.createElement('p');\n this.headline.classList.add(this.baseCssClass+'-headline');\n this.headline.innerHTML = this.getHeadlineText();\n\n return this.headline;\n }\n\n getHeadlineText(): string {\n return `<strong>${this.store?.options.multiple ? $t('chooseFiles') : $t('chooseFile')}</strong>`;\n }\n\n updateHeadline(fileItem: FileItemInterface) {\n if(this.headline) {\n if(fileItem.status === 'deleted') {\n this.headline.innerHTML = this.getHeadlineText();\n } else {\n this.headline.innerHTML = `<strong>${fileItem.name}</strong>`;\n }\n }\n }\n\n getSubline(): HTMLElement {\n this.subline = document.createElement('p');\n this.subline.innerText = this.getSublineText();\n this.subline.classList.add(this.baseCssClass+'-subline');\n\n return this.subline;\n }\n\n getSublineText(): string {\n const sublineParts = [];\n sublineParts.push($t('allowedFileTypes', {allowedFileTypes: this.store?.options.allowedFileTypes}));\n sublineParts.push($t('maxFileSize', {maxFileSize: this.store?.options.maxFileSize}));\n return sublineParts.join(', ');\n }\n\n updateSubline(fileItem: FileItemInterface) {\n if(this.subline) {\n this.subline.classList.remove('is-uploading');\n this.subline.classList.remove('is-preloaded');\n this.subline.classList.remove('is-error');\n this.subline.classList.remove('is-uploaded');\n\n if(fileItem.status === 'uploading' && fileItem.uploadProcess) {\n this.subline.innerHTML = $t('fileItemStatusUploading') + ' ('+fileItem.uploadProcess.toFixed(0)+'%)';\n } else if(fileItem.status === 'error') {\n this.subline.innerHTML = fileItem.statusMsg ?? $t('fileItemStatusError');\n } else if(fileItem.status === 'uploaded' || fileItem.status === 'preloaded') {\n this.subline.textContent = fileItem.sizeMb && fileItem.sizeMb < 1 ? `${fileItem.sizeKb} KB` : `${getHumanNumber(fileItem.sizeMb)} MB`;\n } else {\n this.subline.innerHTML = this.getSublineText();\n }\n }\n }\n}\n\nexport default FileDropzoneComponent;\n","import AppStore from \"../store/AppStore\";\nimport FileDropzoneComponent from \"./FileDropzoneComponent\";\n\nclass FileDropzoneLgComponent extends FileDropzoneComponent{\n protected baseCssClass = 'huply-dropzone-lg';\n\n constructor(store: AppStore) {\n super(store);\n }\n\n getTemplate(): HTMLElement | void {\n\n if(this.dropzone) {\n // Delete icon\n this.dropzone.appendChild(this.getDeleteIcon());\n\n // Wrapper\n const dropzoneDescriptionWrapper = this.getDescriptionWrapper();\n\n // Icon\n dropzoneDescriptionWrapper.appendChild(this.getUploadIcon());\n\n // Headline\n dropzoneDescriptionWrapper.appendChild(this.getHeadline());\n\n // Subline\n dropzoneDescriptionWrapper.appendChild(this.getSubline());\n\n this.dropzone.appendChild(dropzoneDescriptionWrapper);\n\n return this.dropzone;\n }\n }\n}\n\nexport default FileDropzoneLgComponent;\n","import AppStore from \"../store/AppStore\";\nimport FileDropzoneComponent from \"./FileDropzoneComponent\";\nimport FileItemInterface from \"../interfaces/FileItemInterface\";\n\nclass FileDropzoneSmallComponent extends FileDropzoneComponent {\n protected baseCssClass = 'huply-dropzone-sm';\n\n constructor(store: AppStore) {\n super(store);\n\n if(!this.store.options.multiple) {\n store.events.subscribe('fileItemUpdate', (fileItem: FileItemInterface) => {\n this.updateWrapper(fileItem);\n });\n\n store.events.subscribe('fileDeleted', (fileItem: FileItemInterface) => {\n this.updateWrapper(fileItem);\n });\n }\n }\n\n getTemplate(): HTMLElement | void {\n if(this.dropzone) {\n // Wrapper\n const dropzoneWrapper = this.getWrapper();\n\n // Headline\n dropzoneWrapper.appendChild(this.getHeadline());\n\n // Subline\n dropzoneWrapper.appendChild(this.getSubline());\n\n // Icon upload\n dropzoneWrapper.appendChild(this.getUploadIcon());\n\n // Icon delete\n dropzoneWrapper.appendChild(this.getDeleteIcon());\n\n this.dropzone.appendChild(dropzoneWrapper);\n\n return this.dropzone;\n }\n }\n\n\n getWrapper() {\n this.descWrapper = document.createElement('div');\n this.descWrapper.classList.add('huply-dropzone-sm-wrapper');\n\n return this.descWrapper;\n }\n\n updateWrapper(fileItem: FileItemInterface) {\n if(this.descWrapper) {\n this.descWrapper.classList.remove('is-uploading');\n this.descWrapper.classList.remove('is-preloaded');\n this.descWrapper.classList.remove('is-error');\n this.descWrapper.classList.remove('is-uploaded');\n\n if(fileItem.status === 'uploading') {\n this.descWrapper.classList.add('is-uploading');\n } else if(fileItem.status === 'preloaded') {\n this.descWrapper.classList.add('is-preloaded');\n } else if(fileItem.status === 'error') {\n this.descWrapper.classList.add('is-error');\n } else if(fileItem.status === 'uploaded') {\n this.descWrapper.classList.add('is-uploaded');\n }\n }\n }\n}\n\nexport default FileDropzoneSmallComponent;\n","import AppStore from \"../store/AppStore\";\n\nclass FileInputHiddenComponent {\n private el: HTMLElement;\n private input: HTMLInputElement;\n\n constructor(el: HTMLElement, store: AppStore) {\n this.el = el;\n this.input = document.createElement('input');\n\n store.events.subscribe('fileItemUpdate', () => {\n this.input.setAttribute('value', JSON.stringify(store.getCategorizedFiles()));\n });\n\n store.events.subscribe('fileDeleted', () => {\n this.input.setAttribute('value', JSON.stringify(store.getCategorizedFiles()));\n });\n }\n\n render(): HTMLInputElement {\n this.input.setAttribute('type', 'hidden');\n const nameAttr = this.el.getAttribute('name');\n if(nameAttr) {\n this.input.setAttribute('name', nameAttr);\n }\n return this.input;\n }\n}\n\n\nexport default FileInputHiddenComponent;\n","import FileInputComponent from \"./FileInputComponent\";\nimport FileListComponent from \"./FileListComponent\";\nimport FileDropzoneLgComponent from \"./FileDropzoneLgComponent\";\nimport FileDropzoneSmallComponent from \"./FileDropzoneSmallComponent\";\nimport FileInputHiddenComponent from \"./FileInputHiddenComponent\";\nimport AppStore from \"../store/AppStore\";\n\nclass WrapperComponent {\n private el: HTMLElement;\n private store: AppStore;\n\n constructor(el: HTMLElement, store: AppStore) {\n this.el = el;\n this.store = store;\n }\n\n render() {\n const wrapper = document.createElement('div');\n wrapper.classList.add('huply-wrapper');\n\n // Add input file field\n // Clone input / Identical input element cannot be replaced if it is an anchestor of parent\n const inputComponent = new FileInputComponent(this.el, this.store).render();\n wrapper.appendChild(inputComponent);\n\n // Add input hidden field with file information\n const inputHiddenComponent = new FileInputHiddenComponent(this.el, this.store).render();\n wrapper.appendChild(inputHiddenComponent);\n\n // Add dropzone\n let dropzoneComponent;\n if(this.store.options.dropzoneTheme === 'sm') {\n dropzoneComponent = new FileDropzoneSmallComponent(this.store);\n wrapper.appendChild(dropzoneComponent.render());\n } else {\n dropzoneComponent = new FileDropzoneLgComponent(this.store);\n wrapper.appendChild(dropzoneComponent.render());\n }\n\n // Add file list\n const fileListComponent = new FileListComponent(this.store);\n wrapper.appendChild(fileListComponent.render());\n\n // Add elements to store\n this.store.setComponent('input', inputComponent);\n this.store.setComponent('dropzone', dropzoneComponent);\n this.store.setComponent('fileList', fileListComponent);\n\n return wrapper;\n }\n}\n\n\nexport default WrapperComponent;\n","export default {\n chooseFiles: 'Dateien auswählen',\n chooseFile: 'Datei auswählen',\n allowedFileTypes: 'Erlaubte Dateitypen: {{allowedFileTypes}}',\n maxFileSize: 'Maximale Dateigröße: {{maxFileSize}} MB',\n fileItemStatusWaiting: \"In Warteschlange\",\n fileItemStatusUploading: \"Wird hochgeladen\",\n fileItemStatusUploaded: \"Erfolgreich hochgeladen\",\n fileItemStatusPreloaded: \"Bereits hochgeladen\",\n fileItemStatusError: \"Ein Fehler ist aufgetreten.\",\n fileItemStatusErrorFileSize: \"Die Dateigröße überschreitet die Maximalgröße: {{maxFileSize}} MB\",\n fileItemStatusErrorFileType: \"Der Dateityp ist nicht erlaubt. Erlaubte Dateitypen: {{allowedFileTypes}}\",\n delete: \"Löschen\"\n}\n","export default {\n chooseFiles: 'Choose files',\n chooseFile: 'Choose file',\n allowedFileTypes: 'Allowed file types: {{allowedFileTypes}}',\n maxFileSize: 'Maximum file size: {{maxFileSize}} MB',\n fileItemStatusWaiting: \"In queue\",\n fileItemStatusUploading: \"Uploading ...\",\n fileItemStatusUploaded: \"Uploaded\",\n fileItemStatusPreloaded: \"Already uploaded\",\n fileItemStatusError: \"An error occured.\",\n fileItemStatusErrorFileSize: \"The file size exceeds the maximum size: {{maxFileSize}} MB\",\n fileItemStatusErrorFileType: \"The file type is not allowed. Allowed file types: {{allowedFileTypes}}\",\n delete: \"Delete\"\n}\n","import {isset} from \"../helpers/TypeHelper\";\n\nexport default class PubSub {\n private events: {\n // eslint-disable-next-line no-unused-vars\n [key: string]: Array<(data: object) => void>\n } = {};\n\n constructor() {}\n\n subscribe(event: string, callback: any) {\n if (!isset(this.events[event])) {\n this.events[event] = [];\n }\n\n return this.events[event].push(callback);\n }\n\n publish(event: string, data = {}) {\n if (!isset(this.events[event])) {\n return [];\n }\n\n return this.events[event].map(callback => callback(data));\n }\n}\n","import PubSub from \"./PubSub\";\nimport FileItemInterface from \"../interfaces/FileItemInterface\";\nimport FileDropzoneComponent from \"../components/FileDropzoneComponent\";\nimport FileListComponent from \"../components/FileListComponent\";\nimport HuplyOptionsInterface from \"../interfaces/HuplyOptionsInterface\";\nimport FileDropzoneSmallComponent from \"../components/FileDropzoneSmallComponent\";\nimport HttpRequestService from \"../services/HttpRequestService\";\n\nclass AppStore {\n events: PubSub;\n files: Array<FileItemInterface>;\n components: {\n input?: HTMLInputElement,\n dropzone?: HTMLElement,\n fileList?: HTMLElement\n };\n translations: Object;\n options: HuplyOptionsInterface;\n maxSizeImageView: number;\n imgExt: Array<string>;\n\n constructor() {\n this.events = new PubSub();\n this.components = {};\n this.files = [];\n this.translations = {};\n this.options = {\n allowedFileTypes: [],\n multiple: false,\n uploadUrl: '',\n dropzoneTheme: 'lg'\n };\n this.maxSizeImageView = 2000000;\n this.imgExt = ['.jpg', '.jpeg', '.png'];\n }\n\n addFileItem(fileItem: FileItemInterface) {\n if (\n !this.options.multiple &&\n this.files.length\n ) {\n this.files.forEach((fileItem) => {\n this.deleteFileItem(fileItem);\n });\n }\n this.files.push(fileItem);\n this.events.publish('fileAdded', fileItem);\n }\n\n updateFileItem(fileItem: FileItemInterface) {\n const fileIndex = this.files.findIndex((findItem) => findItem.id === fileItem.id);\n if(fileIndex !== -1) {\n this.files[fileIndex] = fileItem;\n this.events.publish('fileItemUpdate', fileItem);\n\n // Check if file is uploaded\n if(fileItem.status === 'uploaded') {\n this.events.publish('fileUploaded', fileItem);\n\n // Check if all files are uploaded\n if(this.getFilesUploading().length === 0) {\n this.events.publish('filesUploaded', fileItem);\n }\n }\n }\n }\n\n deleteFileItem(fileItem: FileItemInterface) {\n if(this.options.deleteUrl && fileItem.status === 'uploaded') {\n let request = new HttpRequestService(this).request('DELETE', this.options.deleteUrl.replace('{{filename}}', encodeURI(fileItem.name)));\n request.setRequestHeader('accept', 'application/json');\n\n let data = new FormData();\n data.append('filename', fileItem.name);\n request.send(data);\n\n // request finished event\n request.addEventListener('load', () => {\n if(request.status === 200) {\n this.files = this.files.filter((item) => fileItem.id !== item.id);\n\n fileItem.status = 'deleted';\n this.events.publish('fileDeleted', fileItem);\n } else {\n fileItem.status = 'error';\n this.events.publish('fileItemUpdate', fileItem);\n }\n });\n } else {\n fileItem.status = 'deleted';\n this.events.publish('fileDeleted', fileItem);\n }\n }\n\n getCategorizedFiles() {\n return {\n uploaded: this.getFilesUploaded(),\n preloaded: this.getFilesPreloaded(),\n deleted: this.getFilesDeleted(),\n };\n }\n\n getFilesDeleted() {\n return this.files.filter((item) => item.status === 'deleted');\n }\n\n getFilesPreloaded() {\n return this.files.filter((item) => item.status === 'preloaded');\n }\n\n getFilesUploaded() {\n return this.files.filter((item) => item.status === 'uploaded');\n }\n\n getFilesWaiting() {\n return this.files.filter((item) => item.status === 'waiting');\n }\n\n getFilesUploading() {\n return this.files.filter((item) => item.status === 'uploading');\n }\n\n setComponent(key: string, component: FileListComponent | FileDropzoneComponent | FileDropzoneSmallComponent | Node) {\n // @ts-ignore\n this.components[key] = component;\n }\n\n setTranslations(translations: Object) {\n this.translations = translations\n }\n\n setOptions(options: HuplyOptionsInterface) {\n this.options = options;\n }\n}\n\nexport default AppStore;\n","import './assets/css/style.scss';\nimport HuplyOptionsInterface from \"./interfaces/HuplyOptionsInterface\";\nimport {isElement, isObject} from \"./helpers/TypeHelper\";\nimport WrapperComponent from \"./components/WrapperComponent\";\nimport de from \"./lang/de\";\nimport en from \"./lang/en\";\nimport AppStore from \"./store/AppStore\";\nimport { CustomWindowInterface } from \"./interfaces/CustomWindowInterface\";\nimport FileService from \"./services/FileService\";\ndeclare let window: CustomWindowInterface;\n\n// eslint-disable-next-line no-unused-vars\nexport default class Huply {\n\n public options?: HuplyOptionsInterface;\n public el: HTMLElement | null;\n private store: AppStore;\n\n public constructor(el: HTMLElement, options?: HuplyOptionsInterface) {\n if(!isElement(el)) {\n throw new Error('Selected element is not type of \"Element\". Current type: '+ typeof el);\n }\n\n this.el = el;\n\n // Initialize store\n this.store = new AppStore();\n\n // Parse options\n this.options = this.parseOptions(options);\n\n // Set options to store\n if(this.options) {\n this.store.setOptions(this.options);\n }\n\n // Validate options\n this.validateOptions(this.options);\n\n // Available Translations\n const defaultTranslations = {\n 'de': de,\n 'en': en,\n };\n\n // Set translations\n // Check if translations set\n // * via options global window object\n // * via options attribute\n if(isObject(window.huplyTranslations)) {\n this.store.setTranslations(window.huplyTranslations);\n } else {\n const lang = document.querySelector('html')?.getAttribute('lang');\n if(lang === 'en' || lang === 'de') {\n // @ts-ignore\n window.huplyTranslations = defaultTranslations[this.options.lang];\n // @ts-ignore\n this.store.setTranslations(defaultTranslations[this.options.lang]);\n } else {\n window.huplyTranslations = defaultTranslations['en'];\n this.store.setTranslations(defaultTranslations['en']);\n }\n }\n\n return this;\n }\n\n init() {\n // Render Layout\n // Replace input with wrapper\n if(this.el) {\n const wrapper = new WrapperComponent(this.el, this.store).render();\n if(this.el?.parentNode) {\n this.el.parentNode.replaceChild(wrapper, this.el);\n }\n\n // Get the new generated input element\n this.el = wrapper.querySelector(this.el.tagName);\n }\n\n // Add preloaded files\n if(this.options?.preloadedFiles?.length) {\n const fileService = new FileService(this.store);\n this.options.preloadedFiles.forEach((fileItem) => {\n fileService.generateFileItemFromPreloaded(fileItem).then((newItem) => {\n this.store.addFileItem( newItem);\n newItem.status = 'preloaded';\n this.store.updateFileItem( newItem);\n });\n });\n }\n\n return this;\n }\n\n parseOptions(options: HuplyOptionsInterface | undefined): HuplyOptionsInterface {\n\n // Set default options\n let defaultOptions: HuplyOptionsInterface = {\n multiple: false,\n maxConcurrentUploads: 3,\n maxFileSize: 5,\n lang: 'de',\n uploadUrl: '',\n deleteUrl: '',\n allowedFileTypes: ['.jpg', '.jpeg', '.png', '.pdf', '.zip', '.mp4'],\n dropzoneTheme: 'lg'\n };\n\n // Merge default options with individual options\n if(isObject(options)) {\n defaultOptions = {...defaultOptions, ...options};\n }\n\n // Check for data-attributes\n defaultOptions.multiple = this.el?.hasAttribute('multiple');\n\n const dropzoneTheme = this.el?.getAttribute('data-dropzone-theme');\n if(dropzoneTheme) {\n defaultOptions.dropzoneTheme = dropzoneTheme;\n }\n\n const maxConcurrentUploads = this.el?.getAttribute('data-max-concurrent-uploads');\n if(maxConcurrentUploads) {\n defaultOptions.maxConcurrentUploads = Number(maxConcurrentUploads);\n }\n\n const maxFileSize = this.el?.getAttribute('data-max-file-size');\n if(maxFileSize) {\n defaultOptions.maxFileSize = Number(maxFileSize);\n }\n\n const uploadUrl = this.el?.getAttribute('data-upload-url');\n if(uploadUrl) {\n defaultOptions.uploadUrl = uploadUrl;\n }\n\n const deleteUrl = this.el?.getAttribute('data-delete-url');\n if(deleteUrl) {\n defaultOptions.deleteUrl = deleteUrl;\n }\n\n const headers = this.el?.getAttribute('data-headers');\n if(headers) {\n defaultOptions.headers = JSON.parse(headers);\n }\n\n const preloadedFiles = this.el?.getAttribute('data-preloaded-files');\n if(preloadedFiles) {\n try {\n const decodedFiles = atob(preloadedFiles);\n defaultOptions.preloadedFiles = JSON.parse(decodedFiles);\n } catch {\n defaultOptions.preloadedFiles = [];\n }\n }\n\n const lang = this.el?.getAttribute('data-lang');\n if(lang) {\n defaultOptions.lang = lang;\n }\n\n const translations = this.el?.getAttribute('data-translations');\n if(translations) {\n defaultOptions.translations = JSON.parse(translations);\n }\n\n const allowedFileTypes = this.el?.getAttribute('accept');\n if(allowedFileTypes) {\n defaultOptions.allowedFileTypes = allowedFileTypes.split(',');\n }\n\n const chunkSize = this.el?.getAttribute('data-chunk-size');\n if(chunkSize) {\n defaultOptions.chunkSize = Number(chunkSize);\n }\n\n return defaultOptions;\n }\n\n validateOptions(options: HuplyOptionsInterface) {\n // Check for uploadUrl existence\n if(!options.uploadUrl || options.uploadUrl.length === 0) {\n throw new Error('Option \"uploadUrl\" not set');\n }\n\n // Check for deleteUrl existence\n if(!options.deleteUrl || options.deleteUrl.length === 0) {\n throw new Error('Option \"deleteUrl\" not set');\n }\n }\n\n on(eventName: string, listener: any) {\n this.store.events.subscribe(eventName, listener);\n }\n}\n"],"names":["FileListItemComponent"],"mappings":"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"}
|