diff --git a/js/dist/forum.js b/js/dist/forum.js index b7bafdc3..b0e34017 100644 --- a/js/dist/forum.js +++ b/js/dist/forum.js @@ -1,2 +1,2 @@ -(()=>{var t={195:(t,e,i)=>{t.exports=i(236)},236:t=>{var e=function(t){"use strict";var e,i=Object.prototype,a=i.hasOwnProperty,o="function"==typeof Symbol?Symbol:{},r=o.iterator||"@@iterator",n=o.asyncIterator||"@@asyncIterator",s=o.toStringTag||"@@toStringTag";function l(t,e,i){return Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{l({},"")}catch(t){l=function(t,e,i){return t[e]=i}}function u(t,e,i,a){var o=e&&e.prototype instanceof v?e:v,r=Object.create(o.prototype),n=new _(a||[]);return r._invoke=function(t,e,i){var a=c;return function(o,r){if(a===h)throw new Error("Generator is already running");if(a===p){if("throw"===o)throw r;return E()}for(i.method=o,i.arg=r;;){var n=i.delegate;if(n){var s=N(n,i);if(s){if(s===m)continue;return s}}if("next"===i.method)i.sent=i._sent=i.arg;else if("throw"===i.method){if(a===c)throw a=p,i.arg;i.dispatchException(i.arg)}else"return"===i.method&&i.abrupt("return",i.arg);a=h;var l=f(t,e,i);if("normal"===l.type){if(a=i.done?p:d,l.arg===m)continue;return{value:l.arg,done:i.done}}"throw"===l.type&&(a=p,i.method="throw",i.arg=l.arg)}}}(t,i,n),r}function f(t,e,i){try{return{type:"normal",arg:t.call(e,i)}}catch(t){return{type:"throw",arg:t}}}t.wrap=u;var c="suspendedStart",d="suspendedYield",h="executing",p="completed",m={};function v(){}function g(){}function y(){}var b={};l(b,r,(function(){return this}));var w=Object.getPrototypeOf,F=w&&w(w(D([])));F&&F!==i&&a.call(F,r)&&(b=F);var S=y.prototype=v.prototype=Object.create(b);function x(t){["next","throw","return"].forEach((function(e){l(t,e,(function(t){return this._invoke(e,t)}))}))}function L(t,e){function i(o,r,n,s){var l=f(t[o],t,r);if("throw"!==l.type){var u=l.arg,c=u.value;return c&&"object"==typeof c&&a.call(c,"__await")?e.resolve(c.__await).then((function(t){i("next",t,n,s)}),(function(t){i("throw",t,n,s)})):e.resolve(c).then((function(t){u.value=t,n(u)}),(function(t){return i("throw",t,n,s)}))}s(l.arg)}var o;this._invoke=function(t,a){function r(){return new e((function(e,o){i(t,a,e,o)}))}return o=o?o.then(r,r):r()}}function N(t,i){var a=t.iterator[i.method];if(a===e){if(i.delegate=null,"throw"===i.method){if(t.iterator.return&&(i.method="return",i.arg=e,N(t,i),"throw"===i.method))return m;i.method="throw",i.arg=new TypeError("The iterator does not provide a 'throw' method")}return m}var o=f(a,t.iterator,i.arg);if("throw"===o.type)return i.method="throw",i.arg=o.arg,i.delegate=null,m;var r=o.arg;return r?r.done?(i[t.resultName]=r.value,i.next=t.nextLoc,"return"!==i.method&&(i.method="next",i.arg=e),i.delegate=null,m):r:(i.method="throw",i.arg=new TypeError("iterator result is not an object"),i.delegate=null,m)}function k(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function B(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function _(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(k,this),this.reset(!0)}function D(t){if(t){var i=t[r];if(i)return i.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,n=function i(){for(;++o=0;--r){var n=this.tryEntries[r],s=n.completion;if("root"===n.tryLoc)return o("end");if(n.tryLoc<=this.prev){var l=a.call(n,"catchLoc"),u=a.call(n,"finallyLoc");if(l&&u){if(this.prev=0;--i){var o=this.tryEntries[i];if(o.tryLoc<=this.prev&&a.call(o,"finallyLoc")&&this.prev=0;--e){var i=this.tryEntries[e];if(i.finallyLoc===t)return this.complete(i.completion,i.afterLoc),B(i),m}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var i=this.tryEntries[e];if(i.tryLoc===t){var a=i.completion;if("throw"===a.type){var o=a.arg;B(i)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,i,a){return this.delegate={iterator:D(t),resultName:i,nextLoc:a},"next"===this.method&&(this.arg=e),m}},t}(t.exports);try{regeneratorRuntime=e}catch(t){"object"==typeof globalThis?globalThis.regeneratorRuntime=e:Function("r","regeneratorRuntime = r")(e)}}},e={};function i(a){var o=e[a];if(void 0!==o)return o.exports;var r=e[a]={exports:{}};return t[a](r,r.exports,i),r.exports}i.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return i.d(e,{a:e}),e},i.d=(t,e)=>{for(var a in e)i.o(e,a)&&!i.o(t,a)&&Object.defineProperty(t,a,{enumerable:!0,get:e[a]})},i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),i.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var a={};(()=>{"use strict";i.r(a),i.d(a,{components:()=>mt,extend:()=>ht});const t=flarum.core.compat["forum/app"];var e=i.n(t);const o=flarum.core.compat["common/models/User"];var r=i.n(o);const n=flarum.core.compat["common/Model"];var s=i.n(n);const l=flarum.core.compat["common/extend"],u=flarum.core.compat["forum/components/Post"];var f=i.n(u);const c=flarum.core.compat["common/components/TextEditor"];var d=i.n(c);function h(t,e){return h=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},h(t,e)}function p(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,h(t,e)}const v=flarum.core.compat["common/Component"];var g=i.n(v);const y=flarum.core.compat["common/components/Button"];var b=i.n(y);const w=flarum.core.compat["common/components/LoadingIndicator"];var F=i.n(w);const S=flarum.core.compat["common/utils/classList"];var x=i.n(S),L=function(t){function i(){return t.apply(this,arguments)||this}p(i,t);var a=i.prototype;return a.oninit=function(e){var i=this;t.prototype.oninit.call(this,e),this.attrs.uploader.on("uploaded",(function(){i.$("form")[0].reset(),m.redraw()})),this.isMediaUploadButton=e.attrs.isMediaUploadButton||!1},a.view=function(){var t=this.attrs.uploader.uploading?e().translator.trans("fof-upload.forum.states.loading"):e().translator.trans("fof-upload.forum.buttons.upload");return m(b(),{className:x()(["Button","hasIcon","fof-upload-button",!this.isMediaUploadButton&&!this.attrs.uploader.uploading&&"Button--icon",!this.isMediaUploadButton&&!this.attrs.uploader.uploading&&"Button--link",this.attrs.uploader.uploading&&"uploading"]),icon:!this.attrs.uploader.uploading&&"fas fa-file-upload",onclick:this.uploadButtonClicked.bind(this),disabled:this.attrs.disabled},this.attrs.uploader.uploading&&m(F(),{size:"small",display:"inline",className:"Button-icon"}),(this.isMediaUploadButton||this.attrs.uploader.uploading)&&m("span",{className:"Button-label"},t),m("form",null,m("input",{type:"file",multiple:!0,onchange:this.process.bind(this)})))},a.process=function(t){var e=this.$("input").prop("files");0!==e.length&&this.attrs.uploader.upload(e,!this.isMediaUploadButton)},a.uploadButtonClicked=function(t){this.$("input").click()},i}(g()),N=function(){function t(t,e){this.upload=t,this.composerElement=e,this.handlers={},this.supportsFileDragging()&&(this.composerElement.addEventListener("dragover",this.handlers.in=this.in.bind(this)),this.composerElement.addEventListener("dragleave",this.handlers.out=this.out.bind(this)),this.composerElement.addEventListener("dragend",this.handlers.out),this.composerElement.addEventListener("drop",this.handlers.dropping=this.dropping.bind(this)))}var e=t.prototype;return e.supportsFileDragging=function(){var t=document.createElement("div");return("draggable"in t||"ondragstart"in t&&"ondrop"in t)&&"FormData"in window&&"FileReader"in window},e.unload=function(){this.handlers.in&&(this.composerElement.removeEventListener("dragover",this.handlers.in),this.composerElement.removeEventListener("dragleave",this.handlers.out),this.composerElement.removeEventListener("dragend",this.handlers.out),this.composerElement.removeEventListener("drop",this.handlers.dropping))},e.isNotFile=function(t){if(t.dataTransfer.items)for(var e=0;e0&&(t.preventDefault(),this.upload(i))}},t}(),B=function(){function t(){this.callbacks={success:[],failure:[],uploading:[],uploaded:[]},this.uploading=!1}var i=t.prototype;return i.setState=function(t){this.fileState=t},i.on=function(t,e){this.callbacks[t].push(e)},i.dispatch=function(t,e){this.callbacks[t].forEach((function(t){return t(e)}))},i.upload=function(t,i){var a=this;void 0===i&&(i=!0),this.uploading=!0,this.dispatch("uploading",t),m.redraw();for(var o=new FormData,r=0;r=0&&"fof-file-selected"]),s=t.filesBeingHidden.includes(e.uuid());return m("li",{"aria-busy":s,key:e.uuid()},m(W,{file:e,fileSelectable:r,isSelected:t.attrs.selectedFiles&&t.attrs.selectedFiles.indexOf(null!=(a=e.id())?a:"")>=0,fileClassNames:n,isFileHiding:s,onHide:t.hideFile.bind(t),onFileClick:t.onFileClick.bind(t),user:t.attrs.user,onDelete:t.onDelete.bind(t)}))})),this.hasMoreResults()&&m("div",{className:"fof-load-more-files"},m(b(),{className:"Button Button--primary",disabled:this.isLoading(),loading:this.isLoading(),onclick:function(){return t.loadMore()}},U().translator.trans("fof-upload.lib.file_list.load_more_files_btn")))))},i.onDelete=function(t){this.attrs.onDelete&&this.attrs.onDelete(t)},i.onFileClick=function(t){this.attrs.onFileSelect?this.attrs.onFileSelect(t):this.attrs.downloadOnClick&&window.open(t.url())},i.isSelectable=function(t){var e=t.type();return Array.isArray(this.restrictFileType)?this.restrictFileType.indexOf(e)>=0:"image"===this.restrictFileType?e.includes("image/"):"audio"===this.restrictFileType?e.includes("audio/"):"video"===this.restrictFileType&&e.includes("video/")},i.hideFile=function(){var t=M(T().mark((function t(e){var i,a,o,r,n;return T().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(i=e.uuid(),!this.filesBeingHidden.includes(i)){t.next=3;break}return t.abrupt("return");case 3:if(this.filesBeingHidden.push(i),a=e.isShared()?"fof-upload.lib.file_list.hide_shared_file":"fof-upload.lib.file_list.hide_file",!confirm(q()(U().translator.trans(e.hidden()?a+".show_confirmation":a+".hide_confirmation",{fileName:e.baseName()})))){t.next=24;break}return t.prev=7,t.next=10,U().request({method:"PATCH",url:U().forum.attribute("apiUrl")+"/fof/upload/hide",body:{uuid:i}});case 10:o=t.sent,U().store.pushPayload(o),m.redraw(),U().alerts.show(Y(),{type:"success"},[j()(e.hidden()?"fas fa-eye-slash":"fas fa-eye")," ",U().translator.trans(null!=e&&e.hidden()?a+".hide_success":a+".show_success")]),this.fileState.user&&(r=this.fileState.files.findIndex((function(t){return i===t.uuid()})),this.fileState.files.splice(r,1)),t.next=20;break;case 17:t.prev=17,t.t0=t.catch(7),U().alerts.show(Y(),{type:"error"},U().translator.trans(null!=e&&e.hidden()?a+".hide_fail":a+".show_fail",{fileName:e.baseName()}));case 20:return t.prev=20,n=this.filesBeingHidden.indexOf(i),this.filesBeingHidden.splice(n,1),t.finish(20);case 24:case"end":return t.stop()}}),t,this,[[7,17,20,24]])})));return function(e){return t.apply(this,arguments)}}(),e}(g()),K=function(t){function e(){return t.apply(this,arguments)||this}p(e,t);var i=e.prototype;return i.loadFileList=function(){this.fileState.setUser(this.attrs.user||U().session.user),this.user=this.fileState.user},i.hasMoreResults=function(){return this.fileState.hasMoreResults()},i.loadMore=function(){this.fileState.loadMore()},i.isLoading=function(){return this.fileState.isLoading()},i.fileCollection=function(){return this.fileState.files},e}(J);const Q=flarum.core.compat["common/components/Switch"];var X=i.n(Q),Z=function(t){function e(){for(var e,i=arguments.length,a=new Array(i),o=0;o0},e.isLoading=function(){return this.loading},e.hasMoreResults=function(){return this.moreResults},e.empty=function(){return!this.hasFiles()&&!this.isLoading()},t}(),it=function(t){function i(){return t.apply(this,arguments)||this}p(i,t);var a=i.prototype;return a.oninit=function(e){t.prototype.oninit.call(this,e),this.uploader=e.attrs.uploader,this.selectedFiles=[],this.multiSelect=void 0===e.attrs.multiSelect||e.attrs.multiSelect,this.restrictFileType=e.attrs.restrictFileType||null,this.dragDrop=null,this.selectedFilesLibrary=e.attrs.defaultFilesLibrary||"user",this.sharedUploads=null,this.userFileState=new et,this.sharedFileState=new et(!0),this.uploader.setState(this.userFileState),this.onUpload()},a.className=function(){return"Modal--large fof-file-manager-modal"},a.oncreate=function(e){var i=this;t.prototype.oncreate.call(this,e),this.dragDrop=new N((function(t){return i.uploader.upload(t,!1)}),this.$().find(".Modal-content")[0])},a.onremove=function(){this.dragDrop&&this.dragDrop.unload()},a.view=function(){var t,i=this,a=this.selectedFiles.length,o=this.attrs,r=o.hideUser,n=o.hideShared;return m("div",{className:"Modal modal-dialog "+this.className()},m("div",{className:"Modal-content"},m("div",{className:"fof-modal-buttons App-backControl"},!r&&"user"===this.selectedFilesLibrary&&m(L,{uploader:this.uploader,disabled:this.userFileState.isLoading(),isMediaUploadButton:!0}),e().session.user&&e().session.user.uploadSharedFiles()&&!n&&"shared"===this.selectedFilesLibrary&&m(b(),{className:"Button",icon:"fas fa-file-upload",onclick:function(){i.showUploadModal()}},e().translator.trans("fof-upload.forum.buttons.upload"))),m("div",{className:"fof-drag-and-drop"},m("div",{className:"fof-drag-and-drop-release"},m("i",{className:"fas fa-cloud-upload-alt"}),e().translator.trans("fof-upload.lib.file_list.release_to_upload"))),m("div",{className:"Modal-header"},m("h3",{className:"App-titleControl App-titleControl--text"},e().translator.trans("fof-upload.forum.media_manager")),(null==(t=e().session.user)?void 0:t.accessSharedFiles())&&!r&&!n&&m("div",{className:"LibrarySelection"},this.fileLibraryButtonItems().toArray())),this.alertAttrs&&m("div",{className:"Modal-alert"},m(Alert,this.alertAttrs)),m("div",{className:"Modal-body"},"user"===this.selectedFilesLibrary&&this.userFilesContent(),"shared"===this.selectedFilesLibrary&&this.sharedFilesContent()),m("div",{className:"Modal-footer"},m(b(),{onclick:this.hide.bind(this),className:"Button"},e().translator.trans("fof-upload.forum.buttons.cancel")),m(b(),{onclick:this.onSelect.bind(this),disabled:0===this.selectedFiles.length||!this.multiSelect&&this.selectedFiles.length>1,className:"Button Button--primary"},e().translator.trans("fof-upload.lib.file_list.confirm_selection_btn",{fileCount:a})))))},a.fileLibraryButtonItems=function(){var t=this,i=new(H());return i.add("user",m(b(),{className:"Button Button--flat "+("user"===this.selectedFilesLibrary?"active":""),onclick:function(){return t.setLibrary("user")}},e().translator.trans("fof-upload.forum.buttons.media"))),i.add("shared",m(b(),{className:"Button Button--flat "+("shared"===this.selectedFilesLibrary?"active":""),onclick:function(){return t.setLibrary("shared")}},e().translator.trans("fof-upload.forum.buttons.shared_media"))),i},a.setLibrary=function(t){this.selectedFilesLibrary=t,m.redraw()},a.userFilesContent=function(){return m(K,{user:this.attrs.user,selectable:!0,onFileSelect:this.onFileSelect.bind(this),selectedFiles:this.selectedFiles,restrictFileType:this.restrictFileType,fileState:this.userFileState,onDelete:this.onDelete.bind(this)})},a.sharedFilesContent=function(){return m(tt,{selectable:!0,onFileSelect:this.onFileSelect.bind(this),selectedFiles:this.selectedFiles,restrictFileType:this.restrictFileType,user:this.attrs.user,fileState:this.sharedFileState,onDelete:this.onDelete.bind(this)})},a.onFileSelect=function(t){var e=this.selectedFiles.indexOf(t.id());e>=0?this.selectedFiles.splice(e,1):this.multiSelect?this.selectedFiles.push(t.id()):this.selectedFiles=[t.id()]},a.onUpload=function(){var t=this;this.uploader.on("success",(function(e){var i=e.file;t.multiSelect?t.selectedFiles.push(i.id()):t.selectedFiles=[i.id()]}))},a.onSelect=function(){this.hide(),this.attrs.onSelect?this.attrs.onSelect(this.selectedFiles):this.selectedFiles.map((function(t){var i=e().store.getById("files",t)||e().store.getById("shared-files",t);e().composer.editor.insertAtCursor(i.bbcode()+"\n",!1)}))},a.showUploadModal=function(){var t=this;e().modal.show(Z,{onUploadComplete:function(e){t.sharedFileState.addToList(e)}},!0)},a.onDelete=function(t){this.sharedFileState.removeFromList(t),this.userFileState.removeFromList(t)},i}(D()),at=function(t){function i(){return t.apply(this,arguments)||this}p(i,t);var a=i.prototype;return a.view=function(){return m(G(),{text:e().translator.trans("fof-upload.forum.buttons.media")},b().component({className:"Button fof-upload-button Button--icon",onclick:this.fileManagerButtonClicked.bind(this),icon:"fas fa-photo-video"}))},a.fileManagerButtonClicked=function(t){t.preventDefault(),e().modal.show(it,{uploader:this.attrs.uploader})},i}(g());const ot=flarum.core.compat["forum/components/UserPage"];var rt=i.n(ot);const nt=flarum.core.compat["common/components/LinkButton"];var st=i.n(nt);const lt=flarum.core.compat["common/extenders"];var ut=i.n(lt),ft=function(t){function e(){return t.apply(this,arguments)||this}p(e,t);var i=e.prototype;return i.baseName=function(){return s().attribute("baseName").call(this)},i.path=function(){return s().attribute("path").call(this)},i.url=function(){return s().attribute("url").call(this)},i.size=function(){return s().attribute("size").call(this)},i.type=function(){return s().attribute("type").call(this)},i.humanSize=function(){return s().attribute("humanSize").call(this)},i.createdAt=function(){return s().attribute("createdAt",s().transformDate).call(this)},i.uuid=function(){return s().attribute("uuid").call(this)},i.tag=function(){return s().attribute("tag").call(this)},i.hidden=function(){return s().attribute("hidden").call(this)},i.bbcode=function(){return s().attribute("bbcode").call(this)},i.isShared=function(){return s().attribute("shared").call(this)},i.isPrivateShared=function(){return s().attribute("isPrivateShared").call(this)},i.canViewInfo=function(){return s().attribute("canViewInfo").call(this)},i.canHide=function(){return s().attribute("canHide").call(this)},i.canDelete=function(){return s().attribute("canDelete").call(this)},i.apiEndpoint=function(){return"/fof/uploads"+(this.exists?"/"+this.id():"")},e}(s());const ct=[(new(ut().Store)).add("files",ft).add("shared-files",ft)];var dt=function(t){function i(){return t.apply(this,arguments)||this}p(i,t);var a=i.prototype;return a.oninit=function(e){t.prototype.oninit.call(this,e),this.user=null,this.loadUser(m.route.param("username"))},a.content=function(){var t=new et;return e().session.user&&(e().session.user.viewOthersMediaLibrary()||this.user===e().session.user)?this.user&&K.component({user:this.user,selectable:!1,downloadOnClick:!0,fileState:t}):null},a.show=function(e){t.prototype.show.call(this,e),this.user=e},i}(rt());const ht=[].concat(ct,[(new(ut().Routes)).add("user.uploads","/u/:username/uploads",dt)]);function pt(){return pt=Object.assign||function(t){for(var e=1;e0?m("span",{className:"Button-badge"},o):""]),80)}}))}))})(),module.exports=a})(); +(()=>{var t={195:(t,e,i)=>{t.exports=i(236)},236:t=>{var e=function(t){"use strict";var e,i=Object.prototype,a=i.hasOwnProperty,o="function"==typeof Symbol?Symbol:{},r=o.iterator||"@@iterator",n=o.asyncIterator||"@@asyncIterator",s=o.toStringTag||"@@toStringTag";function l(t,e,i){return Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{l({},"")}catch(t){l=function(t,e,i){return t[e]=i}}function u(t,e,i,a){var o=e&&e.prototype instanceof v?e:v,r=Object.create(o.prototype),n=new _(a||[]);return r._invoke=function(t,e,i){var a=c;return function(o,r){if(a===h)throw new Error("Generator is already running");if(a===p){if("throw"===o)throw r;return E()}for(i.method=o,i.arg=r;;){var n=i.delegate;if(n){var s=N(n,i);if(s){if(s===m)continue;return s}}if("next"===i.method)i.sent=i._sent=i.arg;else if("throw"===i.method){if(a===c)throw a=p,i.arg;i.dispatchException(i.arg)}else"return"===i.method&&i.abrupt("return",i.arg);a=h;var l=f(t,e,i);if("normal"===l.type){if(a=i.done?p:d,l.arg===m)continue;return{value:l.arg,done:i.done}}"throw"===l.type&&(a=p,i.method="throw",i.arg=l.arg)}}}(t,i,n),r}function f(t,e,i){try{return{type:"normal",arg:t.call(e,i)}}catch(t){return{type:"throw",arg:t}}}t.wrap=u;var c="suspendedStart",d="suspendedYield",h="executing",p="completed",m={};function v(){}function g(){}function y(){}var b={};l(b,r,(function(){return this}));var w=Object.getPrototypeOf,F=w&&w(w(D([])));F&&F!==i&&a.call(F,r)&&(b=F);var S=y.prototype=v.prototype=Object.create(b);function x(t){["next","throw","return"].forEach((function(e){l(t,e,(function(t){return this._invoke(e,t)}))}))}function L(t,e){function i(o,r,n,s){var l=f(t[o],t,r);if("throw"!==l.type){var u=l.arg,c=u.value;return c&&"object"==typeof c&&a.call(c,"__await")?e.resolve(c.__await).then((function(t){i("next",t,n,s)}),(function(t){i("throw",t,n,s)})):e.resolve(c).then((function(t){u.value=t,n(u)}),(function(t){return i("throw",t,n,s)}))}s(l.arg)}var o;this._invoke=function(t,a){function r(){return new e((function(e,o){i(t,a,e,o)}))}return o=o?o.then(r,r):r()}}function N(t,i){var a=t.iterator[i.method];if(a===e){if(i.delegate=null,"throw"===i.method){if(t.iterator.return&&(i.method="return",i.arg=e,N(t,i),"throw"===i.method))return m;i.method="throw",i.arg=new TypeError("The iterator does not provide a 'throw' method")}return m}var o=f(a,t.iterator,i.arg);if("throw"===o.type)return i.method="throw",i.arg=o.arg,i.delegate=null,m;var r=o.arg;return r?r.done?(i[t.resultName]=r.value,i.next=t.nextLoc,"return"!==i.method&&(i.method="next",i.arg=e),i.delegate=null,m):r:(i.method="throw",i.arg=new TypeError("iterator result is not an object"),i.delegate=null,m)}function k(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function B(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function _(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(k,this),this.reset(!0)}function D(t){if(t){var i=t[r];if(i)return i.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,n=function i(){for(;++o=0;--r){var n=this.tryEntries[r],s=n.completion;if("root"===n.tryLoc)return o("end");if(n.tryLoc<=this.prev){var l=a.call(n,"catchLoc"),u=a.call(n,"finallyLoc");if(l&&u){if(this.prev=0;--i){var o=this.tryEntries[i];if(o.tryLoc<=this.prev&&a.call(o,"finallyLoc")&&this.prev=0;--e){var i=this.tryEntries[e];if(i.finallyLoc===t)return this.complete(i.completion,i.afterLoc),B(i),m}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var i=this.tryEntries[e];if(i.tryLoc===t){var a=i.completion;if("throw"===a.type){var o=a.arg;B(i)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,i,a){return this.delegate={iterator:D(t),resultName:i,nextLoc:a},"next"===this.method&&(this.arg=e),m}},t}(t.exports);try{regeneratorRuntime=e}catch(t){"object"==typeof globalThis?globalThis.regeneratorRuntime=e:Function("r","regeneratorRuntime = r")(e)}}},e={};function i(a){var o=e[a];if(void 0!==o)return o.exports;var r=e[a]={exports:{}};return t[a](r,r.exports,i),r.exports}i.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return i.d(e,{a:e}),e},i.d=(t,e)=>{for(var a in e)i.o(e,a)&&!i.o(t,a)&&Object.defineProperty(t,a,{enumerable:!0,get:e[a]})},i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),i.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var a={};(()=>{"use strict";i.r(a),i.d(a,{components:()=>mt,extend:()=>ht});const t=flarum.core.compat["forum/app"];var e=i.n(t);const o=flarum.core.compat["common/models/User"];var r=i.n(o);const n=flarum.core.compat["common/Model"];var s=i.n(n);const l=flarum.core.compat["common/extend"],u=flarum.core.compat["forum/components/Post"];var f=i.n(u);const c=flarum.core.compat["common/components/TextEditor"];var d=i.n(c);function h(t,e){return h=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},h(t,e)}function p(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,h(t,e)}const v=flarum.core.compat["common/Component"];var g=i.n(v);const y=flarum.core.compat["common/components/Button"];var b=i.n(y);const w=flarum.core.compat["common/components/LoadingIndicator"];var F=i.n(w);const S=flarum.core.compat["common/utils/classList"];var x=i.n(S),L=function(t){function i(){return t.apply(this,arguments)||this}p(i,t);var a=i.prototype;return a.oninit=function(e){var i=this;t.prototype.oninit.call(this,e),this.attrs.uploader.on("uploaded",(function(){i.$("form")[0].reset(),m.redraw()})),this.isMediaUploadButton=e.attrs.isMediaUploadButton||!1},a.view=function(){var t=this.attrs.uploader.uploading?e().translator.trans("fof-upload.forum.states.loading"):e().translator.trans("fof-upload.forum.buttons.upload");return m(b(),{className:x()(["Button","hasIcon","fof-upload-button",!this.isMediaUploadButton&&!this.attrs.uploader.uploading&&"Button--icon",!this.isMediaUploadButton&&!this.attrs.uploader.uploading&&"Button--link",this.attrs.uploader.uploading&&"uploading"]),icon:!this.attrs.uploader.uploading&&"fas fa-file-upload",onclick:this.uploadButtonClicked.bind(this),disabled:this.attrs.disabled},this.attrs.uploader.uploading&&m(F(),{size:"small",display:"inline",className:"Button-icon"}),(this.isMediaUploadButton||this.attrs.uploader.uploading)&&m("span",{className:"Button-label"},t),m("form",null,m("input",{type:"file",multiple:!0,onchange:this.process.bind(this)})))},a.process=function(t){var e=this.$("input").prop("files");0!==e.length&&this.attrs.uploader.upload(e,!this.isMediaUploadButton)},a.uploadButtonClicked=function(t){this.$("input").click()},i}(g()),N=function(){function t(t,e){this.upload=t,this.composerElement=e,this.handlers={},this.supportsFileDragging()&&(this.composerElement.addEventListener("dragover",this.handlers.in=this.in.bind(this)),this.composerElement.addEventListener("dragleave",this.handlers.out=this.out.bind(this)),this.composerElement.addEventListener("dragend",this.handlers.out),this.composerElement.addEventListener("drop",this.handlers.dropping=this.dropping.bind(this)))}var e=t.prototype;return e.supportsFileDragging=function(){var t=document.createElement("div");return("draggable"in t||"ondragstart"in t&&"ondrop"in t)&&"FormData"in window&&"FileReader"in window},e.unload=function(){this.handlers.in&&(this.composerElement.removeEventListener("dragover",this.handlers.in),this.composerElement.removeEventListener("dragleave",this.handlers.out),this.composerElement.removeEventListener("dragend",this.handlers.out),this.composerElement.removeEventListener("drop",this.handlers.dropping))},e.isNotFile=function(t){if(t.dataTransfer.items)for(var e=0;e0&&(t.preventDefault(),this.upload(i))}},t}(),B=function(){function t(){this.callbacks={success:[],failure:[],uploading:[],uploaded:[]},this.uploading=!1}var i=t.prototype;return i.setState=function(t){this.fileState=t},i.on=function(t,e){this.callbacks[t].push(e)},i.dispatch=function(t,e){this.callbacks[t].forEach((function(t){return t(e)}))},i.upload=function(t,i){var a=this;void 0===i&&(i=!0),this.uploading=!0,this.dispatch("uploading",t),m.redraw();for(var o=new FormData,r=0;r=0&&"fof-file-selected"]),s=t.filesBeingHidden.includes(e.uuid());return m("li",{"aria-busy":s,key:e.uuid()},m(W,{file:e,fileSelectable:r,isSelected:t.attrs.selectedFiles&&t.attrs.selectedFiles.indexOf(null!=(a=e.id())?a:"")>=0,fileClassNames:n,isFileHiding:s,onHide:t.hideFile.bind(t),onFileClick:t.onFileClick.bind(t),user:t.attrs.user,onDelete:t.onDelete.bind(t)}))})),this.hasMoreResults()&&m("div",{className:"fof-load-more-files"},m(b(),{className:"Button Button--primary",disabled:this.isLoading(),loading:this.isLoading(),onclick:function(){return t.loadMore()}},U().translator.trans("fof-upload.lib.file_list.load_more_files_btn")))))},i.onDelete=function(t){this.attrs.onDelete&&this.attrs.onDelete(t)},i.onFileClick=function(t){this.attrs.onFileSelect?this.attrs.onFileSelect(t):this.attrs.downloadOnClick&&window.open(t.url())},i.isSelectable=function(t){var e=t.type();return Array.isArray(this.restrictFileType)?this.restrictFileType.indexOf(e)>=0:"image"===this.restrictFileType?e.includes("image/"):"audio"===this.restrictFileType?e.includes("audio/"):"video"===this.restrictFileType&&e.includes("video/")},i.hideFile=function(){var t=M(T().mark((function t(e){var i,a,o,r,n;return T().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(i=e.uuid(),!this.filesBeingHidden.includes(i)){t.next=3;break}return t.abrupt("return");case 3:if(this.filesBeingHidden.push(i),a=e.isShared()?"fof-upload.lib.file_list.hide_shared_file":"fof-upload.lib.file_list.hide_file",!confirm(q()(U().translator.trans(e.hidden()?a+".show_confirmation":a+".hide_confirmation",{fileName:e.baseName()})))){t.next=24;break}return t.prev=7,t.next=10,U().request({method:"PATCH",url:U().forum.attribute("apiUrl")+"/fof/upload/hide",body:{uuid:i}});case 10:o=t.sent,U().store.pushPayload(o),m.redraw(),U().alerts.show(Y(),{type:"success"},[j()(e.hidden()?"fas fa-eye-slash":"fas fa-eye")," ",U().translator.trans(null!=e&&e.hidden()?a+".hide_success":a+".show_success")]),this.fileState.user&&(r=this.fileState.files.findIndex((function(t){return i===t.uuid()})),this.fileState.files.splice(r,1)),t.next=20;break;case 17:t.prev=17,t.t0=t.catch(7),U().alerts.show(Y(),{type:"error"},U().translator.trans(null!=e&&e.hidden()?a+".hide_fail":a+".show_fail",{fileName:e.baseName()}));case 20:return t.prev=20,n=this.filesBeingHidden.indexOf(i),this.filesBeingHidden.splice(n,1),t.finish(20);case 24:case"end":return t.stop()}}),t,this,[[7,17,20,24]])})));return function(e){return t.apply(this,arguments)}}(),e}(g()),K=function(t){function e(){return t.apply(this,arguments)||this}p(e,t);var i=e.prototype;return i.loadFileList=function(){this.fileState.setUser(this.attrs.user||U().session.user),this.user=this.fileState.user},i.hasMoreResults=function(){return this.fileState.hasMoreResults()},i.loadMore=function(){this.fileState.loadMore()},i.isLoading=function(){return this.fileState.isLoading()},i.fileCollection=function(){return this.fileState.files},e}(J);const Q=flarum.core.compat["common/components/Switch"];var X=i.n(Q),Z=function(t){function e(){for(var e,i=arguments.length,a=new Array(i),o=0;o0},e.isLoading=function(){return this.loading},e.hasMoreResults=function(){return this.moreResults},e.empty=function(){return!this.hasFiles()&&!this.isLoading()},t}(),it=function(t){function i(){return t.apply(this,arguments)||this}p(i,t);var a=i.prototype;return a.oninit=function(e){t.prototype.oninit.call(this,e),this.uploader=e.attrs.uploader,this.selectedFiles=[],this.multiSelect=void 0===e.attrs.multiSelect||e.attrs.multiSelect,this.restrictFileType=e.attrs.restrictFileType||null,this.dragDrop=null,this.selectedFilesLibrary=e.attrs.defaultFilesLibrary||"user",this.sharedUploads=null,this.userFileState=new et,this.sharedFileState=new et(!0),this.uploader.setState(this.userFileState),this.onUpload()},a.className=function(){return"Modal--large fof-file-manager-modal"},a.oncreate=function(e){var i=this;t.prototype.oncreate.call(this,e),this.dragDrop=new N((function(t){return i.uploader.upload(t,!1)}),this.$().find(".Modal-content")[0])},a.onremove=function(){this.dragDrop&&this.dragDrop.unload()},a.view=function(){var t,i=this,a=this.selectedFiles.length,o=this.attrs,r=o.hideUser,n=o.hideShared;return m("div",{className:"Modal modal-dialog "+this.className()},m("div",{className:"Modal-content"},m("div",{className:"fof-modal-buttons App-backControl"},!r&&"user"===this.selectedFilesLibrary&&m(L,{uploader:this.uploader,disabled:this.userFileState.isLoading(),isMediaUploadButton:!0}),e().session.user&&e().session.user.uploadSharedFiles()&&!n&&"shared"===this.selectedFilesLibrary&&m(b(),{className:"Button",icon:"fas fa-file-upload",onclick:function(){i.showUploadModal()}},e().translator.trans("fof-upload.forum.buttons.upload"))),m("div",{className:"fof-drag-and-drop"},m("div",{className:"fof-drag-and-drop-release"},m("i",{className:"fas fa-cloud-upload-alt"}),e().translator.trans("fof-upload.lib.file_list.release_to_upload"))),m("div",{className:"Modal-header"},m("h3",{className:"App-titleControl App-titleControl--text"},e().translator.trans("fof-upload.forum.media_manager")),(null==(t=e().session.user)?void 0:t.accessSharedFiles())&&!r&&!n&&m("div",{className:"LibrarySelection"},this.fileLibraryButtonItems().toArray())),this.alertAttrs&&m("div",{className:"Modal-alert"},m(Alert,this.alertAttrs)),m("div",{className:"Modal-body"},"user"===this.selectedFilesLibrary&&this.userFilesContent(),"shared"===this.selectedFilesLibrary&&this.sharedFilesContent()),m("div",{className:"Modal-footer"},m(b(),{onclick:this.hide.bind(this),className:"Button"},e().translator.trans("fof-upload.forum.buttons.cancel")),m(b(),{onclick:this.onSelect.bind(this),disabled:0===this.selectedFiles.length||!this.multiSelect&&this.selectedFiles.length>1,className:"Button Button--primary"},e().translator.trans("fof-upload.lib.file_list.confirm_selection_btn",{fileCount:a})))))},a.fileLibraryButtonItems=function(){var t=this,i=new(H());return i.add("user",m(b(),{className:"Button Button--flat "+("user"===this.selectedFilesLibrary?"active":""),onclick:function(){return t.setLibrary("user")}},e().translator.trans("fof-upload.forum.buttons.media"))),i.add("shared",m(b(),{className:"Button Button--flat "+("shared"===this.selectedFilesLibrary?"active":""),onclick:function(){return t.setLibrary("shared")}},e().translator.trans("fof-upload.forum.buttons.shared_media"))),i},a.setLibrary=function(t){this.selectedFilesLibrary=t,m.redraw()},a.userFilesContent=function(){return m(K,{user:this.attrs.user,selectable:!0,onFileSelect:this.onFileSelect.bind(this),selectedFiles:this.selectedFiles,restrictFileType:this.restrictFileType,fileState:this.userFileState,onDelete:this.onDelete.bind(this)})},a.sharedFilesContent=function(){return m(tt,{selectable:!0,onFileSelect:this.onFileSelect.bind(this),selectedFiles:this.selectedFiles,restrictFileType:this.restrictFileType,user:this.attrs.user,fileState:this.sharedFileState,onDelete:this.onDelete.bind(this)})},a.onFileSelect=function(t){var e=this.selectedFiles.indexOf(t.id());e>=0?this.selectedFiles.splice(e,1):this.multiSelect?this.selectedFiles.push(t.id()):this.selectedFiles=[t.id()]},a.onUpload=function(){var t=this;this.uploader.on("success",(function(e){var i=e.file;t.multiSelect?t.selectedFiles.push(i.id()):t.selectedFiles=[i.id()]}))},a.onSelect=function(){this.hide(),this.attrs.onSelect?this.attrs.onSelect(this.selectedFiles):this.selectedFiles.map((function(t){var i=e().store.getById("files",t)||e().store.getById("shared-files",t);e().composer.editor.insertAtCursor(i.bbcode()+"\n",!1)}))},a.showUploadModal=function(){var t=this;e().modal.show(Z,{onUploadComplete:function(e){t.sharedFileState.addToList(e)}},!0)},a.onDelete=function(t){this.sharedFileState.removeFromList(t),this.userFileState.removeFromList(t)},i}(D()),at=function(t){function i(){return t.apply(this,arguments)||this}p(i,t);var a=i.prototype;return a.view=function(){return m(G(),{text:e().translator.trans("fof-upload.forum.buttons.media")},b().component({className:"Button fof-upload-button Button--icon",onclick:this.fileManagerButtonClicked.bind(this),icon:"fas fa-photo-video"}))},a.fileManagerButtonClicked=function(t){t.preventDefault(),e().modal.show(it,{uploader:this.attrs.uploader})},i}(g());const ot=flarum.core.compat["forum/components/UserPage"];var rt=i.n(ot);const nt=flarum.core.compat["common/components/LinkButton"];var st=i.n(nt);const lt=flarum.core.compat["common/extenders"];var ut=i.n(lt),ft=function(t){function e(){return t.apply(this,arguments)||this}p(e,t);var i=e.prototype;return i.baseName=function(){return s().attribute("baseName").call(this)},i.path=function(){return s().attribute("path").call(this)},i.url=function(){return s().attribute("url").call(this)},i.size=function(){return s().attribute("size").call(this)},i.type=function(){return s().attribute("type").call(this)},i.humanSize=function(){return s().attribute("humanSize").call(this)},i.createdAt=function(){return s().attribute("createdAt",s().transformDate).call(this)},i.uuid=function(){return s().attribute("uuid").call(this)},i.tag=function(){return s().attribute("tag").call(this)},i.hidden=function(){return s().attribute("hidden").call(this)},i.bbcode=function(){return s().attribute("bbcode").call(this)},i.isShared=function(){return s().attribute("shared").call(this)},i.isPrivateShared=function(){return s().attribute("isPrivateShared").call(this)},i.canViewInfo=function(){return s().attribute("canViewInfo").call(this)},i.canHide=function(){return s().attribute("canHide").call(this)},i.canDelete=function(){return s().attribute("canDelete").call(this)},i.apiEndpoint=function(){return"/fof/uploads"+(this.exists?"/"+this.id():"")},e}(s());const ct=[(new(ut().Store)).add("files",ft).add("shared-files",ft)];var dt=function(t){function i(){return t.apply(this,arguments)||this}p(i,t);var a=i.prototype;return a.oninit=function(e){t.prototype.oninit.call(this,e),this.user=null,this.loadUser(m.route.param("username"))},a.content=function(){var t=new et;return e().session.user&&(e().session.user.viewOthersMediaLibrary()||this.user===e().session.user)?this.user&&K.component({user:this.user,selectable:!1,downloadOnClick:!0,fileState:t}):null},a.show=function(e){t.prototype.show.call(this,e),this.user=e},i}(rt());const ht=[].concat(ct,[(new(ut().Routes)).add("user.uploads","/u/:username/uploads",dt)]);function pt(){return pt=Object.assign||function(t){for(var e=1;e0?m("span",{className:"Button-badge"},o):""]),80)}}))}))})(),module.exports=a})(); //# sourceMappingURL=forum.js.map \ No newline at end of file diff --git a/js/dist/forum.js.map b/js/dist/forum.js.map index 0e20cea2..c163c7d6 100644 --- a/js/dist/forum.js.map +++ b/js/dist/forum.js.map @@ -1 +1 @@ -{"version":3,"file":"forum.js","mappings":"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","sources":["webpack://@fof/upload/./node_modules/@babel/runtime/regenerator/index.js","webpack://@fof/upload/./node_modules/regenerator-runtime/runtime.js","webpack://@fof/upload/webpack/bootstrap","webpack://@fof/upload/webpack/runtime/compat get default export","webpack://@fof/upload/webpack/runtime/define property getters","webpack://@fof/upload/webpack/runtime/hasOwnProperty shorthand","webpack://@fof/upload/webpack/runtime/make namespace object","webpack://@fof/upload/external root \"flarum.core.compat['forum/app']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/models/User']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/Model']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/extend']\"","webpack://@fof/upload/external root \"flarum.core.compat['forum/components/Post']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/components/TextEditor']\"","webpack://@fof/upload/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://@fof/upload/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@fof/upload/external root \"flarum.core.compat['common/Component']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/components/Button']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/components/LoadingIndicator']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/utils/classList']\"","webpack://@fof/upload/./src/forum/components/UploadButton.js","webpack://@fof/upload/./src/forum/components/DragAndDrop.js","webpack://@fof/upload/./src/forum/components/PasteClipboard.js","webpack://@fof/upload/./src/forum/handler/Uploader.js","webpack://@fof/upload/external root \"flarum.core.compat['common/components/Modal']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/app']\"","webpack://@fof/upload/./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","webpack://@fof/upload/./src/common/mimeToIcon.ts","webpack://@fof/upload/external root \"flarum.core.compat['common/helpers/icon']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/utils/ItemList']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/components/Tooltip']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/utils/extractText']\"","webpack://@fof/upload/./src/common/components/DisplayFile.tsx","webpack://@fof/upload/external root \"flarum.core.compat['common/components/Alert']\"","webpack://@fof/upload/./src/common/components/AbstractFIleList.tsx","webpack://@fof/upload/./src/common/components/UserFileList.tsx","webpack://@fof/upload/external root \"flarum.core.compat['common/components/Switch']\"","webpack://@fof/upload/./src/common/components/UploadSharedFileModal.tsx","webpack://@fof/upload/./src/common/components/SharedFileList.tsx","webpack://@fof/upload/./src/common/states/FileListState.ts","webpack://@fof/upload/./src/forum/components/FileManagerModal.js","webpack://@fof/upload/./src/forum/components/FileManagerButton.tsx","webpack://@fof/upload/external root \"flarum.core.compat['forum/components/UserPage']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/components/LinkButton']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/extenders']\"","webpack://@fof/upload/./src/common/models/File.ts","webpack://@fof/upload/./src/common/extend.ts","webpack://@fof/upload/./src/forum/components/UploadsUserPage.tsx","webpack://@fof/upload/./src/forum/extend.ts","webpack://@fof/upload/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://@fof/upload/./src/common/components/UploadedFile.tsx","webpack://@fof/upload/./src/forum/components/index.ts","webpack://@fof/upload/./src/common/components/index.ts","webpack://@fof/upload/./src/forum/index.js","webpack://@fof/upload/./src/forum/addUploadButton.js","webpack://@fof/upload/./src/forum/downloadButtonInteraction.js","webpack://@fof/upload/./src/forum/addUserPageButton.js"],"sourcesContent":["module.exports = require(\"regenerator-runtime\");\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n try {\n // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n define({}, \"\");\n } catch (err) {\n define = function(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n define(IteratorPrototype, iteratorSymbol, function () {\n return this;\n });\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = GeneratorFunctionPrototype;\n define(Gp, \"constructor\", GeneratorFunctionPrototype);\n define(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction);\n GeneratorFunction.displayName = define(\n GeneratorFunctionPrototype,\n toStringTagSymbol,\n \"GeneratorFunction\"\n );\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n define(prototype, method, function(arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return PromiseImpl.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n return this;\n });\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n define(Gp, iteratorSymbol, function() {\n return this;\n });\n\n define(Gp, \"toString\", function() {\n return \"[object Generator]\";\n });\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, in modern engines\n // we can explicitly access globalThis. In older engines we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/app'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/models/User'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/Model'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extend'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/Post'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/TextEditor'];","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/Component'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Button'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/LoadingIndicator'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/classList'];","import app from 'flarum/forum/app';\nimport Component from 'flarum/common/Component';\nimport Button from 'flarum/common/components/Button';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\nimport classList from 'flarum/common/utils/classList';\n\nexport default class UploadButton extends Component {\n oninit(vnode) {\n super.oninit(vnode);\n\n this.attrs.uploader.on('uploaded', () => {\n // reset the button for a new upload\n this.$('form')[0].reset();\n\n // redraw to reflect uploader.loading in the DOM\n m.redraw();\n });\n\n this.isMediaUploadButton = vnode.attrs.isMediaUploadButton || false;\n }\n\n view() {\n const buttonText = this.attrs.uploader.uploading\n ? app.translator.trans('fof-upload.forum.states.loading')\n : app.translator.trans('fof-upload.forum.buttons.upload');\n\n return (\n \n {this.attrs.uploader.uploading && }\n {(this.isMediaUploadButton || this.attrs.uploader.uploading) && {buttonText}}\n
\n \n
\n \n );\n }\n\n /**\n * Process the upload event.\n *\n * @param e\n */\n process(e) {\n // get the file from the input field\n const files = this.$('input').prop('files');\n\n if (files.length === 0) {\n // We've got no files to upload, so trying\n // to begin an upload will show an error\n // to the user.\n return;\n }\n\n this.attrs.uploader.upload(files, !this.isMediaUploadButton);\n }\n\n /**\n * Event handler for upload button being clicked\n *\n * @param {PointerEvent} e\n */\n uploadButtonClicked(e) {\n // Trigger click on hidden input element\n // (Opens file dialog)\n this.$('input').click();\n }\n}\n","export default class DragAndDrop {\n constructor(upload, composerElement) {\n this.upload = upload;\n this.composerElement = composerElement;\n\n // Keep references to the bound methods so we can remove the event listeners later\n this.handlers = {};\n\n if (!this.supportsFileDragging()) {\n return;\n }\n\n this.composerElement.addEventListener('dragover', (this.handlers.in = this.in.bind(this)));\n\n this.composerElement.addEventListener('dragleave', (this.handlers.out = this.out.bind(this)));\n this.composerElement.addEventListener('dragend', this.handlers.out);\n\n this.composerElement.addEventListener('drop', (this.handlers.dropping = this.dropping.bind(this)));\n }\n\n supportsFileDragging() {\n // Based on https://css-tricks.com/drag-and-drop-file-uploading/\n const div = document.createElement('div');\n\n return ('draggable' in div || ('ondragstart' in div && 'ondrop' in div)) && 'FormData' in window && 'FileReader' in window;\n }\n\n unload() {\n // If the handlers were not set (drag and drop not supported), we skip removing them\n if (!this.handlers.in) {\n return;\n }\n\n this.composerElement.removeEventListener('dragover', this.handlers.in);\n\n this.composerElement.removeEventListener('dragleave', this.handlers.out);\n this.composerElement.removeEventListener('dragend', this.handlers.out);\n\n this.composerElement.removeEventListener('drop', this.handlers.dropping);\n }\n\n isNotFile(event) {\n // Checking event.dataTransfer.files.length does not work on dragover event, it's always zero\n // So we use the dataTransfer.items property to check whether any file is being dragged\n if (event.dataTransfer.items) {\n for (let i = 0; i < event.dataTransfer.items.length; i++) {\n if (event.dataTransfer.items[i].kind !== 'file') {\n return true;\n }\n }\n }\n\n return false;\n }\n\n in(event) {\n if (this.isNotFile(event)) {\n return;\n }\n\n event.preventDefault();\n\n if (!this.over) {\n this.composerElement.classList.add('fof-upload-dragging');\n this.over = true;\n }\n }\n\n out(event) {\n if (this.isNotFile(event)) {\n return;\n }\n\n event.preventDefault();\n\n if (this.over) {\n this.composerElement.classList.remove('fof-upload-dragging');\n this.over = false;\n }\n }\n\n dropping(event) {\n if (this.isNotFile(event)) {\n return;\n }\n\n event.preventDefault();\n\n this.upload(event.dataTransfer.files);\n\n this.composerElement.classList.remove('fof-upload-dragging');\n }\n}\n","export default class PasteClipboard {\n constructor(upload, element) {\n this.upload = upload;\n\n // We don't need to remove the events listeners, because they'll get removed when the DOM does.\n element.addEventListener('paste', this.paste.bind(this));\n }\n\n paste(e) {\n if (e.clipboardData && e.clipboardData.items) {\n const items = e.clipboardData.items;\n\n const files = [];\n\n for (let i = 0; i < items.length; i++) {\n if (items[i].type.indexOf('image') !== -1) {\n files.push(items[i].getAsFile());\n }\n }\n\n if (files.length > 0) {\n e.preventDefault();\n\n this.upload(files);\n }\n }\n }\n}\n","import app from 'flarum/forum/app';\n\nexport default class Uploader {\n constructor() {\n this.callbacks = {\n success: [],\n failure: [],\n uploading: [],\n uploaded: [],\n };\n this.uploading = false;\n }\n\n setState(fileState) {\n this.fileState = fileState;\n }\n\n on(type, callback) {\n this.callbacks[type].push(callback);\n }\n\n dispatch(type, response) {\n this.callbacks[type].forEach((callback) => callback(response));\n }\n\n upload(files, addBBcode = true) {\n this.uploading = true;\n this.dispatch('uploading', files);\n\n m.redraw(); // Forcing a redraw so that the button also updates if uploadFiles() is called from DragAndDrop or PasteClipboard\n\n const body = new FormData();\n\n for (let i = 0; i < files.length; i++) {\n body.append('files[]', files[i]);\n }\n\n // send a POST request to the api\n return app\n .request({\n method: 'POST',\n url: app.forum.attribute('apiUrl') + '/fof/upload',\n // prevent JSON.stringify'ing the form data in the XHR call\n serialize: (raw) => raw,\n body,\n })\n .then((result) => this.uploaded(result, addBBcode))\n .catch((error) => {\n this.uploading = false;\n m.redraw();\n\n const e = error.response.errors[0];\n\n if (!e.code.includes('fof-upload')) {\n throw error;\n }\n\n app.alerts.clear();\n app.alerts.show(\n {\n type: 'error',\n },\n e.detail\n );\n });\n }\n\n uploaded(result, addBBcode = false) {\n this.uploading = false;\n\n result.data.forEach((file) => {\n const fileObj = app.store.pushObject(file);\n\n // Add file to media manager\n this.fileState?.addToList(fileObj);\n\n // Dispatch\n this.dispatch('success', {\n file: fileObj,\n addBBcode,\n });\n });\n\n this.dispatch('uploaded');\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Modal'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/app'];","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n\nexport default function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}","const mimeToIconMap = new Map([\n // Image formats\n ['image/png', 'far fa-file-image'],\n ['image/jpg', 'far fa-file-image'],\n ['image/jpeg', 'far fa-file-image'],\n ['image/svg+xml', 'far fa-file-image'],\n ['image/gif', 'far fa-file-image'],\n ['image/bmp', 'far fa-file-image'],\n ['image/webp', 'far fa-file-image'],\n\n // Compressed file formats\n ['application/zip', 'far fa-file-archive'],\n ['application/x-7z-compressed', 'far fa-file-archive'],\n ['application/gzip', 'far fa-file-archive'],\n ['application/vnd.rar', 'far fa-file-archive'],\n ['application/x-rar-compressed', 'far fa-file-archive'],\n ['application/x-tar', 'far fa-file-archive'],\n ['application/x-iso9660-image', 'far fa-file-archive'],\n\n // Text and code file formats\n ['text/plain', 'far fa-file-alt'],\n ['text/csv', 'far fa-file-csv'],\n ['text/xml', 'far fa-file-code'],\n ['text/html', 'far fa-file-code'],\n ['text/css', 'far fa-file-code'],\n ['text/javascript', 'far fa-file-code'],\n ['application/json', 'far fa-file-code'],\n ['application/ld+json', 'far fa-file-code'],\n ['application/x-httpd-php', 'far fa-file-code'],\n ['application/xml', 'far fa-file-code'],\n ['text/xml', 'far fa-file-code'],\n\n // Document formats\n ['application/x-abiword', 'far fa-file-word'],\n ['application/msword', 'far fa-file-word'],\n ['application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'far fa-file-word'],\n ['application/vnd.oasis.opendocument.text', 'far fa-file-word'],\n ['application/vnd.ms-excel', 'far fa-file-excel'],\n ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'far fa-file-excel'],\n ['application/vnd.oasis.opendocument.spreadsheet', 'far fa-file-excel'],\n ['application/vnd.ms-powerpoint', 'far fa-file-powerpoint'],\n ['application/vnd.openxmlformats-officedocument.presentationml.presentation', 'far fa-file-powerpoint'],\n ['application/vnd.oasis.opendocument.presentation', 'far fa-file-powerpoint'],\n ['application/pdf', 'far fa-file-pdf'],\n ['application/rtf', 'far fa-file-alt'],\n\n // eBook formats\n ['application/epub+zip', 'far fa-book'],\n ['application/x-mobipocket-ebook', 'far fa-book'],\n ['application/vnd.amazon.ebook', 'far fa-book'],\n\n // Audio formats\n ['audio/mpeg', 'far fa-file-audio'],\n ['audio/wav', 'far fa-file-audio'],\n ['audio/x-wav', 'far fa-file-audio'],\n ['audio/aac', 'far fa-file-audio'],\n ['audio/ogg', 'far fa-file-audio'],\n ['audio/flac', 'far fa-file-audio'],\n ['audio/aiff', 'far fa-file-audio'],\n ['audio/x-aiff', 'far fa-file-audio'],\n\n // Video formats\n ['video/x-msvideo', 'far fa-file-video'],\n ['video/mp4', 'far fa-file-video'],\n ['video/quicktime', 'far fa-file-video'],\n]);\n\nexport default function mimeToIcon(fileType: string): string {\n // Directly return the icon if the fileType is in the map\n return (\n mimeToIconMap.get(fileType) ||\n (function () {\n // Check for generic types\n if (fileType.startsWith('image/')) {\n return 'far fa-file-image';\n } else if (fileType.startsWith('video/')) {\n return 'far fa-file-video';\n } else if (fileType.startsWith('audio/')) {\n return 'far fa-file-audio';\n }\n\n // Default icon\n return 'far fa-file';\n })()\n );\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/icon'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/ItemList'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Tooltip'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/extractText'];","import app from 'flarum/common/app';\nimport Component, { ComponentAttrs } from 'flarum/common/Component';\nimport File from '../models/File';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\nimport Button from 'flarum/common/components/Button';\nimport icon from 'flarum/common/helpers/icon';\nimport mimeToIcon from '../mimeToIcon';\nimport User from 'flarum/common/models/User';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport type Mithril from 'mithril';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport extractText from 'flarum/common/utils/extractText';\n\ninterface CustomAttrs extends ComponentAttrs {\n file: File;\n fileSelectable: boolean;\n isSelected: boolean;\n fileClassNames: string;\n isFileHiding: boolean;\n onHide: (file: File) => void | undefined;\n onFileClick: (file: File) => void | undefined;\n onDelete: (file: File) => void | undefined;\n user: User;\n}\n\nexport default class DisplayFile extends Component {\n isFileHiding!: boolean;\n imageLoaded: boolean = true;\n file!: File;\n fileIcon!: string;\n isSelected!: boolean;\n isSelectable!: boolean;\n\n oninit(vnode: Mithril.Vnode) {\n super.oninit(vnode);\n\n this.file = this.attrs.file;\n this.isFileHiding = this.attrs.isFileHiding === undefined ? false : this.attrs.isFileHiding;\n this.fileIcon = mimeToIcon(this.file.type());\n this.isSelected = this.attrs.isSelected === undefined ? false : this.attrs.isSelected;\n this.isSelectable = this.attrs.fileSelectable === undefined ? true : this.attrs.fileSelectable;\n }\n\n onbeforeupdate(vnode: Mithril.VnodeDOM): void {\n super.onbeforeupdate(vnode);\n\n // Make sure the isSelected property is updated\n this.isSelected = this.attrs.isSelected === undefined ? false : this.attrs.isSelected;\n }\n\n view() {\n const isImage = this.file.type().startsWith('image/');\n\n const fileSelectedClass = this.isSelected ? 'selected' : '';\n\n return (\n {\n if (this.isSelectable && !this.isFileHiding) {\n this.isSelected = !this.isSelected;\n this.attrs.onFileClick(this.file);\n }\n }}\n disabled={!this.isSelectable || this.isFileHiding}\n >\n {this.imageLoaded && isImage ? (\n \n ) : (\n this.displayIcon(this.fileIcon)\n )}\n\n
{this.actionItems(this.file).toArray()}
\n\n
\n \n {this.file.baseName()}\n \n
\n\n {this.isFileHiding && (\n
\n \n
\n )}\n \n );\n }\n\n displayIcon(fileIcon: string): Mithril.Children {\n return (\n \n {icon(`fa-fw ${fileIcon}`)}\n \n );\n }\n\n actionItems(file: File): ItemList {\n const items = new ItemList();\n\n file.canViewInfo() &&\n items.add(\n 'view-info',\n \n \n )}\n \n \n );\n }\n\n onDelete(file: File) {\n if (this.attrs.onDelete) {\n this.attrs.onDelete(file);\n }\n }\n\n // Common methods like onFileClick, isSelectable, hideFile...\n\n onFileClick(file: File) {\n // Custom functionality\n if (this.attrs.onFileSelect) {\n this.attrs.onFileSelect(file);\n return;\n }\n\n // Download on click\n if (this.attrs.downloadOnClick) {\n window.open(file.url());\n return;\n }\n }\n\n isSelectable(file: File) {\n const fileType = file.type();\n\n // Custom defined file types\n if (Array.isArray(this.restrictFileType)) {\n return this.restrictFileType.indexOf(fileType) >= 0;\n }\n\n // Image\n else if (this.restrictFileType === 'image') {\n return fileType.includes('image/');\n }\n\n // Audio\n else if (this.restrictFileType === 'audio') {\n return fileType.includes('audio/');\n }\n\n // Video\n else if (this.restrictFileType === 'video') {\n return fileType.includes('video/');\n }\n\n return false;\n }\n\n /**\n * Begins the hiding process for a file.\n *\n * - Shows a native confirmation dialog\n * - If confirmed, sends AJAX request to the hide file API\n */\n async hideFile(file: File) {\n const uuid = file.uuid();\n\n if (this.filesBeingHidden.includes(uuid)) return;\n\n this.filesBeingHidden.push(uuid);\n\n const transPrefix = file.isShared() ? 'fof-upload.lib.file_list.hide_shared_file' : 'fof-upload.lib.file_list.hide_file';\n\n const confirmToggleHide = confirm(\n extractText(\n app.translator.trans(file.hidden() ? `${transPrefix}.show_confirmation` : `${transPrefix}.hide_confirmation`, {\n fileName: file.baseName(),\n })\n )\n );\n\n if (confirmToggleHide) {\n try {\n const filePayload = await app.request({\n method: 'PATCH',\n url: `${app.forum.attribute('apiUrl')}/fof/upload/hide`,\n body: { uuid },\n });\n\n app.store.pushPayload(filePayload);\n m.redraw();\n\n app.alerts.show(Alert, { type: 'success' }, [\n icon(file.hidden() ? 'fas fa-eye-slash' : 'fas fa-eye'),\n ' ',\n app.translator.trans(file?.hidden() ? `${transPrefix}.hide_success` : `${transPrefix}.show_success`),\n ]);\n\n if (this.fileState.user) {\n const index = this.fileState.files.findIndex((file: File) => uuid === file.uuid());\n this.fileState.files.splice(index, 1);\n }\n } catch (error) {\n app.alerts.show(\n Alert,\n { type: 'error' },\n app.translator.trans(file?.hidden() ? `${transPrefix}.hide_fail` : `${transPrefix}.show_fail`, {\n fileName: file.baseName(),\n })\n );\n } finally {\n // Remove file from hiding list\n const i = this.filesBeingHidden.indexOf(uuid);\n this.filesBeingHidden.splice(i, 1);\n }\n }\n }\n}\n","import app from 'flarum/common/app';\nimport File from '../models/File';\nimport AbstractFileList from './AbstractFIleList';\nimport FileListState from '../states/FileListState';\n\nexport default class UserFileList extends AbstractFileList {\n public loadFileList(): void {\n //app.fileListState.setUser(this.attrs.user || app.session.user);\n this.fileState.setUser(this.attrs.user || app.session.user);\n /**\n * The user who's media we are dealing with\n */\n this.user = this.fileState.user; //app.fileListState.user;\n }\n\n hasMoreResults(): boolean {\n return this.fileState.hasMoreResults();\n }\n\n loadMore(): void {\n this.fileState.loadMore();\n }\n\n isLoading(): boolean {\n return this.fileState.isLoading();\n }\n\n fileCollection(): File[] {\n return this.fileState.files;\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Switch'];","import app from 'flarum/common/app';\nimport Modal, { IInternalModalAttrs } from 'flarum/common/components/Modal';\nimport Switch from 'flarum/common/components/Switch';\nimport mimeToIcon from '../mimeToIcon';\nimport Button from 'flarum/common/components/Button';\nimport type Mithril from 'mithril';\nimport { ApiResponsePlural } from 'flarum/common/Store';\nimport File from '../models/File';\n\ninterface CustomAttrs extends IInternalModalAttrs {\n onUploadComplete: (files: File | File[]) => void;\n}\n\nexport default class UploadSharedFileModal extends Modal {\n files = [];\n fileInput = null;\n options = {\n shared: true,\n hidden: false,\n };\n loading: boolean = false;\n\n oninit(vnode: Mithril.Vnode) {\n super.oninit(vnode);\n }\n\n className() {\n return 'UploadSharedFileModal Modal--medium';\n }\n\n title() {\n return app.translator.trans('fof-upload.lib.upload-shared-file-modal.title');\n }\n\n onFileChange(e) {\n this.addFiles(Array.from(e.target.files));\n }\n\n addFiles(newFiles: File[]) {\n (this.files as File[]).push(...newFiles);\n m.redraw();\n }\n\n onDragOver(e) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n onDrop(e) {\n e.preventDefault();\n e.stopPropagation();\n if (e.dataTransfer && e.dataTransfer.files) {\n this.addFiles(Array.from(e.dataTransfer.files));\n }\n }\n\n onDropzoneClick() {\n if (this.fileInput) {\n this.fileInput.click();\n }\n }\n\n content() {\n return (\n
\n this.onDropzoneClick()}\n ondragover={this.onDragOver.bind(this)}\n ondrop={this.onDrop.bind(this)}\n >\n {app.translator.trans('fof-upload.lib.upload-shared-file-modal.dropzone')}\n {\n this.fileInput = vnode.dom;\n }}\n />\n
\n
\n {this.files.map((file: File) => {\n const isImage = file.type.startsWith('image/');\n return (\n
\n {isImage ? {file.name} : }\n
{file.name}
\n {/* Remove button */}\n {\n this.files = this.files.filter((f) => f !== file);\n }}\n />\n
\n );\n })}\n
\n
\n (this.options.hidden = value)}>\n {app.translator.trans('fof-upload.lib.upload-shared-file-modal.hide-from-media-gallery')}\n \n
\n
\n \n {app.translator.trans('fof-upload.lib.upload-shared-file-modal.upload')}\n \n
\n \n );\n }\n\n async upload() {\n this.loading = true;\n m.redraw();\n\n const formData = new FormData();\n\n // Append each file to the form data\n this.files.forEach((file) => {\n formData.append('files[]', file);\n });\n\n Object.keys(this.options).forEach((key) => {\n formData.append(`options[${key}]`, this.options[key]);\n });\n\n const results = await app.request>({\n method: 'POST',\n url: app.forum.attribute('apiUrl') + '/fof/upload',\n serialize: (raw: FormData) => raw, // Prevent mithril from trying to serialize FormData\n body: formData,\n });\n\n const uploadedFiles = app.store.pushPayload(results);\n\n this.attrs.onUploadComplete(uploadedFiles);\n this.files = [];\n this.hide();\n\n this.loading = false;\n m.redraw();\n }\n}\n","import app from 'flarum/common/app';\nimport File from '../models/File';\nimport AbstractFileList from './AbstractFIleList';\n\nexport default class SharedFileList extends AbstractFileList {\n public loadFileList(): void {\n this.fileState.loadResults();\n }\n\n hasMoreResults() {\n return this.fileState.hasMoreResults();\n }\n\n loadMore() {\n this.fileState.loadMore();\n }\n\n isLoading(): boolean {\n return this.fileState.isLoading();\n }\n\n fileCollection(): File[] {\n return this.fileState.files;\n }\n}\n","import app from 'flarum/common/app';\nimport User from 'flarum/common/models/User';\nimport File from '../models/File';\nimport { ApiQueryParamsPlural, ApiResponsePlural } from 'flarum/common/Store';\n\nexport default class FileListState {\n public user: User | null;\n public files: File[];\n private moreResults: boolean;\n private loading: boolean;\n private sharedFiles: boolean;\n\n constructor(sharedFiles: boolean = false) {\n this.user = null;\n this.files = [];\n this.moreResults = false;\n this.loading = false;\n this.sharedFiles = sharedFiles;\n }\n\n /**\n * Set the user and load their file list.\n * @param user The user whose files to load.\n */\n public setUser(user: User): void {\n if (user === this.user) return;\n\n this.user = user;\n this.files = [];\n this.loadResults();\n }\n\n public refresh(): void {\n this.files = [];\n this.loadResults();\n m.redraw();\n }\n\n /**\n * Load more files for the current user, starting from the given offset.\n * @param offset The starting index for loading more files.\n * @returns A promise resolving to the loaded files.\n */\n public async loadResults(offset: number = 0): Promise> {\n if (!this.sharedFiles && !this.user) return Promise.reject('User not set');\n\n this.loading = true;\n\n let route: string = 'fof/uploads';\n let params: ApiQueryParamsPlural = {};\n\n if (!this.sharedFiles && this.user) {\n params = {\n filter: { user: this.user.id() },\n page: { offset },\n } as ApiQueryParamsPlural;\n } else {\n route = 'fof/upload/shared-files';\n params = {\n page: { offset },\n } as ApiQueryParamsPlural;\n }\n\n const results = await app.store.find(route, params);\n\n return this.parseResults(results);\n }\n\n /**\n * Load the next set of results.\n */\n public async loadMore(): Promise> {\n this.loading = true;\n return this.loadResults(this.files.length);\n }\n\n private parseResults(results: ApiResponsePlural): ApiResponsePlural {\n this.files = results;\n this.loading = false;\n this.moreResults = !!results.payload?.links?.next;\n m.redraw();\n return results;\n }\n\n /**\n * Add files to the beginning of the list.\n * @param files The files to be added.\n */\n public addToList(files: File | File[]): void {\n if (Array.isArray(files)) {\n this.files.unshift(...files);\n } else {\n this.files.unshift(files);\n }\n m.redraw();\n }\n\n /**\n * Remove files from the list.\n * @param files The files to be removed.\n */\n public removeFromList(files: File | File[]): void {\n if (Array.isArray(files)) {\n this.files = this.files.filter((file) => !files.includes(file));\n } else {\n this.files = this.files.filter((file) => file !== files);\n }\n\n m.redraw();\n }\n\n /**\n * Check if there are files in the list.\n * @returns True if there are files, false otherwise.\n */\n public hasFiles(): boolean {\n return this.files.length > 0;\n }\n\n /**\n * Check if the file list is currently loading.\n * @returns True if loading, false otherwise.\n */\n public isLoading(): boolean {\n return this.loading;\n }\n\n /**\n * Check if there are more files to load.\n * @returns True if there are more files, false otherwise.\n */\n public hasMoreResults(): boolean {\n return this.moreResults;\n }\n\n /**\n * Check if the user has no files and the list is not loading.\n * @returns True if the list is empty and not loading, false otherwise.\n */\n public empty(): boolean {\n return !this.hasFiles() && !this.isLoading();\n }\n}\n","import app from 'flarum/forum/app';\nimport Modal from 'flarum/common/components/Modal';\nimport Button from 'flarum/common/components/Button';\nimport UploadButton from './UploadButton';\nimport UserFileList from '../../common/components/UserFileList';\nimport DragAndDrop from './DragAndDrop';\nimport UploadSharedFileModal from '../../common/components/UploadSharedFileModal';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport SharedFileList from '../../common/components/SharedFileList';\nimport FileListState from '../../common/states/FileListState';\n\nexport default class FileManagerModal extends Modal {\n oninit(vnode) {\n super.oninit(vnode);\n\n // Initialize upload managers\n this.uploader = vnode.attrs.uploader;\n\n // Current selected files\n this.selectedFiles = [];\n\n // Allow multiselect\n this.multiSelect = vnode.attrs.multiSelect === undefined ? true : vnode.attrs.multiSelect;\n\n // Restrict file selection to specific types\n this.restrictFileType = vnode.attrs.restrictFileType || null;\n\n // Drag & drop\n this.dragDrop = null;\n\n this.selectedFilesLibrary = vnode.attrs.defaultFilesLibrary || 'user';\n\n this.sharedUploads = null;\n\n this.userFileState = new FileListState();\n this.sharedFileState = new FileListState(true);\n\n this.uploader.setState(this.userFileState);\n\n // Initialize uploads\n this.onUpload();\n }\n\n className() {\n return 'Modal--large fof-file-manager-modal';\n }\n\n /**\n * Initialize drag & drop\n */\n oncreate(vnode) {\n super.oncreate(vnode);\n\n this.dragDrop = new DragAndDrop((files) => this.uploader.upload(files, false), this.$().find('.Modal-content')[0]);\n }\n\n /**\n * Remove events from modal content\n */\n onremove() {\n if (this.dragDrop) {\n this.dragDrop.unload();\n }\n }\n\n view() {\n const fileCount = this.selectedFiles.length;\n const { hideUser, hideShared } = this.attrs;\n\n return (\n
\n
\n
\n {!hideUser && this.selectedFilesLibrary === 'user' && (\n \n )}\n {app.session.user && app.session.user.uploadSharedFiles() && !hideShared && this.selectedFilesLibrary === 'shared' && (\n {\n this.showUploadModal();\n }}\n >\n {app.translator.trans('fof-upload.forum.buttons.upload')}\n \n )}\n
\n\n
\n
\n \n\n {app.translator.trans('fof-upload.lib.file_list.release_to_upload')}\n
\n
\n\n
\n

{app.translator.trans('fof-upload.forum.media_manager')}

\n {app.session.user?.accessSharedFiles() && !hideUser && !hideShared && (\n
{this.fileLibraryButtonItems().toArray()}
\n )}\n
\n\n {this.alertAttrs && (\n
\n \n
\n )}\n\n
\n {this.selectedFilesLibrary === 'user' && this.userFilesContent()}\n {this.selectedFilesLibrary === 'shared' && this.sharedFilesContent()}\n
\n\n
\n \n\n 1)}\n className=\"Button Button--primary\"\n >\n {app.translator.trans('fof-upload.lib.file_list.confirm_selection_btn', { fileCount })}\n \n
\n
\n
\n );\n }\n\n fileLibraryButtonItems() {\n const items = new ItemList();\n\n items.add(\n 'user',\n \n );\n\n items.add(\n 'shared',\n \n );\n\n return items;\n }\n\n setLibrary(library) {\n this.selectedFilesLibrary = library;\n m.redraw();\n }\n\n userFilesContent() {\n return (\n \n );\n }\n\n sharedFilesContent() {\n return (\n \n );\n }\n\n /**\n * Add or remove file from selected files\n *\n * @param {File} file\n */\n onFileSelect(file) {\n const itemPosition = this.selectedFiles.indexOf(file.id());\n\n if (itemPosition >= 0) {\n this.selectedFiles.splice(itemPosition, 1);\n } else {\n if (this.multiSelect) {\n this.selectedFiles.push(file.id());\n } else {\n this.selectedFiles = [file.id()];\n }\n }\n }\n\n /**\n * Add files to file list after upload\n */\n onUpload() {\n this.uploader.on('success', ({ file }) => {\n if (this.multiSelect) {\n this.selectedFiles.push(file.id());\n } else {\n this.selectedFiles = [file.id()];\n }\n });\n }\n\n /**\n * Add selected files to the composer\n */\n onSelect() {\n this.hide();\n\n // Custom callback\n if (this.attrs.onSelect) {\n this.attrs.onSelect(this.selectedFiles);\n\n return;\n }\n\n // Add selected files to composer\n this.selectedFiles.map((fileId) => {\n const file = app.store.getById('files', fileId) || app.store.getById('shared-files', fileId);\n\n app.composer.editor.insertAtCursor(file.bbcode() + '\\n', false);\n });\n }\n\n showUploadModal() {\n app.modal.show(\n UploadSharedFileModal,\n {\n onUploadComplete: (files) => {\n this.sharedFileState.addToList(files);\n },\n },\n true\n );\n }\n\n onDelete(file) {\n this.sharedFileState.removeFromList(file);\n this.userFileState.removeFromList(file);\n }\n}\n","import app from 'flarum/forum/app';\nimport Component, { ComponentAttrs } from 'flarum/common/Component';\nimport Button from 'flarum/common/components/Button';\nimport FileManagerModal from './FileManagerModal';\nimport Tooltip from 'flarum/common/components/Tooltip';\n\ninterface FileManagerButtonAttrs extends ComponentAttrs {\n uploader: any;\n}\n\nexport default class FileManagerButton extends Component {\n view() {\n return (\n \n {Button.component({\n className: 'Button fof-upload-button Button--icon',\n onclick: this.fileManagerButtonClicked.bind(this),\n icon: 'fas fa-photo-video',\n })}\n \n );\n }\n\n /**\n * Event handler for upload button being clicked\n */\n fileManagerButtonClicked(e: PointerEvent) {\n e.preventDefault();\n\n // Open dialog\n app.modal.show(FileManagerModal, {\n uploader: this.attrs.uploader,\n });\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/UserPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/LinkButton'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extenders'];","import Model from 'flarum/common/Model';\n\nexport default class File extends Model {\n baseName() {\n return Model.attribute('baseName').call(this);\n }\n\n path() {\n return Model.attribute('path').call(this);\n }\n\n url() {\n return Model.attribute('url').call(this);\n }\n\n size() {\n return Model.attribute('size').call(this);\n }\n\n type() {\n return Model.attribute('type').call(this);\n }\n\n humanSize() {\n return Model.attribute('humanSize').call(this);\n }\n\n createdAt() {\n return Model.attribute('createdAt', Model.transformDate).call(this);\n }\n\n uuid() {\n return Model.attribute('uuid').call(this);\n }\n\n tag() {\n return Model.attribute('tag').call(this);\n }\n\n hidden() {\n return Model.attribute('hidden').call(this);\n }\n\n bbcode() {\n return Model.attribute('bbcode').call(this);\n }\n\n isShared() {\n return Model.attribute('shared').call(this);\n }\n\n isPrivateShared() {\n return Model.attribute('isPrivateShared').call(this);\n }\n\n canViewInfo() {\n return Model.attribute('canViewInfo').call(this);\n }\n\n canHide() {\n return Model.attribute('canHide').call(this);\n }\n\n canDelete() {\n return Model.attribute('canDelete').call(this);\n }\n\n apiEndpoint() {\n return '/fof/uploads' + (this.exists ? '/' + this.id() : '');\n }\n}\n","import Extend from 'flarum/common/extenders';\nimport File from './models/File';\n\nexport default [\n new Extend.Store() //\n .add('files', File)\n .add('shared-files', File),\n];\n","import app from 'flarum/forum/app';\nimport UserPage from 'flarum/forum/components/UserPage';\nimport UserFileList from '../../common/components/UserFileList';\nimport type Mithril from 'mithril';\nimport User from 'flarum/common/models/User';\nimport FileListState from '../../common/states/FileListState';\n\nexport default class UploadsUserPage extends UserPage {\n oninit(vnode: Mithril.Vnode) {\n super.oninit(vnode);\n\n this.user = null;\n\n this.loadUser(m.route.param('username'));\n }\n\n content() {\n const fileState = new FileListState();\n if (app.session.user && (app.session.user.viewOthersMediaLibrary() || this.user === app.session.user)) {\n return (\n this.user &&\n UserFileList.component({\n user: this.user,\n selectable: false,\n downloadOnClick: true,\n fileState,\n })\n );\n } else {\n return null;\n }\n }\n\n show(user: User) {\n super.show(user);\n this.user = user;\n }\n}\n","import User from 'flarum/common/models/User';\nimport { default as extend } from '../common/extend';\nimport Extend from 'flarum/common/extenders';\nimport UploadsUserPage from './components/UploadsUserPage';\n\nexport default [\n ...extend,\n\n // Not using the new extender yet, thinking about if to change the serialized names,\n // or the js property names, as we can't change the key->attribute name via the extender,\n // like we used to do with ie `User.prototype.viewOthersMediaLibrary = Model.attribute('fof-upload-viewOthersMediaLibrary');`\n // new Extend.Model(User) //\n // .attribute('fof-upload-viewOthersMediaLibrary')\n // .attribute('fof-upload-deleteOthersMediaLibrary')\n // .attribute('fof-upload-uploadCountCurrent')\n // .attribute('fof-upload-uploadCountAll'),\n\n new Extend.Routes() //\n .add('user.uploads', '/u/:username/uploads', UploadsUserPage),\n];\n","export default function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}","import Component, { ComponentAttrs } from 'flarum/common/Component';\nimport Button from 'flarum/common/components/Button';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport type Mithril from 'mithril';\nimport mimeToIcon from '../mimeToIcon';\nimport File from '../models/File';\nimport icon from 'flarum/common/helpers/icon';\nimport app from 'flarum/common/app';\nimport classList from 'flarum/common/utils/classList';\n\ninterface CustomAttrs extends ComponentAttrs {\n file: File;\n selectable: boolean;\n fileClassNames: string;\n onDelete: (file: File) => void | undefined;\n onFileSelect: (file: File) => void | undefined;\n}\n\nexport default class UploadedFile extends Component {\n file!: File;\n callback!: () => void | undefined;\n imageLoaded: boolean = true;\n\n oninit(vnode: Mithril.Vnode) {\n super.oninit(vnode);\n\n this.file = this.attrs.file;\n }\n\n view() {\n const isImage = this.file.type().startsWith('image/');\n const fileIcon = mimeToIcon(this.file.type());\n const errorIcon = 'fas fa-exclamation-triangle';\n const statusIcon = this.file.isPrivateShared() ? 'fas fa-lock' : 'fas fa-unlock';\n\n return (\n
\n
\n \n {icon(statusIcon)}\n {this.file.baseName()}\n \n
\n
this.onFileClick(this.file)}>\n {isImage ? (\n this.imageLoaded ? (\n \n ) : (\n icon(errorIcon, { className: 'icon-fallback' }) // Error icon for failed image load\n )\n ) : (\n icon(fileIcon, { className: 'icon-fallback' }) // Icon representing the file type\n )}\n
\n
{this.actionItems().toArray()}
\n
\n );\n }\n\n actionItems(): ItemList {\n const items = new ItemList();\n\n items.add(\n 'view-info',\n \n );\n }\n\n /**\n * Process the upload event.\n *\n * @param e\n */\n process(e) {\n // get the file from the input field\n const files = this.$('input').prop('files');\n\n if (files.length === 0) {\n // We've got no files to upload, so trying\n // to begin an upload will show an error\n // to the user.\n return;\n }\n\n this.attrs.uploader.upload(files, !this.isMediaUploadButton);\n }\n\n /**\n * Event handler for upload button being clicked\n *\n * @param {PointerEvent} e\n */\n uploadButtonClicked(e) {\n // Trigger click on hidden input element\n // (Opens file dialog)\n this.$('input').click();\n }\n}\n","export default class DragAndDrop {\n constructor(upload, composerElement) {\n this.upload = upload;\n this.composerElement = composerElement;\n\n // Keep references to the bound methods so we can remove the event listeners later\n this.handlers = {};\n\n if (!this.supportsFileDragging()) {\n return;\n }\n\n this.composerElement.addEventListener('dragover', (this.handlers.in = this.in.bind(this)));\n\n this.composerElement.addEventListener('dragleave', (this.handlers.out = this.out.bind(this)));\n this.composerElement.addEventListener('dragend', this.handlers.out);\n\n this.composerElement.addEventListener('drop', (this.handlers.dropping = this.dropping.bind(this)));\n }\n\n supportsFileDragging() {\n // Based on https://css-tricks.com/drag-and-drop-file-uploading/\n const div = document.createElement('div');\n\n return ('draggable' in div || ('ondragstart' in div && 'ondrop' in div)) && 'FormData' in window && 'FileReader' in window;\n }\n\n unload() {\n // If the handlers were not set (drag and drop not supported), we skip removing them\n if (!this.handlers.in) {\n return;\n }\n\n this.composerElement.removeEventListener('dragover', this.handlers.in);\n\n this.composerElement.removeEventListener('dragleave', this.handlers.out);\n this.composerElement.removeEventListener('dragend', this.handlers.out);\n\n this.composerElement.removeEventListener('drop', this.handlers.dropping);\n }\n\n isNotFile(event) {\n // Checking event.dataTransfer.files.length does not work on dragover event, it's always zero\n // So we use the dataTransfer.items property to check whether any file is being dragged\n if (event.dataTransfer.items) {\n for (let i = 0; i < event.dataTransfer.items.length; i++) {\n if (event.dataTransfer.items[i].kind !== 'file') {\n return true;\n }\n }\n }\n\n return false;\n }\n\n in(event) {\n if (this.isNotFile(event)) {\n return;\n }\n\n event.preventDefault();\n\n if (!this.over) {\n this.composerElement.classList.add('fof-upload-dragging');\n this.over = true;\n }\n }\n\n out(event) {\n if (this.isNotFile(event)) {\n return;\n }\n\n event.preventDefault();\n\n if (this.over) {\n this.composerElement.classList.remove('fof-upload-dragging');\n this.over = false;\n }\n }\n\n dropping(event) {\n if (this.isNotFile(event)) {\n return;\n }\n\n event.preventDefault();\n\n this.upload(event.dataTransfer.files);\n\n this.composerElement.classList.remove('fof-upload-dragging');\n }\n}\n","export default class PasteClipboard {\n constructor(upload, element) {\n this.upload = upload;\n\n // We don't need to remove the events listeners, because they'll get removed when the DOM does.\n element.addEventListener('paste', this.paste.bind(this));\n }\n\n paste(e) {\n if (e.clipboardData && e.clipboardData.items) {\n const items = e.clipboardData.items;\n\n const files = [];\n\n for (let i = 0; i < items.length; i++) {\n if (items[i].type.indexOf('image') !== -1) {\n files.push(items[i].getAsFile());\n }\n }\n\n if (files.length > 0) {\n e.preventDefault();\n\n this.upload(files);\n }\n }\n }\n}\n","import app from 'flarum/forum/app';\n\nexport default class Uploader {\n constructor() {\n this.callbacks = {\n success: [],\n failure: [],\n uploading: [],\n uploaded: [],\n };\n this.uploading = false;\n }\n\n setState(fileState) {\n this.fileState = fileState;\n }\n\n on(type, callback) {\n this.callbacks[type].push(callback);\n }\n\n dispatch(type, response) {\n this.callbacks[type].forEach((callback) => callback(response));\n }\n\n upload(files, addBBcode = true) {\n this.uploading = true;\n this.dispatch('uploading', files);\n\n m.redraw(); // Forcing a redraw so that the button also updates if uploadFiles() is called from DragAndDrop or PasteClipboard\n\n const body = new FormData();\n\n for (let i = 0; i < files.length; i++) {\n body.append('files[]', files[i]);\n }\n\n // send a POST request to the api\n return app\n .request({\n method: 'POST',\n url: app.forum.attribute('apiUrl') + '/fof/upload',\n // prevent JSON.stringify'ing the form data in the XHR call\n serialize: (raw) => raw,\n body,\n })\n .then((result) => this.uploaded(result, addBBcode))\n .catch((error) => {\n this.uploading = false;\n m.redraw();\n\n const e = error.response.errors[0];\n\n if (!e.code.includes('fof-upload')) {\n throw error;\n }\n\n app.alerts.clear();\n app.alerts.show(\n {\n type: 'error',\n },\n e.detail\n );\n });\n }\n\n uploaded(result, addBBcode = false) {\n this.uploading = false;\n\n result.data.forEach((file) => {\n const fileObj = app.store.pushObject(file);\n\n // Add file to media manager\n this.fileState?.addToList(fileObj);\n\n // Dispatch\n this.dispatch('success', {\n file: fileObj,\n addBBcode,\n });\n });\n\n this.dispatch('uploaded');\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Modal'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/app'];","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n\nexport default function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}","const mimeToIconMap = new Map([\n // Image formats\n ['image/png', 'far fa-file-image'],\n ['image/jpg', 'far fa-file-image'],\n ['image/jpeg', 'far fa-file-image'],\n ['image/svg+xml', 'far fa-file-image'],\n ['image/gif', 'far fa-file-image'],\n ['image/bmp', 'far fa-file-image'],\n ['image/webp', 'far fa-file-image'],\n\n // Compressed file formats\n ['application/zip', 'far fa-file-archive'],\n ['application/x-7z-compressed', 'far fa-file-archive'],\n ['application/gzip', 'far fa-file-archive'],\n ['application/vnd.rar', 'far fa-file-archive'],\n ['application/x-rar-compressed', 'far fa-file-archive'],\n ['application/x-tar', 'far fa-file-archive'],\n ['application/x-iso9660-image', 'far fa-file-archive'],\n\n // Text and code file formats\n ['text/plain', 'far fa-file-alt'],\n ['text/csv', 'far fa-file-csv'],\n ['text/xml', 'far fa-file-code'],\n ['text/html', 'far fa-file-code'],\n ['text/css', 'far fa-file-code'],\n ['text/javascript', 'far fa-file-code'],\n ['application/json', 'far fa-file-code'],\n ['application/ld+json', 'far fa-file-code'],\n ['application/x-httpd-php', 'far fa-file-code'],\n ['application/xml', 'far fa-file-code'],\n ['text/xml', 'far fa-file-code'],\n\n // Document formats\n ['application/x-abiword', 'far fa-file-word'],\n ['application/msword', 'far fa-file-word'],\n ['application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'far fa-file-word'],\n ['application/vnd.oasis.opendocument.text', 'far fa-file-word'],\n ['application/vnd.ms-excel', 'far fa-file-excel'],\n ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'far fa-file-excel'],\n ['application/vnd.oasis.opendocument.spreadsheet', 'far fa-file-excel'],\n ['application/vnd.ms-powerpoint', 'far fa-file-powerpoint'],\n ['application/vnd.openxmlformats-officedocument.presentationml.presentation', 'far fa-file-powerpoint'],\n ['application/vnd.oasis.opendocument.presentation', 'far fa-file-powerpoint'],\n ['application/pdf', 'far fa-file-pdf'],\n ['application/rtf', 'far fa-file-alt'],\n\n // eBook formats\n ['application/epub+zip', 'far fa-book'],\n ['application/x-mobipocket-ebook', 'far fa-book'],\n ['application/vnd.amazon.ebook', 'far fa-book'],\n\n // Audio formats\n ['audio/mpeg', 'far fa-file-audio'],\n ['audio/wav', 'far fa-file-audio'],\n ['audio/x-wav', 'far fa-file-audio'],\n ['audio/aac', 'far fa-file-audio'],\n ['audio/ogg', 'far fa-file-audio'],\n ['audio/flac', 'far fa-file-audio'],\n ['audio/aiff', 'far fa-file-audio'],\n ['audio/x-aiff', 'far fa-file-audio'],\n\n // Video formats\n ['video/x-msvideo', 'far fa-file-video'],\n ['video/mp4', 'far fa-file-video'],\n ['video/quicktime', 'far fa-file-video'],\n]);\n\nexport default function mimeToIcon(fileType: string): string {\n // Directly return the icon if the fileType is in the map\n return (\n mimeToIconMap.get(fileType) ||\n (function () {\n // Check for generic types\n if (fileType.startsWith('image/')) {\n return 'far fa-file-image';\n } else if (fileType.startsWith('video/')) {\n return 'far fa-file-video';\n } else if (fileType.startsWith('audio/')) {\n return 'far fa-file-audio';\n }\n\n // Default icon\n return 'far fa-file';\n })()\n );\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/icon'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/ItemList'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Tooltip'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/extractText'];","import app from 'flarum/common/app';\nimport Component, { ComponentAttrs } from 'flarum/common/Component';\nimport File from '../models/File';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\nimport Button from 'flarum/common/components/Button';\nimport icon from 'flarum/common/helpers/icon';\nimport mimeToIcon from '../mimeToIcon';\nimport User from 'flarum/common/models/User';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport type Mithril from 'mithril';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport extractText from 'flarum/common/utils/extractText';\n\ninterface CustomAttrs extends ComponentAttrs {\n file: File;\n fileSelectable: boolean;\n isSelected: boolean;\n fileClassNames: string;\n isFileHiding: boolean;\n onHide: (file: File) => void | undefined;\n onFileClick: (file: File) => void | undefined;\n onDelete: (file: File) => void | undefined;\n user: User;\n}\n\nexport default class DisplayFile extends Component {\n isFileHiding!: boolean;\n imageLoaded: boolean = true;\n file!: File;\n fileIcon!: string;\n isSelected!: boolean;\n isSelectable!: boolean;\n\n oninit(vnode: Mithril.Vnode) {\n super.oninit(vnode);\n\n this.file = this.attrs.file;\n this.isFileHiding = this.attrs.isFileHiding === undefined ? false : this.attrs.isFileHiding;\n this.fileIcon = mimeToIcon(this.file.type());\n this.isSelected = this.attrs.isSelected === undefined ? false : this.attrs.isSelected;\n this.isSelectable = this.attrs.fileSelectable === undefined ? true : this.attrs.fileSelectable;\n }\n\n onbeforeupdate(vnode: Mithril.VnodeDOM): void {\n super.onbeforeupdate(vnode);\n\n // Make sure the isSelected property is updated\n this.isSelected = this.attrs.isSelected === undefined ? false : this.attrs.isSelected;\n }\n\n view() {\n const isImage = this.file.type().startsWith('image/');\n\n const fileSelectedClass = this.isSelected ? 'selected' : '';\n\n return (\n {\n if (this.isSelectable && !this.isFileHiding) {\n this.isSelected = !this.isSelected;\n this.attrs.onFileClick(this.file);\n }\n }}\n disabled={!this.isSelectable || this.isFileHiding}\n >\n {this.imageLoaded && isImage ? (\n \n ) : (\n this.displayIcon(this.fileIcon)\n )}\n\n
{this.actionItems(this.file).toArray()}
\n\n
\n \n {this.file.baseName()}\n \n
\n\n {this.isFileHiding && (\n
\n \n
\n )}\n \n );\n }\n\n displayIcon(fileIcon: string): Mithril.Children {\n return (\n \n {icon(`fa-fw ${fileIcon}`)}\n \n );\n }\n\n actionItems(file: File): ItemList {\n const items = new ItemList();\n\n file.canViewInfo() &&\n items.add(\n 'view-info',\n \n \n )}\n \n \n );\n }\n\n onDelete(file: File) {\n if (this.attrs.onDelete) {\n this.attrs.onDelete(file);\n }\n }\n\n // Common methods like onFileClick, isSelectable, hideFile...\n\n onFileClick(file: File) {\n // Custom functionality\n if (this.attrs.onFileSelect) {\n this.attrs.onFileSelect(file);\n return;\n }\n\n // Download on click\n if (this.attrs.downloadOnClick) {\n window.open(file.url());\n return;\n }\n }\n\n isSelectable(file: File) {\n const fileType = file.type();\n\n // Custom defined file types\n if (Array.isArray(this.restrictFileType)) {\n return this.restrictFileType.indexOf(fileType) >= 0;\n }\n\n // Image\n else if (this.restrictFileType === 'image') {\n return fileType.includes('image/');\n }\n\n // Audio\n else if (this.restrictFileType === 'audio') {\n return fileType.includes('audio/');\n }\n\n // Video\n else if (this.restrictFileType === 'video') {\n return fileType.includes('video/');\n }\n\n return false;\n }\n\n /**\n * Begins the hiding process for a file.\n *\n * - Shows a native confirmation dialog\n * - If confirmed, sends AJAX request to the hide file API\n */\n async hideFile(file: File) {\n const uuid = file.uuid();\n\n if (this.filesBeingHidden.includes(uuid)) return;\n\n this.filesBeingHidden.push(uuid);\n\n const transPrefix = file.isShared() ? 'fof-upload.lib.file_list.hide_shared_file' : 'fof-upload.lib.file_list.hide_file';\n\n const confirmToggleHide = confirm(\n extractText(\n app.translator.trans(file.hidden() ? `${transPrefix}.show_confirmation` : `${transPrefix}.hide_confirmation`, {\n fileName: file.baseName(),\n })\n )\n );\n\n if (confirmToggleHide) {\n try {\n const filePayload = await app.request({\n method: 'PATCH',\n url: `${app.forum.attribute('apiUrl')}/fof/upload/hide`,\n body: { uuid },\n });\n\n app.store.pushPayload(filePayload);\n m.redraw();\n\n app.alerts.show(Alert, { type: 'success' }, [\n icon(file.hidden() ? 'fas fa-eye-slash' : 'fas fa-eye'),\n ' ',\n app.translator.trans(file?.hidden() ? `${transPrefix}.hide_success` : `${transPrefix}.show_success`),\n ]);\n\n if (this.fileState.user) {\n const index = this.fileState.files.findIndex((file: File) => uuid === file.uuid());\n this.fileState.files.splice(index, 1);\n }\n } catch (error) {\n app.alerts.show(\n Alert,\n { type: 'error' },\n app.translator.trans(file?.hidden() ? `${transPrefix}.hide_fail` : `${transPrefix}.show_fail`, {\n fileName: file.baseName(),\n })\n );\n } finally {\n // Remove file from hiding list\n const i = this.filesBeingHidden.indexOf(uuid);\n this.filesBeingHidden.splice(i, 1);\n }\n }\n }\n}\n","import app from 'flarum/common/app';\nimport File from '../models/File';\nimport AbstractFileList from './AbstractFIleList';\nimport FileListState from '../states/FileListState';\n\nexport default class UserFileList extends AbstractFileList {\n public loadFileList(): void {\n //app.fileListState.setUser(this.attrs.user || app.session.user);\n this.fileState.setUser(this.attrs.user || app.session.user);\n /**\n * The user who's media we are dealing with\n */\n this.user = this.fileState.user; //app.fileListState.user;\n }\n\n hasMoreResults(): boolean {\n return this.fileState.hasMoreResults();\n }\n\n loadMore(): void {\n this.fileState.loadMore();\n }\n\n isLoading(): boolean {\n return this.fileState.isLoading();\n }\n\n fileCollection(): File[] {\n return this.fileState.files;\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Switch'];","import app from 'flarum/common/app';\nimport Modal, { IInternalModalAttrs } from 'flarum/common/components/Modal';\nimport Switch from 'flarum/common/components/Switch';\nimport mimeToIcon from '../mimeToIcon';\nimport Button from 'flarum/common/components/Button';\nimport type Mithril from 'mithril';\nimport { ApiResponsePlural } from 'flarum/common/Store';\nimport File from '../models/File';\n\ninterface CustomAttrs extends IInternalModalAttrs {\n onUploadComplete: (files: File | File[]) => void;\n}\n\nexport default class UploadSharedFileModal extends Modal {\n files = [];\n fileInput = null;\n options = {\n shared: true,\n hidden: false,\n };\n loading: boolean = false;\n\n oninit(vnode: Mithril.Vnode) {\n super.oninit(vnode);\n }\n\n className() {\n return 'UploadSharedFileModal Modal--medium';\n }\n\n title() {\n return app.translator.trans('fof-upload.lib.upload-shared-file-modal.title');\n }\n\n onFileChange(e) {\n this.addFiles(Array.from(e.target.files));\n }\n\n addFiles(newFiles: File[]) {\n (this.files as File[]).push(...newFiles);\n m.redraw();\n }\n\n onDragOver(e) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n onDrop(e) {\n e.preventDefault();\n e.stopPropagation();\n if (e.dataTransfer && e.dataTransfer.files) {\n this.addFiles(Array.from(e.dataTransfer.files));\n }\n }\n\n onDropzoneClick() {\n if (this.fileInput) {\n this.fileInput.click();\n }\n }\n\n content() {\n return (\n
\n this.onDropzoneClick()}\n ondragover={this.onDragOver.bind(this)}\n ondrop={this.onDrop.bind(this)}\n >\n {app.translator.trans('fof-upload.lib.upload-shared-file-modal.dropzone')}\n {\n this.fileInput = vnode.dom;\n }}\n />\n
\n
\n {this.files.map((file: File) => {\n const isImage = file.type.startsWith('image/');\n return (\n
\n {isImage ? {file.name} : }\n
{file.name}
\n {/* Remove button */}\n {\n this.files = this.files.filter((f) => f !== file);\n }}\n />\n
\n );\n })}\n
\n
\n (this.options.hidden = value)}>\n {app.translator.trans('fof-upload.lib.upload-shared-file-modal.hide-from-media-gallery')}\n \n
\n
\n \n {app.translator.trans('fof-upload.lib.upload-shared-file-modal.upload')}\n \n
\n \n );\n }\n\n async upload() {\n this.loading = true;\n m.redraw();\n\n const formData = new FormData();\n\n // Append each file to the form data\n this.files.forEach((file) => {\n formData.append('files[]', file);\n });\n\n Object.keys(this.options).forEach((key) => {\n formData.append(`options[${key}]`, this.options[key]);\n });\n\n const results = await app.request>({\n method: 'POST',\n url: app.forum.attribute('apiUrl') + '/fof/upload',\n serialize: (raw: FormData) => raw, // Prevent mithril from trying to serialize FormData\n body: formData,\n });\n\n const uploadedFiles = app.store.pushPayload(results);\n\n this.attrs.onUploadComplete(uploadedFiles);\n this.files = [];\n this.hide();\n\n this.loading = false;\n m.redraw();\n }\n}\n","import app from 'flarum/common/app';\nimport File from '../models/File';\nimport AbstractFileList from './AbstractFIleList';\n\nexport default class SharedFileList extends AbstractFileList {\n public loadFileList(): void {\n this.fileState.loadResults();\n }\n\n hasMoreResults() {\n return this.fileState.hasMoreResults();\n }\n\n loadMore() {\n this.fileState.loadMore();\n }\n\n isLoading(): boolean {\n return this.fileState.isLoading();\n }\n\n fileCollection(): File[] {\n return this.fileState.files;\n }\n}\n","import app from 'flarum/common/app';\nimport User from 'flarum/common/models/User';\nimport File from '../models/File';\nimport { ApiQueryParamsPlural, ApiResponsePlural } from 'flarum/common/Store';\n\nexport default class FileListState {\n public user: User | null;\n public files: File[];\n private moreResults: boolean;\n private loading: boolean;\n private sharedFiles: boolean;\n\n constructor(sharedFiles: boolean = false) {\n this.user = null;\n this.files = [];\n this.moreResults = false;\n this.loading = false;\n this.sharedFiles = sharedFiles;\n }\n\n /**\n * Set the user and load their file list.\n * @param user The user whose files to load.\n */\n public setUser(user: User): void {\n if (user === this.user) return;\n\n this.user = user;\n this.files = [];\n this.loadResults();\n }\n\n public refresh(): void {\n this.files = [];\n this.loadResults();\n m.redraw();\n }\n\n /**\n * Load more files for the current user, starting from the given offset.\n * @param offset The starting index for loading more files.\n * @returns A promise resolving to the loaded files.\n */\n public async loadResults(offset: number = 0): Promise> {\n if (!this.sharedFiles && !this.user) return Promise.reject('User not set');\n\n this.loading = true;\n\n let route: string = 'fof/uploads';\n let params: ApiQueryParamsPlural = {};\n\n if (!this.sharedFiles && this.user) {\n params = {\n filter: { user: this.user.id() },\n page: { offset },\n } as ApiQueryParamsPlural;\n } else {\n route = 'fof/upload/shared-files';\n params = {\n page: { offset },\n } as ApiQueryParamsPlural;\n }\n\n const results = await app.store.find(route, params);\n\n return this.parseResults(results);\n }\n\n /**\n * Load the next set of results.\n */\n public async loadMore(): Promise> {\n this.loading = true;\n return this.loadResults(this.files.length);\n }\n\n private parseResults(results: ApiResponsePlural): ApiResponsePlural {\n this.files = results;\n this.loading = false;\n this.moreResults = !!results.payload?.links?.next;\n m.redraw();\n return results;\n }\n\n /**\n * Add files to the beginning of the list.\n * @param files The files to be added.\n */\n public addToList(files: File | File[]): void {\n if (Array.isArray(files)) {\n this.files.unshift(...files);\n } else {\n this.files.unshift(files);\n }\n m.redraw();\n }\n\n /**\n * Remove files from the list.\n * @param files The files to be removed.\n */\n public removeFromList(files: File | File[]): void {\n if (Array.isArray(files)) {\n this.files = this.files.filter((file) => !files.includes(file));\n } else {\n this.files = this.files.filter((file) => file !== files);\n }\n\n m.redraw();\n }\n\n /**\n * Check if there are files in the list.\n * @returns True if there are files, false otherwise.\n */\n public hasFiles(): boolean {\n return this.files.length > 0;\n }\n\n /**\n * Check if the file list is currently loading.\n * @returns True if loading, false otherwise.\n */\n public isLoading(): boolean {\n return this.loading;\n }\n\n /**\n * Check if there are more files to load.\n * @returns True if there are more files, false otherwise.\n */\n public hasMoreResults(): boolean {\n return this.moreResults;\n }\n\n /**\n * Check if the user has no files and the list is not loading.\n * @returns True if the list is empty and not loading, false otherwise.\n */\n public empty(): boolean {\n return !this.hasFiles() && !this.isLoading();\n }\n}\n","import app from 'flarum/forum/app';\nimport Modal from 'flarum/common/components/Modal';\nimport Button from 'flarum/common/components/Button';\nimport UploadButton from './UploadButton';\nimport UserFileList from '../../common/components/UserFileList';\nimport DragAndDrop from './DragAndDrop';\nimport UploadSharedFileModal from '../../common/components/UploadSharedFileModal';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport SharedFileList from '../../common/components/SharedFileList';\nimport FileListState from '../../common/states/FileListState';\n\nexport default class FileManagerModal extends Modal {\n oninit(vnode) {\n super.oninit(vnode);\n\n // Initialize upload managers\n this.uploader = vnode.attrs.uploader;\n\n // Current selected files\n this.selectedFiles = [];\n\n // Allow multiselect\n this.multiSelect = vnode.attrs.multiSelect === undefined ? true : vnode.attrs.multiSelect;\n\n // Restrict file selection to specific types\n this.restrictFileType = vnode.attrs.restrictFileType || null;\n\n // Drag & drop\n this.dragDrop = null;\n\n this.selectedFilesLibrary = vnode.attrs.defaultFilesLibrary || 'user';\n\n this.sharedUploads = null;\n\n this.userFileState = new FileListState();\n this.sharedFileState = new FileListState(true);\n\n this.uploader.setState(this.userFileState);\n\n // Initialize uploads\n this.onUpload();\n }\n\n className() {\n return 'Modal--large fof-file-manager-modal';\n }\n\n /**\n * Initialize drag & drop\n */\n oncreate(vnode) {\n super.oncreate(vnode);\n\n this.dragDrop = new DragAndDrop((files) => this.uploader.upload(files, false), this.$().find('.Modal-content')[0]);\n }\n\n /**\n * Remove events from modal content\n */\n onremove() {\n if (this.dragDrop) {\n this.dragDrop.unload();\n }\n }\n\n view() {\n const fileCount = this.selectedFiles.length;\n const { hideUser, hideShared } = this.attrs;\n\n return (\n
\n
\n
\n {!hideUser && this.selectedFilesLibrary === 'user' && (\n \n )}\n {app.session.user && app.session.user.uploadSharedFiles() && !hideShared && this.selectedFilesLibrary === 'shared' && (\n {\n this.showUploadModal();\n }}\n >\n {app.translator.trans('fof-upload.forum.buttons.upload')}\n \n )}\n
\n\n
\n
\n \n\n {app.translator.trans('fof-upload.lib.file_list.release_to_upload')}\n
\n
\n\n
\n

{app.translator.trans('fof-upload.forum.media_manager')}

\n {app.session.user?.accessSharedFiles() && !hideUser && !hideShared && (\n
{this.fileLibraryButtonItems().toArray()}
\n )}\n
\n\n {this.alertAttrs && (\n
\n \n
\n )}\n\n
\n {this.selectedFilesLibrary === 'user' && this.userFilesContent()}\n {this.selectedFilesLibrary === 'shared' && this.sharedFilesContent()}\n
\n\n
\n \n\n 1)}\n className=\"Button Button--primary\"\n >\n {app.translator.trans('fof-upload.lib.file_list.confirm_selection_btn', { fileCount })}\n \n
\n
\n
\n );\n }\n\n fileLibraryButtonItems() {\n const items = new ItemList();\n\n items.add(\n 'user',\n \n );\n\n items.add(\n 'shared',\n \n );\n\n return items;\n }\n\n setLibrary(library) {\n this.selectedFilesLibrary = library;\n m.redraw();\n }\n\n userFilesContent() {\n return (\n \n );\n }\n\n sharedFilesContent() {\n return (\n \n );\n }\n\n /**\n * Add or remove file from selected files\n *\n * @param {File} file\n */\n onFileSelect(file) {\n const itemPosition = this.selectedFiles.indexOf(file.id());\n\n if (itemPosition >= 0) {\n this.selectedFiles.splice(itemPosition, 1);\n } else {\n if (this.multiSelect) {\n this.selectedFiles.push(file.id());\n } else {\n this.selectedFiles = [file.id()];\n }\n }\n }\n\n /**\n * Add files to file list after upload\n */\n onUpload() {\n this.uploader.on('success', ({ file }) => {\n if (this.multiSelect) {\n this.selectedFiles.push(file.id());\n } else {\n this.selectedFiles = [file.id()];\n }\n });\n }\n\n /**\n * Add selected files to the composer\n */\n onSelect() {\n this.hide();\n\n // Custom callback\n if (this.attrs.onSelect) {\n this.attrs.onSelect(this.selectedFiles);\n\n return;\n }\n\n // Add selected files to composer\n this.selectedFiles.map((fileId) => {\n const file = app.store.getById('files', fileId) || app.store.getById('shared-files', fileId);\n\n app.composer.editor.insertAtCursor(file.bbcode() + '\\n', false);\n });\n }\n\n showUploadModal() {\n app.modal.show(\n UploadSharedFileModal,\n {\n onUploadComplete: (files) => {\n this.sharedFileState.addToList(files);\n },\n },\n true\n );\n }\n\n onDelete(file) {\n this.sharedFileState.removeFromList(file);\n this.userFileState.removeFromList(file);\n }\n}\n","import app from 'flarum/forum/app';\nimport Component, { ComponentAttrs } from 'flarum/common/Component';\nimport Button from 'flarum/common/components/Button';\nimport FileManagerModal from './FileManagerModal';\nimport Tooltip from 'flarum/common/components/Tooltip';\n\ninterface FileManagerButtonAttrs extends ComponentAttrs {\n uploader: any;\n}\n\nexport default class FileManagerButton extends Component {\n view() {\n return (\n \n {Button.component({\n className: 'Button fof-upload-button Button--icon',\n onclick: this.fileManagerButtonClicked.bind(this),\n icon: 'fas fa-photo-video',\n })}\n \n );\n }\n\n /**\n * Event handler for upload button being clicked\n */\n fileManagerButtonClicked(e: PointerEvent) {\n e.preventDefault();\n\n // Open dialog\n app.modal.show(FileManagerModal, {\n uploader: this.attrs.uploader,\n });\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/UserPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/LinkButton'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extenders'];","import Model from 'flarum/common/Model';\n\nexport default class File extends Model {\n baseName() {\n return Model.attribute('baseName').call(this);\n }\n\n path() {\n return Model.attribute('path').call(this);\n }\n\n url() {\n return Model.attribute('url').call(this);\n }\n\n size() {\n return Model.attribute('size').call(this);\n }\n\n type() {\n return Model.attribute('type').call(this);\n }\n\n humanSize() {\n return Model.attribute('humanSize').call(this);\n }\n\n createdAt() {\n return Model.attribute('createdAt', Model.transformDate).call(this);\n }\n\n uuid() {\n return Model.attribute('uuid').call(this);\n }\n\n tag() {\n return Model.attribute('tag').call(this);\n }\n\n hidden() {\n return Model.attribute('hidden').call(this);\n }\n\n bbcode() {\n return Model.attribute('bbcode').call(this);\n }\n\n isShared() {\n return Model.attribute('shared').call(this);\n }\n\n isPrivateShared() {\n return Model.attribute('isPrivateShared').call(this);\n }\n\n canViewInfo() {\n return Model.attribute('canViewInfo').call(this);\n }\n\n canHide() {\n return Model.attribute('canHide').call(this);\n }\n\n canDelete() {\n return Model.attribute('canDelete').call(this);\n }\n\n apiEndpoint() {\n return '/fof/uploads' + (this.exists ? '/' + this.id() : '');\n }\n}\n","import Extend from 'flarum/common/extenders';\nimport File from './models/File';\n\nexport default [\n new Extend.Store() //\n .add('files', File)\n .add('shared-files', File),\n];\n","import app from 'flarum/forum/app';\nimport UserPage from 'flarum/forum/components/UserPage';\nimport UserFileList from '../../common/components/UserFileList';\nimport type Mithril from 'mithril';\nimport User from 'flarum/common/models/User';\nimport FileListState from '../../common/states/FileListState';\n\nexport default class UploadsUserPage extends UserPage {\n oninit(vnode: Mithril.Vnode) {\n super.oninit(vnode);\n\n this.user = null;\n\n this.loadUser(m.route.param('username'));\n }\n\n content() {\n const fileState = new FileListState();\n if (app.session.user && (app.session.user.viewOthersMediaLibrary() || this.user === app.session.user)) {\n return (\n this.user &&\n UserFileList.component({\n user: this.user,\n selectable: false,\n downloadOnClick: true,\n fileState,\n })\n );\n } else {\n return null;\n }\n }\n\n show(user: User) {\n super.show(user);\n this.user = user;\n }\n}\n","import User from 'flarum/common/models/User';\nimport { default as extend } from '../common/extend';\nimport Extend from 'flarum/common/extenders';\nimport UploadsUserPage from './components/UploadsUserPage';\n\nexport default [\n ...extend,\n\n // Not using the new extender yet, thinking about if to change the serialized names,\n // or the js property names, as we can't change the key->attribute name via the extender,\n // like we used to do with ie `User.prototype.viewOthersMediaLibrary = Model.attribute('fof-upload-viewOthersMediaLibrary');`\n // new Extend.Model(User) //\n // .attribute('fof-upload-viewOthersMediaLibrary')\n // .attribute('fof-upload-deleteOthersMediaLibrary')\n // .attribute('fof-upload-uploadCountCurrent')\n // .attribute('fof-upload-uploadCountAll'),\n\n new Extend.Routes() //\n .add('user.uploads', '/u/:username/uploads', UploadsUserPage),\n];\n","export default function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}","import Component, { ComponentAttrs } from 'flarum/common/Component';\nimport Button from 'flarum/common/components/Button';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport type Mithril from 'mithril';\nimport mimeToIcon from '../mimeToIcon';\nimport File from '../models/File';\nimport icon from 'flarum/common/helpers/icon';\nimport app from 'flarum/common/app';\nimport classList from 'flarum/common/utils/classList';\n\ninterface CustomAttrs extends ComponentAttrs {\n file: File;\n selectable: boolean;\n fileClassNames: string;\n onDelete: (file: File) => void | undefined;\n onFileSelect: (file: File) => void | undefined;\n}\n\nexport default class UploadedFile extends Component {\n file!: File;\n callback!: () => void | undefined;\n imageLoaded: boolean = true;\n\n oninit(vnode: Mithril.Vnode) {\n super.oninit(vnode);\n\n this.file = this.attrs.file;\n }\n\n view() {\n const isImage = this.file.type().startsWith('image/');\n const fileIcon = mimeToIcon(this.file.type());\n const errorIcon = 'fas fa-exclamation-triangle';\n const statusIcon = this.file.isPrivateShared() ? 'fas fa-lock' : 'fas fa-unlock';\n\n return (\n
\n
\n \n {icon(statusIcon)}\n {this.file.baseName()}\n \n
\n
this.onFileClick(this.file)}>\n {isImage ? (\n this.imageLoaded ? (\n \n ) : (\n icon(errorIcon, { className: 'icon-fallback' }) // Error icon for failed image load\n )\n ) : (\n icon(fileIcon, { className: 'icon-fallback' }) // Icon representing the file type\n )}\n
\n
{this.actionItems().toArray()}
\n
\n );\n }\n\n actionItems(): ItemList {\n const items = new ItemList();\n\n items.add(\n 'view-info',\n