diff --git a/js/dist/admin.js b/js/dist/admin.js index 21da7a7c..1d42c860 100644 --- a/js/dist/admin.js +++ b/js/dist/admin.js @@ -1,2 +1,2 @@ -(()=>{var t={n:e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return t.d(a,{a}),a},d:(e,a)=>{for(var n in a)t.o(a,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:a[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};(()=>{"use strict";t.r(e),t.d(e,{components:()=>q});const a=flarum.core.compat["admin/app"];var n=t.n(a);function o(t,e){return o=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},o(t,e)}function i(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,o(t,e)}const s=flarum.core.compat["common/components/Button"];var l=t.n(s);const r=flarum.core.compat["admin/utils/saveSettings"];var p=t.n(r);const d=flarum.core.compat["common/components/Alert"];var u=t.n(d);const f=flarum.core.compat["common/components/Select"];var c=t.n(f);const h=flarum.core.compat["common/components/Switch"];var v=t.n(h);const b=flarum.core.compat["admin/components/UploadImageButton"];var g=t.n(b);const y=flarum.core.compat["common/utils/withAttr"];var w=t.n(y);const _=flarum.core.compat["common/utils/Stream"];var x=t.n(_);const T=flarum.core.compat["admin/components/ExtensionPage"];var M=t.n(T);const S=flarum.core.compat["common/utils/ItemList"];var P=t.n(S);const k=flarum.core.compat["common/components/Modal"];var O=t.n(k);const C=flarum.core.compat["common/components/LoadingIndicator"];var F=t.n(C),B=function(t){function e(){return t.apply(this,arguments)||this}i(e,t);var a=e.prototype;return a.oninit=function(e){t.prototype.oninit.call(this,e),this.uploading=!1,this.inspection={}},a.className=function(){return"Modal--small fof-upload-inspect-mime-modal"},a.title=function(){return n().translator.trans("fof-upload.admin.inspect-mime.title")},a.content=function(){return m("div",{className:"Modal-body"},m("p",null,n().translator.trans("fof-upload.admin.inspect-mime.description",{a:m("a",{href:"https://github.com/SoftCreatR/php-mime-detector"})})),m("p",null,n().translator.trans("fof-upload.admin.inspect-mime.select")),m("div",null,m("input",{type:"file",onchange:this.onupload.bind(this),disabled:this.uploading}),this.uploading?F().component():null),m("dl",null,m("dt",null,n().translator.trans("fof-upload.admin.inspect-mime.laravel-validation")),m("dd",null,void 0===this.inspection.laravel_validation?m("em",null,n().translator.trans("fof-upload.admin.inspect-mime.no-file-selected")):this.inspection.laravel_validation?n().translator.trans("fof-upload.admin.inspect-mime.validation-passed"):n().translator.trans("fof-upload.admin.inspect-mime.validation-failed",{error:this.inspection.laravel_validation_error||"?"}))),m("dl",null,m("dt",null,n().translator.trans("fof-upload.admin.inspect-mime.mime-detector")),m("dd",null,this.inspection.mime_detector?m("code",null,this.inspection.mime_detector):m("em",null,n().translator.trans("fof-upload.admin.inspect-mime.not-available")))),m("dl",null,m("dt",null,n().translator.trans("fof-upload.admin.inspect-mime.mime-fileinfo")),m("dd",null,this.inspection.php_mime?m("code",null,this.inspection.php_mime):m("em",null,n().translator.trans("fof-upload.admin.inspect-mime.not-available")))),m("dl",null,m("dt",null,n().translator.trans("fof-upload.admin.inspect-mime.guessed-extension")),m("dd",null,this.inspection.guessed_extension?m("code",null,this.inspection.guessed_extension):m("em",null,n().translator.trans("fof-upload.admin.inspect-mime.not-available")))))},a.onupload=function(t){for(var e=this,a=new FormData,o=0;o{var t={n:e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return t.d(a,{a}),a},d:(e,a)=>{for(var n in a)t.o(a,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:a[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};(()=>{"use strict";t.r(e),t.d(e,{components:()=>j});const a=flarum.core.compat["admin/app"];var n=t.n(a);function o(t,e){return o=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},o(t,e)}function s(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,o(t,e)}const i=flarum.core.compat["common/components/Button"];var l=t.n(i);const r=flarum.core.compat["admin/utils/saveSettings"];var p=t.n(r);const u=flarum.core.compat["common/components/Alert"];var d=t.n(u);const c=flarum.core.compat["common/components/Select"];var f=t.n(c);const h=flarum.core.compat["common/components/Switch"];var v=t.n(h);const b=flarum.core.compat["admin/components/UploadImageButton"];var g=t.n(b);const y=flarum.core.compat["common/utils/withAttr"];var w=t.n(y);const x=flarum.core.compat["common/utils/Stream"];var _=t.n(x);const T=flarum.core.compat["admin/components/ExtensionPage"];var M=t.n(T);const S=flarum.core.compat["common/utils/ItemList"];var k=t.n(S);const P=flarum.core.compat["common/components/Modal"];var O=t.n(P);const C=flarum.core.compat["common/components/LoadingIndicator"];var F=t.n(C),B=function(t){function e(){return t.apply(this,arguments)||this}s(e,t);var a=e.prototype;return a.oninit=function(e){t.prototype.oninit.call(this,e),this.uploading=!1,this.inspection={}},a.className=function(){return"Modal--small fof-upload-inspect-mime-modal"},a.title=function(){return n().translator.trans("fof-upload.admin.inspect-mime.title")},a.content=function(){return m("div",{className:"Modal-body"},m("p",null,n().translator.trans("fof-upload.admin.inspect-mime.description",{a:m("a",{href:"https://github.com/SoftCreatR/php-mime-detector"})})),m("p",null,n().translator.trans("fof-upload.admin.inspect-mime.select")),m("div",null,m("input",{type:"file",onchange:this.onupload.bind(this),disabled:this.uploading}),this.uploading?F().component():null),m("dl",null,m("dt",null,n().translator.trans("fof-upload.admin.inspect-mime.laravel-validation")),m("dd",null,void 0===this.inspection.laravel_validation?m("em",null,n().translator.trans("fof-upload.admin.inspect-mime.no-file-selected")):this.inspection.laravel_validation?n().translator.trans("fof-upload.admin.inspect-mime.validation-passed"):n().translator.trans("fof-upload.admin.inspect-mime.validation-failed",{error:this.inspection.laravel_validation_error||"?"}))),m("dl",null,m("dt",null,n().translator.trans("fof-upload.admin.inspect-mime.mime-detector")),m("dd",null,this.inspection.mime_detector?m("code",null,this.inspection.mime_detector):m("em",null,n().translator.trans("fof-upload.admin.inspect-mime.not-available")))),m("dl",null,m("dt",null,n().translator.trans("fof-upload.admin.inspect-mime.mime-fileinfo")),m("dd",null,this.inspection.php_mime?m("code",null,this.inspection.php_mime):m("em",null,n().translator.trans("fof-upload.admin.inspect-mime.not-available")))),m("dl",null,m("dt",null,n().translator.trans("fof-upload.admin.inspect-mime.guessed-extension")),m("dd",null,this.inspection.guessed_extension?m("code",null,this.inspection.guessed_extension):m("em",null,n().translator.trans("fof-upload.admin.inspect-mime.not-available")))))},a.onupload=function(t){for(var e=this,a=new FormData,o=0;o {\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['admin/app'];","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/components/Button'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/utils/saveSettings'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Alert'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Select'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Switch'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/components/UploadImageButton'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/withAttr'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/Stream'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/components/ExtensionPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/ItemList'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Modal'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/LoadingIndicator'];","import app from 'flarum/admin/app';\nimport Modal from 'flarum/common/components/Modal';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\n\nexport default class InspectMimeModal extends Modal {\n oninit(vnode) {\n super.oninit(vnode);\n\n this.uploading = false;\n this.inspection = {};\n }\n\n className() {\n return 'Modal--small fof-upload-inspect-mime-modal';\n }\n\n title() {\n return app.translator.trans('fof-upload.admin.inspect-mime.title');\n }\n\n content() {\n return (\n
\n

\n {app.translator.trans('fof-upload.admin.inspect-mime.description', {\n a: ,\n })}\n

\n

{app.translator.trans('fof-upload.admin.inspect-mime.select')}

\n
\n \n {this.uploading ? LoadingIndicator.component() : null}\n
\n
\n
{app.translator.trans('fof-upload.admin.inspect-mime.laravel-validation')}
\n
\n {typeof this.inspection.laravel_validation === 'undefined' ? (\n {app.translator.trans('fof-upload.admin.inspect-mime.no-file-selected')}\n ) : this.inspection.laravel_validation ? (\n app.translator.trans('fof-upload.admin.inspect-mime.validation-passed')\n ) : (\n app.translator.trans('fof-upload.admin.inspect-mime.validation-failed', {\n error: this.inspection.laravel_validation_error || '?',\n })\n )}\n
\n
\n
\n
{app.translator.trans('fof-upload.admin.inspect-mime.mime-detector')}
\n
\n {this.inspection.mime_detector ? (\n {this.inspection.mime_detector}\n ) : (\n {app.translator.trans('fof-upload.admin.inspect-mime.not-available')}\n )}\n
\n
\n
\n
{app.translator.trans('fof-upload.admin.inspect-mime.mime-fileinfo')}
\n
\n {this.inspection.php_mime ? (\n {this.inspection.php_mime}\n ) : (\n {app.translator.trans('fof-upload.admin.inspect-mime.not-available')}\n )}\n
\n
\n
\n
{app.translator.trans('fof-upload.admin.inspect-mime.guessed-extension')}
\n
\n {this.inspection.guessed_extension ? (\n {this.inspection.guessed_extension}\n ) : (\n {app.translator.trans('fof-upload.admin.inspect-mime.not-available')}\n )}\n
\n
\n
\n );\n }\n\n onupload(event) {\n const body = new FormData();\n\n for (let i = 0; i < event.target.files.length; i++) {\n body.append('files[]', event.target.files[i]);\n }\n\n this.uploading = true;\n\n return app\n .request({\n method: 'POST',\n url: app.forum.attribute('apiUrl') + '/fof/upload/inspect-mime',\n serialize: (raw) => raw,\n body,\n })\n .then((result) => {\n this.uploading = false;\n this.inspection = result;\n m.redraw();\n })\n .catch((error) => {\n this.uploading = false;\n this.inspection = {};\n m.redraw();\n\n throw error;\n });\n }\n}\n","import app from 'flarum/admin/app';\nimport Button from 'flarum/common/components/Button';\nimport saveSettings from 'flarum/admin/utils/saveSettings';\nimport Alert from 'flarum/common/components/Alert';\nimport Select from 'flarum/common/components/Select';\nimport Switch from 'flarum/common/components/Switch';\nimport UploadImageButton from 'flarum/admin/components/UploadImageButton';\nimport withAttr from 'flarum/common/utils/withAttr';\nimport Stream from 'flarum/common/utils/Stream';\nimport ExtensionPage from 'flarum/admin/components/ExtensionPage';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport InspectMimeModal from './InspectMimeModal';\n\n/* global m */\n\nexport default class UploadPage extends ExtensionPage {\n oninit(vnode) {\n super.oninit(vnode);\n // whether we are saving the settings or not right now\n this.loading = false;\n\n // the fields we need to watch and to save\n this.fields = [\n // image\n 'resizeMaxWidth',\n 'cdnUrl',\n 'maxFileSize',\n 'whitelistedClientExtensions',\n 'composerButtonVisiblity',\n // watermark\n 'watermark',\n 'watermarkPosition',\n // Imgur\n 'imgurClientId',\n // AWS\n 'awsS3Key',\n 'awsS3Secret',\n 'awsS3Bucket',\n 'awsS3Region',\n 'awsS3Endpoint',\n 'awsS3ACL',\n // QIniu\n 'qiniuKey',\n 'qiniuSecret',\n 'qiniuBucket',\n ];\n\n // the checkboxes we need to watch and to save.\n this.checkboxes = ['mustResize', 'addsWatermarks', 'disableHotlinkProtection', 'disableDownloadLogging', 'awsS3UsePathStyleEndpoint'];\n\n // fields that are objects\n this.objects = ['mimeTypes'];\n\n // watermark positions\n this.watermarkPositions = {\n 'top-left': 'top-left',\n 'top-right': 'top-right',\n 'bottom-left': 'bottom-left',\n 'bottom-right': 'bottom-right',\n center: 'center',\n left: 'left',\n top: 'top',\n right: 'right',\n bottom: 'bottom',\n };\n\n // Composer button options\n this.composerButtonVisiblityOptions = {\n both: app.translator.trans('fof-upload.admin.labels.composer_buttons.options.both'),\n 'upload-btn': app.translator.trans('fof-upload.admin.labels.composer_buttons.options.upload-btn'),\n 'media-btn': app.translator.trans('fof-upload.admin.labels.composer_buttons.options.media-btn'),\n };\n\n // get the saved settings from the database\n const settings = app.data.settings;\n\n // our package prefix (to be added to every field and checkbox in the setting table)\n this.settingsPrefix = 'fof-upload';\n\n // Options for the Upload methods dropdown menu.\n this.uploadMethodOptions = settings[this.addPrefix('availableUploadMethods')] || {};\n // Options for the Template dropdown menu.\n this.templateOptions = settings[this.addPrefix('availableTemplates')] || {};\n // Contains current values.\n this.values = {};\n // bind the values of the fields and checkboxes to the getter/setter functions\n this.fields.forEach((key) => (this.values[key] = Stream(settings[this.addPrefix(key)])));\n this.checkboxes.forEach((key) => (this.values[key] = Stream(settings[this.addPrefix(key)] === '1')));\n this.objects.forEach((key) => (this.values[key] = settings[this.addPrefix(key)] ? Stream(JSON.parse(settings[this.addPrefix(key)])) : Stream()));\n\n // Set a sane default in case no mimeTypes have been configured yet.\n // Since 'local' (or others) can now be disabled, pick the last entry in the object for default\n this.defaultAdap = Object.keys(this.uploadMethodOptions)[Object.keys(this.uploadMethodOptions).length - 1];\n this.values.mimeTypes() ||\n (this.values.mimeTypes = Stream({\n '^image\\\\/.*': {\n adapter: this.defaultAdap,\n template: 'image-preview',\n },\n }));\n\n this.newMimeType = {\n regex: Stream(''),\n adapter: Stream(this.defaultAdap),\n template: Stream('file'),\n };\n }\n\n /**\n * Show the actual ImageUploadPage.\n *\n * @returns {*}\n */\n content() {\n const max_post = app.data.settings[this.addPrefix('php_ini.post_max_size')];\n const max_upload = app.data.settings[this.addPrefix('php_ini.upload_max_filesize')];\n return [\n m('.UploadPage', [\n m('.container', [\n m(\n 'form',\n {\n onsubmit: this.onsubmit.bind(this),\n },\n [\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.preferences.title')),\n m('label', app.translator.trans('fof-upload.admin.labels.preferences.max_file_size')),\n m('input.FormControl', {\n value: this.values.maxFileSize() || 2048,\n oninput: withAttr('value', this.values.maxFileSize),\n type: 'number',\n min: '0',\n }),\n m(\n '.helpText',\n app.translator.trans('fof-upload.admin.labels.preferences.php_ini_values', {\n post: max_post,\n upload: max_upload,\n })\n ),\n m('label', app.translator.trans('fof-upload.admin.labels.preferences.mime_types')),\n m(\n '.MimeTypes--Container',\n Object.keys(this.values.mimeTypes()).map((mime) => {\n let config = this.values.mimeTypes()[mime];\n // Compatibility for older versions.\n if (typeof config !== 'object') {\n config = {\n adapter: config,\n template: 'file',\n };\n }\n\n return m('div', [\n m('input.FormControl.MimeTypes', {\n value: mime,\n oninput: withAttr('value', this.updateMimeTypeKey.bind(this, mime)),\n }),\n Select.component({\n options: this.uploadMethodOptions,\n onchange: this.updateMimeTypeAdapter.bind(this, mime, config),\n value: config.adapter || 'local',\n }),\n Select.component({\n options: this.getTemplateOptionsForInput(),\n onchange: this.updateMimeTypeTemplate.bind(this, mime, config),\n value: config.template || 'local',\n }),\n Button.component(\n {\n type: 'button',\n className: 'Button Button--warning',\n onclick: this.deleteMimeType.bind(this, mime),\n },\n 'x'\n ),\n ]);\n }),\n m('br'),\n m('div', [\n m('input.FormControl.MimeTypes.add-MimeType-key', {\n value: this.newMimeType.regex(),\n oninput: withAttr('value', this.newMimeType.regex),\n }),\n Select.component({\n options: this.uploadMethodOptions,\n className: 'add-MimeType-value',\n oninput: withAttr('value', this.newMimeType.adapter),\n value: this.newMimeType.adapter(),\n }),\n Select.component({\n options: this.getTemplateOptionsForInput(),\n className: 'add-MimeType-value',\n oninput: withAttr('value', this.newMimeType.template),\n value: this.newMimeType.template(),\n }),\n Button.component(\n {\n type: 'button',\n className: 'Button Button--warning',\n onclick: this.addMimeType.bind(this),\n },\n '+'\n ),\n ])\n ),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.mime_types')),\n Button.component(\n {\n className: 'Button',\n onclick() {\n app.modal.show(InspectMimeModal);\n },\n },\n app.translator.trans('fof-upload.admin.labels.inspect-mime')\n ),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.download_templates')),\n this.templateOptionsDescriptions(),\n ]),\n m('fieldset.composerButtons', [\n m('legend', app.translator.trans('fof-upload.admin.labels.composer_buttons.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.composer_buttons')),\n m('div', [\n Select.component({\n options: this.composerButtonVisiblityOptions,\n onchange: this.values.composerButtonVisiblity,\n value: this.values.composerButtonVisiblity() || 'both',\n }),\n ]),\n ]),\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.resize.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.resize')),\n Switch.component(\n {\n state: this.values.mustResize() || false,\n onchange: this.values.mustResize,\n },\n app.translator.trans('fof-upload.admin.labels.resize.toggle')\n ),\n m('label', app.translator.trans('fof-upload.admin.labels.resize.max_width')),\n m('input', {\n className: 'FormControl',\n value: this.values.resizeMaxWidth() || 100,\n oninput: withAttr('value', this.values.resizeMaxWidth),\n disabled: !this.values.mustResize(),\n type: 'number',\n min: '0',\n }),\n ]),\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.client_extension.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.client_extension')),\n m('input', {\n className: 'FormControl',\n value: this.values.whitelistedClientExtensions() || '',\n oninput: withAttr('value', this.values.whitelistedClientExtensions),\n }),\n ]),\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.watermark.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.watermark')),\n Switch.component(\n {\n state: this.values.addsWatermarks() || false,\n onchange: this.values.addsWatermarks,\n },\n app.translator.trans('fof-upload.admin.labels.watermark.toggle')\n ),\n m('label', app.translator.trans('fof-upload.admin.labels.watermark.position')),\n m('div', [\n Select.component({\n options: this.watermarkPositions,\n onchange: this.values.watermarkPosition,\n value: this.values.watermarkPosition() || 'bottom-right',\n }),\n ]),\n m('label', {}, app.translator.trans('fof-upload.admin.labels.watermark.file')),\n UploadImageButton.component({\n name: 'fof/watermark',\n }),\n ]),\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.disable-hotlink-protection.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.disable-hotlink-protection')),\n Switch.component(\n {\n state: this.values.disableHotlinkProtection() || false,\n onchange: this.values.disableHotlinkProtection,\n },\n app.translator.trans('fof-upload.admin.labels.disable-hotlink-protection.toggle')\n ),\n m('legend', app.translator.trans('fof-upload.admin.labels.disable-download-logging.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.disable-download-logging')),\n Switch.component(\n {\n state: this.values.disableDownloadLogging() || false,\n onchange: this.values.disableDownloadLogging,\n },\n app.translator.trans('fof-upload.admin.labels.disable-download-logging.toggle')\n ),\n ]),\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.local.title')),\n m('label', app.translator.trans('fof-upload.admin.labels.local.cdn_url')),\n m('input.FormControl', {\n value: this.values.cdnUrl() || '',\n oninput: withAttr('value', this.values.cdnUrl),\n }),\n ]),\n\n this.adaptorItems().toArray(),\n\n Button.component(\n {\n type: 'submit',\n className: 'Button Button--primary',\n loading: this.loading,\n disabled: !this.changed(),\n },\n app.translator.trans('core.admin.settings.submit_button')\n ),\n ]\n ),\n ]),\n ]),\n ];\n }\n\n adaptorItems() {\n const items = new ItemList();\n\n if (this.uploadMethodOptions['imgur'] !== undefined) {\n items.add(\n 'imgur',\n m('.imgur', [\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.imgur.title')),\n m('label', app.translator.trans('fof-upload.admin.labels.imgur.client_id')),\n m('input.FormControl', {\n value: this.values.imgurClientId() || '',\n oninput: withAttr('value', this.values.imgurClientId),\n }),\n ]),\n ])\n );\n }\n\n if (this.uploadMethodOptions['qiniu'] !== undefined) {\n items.add(\n 'qiniu',\n m('.qiniu', [\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.qiniu.title')),\n m('label', app.translator.trans('fof-upload.admin.labels.qiniu.key')),\n m('input.FormControl', {\n value: this.values.qiniuKey() || '',\n oninput: withAttr('value', this.values.qiniuKey),\n }),\n m('label', {}, app.translator.trans('fof-upload.admin.labels.qiniu.secret')),\n m('input.FormControl', {\n value: this.values.qiniuSecret() || '',\n oninput: withAttr('value', this.values.qiniuSecret),\n }),\n m('label', {}, app.translator.trans('fof-upload.admin.labels.qiniu.bucket')),\n m('input.FormControl', {\n value: this.values.qiniuBucket() || '',\n oninput: withAttr('value', this.values.qiniuBucket),\n }),\n ]),\n ])\n );\n }\n\n if (this.uploadMethodOptions['aws-s3'] !== undefined) {\n items.add(\n 'aws-s3',\n m('.aws', [\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.aws-s3.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.s3_instance_profile')),\n m('label', app.translator.trans('fof-upload.admin.labels.aws-s3.key')),\n m('input.FormControl', {\n value: this.values.awsS3Key() || '',\n oninput: withAttr('value', this.values.awsS3Key),\n }),\n m('label', app.translator.trans('fof-upload.admin.labels.aws-s3.secret')),\n m('input.FormControl', {\n value: this.values.awsS3Secret() || '',\n oninput: withAttr('value', this.values.awsS3Secret),\n }),\n m('label', app.translator.trans('fof-upload.admin.labels.aws-s3.bucket')),\n m('input.FormControl', {\n value: this.values.awsS3Bucket() || '',\n oninput: withAttr('value', this.values.awsS3Bucket),\n }),\n m('label', app.translator.trans('fof-upload.admin.labels.aws-s3.region')),\n m('input.FormControl', {\n value: this.values.awsS3Region() || '',\n oninput: withAttr('value', this.values.awsS3Region),\n }),\n ]),\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.aws-s3.advanced_title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.s3_compatible_storage')),\n m('label', app.translator.trans('fof-upload.admin.labels.aws-s3.endpoint')),\n m('input.FormControl', {\n value: this.values.awsS3Endpoint() || '',\n oninput: withAttr('value', this.values.awsS3Endpoint),\n }),\n Switch.component(\n {\n state: this.values.awsS3UsePathStyleEndpoint() || false,\n onchange: this.values.awsS3UsePathStyleEndpoint,\n },\n app.translator.trans('fof-upload.admin.labels.aws-s3.use_path_style_endpoint')\n ),\n m('label', app.translator.trans('fof-upload.admin.labels.aws-s3.acl')),\n m('input.FormControl', {\n value: this.values.awsS3ACL() || '',\n oninput: withAttr('value', this.values.awsS3ACL),\n }),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.s3_acl')),\n ]),\n ])\n );\n }\n\n return items;\n }\n\n getTemplateOptionsForInput() {\n const options = {};\n\n for (let option in this.templateOptions) {\n if (!this.templateOptions.hasOwnProperty(option)) {\n continue;\n }\n\n options[option] = this.templateOptions[option].name;\n }\n\n return options;\n }\n\n updateMimeTypeKey(mime, value) {\n this.values.mimeTypes()[value] = this.values.mimeTypes()[mime];\n\n this.deleteMimeType(mime);\n }\n\n updateMimeTypeAdapter(mime, config, value) {\n config.adapter = value;\n this.values.mimeTypes()[mime] = config;\n }\n\n updateMimeTypeTemplate(mime, config, value) {\n config.template = value;\n this.values.mimeTypes()[mime] = config;\n }\n\n deleteMimeType(mime) {\n delete this.values.mimeTypes()[mime];\n }\n\n templateOptionsDescriptions() {\n const children = [];\n\n for (let template in this.templateOptions) {\n if (!this.templateOptions.hasOwnProperty(template)) {\n continue;\n }\n\n children.push(\n
  • \n {this.templateOptions[template].name}: {m.trust(this.templateOptions[template].description)}\n
  • \n );\n }\n\n return m('ul', children);\n }\n\n addMimeType() {\n this.values.mimeTypes()[this.newMimeType.regex()] = {\n adapter: this.newMimeType.adapter(),\n template: this.newMimeType.template(),\n };\n\n this.newMimeType.regex('');\n this.newMimeType.adapter('local');\n this.newMimeType.template('file');\n }\n\n /**\n * Checks if the values of the fields and checkboxes are different from\n * the ones stored in the database\n *\n * @returns boolean\n */\n changed() {\n const fieldsCheck = this.fields.some((key) => this.values[key]() !== app.data.settings[this.addPrefix(key)]);\n const checkboxesCheck = this.checkboxes.some((key) => this.values[key]() !== (app.data.settings[this.addPrefix(key)] === '1'));\n const objectsCheck = this.objects.some((key) => JSON.stringify(this.values[key]()) !== app.data.settings[this.addPrefix(key)]);\n\n return fieldsCheck || checkboxesCheck || objectsCheck;\n }\n\n /**\n * Saves the settings to the database and redraw the page\n *\n * @param e\n */\n onsubmit(e) {\n // prevent the usual form submit behaviour\n e.preventDefault();\n\n // if the page is already saving, do nothing\n if (this.loading) return;\n\n // prevents multiple savings\n this.loading = true;\n\n // remove previous success popup\n app.alerts.dismiss(this.successAlert);\n\n const settings = {};\n\n // gets all the values from the form\n this.fields.forEach((key) => (settings[this.addPrefix(key)] = this.values[key]()));\n this.checkboxes.forEach((key) => (settings[this.addPrefix(key)] = this.values[key]()));\n this.objects.forEach((key) => (settings[this.addPrefix(key)] = JSON.stringify(this.values[key]())));\n\n // actually saves everything in the database\n saveSettings(settings)\n .then(() => {\n // on success, show popup\n this.successAlert = app.alerts.show(Alert, { type: 'success' }, app.translator.trans('core.admin.settings.saved_message'));\n })\n .catch(() => {})\n .then(() => {\n // return to the initial state and redraw the page\n this.loading = false;\n m.redraw();\n });\n }\n\n /**\n * Adds the prefix `this.settingsPrefix` at the beginning of `key`\n *\n * @returns string\n */\n addPrefix(key) {\n return this.settingsPrefix + '.' + key;\n }\n}\n","import UploadPage from './UploadPage';\n\nexport const components = {\n UploadPage,\n};\n","import app from 'flarum/admin/app';\nimport UploadPage from './components/UploadPage';\n\nexport * from './components';\n\napp.initializers.add('fof-upload', (app) => {\n app.extensionData\n .for('fof-upload')\n .registerPage(UploadPage)\n .registerPermission(\n {\n icon: 'far fa-file',\n label: app.translator.trans('fof-upload.admin.permissions.upload_label'),\n permission: 'fof-upload.upload',\n },\n 'start',\n 50\n )\n .registerPermission(\n {\n icon: 'fas fa-download',\n label: app.translator.trans('fof-upload.admin.permissions.download_label'),\n permission: 'fof-upload.download',\n allowGuest: true,\n },\n 'view',\n 50\n )\n .registerPermission(\n {\n icon: 'fas fa-eye',\n label: app.translator.trans('fof-upload.admin.permissions.view_user_uploads_label'),\n permission: 'fof-upload.viewUserUploads',\n },\n 'moderate',\n 50\n )\n .registerPermission(\n {\n icon: 'fas fa-trash',\n label: app.translator.trans('fof-upload.admin.permissions.delete_uploads_of_others_label'),\n permission: 'fof-upload.deleteUserUploads',\n },\n 'moderate',\n 50\n );\n});\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","flarum","core","compat","_setPrototypeOf","p","setPrototypeOf","__proto__","_inheritsLoose","subClass","superClass","create","constructor","InspectMimeModal","oninit","vnode","this","uploading","inspection","className","title","app","content","href","type","onchange","onupload","bind","disabled","LoadingIndicator","laravel_validation","error","laravel_validation_error","mime_detector","php_mime","guessed_extension","event","body","FormData","i","target","files","length","append","method","url","serialize","raw","then","result","m","redraw","Modal","UploadPage","loading","fields","checkboxes","objects","watermarkPositions","center","left","top","right","bottom","composerButtonVisiblityOptions","both","settings","settingsPrefix","uploadMethodOptions","addPrefix","templateOptions","values","forEach","Stream","JSON","parse","defaultAdap","keys","mimeTypes","adapter","template","newMimeType","regex","max_post","max_upload","onsubmit","maxFileSize","oninput","withAttr","min","post","upload","map","mime","config","updateMimeTypeKey","Select","options","updateMimeTypeAdapter","getTemplateOptionsForInput","updateMimeTypeTemplate","Button","onclick","deleteMimeType","addMimeType","templateOptionsDescriptions","composerButtonVisiblity","Switch","state","mustResize","resizeMaxWidth","whitelistedClientExtensions","addsWatermarks","watermarkPosition","UploadImageButton","name","disableHotlinkProtection","disableDownloadLogging","cdnUrl","adaptorItems","toArray","changed","items","ItemList","undefined","add","imgurClientId","qiniuKey","qiniuSecret","qiniuBucket","awsS3Key","awsS3Secret","awsS3Bucket","awsS3Region","awsS3Endpoint","awsS3UsePathStyleEndpoint","awsS3ACL","option","children","push","trust","description","fieldsCheck","some","checkboxesCheck","objectsCheck","stringify","e","preventDefault","successAlert","saveSettings","Alert","ExtensionPage","components","extensionData","registerPage","registerPermission","icon","label","translator","trans","permission","allowGuest"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"admin.js","mappings":"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","sources":["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['admin/app']\"","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/components/Button']\"","webpack://@fof/upload/external root \"flarum.core.compat['admin/utils/saveSettings']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/components/Alert']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/components/Select']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/components/Switch']\"","webpack://@fof/upload/external root \"flarum.core.compat['admin/components/UploadImageButton']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/utils/withAttr']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/utils/Stream']\"","webpack://@fof/upload/external root \"flarum.core.compat['admin/components/ExtensionPage']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/utils/ItemList']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/components/Modal']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/components/LoadingIndicator']\"","webpack://@fof/upload/./src/admin/components/InspectMimeModal.js","webpack://@fof/upload/external root \"flarum.core.compat['common/helpers/icon']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/components/Link']\"","webpack://@fof/upload/./src/admin/components/UploadPage.js","webpack://@fof/upload/./src/admin/components/index.js","webpack://@fof/upload/./src/admin/index.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\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['admin/app'];","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/components/Button'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/utils/saveSettings'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Alert'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Select'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Switch'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/components/UploadImageButton'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/withAttr'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/Stream'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/components/ExtensionPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/ItemList'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Modal'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/LoadingIndicator'];","import app from 'flarum/admin/app';\nimport Modal from 'flarum/common/components/Modal';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\n\nexport default class InspectMimeModal extends Modal {\n oninit(vnode) {\n super.oninit(vnode);\n\n this.uploading = false;\n this.inspection = {};\n }\n\n className() {\n return 'Modal--small fof-upload-inspect-mime-modal';\n }\n\n title() {\n return app.translator.trans('fof-upload.admin.inspect-mime.title');\n }\n\n content() {\n return (\n
    \n

    \n {app.translator.trans('fof-upload.admin.inspect-mime.description', {\n a: ,\n })}\n

    \n

    {app.translator.trans('fof-upload.admin.inspect-mime.select')}

    \n
    \n \n {this.uploading ? LoadingIndicator.component() : null}\n
    \n
    \n
    {app.translator.trans('fof-upload.admin.inspect-mime.laravel-validation')}
    \n
    \n {typeof this.inspection.laravel_validation === 'undefined' ? (\n {app.translator.trans('fof-upload.admin.inspect-mime.no-file-selected')}\n ) : this.inspection.laravel_validation ? (\n app.translator.trans('fof-upload.admin.inspect-mime.validation-passed')\n ) : (\n app.translator.trans('fof-upload.admin.inspect-mime.validation-failed', {\n error: this.inspection.laravel_validation_error || '?',\n })\n )}\n
    \n
    \n
    \n
    {app.translator.trans('fof-upload.admin.inspect-mime.mime-detector')}
    \n
    \n {this.inspection.mime_detector ? (\n {this.inspection.mime_detector}\n ) : (\n {app.translator.trans('fof-upload.admin.inspect-mime.not-available')}\n )}\n
    \n
    \n
    \n
    {app.translator.trans('fof-upload.admin.inspect-mime.mime-fileinfo')}
    \n
    \n {this.inspection.php_mime ? (\n {this.inspection.php_mime}\n ) : (\n {app.translator.trans('fof-upload.admin.inspect-mime.not-available')}\n )}\n
    \n
    \n
    \n
    {app.translator.trans('fof-upload.admin.inspect-mime.guessed-extension')}
    \n
    \n {this.inspection.guessed_extension ? (\n {this.inspection.guessed_extension}\n ) : (\n {app.translator.trans('fof-upload.admin.inspect-mime.not-available')}\n )}\n
    \n
    \n
    \n );\n }\n\n onupload(event) {\n const body = new FormData();\n\n for (let i = 0; i < event.target.files.length; i++) {\n body.append('files[]', event.target.files[i]);\n }\n\n this.uploading = true;\n\n return app\n .request({\n method: 'POST',\n url: app.forum.attribute('apiUrl') + '/fof/upload/inspect-mime',\n serialize: (raw) => raw,\n body,\n })\n .then((result) => {\n this.uploading = false;\n this.inspection = result;\n m.redraw();\n })\n .catch((error) => {\n this.uploading = false;\n this.inspection = {};\n m.redraw();\n\n throw error;\n });\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/icon'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Link'];","import app from 'flarum/admin/app';\nimport Button from 'flarum/common/components/Button';\nimport saveSettings from 'flarum/admin/utils/saveSettings';\nimport Alert from 'flarum/common/components/Alert';\nimport Select from 'flarum/common/components/Select';\nimport Switch from 'flarum/common/components/Switch';\nimport UploadImageButton from 'flarum/admin/components/UploadImageButton';\nimport withAttr from 'flarum/common/utils/withAttr';\nimport Stream from 'flarum/common/utils/Stream';\nimport ExtensionPage from 'flarum/admin/components/ExtensionPage';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport InspectMimeModal from './InspectMimeModal';\nimport icon from 'flarum/common/helpers/icon';\nimport Link from 'flarum/common/components/Link';\n\n/* global m */\n\nexport default class UploadPage extends ExtensionPage {\n oninit(vnode) {\n super.oninit(vnode);\n // whether we are saving the settings or not right now\n this.loading = false;\n\n // the fields we need to watch and to save\n this.fields = [\n // image\n 'resizeMaxWidth',\n 'cdnUrl',\n 'maxFileSize',\n 'whitelistedClientExtensions',\n 'composerButtonVisiblity',\n // watermark\n 'watermark',\n 'watermarkPosition',\n // Imgur\n 'imgurClientId',\n // AWS\n 'awsS3Key',\n 'awsS3Secret',\n 'awsS3Bucket',\n 'awsS3Region',\n 'awsS3Endpoint',\n 'awsS3ACL',\n // QIniu\n 'qiniuKey',\n 'qiniuSecret',\n 'qiniuBucket',\n ];\n\n // the checkboxes we need to watch and to save.\n this.checkboxes = ['mustResize', 'addsWatermarks', 'disableHotlinkProtection', 'disableDownloadLogging', 'awsS3UsePathStyleEndpoint'];\n\n // fields that are objects\n this.objects = ['mimeTypes'];\n\n // watermark positions\n this.watermarkPositions = {\n 'top-left': 'top-left',\n 'top-right': 'top-right',\n 'bottom-left': 'bottom-left',\n 'bottom-right': 'bottom-right',\n center: 'center',\n left: 'left',\n top: 'top',\n right: 'right',\n bottom: 'bottom',\n };\n\n // Composer button options\n this.composerButtonVisiblityOptions = {\n both: app.translator.trans('fof-upload.admin.labels.composer_buttons.options.both'),\n 'upload-btn': app.translator.trans('fof-upload.admin.labels.composer_buttons.options.upload-btn'),\n 'media-btn': app.translator.trans('fof-upload.admin.labels.composer_buttons.options.media-btn'),\n };\n\n // get the saved settings from the database\n const settings = app.data.settings;\n\n // our package prefix (to be added to every field and checkbox in the setting table)\n this.settingsPrefix = 'fof-upload';\n\n // Options for the Upload methods dropdown menu.\n this.uploadMethodOptions = settings[this.addPrefix('availableUploadMethods')] || {};\n // Options for the Template dropdown menu.\n this.templateOptions = settings[this.addPrefix('availableTemplates')] || {};\n // Contains current values.\n this.values = {};\n // bind the values of the fields and checkboxes to the getter/setter functions\n this.fields.forEach((key) => (this.values[key] = Stream(settings[this.addPrefix(key)])));\n this.checkboxes.forEach((key) => (this.values[key] = Stream(settings[this.addPrefix(key)] === '1')));\n this.objects.forEach((key) => (this.values[key] = settings[this.addPrefix(key)] ? Stream(JSON.parse(settings[this.addPrefix(key)])) : Stream()));\n\n // Set a sane default in case no mimeTypes have been configured yet.\n // Since 'local' (or others) can now be disabled, pick the last entry in the object for default\n this.defaultAdap = Object.keys(this.uploadMethodOptions)[Object.keys(this.uploadMethodOptions).length - 1];\n this.values.mimeTypes() ||\n (this.values.mimeTypes = Stream({\n '^image\\\\/.*': {\n adapter: this.defaultAdap,\n template: 'image-preview',\n },\n }));\n\n this.newMimeType = {\n regex: Stream(''),\n adapter: Stream(this.defaultAdap),\n template: Stream('file'),\n };\n }\n\n /**\n * Show the actual ImageUploadPage.\n *\n * @returns {*}\n */\n content() {\n const max_post = app.data.settings[this.addPrefix('php_ini.post_max_size')];\n const max_upload = app.data.settings[this.addPrefix('php_ini.upload_max_filesize')];\n return [\n m('.UploadPage', [\n m('.container', [\n m(\n 'form',\n {\n onsubmit: this.onsubmit.bind(this),\n },\n [\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.preferences.title')),\n m('label', app.translator.trans('fof-upload.admin.labels.preferences.max_file_size')),\n m('input.FormControl', {\n value: this.values.maxFileSize() || 2048,\n oninput: withAttr('value', this.values.maxFileSize),\n type: 'number',\n min: '0',\n }),\n m(\n '.helpText',\n app.translator.trans('fof-upload.admin.labels.preferences.php_ini_values', {\n post: max_post,\n upload: max_upload,\n })\n ),\n m('label', app.translator.trans('fof-upload.admin.labels.preferences.mime_types')),\n m(\n '.MimeTypes--Container',\n Object.keys(this.values.mimeTypes()).map((mime) => {\n let config = this.values.mimeTypes()[mime];\n // Compatibility for older versions.\n if (typeof config !== 'object') {\n config = {\n adapter: config,\n template: 'file',\n };\n }\n\n return m('div', [\n m('input.FormControl.MimeTypes', {\n value: mime,\n oninput: withAttr('value', this.updateMimeTypeKey.bind(this, mime)),\n }),\n Select.component({\n options: this.uploadMethodOptions,\n onchange: this.updateMimeTypeAdapter.bind(this, mime, config),\n value: config.adapter || 'local',\n }),\n Select.component({\n options: this.getTemplateOptionsForInput(),\n onchange: this.updateMimeTypeTemplate.bind(this, mime, config),\n value: config.template || 'local',\n }),\n Button.component(\n {\n type: 'button',\n className: 'Button Button--warning',\n onclick: this.deleteMimeType.bind(this, mime),\n },\n 'x'\n ),\n ]);\n }),\n m('br'),\n m('div', [\n m('input.FormControl.MimeTypes.add-MimeType-key', {\n value: this.newMimeType.regex(),\n oninput: withAttr('value', this.newMimeType.regex),\n }),\n Select.component({\n options: this.uploadMethodOptions,\n className: 'add-MimeType-value',\n oninput: withAttr('value', this.newMimeType.adapter),\n value: this.newMimeType.adapter(),\n }),\n Select.component({\n options: this.getTemplateOptionsForInput(),\n className: 'add-MimeType-value',\n oninput: withAttr('value', this.newMimeType.template),\n value: this.newMimeType.template(),\n }),\n Button.component(\n {\n type: 'button',\n className: 'Button Button--warning',\n onclick: this.addMimeType.bind(this),\n },\n '+'\n ),\n ])\n ),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.mime_types')),\n Button.component(\n {\n className: 'Button',\n onclick() {\n app.modal.show(InspectMimeModal);\n },\n },\n app.translator.trans('fof-upload.admin.labels.inspect-mime')\n ),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.download_templates')),\n this.templateOptionsDescriptions(),\n ]),\n m('fieldset.composerButtons', [\n m('legend', app.translator.trans('fof-upload.admin.labels.composer_buttons.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.composer_buttons')),\n m('div', [\n Select.component({\n options: this.composerButtonVisiblityOptions,\n onchange: this.values.composerButtonVisiblity,\n value: this.values.composerButtonVisiblity() || 'both',\n }),\n ]),\n ]),\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.resize.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.resize')),\n Switch.component(\n {\n state: this.values.mustResize() || false,\n onchange: this.values.mustResize,\n },\n app.translator.trans('fof-upload.admin.labels.resize.toggle')\n ),\n m('label', app.translator.trans('fof-upload.admin.labels.resize.max_width')),\n m('input', {\n className: 'FormControl',\n value: this.values.resizeMaxWidth() || 100,\n oninput: withAttr('value', this.values.resizeMaxWidth),\n disabled: !this.values.mustResize(),\n type: 'number',\n min: '0',\n }),\n ]),\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.client_extension.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.client_extension')),\n m('input', {\n className: 'FormControl',\n value: this.values.whitelistedClientExtensions() || '',\n oninput: withAttr('value', this.values.whitelistedClientExtensions),\n }),\n ]),\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.watermark.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.watermark')),\n Switch.component(\n {\n state: this.values.addsWatermarks() || false,\n onchange: this.values.addsWatermarks,\n },\n app.translator.trans('fof-upload.admin.labels.watermark.toggle')\n ),\n m('label', app.translator.trans('fof-upload.admin.labels.watermark.position')),\n m('div', [\n Select.component({\n options: this.watermarkPositions,\n onchange: this.values.watermarkPosition,\n value: this.values.watermarkPosition() || 'bottom-right',\n }),\n ]),\n m('label', {}, app.translator.trans('fof-upload.admin.labels.watermark.file')),\n UploadImageButton.component({\n name: 'fof/watermark',\n }),\n ]),\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.disable-hotlink-protection.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.disable-hotlink-protection')),\n Switch.component(\n {\n state: this.values.disableHotlinkProtection() || false,\n onchange: this.values.disableHotlinkProtection,\n },\n app.translator.trans('fof-upload.admin.labels.disable-hotlink-protection.toggle')\n ),\n m('legend', app.translator.trans('fof-upload.admin.labels.disable-download-logging.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.disable-download-logging')),\n Switch.component(\n {\n state: this.values.disableDownloadLogging() || false,\n onchange: this.values.disableDownloadLogging,\n },\n app.translator.trans('fof-upload.admin.labels.disable-download-logging.toggle')\n ),\n ]),\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.local.title')),\n m('label', app.translator.trans('fof-upload.admin.labels.local.cdn_url')),\n m('input.FormControl', {\n value: this.values.cdnUrl() || '',\n oninput: withAttr('value', this.values.cdnUrl),\n }),\n ]),\n\n this.adaptorItems().toArray(),\n\n Button.component(\n {\n type: 'submit',\n className: 'Button Button--primary',\n loading: this.loading,\n disabled: !this.changed(),\n },\n app.translator.trans('core.admin.settings.submit_button')\n ),\n ]\n ),\n ]),\n ]),\n ];\n }\n\n adaptorItems() {\n const items = new ItemList();\n\n if (this.uploadMethodOptions['imgur'] !== undefined) {\n items.add(\n 'imgur',\n
    \n
    \n {app.translator.trans('fof-upload.admin.labels.imgur.title')}\n

    \n {icon('fas fa-exclamation-circle')}{' '}\n {app.translator.trans('fof-upload.admin.labels.imgur.tos', {\n a: ,\n })}\n

    \n \n \n
    \n
    ,\n 100\n );\n }\n\n if (this.uploadMethodOptions['qiniu'] !== undefined) {\n items.add(\n 'qiniu',\n m('.qiniu', [\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.qiniu.title')),\n m('label', app.translator.trans('fof-upload.admin.labels.qiniu.key')),\n m('input.FormControl', {\n value: this.values.qiniuKey() || '',\n oninput: withAttr('value', this.values.qiniuKey),\n }),\n m('label', {}, app.translator.trans('fof-upload.admin.labels.qiniu.secret')),\n m('input.FormControl', {\n value: this.values.qiniuSecret() || '',\n oninput: withAttr('value', this.values.qiniuSecret),\n }),\n m('label', {}, app.translator.trans('fof-upload.admin.labels.qiniu.bucket')),\n m('input.FormControl', {\n value: this.values.qiniuBucket() || '',\n oninput: withAttr('value', this.values.qiniuBucket),\n }),\n ]),\n ]),\n 80\n );\n }\n\n if (this.uploadMethodOptions['aws-s3'] !== undefined) {\n items.add(\n 'aws-s3',\n m('.aws', [\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.aws-s3.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.s3_instance_profile')),\n m('label', app.translator.trans('fof-upload.admin.labels.aws-s3.key')),\n m('input.FormControl', {\n value: this.values.awsS3Key() || '',\n oninput: withAttr('value', this.values.awsS3Key),\n }),\n m('label', app.translator.trans('fof-upload.admin.labels.aws-s3.secret')),\n m('input.FormControl', {\n value: this.values.awsS3Secret() || '',\n oninput: withAttr('value', this.values.awsS3Secret),\n }),\n m('label', app.translator.trans('fof-upload.admin.labels.aws-s3.bucket')),\n m('input.FormControl', {\n value: this.values.awsS3Bucket() || '',\n oninput: withAttr('value', this.values.awsS3Bucket),\n }),\n m('label', app.translator.trans('fof-upload.admin.labels.aws-s3.region')),\n m('input.FormControl', {\n value: this.values.awsS3Region() || '',\n oninput: withAttr('value', this.values.awsS3Region),\n }),\n ]),\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.aws-s3.advanced_title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.s3_compatible_storage')),\n m('label', app.translator.trans('fof-upload.admin.labels.aws-s3.endpoint')),\n m('input.FormControl', {\n value: this.values.awsS3Endpoint() || '',\n oninput: withAttr('value', this.values.awsS3Endpoint),\n }),\n Switch.component(\n {\n state: this.values.awsS3UsePathStyleEndpoint() || false,\n onchange: this.values.awsS3UsePathStyleEndpoint,\n },\n app.translator.trans('fof-upload.admin.labels.aws-s3.use_path_style_endpoint')\n ),\n m('label', app.translator.trans('fof-upload.admin.labels.aws-s3.acl')),\n m('input.FormControl', {\n value: this.values.awsS3ACL() || '',\n oninput: withAttr('value', this.values.awsS3ACL),\n }),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.s3_acl')),\n ]),\n ]),\n 60\n );\n }\n\n return items;\n }\n\n getTemplateOptionsForInput() {\n const options = {};\n\n for (let option in this.templateOptions) {\n if (!this.templateOptions.hasOwnProperty(option)) {\n continue;\n }\n\n options[option] = this.templateOptions[option].name;\n }\n\n return options;\n }\n\n updateMimeTypeKey(mime, value) {\n this.values.mimeTypes()[value] = this.values.mimeTypes()[mime];\n\n this.deleteMimeType(mime);\n }\n\n updateMimeTypeAdapter(mime, config, value) {\n config.adapter = value;\n this.values.mimeTypes()[mime] = config;\n }\n\n updateMimeTypeTemplate(mime, config, value) {\n config.template = value;\n this.values.mimeTypes()[mime] = config;\n }\n\n deleteMimeType(mime) {\n delete this.values.mimeTypes()[mime];\n }\n\n templateOptionsDescriptions() {\n const children = [];\n\n for (let template in this.templateOptions) {\n if (!this.templateOptions.hasOwnProperty(template)) {\n continue;\n }\n\n children.push(\n
  • \n {this.templateOptions[template].name}: {m.trust(this.templateOptions[template].description)}\n
  • \n );\n }\n\n return m('ul', children);\n }\n\n addMimeType() {\n this.values.mimeTypes()[this.newMimeType.regex()] = {\n adapter: this.newMimeType.adapter(),\n template: this.newMimeType.template(),\n };\n\n this.newMimeType.regex('');\n this.newMimeType.adapter('local');\n this.newMimeType.template('file');\n }\n\n /**\n * Checks if the values of the fields and checkboxes are different from\n * the ones stored in the database\n *\n * @returns boolean\n */\n changed() {\n const fieldsCheck = this.fields.some((key) => this.values[key]() !== app.data.settings[this.addPrefix(key)]);\n const checkboxesCheck = this.checkboxes.some((key) => this.values[key]() !== (app.data.settings[this.addPrefix(key)] === '1'));\n const objectsCheck = this.objects.some((key) => JSON.stringify(this.values[key]()) !== app.data.settings[this.addPrefix(key)]);\n\n return fieldsCheck || checkboxesCheck || objectsCheck;\n }\n\n /**\n * Saves the settings to the database and redraw the page\n *\n * @param e\n */\n onsubmit(e) {\n // prevent the usual form submit behaviour\n e.preventDefault();\n\n // if the page is already saving, do nothing\n if (this.loading) return;\n\n // prevents multiple savings\n this.loading = true;\n\n // remove previous success popup\n app.alerts.dismiss(this.successAlert);\n\n const settings = {};\n\n // gets all the values from the form\n this.fields.forEach((key) => (settings[this.addPrefix(key)] = this.values[key]()));\n this.checkboxes.forEach((key) => (settings[this.addPrefix(key)] = this.values[key]()));\n this.objects.forEach((key) => (settings[this.addPrefix(key)] = JSON.stringify(this.values[key]())));\n\n // actually saves everything in the database\n saveSettings(settings)\n .then(() => {\n // on success, show popup\n this.successAlert = app.alerts.show(Alert, { type: 'success' }, app.translator.trans('core.admin.settings.saved_message'));\n })\n .catch(() => {})\n .then(() => {\n // return to the initial state and redraw the page\n this.loading = false;\n m.redraw();\n });\n }\n\n /**\n * Adds the prefix `this.settingsPrefix` at the beginning of `key`\n *\n * @returns string\n */\n addPrefix(key) {\n return this.settingsPrefix + '.' + key;\n }\n}\n","import UploadPage from './UploadPage';\n\nexport const components = {\n UploadPage,\n};\n","import app from 'flarum/admin/app';\nimport UploadPage from './components/UploadPage';\n\nexport * from './components';\n\napp.initializers.add('fof-upload', (app) => {\n app.extensionData\n .for('fof-upload')\n .registerPage(UploadPage)\n .registerPermission(\n {\n icon: 'far fa-file',\n label: app.translator.trans('fof-upload.admin.permissions.upload_label'),\n permission: 'fof-upload.upload',\n },\n 'start',\n 50\n )\n .registerPermission(\n {\n icon: 'fas fa-download',\n label: app.translator.trans('fof-upload.admin.permissions.download_label'),\n permission: 'fof-upload.download',\n allowGuest: true,\n },\n 'view',\n 50\n )\n .registerPermission(\n {\n icon: 'fas fa-eye',\n label: app.translator.trans('fof-upload.admin.permissions.view_user_uploads_label'),\n permission: 'fof-upload.viewUserUploads',\n },\n 'moderate',\n 50\n )\n .registerPermission(\n {\n icon: 'fas fa-trash',\n label: app.translator.trans('fof-upload.admin.permissions.delete_uploads_of_others_label'),\n permission: 'fof-upload.deleteUserUploads',\n },\n 'moderate',\n 50\n );\n});\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","flarum","core","compat","_setPrototypeOf","p","setPrototypeOf","__proto__","_inheritsLoose","subClass","superClass","create","constructor","InspectMimeModal","oninit","vnode","this","uploading","inspection","className","title","app","content","href","type","onchange","onupload","bind","disabled","LoadingIndicator","laravel_validation","error","laravel_validation_error","mime_detector","php_mime","guessed_extension","event","body","FormData","i","target","files","length","append","method","url","serialize","raw","then","result","m","redraw","Modal","UploadPage","loading","fields","checkboxes","objects","watermarkPositions","center","left","top","right","bottom","composerButtonVisiblityOptions","both","settings","settingsPrefix","uploadMethodOptions","addPrefix","templateOptions","values","forEach","Stream","JSON","parse","defaultAdap","keys","mimeTypes","adapter","template","newMimeType","regex","max_post","max_upload","onsubmit","maxFileSize","oninput","withAttr","min","post","upload","map","mime","config","updateMimeTypeKey","Select","options","updateMimeTypeAdapter","getTemplateOptionsForInput","updateMimeTypeTemplate","Button","onclick","deleteMimeType","addMimeType","templateOptionsDescriptions","composerButtonVisiblity","Switch","state","mustResize","resizeMaxWidth","whitelistedClientExtensions","addsWatermarks","watermarkPosition","UploadImageButton","name","disableHotlinkProtection","disableDownloadLogging","cdnUrl","adaptorItems","toArray","changed","items","ItemList","undefined","add","icon","external","imgurClientId","qiniuKey","qiniuSecret","qiniuBucket","awsS3Key","awsS3Secret","awsS3Bucket","awsS3Region","awsS3Endpoint","awsS3UsePathStyleEndpoint","awsS3ACL","option","children","push","trust","description","fieldsCheck","some","checkboxesCheck","objectsCheck","stringify","e","preventDefault","successAlert","saveSettings","Alert","ExtensionPage","components","extensionData","registerPage","registerPermission","label","translator","trans","permission","allowGuest"],"sourceRoot":""} \ No newline at end of file