Run prettier on all TypeScript files
authorTim Düsterhus <duesterhus@woltlab.com>
Thu, 29 Oct 2020 15:45:58 +0000 (16:45 +0100)
committerTim Düsterhus <duesterhus@woltlab.com>
Thu, 29 Oct 2020 15:45:58 +0000 (16:45 +0100)
find wcfsetup/install/files/ts/WoltLabSuite/Core/ -iname '*.ts' -print0 |xargs -0 npx prettier -w

138 files changed:
wcfsetup/install/files/js/WoltLabSuite/Core/Ajax.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ajax/Jsonp.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ajax/Request.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ajax/Status.js
wcfsetup/install/files/js/WoltLabSuite/Core/BackgroundQueue.js
wcfsetup/install/files/js/WoltLabSuite/Core/CallbackList.js
wcfsetup/install/files/js/WoltLabSuite/Core/ColorUtil.js
wcfsetup/install/files/js/WoltLabSuite/Core/Core.js
wcfsetup/install/files/js/WoltLabSuite/Core/Date/Picker.js
wcfsetup/install/files/js/WoltLabSuite/Core/Date/Time/Relative.js
wcfsetup/install/files/js/WoltLabSuite/Core/Date/Util.js
wcfsetup/install/files/js/WoltLabSuite/Core/Devtools.js
wcfsetup/install/files/js/WoltLabSuite/Core/Dictionary.js
wcfsetup/install/files/js/WoltLabSuite/Core/Dom/Change/Listener.js
wcfsetup/install/files/js/WoltLabSuite/Core/Dom/Traverse.js
wcfsetup/install/files/js/WoltLabSuite/Core/Dom/Util.js
wcfsetup/install/files/js/WoltLabSuite/Core/Environment.js
wcfsetup/install/files/js/WoltLabSuite/Core/Event/Handler.js
wcfsetup/install/files/js/WoltLabSuite/Core/Event/Key.js
wcfsetup/install/files/js/WoltLabSuite/Core/FileUtil.js
wcfsetup/install/files/js/WoltLabSuite/Core/I18n/Plural.js
wcfsetup/install/files/js/WoltLabSuite/Core/Language.js
wcfsetup/install/files/js/WoltLabSuite/Core/NumberUtil.js
wcfsetup/install/files/js/WoltLabSuite/Core/ObjectMap.js
wcfsetup/install/files/js/WoltLabSuite/Core/Permission.js
wcfsetup/install/files/js/WoltLabSuite/Core/StringUtil.js
wcfsetup/install/files/js/WoltLabSuite/Core/Template.js
wcfsetup/install/files/js/WoltLabSuite/Core/Timer/Repeating.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Acl/Simple.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Alignment.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Article/MarkAllAsRead.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Article/Search.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/CloseOverlay.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Confirmation.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Dialog.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Dropdown/Builder.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Dropdown/Reusable.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Dropdown/Simple.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/File/Delete.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/FlexibleMenu.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/ItemList.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Notification.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Page/Action.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Page/Header/Fixed.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Page/Header/Menu.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Page/JumpTo.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Page/Menu/Abstract.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Page/Search.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Page/Search/Handler.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Page/Search/Input.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Pagination.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Screen.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Scroll.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Search/Input.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Search/Page.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Smiley/Insert.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Suggestion.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/TabMenu.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/TabMenu/Simple.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Toggle/Input.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Tooltip.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/User/Editor.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/User/Ignore.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/User/List.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/User/Search/Input.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/User/Trophy/List.js
wcfsetup/install/files/js/WoltLabSuite/Core/User.js
wcfsetup/install/files/ts/WoltLabSuite/Core/Ajax.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ajax/Data.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ajax/Jsonp.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ajax/Request.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ajax/Status.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/BackgroundQueue.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/CallbackList.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/ColorUtil.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Core.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Date/Picker.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Date/Time/Relative.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Date/Util.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Devtools.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Dictionary.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Dom/Change/Listener.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Dom/Traverse.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Dom/Util.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Environment.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Event/Handler.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Event/Key.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/FileUtil.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/I18n/Plural.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Language.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/NumberUtil.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/ObjectMap.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Permission.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/StringUtil.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Template.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Timer/Repeating.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Acl/Simple.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Alignment.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Article/MarkAllAsRead.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Article/Search.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/CloseOverlay.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Confirmation.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Dialog.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Dialog/Data.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Dropdown/Builder.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Dropdown/Data.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Dropdown/Reusable.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Dropdown/Simple.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/File/Delete.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/FlexibleMenu.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/ItemList.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Notification.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Page/Action.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Page/Header/Fixed.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Page/Header/Menu.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Page/JumpTo.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Page/Menu/Abstract.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Page/Search.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Page/Search/Handler.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Page/Search/Input.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Pagination.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Screen.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Scroll.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Search/Data.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Search/Input.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Search/Page.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Smiley/Insert.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Suggestion.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/TabMenu.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/TabMenu/Simple.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Toggle/Input.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Tooltip.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/User/Editor.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/User/Ignore.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/User/List.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/User/Search/Input.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/User/Trophy/List.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/User.ts

index 191d7d4ba67b69316523e4341aaf4ed5f9f1011c..93cbff44e7b74856b8a63c0a414ed68b66e1473b 100644 (file)
@@ -18,18 +18,18 @@ define(["require", "exports", "tslib", "./Ajax/Request"], function (require, exp
      * for success and failure callbacks.
      */
     function api(callbackObject, data, success, failure) {
-        if (typeof data !== 'object')
+        if (typeof data !== "object")
             data = {};
         let request = _cache.get(callbackObject);
         if (request === undefined) {
-            if (typeof callbackObject._ajaxSetup !== 'function') {
+            if (typeof callbackObject._ajaxSetup !== "function") {
                 throw new TypeError("Callback object must implement at least _ajaxSetup().");
             }
             const options = callbackObject._ajaxSetup();
             options.pinData = true;
             options.callbackObject = callbackObject;
             if (!options.url) {
-                options.url = 'index.php?ajax-proxy/&t=' + window.SECURITY_TOKEN;
+                options.url = "index.php?ajax-proxy/&t=" + window.SECURITY_TOKEN;
                 options.withCredentials = true;
             }
             request = new Request_1.default(options);
@@ -37,21 +37,21 @@ define(["require", "exports", "tslib", "./Ajax/Request"], function (require, exp
         }
         let oldSuccess = null;
         let oldFailure = null;
-        if (typeof success === 'function') {
-            oldSuccess = request.getOption('success');
-            request.setOption('success', success);
+        if (typeof success === "function") {
+            oldSuccess = request.getOption("success");
+            request.setOption("success", success);
         }
-        if (typeof failure === 'function') {
-            oldFailure = request.getOption('failure');
-            request.setOption('failure', failure);
+        if (typeof failure === "function") {
+            oldFailure = request.getOption("failure");
+            request.setOption("failure", failure);
         }
         request.setData(data);
         request.sendRequest();
         // restore callbacks
         if (oldSuccess !== null)
-            request.setOption('success', oldSuccess);
+            request.setOption("success", oldSuccess);
         if (oldFailure !== null)
-            request.setOption('failure', oldFailure);
+            request.setOption("failure", oldFailure);
         return request;
     }
     exports.api = api;
@@ -65,7 +65,7 @@ define(["require", "exports", "tslib", "./Ajax/Request"], function (require, exp
         options.pinData = false;
         options.callbackObject = null;
         if (!options.url) {
-            options.url = 'index.php?ajax-proxy/&t=' + window.SECURITY_TOKEN;
+            options.url = "index.php?ajax-proxy/&t=" + window.SECURITY_TOKEN;
             options.withCredentials = true;
         }
         const request = new Request_1.default(options);
@@ -77,7 +77,7 @@ define(["require", "exports", "tslib", "./Ajax/Request"], function (require, exp
      */
     function getRequestObject(callbackObject) {
         if (!_cache.has(callbackObject)) {
-            throw new Error('Expected a previously used callback object, provided object is unknown.');
+            throw new Error("Expected a previously used callback object, provided object is unknown.");
         }
         return _cache.get(callbackObject);
     }
index dc2bae753eb8b0e4c4d9ea8bff53bcb1a17ffb24..e65438c050286ade62e85b607fb26d32fb9f45b0 100644 (file)
@@ -16,21 +16,21 @@ define(["require", "exports", "tslib", "../Core"], function (require, exports, t
      * Dispatch a JSONP request, the `url` must not contain a callback parameter.
      */
     function send(url, success, failure, options) {
-        url = (typeof url === 'string') ? url.trim() : '';
+        url = typeof url === "string" ? url.trim() : "";
         if (url.length === 0) {
-            throw new Error('Expected a non-empty string for parameter \'url\'.');
+            throw new Error("Expected a non-empty string for parameter 'url'.");
         }
-        if (typeof success !== 'function') {
-            throw new TypeError('Expected a valid callback function for parameter \'success\'.');
+        if (typeof success !== "function") {
+            throw new TypeError("Expected a valid callback function for parameter 'success'.");
         }
         options = Core.extend({
-            parameterName: 'callback',
+            parameterName: "callback",
             timeout: 10,
         }, options || {});
-        const callbackName = 'wcf_jsonp_' + Core.getUuid().replace(/-/g, '').substr(0, 8);
+        const callbackName = "wcf_jsonp_" + Core.getUuid().replace(/-/g, "").substr(0, 8);
         let script;
         const timeout = window.setTimeout(() => {
-            if (typeof failure === 'function') {
+            if (typeof failure === "function") {
                 failure();
             }
             window[callbackName] = undefined;
@@ -42,9 +42,9 @@ define(["require", "exports", "tslib", "../Core"], function (require, exports, t
             window[callbackName] = undefined;
             script.remove();
         };
-        url += (url.indexOf('?') === -1) ? '?' : '&';
-        url += options.parameterName + '=' + callbackName;
-        script = document.createElement('script');
+        url += url.indexOf("?") === -1 ? "?" : "&";
+        url += options.parameterName + "=" + callbackName;
+        script = document.createElement("script");
         script.async = true;
         script.src = url;
         document.head.appendChild(script);
index 5c2cb0b4967df92783a6c3cb4499c644cb290beb..5486296c0aee6f1802a8018a94ee7dccabdafab7 100644 (file)
@@ -25,10 +25,10 @@ define(["require", "exports", "tslib", "./Status", "../Core", "../Dom/Change/Lis
         constructor(options) {
             this._options = Core.extend({
                 data: {},
-                contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
-                responseType: 'application/json',
-                type: 'POST',
-                url: '',
+                contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+                responseType: "application/json",
+                type: "POST",
+                url: "",
                 withCredentials: false,
                 // behavior
                 autoAbort: false,
@@ -44,11 +44,11 @@ define(["require", "exports", "tslib", "./Status", "../Core", "../Dom/Change/Lis
                 uploadProgress: null,
                 callbackObject: null,
             }, options);
-            if (typeof options.callbackObject === 'object') {
+            if (typeof options.callbackObject === "object") {
                 this._options.callbackObject = options.callbackObject;
             }
             this._options.url = Core.convertLegacyUrl(this._options.url);
-            if (this._options.url.indexOf('index.php') === 0) {
+            if (this._options.url.indexOf("index.php") === 0) {
                 this._options.url = window.WSC_API_URL + this._options.url;
             }
             if (this._options.url.indexOf(window.WSC_API_URL) === 0) {
@@ -60,20 +60,20 @@ define(["require", "exports", "tslib", "./Status", "../Core", "../Dom/Change/Lis
                 this._data = this._options.data;
             }
             if (this._options.callbackObject) {
-                if (typeof this._options.callbackObject._ajaxFailure === 'function')
+                if (typeof this._options.callbackObject._ajaxFailure === "function")
                     this._options.failure = this._options.callbackObject._ajaxFailure.bind(this._options.callbackObject);
-                if (typeof this._options.callbackObject._ajaxFinalize === 'function')
+                if (typeof this._options.callbackObject._ajaxFinalize === "function")
                     this._options.finalize = this._options.callbackObject._ajaxFinalize.bind(this._options.callbackObject);
-                if (typeof this._options.callbackObject._ajaxSuccess === 'function')
+                if (typeof this._options.callbackObject._ajaxSuccess === "function")
                     this._options.success = this._options.callbackObject._ajaxSuccess.bind(this._options.callbackObject);
-                if (typeof this._options.callbackObject._ajaxProgress === 'function')
+                if (typeof this._options.callbackObject._ajaxProgress === "function")
                     this._options.progress = this._options.callbackObject._ajaxProgress.bind(this._options.callbackObject);
-                if (typeof this._options.callbackObject._ajaxUploadProgress === 'function')
+                if (typeof this._options.callbackObject._ajaxUploadProgress === "function")
                     this._options.uploadProgress = this._options.callbackObject._ajaxUploadProgress.bind(this._options.callbackObject);
             }
             if (!_didInit) {
                 _didInit = true;
-                window.addEventListener('beforeunload', () => _ignoreAllErrors = true);
+                window.addEventListener("beforeunload", () => (_ignoreAllErrors = true));
             }
         }
         /**
@@ -92,10 +92,10 @@ define(["require", "exports", "tslib", "./Status", "../Core", "../Dom/Change/Lis
             this._xhr = new XMLHttpRequest();
             this._xhr.open(this._options.type, this._options.url, true);
             if (this._options.contentType) {
-                this._xhr.setRequestHeader('Content-Type', this._options.contentType);
+                this._xhr.setRequestHeader("Content-Type", this._options.contentType);
             }
             if (this._options.withCredentials || this._options.includeRequestedWith) {
-                this._xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
+                this._xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
             }
             if (this._options.withCredentials) {
                 this._xhr.withCredentials = true;
@@ -104,8 +104,8 @@ define(["require", "exports", "tslib", "./Status", "../Core", "../Dom/Change/Lis
             const options = Core.clone(this._options);
             this._xhr.onload = function () {
                 if (this.readyState === XMLHttpRequest.DONE) {
-                    if (this.status >= 200 && this.status < 300 || this.status === 304) {
-                        if (options.responseType && this.getResponseHeader('Content-Type').indexOf(options.responseType) !== 0) {
+                    if ((this.status >= 200 && this.status < 300) || this.status === 304) {
+                        if (options.responseType && this.getResponseHeader("Content-Type").indexOf(options.responseType) !== 0) {
                             // request succeeded but invalid response type
                             self._failure(this, options);
                         }
@@ -127,9 +127,9 @@ define(["require", "exports", "tslib", "./Status", "../Core", "../Dom/Change/Lis
             if (this._options.uploadProgress) {
                 this._xhr.upload.onprogress = this._options.uploadProgress;
             }
-            if (this._options.type === 'POST') {
+            if (this._options.type === "POST") {
                 let data = this._options.data;
-                if (typeof data === 'object' && Core.getType(data) !== 'FormData') {
+                if (typeof data === "object" && Core.getType(data) !== "FormData") {
                     data = Core.serialize(data);
                 }
                 this._xhr.send(data);
@@ -170,7 +170,7 @@ define(["require", "exports", "tslib", "./Status", "../Core", "../Dom/Change/Lis
          * Sets request data while honoring pinned data from setup callback.
          */
         setData(data) {
-            if (this._data !== null && Core.getType(data) !== 'FormData') {
+            if (this._data !== null && Core.getType(data) !== "FormData") {
                 data = Core.extend(this._data, data);
             }
             this._options.data = data;
@@ -182,9 +182,9 @@ define(["require", "exports", "tslib", "./Status", "../Core", "../Dom/Change/Lis
             if (!options.silent) {
                 AjaxStatus.hide();
             }
-            if (typeof options.success === 'function') {
+            if (typeof options.success === "function") {
                 let data = null;
-                if (xhr.getResponseHeader('Content-Type').split(';', 1)[0].trim() === 'application/json') {
+                if (xhr.getResponseHeader("Content-Type").split(";", 1)[0].trim() === "application/json") {
                     try {
                         data = JSON.parse(xhr.responseText);
                     }
@@ -199,7 +199,7 @@ define(["require", "exports", "tslib", "./Status", "../Core", "../Dom/Change/Lis
                     }
                     // force-invoke the background queue
                     if (data && data.forceBackgroundQueuePerform) {
-                        new Promise((resolve_1, reject_1) => { require(['../BackgroundQueue'], resolve_1, reject_1); }).then(tslib_1.__importStar).then(backgroundQueue => backgroundQueue.invoke());
+                        new Promise((resolve_1, reject_1) => { require(["../BackgroundQueue"], resolve_1, reject_1); }).then(tslib_1.__importStar).then((backgroundQueue) => backgroundQueue.invoke());
                     }
                 }
                 options.success(data, xhr.responseText, xhr, options.data);
@@ -221,18 +221,17 @@ define(["require", "exports", "tslib", "./Status", "../Core", "../Dom/Change/Lis
             try {
                 data = JSON.parse(xhr.responseText);
             }
-            catch (e) {
-            }
+            catch (e) { }
             let showError = true;
-            if (typeof options.failure === 'function') {
-                showError = options.failure((data || {}), (xhr.responseText || ''), xhr, options.data);
+            if (typeof options.failure === "function") {
+                showError = options.failure(data || {}, xhr.responseText || "", xhr, options.data);
             }
             if (options.ignoreError !== true && showError) {
                 const html = this.getErrorHtml(data, xhr);
                 if (html) {
-                    new Promise((resolve_2, reject_2) => { require(['../Ui/Dialog'], resolve_2, reject_2); }).then(tslib_1.__importStar).then(UiDialog => {
+                    new Promise((resolve_2, reject_2) => { require(["../Ui/Dialog"], resolve_2, reject_2); }).then(tslib_1.__importStar).then((UiDialog) => {
                         UiDialog.openStatic(Util_1.default.getUniqueId(), html, {
-                            title: Language.get('wcf.global.error.title'),
+                            title: Language.get("wcf.global.error.title"),
                         });
                     });
                 }
@@ -243,34 +242,34 @@ define(["require", "exports", "tslib", "./Status", "../Core", "../Dom/Change/Lis
          * Returns the inner HTML for an error/exception display.
          */
         getErrorHtml(data, xhr) {
-            let details = '';
+            let details = "";
             let message;
             if (data !== null) {
                 if (data.returnValues && data.returnValues.description) {
-                    details += '<br><p>Description:</p><p>' + data.returnValues.description + '</p>';
+                    details += "<br><p>Description:</p><p>" + data.returnValues.description + "</p>";
                 }
                 if (data.file && data.line) {
-                    details += '<br><p>File:</p><p>' + data.file + ' in line ' + data.line + '</p>';
+                    details += "<br><p>File:</p><p>" + data.file + " in line " + data.line + "</p>";
                 }
                 if (data.stacktrace)
-                    details += '<br><p>Stacktrace:</p><p>' + data.stacktrace + '</p>';
+                    details += "<br><p>Stacktrace:</p><p>" + data.stacktrace + "</p>";
                 else if (data.exceptionID)
-                    details += '<br><p>Exception ID: <code>' + data.exceptionID + '</code></p>';
+                    details += "<br><p>Exception ID: <code>" + data.exceptionID + "</code></p>";
                 message = data.message;
                 data.previous.forEach(function (previous) {
-                    details += '<hr><p>' + previous.message + '</p>';
-                    details += '<br><p>Stacktrace</p><p>' + previous.stacktrace + '</p>';
+                    details += "<hr><p>" + previous.message + "</p>";
+                    details += "<br><p>Stacktrace</p><p>" + previous.stacktrace + "</p>";
                 });
             }
             else {
                 message = xhr.responseText;
             }
-            if (!message || message === 'undefined') {
+            if (!message || message === "undefined") {
                 if (!window.ENABLE_DEBUG_MODE)
                     return null;
-                message = 'XMLHttpRequest failed without a responseText. Check your browser console.';
+                message = "XMLHttpRequest failed without a responseText. Check your browser console.";
             }
-            return '<div class="ajaxDebugMessage"><p>' + message + '</p>' + details + '</div>';
+            return '<div class="ajaxDebugMessage"><p>' + message + "</p>" + details + "</div>";
         }
         /**
          * Finalizes a request.
@@ -278,7 +277,7 @@ define(["require", "exports", "tslib", "./Status", "../Core", "../Dom/Change/Lis
          * @param  {Object}  options    request options
          */
         _finalize(options) {
-            if (typeof options.finalize === 'function') {
+            if (typeof options.finalize === "function") {
                 options.finalize(this._xhr);
             }
             this._previousXhr = undefined;
@@ -286,9 +285,9 @@ define(["require", "exports", "tslib", "./Status", "../Core", "../Dom/Change/Lis
             // fix anchor tags generated through WCF::getAnchor()
             document.querySelectorAll('a[href*="#"]').forEach((link) => {
                 let href = link.href;
-                if (href.indexOf('AJAXProxy') !== -1 || href.indexOf('ajax-proxy') !== -1) {
-                    href = href.substr(href.indexOf('#'));
-                    link.href = document.location.toString().replace(/#.*/, '') + href;
+                if (href.indexOf("AJAXProxy") !== -1 || href.indexOf("ajax-proxy") !== -1) {
+                    href = href.substr(href.indexOf("#"));
+                    link.href = document.location.toString().replace(/#.*/, "") + href;
                 }
             });
         }
index 8343900dfd7dd79e16d5014a8a90f3bf5665f7f3..9d0567c8b37e89b8de3d196f2b31f8827204e142 100644 (file)
@@ -15,14 +15,14 @@ define(["require", "exports", "tslib", "../Language"], function (require, export
         constructor() {
             this._activeRequests = 0;
             this._timer = null;
-            this._overlay = document.createElement('div');
-            this._overlay.classList.add('spinner');
-            this._overlay.setAttribute('role', 'status');
-            const icon = document.createElement('span');
-            icon.className = 'icon icon48 fa-spinner';
+            this._overlay = document.createElement("div");
+            this._overlay.classList.add("spinner");
+            this._overlay.setAttribute("role", "status");
+            const icon = document.createElement("span");
+            icon.className = "icon icon48 fa-spinner";
             this._overlay.appendChild(icon);
-            const title = document.createElement('span');
-            title.textContent = Language.get('wcf.global.loading');
+            const title = document.createElement("span");
+            title.textContent = Language.get("wcf.global.loading");
             this._overlay.appendChild(title);
             document.body.appendChild(this._overlay);
         }
@@ -31,7 +31,7 @@ define(["require", "exports", "tslib", "../Language"], function (require, export
             if (this._timer === null) {
                 this._timer = window.setTimeout(() => {
                     if (this._activeRequests) {
-                        this._overlay.classList.add('active');
+                        this._overlay.classList.add("active");
                     }
                     this._timer = null;
                 }, 250);
@@ -42,7 +42,7 @@ define(["require", "exports", "tslib", "../Language"], function (require, export
                 if (this._timer !== null) {
                     window.clearTimeout(this._timer);
                 }
-                this._overlay.classList.remove('active');
+                this._overlay.classList.remove("active");
             }
         }
     }
index e5672e85ad67b88c607bf485b11b5ee810ae610f..d4ac2d666be3e6b7bc2c095b19cc008f17fb1b90 100644 (file)
@@ -60,7 +60,7 @@ define(["require", "exports", "tslib", "./Ajax"], function (require, exports, ts
      */
     function invoke() {
         if (!queue) {
-            console.error('The background queue has not been initialized yet.');
+            console.error("The background queue has not been initialized yet.");
             return;
         }
         queue.invoke();
index 26cdf99eb78f16e965d31276409cec9d5d284515..865d610d1f28b54926fdc16761d893d535793034 100644 (file)
@@ -17,8 +17,8 @@ define(["require", "exports"], function (require, exports) {
          * Adds a callback for given identifier.
          */
         add(identifier, callback) {
-            if (typeof callback !== 'function') {
-                throw new TypeError('Expected a valid callback as second argument for identifier \'' + identifier + '\'.');
+            if (typeof callback !== "function") {
+                throw new TypeError("Expected a valid callback as second argument for identifier '" + identifier + "'.");
             }
             if (!this._callbacks.has(identifier)) {
                 this._callbacks.set(identifier, []);
index 78affbbe196ef2be54e9e208c614af01e45cf29b..db9825c9b5e11b348334c5c9fa46393fd8fdb402 100644 (file)
@@ -122,24 +122,24 @@ define(["require", "exports"], function (require, exports) {
     function hexToRgb(hex) {
         if (/^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(hex)) {
             // only convert #abc and #abcdef
-            const parts = hex.split('');
+            const parts = hex.split("");
             // drop the hashtag
-            if (parts[0] === '#') {
+            if (parts[0] === "#") {
                 parts.shift();
             }
             // parse shorthand #xyz
             if (parts.length === 3) {
                 return {
-                    r: parseInt(parts[0] + '' + parts[0], 16),
-                    g: parseInt(parts[1] + '' + parts[1], 16),
-                    b: parseInt(parts[2] + '' + parts[2], 16),
+                    r: parseInt(parts[0] + "" + parts[0], 16),
+                    g: parseInt(parts[1] + "" + parts[1], 16),
+                    b: parseInt(parts[2] + "" + parts[2], 16),
                 };
             }
             else {
                 return {
-                    r: parseInt(parts[0] + '' + parts[1], 16),
-                    g: parseInt(parts[2] + '' + parts[3], 16),
-                    b: parseInt(parts[4] + '' + parts[5], 16),
+                    r: parseInt(parts[0] + "" + parts[1], 16),
+                    g: parseInt(parts[2] + "" + parts[3], 16),
+                    b: parseInt(parts[4] + "" + parts[5], 16),
                 };
             }
         }
@@ -152,7 +152,7 @@ define(["require", "exports"], function (require, exports) {
      * @see  http://www.linuxtopia.org/online_books/javascript_guides/javascript_faq/rgbtohex.htm
      */
     function rgbToHex(r, g, b) {
-        const charList = '0123456789ABCDEF';
+        const charList = "0123456789ABCDEF";
         if (g === undefined) {
             if (r.toString().match(/^rgba?\((\d+), ?(\d+), ?(\d+)(?:, ?[0-9.]+)?\)$/)) {
                 r = +RegExp.$1;
@@ -160,7 +160,13 @@ define(["require", "exports"], function (require, exports) {
                 b = +RegExp.$3;
             }
         }
-        return (charList.charAt((r - r % 16) / 16) + '' + charList.charAt(r % 16)) + '' + (charList.charAt((g - g % 16) / 16) + '' + charList.charAt(g % 16)) + '' + (charList.charAt((b - b % 16) / 16) + '' + charList.charAt(b % 16));
+        return (charList.charAt((r - (r % 16)) / 16) +
+            "" +
+            charList.charAt(r % 16) +
+            "" +
+            (charList.charAt((g - (g % 16)) / 16) + "" + charList.charAt(g % 16)) +
+            "" +
+            (charList.charAt((b - (b % 16)) / 16) + "" + charList.charAt(b % 16)));
     }
     exports.rgbToHex = rgbToHex;
     // WCF.ColorPicker compatibility (color format conversion)
index d573f8f08c4ccb8c017b37372d86cac94e9a41c2..6de797b09ebd953304bedf404aad30b6ccf68302 100644 (file)
@@ -12,7 +12,7 @@ define(["require", "exports"], function (require, exports) {
     Object.defineProperty(exports, "__esModule", { value: true });
     exports.debounce = exports.stringToBool = exports.getStoragePrefix = exports.triggerEvent = exports.serialize = exports.getUuid = exports.getType = exports.isPlainObject = exports.inherit = exports.extend = exports.convertLegacyUrl = exports.clone = void 0;
     const _clone = function (variable) {
-        if (typeof variable === 'object' && (Array.isArray(variable) || isPlainObject(variable))) {
+        if (typeof variable === "object" && (Array.isArray(variable) || isPlainObject(variable))) {
             return _cloneObject(variable);
         }
         return variable;
@@ -25,10 +25,10 @@ define(["require", "exports"], function (require, exports) {
             return obj.slice();
         }
         const newObj = {};
-        Object.keys(obj).forEach(key => newObj[key] = _clone(obj[key]));
+        Object.keys(obj).forEach((key) => (newObj[key] = _clone(obj[key])));
         return newObj;
     };
-    const _prefix = 'wsc' + window.WCF_PATH.hashCode() + '-';
+    const _prefix = "wsc" + window.WCF_PATH.hashCode() + "-";
     /**
      * Deep clones an object.
      */
@@ -42,12 +42,12 @@ define(["require", "exports"], function (require, exports) {
     function convertLegacyUrl(url) {
         return url.replace(/^index\.php\/(.*?)\/\?/, (match, controller) => {
             const parts = controller.split(/([A-Z][a-z0-9]+)/);
-            controller = '';
+            controller = "";
             for (let i = 0, length = parts.length; i < length; i++) {
                 const part = parts[i].trim();
                 if (part.length) {
                     if (controller.length)
-                        controller += '-';
+                        controller += "-";
                     controller += part.toLowerCase();
                 }
             }
@@ -71,7 +71,7 @@ define(["require", "exports"], function (require, exports) {
                 continue;
             for (const key in obj) {
                 if (obj.hasOwnProperty(key)) {
-                    if (!Array.isArray(obj[key]) && typeof obj[key] === 'object') {
+                    if (!Array.isArray(obj[key]) && typeof obj[key] === "object") {
                         if (isPlainObject(obj[key])) {
                             // object literals have the prototype of Object which in return has no parent prototype
                             newObj[key] = extend(out[key], obj[key]);
@@ -111,13 +111,13 @@ define(["require", "exports"], function (require, exports) {
      */
     function inherit(constructor, superConstructor, propertiesObject) {
         if (constructor === undefined || constructor === null) {
-            throw new TypeError('The constructor must not be undefined or null.');
+            throw new TypeError("The constructor must not be undefined or null.");
         }
         if (superConstructor === undefined || superConstructor === null) {
-            throw new TypeError('The super constructor must not be undefined or null.');
+            throw new TypeError("The super constructor must not be undefined or null.");
         }
         if (superConstructor.prototype === undefined) {
-            throw new TypeError('The super constructor must have a prototype.');
+            throw new TypeError("The super constructor must have a prototype.");
         }
         constructor._super = superConstructor;
         constructor.prototype = extend(Object.create(superConstructor.prototype, {
@@ -134,17 +134,17 @@ define(["require", "exports"], function (require, exports) {
      * Returns true if `obj` is an object literal.
      */
     function isPlainObject(obj) {
-        if (typeof obj !== 'object' || obj === null || obj.nodeType) {
+        if (typeof obj !== "object" || obj === null || obj.nodeType) {
             return false;
         }
-        return (Object.getPrototypeOf(obj) === Object.prototype);
+        return Object.getPrototypeOf(obj) === Object.prototype;
     }
     exports.isPlainObject = isPlainObject;
     /**
      * Returns the object's class name.
      */
     function getType(obj) {
-        return Object.prototype.toString.call(obj).replace(/^\[object (.+)]$/, '$1');
+        return Object.prototype.toString.call(obj).replace(/^\[object (.+)]$/, "$1");
     }
     exports.getType = getType;
     /**
@@ -153,8 +153,8 @@ define(["require", "exports"], function (require, exports) {
      * @see    http://stackoverflow.com/a/2117523
      */
     function getUuid() {
-        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
-            const r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
+        return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
+            const r = (Math.random() * 16) | 0, v = c == "x" ? r : (r & 0x3) | 0x8;
             return v.toString(16);
         });
     }
@@ -166,17 +166,17 @@ define(["require", "exports"], function (require, exports) {
         let parameters = [];
         for (const key in obj) {
             if (obj.hasOwnProperty(key)) {
-                const parameterKey = (prefix) ? prefix + '[' + key + ']' : key;
+                const parameterKey = prefix ? prefix + "[" + key + "]" : key;
                 const value = obj[key];
-                if (typeof value === 'object') {
+                if (typeof value === "object") {
                     parameters.push(serialize(value, parameterKey));
                 }
                 else {
-                    parameters.push(encodeURIComponent(parameterKey) + '=' + encodeURIComponent(value));
+                    parameters.push(encodeURIComponent(parameterKey) + "=" + encodeURIComponent(value));
                 }
             }
         }
-        return parameters.join('&');
+        return parameters.join("&");
     }
     exports.serialize = serialize;
     /**
@@ -202,7 +202,7 @@ define(["require", "exports"], function (require, exports) {
      * legacy functions `elAttrBool()` and `elDataBool()`.
      */
     function stringToBool(value) {
-        return value === '1' || value === 'true';
+        return value === "1" || value === "true";
     }
     exports.stringToBool = stringToBool;
     /**
index ef1e3234ad4400412cba30e4417aefc1dbb1cdda..060e4cb53bd35cfae339cf01563b9350748df884 100644 (file)
@@ -40,120 +40,120 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
         if (_datePicker !== null) {
             return;
         }
-        _datePicker = document.createElement('div');
-        _datePicker.className = 'datePicker';
-        _datePicker.addEventListener('click', event => {
+        _datePicker = document.createElement("div");
+        _datePicker.className = "datePicker";
+        _datePicker.addEventListener("click", (event) => {
             event.stopPropagation();
         });
-        const header = document.createElement('header');
+        const header = document.createElement("header");
         _datePicker.appendChild(header);
-        _dateMonthPrevious = document.createElement('a');
-        _dateMonthPrevious.className = 'previous jsTooltip';
-        _dateMonthPrevious.href = '#';
-        _dateMonthPrevious.setAttribute('role', 'button');
+        _dateMonthPrevious = document.createElement("a");
+        _dateMonthPrevious.className = "previous jsTooltip";
+        _dateMonthPrevious.href = "#";
+        _dateMonthPrevious.setAttribute("role", "button");
         _dateMonthPrevious.tabIndex = 0;
-        _dateMonthPrevious.title = Language.get('wcf.date.datePicker.previousMonth');
-        _dateMonthPrevious.setAttribute('aria-label', Language.get('wcf.date.datePicker.previousMonth'));
+        _dateMonthPrevious.title = Language.get("wcf.date.datePicker.previousMonth");
+        _dateMonthPrevious.setAttribute("aria-label", Language.get("wcf.date.datePicker.previousMonth"));
         _dateMonthPrevious.innerHTML = '<span class="icon icon16 fa-arrow-left"></span>';
-        _dateMonthPrevious.addEventListener('click', DatePicker.previousMonth);
+        _dateMonthPrevious.addEventListener("click", DatePicker.previousMonth);
         header.appendChild(_dateMonthPrevious);
-        const monthYearContainer = document.createElement('span');
+        const monthYearContainer = document.createElement("span");
         header.appendChild(monthYearContainer);
-        _dateMonth = document.createElement('select');
-        _dateMonth.className = 'month jsTooltip';
-        _dateMonth.title = Language.get('wcf.date.datePicker.month');
-        _dateMonth.setAttribute('aria-label', Language.get('wcf.date.datePicker.month'));
-        _dateMonth.addEventListener('change', changeMonth);
+        _dateMonth = document.createElement("select");
+        _dateMonth.className = "month jsTooltip";
+        _dateMonth.title = Language.get("wcf.date.datePicker.month");
+        _dateMonth.setAttribute("aria-label", Language.get("wcf.date.datePicker.month"));
+        _dateMonth.addEventListener("change", changeMonth);
         monthYearContainer.appendChild(_dateMonth);
-        let months = '';
-        const monthNames = Language.get('__monthsShort');
+        let months = "";
+        const monthNames = Language.get("__monthsShort");
         for (let i = 0; i < 12; i++) {
-            months += '<option value="' + i + '">' + monthNames[i] + '</option>';
+            months += '<option value="' + i + '">' + monthNames[i] + "</option>";
         }
         _dateMonth.innerHTML = months;
-        _dateYear = document.createElement('select');
-        _dateYear.className = 'year jsTooltip';
-        _dateYear.title = Language.get('wcf.date.datePicker.year');
-        _dateYear.setAttribute('aria-label', Language.get('wcf.date.datePicker.year'));
-        _dateYear.addEventListener('change', changeYear);
+        _dateYear = document.createElement("select");
+        _dateYear.className = "year jsTooltip";
+        _dateYear.title = Language.get("wcf.date.datePicker.year");
+        _dateYear.setAttribute("aria-label", Language.get("wcf.date.datePicker.year"));
+        _dateYear.addEventListener("change", changeYear);
         monthYearContainer.appendChild(_dateYear);
-        _dateMonthNext = document.createElement('a');
-        _dateMonthNext.className = 'next jsTooltip';
-        _dateMonthNext.href = '#';
-        _dateMonthNext.setAttribute('role', 'button');
+        _dateMonthNext = document.createElement("a");
+        _dateMonthNext.className = "next jsTooltip";
+        _dateMonthNext.href = "#";
+        _dateMonthNext.setAttribute("role", "button");
         _dateMonthNext.tabIndex = 0;
-        _dateMonthNext.title = Language.get('wcf.date.datePicker.nextMonth');
-        _dateMonthNext.setAttribute('aria-label', Language.get('wcf.date.datePicker.nextMonth'));
+        _dateMonthNext.title = Language.get("wcf.date.datePicker.nextMonth");
+        _dateMonthNext.setAttribute("aria-label", Language.get("wcf.date.datePicker.nextMonth"));
         _dateMonthNext.innerHTML = '<span class="icon icon16 fa-arrow-right"></span>';
-        _dateMonthNext.addEventListener('click', DatePicker.nextMonth);
+        _dateMonthNext.addEventListener("click", DatePicker.nextMonth);
         header.appendChild(_dateMonthNext);
-        _dateGrid = document.createElement('ul');
+        _dateGrid = document.createElement("ul");
         _datePicker.appendChild(_dateGrid);
-        const item = document.createElement('li');
-        item.className = 'weekdays';
+        const item = document.createElement("li");
+        item.className = "weekdays";
         _dateGrid.appendChild(item);
-        const weekdays = Language.get('__daysShort');
+        const weekdays = Language.get("__daysShort");
         for (let i = 0; i < 7; i++) {
             let day = i + _firstDayOfWeek;
             if (day > 6)
                 day -= 7;
-            const span = document.createElement('span');
+            const span = document.createElement("span");
             span.textContent = weekdays[day];
             item.appendChild(span);
         }
         // create date grid
         for (let i = 0; i < 6; i++) {
-            const row = document.createElement('li');
+            const row = document.createElement("li");
             _dateGrid.appendChild(row);
             for (let j = 0; j < 7; j++) {
-                const cell = document.createElement('a');
-                cell.addEventListener('click', click);
+                const cell = document.createElement("a");
+                cell.addEventListener("click", click);
                 _dateCells.push(cell);
                 row.appendChild(cell);
             }
         }
-        _dateTime = document.createElement('footer');
+        _dateTime = document.createElement("footer");
         _datePicker.appendChild(_dateTime);
-        _dateHour = document.createElement('select');
-        _dateHour.className = 'hour';
-        _dateHour.title = Language.get('wcf.date.datePicker.hour');
-        _dateHour.setAttribute('aria-label', Language.get('wcf.date.datePicker.hour'));
-        _dateHour.addEventListener('change', formatValue);
+        _dateHour = document.createElement("select");
+        _dateHour.className = "hour";
+        _dateHour.title = Language.get("wcf.date.datePicker.hour");
+        _dateHour.setAttribute("aria-label", Language.get("wcf.date.datePicker.hour"));
+        _dateHour.addEventListener("change", formatValue);
         const date = new Date(2000, 0, 1);
-        const timeFormat = Language.get('wcf.date.timeFormat').replace(/:/, '').replace(/[isu]/g, '');
-        let tmp = '';
+        const timeFormat = Language.get("wcf.date.timeFormat").replace(/:/, "").replace(/[isu]/g, "");
+        let tmp = "";
         for (let i = 0; i < 24; i++) {
             date.setHours(i);
             tmp += '<option value="' + i + '">' + DateUtil.format(date, timeFormat) + "</option>";
         }
         _dateHour.innerHTML = tmp;
         _dateTime.appendChild(_dateHour);
-        _dateTime.appendChild(document.createTextNode('\u00A0:\u00A0'));
-        _dateMinute = document.createElement('select');
-        _dateMinute.className = 'minute';
-        _dateMinute.title = Language.get('wcf.date.datePicker.minute');
-        _dateMinute.setAttribute('aria-label', Language.get('wcf.date.datePicker.minute'));
-        _dateMinute.addEventListener('change', formatValue);
-        tmp = '';
+        _dateTime.appendChild(document.createTextNode("\u00A0:\u00A0"));
+        _dateMinute = document.createElement("select");
+        _dateMinute.className = "minute";
+        _dateMinute.title = Language.get("wcf.date.datePicker.minute");
+        _dateMinute.setAttribute("aria-label", Language.get("wcf.date.datePicker.minute"));
+        _dateMinute.addEventListener("change", formatValue);
+        tmp = "";
         for (let i = 0; i < 60; i++) {
-            tmp += '<option value="' + i + '">' + (i < 10 ? '0' + i.toString() : i) + '</option>';
+            tmp += '<option value="' + i + '">' + (i < 10 ? "0" + i.toString() : i) + "</option>";
         }
         _dateMinute.innerHTML = tmp;
         _dateTime.appendChild(_dateMinute);
         document.body.appendChild(_datePicker);
-        document.body.addEventListener('focus', maintainFocus, { capture: true });
+        document.body.addEventListener("focus", maintainFocus, { capture: true });
     }
     /**
      * Initializes the minimum/maximum date range.
      */
     function initDateRange(element, now, isMinDate) {
-        const name = isMinDate ? 'minDate' : 'maxDate';
-        let value = (element.dataset[name] || '').trim();
+        const name = isMinDate ? "minDate" : "maxDate";
+        let value = (element.dataset[name] || "").trim();
         if (value.match(/^(\d{4})-(\d{2})-(\d{2})$/)) {
             // YYYY-mm-dd
             value = new Date(value).getTime().toString();
         }
-        else if (value === 'now') {
+        else if (value === "now") {
             value = now.getTime().toString();
         }
         else if (value.match(/^\d{1,3}$/)) {
@@ -173,7 +173,7 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
             value = new Date(value).getTime().toString();
         }
         else {
-            value = new Date((isMinDate ? 1902 : 2038), 0, 1).getTime().toString();
+            value = new Date(isMinDate ? 1902 : 2038, 0, 1).getTime().toString();
         }
         element.dataset[name] = value;
     }
@@ -184,18 +184,18 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
         if (_didInit)
             return;
         _didInit = true;
-        _firstDayOfWeek = parseInt(Language.get('wcf.date.firstDayOfTheWeek'), 10);
-        Listener_1.default.add('WoltLabSuite/Core/Date/Picker', DatePicker.init);
-        CloseOverlay_1.default.add('WoltLabSuite/Core/Date/Picker', close);
+        _firstDayOfWeek = parseInt(Language.get("wcf.date.firstDayOfTheWeek"), 10);
+        Listener_1.default.add("WoltLabSuite/Core/Date/Picker", DatePicker.init);
+        CloseOverlay_1.default.add("WoltLabSuite/Core/Date/Picker", close);
     }
     function getDateValue(attributeName) {
-        let date = _input.dataset[attributeName] || '';
+        let date = _input.dataset[attributeName] || "";
         if (date.match(/^datePicker-(.+)$/)) {
             const referenceElement = document.getElementById(RegExp.$1);
             if (referenceElement === null) {
                 throw new Error(`Unable to find an element with the id '${RegExp.$1}'.`);
             }
-            date = referenceElement.dataset.value || '';
+            date = referenceElement.dataset.value || "";
         }
         return new Date(parseInt(date, 10));
     }
@@ -207,16 +207,16 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
         event.stopPropagation();
         createPicker();
         const target = event.currentTarget;
-        const input = (target.nodeName === 'INPUT') ? target : target.previousElementSibling;
+        const input = target.nodeName === "INPUT" ? target : target.previousElementSibling;
         if (input === _input) {
             close();
             return;
         }
-        const dialogContent = input.closest('.dialogContent');
+        const dialogContent = input.closest(".dialogContent");
         if (dialogContent !== null) {
-            if (!Core.stringToBool(dialogContent.dataset.hasDatepickerScrollListener || '')) {
-                dialogContent.addEventListener('scroll', onDialogScroll);
-                dialogContent.dataset.hasDatepickerScrollListener = '1';
+            if (!Core.stringToBool(dialogContent.dataset.hasDatepickerScrollListener || "")) {
+                dialogContent.addEventListener("scroll", onDialogScroll);
+                dialogContent.dataset.hasDatepickerScrollListener = "1";
             }
         }
         _input = input;
@@ -225,7 +225,7 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
         let date;
         if (value) {
             date = new Date(parseInt(value, 10));
-            if (date.toString() === 'Invalid Date') {
+            if (date.toString() === "Invalid Date") {
                 date = new Date();
             }
         }
@@ -233,40 +233,40 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
             date = new Date();
         }
         // set min/max date
-        _minDate = getDateValue('minDate');
+        _minDate = getDateValue("minDate");
         if (_minDate.getTime() > date.getTime()) {
             date = _minDate;
         }
-        _maxDate = getDateValue('maxDate');
+        _maxDate = getDateValue("maxDate");
         if (data.isDateTime) {
             _dateHour.value = date.getHours().toString();
             _dateMinute.value = date.getMinutes().toString();
-            _datePicker.classList.add('datePickerTime');
+            _datePicker.classList.add("datePickerTime");
         }
         else {
-            _datePicker.classList.remove('datePickerTime');
+            _datePicker.classList.remove("datePickerTime");
         }
-        _datePicker.classList[(data.isTimeOnly) ? 'add' : 'remove']('datePickerTimeOnly');
+        _datePicker.classList[data.isTimeOnly ? "add" : "remove"]("datePickerTimeOnly");
         renderPicker(date.getDate(), date.getMonth(), date.getFullYear());
         UiAlignment.set(_datePicker, _input);
-        _input.nextElementSibling.setAttribute('aria-expanded', 'true');
+        _input.nextElementSibling.setAttribute("aria-expanded", "true");
         _wasInsidePicker = false;
     }
     /**
      * Closes the date picker.
      */
     function close() {
-        if (_datePicker === null || !_datePicker.classList.contains('active')) {
+        if (_datePicker === null || !_datePicker.classList.contains("active")) {
             return;
         }
-        _datePicker.classList.remove('active');
+        _datePicker.classList.remove("active");
         const data = _data.get(_input);
-        if (typeof data.onClose === 'function') {
+        if (typeof data.onClose === "function") {
             data.onClose();
         }
-        EventHandler.fire('WoltLabSuite/Core/Date/Picker', 'close', { element: _input });
+        EventHandler.fire("WoltLabSuite/Core/Date/Picker", "close", { element: _input });
         const sibling = _input.nextElementSibling;
-        sibling.setAttribute('aria-expanded', 'false');
+        sibling.setAttribute("aria-expanded", "false");
         _input = null;
     }
     /**
@@ -307,33 +307,33 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
     function renderPicker(day, month, year) {
         renderGrid(day, month, year);
         // create options for month and year
-        let years = '';
+        let years = "";
         for (let i = _minDate.getFullYear(), last = _maxDate.getFullYear(); i <= last; i++) {
-            years += '<option value="' + i + '">' + i + '</option>';
+            years += '<option value="' + i + '">' + i + "</option>";
         }
         _dateYear.innerHTML = years;
         _dateYear.value = year.toString();
         _dateMonth.value = month.toString();
-        _datePicker.classList.add('active');
+        _datePicker.classList.add("active");
     }
     /**
      * Updates the date grid.
      */
     function renderGrid(day, month, year) {
-        const hasDay = (day !== undefined);
-        const hasMonth = (month !== undefined);
-        if (typeof day !== 'number') {
-            day = parseInt(day || _dateGrid.dataset.day || '0', 10);
+        const hasDay = day !== undefined;
+        const hasMonth = month !== undefined;
+        if (typeof day !== "number") {
+            day = parseInt(day || _dateGrid.dataset.day || "0", 10);
         }
-        if (typeof month !== 'number') {
-            month = parseInt(month || '0', 10);
+        if (typeof month !== "number") {
+            month = parseInt(month || "0", 10);
         }
-        if (typeof year !== 'number') {
-            year = parseInt(year || '0', 10);
+        if (typeof year !== "number") {
+            year = parseInt(year || "0", 10);
         }
         // rebuild cells
         if (hasMonth || year) {
-            let rebuildMonths = (year !== 0);
+            let rebuildMonths = year !== 0;
             // rebuild grid
             const fragment = document.createDocumentFragment();
             fragment.appendChild(_dateGrid);
@@ -344,7 +344,7 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
                 year = parseInt(_dateGrid.dataset.year, 10);
             }
             // check if current selection exceeds min/max date
-            let date = new Date(year + '-' + ('0' + (month + 1).toString()).slice(-2) + '-' + ('0' + day.toString()).slice(-2));
+            let date = new Date(year + "-" + ("0" + (month + 1).toString()).slice(-2) + "-" + ("0" + day.toString()).slice(-2));
             if (date < _minDate) {
                 year = _minDate.getFullYear();
                 month = _minDate.getMonth();
@@ -361,7 +361,7 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
                 _dateYear.value = year.toString();
                 rebuildMonths = true;
             }
-            date = new Date(year + '-' + ('0' + (month + 1).toString()).slice(-2) + '-01');
+            date = new Date(year + "-" + ("0" + (month + 1).toString()).slice(-2) + "-01");
             // shift until first displayed day equals first day of week
             while (date.getDay() !== _firstDayOfWeek) {
                 date.setDate(date.getDate() - 1);
@@ -378,20 +378,20 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
                 }
                 const cell = _dateCells[i];
                 cell.textContent = date.getDate().toString();
-                selectable = (date.getMonth() === month);
+                selectable = date.getMonth() === month;
                 if (selectable) {
                     if (date < comparableMinDate)
                         selectable = false;
                     else if (date > _maxDate)
                         selectable = false;
                 }
-                cell.classList[selectable ? 'remove' : 'add']('otherMonth');
+                cell.classList[selectable ? "remove" : "add"]("otherMonth");
                 if (selectable) {
-                    cell.href = '#';
-                    cell.setAttribute('role', 'button');
+                    cell.href = "#";
+                    cell.setAttribute("role", "button");
                     cell.tabIndex = 0;
                     cell.title = DateUtil.formatDate(date);
-                    cell.setAttribute('aria-label', DateUtil.formatDate(date));
+                    cell.setAttribute("aria-label", DateUtil.formatDate(date));
                 }
                 date.setDate(date.getDate() + 1);
             }
@@ -411,21 +411,23 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
             if (rebuildMonths) {
                 for (let i = 0; i < 12; i++) {
                     const currentMonth = _dateMonth.children[i];
-                    currentMonth.disabled = (year === _minDate.getFullYear() && +currentMonth.value < _minDate.getMonth()) || (year === _maxDate.getFullYear() && +currentMonth.value > _maxDate.getMonth());
+                    currentMonth.disabled =
+                        (year === _minDate.getFullYear() && +currentMonth.value < _minDate.getMonth()) ||
+                            (year === _maxDate.getFullYear() && +currentMonth.value > _maxDate.getMonth());
                 }
-                const nextMonth = new Date(year + '-' + ('0' + (month + 1).toString()).slice(-2) + '-01');
+                const nextMonth = new Date(year + "-" + ("0" + (month + 1).toString()).slice(-2) + "-01");
                 nextMonth.setMonth(nextMonth.getMonth() + 1);
-                _dateMonthNext.classList[(nextMonth < _maxDate) ? 'add' : 'remove']('active');
-                const previousMonth = new Date(year + '-' + ('0' + (month + 1).toString()).slice(-2) + '-01');
+                _dateMonthNext.classList[nextMonth < _maxDate ? "add" : "remove"]("active");
+                const previousMonth = new Date(year + "-" + ("0" + (month + 1).toString()).slice(-2) + "-01");
                 previousMonth.setDate(previousMonth.getDate() - 1);
-                _dateMonthPrevious.classList[(previousMonth > _minDate) ? 'add' : 'remove']('active');
+                _dateMonthPrevious.classList[previousMonth > _minDate ? "add" : "remove"]("active");
             }
         }
         // update active day
         if (day) {
             for (let i = 0; i < 35; i++) {
                 const cell = _dateCells[i];
-                cell.classList[(!cell.classList.contains('otherMonth') && +cell.textContent === day) ? 'add' : 'remove']('active');
+                cell.classList[!cell.classList.contains("otherMonth") && +cell.textContent === day ? "add" : "remove"]("active");
             }
             _dateGrid.dataset.day = day.toString();
         }
@@ -437,7 +439,7 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
     function formatValue() {
         const data = _data.get(_input);
         let date;
-        if (Core.stringToBool(_input.dataset.empty || '')) {
+        if (Core.stringToBool(_input.dataset.empty || "")) {
             return;
         }
         if (data.isDateTime) {
@@ -468,10 +470,10 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
     function click(event) {
         event.preventDefault();
         const target = event.currentTarget;
-        if (target.classList.contains('otherMonth')) {
+        if (target.classList.contains("otherMonth")) {
             return;
         }
-        _input.dataset.empty = 'false';
+        _input.dataset.empty = "false";
         renderGrid(+target.textContent);
         const data = _data.get(_input);
         if (!data.isDateTime) {
@@ -482,16 +484,16 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
      * Validates given element or id if it represents an active date picker.
      */
     function getElement(element) {
-        if (typeof element === 'string') {
+        if (typeof element === "string") {
             element = document.getElementById(element);
         }
-        if (!(element instanceof HTMLInputElement) || !element.classList.contains('inputDatePicker') || !_data.has(element)) {
+        if (!(element instanceof HTMLInputElement) || !element.classList.contains("inputDatePicker") || !_data.has(element)) {
             throw new Error("Expected a valid date picker input element or id.");
         }
         return element;
     }
     function maintainFocus(event) {
-        if (_datePicker === null || !_datePicker.classList.contains('active')) {
+        if (_datePicker === null || !_datePicker.classList.contains("active")) {
             return;
         }
         if (!_datePicker.contains(event.target)) {
@@ -501,7 +503,7 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
                 _wasInsidePicker = false;
             }
             else {
-                _datePicker.querySelector('.previous').focus();
+                _datePicker.querySelector(".previous").focus();
             }
         }
         else {
@@ -515,16 +517,18 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
         init() {
             setup();
             const now = new Date();
-            document.querySelectorAll('input[type="date"]:not(.inputDatePicker), input[type="datetime"]:not(.inputDatePicker)').forEach(element => {
-                element.classList.add('inputDatePicker');
+            document
+                .querySelectorAll('input[type="date"]:not(.inputDatePicker), input[type="datetime"]:not(.inputDatePicker)')
+                .forEach((element) => {
+                element.classList.add("inputDatePicker");
                 element.readOnly = true;
-                const isDateTime = (element.type === 'datetime');
-                const isTimeOnly = isDateTime && Core.stringToBool(element.dataset.timeOnly || '');
-                const disableClear = Core.stringToBool(element.dataset.disableClear || '');
-                const ignoreTimezone = isDateTime && Core.stringToBool(element.dataset.ignoreTimezone || '');
-                const isBirthday = element.classList.contains('birthday');
-                element.dataset.isDateTime = isDateTime ? 'true' : 'false';
-                element.dataset.isTimeOnly = isTimeOnly ? 'true' : 'false';
+                const isDateTime = element.type === "datetime";
+                const isTimeOnly = isDateTime && Core.stringToBool(element.dataset.timeOnly || "");
+                const disableClear = Core.stringToBool(element.dataset.disableClear || "");
+                const ignoreTimezone = isDateTime && Core.stringToBool(element.dataset.ignoreTimezone || "");
+                const isBirthday = element.classList.contains("birthday");
+                element.dataset.isDateTime = isDateTime ? "true" : "false";
+                element.dataset.isTimeOnly = isTimeOnly ? "true" : "false";
                 // convert value
                 let date = null;
                 let value = element.value;
@@ -533,21 +537,21 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
                 if (value) {
                     if (isTimeOnly) {
                         date = new Date();
-                        const tmp = value.split(':');
+                        const tmp = value.split(":");
                         date.setHours(+tmp[0], +tmp[1]);
                     }
                     else {
                         if (ignoreTimezone || isBirthday || isDateOnly) {
                             let timezoneOffset = new Date(value).getTimezoneOffset();
-                            let timezone = (timezoneOffset > 0) ? '-' : '+'; // -120 equals GMT+0200
+                            let timezone = timezoneOffset > 0 ? "-" : "+"; // -120 equals GMT+0200
                             timezoneOffset = Math.abs(timezoneOffset);
-                            const hours = (Math.floor(timezoneOffset / 60)).toString();
+                            const hours = Math.floor(timezoneOffset / 60).toString();
                             const minutes = (timezoneOffset % 60).toString();
-                            timezone += (hours.length === 2) ? hours : '0' + hours;
-                            timezone += ':';
-                            timezone += (minutes.length === 2) ? minutes : '0' + minutes;
+                            timezone += hours.length === 2 ? hours : "0" + hours;
+                            timezone += ":";
+                            timezone += minutes.length === 2 ? minutes : "0" + minutes;
                             if (isBirthday || isDateOnly) {
-                                value += 'T00:00:00' + timezone;
+                                value += "T00:00:00" + timezone;
                             }
                             else {
                                 value = value.replace(/[+-][0-9]{2}:[0-9]{2}$/, timezone);
@@ -558,20 +562,20 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
                     const time = date.getTime();
                     // check for invalid dates
                     if (isNaN(time)) {
-                        value = '';
+                        value = "";
                     }
                     else {
                         element.dataset.value = time.toString();
-                        const format = (isTimeOnly) ? 'formatTime' : ('formatDate' + (isDateTime ? 'Time' : ''));
+                        const format = isTimeOnly ? "formatTime" : "formatDate" + (isDateTime ? "Time" : "");
                         value = DateUtil[format](date);
                     }
                 }
-                const isEmpty = (value.length === 0);
+                const isEmpty = value.length === 0;
                 // handle birthday input
                 if (isBirthday) {
-                    element.dataset.minDate = '120';
-                    // do not use 'now' here, all though it makes sense, it causes bad UX 
-                    element.dataset.maxDate = new Date().getFullYear() + '-12-31';
+                    element.dataset.minDate = "120";
+                    // do not use 'now' here, all though it makes sense, it causes bad UX
+                    element.dataset.maxDate = new Date().getFullYear() + "-12-31";
                 }
                 else {
                     if (element.min) {
@@ -583,71 +587,71 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
                 }
                 initDateRange(element, now, true);
                 initDateRange(element, now, false);
-                if ((element.dataset.minDate || '') === (element.dataset.maxDate || '')) {
+                if ((element.dataset.minDate || "") === (element.dataset.maxDate || "")) {
                     throw new Error("Minimum and maximum date cannot be the same (element id '" + element.id + "').");
                 }
                 // change type to prevent browser's datepicker to trigger
-                element.type = 'text';
+                element.type = "text";
                 element.value = value;
-                element.dataset.empty = isEmpty ? 'true' : 'false';
-                const placeholder = element.dataset.placeholder || '';
+                element.dataset.empty = isEmpty ? "true" : "false";
+                const placeholder = element.dataset.placeholder || "";
                 if (placeholder) {
                     element.placeholder = placeholder;
                 }
                 // add a hidden element to hold the actual date
-                const shadowElement = document.createElement('input');
-                shadowElement.id = element.id + 'DatePicker';
+                const shadowElement = document.createElement("input");
+                shadowElement.id = element.id + "DatePicker";
                 shadowElement.name = element.name;
-                shadowElement.type = 'hidden';
+                shadowElement.type = "hidden";
                 if (date !== null) {
                     if (isTimeOnly) {
-                        shadowElement.value = DateUtil.format(date, 'H:i');
+                        shadowElement.value = DateUtil.format(date, "H:i");
                     }
                     else if (ignoreTimezone) {
-                        shadowElement.value = DateUtil.format(date, 'Y-m-dTH:i:s');
+                        shadowElement.value = DateUtil.format(date, "Y-m-dTH:i:s");
                     }
                     else {
-                        shadowElement.value = DateUtil.format(date, (isDateTime) ? 'c' : 'Y-m-d');
+                        shadowElement.value = DateUtil.format(date, isDateTime ? "c" : "Y-m-d");
                     }
                 }
                 element.parentNode.insertBefore(shadowElement, element);
-                element.removeAttribute('name');
-                element.addEventListener('click', open);
+                element.removeAttribute("name");
+                element.addEventListener("click", open);
                 let clearButton = null;
                 if (!element.disabled) {
                     // create input addon
-                    const container = document.createElement('div');
-                    container.className = 'inputAddon';
-                    clearButton = document.createElement('a');
-                    clearButton.className = 'inputSuffix button jsTooltip';
-                    clearButton.href = '#';
-                    clearButton.setAttribute('role', 'button');
+                    const container = document.createElement("div");
+                    container.className = "inputAddon";
+                    clearButton = document.createElement("a");
+                    clearButton.className = "inputSuffix button jsTooltip";
+                    clearButton.href = "#";
+                    clearButton.setAttribute("role", "button");
                     clearButton.tabIndex = 0;
-                    clearButton.title = Language.get('wcf.date.datePicker');
-                    clearButton.setAttribute('aria-label', Language.get('wcf.date.datePicker'));
-                    clearButton.setAttribute('aria-haspopup', 'true');
-                    clearButton.setAttribute('aria-expanded', 'false');
-                    clearButton.addEventListener('click', open);
+                    clearButton.title = Language.get("wcf.date.datePicker");
+                    clearButton.setAttribute("aria-label", Language.get("wcf.date.datePicker"));
+                    clearButton.setAttribute("aria-haspopup", "true");
+                    clearButton.setAttribute("aria-expanded", "false");
+                    clearButton.addEventListener("click", open);
                     container.appendChild(clearButton);
-                    let icon = document.createElement('span');
-                    icon.className = 'icon icon16 fa-calendar';
+                    let icon = document.createElement("span");
+                    icon.className = "icon icon16 fa-calendar";
                     clearButton.appendChild(icon);
                     element.parentNode.insertBefore(container, element);
                     container.insertBefore(element, clearButton);
                     if (!disableClear) {
-                        const button = document.createElement('a');
-                        button.className = 'inputSuffix button';
-                        button.addEventListener('click', this.clear.bind(this, element));
+                        const button = document.createElement("a");
+                        button.className = "inputSuffix button";
+                        button.addEventListener("click", this.clear.bind(this, element));
                         if (isEmpty)
-                            button.style.setProperty('visibility', 'hidden', '');
+                            button.style.setProperty("visibility", "hidden", "");
                         container.appendChild(button);
-                        icon = document.createElement('span');
-                        icon.className = 'icon icon16 fa-times';
+                        icon = document.createElement("span");
+                        icon.className = "icon icon16 fa-times";
                         button.appendChild(icon);
                     }
                 }
                 // check if the date input has one of the following classes set otherwise default to 'short'
-                const knownClasses = ['tiny', 'short', 'medium', 'long'];
+                const knownClasses = ["tiny", "short", "medium", "long"];
                 let hasClass = false;
                 for (let j = 0; j < 4; j++) {
                     if (element.classList.contains(knownClasses[j])) {
@@ -655,7 +659,7 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
                     }
                 }
                 if (!hasClass) {
-                    element.classList.add('short');
+                    element.classList.add("short");
                 }
                 _data.set(element, {
                     clearButton,
@@ -674,8 +678,8 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
          */
         previousMonth(event) {
             event.preventDefault();
-            if (_dateMonth.value === '0') {
-                _dateMonth.value = '11';
+            if (_dateMonth.value === "0") {
+                _dateMonth.value = "11";
                 _dateYear.value = (+_dateYear.value - 1).toString();
             }
             else {
@@ -688,8 +692,8 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
          */
         nextMonth(event) {
             event.preventDefault();
-            if (_dateMonth.value === '11') {
-                _dateMonth.value = '0';
+            if (_dateMonth.value === "11") {
+                _dateMonth.value = "0";
                 _dateYear.value = (+_dateYear.value + 1).toString();
             }
             else {
@@ -702,7 +706,7 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
          */
         getDate(element) {
             element = getElement(element);
-            const value = element.dataset.value || '';
+            const value = element.dataset.value || "";
             if (value) {
                 return new Date(+value);
             }
@@ -718,31 +722,31 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
             element = getElement(element);
             const data = _data.get(element);
             element.dataset.value = date.getTime().toString();
-            let format = '';
+            let format = "";
             let value;
             if (data.isDateTime) {
                 if (data.isTimeOnly) {
                     value = DateUtil.formatTime(date);
-                    format = 'H:i';
+                    format = "H:i";
                 }
                 else if (data.ignoreTimezone) {
                     value = DateUtil.formatDateTime(date);
-                    format = 'Y-m-dTH:i:s';
+                    format = "Y-m-dTH:i:s";
                 }
                 else {
                     value = DateUtil.formatDateTime(date);
-                    format = 'c';
+                    format = "c";
                 }
             }
             else {
                 value = DateUtil.formatDate(date);
-                format = 'Y-m-d';
+                format = "Y-m-d";
             }
             element.value = value;
             data.shadow.value = DateUtil.format(date, format);
             // show clear button
             if (!data.disableClear) {
-                data.clearButton.style.removeProperty('visibility');
+                data.clearButton.style.removeProperty("visibility");
             }
         },
         /**
@@ -754,7 +758,7 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
             if (data) {
                 return data.shadow.value;
             }
-            return '';
+            return "";
         },
         /**
          * Clears the date value of given element.
@@ -762,13 +766,13 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
         clear(element) {
             element = getElement(element);
             const data = _data.get(element);
-            element.removeAttribute('data-value');
-            element.value = '';
+            element.removeAttribute("data-value");
+            element.value = "";
             if (!data.disableClear) {
-                data.clearButton.style.setProperty('visibility', 'hidden', '');
+                data.clearButton.style.setProperty("visibility", "hidden", "");
             }
             data.isEmpty = true;
-            data.shadow.value = '';
+            data.shadow.value = "";
         },
         /**
          * Reverts the date picker into a normal input field.
@@ -779,13 +783,13 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
             const container = element.parentNode;
             container.parentNode.insertBefore(element, container);
             container.remove();
-            element.type = 'date' + (data.isDateTime ? 'time' : '');
+            element.type = "date" + (data.isDateTime ? "time" : "");
             element.name = data.shadow.name;
             element.value = data.shadow.value;
-            element.removeAttribute('data-value');
-            element.removeEventListener('click', open);
+            element.removeAttribute("data-value");
+            element.removeEventListener("click", open);
             data.shadow.remove();
-            element.classList.remove('inputDatePicker');
+            element.classList.remove("inputDatePicker");
             element.readOnly = false;
             _data.delete(element);
         },
index 7b1084f621d647abc21f970251a8aef471f3fa87..dd3eb78ac59f8b57e771b16dbc915c09516a9bca 100644 (file)
@@ -44,12 +44,12 @@ define(["require", "exports", "tslib", "../../Core", "../Util", "../../Dom/Chang
         const timestamp = (date.getTime() - date.getMilliseconds()) / 1000;
         if (_offset === null)
             _offset = timestamp - window.TIME_NOW;
-        document.querySelectorAll('time').forEach(element => {
+        document.querySelectorAll("time").forEach((element) => {
             rebuild(element, date, timestamp);
         });
     }
     function rebuild(element, date, timestamp) {
-        if (!element.classList.contains('datetime') || Core.stringToBool(element.dataset.isFutureDate || '')) {
+        if (!element.classList.contains("datetime") || Core.stringToBool(element.dataset.isFutureDate || "")) {
             return;
         }
         const elTimestamp = parseInt(element.dataset.timestamp, 10) + _offset;
@@ -57,35 +57,39 @@ define(["require", "exports", "tslib", "../../Core", "../Util", "../../Dom/Chang
         const elTime = element.dataset.time;
         const elOffset = element.dataset.offset;
         if (!element.title) {
-            element.title = Language.get('wcf.date.dateTimeFormat').replace(/%date%/, elDate).replace(/%time%/, elTime);
+            element.title = Language.get("wcf.date.dateTimeFormat")
+                .replace(/%date%/, elDate)
+                .replace(/%time%/, elTime);
         }
         // timestamp is less than 60 seconds ago
-        if (elTimestamp >= timestamp || timestamp < (elTimestamp + 60)) {
-            element.textContent = Language.get('wcf.date.relative.now');
+        if (elTimestamp >= timestamp || timestamp < elTimestamp + 60) {
+            element.textContent = Language.get("wcf.date.relative.now");
         }
         // timestamp is less than 60 minutes ago (display 1 hour ago rather than 60 minutes ago)
-        else if (timestamp < (elTimestamp + 3540)) {
+        else if (timestamp < elTimestamp + 3540) {
             const minutes = Math.max(Math.round((timestamp - elTimestamp) / 60), 1);
-            element.textContent = Language.get('wcf.date.relative.minutes', { minutes: minutes });
+            element.textContent = Language.get("wcf.date.relative.minutes", { minutes: minutes });
         }
         // timestamp is less than 24 hours ago
-        else if (timestamp < (elTimestamp + 86400)) {
+        else if (timestamp < elTimestamp + 86400) {
             const hours = Math.round((timestamp - elTimestamp) / 3600);
-            element.textContent = Language.get('wcf.date.relative.hours', { hours: hours });
+            element.textContent = Language.get("wcf.date.relative.hours", { hours: hours });
         }
         // timestamp is less than 6 days ago
-        else if (timestamp < (elTimestamp + 518400)) {
+        else if (timestamp < elTimestamp + 518400) {
             const midnight = new Date(date.getFullYear(), date.getMonth(), date.getDate());
             const days = Math.ceil((midnight.getTime() / 1000 - elTimestamp) / 86400);
             // get day of week
-            const dateObj = DateUtil.getTimezoneDate((elTimestamp * 1000), parseInt(elOffset, 10) * 1000);
+            const dateObj = DateUtil.getTimezoneDate(elTimestamp * 1000, parseInt(elOffset, 10) * 1000);
             const dow = dateObj.getDay();
-            const day = Language.get('__days')[dow];
-            element.textContent = Language.get('wcf.date.relative.pastDays', { days: days, day: day, time: elTime });
+            const day = Language.get("__days")[dow];
+            element.textContent = Language.get("wcf.date.relative.pastDays", { days: days, day: day, time: elTime });
         }
         // timestamp is between ~700 million years BC and last week
         else {
-            element.textContent = Language.get('wcf.date.shortDateTimeFormat').replace(/%date%/, elDate).replace(/%time%/, elTime);
+            element.textContent = Language.get("wcf.date.shortDateTimeFormat")
+                .replace(/%date%/, elDate)
+                .replace(/%time%/, elTime);
         }
     }
     /**
@@ -93,8 +97,8 @@ define(["require", "exports", "tslib", "../../Core", "../Util", "../../Dom/Chang
      */
     function setup() {
         new Repeating_1.default(refresh, 60000);
-        Listener_1.default.add('WoltLabSuite/Core/Date/Time/Relative', refresh);
-        document.addEventListener('visibilitychange', onVisibilityChange);
+        Listener_1.default.add("WoltLabSuite/Core/Date/Time/Relative", refresh);
+        document.addEventListener("visibilitychange", onVisibilityChange);
     }
     exports.setup = setup;
 });
index ea1bf0aed10e2df94f0a91cbd3a150a40319f689..d3bea93f384fa73ea528e483867a1104be9f3b41 100644 (file)
@@ -16,23 +16,23 @@ define(["require", "exports", "tslib", "../Language"], function (require, export
      * Returns the formatted date.
      */
     function formatDate(date) {
-        return format(date, Language.get('wcf.date.dateFormat'));
+        return format(date, Language.get("wcf.date.dateFormat"));
     }
     exports.formatDate = formatDate;
     /**
      * Returns the formatted time.
      */
     function formatTime(date) {
-        return format(date, Language.get('wcf.date.timeFormat'));
+        return format(date, Language.get("wcf.date.timeFormat"));
     }
     exports.formatTime = formatTime;
     /**
      * Returns the formatted date time.
      */
     function formatDateTime(date) {
-        const dateTimeFormat = Language.get('wcf.date.dateTimeFormat');
-        const dateFormat = Language.get('wcf.date.dateFormat');
-        const timeFormat = Language.get('wcf.date.timeFormat');
+        const dateTimeFormat = Language.get("wcf.date.dateTimeFormat");
+        const dateFormat = Language.get("wcf.date.dateFormat");
+        const timeFormat = Language.get("wcf.date.timeFormat");
         return format(date, dateTimeFormat.replace(/%date%/, dateFormat).replace(/%time%/, timeFormat));
     }
     exports.formatDateTime = formatDateTime;
@@ -41,128 +41,128 @@ define(["require", "exports", "tslib", "../Language"], function (require, export
      */
     function format(date, format) {
         let char;
-        let out = '';
+        let out = "";
         // ISO 8601 date, best recognition by PHP's strtotime()
-        if (format === 'c') {
-            format = 'Y-m-dTH:i:sP';
+        if (format === "c") {
+            format = "Y-m-dTH:i:sP";
         }
         for (let i = 0, length = format.length; i < length; i++) {
             let hours;
             switch (format[i]) {
                 // seconds
-                case 's':
+                case "s":
                     // `00` through `59`
-                    char = ('0' + date.getSeconds().toString()).slice(-2);
+                    char = ("0" + date.getSeconds().toString()).slice(-2);
                     break;
                 // minutes
-                case 'i':
+                case "i":
                     // `00` through `59`
-                    char = date.getMinutes().toString().padStart(2, '0');
+                    char = date.getMinutes().toString().padStart(2, "0");
                     break;
                 // hours
-                case 'a':
+                case "a":
                     // `am` or `pm`
-                    char = (date.getHours() > 11) ? 'pm' : 'am';
+                    char = date.getHours() > 11 ? "pm" : "am";
                     break;
-                case 'g':
+                case "g":
                     // `1` through `12`
                     hours = date.getHours();
                     if (hours === 0)
-                        char = '12';
+                        char = "12";
                     else if (hours > 12)
                         char = (hours - 12).toString();
                     else
                         char = hours.toString();
                     break;
-                case 'h':
+                case "h":
                     // `01` through `12`
                     hours = date.getHours();
                     if (hours === 0)
-                        char = '12';
+                        char = "12";
                     else if (hours > 12)
                         char = (hours - 12).toString();
                     else
                         char = hours.toString();
-                    char = char.padStart(2, '0');
+                    char = char.padStart(2, "0");
                     break;
-                case 'A':
+                case "A":
                     // `AM` or `PM`
-                    char = (date.getHours() > 11) ? 'PM' : 'AM';
+                    char = date.getHours() > 11 ? "PM" : "AM";
                     break;
-                case 'G':
+                case "G":
                     // `0` through `23`
                     char = date.getHours().toString();
                     break;
-                case 'H':
+                case "H":
                     // `00` through `23`
-                    char = date.getHours().toString().padStart(2, '0');
+                    char = date.getHours().toString().padStart(2, "0");
                     break;
                 // day
-                case 'd':
+                case "d":
                     // `01` through `31`
-                    char = date.getDate().toString().padStart(2, '0');
+                    char = date.getDate().toString().padStart(2, "0");
                     break;
-                case 'j':
+                case "j":
                     // `1` through `31`
                     char = date.getDate().toString();
                     break;
-                case 'l':
+                case "l":
                     // `Monday` through `Sunday` (localized)
-                    char = Language.get('__days')[date.getDay()];
+                    char = Language.get("__days")[date.getDay()];
                     break;
-                case 'D':
+                case "D":
                     // `Mon` through `Sun` (localized)
-                    char = Language.get('__daysShort')[date.getDay()];
+                    char = Language.get("__daysShort")[date.getDay()];
                     break;
-                case 'S':
+                case "S":
                     // ignore english ordinal suffix
-                    char = '';
+                    char = "";
                     break;
                 // month
-                case 'm':
+                case "m":
                     // `01` through `12`
-                    char = (date.getMonth() + 1).toString().padStart(2, '0');
+                    char = (date.getMonth() + 1).toString().padStart(2, "0");
                     break;
-                case 'n':
+                case "n":
                     // `1` through `12`
                     char = (date.getMonth() + 1).toString();
                     break;
-                case 'F':
+                case "F":
                     // `January` through `December` (localized)
-                    char = Language.get('__months')[date.getMonth()];
+                    char = Language.get("__months")[date.getMonth()];
                     break;
-                case 'M':
+                case "M":
                     // `Jan` through `Dec` (localized)
-                    char = Language.get('__monthsShort')[date.getMonth()];
+                    char = Language.get("__monthsShort")[date.getMonth()];
                     break;
                 // year
-                case 'y':
+                case "y":
                     // `00` through `99`
                     char = date.getFullYear().toString().substr(2);
                     break;
-                case 'Y':
+                case "Y":
                     // Examples: `1988` or `2015`
                     char = date.getFullYear().toString();
                     break;
                 // timezone
-                case 'P':
+                case "P":
                     let offset = date.getTimezoneOffset();
-                    char = (offset > 0) ? '-' : '+';
+                    char = offset > 0 ? "-" : "+";
                     offset = Math.abs(offset);
-                    char += ('0' + (~~(offset / 60)).toString()).slice(-2);
-                    char += ':';
-                    char += ('0' + (offset % 60).toString()).slice(-2);
+                    char += ("0" + (~~(offset / 60)).toString()).slice(-2);
+                    char += ":";
+                    char += ("0" + (offset % 60).toString()).slice(-2);
                     break;
                 // specials
-                case 'r':
+                case "r":
                     char = date.toString();
                     break;
-                case 'U':
+                case "U":
                     char = Math.round(date.getTime() / 1000).toString();
                     break;
                 // escape sequence
-                case '\\':
-                    char = '';
+                case "\\":
+                    char = "";
                     if (i + 1 < length) {
                         char = format[++i];
                     }
@@ -195,20 +195,20 @@ define(["require", "exports", "tslib", "../Language"], function (require, export
      * (for dates not in the future) after the DOM change listener has been triggered.
      */
     function getTimeElement(date) {
-        const time = document.createElement('time');
-        time.className = 'datetime';
+        const time = document.createElement("time");
+        time.className = "datetime";
         const formattedDate = formatDate(date);
         const formattedTime = formatTime(date);
-        time.setAttribute('datetime', format(date, 'c'));
+        time.setAttribute("datetime", format(date, "c"));
         time.dataset.timestamp = ((date.getTime() - date.getMilliseconds()) / 1000).toString();
         time.dataset.date = formattedDate;
         time.dataset.time = formattedTime;
         time.dataset.offset = (date.getTimezoneOffset() * 60).toString(); // PHP returns minutes, JavaScript returns seconds
         if (date.getTime() > Date.now()) {
-            time.dataset.isFutureDate = 'true';
-            time.textContent = Language.get('wcf.date.dateTimeFormat')
-                .replace('%time%', formattedTime)
-                .replace('%date%', formattedDate);
+            time.dataset.isFutureDate = "true";
+            time.textContent = Language.get("wcf.date.dateTimeFormat")
+                .replace("%time%", formattedTime)
+                .replace("%date%", formattedDate);
         }
         return time;
     }
@@ -219,7 +219,7 @@ define(["require", "exports", "tslib", "../Language"], function (require, export
     function getTimezoneDate(timestamp, offset) {
         const date = new Date(timestamp);
         const localOffset = date.getTimezoneOffset() * 60000;
-        return new Date((timestamp + localOffset + offset));
+        return new Date(timestamp + localOffset + offset);
     }
     exports.getTimezoneDate = getTimezoneDate;
 });
index 68df46636c01e5da30c399fedab7ee2ebacfbb07..b6261f969a927d2b77796c349767d5fba713d4dc 100644 (file)
@@ -15,7 +15,7 @@ define(["require", "exports"], function (require, exports) {
     };
     function _updateConfig() {
         if (window.sessionStorage) {
-            window.sessionStorage.setItem('__wsc_devtools_config', JSON.stringify(_settings));
+            window.sessionStorage.setItem("__wsc_devtools_config", JSON.stringify(_settings));
         }
     }
     const Devtools = {
@@ -23,18 +23,18 @@ define(["require", "exports"], function (require, exports) {
          * Prints the list of available commands.
          */
         help() {
-            window.console.log('');
-            window.console.log('%cAvailable commands:', 'text-decoration: underline');
+            window.console.log("");
+            window.console.log("%cAvailable commands:", "text-decoration: underline");
             const commands = [];
             for (const cmd in Devtools) {
-                if (cmd !== '_internal_' && Devtools.hasOwnProperty(cmd)) {
+                if (cmd !== "_internal_" && Devtools.hasOwnProperty(cmd)) {
                     commands.push(cmd);
                 }
             }
             commands.sort().forEach(function (cmd) {
-                window.console.log('\tDevtools.' + cmd + '()');
+                window.console.log("\tDevtools." + cmd + "()");
             });
-            window.console.log('');
+            window.console.log("");
         },
         /**
          * Disables/re-enables the editor autosave feature.
@@ -42,7 +42,7 @@ define(["require", "exports"], function (require, exports) {
         toggleEditorAutosave(forceDisable) {
             _settings.editorAutosave = forceDisable ? false : !_settings.editorAutosave;
             _updateConfig();
-            window.console.log('%c\tEditor autosave ' + (_settings.editorAutosave ? 'enabled' : 'disabled'), 'font-style: italic');
+            window.console.log("%c\tEditor autosave " + (_settings.editorAutosave ? "enabled" : "disabled"), "font-style: italic");
         },
         /**
          * Enables/disables logging for fired event listener events.
@@ -50,7 +50,7 @@ define(["require", "exports"], function (require, exports) {
         toggleEventLogging(forceEnable) {
             _settings.eventLogging = forceEnable ? true : !_settings.eventLogging;
             _updateConfig();
-            window.console.log('%c\tEvent logging ' + (_settings.eventLogging ? 'enabled' : 'disabled'), 'font-style: italic');
+            window.console.log("%c\tEvent logging " + (_settings.eventLogging ? "enabled" : "disabled"), "font-style: italic");
         },
         /**
          * Internal methods not meant to be called directly.
@@ -58,30 +58,29 @@ define(["require", "exports"], function (require, exports) {
         _internal_: {
             enable() {
                 window.Devtools = Devtools;
-                window.console.log('%cDevtools for WoltLab Suite loaded', 'font-weight: bold');
+                window.console.log("%cDevtools for WoltLab Suite loaded", "font-weight: bold");
                 if (window.sessionStorage) {
-                    const settings = window.sessionStorage.getItem('__wsc_devtools_config');
+                    const settings = window.sessionStorage.getItem("__wsc_devtools_config");
                     try {
                         if (settings !== null) {
                             _settings = JSON.parse(settings);
                         }
                     }
-                    catch (e) {
-                    }
+                    catch (e) { }
                     if (!_settings.editorAutosave)
                         Devtools.toggleEditorAutosave(true);
                     if (_settings.eventLogging)
                         Devtools.toggleEventLogging(true);
                 }
-                window.console.log('Settings are saved per browser session, enter `Devtools.help()` to learn more.');
-                window.console.log('');
+                window.console.log("Settings are saved per browser session, enter `Devtools.help()` to learn more.");
+                window.console.log("");
             },
             editorAutosave() {
                 return _settings.editorAutosave;
             },
             eventLog(identifier, action) {
                 if (_settings.eventLogging) {
-                    window.console.log('[Devtools.EventLogging] Firing event: ' + action + ' @ ' + identifier);
+                    window.console.log("[Devtools.EventLogging] Firing event: " + action + " @ " + identifier);
                 }
             },
         },
index 5df7bc9b827ec3dcb51857da099a1f0f5e1f96da..701cdd6429c106afc3d1299655a8917aa0aed2cb 100644 (file)
@@ -48,8 +48,8 @@ define(["require", "exports"], function (require, exports) {
          * value as first parameter and the key name second.
          */
         forEach(callback) {
-            if (typeof callback !== 'function') {
-                throw new TypeError('forEach() expects a callback as first parameter.');
+            if (typeof callback !== "function") {
+                throw new TypeError("forEach() expects a callback as first parameter.");
             }
             this._dictionary.forEach(callback);
         }
@@ -67,7 +67,7 @@ define(["require", "exports"], function (require, exports) {
          */
         toObject() {
             const object = {};
-            this._dictionary.forEach((value, key) => object[key] = value);
+            this._dictionary.forEach((value, key) => (object[key] = value));
             return object;
         }
         /**
index 650d6dbf0594fdb1884f020b9948614a9c9e362d..ff18fab5d6b709b03462b94eca7592b73b3b46e9 100644 (file)
@@ -33,7 +33,7 @@ define(["require", "exports", "tslib", "../../CallbackList"], function (require,
                 return;
             try {
                 _hot = true;
-                _callbackList.forEach(null, callback => callback());
+                _callbackList.forEach(null, (callback) => callback());
             }
             finally {
                 _hot = false;
index 82e7a72887bf369d9dd223746219c8b389d393ca..0bafff9d39371150e94dd80a2305db00d50a8bdb 100644 (file)
@@ -19,7 +19,7 @@ define(["require", "exports"], function (require, exports) {
     ]);
     function _getChildren(element, type, value) {
         if (!(element instanceof Element)) {
-            throw new TypeError('Expected a valid element as first argument.');
+            throw new TypeError("Expected a valid element as first argument.");
         }
         const children = [];
         for (let i = 0; i < element.childElementCount; i++) {
@@ -31,7 +31,7 @@ define(["require", "exports"], function (require, exports) {
     }
     function _getParent(element, type, value, untilElement) {
         if (!(element instanceof Element)) {
-            throw new TypeError('Expected a valid element as first argument.');
+            throw new TypeError("Expected a valid element as first argument.");
         }
         let target = element.parentNode;
         while (target instanceof Element) {
@@ -47,7 +47,7 @@ define(["require", "exports"], function (require, exports) {
     }
     function _getSibling(element, siblingType, type, value) {
         if (!(element instanceof Element)) {
-            throw new TypeError('Expected a valid element as first argument.');
+            throw new TypeError("Expected a valid element as first argument.");
         }
         if (element instanceof Element) {
             if (element[siblingType] !== null && _test.get(type)(element[siblingType], value)) {
@@ -125,28 +125,28 @@ define(["require", "exports"], function (require, exports) {
      * @deprecated 5.4 Use `element.nextElementSibling` instead.
      */
     function next(element) {
-        return _getSibling(element, 'nextElementSibling', 0 /* None */, '');
+        return _getSibling(element, "nextElementSibling", 0 /* None */, "");
     }
     exports.next = next;
     /**
      * Returns the next element sibling that matches the given selector.
      */
     function nextBySel(element, selector) {
-        return _getSibling(element, 'nextElementSibling', 1 /* Selector */, selector);
+        return _getSibling(element, "nextElementSibling", 1 /* Selector */, selector);
     }
     exports.nextBySel = nextBySel;
     /**
      * Returns the next element sibling with given CSS class.
      */
     function nextByClass(element, className) {
-        return _getSibling(element, 'nextElementSibling', 2 /* ClassName */, className);
+        return _getSibling(element, "nextElementSibling", 2 /* ClassName */, className);
     }
     exports.nextByClass = nextByClass;
     /**
      * Returns the next element sibling with given CSS class.
      */
     function nextByTag(element, tagName) {
-        return _getSibling(element, 'nextElementSibling', 3 /* TagName */, tagName);
+        return _getSibling(element, "nextElementSibling", 3 /* TagName */, tagName);
     }
     exports.nextByTag = nextByTag;
     /**
@@ -155,28 +155,28 @@ define(["require", "exports"], function (require, exports) {
      * @deprecated 5.4 Use `element.previousElementSibling` instead.
      */
     function prev(element) {
-        return _getSibling(element, 'previousElementSibling', 0 /* None */, '');
+        return _getSibling(element, "previousElementSibling", 0 /* None */, "");
     }
     exports.prev = prev;
     /**
      * Returns the previous element sibling that matches the given selector.
      */
     function prevBySel(element, selector) {
-        return _getSibling(element, 'previousElementSibling', 1 /* Selector */, selector);
+        return _getSibling(element, "previousElementSibling", 1 /* Selector */, selector);
     }
     exports.prevBySel = prevBySel;
     /**
      * Returns the previous element sibling with given CSS class.
      */
     function prevByClass(element, className) {
-        return _getSibling(element, 'previousElementSibling', 2 /* ClassName */, className);
+        return _getSibling(element, "previousElementSibling", 2 /* ClassName */, className);
     }
     exports.prevByClass = prevByClass;
     /**
      * Returns the previous element sibling with given CSS class.
      */
     function prevByTag(element, tagName) {
-        return _getSibling(element, 'previousElementSibling', 3 /* TagName */, tagName);
+        return _getSibling(element, "previousElementSibling", 3 /* TagName */, tagName);
     }
     exports.prevByTag = prevByTag;
 });
index c67972dac0a20ef37f42fed247326d3a04df71f2..db7b0ed5501719821ef312d2b7bba12dc9db7642 100644 (file)
@@ -12,19 +12,19 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
     StringUtil = tslib_1.__importStar(StringUtil);
     function _isBoundaryNode(element, ancestor, position) {
         if (!ancestor.contains(element)) {
-            throw new Error('Ancestor element does not contain target element.');
+            throw new Error("Ancestor element does not contain target element.");
         }
         let node;
         let target = element;
-        const whichSibling = position + 'Sibling';
+        const whichSibling = position + "Sibling";
         while (target !== null && target !== ancestor) {
-            if (target[position + 'ElementSibling'] !== null) {
+            if (target[position + "ElementSibling"] !== null) {
                 return false;
             }
             else if (target[whichSibling]) {
                 node = target[whichSibling];
                 while (node) {
-                    if (node.textContent.trim() !== '') {
+                    if (node.textContent.trim() !== "") {
                         return false;
                     }
                     node = node[whichSibling];
@@ -40,7 +40,7 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
          * Returns a DocumentFragment containing the provided HTML string as DOM nodes.
          */
         createFragmentFromHtml(html) {
-            const tmp = document.createElement('div');
+            const tmp = document.createElement("div");
             this.setInnerHtml(tmp, html);
             const fragment = document.createDocumentFragment();
             while (tmp.childNodes.length) {
@@ -54,7 +54,7 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
         getUniqueId() {
             let elementId;
             do {
-                elementId = 'wcf' + _idCounter++;
+                elementId = "wcf" + _idCounter++;
             } while (document.getElementById(elementId) !== null);
             return elementId;
         },
@@ -64,7 +64,7 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
          */
         identify(element) {
             if (!(element instanceof Element)) {
-                throw new TypeError('Expected a valid DOM element as argument.');
+                throw new TypeError("Expected a valid DOM element as argument.");
             }
             let id = element.id;
             if (!id) {
@@ -120,7 +120,7 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
          * @deprecated 5.3 Use `parent.insertAdjacentElement('afterbegin', element)` instead.
          */
         prepend(element, parent) {
-            parent.insertAdjacentElement('afterbegin', element);
+            parent.insertAdjacentElement("afterbegin", element);
         },
         /**
          * Inserts an element after an existing element.
@@ -128,7 +128,7 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
          * @deprecated 5.3 Use `element.insertAdjacentElement('afterend', newElement)` instead.
          */
         insertAfter(newElement, element) {
-            element.insertAdjacentElement('afterend', newElement);
+            element.insertAdjacentElement("afterend", newElement);
         },
         /**
          * Applies a list of CSS properties to an element.
@@ -139,7 +139,7 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
                 if (styles.hasOwnProperty(property)) {
                     if (/ !important$/.test(styles[property])) {
                         important = true;
-                        styles[property] = styles[property].replace(/ !important$/, '');
+                        styles[property] = styles[property].replace(/ !important$/, "");
                     }
                     else {
                         important = false;
@@ -147,10 +147,10 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
                     // for a set style property with priority = important, some browsers are
                     // not able to overwrite it with a property != important; removing the
                     // property first solves this issue
-                    if (element.style.getPropertyPriority(property) === 'important' && !important) {
+                    if (element.style.getPropertyPriority(property) === "important" && !important) {
                         element.style.removeProperty(property);
                     }
-                    element.style.setProperty(property, styles[property], (important ? 'important' : ''));
+                    element.style.setProperty(property, styles[property], important ? "important" : "");
                 }
             }
         },
@@ -176,10 +176,10 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
          */
         setInnerHtml(element, innerHtml) {
             element.innerHTML = innerHtml;
-            const scripts = element.querySelectorAll('script');
+            const scripts = element.querySelectorAll("script");
             for (let i = 0, length = scripts.length; i < length; i++) {
                 const script = scripts[i];
-                const newScript = document.createElement('script');
+                const newScript = document.createElement("script");
                 if (script.src) {
                     newScript.src = script.src;
                 }
@@ -197,30 +197,30 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
          * @param insertMethod
          */
         insertHtml(html, referenceElement, insertMethod) {
-            const element = document.createElement('div');
+            const element = document.createElement("div");
             this.setInnerHtml(element, html);
             if (!element.childNodes.length) {
                 return;
             }
             let node = element.childNodes[0];
             switch (insertMethod) {
-                case 'append':
+                case "append":
                     referenceElement.appendChild(node);
                     break;
-                case 'after':
+                case "after":
                     this.insertAfter(node, referenceElement);
                     break;
-                case 'prepend':
+                case "prepend":
                     this.prepend(node, referenceElement);
                     break;
-                case 'before':
+                case "before":
                     if (referenceElement.parentNode === null) {
-                        throw new Error('The reference element has no parent, but the insert position was set to \'before\'.');
+                        throw new Error("The reference element has no parent, but the insert position was set to 'before'.");
                     }
                     referenceElement.parentNode.insertBefore(node, referenceElement);
                     break;
                 default:
-                    throw new Error('Unknown insert method \'' + insertMethod + '\'.');
+                    throw new Error("Unknown insert method '" + insertMethod + "'.");
             }
             let tmp;
             while (element.childNodes.length) {
@@ -245,23 +245,23 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
          * @deprecated 5.4 Use `element.dataset` instead.
          */
         getDataAttributes(element, prefix, camelCaseName, idToUpperCase) {
-            prefix = prefix || '';
-            if (prefix.indexOf('data-') !== 0)
-                prefix = 'data-' + prefix;
-            camelCaseName = (camelCaseName === true);
-            idToUpperCase = (idToUpperCase === true);
+            prefix = prefix || "";
+            if (prefix.indexOf("data-") !== 0)
+                prefix = "data-" + prefix;
+            camelCaseName = camelCaseName === true;
+            idToUpperCase = idToUpperCase === true;
             const attributes = {};
             for (let i = 0, length = element.attributes.length; i < length; i++) {
                 const attribute = element.attributes[i];
                 if (attribute.name.indexOf(prefix) === 0) {
-                    let name = attribute.name.replace(new RegExp('^' + prefix), '');
+                    let name = attribute.name.replace(new RegExp("^" + prefix), "");
                     if (camelCaseName) {
-                        let tmp = name.split('-');
-                        name = '';
+                        let tmp = name.split("-");
+                        name = "";
                         for (let j = 0, innerLength = tmp.length; j < innerLength; j++) {
                             if (name.length) {
-                                if (idToUpperCase && tmp[j] === 'id') {
-                                    tmp[j] = 'ID';
+                                if (idToUpperCase && tmp[j] === "id") {
+                                    tmp[j] = "ID";
                                 }
                                 else {
                                     tmp[j] = StringUtil.ucfirst(tmp[j]);
@@ -282,7 +282,7 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
          */
         unwrapChildNodes(element) {
             if (element.parentNode === null) {
-                throw new Error('The element has no parent.');
+                throw new Error("The element has no parent.");
             }
             let parent = element.parentNode;
             while (element.childNodes.length) {
@@ -297,7 +297,7 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
          */
         replaceElement(oldElement, newElement) {
             if (oldElement.parentNode === null) {
-                throw new Error('The old element has no parent.');
+                throw new Error("The old element has no parent.");
             }
             while (oldElement.childNodes.length) {
                 newElement.appendChild(oldElement.childNodes[0]);
@@ -310,14 +310,14 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
          * a node without any content nor elements before it or its parent nodes.
          */
         isAtNodeStart(element, ancestor) {
-            return _isBoundaryNode(element, ancestor, 'previous');
+            return _isBoundaryNode(element, ancestor, "previous");
         },
         /**
          * Returns true if given element is the most right node of the ancestor, that is
          * a node without any content nor elements after it or its parent nodes.
          */
         isAtNodeEnd(element, ancestor) {
-            return _isBoundaryNode(element, ancestor, 'next');
+            return _isBoundaryNode(element, ancestor, "next");
         },
         /**
          * Returns the first ancestor element with position fixed or null.
@@ -327,7 +327,7 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
          */
         getFixedParent(element) {
             while (element && element !== document.body) {
-                if (window.getComputedStyle(element).getPropertyValue('position') === 'fixed') {
+                if (window.getComputedStyle(element).getPropertyValue("position") === "fixed") {
                     return element;
                 }
                 element = element.offsetParent;
@@ -338,20 +338,20 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
          * Shorthand function to hide an element by setting its 'display' value to 'none'.
          */
         hide(element) {
-            element.style.setProperty('display', 'none', '');
+            element.style.setProperty("display", "none", "");
         },
         /**
          * Shorthand function to show an element previously hidden by using `hide()`.
          */
         show(element) {
-            element.style.removeProperty('display');
+            element.style.removeProperty("display");
         },
         /**
          * Shorthand function to check if given element is hidden by setting its 'display'
          * value to 'none'.
          */
         isHidden(element) {
-            return element.style.getPropertyValue('display') === 'none';
+            return element.style.getPropertyValue("display") === "none";
         },
         /**
          * Displays or removes an error message below the provided element.
@@ -359,35 +359,35 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
         innerError(element, errorMessage, isHtml) {
             const parent = element.parentNode;
             if (parent === null) {
-                throw new Error('Only elements that have a parent element or document are valid.');
+                throw new Error("Only elements that have a parent element or document are valid.");
             }
-            if (typeof errorMessage !== 'string') {
+            if (typeof errorMessage !== "string") {
                 if (!errorMessage) {
-                    errorMessage = '';
+                    errorMessage = "";
                 }
                 else {
-                    throw new TypeError('The error message must be a string; `false`, `null` or `undefined` can be used as a substitute for an empty string.');
+                    throw new TypeError("The error message must be a string; `false`, `null` or `undefined` can be used as a substitute for an empty string.");
                 }
             }
             let innerError = element.nextElementSibling;
-            if (innerError === null || innerError.nodeName !== 'SMALL' || !innerError.classList.contains('innerError')) {
-                if (errorMessage === '') {
+            if (innerError === null || innerError.nodeName !== "SMALL" || !innerError.classList.contains("innerError")) {
+                if (errorMessage === "") {
                     innerError = null;
                 }
                 else {
-                    innerError = document.createElement('small');
-                    innerError.className = 'innerError';
+                    innerError = document.createElement("small");
+                    innerError.className = "innerError";
                     parent.insertBefore(innerError, element.nextSibling);
                 }
             }
-            if (errorMessage === '') {
+            if (errorMessage === "") {
                 if (innerError !== null) {
                     innerError.remove();
                     innerError = null;
                 }
             }
             else {
-                innerError[isHtml ? 'innerHTML' : 'textContent'] = errorMessage;
+                innerError[isHtml ? "innerHTML" : "textContent"] = errorMessage;
             }
             return innerError;
         },
index 47556c8bb36d39d456704a744b8073aea2a1c0a1..e0d52104aed46a4daef23f9de3c259faf37e8955 100644 (file)
@@ -11,59 +11,62 @@ define(["require", "exports"], function (require, exports) {
     "use strict";
     Object.defineProperty(exports, "__esModule", { value: true });
     exports.touch = exports.platform = exports.editor = exports.browser = exports.setup = void 0;
-    let _browser = 'other';
-    let _editor = 'none';
-    let _platform = 'desktop';
+    let _browser = "other";
+    let _editor = "none";
+    let _platform = "desktop";
     let _touch = false;
     /**
      * Determines environment variables.
      */
     function setup() {
-        if (typeof window.chrome === 'object') {
+        if (typeof window.chrome === "object") {
             // this detects Opera as well, we could check for window.opr if we need to
-            _browser = 'chrome';
+            _browser = "chrome";
         }
         else {
             const styles = window.getComputedStyle(document.documentElement);
             for (let i = 0, length = styles.length; i < length; i++) {
                 const property = styles[i];
-                if (property.indexOf('-ms-') === 0) {
+                if (property.indexOf("-ms-") === 0) {
                     // it is tempting to use 'msie', but it wouldn't really represent 'Edge'
-                    _browser = 'microsoft';
+                    _browser = "microsoft";
                 }
-                else if (property.indexOf('-moz-') === 0) {
-                    _browser = 'firefox';
+                else if (property.indexOf("-moz-") === 0) {
+                    _browser = "firefox";
                 }
-                else if (_browser !== 'firefox' && property.indexOf('-webkit-') === 0) {
-                    _browser = 'safari';
+                else if (_browser !== "firefox" && property.indexOf("-webkit-") === 0) {
+                    _browser = "safari";
                 }
             }
         }
         const ua = window.navigator.userAgent.toLowerCase();
-        if (ua.indexOf('crios') !== -1) {
-            _browser = 'chrome';
-            _platform = 'ios';
+        if (ua.indexOf("crios") !== -1) {
+            _browser = "chrome";
+            _platform = "ios";
         }
         else if (/(?:iphone|ipad|ipod)/.test(ua)) {
-            _browser = 'safari';
-            _platform = 'ios';
+            _browser = "safari";
+            _platform = "ios";
         }
-        else if (ua.indexOf('android') !== -1) {
-            _platform = 'android';
+        else if (ua.indexOf("android") !== -1) {
+            _platform = "android";
         }
-        else if (ua.indexOf('iemobile') !== -1) {
-            _browser = 'microsoft';
-            _platform = 'windows';
+        else if (ua.indexOf("iemobile") !== -1) {
+            _browser = "microsoft";
+            _platform = "windows";
         }
-        if (_platform === 'desktop' && (ua.indexOf('mobile') !== -1 || ua.indexOf('tablet') !== -1)) {
-            _platform = 'mobile';
+        if (_platform === "desktop" && (ua.indexOf("mobile") !== -1 || ua.indexOf("tablet") !== -1)) {
+            _platform = "mobile";
         }
-        _editor = 'redactor';
-        _touch = (('ontouchstart' in window) || (('msMaxTouchPoints' in window.navigator) && window.navigator.msMaxTouchPoints > 0) || window.DocumentTouch && document instanceof window.DocumentTouch);
+        _editor = "redactor";
+        _touch =
+            "ontouchstart" in window ||
+                ("msMaxTouchPoints" in window.navigator && window.navigator.msMaxTouchPoints > 0) ||
+                (window.DocumentTouch && document instanceof window.DocumentTouch);
         // The iPad Pro 12.9" masquerades as a desktop browser.
-        if (window.navigator.platform === 'MacIntel' && window.navigator.maxTouchPoints > 1) {
-            _browser = 'safari';
-            _platform = 'ios';
+        if (window.navigator.platform === "MacIntel" && window.navigator.maxTouchPoints > 1) {
+            _browser = "safari";
+            _platform = "ios";
         }
     }
     exports.setup = setup;
index 5e4084fd6e21fc8549d364299ff24e9869d5788a..86097c6837d1cf6b2d4e0cd6319ed6664710ab34 100644 (file)
@@ -18,7 +18,7 @@ define(["require", "exports", "tslib", "../Core", "../Devtools"], function (requ
      * Registers an event listener.
      */
     function add(identifier, action, callback) {
-        if (typeof callback !== 'function') {
+        if (typeof callback !== "function") {
             throw new TypeError(`Expected a valid callback for '${action}'@'${identifier}'.`);
         }
         let actions = _listeners.get(identifier);
@@ -43,7 +43,8 @@ define(["require", "exports", "tslib", "../Core", "../Devtools"], function (requ
         var _a, _b;
         Devtools_1.default._internal_.eventLog(identifier, action);
         data = data || {};
-        (_b = (_a = _listeners.get(identifier)) === null || _a === void 0 ? void 0 : _a.get(action)) === null || _b === void 0 ? void 0 : _b.forEach(callback => callback(data));
+        (_b = (_a = _listeners
+            .get(identifier)) === null || _a === void 0 ? void 0 : _a.get(action)) === null || _b === void 0 ? void 0 : _b.forEach((callback) => callback(data));
     }
     exports.fire = fire;
     /**
@@ -59,7 +60,7 @@ define(["require", "exports", "tslib", "../Core", "../Devtools"], function (requ
      * remove all listeners for this identifier.
      */
     function removeAll(identifier, action) {
-        if (typeof action !== 'string')
+        if (typeof action !== "string")
             action = undefined;
         const actions = _listeners.get(identifier);
         if (actions === undefined) {
@@ -82,7 +83,7 @@ define(["require", "exports", "tslib", "../Core", "../Devtools"], function (requ
         if (actions === undefined) {
             return;
         }
-        suffix = '_' + suffix;
+        suffix = "_" + suffix;
         const length = suffix.length * -1;
         actions.forEach((callbacks, action) => {
             if (action.substr(length) === suffix) {
index 5af747fd2dec2068a22d4e558036dc5378089bad..8e5f6c57b2c98bcc011cd9e96374a5e5ea03873f 100644 (file)
@@ -24,7 +24,7 @@ define(["require", "exports"], function (require, exports) {
      * @deprecated 5.4 Use `event.key === "ArrowDown"` instead.
      */
     function ArrowDown(event) {
-        return _test(event, 'ArrowDown', 40);
+        return _test(event, "ArrowDown", 40);
     }
     exports.ArrowDown = ArrowDown;
     /**
@@ -33,7 +33,7 @@ define(["require", "exports"], function (require, exports) {
      * @deprecated 5.4 Use `event.key === "ArrowLeft"` instead.
      */
     function ArrowLeft(event) {
-        return _test(event, 'ArrowLeft', 37);
+        return _test(event, "ArrowLeft", 37);
     }
     exports.ArrowLeft = ArrowLeft;
     /**
@@ -42,7 +42,7 @@ define(["require", "exports"], function (require, exports) {
      * @deprecated 5.4 Use `event.key === "ArrowRight"` instead.
      */
     function ArrowRight(event) {
-        return _test(event, 'ArrowRight', 39);
+        return _test(event, "ArrowRight", 39);
     }
     exports.ArrowRight = ArrowRight;
     /**
@@ -51,7 +51,7 @@ define(["require", "exports"], function (require, exports) {
      * @deprecated 5.4 Use `event.key === "ArrowUp"` instead.
      */
     function ArrowUp(event) {
-        return _test(event, 'ArrowUp', 38);
+        return _test(event, "ArrowUp", 38);
     }
     exports.ArrowUp = ArrowUp;
     /**
@@ -60,7 +60,7 @@ define(["require", "exports"], function (require, exports) {
      * @deprecated 5.4 Use `event.key === ","` instead.
      */
     function Comma(event) {
-        return _test(event, ',', 44);
+        return _test(event, ",", 44);
     }
     exports.Comma = Comma;
     /**
@@ -69,7 +69,7 @@ define(["require", "exports"], function (require, exports) {
      * @deprecated 5.4 Use `event.key === "End"` instead.
      */
     function End(event) {
-        return _test(event, 'End', 35);
+        return _test(event, "End", 35);
     }
     exports.End = End;
     /**
@@ -78,7 +78,7 @@ define(["require", "exports"], function (require, exports) {
      * @deprecated 5.4 Use `event.key === "Enter"` instead.
      */
     function Enter(event) {
-        return _test(event, 'Enter', 13);
+        return _test(event, "Enter", 13);
     }
     exports.Enter = Enter;
     /**
@@ -87,7 +87,7 @@ define(["require", "exports"], function (require, exports) {
      * @deprecated 5.4 Use `event.key === "Escape"` instead.
      */
     function Escape(event) {
-        return _test(event, 'Escape', 27);
+        return _test(event, "Escape", 27);
     }
     exports.Escape = Escape;
     /**
@@ -96,7 +96,7 @@ define(["require", "exports"], function (require, exports) {
      * @deprecated 5.4 Use `event.key === "Home"` instead.
      */
     function Home(event) {
-        return _test(event, 'Home', 36);
+        return _test(event, "Home", 36);
     }
     exports.Home = Home;
     /**
@@ -105,7 +105,7 @@ define(["require", "exports"], function (require, exports) {
      * @deprecated 5.4 Use `event.key === "Space"` instead.
      */
     function Space(event) {
-        return _test(event, 'Space', 32);
+        return _test(event, "Space", 32);
     }
     exports.Space = Space;
     /**
@@ -114,7 +114,7 @@ define(["require", "exports"], function (require, exports) {
      * @deprecated 5.4 Use `event.key === "Tab"` instead.
      */
     function Tab(event) {
-        return _test(event, 'Tab', 9);
+        return _test(event, "Tab", 9);
     }
     exports.Tab = Tab;
 });
index 42207ccee5c499e344a805f685ae0496775e0f55..1a10aea5d0c8d54efd1be418abec4ef527d6710f 100644 (file)
@@ -13,99 +13,99 @@ define(["require", "exports", "tslib", "./StringUtil"], function (require, expor
     StringUtil = tslib_1.__importStar(StringUtil);
     const _fileExtensionIconMapping = new Map(Object.entries({
         // archive
-        zip: 'archive',
-        rar: 'archive',
-        tar: 'archive',
-        gz: 'archive',
+        zip: "archive",
+        rar: "archive",
+        tar: "archive",
+        gz: "archive",
         // audio
-        mp3: 'audio',
-        ogg: 'audio',
-        wav: 'audio',
+        mp3: "audio",
+        ogg: "audio",
+        wav: "audio",
         // code
-        php: 'code',
-        html: 'code',
-        htm: 'code',
-        tpl: 'code',
-        js: 'code',
+        php: "code",
+        html: "code",
+        htm: "code",
+        tpl: "code",
+        js: "code",
         // excel
-        xls: 'excel',
-        ods: 'excel',
-        xlsx: 'excel',
+        xls: "excel",
+        ods: "excel",
+        xlsx: "excel",
         // image
-        gif: 'image',
-        jpg: 'image',
-        jpeg: 'image',
-        png: 'image',
-        bmp: 'image',
-        webp: 'image',
+        gif: "image",
+        jpg: "image",
+        jpeg: "image",
+        png: "image",
+        bmp: "image",
+        webp: "image",
         // video
-        avi: 'video',
-        wmv: 'video',
-        mov: 'video',
-        mp4: 'video',
-        mpg: 'video',
-        mpeg: 'video',
-        flv: 'video',
+        avi: "video",
+        wmv: "video",
+        mov: "video",
+        mp4: "video",
+        mpg: "video",
+        mpeg: "video",
+        flv: "video",
         // pdf
-        pdf: 'pdf',
+        pdf: "pdf",
         // powerpoint
-        ppt: 'powerpoint',
-        pptx: 'powerpoint',
+        ppt: "powerpoint",
+        pptx: "powerpoint",
         // text
-        txt: 'text',
+        txt: "text",
         // word
-        doc: 'word',
-        docx: 'word',
-        odt: 'word',
+        doc: "word",
+        docx: "word",
+        odt: "word",
     }));
     const _mimeTypeExtensionMapping = new Map(Object.entries({
         // archive
-        'application/zip': 'zip',
-        'application/x-zip-compressed': 'zip',
-        'application/rar': 'rar',
-        'application/vnd.rar': 'rar',
-        'application/x-rar-compressed': 'rar',
-        'application/x-tar': 'tar',
-        'application/x-gzip': 'gz',
-        'application/gzip': 'gz',
+        "application/zip": "zip",
+        "application/x-zip-compressed": "zip",
+        "application/rar": "rar",
+        "application/vnd.rar": "rar",
+        "application/x-rar-compressed": "rar",
+        "application/x-tar": "tar",
+        "application/x-gzip": "gz",
+        "application/gzip": "gz",
         // audio
-        'audio/mpeg': 'mp3',
-        'audio/mp3': 'mp3',
-        'audio/ogg': 'ogg',
-        'audio/x-wav': 'wav',
+        "audio/mpeg": "mp3",
+        "audio/mp3": "mp3",
+        "audio/ogg": "ogg",
+        "audio/x-wav": "wav",
         // code
-        'application/x-php': 'php',
-        'text/html': 'html',
-        'application/javascript': 'js',
+        "application/x-php": "php",
+        "text/html": "html",
+        "application/javascript": "js",
         // excel
-        'application/vnd.ms-excel': 'xls',
-        'application/vnd.oasis.opendocument.spreadsheet': 'ods',
-        'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'xlsx',
+        "application/vnd.ms-excel": "xls",
+        "application/vnd.oasis.opendocument.spreadsheet": "ods",
+        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": "xlsx",
         // image
-        'image/gif': 'gif',
-        'image/jpeg': 'jpg',
-        'image/png': 'png',
-        'image/x-ms-bmp': 'bmp',
-        'image/bmp': 'bmp',
-        'image/webp': 'webp',
+        "image/gif": "gif",
+        "image/jpeg": "jpg",
+        "image/png": "png",
+        "image/x-ms-bmp": "bmp",
+        "image/bmp": "bmp",
+        "image/webp": "webp",
         // video
-        'video/x-msvideo': 'avi',
-        'video/x-ms-wmv': 'wmv',
-        'video/quicktime': 'mov',
-        'video/mp4': 'mp4',
-        'video/mpeg': 'mpg',
-        'video/x-flv': 'flv',
+        "video/x-msvideo": "avi",
+        "video/x-ms-wmv": "wmv",
+        "video/quicktime": "mov",
+        "video/mp4": "mp4",
+        "video/mpeg": "mpg",
+        "video/x-flv": "flv",
         // pdf
-        'application/pdf': 'pdf',
+        "application/pdf": "pdf",
         // powerpoint
-        'application/vnd.ms-powerpoint': 'ppt',
-        'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'pptx',
+        "application/vnd.ms-powerpoint": "ppt",
+        "application/vnd.openxmlformats-officedocument.presentationml.presentation": "pptx",
         // text
-        'text/plain': 'txt',
+        "text/plain": "txt",
         // word
-        'application/msword': 'doc',
-        'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',
-        'application/vnd.oasis.opendocument.text': 'odt',
+        "application/msword": "doc",
+        "application/vnd.openxmlformats-officedocument.wordprocessingml.document": "docx",
+        "application/vnd.oasis.opendocument.text": "odt",
     }));
     /**
      * Formats the given filesize.
@@ -114,24 +114,24 @@ define(["require", "exports", "tslib", "./StringUtil"], function (require, expor
         if (precision === undefined) {
             precision = 2;
         }
-        let symbol = 'Byte';
+        let symbol = "Byte";
         if (byte >= 1000) {
             byte /= 1000;
-            symbol = 'kB';
+            symbol = "kB";
         }
         if (byte >= 1000) {
             byte /= 1000;
-            symbol = 'MB';
+            symbol = "MB";
         }
         if (byte >= 1000) {
             byte /= 1000;
-            symbol = 'GB';
+            symbol = "GB";
         }
         if (byte >= 1000) {
             byte /= 1000;
-            symbol = 'TB';
+            symbol = "TB";
         }
-        return StringUtil.formatNumeric(byte, -precision) + ' ' + symbol;
+        return StringUtil.formatNumeric(byte, -precision) + " " + symbol;
     }
     exports.formatFilesize = formatFilesize;
     /**
@@ -141,14 +141,14 @@ define(["require", "exports", "tslib", "./StringUtil"], function (require, expor
      * will be returned by this method.
      */
     function getIconNameByFilename(filename) {
-        const lastDotPosition = filename.lastIndexOf('.');
+        const lastDotPosition = filename.lastIndexOf(".");
         if (lastDotPosition !== -1) {
             const extension = filename.substr(lastDotPosition + 1);
             if (_fileExtensionIconMapping.has(extension)) {
                 return _fileExtensionIconMapping.get(extension);
             }
         }
-        return '';
+        return "";
     }
     exports.getIconNameByFilename = getIconNameByFilename;
     /**
@@ -156,9 +156,9 @@ define(["require", "exports", "tslib", "./StringUtil"], function (require, expor
      */
     function getExtensionByMimeType(mimetype) {
         if (_mimeTypeExtensionMapping.has(mimetype)) {
-            return '.' + _mimeTypeExtensionMapping.get(mimetype);
+            return "." + _mimeTypeExtensionMapping.get(mimetype);
         }
-        return '';
+        return "";
     }
     exports.getExtensionByMimeType = getExtensionByMimeType;
     /**
index 3bd6decea326c6802574b33a6965cd0de593c79c..82843bf9f30036690ffdac457776de00a00f8131 100644 (file)
@@ -9,12 +9,12 @@
 define(["require", "exports", "tslib", "../StringUtil"], function (require, exports, tslib_1, StringUtil) {
     "use strict";
     StringUtil = tslib_1.__importStar(StringUtil);
-    const PLURAL_FEW = 'few';
-    const PLURAL_MANY = 'many';
-    const PLURAL_ONE = 'one';
-    const PLURAL_OTHER = 'other';
-    const PLURAL_TWO = 'two';
-    const PLURAL_ZERO = 'zero';
+    const PLURAL_FEW = "few";
+    const PLURAL_MANY = "many";
+    const PLURAL_ONE = "one";
+    const PLURAL_OTHER = "other";
+    const PLURAL_TWO = "two";
+    const PLURAL_ZERO = "zero";
     const Plural = {
         /**
          * Returns the plural category for the given value.
@@ -24,8 +24,8 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
                 languageCode = document.documentElement.lang;
             }
             // Fallback: handle unknown languages as English
-            if (typeof Plural[languageCode] !== 'function') {
-                languageCode = 'en';
+            if (typeof Plural[languageCode] !== "function") {
+                languageCode = "en";
             }
             const category = Plural[languageCode](value);
             if (category) {
@@ -39,13 +39,13 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
          * @see    wcf\system\template\plugin\PluralFunctionTemplatePlugin::execute()
          */
         getCategoryFromTemplateParameters(parameters) {
-            if (!parameters['value']) {
-                throw new Error('Missing parameter value');
+            if (!parameters["value"]) {
+                throw new Error("Missing parameter value");
             }
-            if (!parameters['other']) {
-                throw new Error('Missing parameter other');
+            if (!parameters["other"]) {
+                throw new Error("Missing parameter other");
             }
-            let value = parameters['value'];
+            let value = parameters["value"];
             if (Array.isArray(value)) {
                 value = value.length;
             }
@@ -60,8 +60,8 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
                 category = PLURAL_OTHER;
             }
             const string = parameters[category];
-            if (string.indexOf('#') !== -1) {
-                return string.replace('#', StringUtil.formatNumeric(value));
+            if (string.indexOf("#") !== -1) {
+                return string.replace("#", StringUtil.formatNumeric(value));
             }
             return string;
         },
@@ -70,7 +70,7 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
          */
         getF(n) {
             const tmp = n.toString();
-            const pos = tmp.indexOf('.');
+            const pos = tmp.indexOf(".");
             if (pos === -1) {
                 return 0;
             }
@@ -80,7 +80,7 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
          * `v` represents the number of digits of the fractional part (1.234 yields 3)
          */
         getV(n) {
-            return n.toString().replace(/^[^.]*\.?/, '').length;
+            return n.toString().replace(/^[^.]*\.?/, "").length;
         },
         // Afrikaans
         af(n) {
@@ -141,8 +141,7 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
                 return PLURAL_ONE;
         },
         // Tibetan
-        bo(n) {
-        },
+        bo(n) { },
         // Bosnian
         bs(n) {
             const v = Plural.getV(n);
@@ -153,8 +152,8 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
             const fMod100 = f % 100;
             if ((v == 0 && mod10 == 1 && mod100 != 11) || (fMod10 == 1 && fMod100 != 11))
                 return PLURAL_ONE;
-            if ((v == 0 && mod10 >= 2 && mod10 <= 4 && mod100 >= 12 && mod100 <= 14)
-                || (fMod10 >= 2 && fMod10 <= 4 && fMod100 >= 12 && fMod100 <= 14))
+            if ((v == 0 && mod10 >= 2 && mod10 <= 4 && mod100 >= 12 && mod100 <= 14) ||
+                (fMod10 >= 2 && fMod10 <= 4 && fMod100 >= 12 && fMod100 <= 14))
                 return PLURAL_FEW;
         },
         // Czech
@@ -271,20 +270,17 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
                 return PLURAL_ONE;
         },
         // Indonesian
-        id(n) {
-        },
+        id(n) { },
         // Icelandic
         is(n) {
             const f = Plural.getF(n);
-            if (f === 0 && n % 10 === 1 && !(n % 100 === 11) || !(f === 0))
+            if ((f === 0 && n % 10 === 1 && !(n % 100 === 11)) || !(f === 0))
                 return PLURAL_ONE;
         },
         // Japanese
-        ja(n) {
-        },
+        ja(n) { },
         // Javanese
-        jv(n) {
-        },
+        jv(n) { },
         // Georgian
         ka(n) {
             if (n == 1)
@@ -296,16 +292,14 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
                 return PLURAL_ONE;
         },
         // Khmer
-        km(n) {
-        },
+        km(n) { },
         // Kannada
         kn(n) {
             if (n >= 0 && n <= 1)
                 return PLURAL_ONE;
         },
         // Korean
-        ko(n) {
-        },
+        ko(n) { },
         // Kurdish
         ku(n) {
             if (n == 1)
@@ -322,8 +316,7 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
                 return PLURAL_ONE;
         },
         // Lao
-        lo(n) {
-        },
+        lo(n) { },
         // Lithuanian
         lt(n) {
             const mod10 = n % 10;
@@ -357,20 +350,19 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
             if (n == 1)
                 return PLURAL_ONE;
         },
-        // Mongolian 
+        // Mongolian
         mn(n) {
             if (n == 1)
                 return PLURAL_ONE;
         },
-        // Marathi 
+        // Marathi
         mr(n) {
             if (n == 1)
                 return PLURAL_ONE;
         },
-        // Malay 
-        ms(n) {
-        },
-        // Maltese 
+        // Malay
+        ms(n) { },
+        // Maltese
         mt(n) {
             const mod100 = n % 100;
             if (n == 1)
@@ -381,8 +373,7 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
                 return PLURAL_MANY;
         },
         // Burmese
-        my(n) {
-        },
+        my(n) { },
         // Norwegian
         no(n) {
             if (n == 1)
@@ -412,7 +403,8 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
                 return PLURAL_ONE;
             if (v == 0 && mod10 >= 2 && mod10 <= 4 && !(mod100 >= 12 && mod100 <= 14))
                 return PLURAL_FEW;
-            if (v == 0 && ((n != 1 && mod10 >= 0 && mod10 <= 1) || (mod10 >= 5 && mod10 <= 9) || (mod100 >= 12 && mod100 <= 14)))
+            if (v == 0 &&
+                ((n != 1 && mod10 >= 0 && mod10 <= 1) || (mod10 >= 5 && mod10 <= 9) || (mod100 >= 12 && mod100 <= 14)))
                 return PLURAL_MANY;
         },
         // Pashto
@@ -494,11 +486,9 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
                 return PLURAL_ONE;
         },
         // Tajik
-        tg(n) {
-        },
+        tg(n) { },
         // Thai
-        th(n) {
-        },
+        th(n) { },
         // Turkmen
         tk(n) {
             if (n == 1)
@@ -525,11 +515,9 @@ define(["require", "exports", "tslib", "../StringUtil"], function (require, expo
                 return PLURAL_ONE;
         },
         // Vietnamese
-        vi(n) {
-        },
+        vi(n) { },
         // Chinese
-        zh(n) {
-        },
+        zh(n) { },
     };
     return Plural;
 });
index 8baf330ac2c2f0d16e64928ca95750916e61c932..7a7062b388cf7abee98b7d769e3e2cff7eea5e2e 100644 (file)
@@ -17,7 +17,7 @@ define(["require", "exports", "tslib", "./Template"], function (require, exports
      * Adds all the language items in the given object to the store.
      */
     function addObject(object) {
-        Object.keys(object).forEach(key => {
+        Object.keys(object).forEach((key) => {
             _languageItems.set(key, object[key]);
         });
     }
@@ -44,16 +44,17 @@ define(["require", "exports", "tslib", "./Template"], function (require, exports
             return key;
         }
         // fetch Template, as it cannot be provided because of a circular dependency
-        if (Template_1.default === undefined) { //@ts-ignore
-            Template_1.default = require('./Template');
+        if (Template_1.default === undefined) {
+            //@ts-ignore
+            Template_1.default = require("./Template");
         }
-        if (typeof value === 'string') {
+        if (typeof value === "string") {
             // lazily convert to WCF.Template
             try {
                 _languageItems.set(key, new Template_1.default(value));
             }
             catch (e) {
-                _languageItems.set(key, new Template_1.default('{literal}' + value.replace(/{\/literal}/g, '{/literal}{ldelim}/literal}{literal}') + '{/literal}'));
+                _languageItems.set(key, new Template_1.default("{literal}" + value.replace(/{\/literal}/g, "{/literal}{ldelim}/literal}{literal}") + "{/literal}"));
             }
             value = _languageItems.get(key);
         }
index 35fc6216044b9600540a5387c64f7811d4ba84bf..5f22062429336da28a658d924b36e1f673d30d2e 100644 (file)
@@ -17,21 +17,21 @@ define(["require", "exports"], function (require, exports) {
      */
     function round(value, exp) {
         // If the exp is undefined or zero...
-        if (typeof exp === 'undefined' || +exp === 0) {
+        if (typeof exp === "undefined" || +exp === 0) {
             return Math.round(value);
         }
         value = +value;
         exp = +exp;
         // If the value is not a number or the exp is not an integer...
-        if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) {
+        if (isNaN(value) || !(typeof exp === "number" && exp % 1 === 0)) {
             return NaN;
         }
         // Shift
-        let tmp = value.toString().split('e');
-        value = Math.round(+(tmp[0] + 'e' + (tmp[1] ? (+tmp[1] - exp) : -exp)));
+        let tmp = value.toString().split("e");
+        value = Math.round(+(tmp[0] + "e" + (tmp[1] ? +tmp[1] - exp : -exp)));
         // Shift back
-        tmp = value.toString().split('e');
-        return +(tmp[0] + 'e' + (tmp[1] ? (+tmp[1] + exp) : exp));
+        tmp = value.toString().split("e");
+        return +(tmp[0] + "e" + (tmp[1] ? +tmp[1] + exp : exp));
     }
     exports.round = round;
 });
index 6fe18c8ec4df281a4cfcbbef211482858c9dd443..06e8e69564dd101c5dbca33e61de4b242ce834c5 100644 (file)
@@ -20,11 +20,11 @@ define(["require", "exports"], function (require, exports) {
          * Sets a new key with given value, will overwrite an existing key.
          */
         set(key, value) {
-            if (typeof key !== 'object' || key === null) {
-                throw new TypeError('Only objects can be used as key');
+            if (typeof key !== "object" || key === null) {
+                throw new TypeError("Only objects can be used as key");
             }
-            if (typeof value !== 'object' || value === null) {
-                throw new TypeError('Only objects can be used as value');
+            if (typeof value !== "object" || value === null) {
+                throw new TypeError("Only objects can be used as value");
             }
             this._map.set(key, value);
         }
index 08eb9cc173eb1e671ef2dd9bbf227fe402c9f294..63b66844f48519af68a99faf1dd1c78f5415e267 100644 (file)
@@ -16,8 +16,8 @@ define(["require", "exports"], function (require, exports) {
      * Adds a single permission to the store.
      */
     function add(permission, value) {
-        if (typeof value !== 'boolean') {
-            throw new TypeError('The permission value has to be boolean.');
+        if (typeof value !== "boolean") {
+            throw new TypeError("The permission value has to be boolean.");
         }
         _permissions.set(permission, value);
     }
index 3870e8cf8a570528aebd76cbac102eaa62c78e75..25f8c4eb357837821129e195f5c2ceb918569d2c 100644 (file)
@@ -20,17 +20,18 @@ define(["require", "exports", "tslib", "./Language", "./NumberUtil"], function (
      */
     function addThousandsSeparator(number) {
         // Fetch Language, as it cannot be provided because of a circular dependency
-        if (Language === undefined) { //@ts-ignore
-            Language = require('./Language');
+        if (Language === undefined) {
+            //@ts-ignore
+            Language = require("./Language");
         }
-        return String(number).replace(/(^-?\d{1,3}|\d{3})(?=(?:\d{3})+(?:$|\.))/g, '$1' + Language.get('wcf.global.thousandsSeparator'));
+        return String(number).replace(/(^-?\d{1,3}|\d{3})(?=(?:\d{3})+(?:$|\.))/g, "$1" + Language.get("wcf.global.thousandsSeparator"));
     }
     exports.addThousandsSeparator = addThousandsSeparator;
     /**
      * Escapes special HTML-characters within a string
      */
     function escapeHTML(string) {
-        return String(string).replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
+        return String(string).replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
     }
     exports.escapeHTML = escapeHTML;
     /**
@@ -39,7 +40,7 @@ define(["require", "exports", "tslib", "./Language", "./NumberUtil"], function (
      * @see    https://github.com/sstephenson/prototype/blob/master/src/prototype/lang/regexp.js#L25
      */
     function escapeRegExp(string) {
-        return String(string).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
+        return String(string).replace(/([.*+?^=!:${}()|[\]\/\\])/g, "\\$1");
     }
     exports.escapeRegExp = escapeRegExp;
     /**
@@ -47,15 +48,16 @@ define(["require", "exports", "tslib", "./Language", "./NumberUtil"], function (
      */
     function formatNumeric(number, decimalPlaces) {
         // Fetch Language, as it cannot be provided because of a circular dependency
-        if (Language === undefined) { //@ts-ignore
-            Language = require('./Language');
+        if (Language === undefined) {
+            //@ts-ignore
+            Language = require("./Language");
         }
         let tmp = NumberUtil.round(number, decimalPlaces || -2).toString();
-        const numberParts = tmp.split('.');
+        const numberParts = tmp.split(".");
         tmp = addThousandsSeparator(+numberParts[0]);
         if (numberParts.length > 1)
-            tmp += Language.get('wcf.global.decimalPoint') + numberParts[1];
-        tmp = tmp.replace('-', '\u2212');
+            tmp += Language.get("wcf.global.decimalPoint") + numberParts[1];
+        tmp = tmp.replace("-", "\u2212");
         return tmp;
     }
     exports.formatNumeric = formatNumeric;
@@ -77,14 +79,18 @@ define(["require", "exports", "tslib", "./Language", "./NumberUtil"], function (
      * Unescapes special HTML-characters within a string.
      */
     function unescapeHTML(string) {
-        return String(string).replace(/&amp;/g, '&').replace(/&quot;/g, '"').replace(/&lt;/g, '<').replace(/&gt;/g, '>');
+        return String(string)
+            .replace(/&amp;/g, "&")
+            .replace(/&quot;/g, '"')
+            .replace(/&lt;/g, "<")
+            .replace(/&gt;/g, ">");
     }
     exports.unescapeHTML = unescapeHTML;
     /**
      * Shortens numbers larger than 1000 by using unit suffixes.
      */
     function shortUnit(number) {
-        let unitSuffix = '';
+        let unitSuffix = "";
         if (number >= 1000000) {
             number /= 1000000;
             if (number > 10) {
@@ -93,7 +99,7 @@ define(["require", "exports", "tslib", "./Language", "./NumberUtil"], function (
             else {
                 number = NumberUtil.round(number, -1);
             }
-            unitSuffix = 'M';
+            unitSuffix = "M";
         }
         else if (number >= 1000) {
             number /= 1000;
@@ -103,7 +109,7 @@ define(["require", "exports", "tslib", "./Language", "./NumberUtil"], function (
             else {
                 number = NumberUtil.round(number, -1);
             }
-            unitSuffix = 'k';
+            unitSuffix = "k";
         }
         return formatNumeric(number) + unitSuffix;
     }
index 0eb547e99127155c4abcd8a81bb59b1115b824b1..36e07a4afafaeab9ba4d15629ee83c7220443e32 100644 (file)
@@ -27,20 +27,24 @@ define(["require", "exports", "tslib", "./Template.grammar", "./StringUtil", "./
     class Template {
         constructor(template) {
             // Fetch Language/StringUtil, as it cannot be provided because of a circular dependency
-            if (Language === undefined) { //@ts-ignore
-                Language = require('./Language');
+            if (Language === undefined) {
+                //@ts-ignore
+                Language = require("./Language");
             }
-            if (StringUtil === undefined) { //@ts-ignore
-                StringUtil = require('./StringUtil');
+            if (StringUtil === undefined) {
+                //@ts-ignore
+                StringUtil = require("./StringUtil");
             }
             try {
                 template = parser.parse(template);
-                template = 'var tmp = {};\n'
-                    + 'for (var key in v) tmp[key] = v[key];\n'
-                    + 'v = tmp;\n'
-                    + 'v.__wcf = window.WCF; v.__window = window;\n'
-                    + 'return ' + template;
-                this.fetch = new Function('StringUtil', 'Language', 'I18nPlural', 'v', template).bind(undefined, StringUtil, Language, I18nPlural);
+                template =
+                    "var tmp = {};\n" +
+                        "for (var key in v) tmp[key] = v[key];\n" +
+                        "v = tmp;\n" +
+                        "v.__wcf = window.WCF; v.__window = window;\n" +
+                        "return " +
+                        template;
+                this.fetch = new Function("StringUtil", "Language", "I18nPlural", "v", template).bind(undefined, StringUtil, Language, I18nPlural);
             }
             catch (e) {
                 console.debug(e.message);
@@ -54,17 +58,17 @@ define(["require", "exports", "tslib", "./Template.grammar", "./StringUtil", "./
          */
         fetch(v) {
             // this will be replaced in the init function
-            throw new Error('This Template is not initialized.');
+            throw new Error("This Template is not initialized.");
         }
     }
-    Object.defineProperty(Template, 'callbacks', {
+    Object.defineProperty(Template, "callbacks", {
         enumerable: false,
         configurable: false,
         get: function () {
-            throw new Error('WCF.Template.callbacks is no longer supported');
+            throw new Error("WCF.Template.callbacks is no longer supported");
         },
         set: function (value) {
-            throw new Error('WCF.Template.callbacks is no longer supported');
+            throw new Error("WCF.Template.callbacks is no longer supported");
         },
     });
     return Template;
index e7155606b8025e7f2fcaf7a4766b583acf447134..29b695e1c18dd99383dc1a8e406c20a1db2a296d 100644 (file)
@@ -15,7 +15,7 @@ define(["require", "exports"], function (require, exports) {
          * The `callback` will be passed the owning instance of `Repeating`.
          */
         constructor(callback, delta) {
-            if (typeof callback !== 'function') {
+            if (typeof callback !== "function") {
                 throw new TypeError("Expected a valid callback as first argument.");
             }
             if (delta < 0 || delta > 86400 * 1000) {
index 4060befbdc80a22ed93dcca35b33ac6a0ddde9e3..36229807cc39cb90d8fe9a768fb923288e599af4 100644 (file)
@@ -7,44 +7,44 @@ define(["require", "exports", "tslib", "../../Language", "../../StringUtil", "..
     Input_1 = tslib_1.__importDefault(Input_1);
     class UiAclSimple {
         constructor(prefix, inputName) {
-            this.prefix = prefix || '';
-            this.inputName = inputName || 'aclValues';
-            const container = document.getElementById(this.prefix + 'aclInputContainer');
-            const allowAll = document.getElementById(this.prefix + 'aclAllowAll');
-            allowAll.addEventListener('change', () => {
+            this.prefix = prefix || "";
+            this.inputName = inputName || "aclValues";
+            const container = document.getElementById(this.prefix + "aclInputContainer");
+            const allowAll = document.getElementById(this.prefix + "aclAllowAll");
+            allowAll.addEventListener("change", () => {
                 Util_1.default.hide(container);
             });
-            const denyAll = document.getElementById(this.prefix + 'aclAllowAll_no');
-            denyAll.addEventListener('change', () => {
+            const denyAll = document.getElementById(this.prefix + "aclAllowAll_no");
+            denyAll.addEventListener("change", () => {
                 Util_1.default.show(container);
             });
-            this.list = document.getElementById(this.prefix + 'aclAccessList');
-            this.list.addEventListener('click', this.removeItem.bind(this));
+            this.list = document.getElementById(this.prefix + "aclAccessList");
+            this.list.addEventListener("click", this.removeItem.bind(this));
             const excludedSearchValues = [];
-            this.list.querySelectorAll('.aclLabel').forEach(label => {
+            this.list.querySelectorAll(".aclLabel").forEach((label) => {
                 excludedSearchValues.push(label.textContent);
             });
-            this.searchInput = new Input_1.default(document.getElementById(this.prefix + 'aclSearchInput'), {
+            this.searchInput = new Input_1.default(document.getElementById(this.prefix + "aclSearchInput"), {
                 callbackSelect: this.select.bind(this),
                 includeUserGroups: true,
                 excludedSearchValues: excludedSearchValues,
                 preventSubmit: true,
             });
-            this.aclListContainer = document.getElementById(this.prefix + 'aclListContainer');
+            this.aclListContainer = document.getElementById(this.prefix + "aclListContainer");
             Listener_1.default.trigger();
         }
         select(listItem) {
             const type = listItem.dataset.type;
             const label = listItem.dataset.label;
             const objectId = listItem.dataset.objectId;
-            const iconName = type === 'group' ? 'users' : 'user';
+            const iconName = type === "group" ? "users" : "user";
             const html = `<span class="icon icon16 fa-${iconName}"></span>
       <span class="aclLabel">${StringUtil.escapeHTML(label)}</span>
-      <span class="icon icon16 fa-times pointer jsTooltip" title="${Language.get('wcf.global.button.delete')}"></span>
+      <span class="icon icon16 fa-times pointer jsTooltip" title="${Language.get("wcf.global.button.delete")}"></span>
       <input type="hidden" name="${this.inputName}[${type}][]" value="${objectId}">`;
-            const item = document.createElement('li');
+            const item = document.createElement("li");
             item.innerHTML = html;
-            const firstUser = this.list.querySelector('.fa-user');
+            const firstUser = this.list.querySelector(".fa-user");
             if (firstUser === null) {
                 this.list.appendChild(item);
             }
@@ -58,9 +58,9 @@ define(["require", "exports", "tslib", "../../Language", "../../StringUtil", "..
         }
         removeItem(event) {
             const target = event.target;
-            if (target.classList.contains('fa-times')) {
+            if (target.classList.contains("fa-times")) {
                 const parent = target.parentElement;
-                const label = parent.querySelector('.aclLabel');
+                const label = parent.querySelector(".aclLabel");
                 this.searchInput.removeExcludedSearchValues(label.textContent);
                 parent.remove();
                 if (this.list.childElementCount === 0) {
index c2bbbde7bd296eb2a11be114268b75e1aeb622e3..41ddf4b2b84da0e2743b135e37f9708e80eb87fe 100644 (file)
@@ -26,16 +26,16 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Dom/Uti
      * @returns  {Object<string, *>}  calculation results
      */
     function tryAlignmentHorizontal(alignment, elDimensions, refDimensions, refOffsets, windowWidth) {
-        let left = 'auto';
-        let right = 'auto';
+        let left = "auto";
+        let right = "auto";
         let result = true;
-        if (alignment === 'left') {
+        if (alignment === "left") {
             left = refOffsets.left;
             if (left + elDimensions.width > windowWidth) {
                 result = false;
             }
         }
-        else if (alignment === 'right') {
+        else if (alignment === "right") {
             if (refOffsets.left + refDimensions.width < elDimensions.width) {
                 result = false;
             }
@@ -47,7 +47,7 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Dom/Uti
             }
         }
         else {
-            left = refOffsets.left + (refDimensions.width / 2) - (elDimensions.width / 2);
+            left = refOffsets.left + refDimensions.width / 2 - elDimensions.width / 2;
             left = ~~left;
             if (left < 0 || left + elDimensions.width > windowWidth) {
                 result = false;
@@ -72,23 +72,23 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Dom/Uti
      * @returns  {object<string, *>}  calculation results
      */
     function tryAlignmentVertical(alignment, elDimensions, refDimensions, refOffsets, windowHeight, verticalOffset) {
-        let bottom = 'auto';
-        let top = 'auto';
+        let bottom = "auto";
+        let top = "auto";
         let result = true;
         let pageHeaderOffset = 50;
-        const pageHeaderPanel = document.getElementById('pageHeaderPanel');
+        const pageHeaderPanel = document.getElementById("pageHeaderPanel");
         if (pageHeaderPanel !== null) {
             const position = window.getComputedStyle(pageHeaderPanel).position;
-            if (position === 'fixed' || position === 'static') {
+            if (position === "fixed" || position === "static") {
                 pageHeaderOffset = pageHeaderPanel.offsetHeight;
             }
             else {
                 pageHeaderOffset = 0;
             }
         }
-        if (alignment === 'top') {
+        if (alignment === "top") {
             const bodyHeight = document.body.clientHeight;
-            bottom = (bodyHeight - refOffsets.top) + verticalOffset;
+            bottom = bodyHeight - refOffsets.top + verticalOffset;
             if (bodyHeight - (bottom + elDimensions.height) < (window.scrollY || window.pageYOffset) + pageHeaderOffset) {
                 result = false;
             }
@@ -124,30 +124,30 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Dom/Uti
             // alternate element used to calculate dimensions
             refDimensionsElement: null,
             // preferred alignment, possible values: left/right/center and top/bottom
-            horizontal: 'left',
-            vertical: 'bottom',
+            horizontal: "left",
+            vertical: "bottom",
             // allow flipping over axis, possible values: both, horizontal, vertical and none
-            allowFlip: 'both',
+            allowFlip: "both",
         }, options || {});
         if (!Array.isArray(options.pointerClassNames) || options.pointerClassNames.length !== (options.pointer ? 1 : 2)) {
             options.pointerClassNames = [];
         }
-        if (['left', 'right', 'center'].indexOf(options.horizontal) === -1) {
-            options.horizontal = 'left';
+        if (["left", "right", "center"].indexOf(options.horizontal) === -1) {
+            options.horizontal = "left";
         }
-        if (options.vertical !== 'bottom') {
-            options.vertical = 'top';
+        if (options.vertical !== "bottom") {
+            options.vertical = "top";
         }
-        if (['both', 'horizontal', 'vertical', 'none'].indexOf(options.allowFlip) === -1) {
-            options.allowFlip = 'both';
+        if (["both", "horizontal", "vertical", "none"].indexOf(options.allowFlip) === -1) {
+            options.allowFlip = "both";
         }
         // Place the element in the upper left corner to prevent calculation issues due to possible scrollbars.
         Util_1.default.setStyles(element, {
-            bottom: 'auto !important',
-            left: '0 !important',
-            right: 'auto !important',
-            top: '0 !important',
-            visibility: 'hidden !important',
+            bottom: "auto !important",
+            left: "0 !important",
+            right: "auto !important",
+            top: "0 !important",
+            visibility: "hidden !important",
         });
         const elDimensions = Util_1.default.outerDimensions(element);
         const refDimensions = Util_1.default.outerDimensions(options.refDimensionsElement instanceof HTMLElement ? options.refDimensionsElement : referenceElement);
@@ -156,12 +156,12 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Dom/Uti
         const windowWidth = document.body.clientWidth;
         let horizontal = null;
         let alignCenter = false;
-        if (options.horizontal === 'center') {
+        if (options.horizontal === "center") {
             alignCenter = true;
             horizontal = tryAlignmentHorizontal(options.horizontal, elDimensions, refDimensions, refOffsets, windowWidth);
             if (!horizontal.result) {
-                if (options.allowFlip === 'both' || options.allowFlip === 'horizontal') {
-                    options.horizontal = 'left';
+                if (options.allowFlip === "both" || options.allowFlip === "horizontal") {
+                    options.horizontal = "left";
                 }
                 else {
                     horizontal.result = true;
@@ -169,14 +169,14 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Dom/Uti
             }
         }
         // in rtl languages we simply swap the value for 'horizontal'
-        if (Language.get('wcf.global.pageDirection') === 'rtl') {
-            options.horizontal = (options.horizontal === 'left') ? 'right' : 'left';
+        if (Language.get("wcf.global.pageDirection") === "rtl") {
+            options.horizontal = options.horizontal === "left" ? "right" : "left";
         }
         if (horizontal === null || !horizontal.result) {
             const horizontalCenter = horizontal;
             horizontal = tryAlignmentHorizontal(options.horizontal, elDimensions, refDimensions, refOffsets, windowWidth);
-            if (!horizontal.result && (options.allowFlip === 'both' || options.allowFlip === 'horizontal')) {
-                const horizontalFlipped = tryAlignmentHorizontal((options.horizontal === 'left' ? 'right' : 'left'), elDimensions, refDimensions, refOffsets, windowWidth);
+            if (!horizontal.result && (options.allowFlip === "both" || options.allowFlip === "horizontal")) {
+                const horizontalFlipped = tryAlignmentHorizontal(options.horizontal === "left" ? "right" : "left", elDimensions, refDimensions, refOffsets, windowWidth);
                 // only use these results if it fits into the boundaries, otherwise both directions exceed and we honor the demanded direction
                 if (horizontalFlipped.result) {
                     horizontal = horizontalFlipped;
@@ -189,8 +189,8 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Dom/Uti
         const left = horizontal.left;
         const right = horizontal.right;
         let vertical = tryAlignmentVertical(options.vertical, elDimensions, refDimensions, refOffsets, windowHeight, options.verticalOffset);
-        if (!vertical.result && (options.allowFlip === 'both' || options.allowFlip === 'vertical')) {
-            const verticalFlipped = tryAlignmentVertical((options.vertical === 'top' ? 'bottom' : 'top'), elDimensions, refDimensions, refOffsets, windowHeight, options.verticalOffset);
+        if (!vertical.result && (options.allowFlip === "both" || options.allowFlip === "vertical")) {
+            const verticalFlipped = tryAlignmentVertical(options.vertical === "top" ? "bottom" : "top", elDimensions, refDimensions, refOffsets, windowHeight, options.verticalOffset);
             // only use these results if it fits into the boundaries, otherwise both directions exceed and we honor the demanded direction
             if (verticalFlipped.result) {
                 vertical = verticalFlipped;
@@ -200,39 +200,39 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Dom/Uti
         const top = vertical.top;
         // set pointer position
         if (options.pointer) {
-            const pointers = DomTraverse.childrenByClass(element, 'elementPointer');
+            const pointers = DomTraverse.childrenByClass(element, "elementPointer");
             const pointer = pointers[0] || null;
             if (pointer === null) {
                 throw new Error("Expected the .elementPointer element to be a direct children.");
             }
-            if (horizontal.align === 'center') {
-                pointer.classList.add('center');
-                pointer.classList.remove('left', 'right');
+            if (horizontal.align === "center") {
+                pointer.classList.add("center");
+                pointer.classList.remove("left", "right");
             }
             else {
                 pointer.classList.add(horizontal.align);
-                pointer.classList.remove('center');
-                pointer.classList.remove(horizontal.align === 'left' ? 'right' : 'left');
+                pointer.classList.remove("center");
+                pointer.classList.remove(horizontal.align === "left" ? "right" : "left");
             }
-            if (vertical.align === 'top') {
-                pointer.classList.add('flipVertical');
+            if (vertical.align === "top") {
+                pointer.classList.add("flipVertical");
             }
             else {
-                pointer.classList.remove('flipVertical');
+                pointer.classList.remove("flipVertical");
             }
         }
         else if (options.pointerClassNames.length === 2) {
-            element.classList[(top === 'auto' ? 'add' : 'remove')](options.pointerClassNames[0 /* Bottom */]);
-            element.classList[(left === 'auto' ? 'add' : 'remove')](options.pointerClassNames[1 /* Right */]);
+            element.classList[top === "auto" ? "add" : "remove"](options.pointerClassNames[0 /* Bottom */]);
+            element.classList[left === "auto" ? "add" : "remove"](options.pointerClassNames[1 /* Right */]);
         }
         Util_1.default.setStyles(element, {
-            bottom: bottom === 'auto' ? bottom : Math.round(bottom) + 'px',
-            left: left === 'auto' ? left : Math.ceil(left) + 'px',
-            right: right === 'auto' ? right : Math.floor(right) + 'px',
-            top: top === 'auto' ? top : Math.round(top) + 'px',
+            bottom: bottom === "auto" ? bottom : Math.round(bottom) + "px",
+            left: left === "auto" ? left : Math.ceil(left) + "px",
+            right: right === "auto" ? right : Math.floor(right) + "px",
+            top: top === "auto" ? top : Math.round(top) + "px",
         });
         Util_1.default.show(element);
-        element.style.removeProperty('visibility');
+        element.style.removeProperty("visibility");
     }
     exports.set = set;
 });
index 171ca2c5353c9266d810836b444f93f541892870..6855303a30403218384342df327d024b851d93c4 100644 (file)
@@ -13,8 +13,8 @@ define(["require", "exports", "tslib", "../../Ajax"], function (require, exports
     Ajax = tslib_1.__importStar(Ajax);
     class UiArticleMarkAllAsRead {
         constructor() {
-            document.querySelectorAll('.markAllAsReadButton').forEach(button => {
-                button.addEventListener('click', this.click.bind(this));
+            document.querySelectorAll(".markAllAsReadButton").forEach((button) => {
+                button.addEventListener("click", this.click.bind(this));
             });
         }
         click(event) {
@@ -24,17 +24,17 @@ define(["require", "exports", "tslib", "../../Ajax"], function (require, exports
         _ajaxSuccess() {
             /* remove obsolete badges */
             // main menu
-            const badge = document.querySelector('.mainMenu .active .badge');
+            const badge = document.querySelector(".mainMenu .active .badge");
             if (badge)
                 badge.remove();
             // article list
-            document.querySelectorAll('.articleList .newMessageBadge').forEach(el => el.remove());
+            document.querySelectorAll(".articleList .newMessageBadge").forEach((el) => el.remove());
         }
         _ajaxSetup() {
             return {
                 data: {
-                    actionName: 'markAllAsRead',
-                    className: 'wcf\\data\\article\\ArticleAction',
+                    actionName: "markAllAsRead",
+                    className: "wcf\\data\\article\\ArticleAction",
                 },
             };
         }
index b68e15f806c7f4549a0ee8eb0f7ddbb484573d3c..95fd2b1ac4acc31ef26b17494c7ac0d0947df47d 100644 (file)
@@ -23,7 +23,7 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Dom/Util", "../../La
             const inputContainer = this.searchInput.parentElement;
             const value = this.searchInput.value.trim();
             if (value.length < 3) {
-                Util_1.default.innerError(inputContainer, Language.get('wcf.article.search.error.tooShort'));
+                Util_1.default.innerError(inputContainer, Language.get("wcf.article.search.error.tooShort"));
                 return;
             }
             else {
@@ -43,7 +43,7 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Dom/Util", "../../La
         }
         _ajaxSuccess(data) {
             let html = data.returnValues
-                .map(article => {
+                .map((article) => {
                 return `<li>
           <div class="containerHeadline pointer" data-article-id="${article.articleID}">
             <h3>${StringUtil.escapeHTML(article.name)}</h3>
@@ -51,52 +51,52 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Dom/Util", "../../La
           </div>
         </li>`;
             })
-                .join('');
+                .join("");
             this.resultList.innerHTML = html;
-            Util_1.default[html ? 'show' : 'hide'](this.resultList);
+            Util_1.default[html ? "show" : "hide"](this.resultList);
             if (html) {
-                this.resultList.querySelectorAll('.containerHeadline').forEach(item => {
-                    item.addEventListener('click', this.click.bind(this));
+                this.resultList.querySelectorAll(".containerHeadline").forEach((item) => {
+                    item.addEventListener("click", this.click.bind(this));
                 });
             }
             else {
                 const parent = this.searchInput.parentElement;
-                Util_1.default.innerError(parent, Language.get('wcf.article.search.error.noResults'));
+                Util_1.default.innerError(parent, Language.get("wcf.article.search.error.noResults"));
             }
         }
         _ajaxSetup() {
             return {
                 data: {
-                    actionName: 'search',
-                    className: 'wcf\\data\\article\\ArticleAction',
+                    actionName: "search",
+                    className: "wcf\\data\\article\\ArticleAction",
                 },
             };
         }
         _dialogSetup() {
             return {
-                id: 'wcfUiArticleSearch',
+                id: "wcfUiArticleSearch",
                 options: {
                     onSetup: () => {
-                        this.searchInput = document.getElementById('wcfUiArticleSearchInput');
-                        this.searchInput.addEventListener('keydown', event => {
-                            if (event.key === 'Enter') {
+                        this.searchInput = document.getElementById("wcfUiArticleSearchInput");
+                        this.searchInput.addEventListener("keydown", (event) => {
+                            if (event.key === "Enter") {
                                 this.search(event);
                             }
                         });
                         const button = this.searchInput.nextElementSibling;
-                        button.addEventListener('click', this.search.bind(this));
-                        this.resultContainer = document.getElementById('wcfUiArticleSearchResultContainer');
-                        this.resultList = document.getElementById('wcfUiArticleSearchResultList');
+                        button.addEventListener("click", this.search.bind(this));
+                        this.resultContainer = document.getElementById("wcfUiArticleSearchResultContainer");
+                        this.resultList = document.getElementById("wcfUiArticleSearchResultList");
                     },
                     onShow: () => {
                         this.searchInput.focus();
                     },
-                    title: Language.get('wcf.article.search'),
+                    title: Language.get("wcf.article.search"),
                 },
                 source: `<div class="section">
           <dl>
             <dt>
-              <label for="wcfUiArticleSearchInput">${Language.get('wcf.article.search.name')}</label>
+              <label for="wcfUiArticleSearchInput">${Language.get("wcf.article.search.name")}</label>
             </dt>
             <dd>
               <div class="inputAddon">
@@ -108,7 +108,7 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Dom/Util", "../../La
         </div>
         <section id="wcfUiArticleSearchResultContainer" class="section" style="display: none;">
           <header class="sectionHeader">
-            <h2 class="sectionTitle">${Language.get('wcf.article.search.results')}</h2>
+            <h2 class="sectionTitle">${Language.get("wcf.article.search.results")}</h2>
           </header>
           <ol id="wcfUiArticleSearchResultList" class="containerList"></ol>
         </section>`,
index 206f1f1a6150ea60e42e5ea1d2986b6eb0427e22..6ee0344e7b84aca40b72f4a4ca8d11b086a0ea87 100644 (file)
@@ -24,9 +24,9 @@ define(["require", "exports", "tslib", "../CallbackList"], function (require, ex
          * Invokes all registered callbacks.
          */
         execute() {
-            _callbackList.forEach(null, callback => callback());
+            _callbackList.forEach(null, (callback) => callback());
         },
     };
-    document.body.addEventListener('click', UiCloseOverlay.execute);
+    document.body.addEventListener("click", UiCloseOverlay.execute);
     return UiCloseOverlay;
 });
index 09e2d61dddef65080bbb8f7d678ebc80c7e69d67..256677aacbaa17a44cbb886b165039d40430f90e 100644 (file)
@@ -17,25 +17,25 @@ define(["require", "exports", "tslib", "../Core", "../Language", "./Dialog"], fu
     class UiConfirmation {
         constructor() {
             this._active = false;
-            this.dialog = document.createElement('div');
-            this.dialog.id = 'wcfSystemConfirmation';
-            this.dialog.classList.add('systemConfirmation');
-            this.text = document.createElement('p');
+            this.dialog = document.createElement("div");
+            this.dialog.id = "wcfSystemConfirmation";
+            this.dialog.classList.add("systemConfirmation");
+            this.text = document.createElement("p");
             this.dialog.appendChild(this.text);
-            this._content = document.createElement('div');
-            this._content.id = 'wcfSystemConfirmationContent';
+            this._content = document.createElement("div");
+            this._content.id = "wcfSystemConfirmationContent";
             this.dialog.appendChild(this._content);
-            const formSubmit = document.createElement('div');
-            formSubmit.classList.add('formSubmit');
+            const formSubmit = document.createElement("div");
+            formSubmit.classList.add("formSubmit");
             this.dialog.appendChild(formSubmit);
-            this.confirmButton = document.createElement('button');
-            this.confirmButton.classList.add('buttonPrimary');
-            this.confirmButton.textContent = Language.get('wcf.global.confirmation.confirm');
-            this.confirmButton.addEventListener('click', (ev) => this._confirm());
+            this.confirmButton = document.createElement("button");
+            this.confirmButton.classList.add("buttonPrimary");
+            this.confirmButton.textContent = Language.get("wcf.global.confirmation.confirm");
+            this.confirmButton.addEventListener("click", (ev) => this._confirm());
             formSubmit.appendChild(this.confirmButton);
-            const cancelButton = document.createElement('button');
-            cancelButton.textContent = Language.get('wcf.global.confirmation.cancel');
-            cancelButton.addEventListener('click', () => {
+            const cancelButton = document.createElement("button");
+            cancelButton.textContent = Language.get("wcf.global.confirmation.cancel");
+            cancelButton.addEventListener("click", () => {
                 Dialog_1.default.close(this);
             });
             formSubmit.appendChild(cancelButton);
@@ -43,20 +43,19 @@ define(["require", "exports", "tslib", "../Core", "../Language", "./Dialog"], fu
         }
         open(options) {
             this.parameters = options.parameters || {};
-            this._content.innerHTML = (typeof options.template === 'string') ? options.template.trim() : '';
-            this.text[options.messageIsHtml ? 'innerHTML' : 'textContent'] = options.message;
-            if (typeof options.legacyCallback === 'function') {
-                this.callbackCancel = parameters => {
-                    options.legacyCallback('cancel', parameters, this.content);
+            this._content.innerHTML = typeof options.template === "string" ? options.template.trim() : "";
+            this.text[options.messageIsHtml ? "innerHTML" : "textContent"] = options.message;
+            if (typeof options.legacyCallback === "function") {
+                this.callbackCancel = (parameters) => {
+                    options.legacyCallback("cancel", parameters, this.content);
                 };
-                this.callbackConfirm = parameters => {
-                    options.legacyCallback('confirm', parameters, this.content);
+                this.callbackConfirm = (parameters) => {
+                    options.legacyCallback("confirm", parameters, this.content);
                 };
             }
             else {
-                if (typeof options.cancel !== 'function') {
-                    options.cancel = () => {
-                    };
+                if (typeof options.cancel !== "function") {
+                    options.cancel = () => { };
                 }
                 this.callbackCancel = options.cancel;
                 this.callbackConfirm = options.confirm;
@@ -76,7 +75,7 @@ define(["require", "exports", "tslib", "../Core", "../Language", "./Dialog"], fu
         _confirm() {
             this.callbackConfirm(this.parameters, this.content);
             this._active = false;
-            Dialog_1.default.close('wcfSystemConfirmation');
+            Dialog_1.default.close("wcfSystemConfirmation");
         }
         /**
          * Invoked on dialog close or if user cancels the dialog.
@@ -97,11 +96,11 @@ define(["require", "exports", "tslib", "../Core", "../Language", "./Dialog"], fu
         }
         _dialogSetup() {
             return {
-                id: 'wcfSystemConfirmation',
+                id: "wcfSystemConfirmation",
                 options: {
                     onClose: this._onClose.bind(this),
                     onShow: this._onShow.bind(this),
-                    title: Language.get('wcf.global.confirmation.title'),
+                    title: Language.get("wcf.global.confirmation.title"),
                 },
             };
         }
@@ -124,16 +123,16 @@ define(["require", "exports", "tslib", "../Core", "../Language", "./Dialog"], fu
             cancel: null,
             confirm: null,
             legacyCallback: null,
-            message: '',
+            message: "",
             messageIsHtml: false,
             parameters: {},
-            template: '',
+            template: "",
         }, options);
-        options.message = (typeof options.message === 'string') ? options.message.trim() : '';
+        options.message = typeof options.message === "string" ? options.message.trim() : "";
         if (!options.message) {
             throw new Error("Expected a non-empty string for option 'message'.");
         }
-        if (typeof options.confirm !== 'function' && typeof options.legacyCallback !== 'function') {
+        if (typeof options.confirm !== "function" && typeof options.legacyCallback !== "function") {
             throw new TypeError("Expected a valid callback for option 'confirm'.");
         }
         getConfirmation().open(options);
index 25a422559677dc0bc292376121c798b6d0ba7cc4..f317933efd0b5e06cbb2a361f84ef5d82c3cc381 100644 (file)
@@ -26,16 +26,16 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
     const _dialogToObject = new Map();
     let _focusedBeforeDialog;
     let _keyupListener;
-    const _validCallbacks = ['onBeforeClose', 'onClose', 'onShow'];
+    const _validCallbacks = ["onBeforeClose", "onClose", "onShow"];
     // list of supported `input[type]` values for dialog submit
-    const _validInputTypes = ['number', 'password', 'search', 'tel', 'text', 'url'];
+    const _validInputTypes = ["number", "password", "search", "tel", "text", "url"];
     const _focusableElements = [
         'a[href]:not([tabindex^="-"]):not([inert])',
         'area[href]:not([tabindex^="-"]):not([inert])',
-        'input:not([disabled]):not([inert])',
-        'select:not([disabled]):not([inert])',
-        'textarea:not([disabled]):not([inert])',
-        'button:not([disabled]):not([inert])',
+        "input:not([disabled]):not([inert])",
+        "select:not([disabled]):not([inert])",
+        "textarea:not([disabled]):not([inert])",
+        "button:not([disabled]):not([inert])",
         'iframe:not([tabindex^="-"]):not([inert])',
         'audio:not([tabindex^="-"]):not([inert])',
         'video:not([tabindex^="-"]):not([inert])',
@@ -50,27 +50,27 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
          * Sets up global container and internal variables.
          */
         setup() {
-            _container = document.createElement('div');
-            _container.classList.add('dialogOverlay');
-            _container.setAttribute('aria-hidden', 'true');
-            _container.addEventListener('mousedown', (ev) => this._closeOnBackdrop(ev));
-            _container.addEventListener('wheel', event => {
+            _container = document.createElement("div");
+            _container.classList.add("dialogOverlay");
+            _container.setAttribute("aria-hidden", "true");
+            _container.addEventListener("mousedown", (ev) => this._closeOnBackdrop(ev));
+            _container.addEventListener("wheel", (event) => {
                 if (event.target === _container) {
                     event.preventDefault();
                 }
             }, { passive: false });
-            document.getElementById('content').appendChild(_container);
+            document.getElementById("content").appendChild(_container);
             _keyupListener = (event) => {
                 if (event.key === "Escape") {
                     const target = event.target;
-                    if (target.nodeName !== 'INPUT' && target.nodeName !== 'TEXTAREA') {
+                    if (target.nodeName !== "INPUT" && target.nodeName !== "TEXTAREA") {
                         this.close(_activeDialog);
                         return false;
                     }
                 }
                 return true;
             };
-            UiScreen.on('screen-xs', {
+            UiScreen.on("screen-xs", {
                 match() {
                     _dialogFullHeight = true;
                 },
@@ -82,31 +82,31 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
                 },
             });
             this._initStaticDialogs();
-            Listener_1.default.add('Ui/Dialog', () => {
+            Listener_1.default.add("Ui/Dialog", () => {
                 this._initStaticDialogs();
             });
             UiScreen.setDialogContainer(_container);
-            window.addEventListener('resize', () => {
-                _dialogs.forEach(dialog => {
-                    if (!Core.stringToBool(dialog.dialog.getAttribute('aria-hidden'))) {
-                        this.rebuild(dialog.dialog.dataset.id || '');
+            window.addEventListener("resize", () => {
+                _dialogs.forEach((dialog) => {
+                    if (!Core.stringToBool(dialog.dialog.getAttribute("aria-hidden"))) {
+                        this.rebuild(dialog.dialog.dataset.id || "");
                     }
                 });
             });
         },
         _initStaticDialogs() {
-            document.querySelectorAll('.jsStaticDialog').forEach((button) => {
-                button.classList.remove('jsStaticDialog');
-                const id = button.dataset.dialogId || '';
+            document.querySelectorAll(".jsStaticDialog").forEach((button) => {
+                button.classList.remove("jsStaticDialog");
+                const id = button.dataset.dialogId || "";
                 if (id) {
                     const container = document.getElementById(id);
                     if (container !== null) {
-                        container.classList.remove('jsStaticDialogContent');
-                        container.dataset.isStaticDialog = 'true';
+                        container.classList.remove("jsStaticDialogContent");
+                        container.dataset.isStaticDialog = "true";
                         Util_1.default.hide(container);
-                        button.addEventListener('click', event => {
+                        button.addEventListener("click", (event) => {
                             event.preventDefault();
-                            this.openStatic(container.id, null, { title: container.dataset.title || '' });
+                            this.openStatic(container.id, null, { title: container.dataset.title || "" });
                         });
                     }
                 }
@@ -119,10 +119,10 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
             let dialogData = _dialogObjects.get(callbackObject);
             if (dialogData && Core.isPlainObject(dialogData)) {
                 // dialog already exists
-                return this.openStatic(dialogData.id, typeof html === 'undefined' ? null : html);
+                return this.openStatic(dialogData.id, typeof html === "undefined" ? null : html);
             }
             // initialize a new dialog
-            if (typeof callbackObject._dialogSetup !== 'function') {
+            if (typeof callbackObject._dialogSetup !== "function") {
                 throw new Error("Callback object does not implement the method '_dialogSetup()'.");
             }
             const setupData = callbackObject._dialogSetup();
@@ -135,31 +135,33 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
             if (setupData.source === undefined) {
                 dialogElement = document.getElementById(id);
                 if (dialogElement === null) {
-                    throw new Error("Element id '" + id + "' is invalid and no source attribute was given. If you want to use the `html` argument instead, please add `source: null` to your dialog configuration.");
+                    throw new Error("Element id '" +
+                        id +
+                        "' is invalid and no source attribute was given. If you want to use the `html` argument instead, please add `source: null` to your dialog configuration.");
                 }
                 setupData.source = document.createDocumentFragment();
                 setupData.source.appendChild(dialogElement);
-                dialogElement.removeAttribute('id');
+                dialogElement.removeAttribute("id");
                 Util_1.default.show(dialogElement);
             }
             else if (setupData.source === null) {
                 // `null` means there is no static markup and `html` should be used instead
                 setupData.source = html;
             }
-            else if (typeof setupData.source === 'function') {
+            else if (typeof setupData.source === "function") {
                 setupData.source();
             }
             else if (Core.isPlainObject(setupData.source)) {
-                if (typeof html === 'string' && html.trim() !== '') {
+                if (typeof html === "string" && html.trim() !== "") {
                     setupData.source = html;
                 }
                 else {
-                    new Promise((resolve_1, reject_1) => { require(['../Ajax'], resolve_1, reject_1); }).then(tslib_1.__importStar).then(Ajax => {
+                    new Promise((resolve_1, reject_1) => { require(["../Ajax"], resolve_1, reject_1); }).then(tslib_1.__importStar).then((Ajax) => {
                         const source = setupData.source;
-                        Ajax.api(this, source.data, data => {
-                            if (data.returnValues && typeof data.returnValues.template === 'string') {
+                        Ajax.api(this, source.data, (data) => {
+                            if (data.returnValues && typeof data.returnValues.template === "string") {
                                 this.open(callbackObject, data.returnValues.template);
-                                if (typeof source.after === 'function') {
+                                if (typeof source.after === "function") {
                                     source.after(_dialogs.get(id).content, data);
                                 }
                             }
@@ -169,8 +171,8 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
                 }
             }
             else {
-                if (typeof setupData.source === 'string') {
-                    dialogElement = document.createElement('div');
+                if (typeof setupData.source === "string") {
+                    dialogElement = document.createElement("div");
                     dialogElement.id = id;
                     Util_1.default.setInnerHtml(dialogElement, setupData.source);
                     setupData.source = document.createDocumentFragment();
@@ -193,7 +195,7 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
          */
         openStatic(id, html, options) {
             UiScreen.pageOverlayOpen();
-            if (Environment.platform() !== 'desktop') {
+            if (Environment.platform() !== "desktop") {
                 if (!this.isOpen(id)) {
                     UiScreen.scrollDisable();
                 }
@@ -205,10 +207,10 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
                 options = Core.extend({
                     backdropCloseOnClick: true,
                     closable: true,
-                    closeButtonLabel: Language.get('wcf.global.button.close'),
-                    closeConfirmMessage: '',
+                    closeButtonLabel: Language.get("wcf.global.button.close"),
+                    closeConfirmMessage: "",
                     disableContentPadding: false,
-                    title: '',
+                    title: "",
                     onBeforeClose: null,
                     onClose: null,
                     onShow: null,
@@ -216,11 +218,11 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
                 if (!options.closable)
                     options.backdropCloseOnClick = false;
                 if (options.closeConfirmMessage) {
-                    options.onBeforeClose = id => {
-                        new Promise((resolve_2, reject_2) => { require(['./Confirmation'], resolve_2, reject_2); }).then(tslib_1.__importStar).then(UiConfirmation => {
+                    options.onBeforeClose = (id) => {
+                        new Promise((resolve_2, reject_2) => { require(["./Confirmation"], resolve_2, reject_2); }).then(tslib_1.__importStar).then((UiConfirmation) => {
                             UiConfirmation.show({
                                 confirm: this.close.bind(this, id),
-                                message: options.closeConfirmMessage || '',
+                                message: options.closeConfirmMessage || "",
                             });
                         });
                     };
@@ -231,10 +233,10 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
             // iOS breaks `position: fixed` when input elements or `contenteditable`
             // are focused, this will freeze the screen and force Safari to scroll
             // to the input field
-            if (Environment.platform() === 'ios') {
+            if (Environment.platform() === "ios") {
                 window.setTimeout(() => {
                     var _a;
-                    (_a = data.content.querySelector('input, textarea')) === null || _a === void 0 ? void 0 : _a.focus();
+                    (_a = data.content.querySelector("input, textarea")) === null || _a === void 0 ? void 0 : _a.focus();
                 }, 200);
             }
             return data;
@@ -248,7 +250,7 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
             if (data === undefined) {
                 throw new Error("Expected a valid dialog id, '" + id + "' does not match any active dialog.");
             }
-            const dialogTitle = data.dialog.querySelector('.dialogTitle');
+            const dialogTitle = data.dialog.querySelector(".dialogTitle");
             if (dialogTitle) {
                 dialogTitle.textContent = title;
             }
@@ -257,7 +259,7 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
          * Sets a callback function on runtime.
          */
         setCallback(id, key, value) {
-            if (typeof id === 'object') {
+            if (typeof id === "object") {
                 const dialogData = _dialogObjects.get(id);
                 if (dialogData !== undefined) {
                     id = dialogData.id;
@@ -270,7 +272,7 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
             if (_validCallbacks.indexOf(key) === -1) {
                 throw new Error("Invalid callback identifier, '" + key + "' is not recognized.");
             }
-            if (typeof value !== 'function' && value !== null) {
+            if (typeof value !== "function" && value !== null) {
                 throw new Error("Only functions or the 'null' value are acceptable callback values ('" + typeof value + "' given).");
             }
             data[key] = value;
@@ -286,40 +288,40 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
                     throw new Error("Expected either a HTML string or an existing element id.");
                 }
             }
-            const dialog = document.createElement('div');
-            dialog.classList.add('dialogContainer');
-            dialog.setAttribute('aria-hidden', 'true');
-            dialog.setAttribute('role', 'dialog');
+            const dialog = document.createElement("div");
+            dialog.classList.add("dialogContainer");
+            dialog.setAttribute("aria-hidden", "true");
+            dialog.setAttribute("role", "dialog");
             dialog.id = id;
-            const header = document.createElement('header');
+            const header = document.createElement("header");
             dialog.appendChild(header);
             const titleId = Util_1.default.getUniqueId();
-            dialog.setAttribute('aria-labelledby', titleId);
-            const title = document.createElement('span');
-            title.classList.add('dialogTitle');
+            dialog.setAttribute("aria-labelledby", titleId);
+            const title = document.createElement("span");
+            title.classList.add("dialogTitle");
             title.textContent = options.title;
             title.id = titleId;
             header.appendChild(title);
             if (options.closable) {
-                const closeButton = document.createElement('a');
-                closeButton.className = 'dialogCloseButton jsTooltip';
-                closeButton.href = '#';
-                closeButton.setAttribute('role', 'button');
+                const closeButton = document.createElement("a");
+                closeButton.className = "dialogCloseButton jsTooltip";
+                closeButton.href = "#";
+                closeButton.setAttribute("role", "button");
                 closeButton.tabIndex = 0;
                 closeButton.title = options.closeButtonLabel;
-                closeButton.setAttribute('aria-label', options.closeButtonLabel);
-                closeButton.addEventListener('click', (ev) => this._close(ev));
+                closeButton.setAttribute("aria-label", options.closeButtonLabel);
+                closeButton.addEventListener("click", (ev) => this._close(ev));
                 header.appendChild(closeButton);
-                const span = document.createElement('span');
-                span.className = 'icon icon24 fa-times';
+                const span = document.createElement("span");
+                span.className = "icon icon24 fa-times";
                 closeButton.appendChild(span);
             }
-            const contentContainer = document.createElement('div');
-            contentContainer.classList.add('dialogContent');
+            const contentContainer = document.createElement("div");
+            contentContainer.classList.add("dialogContent");
             if (options.disableContentPadding)
-                contentContainer.classList.add('dialogContentNoPadding');
+                contentContainer.classList.add("dialogContentNoPadding");
             dialog.appendChild(contentContainer);
-            contentContainer.addEventListener('wheel', event => {
+            contentContainer.addEventListener("wheel", (event) => {
                 let allowScroll = false;
                 let element = event.target;
                 let clientHeight, scrollHeight, scrollTop;
@@ -333,7 +335,7 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
                             allowScroll = true;
                             break;
                         }
-                        else if (event.deltaY > 0 && (scrollTop + clientHeight < scrollHeight)) {
+                        else if (event.deltaY > 0 && scrollTop + clientHeight < scrollHeight) {
                             allowScroll = true;
                             break;
                         }
@@ -349,8 +351,8 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
             }, { passive: false });
             let content;
             if (element === null) {
-                if (typeof html === 'string') {
-                    content = document.createElement('div');
+                if (typeof html === "string") {
+                    content = document.createElement("div");
                     content.id = id;
                     Util_1.default.setInnerHtml(content, html);
                 }
@@ -363,8 +365,8 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
                             children.push(node);
                         }
                     }
-                    if (children[0].nodeName !== 'DIV' || children.length > 1) {
-                        content = document.createElement('div');
+                    if (children[0].nodeName !== "DIV" || children.length > 1) {
+                        content = document.createElement("div");
                         content.id = id;
                         content.appendChild(html);
                     }
@@ -380,7 +382,7 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
                 content = element;
             }
             contentContainer.appendChild(content);
-            if (content.style.getPropertyValue('display') === 'none') {
+            if (content.style.getPropertyValue("display") === "none") {
                 Util_1.default.show(content);
             }
             _dialogs.set(id, {
@@ -396,7 +398,7 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
                 inputFields: new Set(),
             });
             _container.insertBefore(dialog, _container.firstChild);
-            if (typeof options.onSetup === 'function') {
+            if (typeof options.onSetup === "function") {
                 options.onSetup(content);
             }
             this._updateDialog(id, null);
@@ -409,41 +411,41 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
             if (data === undefined) {
                 throw new Error("Expected a valid dialog id, '" + id + "' does not match any active dialog.");
             }
-            if (typeof html === 'string') {
+            if (typeof html === "string") {
                 Util_1.default.setInnerHtml(data.content, html);
             }
-            if (Core.stringToBool(data.dialog.getAttribute('aria-hidden'))) {
+            if (Core.stringToBool(data.dialog.getAttribute("aria-hidden"))) {
                 // close existing dropdowns
                 Simple_1.default.closeAll();
                 window.WCF.Dropdown.Interactive.Handler.closeAll();
                 if (_callbackFocus === null) {
                     _callbackFocus = this._maintainFocus.bind(this);
-                    document.body.addEventListener('focus', _callbackFocus, { capture: true });
+                    document.body.addEventListener("focus", _callbackFocus, { capture: true });
                 }
-                if (data.closable && Core.stringToBool(_container.getAttribute('aria-hidden'))) {
-                    window.addEventListener('keyup', _keyupListener);
+                if (data.closable && Core.stringToBool(_container.getAttribute("aria-hidden"))) {
+                    window.addEventListener("keyup", _keyupListener);
                 }
                 // Move the dialog to the front to prevent it being hidden behind already open dialogs
                 // if it was previously visible.
                 data.dialog.parentNode.insertBefore(data.dialog, data.dialog.parentNode.firstChild);
-                data.dialog.setAttribute('aria-hidden', 'false');
-                _container.setAttribute('aria-hidden', 'false');
-                _container.setAttribute('close-on-click', (data.backdropCloseOnClick ? 'true' : 'false'));
+                data.dialog.setAttribute("aria-hidden", "false");
+                _container.setAttribute("aria-hidden", "false");
+                _container.setAttribute("close-on-click", data.backdropCloseOnClick ? "true" : "false");
                 _activeDialog = id;
                 // Keep a reference to the currently focused element to be able to restore it later.
                 _focusedBeforeDialog = document.activeElement;
                 // Set the focus to the first focusable child of the dialog element.
-                const closeButton = data.header.querySelector('.dialogCloseButton');
+                const closeButton = data.header.querySelector(".dialogCloseButton");
                 if (closeButton)
-                    closeButton.setAttribute('inert', 'true');
+                    closeButton.setAttribute("inert", "true");
                 this._setFocusToFirstItem(data.dialog, false);
                 if (closeButton)
-                    closeButton.removeAttribute('inert');
-                if (typeof data.onShow === 'function') {
+                    closeButton.removeAttribute("inert");
+                if (typeof data.onShow === "function") {
                     data.onShow(data.content);
                 }
-                if (Core.stringToBool(data.content.dataset.isStaticDialog || '')) {
-                    EventHandler.fire('com.woltlab.wcf.dialog', 'openStatic', {
+                if (Core.stringToBool(data.content.dataset.isStaticDialog || "")) {
+                    EventHandler.fire("com.woltlab.wcf.dialog", "openStatic", {
                         content: data.content,
                         id: id,
                     });
@@ -456,7 +458,9 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
             if (_activeDialog) {
                 const data = _dialogs.get(_activeDialog);
                 const target = event.target;
-                if (!data.dialog.contains(target) && !target.closest('.dropdownMenuContainer') && !target.closest('.datePicker')) {
+                if (!data.dialog.contains(target) &&
+                    !target.closest(".dropdownMenuContainer") &&
+                    !target.closest(".datePicker")) {
                     this._setFocusToFirstItem(data.dialog, true);
                 }
             }
@@ -465,9 +469,9 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
             let focusElement = this._getFirstFocusableChild(dialog);
             if (focusElement !== null) {
                 if (maintain) {
-                    if (focusElement.id === 'username' || focusElement.name === 'username') {
-                        if (Environment.browser() === 'safari' && Environment.platform() === 'ios') {
-                            // iOS Safari's username/password autofill breaks if the input field is focused 
+                    if (focusElement.id === "username" || focusElement.name === "username") {
+                        if (Environment.browser() === "safari" && Environment.platform() === "ios") {
+                            // iOS Safari's username/password autofill breaks if the input field is focused
                             focusElement = null;
                         }
                     }
@@ -476,12 +480,12 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
                     // Setting the focus to a select element in iOS is pretty strange, because
                     // it focuses it, but also displays the keyboard for a fraction of a second,
                     // causing it to pop out from below and immediately vanish.
-                    // 
+                    //
                     // iOS will only show the keyboard if an input element is focused *and* the
                     // focus is an immediate result of a user interaction. This method must be
                     // assumed to be called from within a click event, but we want to set the
                     // focus without triggering the keyboard.
-                    // 
+                    //
                     // We can break the condition by wrapping it in a setTimeout() call,
                     // effectively tricking iOS into focusing the element without showing the
                     // keyboard.
@@ -492,7 +496,7 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
             }
         },
         _getFirstFocusableChild(element) {
-            const nodeList = element.querySelectorAll(_focusableElements.join(','));
+            const nodeList = element.querySelectorAll(_focusableElements.join(","));
             for (let i = 0, length = nodeList.length; i < length; i++) {
                 if (nodeList[i].offsetWidth && nodeList[i].offsetHeight && nodeList[i].getClientRects().length) {
                     return nodeList[i];
@@ -510,53 +514,53 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
                 throw new Error("Expected a valid dialog id, '" + id + "' does not match any active dialog.");
             }
             // ignore non-active dialogs
-            if (Core.stringToBool(data.dialog.getAttribute('aria-hidden'))) {
+            if (Core.stringToBool(data.dialog.getAttribute("aria-hidden"))) {
                 return;
             }
             const contentContainer = data.content.parentNode;
-            const formSubmit = data.content.querySelector('.formSubmit');
+            const formSubmit = data.content.querySelector(".formSubmit");
             let unavailableHeight = 0;
             if (formSubmit !== null) {
-                contentContainer.classList.add('dialogForm');
-                formSubmit.classList.add('dialogFormSubmit');
+                contentContainer.classList.add("dialogForm");
+                formSubmit.classList.add("dialogFormSubmit");
                 unavailableHeight += Util_1.default.outerHeight(formSubmit);
                 // Calculated height can be a fractional value and depending on the
                 // browser the results can vary. By subtracting a single pixel we're
                 // working around fractional values, without visually changing anything.
                 unavailableHeight -= 1;
-                contentContainer.style.setProperty('margin-bottom', unavailableHeight + 'px', '');
+                contentContainer.style.setProperty("margin-bottom", unavailableHeight + "px", "");
             }
             else {
-                contentContainer.classList.remove('dialogForm');
-                contentContainer.style.removeProperty('margin-bottom');
+                contentContainer.classList.remove("dialogForm");
+                contentContainer.style.removeProperty("margin-bottom");
             }
             unavailableHeight += Util_1.default.outerHeight(data.header);
-            const maximumHeight = (window.innerHeight * (_dialogFullHeight ? 1 : 0.8)) - unavailableHeight;
-            contentContainer.style.setProperty('max-height', ~~maximumHeight + 'px', '');
+            const maximumHeight = window.innerHeight * (_dialogFullHeight ? 1 : 0.8) - unavailableHeight;
+            contentContainer.style.setProperty("max-height", ~~maximumHeight + "px", "");
             // fix for a calculation bug in Chrome causing the scrollbar to overlap the border
-            if (Environment.browser() === 'chrome') {
+            if (Environment.browser() === "chrome") {
                 if (data.content.scrollHeight > maximumHeight) {
-                    data.content.style.setProperty('margin-right', '-1px', '');
+                    data.content.style.setProperty("margin-right", "-1px", "");
                 }
                 else {
-                    data.content.style.removeProperty('margin-right');
+                    data.content.style.removeProperty("margin-right");
                 }
             }
             // Chrome and Safari use heavy anti-aliasing when the dialog's width
             // cannot be evenly divided, causing the whole text to become blurry
-            if (Environment.browser() === 'chrome' || Environment.browser() === 'safari') {
+            if (Environment.browser() === "chrome" || Environment.browser() === "safari") {
                 // The new Microsoft Edge is detected as "chrome", because effectively we're detecting
                 // Chromium rather than Chrome specifically. The workaround for fractional pixels does
                 // not work well in Edge, there seems to be a different logic for fractional positions,
                 // causing the text to be blurry.
-                // 
+                //
                 // We can use `backface-visibility: hidden` to prevent the anti aliasing artifacts in
                 // WebKit/Blink, which will also prevent some weird font rendering issues when resizing.
-                contentContainer.classList.add('jsWebKitFractionalPixelFix');
+                contentContainer.classList.add("jsWebKitFractionalPixelFix");
             }
             const callbackObject = _dialogToObject.get(id);
             //noinspection JSUnresolvedVariable
-            if (callbackObject !== undefined && typeof callbackObject._dialogSubmit === 'function') {
+            if (callbackObject !== undefined && typeof callbackObject._dialogSubmit === "function") {
                 const inputFields = data.content.querySelectorAll('input[data-dialog-submit-on-enter="true"]');
                 const submitButton = data.content.querySelector('.formSubmit > input[type="submit"], .formSubmit > button[data-type="submit"]');
                 if (submitButton === null) {
@@ -569,12 +573,12 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
                 }
                 if (data.submitButton !== submitButton) {
                     data.submitButton = submitButton;
-                    submitButton.addEventListener('click', event => {
+                    submitButton.addEventListener("click", (event) => {
                         event.preventDefault();
                         this._submit(id);
                     });
                     const _callbackKeydown = (event) => {
-                        if (event.key === 'Enter') {
+                        if (event.key === "Enter") {
                             event.preventDefault();
                             this._submit(id);
                         }
@@ -590,7 +594,7 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
                             continue;
                         }
                         data.inputFields.add(inputField);
-                        inputField.addEventListener('keydown', _callbackKeydown);
+                        inputField.addEventListener("keydown", _callbackKeydown);
                     }
                 }
             }
@@ -601,10 +605,10 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
         _submit(id) {
             const data = _dialogs.get(id);
             let isValid = true;
-            data.inputFields.forEach(inputField => {
+            data.inputFields.forEach((inputField) => {
                 if (inputField.required) {
-                    if (inputField.value.trim() === '') {
-                        Util_1.default.innerError(inputField, Language.get('wcf.global.form.error.empty'));
+                    if (inputField.value.trim() === "") {
+                        Util_1.default.innerError(inputField, Language.get("wcf.global.form.error.empty"));
                         isValid = false;
                     }
                     else {
@@ -614,7 +618,7 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
             });
             if (isValid) {
                 const callbackObject = _dialogToObject.get(id);
-                if (typeof callbackObject._dialogSubmit === 'function') {
+                if (typeof callbackObject._dialogSubmit === "function") {
                     callbackObject._dialogSubmit();
                 }
             }
@@ -625,7 +629,7 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
         _close(event) {
             event.preventDefault();
             const data = _dialogs.get(_activeDialog);
-            if (typeof data.onBeforeClose === 'function') {
+            if (typeof data.onBeforeClose === "function") {
                 data.onBeforeClose(_activeDialog);
                 return false;
             }
@@ -639,7 +643,7 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
             if (event.target !== _container) {
                 return;
             }
-            if (Core.stringToBool(_container.getAttribute('close-on-click'))) {
+            if (Core.stringToBool(_container.getAttribute("close-on-click"))) {
                 this._close(event);
             }
             else {
@@ -655,37 +659,37 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
             if (data === undefined) {
                 throw new Error("Expected a valid dialog id, '" + id + "' does not match any active dialog.");
             }
-            data.dialog.setAttribute('aria-hidden', 'true');
+            data.dialog.setAttribute("aria-hidden", "true");
             // Move the keyboard focus away from a now hidden element.
             const activeElement = document.activeElement;
-            if (activeElement.closest('.dialogContainer') === data.dialog) {
+            if (activeElement.closest(".dialogContainer") === data.dialog) {
                 activeElement.blur();
             }
-            if (typeof data.onClose === 'function') {
+            if (typeof data.onClose === "function") {
                 data.onClose(id);
             }
             // get next active dialog
             _activeDialog = null;
             for (let i = 0; i < _container.childElementCount; i++) {
                 const child = _container.children[i];
-                if (!Core.stringToBool(child.getAttribute('aria-hidden'))) {
-                    _activeDialog = child.dataset.id || '';
+                if (!Core.stringToBool(child.getAttribute("aria-hidden"))) {
+                    _activeDialog = child.dataset.id || "";
                     break;
                 }
             }
             UiScreen.pageOverlayClose();
             if (_activeDialog === null) {
-                _container.setAttribute('aria-hidden', 'true');
-                _container.dataset.closeOnClick = 'false';
+                _container.setAttribute("aria-hidden", "true");
+                _container.dataset.closeOnClick = "false";
                 if (data.closable) {
-                    window.removeEventListener('keyup', _keyupListener);
+                    window.removeEventListener("keyup", _keyupListener);
                 }
             }
             else {
                 data = _dialogs.get(_activeDialog);
-                _container.dataset.closeOnClick = data.backdropCloseOnClick ? 'true' : 'false';
+                _container.dataset.closeOnClick = data.backdropCloseOnClick ? "true" : "false";
             }
-            if (Environment.platform() !== 'desktop') {
+            if (Environment.platform() !== "desktop") {
                 UiScreen.scrollEnable();
             }
         },
@@ -700,7 +704,7 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
          */
         isOpen(id) {
             const data = this.getDialog(id);
-            return data !== undefined && data.dialog.getAttribute('aria-hidden') === 'false';
+            return data !== undefined && data.dialog.getAttribute("aria-hidden") === "false";
         },
         /**
          * Destroys a dialog instance.
@@ -708,7 +712,7 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
          * @param  {Object}  callbackObject  the same object that was used to invoke `_dialogSetup()` on first call
          */
         destroy(callbackObject) {
-            if (typeof callbackObject !== 'object') {
+            if (typeof callbackObject !== "object") {
                 throw new TypeError("Expected the callback object as parameter.");
             }
             if (_dialogObjects.has(callbackObject)) {
@@ -734,7 +738,7 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
          * @protected
          */
         _getDialogId(id) {
-            if (typeof id === 'object') {
+            if (typeof id === "object") {
                 const dialogData = _dialogObjects.get(id);
                 if (dialogData !== undefined) {
                     return dialogData.id;
index a12491e47b952988c565b96833118428bd4a18d3..4b63783c5c742214179fcae4acd7ed5026ccbe29 100644 (file)
@@ -15,41 +15,41 @@ define(["require", "exports", "tslib", "../../Core", "./Simple"], function (requ
     const _validIconSizes = [16, 24, 32, 48, 64, 96, 144];
     function validateList(list) {
         if (!(list instanceof HTMLUListElement)) {
-            throw new TypeError('Expected a reference to an <ul> element.');
+            throw new TypeError("Expected a reference to an <ul> element.");
         }
-        if (!list.classList.contains('dropdownMenu')) {
-            throw new Error('List does not appear to be a dropdown menu.');
+        if (!list.classList.contains("dropdownMenu")) {
+            throw new Error("List does not appear to be a dropdown menu.");
         }
     }
     function buildItemFromData(data) {
-        const item = document.createElement('li');
+        const item = document.createElement("li");
         // handle special `divider` type
-        if (data === 'divider') {
-            item.className = 'dropdownDivider';
+        if (data === "divider") {
+            item.className = "dropdownDivider";
             return item;
         }
-        if (typeof data.identifier === 'string') {
+        if (typeof data.identifier === "string") {
             item.dataset.identifier = data.identifier;
         }
-        const link = document.createElement('a');
-        link.href = (typeof data.href === 'string') ? data.href : '#';
-        if (typeof data.callback === 'function') {
-            link.addEventListener('click', event => {
+        const link = document.createElement("a");
+        link.href = typeof data.href === "string" ? data.href : "#";
+        if (typeof data.callback === "function") {
+            link.addEventListener("click", (event) => {
                 event.preventDefault();
                 data.callback(link);
             });
         }
-        else if (link.href === '#') {
-            throw new Error('Expected either a `href` value or a `callback`.');
+        else if (link.href === "#") {
+            throw new Error("Expected either a `href` value or a `callback`.");
         }
         if (data.attributes && Core.isPlainObject(data.attributes)) {
-            Object.keys(data.attributes).forEach(key => {
+            Object.keys(data.attributes).forEach((key) => {
                 const value = data.attributes[key];
-                if (typeof value !== 'string') {
-                    throw new Error('Expected only string values.');
+                if (typeof value !== "string") {
+                    throw new Error("Expected only string values.");
                 }
                 // Support the dash notation for backwards compatibility.
-                if (key.indexOf('-') !== -1) {
+                if (key.indexOf("-") !== -1) {
                     link.setAttribute(`data-${key}`, value);
                 }
                 else {
@@ -58,26 +58,26 @@ define(["require", "exports", "tslib", "../../Core", "./Simple"], function (requ
             });
         }
         item.appendChild(link);
-        if (typeof data.icon !== 'undefined' && Core.isPlainObject(data.icon)) {
-            if (typeof data.icon.name !== 'string') {
-                throw new TypeError('Expected a valid icon name.');
+        if (typeof data.icon !== "undefined" && Core.isPlainObject(data.icon)) {
+            if (typeof data.icon.name !== "string") {
+                throw new TypeError("Expected a valid icon name.");
             }
             let size = 16;
-            if (typeof data.icon.size === 'number' && _validIconSizes.indexOf(~~data.icon.size) !== -1) {
+            if (typeof data.icon.size === "number" && _validIconSizes.indexOf(~~data.icon.size) !== -1) {
                 size = ~~data.icon.size;
             }
-            const icon = document.createElement('span');
-            icon.className = 'icon icon' + size + ' fa-' + data.icon.name;
+            const icon = document.createElement("span");
+            icon.className = "icon icon" + size + " fa-" + data.icon.name;
             link.appendChild(icon);
         }
-        const label = (typeof data.label === 'string') ? data.label.trim() : '';
-        const labelHtml = (typeof data.labelHtml === 'string') ? data.labelHtml.trim() : '';
-        if (label === '' && labelHtml === '') {
-            throw new TypeError('Expected either a label or a `labelHtml`.');
+        const label = typeof data.label === "string" ? data.label.trim() : "";
+        const labelHtml = typeof data.labelHtml === "string" ? data.labelHtml.trim() : "";
+        if (label === "" && labelHtml === "") {
+            throw new TypeError("Expected either a label or a `labelHtml`.");
         }
-        const span = document.createElement('span');
-        span[label ? 'textContent' : 'innerHTML'] = (label) ? label : labelHtml;
-        link.appendChild(document.createTextNode(' '));
+        const span = document.createElement("span");
+        span[label ? "textContent" : "innerHTML"] = label ? label : labelHtml;
+        link.appendChild(document.createTextNode(" "));
         link.appendChild(span);
         return item;
     }
@@ -87,9 +87,9 @@ define(["require", "exports", "tslib", "../../Core", "./Simple"], function (requ
      * into the DOM by the callee.
      */
     function create(items, identifier) {
-        const list = document.createElement('ul');
-        list.className = 'dropdownMenu';
-        if (typeof identifier === 'string') {
+        const list = document.createElement("ul");
+        list.className = "dropdownMenu";
+        if (typeof identifier === "string") {
             list.dataset.identifier = identifier;
         }
         if (Array.isArray(items) && items.length > 0) {
@@ -119,18 +119,18 @@ define(["require", "exports", "tslib", "../../Core", "./Simple"], function (requ
     function appendItems(list, items) {
         validateList(list);
         if (!Array.isArray(items)) {
-            throw new TypeError('Expected an array of items.');
+            throw new TypeError("Expected an array of items.");
         }
         const length = items.length;
         if (length === 0) {
-            throw new Error('Expected a non-empty list of items.');
+            throw new Error("Expected a non-empty list of items.");
         }
         if (length === 1) {
             appendItem(list, items[0]);
         }
         else {
             const fragment = document.createDocumentFragment();
-            items.forEach(item => {
+            items.forEach((item) => {
                 fragment.appendChild(buildItemFromData(item));
             });
             list.appendChild(fragment);
@@ -142,7 +142,7 @@ define(["require", "exports", "tslib", "../../Core", "./Simple"], function (requ
      */
     function setItems(list, items) {
         validateList(list);
-        list.innerHTML = '';
+        list.innerHTML = "";
         appendItems(list, items);
     }
     exports.setItems = setItems;
@@ -154,7 +154,7 @@ define(["require", "exports", "tslib", "../../Core", "./Simple"], function (requ
     function attach(list, button) {
         validateList(list);
         Simple_1.default.initFragment(button, list);
-        button.addEventListener('click', event => {
+        button.addEventListener("click", (event) => {
             event.preventDefault();
             event.stopPropagation();
             Simple_1.default.toggleDropdown(button.id);
@@ -166,7 +166,7 @@ define(["require", "exports", "tslib", "../../Core", "./Simple"], function (requ
      * be created.
      */
     function divider() {
-        return 'divider';
+        return "divider";
     }
     exports.divider = divider;
 });
index 41e1777dc732df5af92c56bf3209411ca58b7a4b..f23c260f2247721ea692d57b74c5876be7ac32ce 100644 (file)
@@ -30,8 +30,8 @@ define(["require", "exports", "tslib", "./Simple"], function (require, exports,
         if (_dropdowns.has(identifier)) {
             return;
         }
-        const ghostElement = document.createElement('div');
-        ghostElement.id = 'reusableDropdownGhost' + _ghostElementId++;
+        const ghostElement = document.createElement("div");
+        ghostElement.id = "reusableDropdownGhost" + _ghostElementId++;
         Simple_1.default.initFragment(ghostElement, menu);
         _dropdowns.set(identifier, ghostElement.id);
     }
index b634a8e91eda7b1ea8e636408ae3ac193d416a96..f2bdf658208a65cce1fb278520c571549e5b5d10 100644 (file)
@@ -22,13 +22,13 @@ define(["require", "exports", "tslib", "../../CallbackList", "../../Core", "../.
     const _dropdowns = new Map();
     const _menus = new Map();
     let _menuContainer;
-    let _activeTargetId = '';
+    let _activeTargetId = "";
     /**
      * Handles drop-down positions in overlays when scrolling in the overlay.
      */
     function onDialogScroll(event) {
         const dialogContent = event.currentTarget;
-        const dropdowns = dialogContent.querySelectorAll('.dropdown.dropdownOpen');
+        const dropdowns = dialogContent.querySelectorAll(".dropdown.dropdownOpen");
         for (let i = 0, length = dropdowns.length; i < length; i++) {
             const dropdown = dropdowns[i];
             const containerId = Util_1.default.identify(dropdown);
@@ -61,13 +61,13 @@ define(["require", "exports", "tslib", "../../CallbackList", "../../Core", "../.
      */
     function onScroll() {
         _dropdowns.forEach((dropdown, containerId) => {
-            if (dropdown.classList.contains('dropdownOpen')) {
-                if (Core.stringToBool(dropdown.dataset.isOverlayDropdownButton || '')) {
+            if (dropdown.classList.contains("dropdownOpen")) {
+                if (Core.stringToBool(dropdown.dataset.isOverlayDropdownButton || "")) {
                     UiDropdownSimple.setAlignment(dropdown, _menus.get(containerId));
                 }
                 else {
                     const menu = _menus.get(dropdown.id);
-                    if (!Core.stringToBool(menu.dataset.dropdownIgnorePageScroll || '')) {
+                    if (!Core.stringToBool(menu.dataset.dropdownIgnorePageScroll || "")) {
                         UiDropdownSimple.close(containerId);
                     }
                 }
@@ -78,7 +78,7 @@ define(["require", "exports", "tslib", "../../CallbackList", "../../Core", "../.
      * Notifies callbacks on status change.
      */
     function notifyCallbacks(containerId, action) {
-        _callbacks.forEach(containerId, callback => {
+        _callbacks.forEach(containerId, (callback) => {
             callback(containerId, action);
         });
     }
@@ -105,24 +105,24 @@ define(["require", "exports", "tslib", "../../CallbackList", "../../Core", "../.
                 button = event.currentTarget;
                 parent = button.parentNode;
                 if (parent !== dropdown) {
-                    parent.classList.add('dropdown');
+                    parent.classList.add("dropdown");
                     parent.id = dropdown.id;
                     // remove dropdown class and id from old parent
-                    dropdown.classList.remove('dropdown');
-                    dropdown.id = '';
+                    dropdown.classList.remove("dropdown");
+                    dropdown.id = "";
                     dropdown = parent;
                     _dropdowns.set(targetId, parent);
                 }
             }
             if (disableAutoFocus === undefined) {
-                button = dropdown.closest('.dropdownToggle');
+                button = dropdown.closest(".dropdownToggle");
                 if (!button) {
-                    button = dropdown.querySelector('.dropdownToggle');
+                    button = dropdown.querySelector(".dropdownToggle");
                     if (!button && dropdown.id) {
                         button = document.querySelector('[data-target="' + dropdown.id + '"]');
                     }
                 }
-                if (button && Core.stringToBool(button.dataset.dropdownLazyInit || '')) {
+                if (button && Core.stringToBool(button.dataset.dropdownLazyInit || "")) {
                     disableAutoFocus = true;
                 }
             }
@@ -130,31 +130,32 @@ define(["require", "exports", "tslib", "../../CallbackList", "../../Core", "../.
             // to close it is by clicking somewhere else in the document or on another dropdown
             // toggle. This is used with the search bar to prevent the dropdown from closing by
             // setting the caret position in the search input field.
-            if (Core.stringToBool(dropdown.dataset.dropdownPreventToggle || '') && dropdown.classList.contains('dropdownOpen')) {
+            if (Core.stringToBool(dropdown.dataset.dropdownPreventToggle || "") &&
+                dropdown.classList.contains("dropdownOpen")) {
                 preventToggle = true;
             }
             // check if 'isOverlayDropdownButton' is set which indicates that the dropdown toggle is within an overlay
-            if (dropdown.dataset.isOverlayDropdownButton === '') {
-                const dialogContent = DomTraverse.parentByClass(dropdown, 'dialogContent');
-                dropdown.dataset.isOverlayDropdownButton = (dialogContent !== null) ? 'true' : 'false';
+            if (dropdown.dataset.isOverlayDropdownButton === "") {
+                const dialogContent = DomTraverse.parentByClass(dropdown, "dialogContent");
+                dropdown.dataset.isOverlayDropdownButton = dialogContent !== null ? "true" : "false";
                 if (dialogContent !== null) {
-                    dialogContent.addEventListener('scroll', onDialogScroll);
+                    dialogContent.addEventListener("scroll", onDialogScroll);
                 }
             }
         }
         // close all dropdowns
-        _activeTargetId = '';
+        _activeTargetId = "";
         _dropdowns.forEach((dropdown, containerId) => {
             const menu = _menus.get(containerId);
             let firstListItem = null;
-            if (dropdown.classList.contains('dropdownOpen')) {
+            if (dropdown.classList.contains("dropdownOpen")) {
                 if (!preventToggle) {
-                    dropdown.classList.remove('dropdownOpen');
-                    menu.classList.remove('dropdownOpen');
-                    const button = dropdown.querySelector('.dropdownToggle');
+                    dropdown.classList.remove("dropdownOpen");
+                    menu.classList.remove("dropdownOpen");
+                    const button = dropdown.querySelector(".dropdownToggle");
                     if (button)
-                        button.setAttribute('aria-expanded', 'false');
-                    notifyCallbacks(containerId, 'close');
+                        button.setAttribute("aria-expanded", "false");
+                    notifyCallbacks(containerId, "close");
                 }
                 else {
                     _activeTargetId = targetId;
@@ -162,43 +163,43 @@ define(["require", "exports", "tslib", "../../CallbackList", "../../Core", "../.
             }
             else if (containerId === targetId && menu.childElementCount > 0) {
                 _activeTargetId = targetId;
-                dropdown.classList.add('dropdownOpen');
-                menu.classList.add('dropdownOpen');
-                const button = dropdown.querySelector('.dropdownToggle');
+                dropdown.classList.add("dropdownOpen");
+                menu.classList.add("dropdownOpen");
+                const button = dropdown.querySelector(".dropdownToggle");
                 if (button)
-                    button.setAttribute('aria-expanded', 'true');
+                    button.setAttribute("aria-expanded", "true");
                 const list = menu.childElementCount > 0 ? menu.children[0] : null;
-                if (list && Core.stringToBool(list.dataset.scrollToActive || '')) {
+                if (list && Core.stringToBool(list.dataset.scrollToActive || "")) {
                     delete list.dataset.scrollToActive;
                     let active = null;
                     for (let i = 0, length = list.childElementCount; i < length; i++) {
-                        if (list.children[i].classList.contains('active')) {
+                        if (list.children[i].classList.contains("active")) {
                             active = list.children[i];
                             break;
                         }
                     }
                     if (active) {
-                        list.scrollTop = Math.max((active.offsetTop + active.clientHeight) - menu.clientHeight, 0);
+                        list.scrollTop = Math.max(active.offsetTop + active.clientHeight - menu.clientHeight, 0);
                     }
                 }
-                const itemList = menu.querySelector('.scrollableDropdownMenu');
+                const itemList = menu.querySelector(".scrollableDropdownMenu");
                 if (itemList !== null) {
-                    itemList.classList[(itemList.scrollHeight > itemList.clientHeight ? 'add' : 'remove')]('forceScrollbar');
+                    itemList.classList[itemList.scrollHeight > itemList.clientHeight ? "add" : "remove"]("forceScrollbar");
                 }
-                notifyCallbacks(containerId, 'open');
+                notifyCallbacks(containerId, "open");
                 if (!disableAutoFocus) {
-                    menu.setAttribute('role', 'menu');
+                    menu.setAttribute("role", "menu");
                     menu.tabIndex = -1;
-                    menu.removeEventListener('keydown', dropdownMenuKeyDown);
-                    menu.addEventListener('keydown', dropdownMenuKeyDown);
-                    menu.querySelectorAll('li').forEach(listItem => {
+                    menu.removeEventListener("keydown", dropdownMenuKeyDown);
+                    menu.addEventListener("keydown", dropdownMenuKeyDown);
+                    menu.querySelectorAll("li").forEach((listItem) => {
                         if (!listItem.clientHeight)
                             return;
                         if (firstListItem === null)
                             firstListItem = listItem;
-                        else if (listItem.classList.contains('active'))
+                        else if (listItem.classList.contains("active"))
                             firstListItem = listItem;
-                        listItem.setAttribute('role', 'menuitem');
+                        listItem.setAttribute("role", "menuitem");
                         listItem.tabIndex = -1;
                     });
                 }
@@ -209,37 +210,37 @@ define(["require", "exports", "tslib", "../../CallbackList", "../../Core", "../.
             }
         });
         window.WCF.Dropdown.Interactive.Handler.closeAll();
-        return (event === null);
+        return event === null;
     }
     function handleKeyDown(event) {
         // <input> elements are not valid targets for drop-down menus. However, some developers
         // might still decide to combine them, in which case we try not to break things even more.
         const target = event.currentTarget;
-        if (target.nodeName === 'INPUT') {
+        if (target.nodeName === "INPUT") {
             return;
         }
-        if (event.key === 'Enter' || event.key === 'Space') {
+        if (event.key === "Enter" || event.key === "Space") {
             event.preventDefault();
             toggle(event);
         }
     }
     function dropdownMenuKeyDown(event) {
         const activeItem = document.activeElement;
-        if (activeItem.nodeName !== 'LI') {
+        if (activeItem.nodeName !== "LI") {
             return;
         }
-        if (event.key === 'ArrowDown' || event.key === 'ArrowUp' || event.key === 'End' || event.key === 'Home') {
+        if (event.key === "ArrowDown" || event.key === "ArrowUp" || event.key === "End" || event.key === "Home") {
             event.preventDefault();
-            const listItems = Array.from(activeItem.closest('.dropdownMenu').querySelectorAll('li'));
-            if (event.key === 'ArrowUp' || event.key === 'End') {
+            const listItems = Array.from(activeItem.closest(".dropdownMenu").querySelectorAll("li"));
+            if (event.key === "ArrowUp" || event.key === "End") {
                 listItems.reverse();
             }
             let newActiveItem = null;
-            const isValidItem = listItem => {
-                return !listItem.classList.contains('dropdownDivider') && listItem.clientHeight > 0;
+            const isValidItem = (listItem) => {
+                return !listItem.classList.contains("dropdownDivider") && listItem.clientHeight > 0;
             };
             let activeIndex = listItems.indexOf(activeItem);
-            if (event.key === 'End' || event.key === 'Home') {
+            if (event.key === "End" || event.key === "Home") {
                 activeIndex = -1;
             }
             for (let i = activeIndex + 1; i < listItems.length; i++) {
@@ -255,27 +256,28 @@ define(["require", "exports", "tslib", "../../CallbackList", "../../Core", "../.
                 newActiveItem.focus();
             }
         }
-        else if (event.key === 'Enter' || event.key === 'Space') {
+        else if (event.key === "Enter" || event.key === "Space") {
             event.preventDefault();
             let target = activeItem;
-            if (target.childElementCount === 1 && (target.children[0].nodeName === 'SPAN' || target.children[0].nodeName === 'A')) {
+            if (target.childElementCount === 1 &&
+                (target.children[0].nodeName === "SPAN" || target.children[0].nodeName === "A")) {
                 target = target.children[0];
             }
             const dropdown = _dropdowns.get(_activeTargetId);
-            const button = dropdown.querySelector('.dropdownToggle');
-            const mouseEvent = dropdown.dataset.a11yMouseEvent || 'click';
+            const button = dropdown.querySelector(".dropdownToggle");
+            const mouseEvent = dropdown.dataset.a11yMouseEvent || "click";
             Core.triggerEvent(target, mouseEvent);
             if (button) {
                 button.focus();
             }
         }
-        else if (event.key === 'Escape' || event.key === 'Tab') {
+        else if (event.key === "Escape" || event.key === "Tab") {
             event.preventDefault();
             const dropdown = _dropdowns.get(_activeTargetId);
-            let button = dropdown.querySelector('.dropdownToggle');
+            let button = dropdown.querySelector(".dropdownToggle");
             // Remote controlled drop-down menus may not have a dedicated toggle button, instead the
             // `dropdown` element itself is the button.
-            if (button === null && !dropdown.classList.contains('dropdown')) {
+            if (button === null && !dropdown.classList.contains("dropdown")) {
                 button = dropdown;
             }
             toggle(null, _activeTargetId);
@@ -292,14 +294,14 @@ define(["require", "exports", "tslib", "../../CallbackList", "../../Core", "../.
             if (_didInit)
                 return;
             _didInit = true;
-            _menuContainer = document.createElement('div');
-            _menuContainer.className = 'dropdownMenuContainer';
+            _menuContainer = document.createElement("div");
+            _menuContainer.className = "dropdownMenuContainer";
             document.body.appendChild(_menuContainer);
-            _availableDropdowns = document.getElementsByClassName('dropdownToggle');
+            _availableDropdowns = document.getElementsByClassName("dropdownToggle");
             UiDropdownSimple.initAll();
-            CloseOverlay_1.default.add('WoltLabSuite/Core/Ui/Dropdown/Simple', UiDropdownSimple.closeAll);
-            Listener_1.default.add('WoltLabSuite/Core/Ui/Dropdown/Simple', UiDropdownSimple.initAll);
-            document.addEventListener('scroll', onScroll);
+            CloseOverlay_1.default.add("WoltLabSuite/Core/Ui/Dropdown/Simple", UiDropdownSimple.closeAll);
+            Listener_1.default.add("WoltLabSuite/Core/Ui/Dropdown/Simple", UiDropdownSimple.initAll);
+            document.addEventListener("scroll", onScroll);
             // expose on window object for backward compatibility
             window.bc_wcfSimpleDropdown = this;
         },
@@ -316,18 +318,18 @@ define(["require", "exports", "tslib", "../../CallbackList", "../../Core", "../.
          */
         init(button, isLazyInitialization) {
             UiDropdownSimple.setup();
-            button.setAttribute('role', 'button');
+            button.setAttribute("role", "button");
             button.tabIndex = 0;
-            button.setAttribute('aria-haspopup', 'true');
-            button.setAttribute('aria-expanded', 'false');
-            if (button.classList.contains('jsDropdownEnabled') || button.dataset.target) {
+            button.setAttribute("aria-haspopup", "true");
+            button.setAttribute("aria-expanded", "false");
+            if (button.classList.contains("jsDropdownEnabled") || button.dataset.target) {
                 return false;
             }
-            const dropdown = DomTraverse.parentByClass(button, 'dropdown');
+            const dropdown = DomTraverse.parentByClass(button, "dropdown");
             if (dropdown === null) {
                 throw new Error("Invalid dropdown passed, button '" + Util_1.default.identify(button) + "' does not have a parent with .dropdown.");
             }
-            const menu = DomTraverse.nextByClass(button, 'dropdownMenu');
+            const menu = DomTraverse.nextByClass(button, "dropdownMenu");
             if (menu === null) {
                 throw new Error("Invalid dropdown passed, button '" + Util_1.default.identify(button) + "' does not have a menu as next sibling.");
             }
@@ -335,21 +337,21 @@ define(["require", "exports", "tslib", "../../CallbackList", "../../Core", "../.
             _menuContainer.appendChild(menu);
             const containerId = Util_1.default.identify(dropdown);
             if (!_dropdowns.has(containerId)) {
-                button.classList.add('jsDropdownEnabled');
-                button.addEventListener('click', toggle);
-                button.addEventListener('keydown', handleKeyDown);
+                button.classList.add("jsDropdownEnabled");
+                button.addEventListener("click", toggle);
+                button.addEventListener("keydown", handleKeyDown);
                 _dropdowns.set(containerId, dropdown);
                 _menus.set(containerId, menu);
                 if (!containerId.match(/^wcf\d+$/)) {
                     menu.dataset.source = containerId;
                 }
                 // prevent page scrolling
-                if (menu.childElementCount && menu.children[0].classList.contains('scrollableDropdownMenu')) {
+                if (menu.childElementCount && menu.children[0].classList.contains("scrollableDropdownMenu")) {
                     const child = menu.children[0];
-                    child.dataset.scrollToActive = 'true';
+                    child.dataset.scrollToActive = "true";
                     let menuHeight = null;
                     let menuRealHeight = null;
-                    child.addEventListener('wheel', event => {
+                    child.addEventListener("wheel", (event) => {
                         if (menuHeight === null)
                             menuHeight = child.clientHeight;
                         if (menuRealHeight === null)
@@ -358,7 +360,7 @@ define(["require", "exports", "tslib", "../../CallbackList", "../../Core", "../.
                         if (event.deltaY < 0 && child.scrollTop === 0) {
                             event.preventDefault();
                         }
-                        else if (event.deltaY > 0 && (child.scrollTop + menuHeight === menuRealHeight)) {
+                        else if (event.deltaY > 0 && child.scrollTop + menuHeight === menuRealHeight) {
                             event.preventDefault();
                         }
                     }, { passive: false });
@@ -367,8 +369,8 @@ define(["require", "exports", "tslib", "../../CallbackList", "../../Core", "../.
             button.dataset.target = containerId;
             if (isLazyInitialization) {
                 setTimeout(() => {
-                    button.dataset.dropdownLazyInit = (isLazyInitialization instanceof MouseEvent) ? 'true' : 'false';
-                    Core.triggerEvent(button, 'click');
+                    button.dataset.dropdownLazyInit = isLazyInitialization instanceof MouseEvent ? "true" : "false";
+                    Core.triggerEvent(button, "click");
                     setTimeout(() => {
                         delete button.dataset.dropdownLazyInit;
                     }, 10);
@@ -418,19 +420,19 @@ define(["require", "exports", "tslib", "../../CallbackList", "../../Core", "../.
          */
         setAlignment(dropdown, dropdownMenu, alternateElement) {
             // check if button belongs to an i18n textarea
-            const button = dropdown.querySelector('.dropdownToggle');
-            const parent = (button !== null) ? button.parentNode : null;
+            const button = dropdown.querySelector(".dropdownToggle");
+            const parent = button !== null ? button.parentNode : null;
             let refDimensionsElement;
-            if (parent && parent.classList.contains('inputAddonTextarea')) {
+            if (parent && parent.classList.contains("inputAddonTextarea")) {
                 refDimensionsElement = button;
             }
             UiAlignment.set(dropdownMenu, alternateElement || dropdown, {
-                pointerClassNames: ['dropdownArrowBottom', 'dropdownArrowRight'],
+                pointerClassNames: ["dropdownArrowBottom", "dropdownArrowRight"],
                 refDimensionsElement: refDimensionsElement || null,
                 // alignment
-                horizontal: dropdownMenu.dataset.dropdownAlignmentHorizontal === 'right' ? 'right' : 'left',
-                vertical: dropdownMenu.dataset.dropdownAlignmentVertical === 'top' ? 'top' : 'bottom',
-                allowFlip: dropdownMenu.dataset.dropdownAllowFlip || 'both',
+                horizontal: dropdownMenu.dataset.dropdownAlignmentHorizontal === "right" ? "right" : "left",
+                vertical: dropdownMenu.dataset.dropdownAlignmentVertical === "top" ? "top" : "bottom",
+                allowFlip: dropdownMenu.dataset.dropdownAllowFlip || "both",
             });
         },
         /**
@@ -449,14 +451,14 @@ define(["require", "exports", "tslib", "../../CallbackList", "../../Core", "../.
          */
         isOpen(containerId) {
             const menu = _menus.get(containerId);
-            return (menu !== undefined && menu.classList.contains('dropdownOpen'));
+            return menu !== undefined && menu.classList.contains("dropdownOpen");
         },
         /**
          * Opens the dropdown unless it is already open.
          */
         open(containerId, disableAutoFocus) {
             const menu = _menus.get(containerId);
-            if (menu !== undefined && !menu.classList.contains('dropdownOpen')) {
+            if (menu !== undefined && !menu.classList.contains("dropdownOpen")) {
                 UiDropdownSimple.toggleDropdown(containerId, undefined, disableAutoFocus);
             }
         },
@@ -466,8 +468,8 @@ define(["require", "exports", "tslib", "../../CallbackList", "../../Core", "../.
         close(containerId) {
             const dropdown = _dropdowns.get(containerId);
             if (dropdown !== undefined) {
-                dropdown.classList.remove('dropdownOpen');
-                _menus.get(containerId).classList.remove('dropdownOpen');
+                dropdown.classList.remove("dropdownOpen");
+                _menus.get(containerId).classList.remove("dropdownOpen");
             }
         },
         /**
@@ -475,10 +477,10 @@ define(["require", "exports", "tslib", "../../CallbackList", "../../Core", "../.
          */
         closeAll() {
             _dropdowns.forEach((dropdown, containerId) => {
-                if (dropdown.classList.contains('dropdownOpen')) {
-                    dropdown.classList.remove('dropdownOpen');
-                    _menus.get(containerId).classList.remove('dropdownOpen');
-                    notifyCallbacks(containerId, 'close');
+                if (dropdown.classList.contains("dropdownOpen")) {
+                    dropdown.classList.remove("dropdownOpen");
+                    _menus.get(containerId).classList.remove("dropdownOpen");
+                    notifyCallbacks(containerId, "close");
                 }
             });
         },
index d8a8871b981ee6baed711c807a343a18b26986a9..e799b4c220e8e1fb7f0c5b26a8393fd4547d88e1 100644 (file)
@@ -42,7 +42,7 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ch
          */
         createButtons() {
             let triggerChange = false;
-            this.target.querySelectorAll('li.uploadedFile').forEach((element) => {
+            this.target.querySelectorAll("li.uploadedFile").forEach((element) => {
                 const uniqueFileId = element.dataset.uniqueFileId;
                 if (this.containers.has(uniqueFileId)) {
                     return;
@@ -63,17 +63,17 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ch
          * Init the delete button for a specific element.
          */
         initDeleteButton(element, elementData) {
-            const buttonGroup = element.querySelector('.buttonGroup');
+            const buttonGroup = element.querySelector(".buttonGroup");
             if (buttonGroup === null) {
                 throw new Error(`Button group in '${this.target.id}' is unknown.`);
             }
-            const li = document.createElement('li');
-            const span = document.createElement('span');
+            const li = document.createElement("li");
+            const span = document.createElement("span");
             span.className = "button jsDeleteButton small";
-            span.textContent = Language.get('wcf.global.button.delete');
+            span.textContent = Language.get("wcf.global.button.delete");
             li.appendChild(span);
             buttonGroup.appendChild(li);
-            li.addEventListener('click', this.deleteElement.bind(this, elementData.uniqueFileId));
+            li.addEventListener("click", this.deleteElement.bind(this, elementData.uniqueFileId));
         }
         /**
          * Delete a specific file with the given uniqueFileId.
@@ -92,7 +92,7 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ch
                 this.createButtons();
                 return;
             }
-            const img = this.target.querySelector('img');
+            const img = this.target.querySelector("img");
             if (img !== null) {
                 const uniqueFileId = img.dataset.uniqueFileId;
                 if (!this.containers.has(uniqueFileId)) {
@@ -101,13 +101,13 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ch
                         element: img,
                     };
                     this.containers.set(uniqueFileId, elementData);
-                    this.deleteButton = document.createElement('p');
-                    this.deleteButton.className = 'button deleteButton';
-                    const span = document.createElement('span');
-                    span.textContent = Language.get('wcf.global.button.delete');
+                    this.deleteButton = document.createElement("p");
+                    this.deleteButton.className = "button deleteButton";
+                    const span = document.createElement("span");
+                    span.textContent = Language.get("wcf.global.button.delete");
                     this.deleteButton.appendChild(span);
                     this.buttonContainer.appendChild(this.deleteButton);
-                    this.deleteButton.addEventListener('click', this.deleteElement.bind(this, elementData.uniqueFileId));
+                    this.deleteButton.addEventListener("click", this.deleteElement.bind(this, elementData.uniqueFileId));
                 }
             }
         }
@@ -119,11 +119,11 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ch
                 this.deleteButton = undefined;
             }
             this.uploadHandler.checkMaxFiles();
-            Core.triggerEvent(this.target, 'change');
+            Core.triggerEvent(this.target, "change");
         }
         _ajaxSetup() {
             return {
-                url: 'index.php?ajax-file-delete/&t=' + window.SECURITY_TOKEN,
+                url: "index.php?ajax-file-delete/&t=" + window.SECURITY_TOKEN,
             };
         }
     }
index 282b7968f10a57a49bf260a1a0395a515f4ff82e..1f43a29ecb827b294ea591066385d76f840d3017 100644 (file)
@@ -23,15 +23,15 @@ define(["require", "exports", "tslib", "../Dom/Change/Listener", "../Dom/Util",
      * Register default menus and set up event listeners.
      */
     function setup() {
-        if (document.getElementById('mainMenu') !== null) {
-            register('mainMenu');
+        if (document.getElementById("mainMenu") !== null) {
+            register("mainMenu");
         }
-        const navigationHeader = document.querySelector('.navigationHeader');
+        const navigationHeader = document.querySelector(".navigationHeader");
         if (navigationHeader !== null) {
             register(Util_1.default.identify(navigationHeader));
         }
-        window.addEventListener('resize', rebuildAll);
-        Listener_1.default.add('WoltLabSuite/Core/Ui/FlexibleMenu', registerTabMenus);
+        window.addEventListener("resize", rebuildAll);
+        Listener_1.default.add("WoltLabSuite/Core/Ui/FlexibleMenu", registerTabMenus);
     }
     exports.setup = setup;
     /**
@@ -45,7 +45,7 @@ define(["require", "exports", "tslib", "../Dom/Change/Listener", "../Dom/Util",
         if (_containers.has(containerId)) {
             return;
         }
-        const list = DomTraverse.childByTag(container, 'UL');
+        const list = DomTraverse.childByTag(container, "UL");
         if (list === null) {
             throw "Expected an <ul> element as child of container '" + containerId + "'.";
         }
@@ -58,10 +58,12 @@ define(["require", "exports", "tslib", "../Dom/Change/Listener", "../Dom/Util",
      * Registers tab menus.
      */
     function registerTabMenus() {
-        document.querySelectorAll('.tabMenuContainer:not(.jsFlexibleMenuEnabled), .messageTabMenu:not(.jsFlexibleMenuEnabled)').forEach(tabMenu => {
-            const nav = DomTraverse.childByTag(tabMenu, 'NAV');
+        document
+            .querySelectorAll(".tabMenuContainer:not(.jsFlexibleMenuEnabled), .messageTabMenu:not(.jsFlexibleMenuEnabled)")
+            .forEach((tabMenu) => {
+            const nav = DomTraverse.childByTag(tabMenu, "NAV");
             if (nav !== null) {
-                tabMenu.classList.add('jsFlexibleMenuEnabled');
+                tabMenu.classList.add("jsFlexibleMenuEnabled");
                 register(Util_1.default.identify(nav));
             }
         });
@@ -87,17 +89,17 @@ define(["require", "exports", "tslib", "../Dom/Change/Listener", "../Dom/Util",
         const styles = window.getComputedStyle(container);
         const parent = container.parentNode;
         let availableWidth = parent.clientWidth;
-        availableWidth -= Util_1.default.styleAsInt(styles, 'margin-left');
-        availableWidth -= Util_1.default.styleAsInt(styles, 'margin-right');
+        availableWidth -= Util_1.default.styleAsInt(styles, "margin-left");
+        availableWidth -= Util_1.default.styleAsInt(styles, "margin-right");
         const list = _itemLists.get(containerId);
-        const items = DomTraverse.childrenByTag(list, 'LI');
+        const items = DomTraverse.childrenByTag(list, "LI");
         let dropdown = _dropdowns.get(containerId);
         let dropdownWidth = 0;
         if (dropdown !== undefined) {
             // show all items for calculation
             for (let i = 0, length = items.length; i < length; i++) {
                 const item = items[i];
-                if (item.classList.contains('dropdown')) {
+                if (item.classList.contains("dropdown")) {
                     continue;
                 }
                 Util_1.default.show(item);
@@ -113,7 +115,9 @@ define(["require", "exports", "tslib", "../Dom/Change/Listener", "../Dom/Util",
             for (let i = items.length - 1; i >= 0; i--) {
                 const item = items[i];
                 // ignore dropdown and active item
-                if (item.classList.contains('dropdown') || item.classList.contains('active') || item.classList.contains('ui-state-active')) {
+                if (item.classList.contains("dropdown") ||
+                    item.classList.contains("active") ||
+                    item.classList.contains("ui-state-active")) {
                     continue;
                 }
                 hiddenItems.push(item);
@@ -126,13 +130,13 @@ define(["require", "exports", "tslib", "../Dom/Change/Listener", "../Dom/Util",
         if (hiddenItems.length) {
             let dropdownMenu;
             if (dropdown === undefined) {
-                dropdown = document.createElement('li');
-                dropdown.className = 'dropdown jsFlexibleMenuDropdown';
-                const icon = document.createElement('a');
-                icon.className = 'icon icon16 fa-list';
+                dropdown = document.createElement("li");
+                dropdown.className = "dropdown jsFlexibleMenuDropdown";
+                const icon = document.createElement("a");
+                icon.className = "icon icon16 fa-list";
                 dropdown.appendChild(icon);
-                dropdownMenu = document.createElement('ul');
-                dropdownMenu.classList.add('dropdownMenu');
+                dropdownMenu = document.createElement("ul");
+                dropdownMenu.classList.add("dropdownMenu");
                 dropdown.appendChild(dropdownMenu);
                 _dropdowns.set(containerId, dropdown);
                 _dropdownMenus.set(containerId, dropdownMenu);
@@ -146,13 +150,13 @@ define(["require", "exports", "tslib", "../Dom/Change/Listener", "../Dom/Util",
             }
             // build dropdown menu
             const fragment = document.createDocumentFragment();
-            hiddenItems.forEach(hiddenItem => {
-                const item = document.createElement('li');
+            hiddenItems.forEach((hiddenItem) => {
+                const item = document.createElement("li");
                 item.innerHTML = hiddenItem.innerHTML;
-                item.addEventListener('click', event => {
+                item.addEventListener("click", (event) => {
                     var _a;
                     event.preventDefault();
-                    (_a = hiddenItem.querySelector('a')) === null || _a === void 0 ? void 0 : _a.click();
+                    (_a = hiddenItem.querySelector("a")) === null || _a === void 0 ? void 0 : _a.click();
                     // force a rebuild to guarantee the active item being visible
                     setTimeout(() => {
                         rebuild(containerId);
@@ -160,7 +164,7 @@ define(["require", "exports", "tslib", "../Dom/Change/Listener", "../Dom/Util",
                 });
                 fragment.appendChild(item);
             });
-            dropdownMenu.innerHTML = '';
+            dropdownMenu.innerHTML = "";
             dropdownMenu.appendChild(fragment);
         }
         else if (dropdown !== undefined && dropdown.parentNode !== null) {
index e9a02bf738030bb16cc0bd20ce2542c2bfed24b5..7260b2c7d5b4f55603771cd1d3ae5faa027ed33b 100644 (file)
@@ -16,7 +16,7 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Languag
     Suggestion_1 = tslib_1.__importDefault(Suggestion_1);
     Simple_1 = tslib_1.__importDefault(Simple_1);
     Util_1 = tslib_1.__importDefault(Util_1);
-    let _activeId = '';
+    let _activeId = "";
     const _data = new Map();
     /**
      * Creates the DOM structure for target element. If `element` is a `<textarea>`
@@ -24,26 +24,26 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Languag
      */
     function createUI(element, options) {
         const parentElement = element.parentElement;
-        const list = document.createElement('ol');
-        list.className = 'inputItemList' + (element.disabled ? ' disabled' : '');
+        const list = document.createElement("ol");
+        list.className = "inputItemList" + (element.disabled ? " disabled" : "");
         list.dataset.elementId = element.id;
-        list.addEventListener('click', event => {
+        list.addEventListener("click", (event) => {
             if (event.target === list) {
                 element.focus();
             }
         });
-        const listItem = document.createElement('li');
-        listItem.className = 'input';
+        const listItem = document.createElement("li");
+        listItem.className = "input";
         list.appendChild(listItem);
-        element.addEventListener('keydown', keyDown);
-        element.addEventListener('keypress', keyPress);
-        element.addEventListener('keyup', keyUp);
-        element.addEventListener('paste', paste);
-        const hasFocus = (element === document.activeElement);
+        element.addEventListener("keydown", keyDown);
+        element.addEventListener("keypress", keyPress);
+        element.addEventListener("keyup", keyUp);
+        element.addEventListener("paste", paste);
+        const hasFocus = element === document.activeElement;
         if (hasFocus) {
             element.blur();
         }
-        element.addEventListener('blur', blur);
+        element.addEventListener("blur", blur);
         parentElement.insertBefore(list, element);
         listItem.appendChild(element);
         if (hasFocus) {
@@ -54,29 +54,29 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Languag
         if (options.maxLength !== -1) {
             element.maxLength = options.maxLength;
         }
-        const limitReached = document.createElement('span');
-        limitReached.className = 'inputItemListLimitReached';
-        limitReached.textContent = Language.get('wcf.global.form.input.maxItems');
+        const limitReached = document.createElement("span");
+        limitReached.className = "inputItemListLimitReached";
+        limitReached.textContent = Language.get("wcf.global.form.input.maxItems");
         Util_1.default.hide(limitReached);
         listItem.appendChild(limitReached);
         let shadow = null;
         const values = [];
         if (options.isCSV) {
-            shadow = document.createElement('input');
-            shadow.className = 'itemListInputShadow';
-            shadow.type = 'hidden';
+            shadow = document.createElement("input");
+            shadow.className = "itemListInputShadow";
+            shadow.type = "hidden";
             shadow.name = element.name;
-            element.removeAttribute('name');
+            element.removeAttribute("name");
             list.parentNode.insertBefore(shadow, list);
-            element.value.split(',').forEach(value => {
+            element.value.split(",").forEach((value) => {
                 value = value.trim();
                 if (value) {
                     values.push(value);
                 }
             });
-            if (element.nodeName === 'TEXTAREA') {
-                const inputElement = document.createElement('input');
-                inputElement.type = 'text';
+            if (element.nodeName === "TEXTAREA") {
+                const inputElement = document.createElement("input");
+                inputElement.type = "text";
                 parentElement.insertBefore(inputElement, element);
                 inputElement.id = element.id;
                 element.remove();
@@ -99,7 +99,7 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Languag
         if (data.options.maxItems === -1) {
             return true;
         }
-        return (data.list.childElementCount - 1 < data.options.maxItems);
+        return data.list.childElementCount - 1 < data.options.maxItems;
     }
     /**
      * Enforces the maximum number of items.
@@ -122,21 +122,21 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Languag
         const input = event.currentTarget;
         _activeId = input.id;
         const lastItem = input.parentElement.previousElementSibling;
-        if (event.key === 'Backspace') {
+        if (event.key === "Backspace") {
             if (input.value.length === 0) {
                 if (lastItem !== null) {
-                    if (lastItem.classList.contains('active')) {
+                    if (lastItem.classList.contains("active")) {
                         removeItem(lastItem);
                     }
                     else {
-                        lastItem.classList.add('active');
+                        lastItem.classList.add("active");
                     }
                 }
             }
         }
-        else if (event.key === 'Escape') {
-            if (lastItem !== null && lastItem.classList.contains('active')) {
-                lastItem.classList.remove('active');
+        else if (event.key === "Escape") {
+            if (lastItem !== null && lastItem.classList.contains("active")) {
+                lastItem.classList.remove("active");
             }
         }
     }
@@ -144,7 +144,7 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Languag
      * Handles the `[ENTER]` and `[,]` key to add an item to the list unless it is restricted.
      */
     function keyPress(event) {
-        if (event.key === 'Enter' || event.key === ',') {
+        if (event.key === "Enter" || event.key === ",") {
             event.preventDefault();
             const input = event.currentTarget;
             if (_data.get(input.id).options.restricted) {
@@ -162,11 +162,11 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Languag
      */
     function paste(event) {
         event.preventDefault();
-        const text = event.clipboardData.getData('text/plain');
+        const text = event.clipboardData.getData("text/plain");
         const element = event.currentTarget;
         const elementId = element.id;
         const maxLength = +element.maxLength;
-        text.split(/,/).forEach(item => {
+        text.split(/,/).forEach((item) => {
             item = item.trim();
             if (maxLength && item.length > maxLength) {
                 // truncating items provides a better UX than throwing an error or silently discarding it
@@ -185,7 +185,7 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Languag
         if (input.value.length > 0) {
             const lastItem = input.parentElement.previousElementSibling;
             if (lastItem !== null) {
-                lastItem.classList.remove('active');
+                lastItem.classList.remove("active");
             }
         }
     }
@@ -194,10 +194,10 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Languag
      */
     function addItem(elementId, value) {
         const data = _data.get(elementId);
-        const listItem = document.createElement('li');
-        listItem.className = 'item';
-        const content = document.createElement('span');
-        content.className = 'content';
+        const listItem = document.createElement("li");
+        listItem.className = "item";
+        const content = document.createElement("span");
+        content.className = "content";
         content.dataset.objectId = value.objectId.toString();
         if (value.type) {
             content.dataset.type = value.type;
@@ -205,19 +205,19 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Languag
         content.textContent = value.value;
         listItem.appendChild(content);
         if (!data.element.disabled) {
-            const button = document.createElement('a');
-            button.className = 'icon icon16 fa-times';
-            button.addEventListener('click', removeItem);
+            const button = document.createElement("a");
+            button.className = "icon icon16 fa-times";
+            button.addEventListener("click", removeItem);
             listItem.appendChild(button);
         }
         data.list.insertBefore(listItem, data.listItem);
         data.suggestion.addExcludedValue(value.value);
-        data.element.value = '';
+        data.element.value = "";
         if (!data.element.disabled) {
             handleLimit(elementId);
         }
         let values = syncShadow(data);
-        if (typeof data.options.callbackChange === 'function') {
+        if (typeof data.options.callbackChange === "function") {
             if (values === null) {
                 values = getValues(elementId);
             }
@@ -233,7 +233,7 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Languag
             item = target.parentElement;
         }
         const parent = item.parentElement;
-        const elementId = parent.dataset.elementId || '';
+        const elementId = parent.dataset.elementId || "";
         const data = _data.get(elementId);
         if (item.children[0].textContent) {
             data.suggestion.removeExcludedValue(item.children[0].textContent);
@@ -244,7 +244,7 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Languag
         }
         handleLimit(elementId);
         let values = syncShadow(data);
-        if (typeof data.options.callbackChange === 'function') {
+        if (typeof data.options.callbackChange === "function") {
             if (values === null) {
                 values = getValues(elementId);
             }
@@ -258,13 +258,13 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Languag
         if (!data.options.isCSV) {
             return null;
         }
-        if (typeof data.options.callbackSyncShadow === 'function') {
+        if (typeof data.options.callbackSyncShadow === "function") {
             return data.options.callbackSyncShadow(data);
         }
         const values = getValues(data.element.id);
         data.shadow.value = getValues(data.element.id)
-            .map(value => value.value)
-            .join(',');
+            .map((value) => value.value)
+            .join(",");
         return values;
     }
     /**
@@ -298,7 +298,7 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Languag
         // remove data from previous instance
         if (_data.has(elementId)) {
             const tmp = _data.get(elementId);
-            Object.keys(tmp).forEach(key => {
+            Object.keys(tmp).forEach((key) => {
                 const el = tmp[key];
                 if (el instanceof Element && el.parentNode) {
                     el.remove();
@@ -310,8 +310,8 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Languag
         options = Core.extend({
             // search parameters for suggestions
             ajax: {
-                actionName: 'getSearchResultList',
-                className: '',
+                actionName: "getSearchResultList",
+                className: "",
                 data: {},
             },
             // list of excluded string values, e.g. `['ignore', 'these strings', 'when', 'searching']`
@@ -333,15 +333,15 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Languag
             // Callback to set values during the setup.
             callbackSetupValues: null,
             // value may contain the placeholder `{$objectId}`
-            submitFieldName: '',
+            submitFieldName: "",
         }, options);
-        const form = DomTraverse.parentByTag(element, 'FORM');
+        const form = DomTraverse.parentByTag(element, "FORM");
         if (form !== null) {
             if (!options.isCSV) {
-                if (!options.submitFieldName.length && typeof options.callbackSubmit !== 'function') {
+                if (!options.submitFieldName.length && typeof options.callbackSubmit !== "function") {
                     throw new Error("Expected a valid function for option 'callbackSubmit', a non-empty value for option 'submitFieldName' or enabling the option 'submitFieldCSV'.");
                 }
-                form.addEventListener('submit', () => {
+                form.addEventListener("submit", () => {
                     if (acceptsNewItems(elementId)) {
                         const value = _data.get(elementId).element.value.trim();
                         if (value.length) {
@@ -350,10 +350,10 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Languag
                     }
                     const values = getValues(elementId);
                     if (options.submitFieldName.length) {
-                        values.forEach(value => {
-                            const input = document.createElement('input');
-                            input.type = 'hidden';
-                            input.name = options.submitFieldName.replace('{$objectId}', value.objectId.toString());
+                        values.forEach((value) => {
+                            const input = document.createElement("input");
+                            input.type = "hidden";
+                            input.name = options.submitFieldName.replace("{$objectId}", value.objectId.toString());
                             input.value = value.value;
                             form.appendChild(input);
                         });
@@ -364,7 +364,7 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Languag
                 });
             }
             else {
-                form.addEventListener('submit', () => {
+                form.addEventListener("submit", () => {
                     if (acceptsNewItems(elementId)) {
                         const value = _data.get(elementId).element.value.trim();
                         if (value.length) {
@@ -394,11 +394,11 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Languag
             values = options.callbackSetupValues();
         }
         else {
-            values = (data.values.length) ? data.values : values;
+            values = data.values.length ? data.values : values;
         }
         if (Array.isArray(values)) {
-            values.forEach(value => {
-                if (typeof value === 'string') {
+            values.forEach((value) => {
+                if (typeof value === "string") {
                     value = { objectId: 0, value: value };
                 }
                 addItem(elementId, value);
@@ -415,9 +415,9 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Languag
             throw new Error("Element id '" + elementId + "' is unknown.");
         }
         const values = [];
-        data.list.querySelectorAll('.item > span').forEach((span) => {
+        data.list.querySelectorAll(".item > span").forEach((span) => {
             values.push({
-                objectId: +(span.dataset.objectId || ''),
+                objectId: +(span.dataset.objectId || ""),
                 value: span.textContent.trim(),
                 type: span.dataset.type,
             });
@@ -434,11 +434,11 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Traverse", "../Languag
             throw new Error("Element id '" + elementId + "' is unknown.");
         }
         // remove all existing items first
-        DomTraverse.childrenByClass(data.list, 'item').forEach((item) => {
+        DomTraverse.childrenByClass(data.list, "item").forEach((item) => {
             removeItem(item, true);
         });
         // add new items
-        values.forEach(value => {
+        values.forEach((value) => {
             addItem(elementId, value);
         });
     }
index 3353292b31516dd65bb68d1e72639fdf0d1586ba..6651195eaf1c36c2fba18ac15298dca3faf81d9f 100644 (file)
@@ -22,10 +22,10 @@ define(["require", "exports", "tslib", "../Language"], function (require, export
         if (_didInit)
             return;
         _didInit = true;
-        _notificationElement = document.createElement('div');
-        _notificationElement.id = 'systemNotification';
-        _message = document.createElement('p');
-        _message.addEventListener('click', hide);
+        _notificationElement = document.createElement("div");
+        _notificationElement.id = "systemNotification";
+        _message = document.createElement("p");
+        _message.addEventListener("click", hide);
         _notificationElement.appendChild(_message);
         document.body.appendChild(_notificationElement);
     }
@@ -34,7 +34,7 @@ define(["require", "exports", "tslib", "../Language"], function (require, export
      */
     function hide() {
         clearTimeout(_timeout);
-        _notificationElement.classList.remove('active');
+        _notificationElement.classList.remove("active");
         if (_callback !== null) {
             _callback();
         }
@@ -49,10 +49,10 @@ define(["require", "exports", "tslib", "../Language"], function (require, export
         }
         _busy = true;
         init();
-        _callback = (typeof callback === 'function') ? callback : null;
-        _message.className = cssClassName || 'success';
-        _message.textContent = Language.get(message || 'wcf.global.success');
-        _notificationElement.classList.add('active');
+        _callback = typeof callback === "function" ? callback : null;
+        _message.className = cssClassName || "success";
+        _message.textContent = Language.get(message || "wcf.global.success");
+        _notificationElement.classList.add("active");
         _timeout = setTimeout(hide, 2000);
     }
     exports.show = show;
index 356e1fbba42a5ba9825dd8f986ee4a37d027789e..2af0bb30806cdfe92831b6fc1344bffbe2e8fe78 100644 (file)
@@ -19,17 +19,17 @@ define(["require", "exports", "tslib", "../../Core", "../../Language"], function
     let _toTopButton;
     let _wrapper;
     function buildToTopButton() {
-        const button = document.createElement('a');
-        button.className = 'button buttonPrimary pageActionButtonToTop initiallyHidden jsTooltip';
-        button.href = '';
-        button.title = Language.get('wcf.global.scrollUp');
-        button.setAttribute('aria-hidden', 'true');
+        const button = document.createElement("a");
+        button.className = "button buttonPrimary pageActionButtonToTop initiallyHidden jsTooltip";
+        button.href = "";
+        button.title = Language.get("wcf.global.scrollUp");
+        button.setAttribute("aria-hidden", "true");
         button.innerHTML = '<span class="icon icon32 fa-angle-up"></span>';
-        button.addEventListener('click', scrollToTop);
+        button.addEventListener("click", scrollToTop);
         return button;
     }
     function onScroll() {
-        if (document.documentElement.classList.contains('disableScrolling')) {
+        if (document.documentElement.classList.contains("disableScrolling")) {
             // Ignore any scroll events that take place while body scrolling is disabled,
             // because it messes up the scroll offsets.
             return;
@@ -41,33 +41,33 @@ define(["require", "exports", "tslib", "../../Core", "../../Language"], function
             return;
         }
         if (offset >= 300) {
-            if (_toTopButton.classList.contains('initiallyHidden')) {
-                _toTopButton.classList.remove('initiallyHidden');
+            if (_toTopButton.classList.contains("initiallyHidden")) {
+                _toTopButton.classList.remove("initiallyHidden");
             }
-            _toTopButton.setAttribute('aria-hidden', 'false');
+            _toTopButton.setAttribute("aria-hidden", "false");
         }
         else {
-            _toTopButton.setAttribute('aria-hidden', 'true');
+            _toTopButton.setAttribute("aria-hidden", "true");
         }
         renderContainer();
         if (_lastPosition !== -1) {
-            _wrapper.classList[offset < _lastPosition ? 'remove' : 'add']('scrolledDown');
+            _wrapper.classList[offset < _lastPosition ? "remove" : "add"]("scrolledDown");
         }
         _lastPosition = offset;
     }
     function scrollToTop(event) {
         event.preventDefault();
-        const topAnchor = document.getElementById('top');
-        topAnchor.scrollIntoView({ behavior: 'smooth' });
+        const topAnchor = document.getElementById("top");
+        topAnchor.scrollIntoView({ behavior: "smooth" });
     }
     /**
      * Toggles the container's visibility.
      */
     function renderContainer() {
-        const visibleChild = Array.from(_container.children).find(element => {
-            return element.getAttribute('aria-hidden') === 'false';
+        const visibleChild = Array.from(_container.children).find((element) => {
+            return element.getAttribute("aria-hidden") === "false";
         });
-        _container.classList[visibleChild ? 'add' : 'remove']('active');
+        _container.classList[visibleChild ? "add" : "remove"]("active");
     }
     /**
      * Initializes the page action container.
@@ -77,15 +77,15 @@ define(["require", "exports", "tslib", "../../Core", "../../Language"], function
             return;
         }
         _didInit = true;
-        _wrapper = document.createElement('div');
-        _wrapper.className = 'pageAction';
-        _container = document.createElement('div');
-        _container.className = 'pageActionButtons';
+        _wrapper = document.createElement("div");
+        _wrapper.className = "pageAction";
+        _container = document.createElement("div");
+        _container.className = "pageActionButtons";
         _wrapper.appendChild(_container);
         _toTopButton = buildToTopButton();
         _wrapper.appendChild(_toTopButton);
         document.body.appendChild(_wrapper);
-        window.addEventListener('scroll', Core.debounce(onScroll, 100), { passive: true });
+        window.addEventListener("scroll", Core.debounce(onScroll, 100), { passive: true });
         onScroll();
     }
     exports.setup = setup;
@@ -98,12 +98,12 @@ define(["require", "exports", "tslib", "../../Core", "../../Language"], function
         setup();
         // The wrapper is required for backwards compatibility, because some implementations rely on a
         // dedicated parent element to insert elements, for example, for drop-down menus.
-        const wrapper = document.createElement('div');
-        wrapper.className = 'pageActionButton';
+        const wrapper = document.createElement("div");
+        wrapper.className = "pageActionButton";
         wrapper.dataset.name = buttonName;
-        wrapper.setAttribute('aria-hidden', 'true');
-        button.classList.add('button');
-        button.classList.add('buttonPrimary');
+        wrapper.setAttribute("aria-hidden", "true");
+        button.classList.add("button");
+        button.classList.add("buttonPrimary");
         wrapper.appendChild(button);
         let insertBefore = null;
         if (insertBeforeButton) {
@@ -119,13 +119,13 @@ define(["require", "exports", "tslib", "../../Core", "../../Language"], function
             insertBefore = _container.firstChild;
         }
         _container.insertBefore(wrapper, insertBefore);
-        _wrapper.classList.remove('scrolledDown');
+        _wrapper.classList.remove("scrolledDown");
         _buttons.set(buttonName, button);
         // Query a layout related property to force a reflow, otherwise the transition is optimized away.
         // noinspection BadExpressionStatementJS
         wrapper.offsetParent;
         // Toggle the visibility to force the transition to be applied.
-        wrapper.setAttribute('aria-hidden', 'false');
+        wrapper.setAttribute("aria-hidden", "false");
         renderContainer();
     }
     exports.add = add;
@@ -152,17 +152,17 @@ define(["require", "exports", "tslib", "../../Core", "../../Language"], function
             const listItem = button.parentElement;
             const callback = () => {
                 try {
-                    if (Core.stringToBool(listItem.getAttribute('aria-hidden'))) {
+                    if (Core.stringToBool(listItem.getAttribute("aria-hidden"))) {
                         _container.removeChild(listItem);
                         _buttons.delete(buttonName);
                     }
-                    listItem.removeEventListener('transitionend', callback);
+                    listItem.removeEventListener("transitionend", callback);
                 }
                 catch (e) {
                     // ignore errors if the element has already been removed
                 }
             };
-            listItem.addEventListener('transitionend', callback);
+            listItem.addEventListener("transitionend", callback);
             hide(buttonName);
         }
     }
@@ -174,7 +174,7 @@ define(["require", "exports", "tslib", "../../Core", "../../Language"], function
         const button = _buttons.get(buttonName);
         if (button) {
             const parent = button.parentElement;
-            parent.setAttribute('aria-hidden', 'true');
+            parent.setAttribute("aria-hidden", "true");
             renderContainer();
         }
     }
@@ -186,11 +186,11 @@ define(["require", "exports", "tslib", "../../Core", "../../Language"], function
         const button = _buttons.get(buttonName);
         if (button) {
             const parent = button.parentElement;
-            if (parent.classList.contains('initiallyHidden')) {
-                parent.classList.remove('initiallyHidden');
+            if (parent.classList.contains("initiallyHidden")) {
+                parent.classList.remove("initiallyHidden");
             }
-            parent.setAttribute('aria-hidden', 'false');
-            _wrapper.classList.remove('scrolledDown');
+            parent.setAttribute("aria-hidden", "false");
+            _wrapper.classList.remove("scrolledDown");
             renderContainer();
         }
     }
index 36583e54f005743b66362146d38d874a5ad8db51..6ce133f916582f19fe16f38ffadd8d1bf7891b16 100644 (file)
@@ -27,30 +27,30 @@ define(["require", "exports", "tslib", "../../../Event/Handler", "../../Alignmen
      * Provides the collapsible search bar.
      */
     function initSearchBar() {
-        _pageHeaderSearch = document.getElementById('pageHeaderSearch');
-        _pageHeaderSearch.addEventListener('click', ev => ev.stopPropagation());
-        _pageHeaderPanel = document.getElementById('pageHeaderPanel');
-        _searchInput = document.getElementById('pageHeaderSearchInput');
-        _topMenu = document.getElementById('topMenu');
-        _userPanelSearchButton = document.getElementById('userPanelSearchButton');
-        _userPanelSearchButton.addEventListener('click', event => {
+        _pageHeaderSearch = document.getElementById("pageHeaderSearch");
+        _pageHeaderSearch.addEventListener("click", (ev) => ev.stopPropagation());
+        _pageHeaderPanel = document.getElementById("pageHeaderPanel");
+        _searchInput = document.getElementById("pageHeaderSearchInput");
+        _topMenu = document.getElementById("topMenu");
+        _userPanelSearchButton = document.getElementById("userPanelSearchButton");
+        _userPanelSearchButton.addEventListener("click", (event) => {
             event.preventDefault();
             event.stopPropagation();
-            if (_pageHeader.classList.contains('searchBarOpen')) {
+            if (_pageHeader.classList.contains("searchBarOpen")) {
                 closeSearchBar();
             }
             else {
                 openSearchBar();
             }
         });
-        CloseOverlay_1.default.add('WoltLabSuite/Core/Ui/Page/Header/Fixed', () => {
-            if (_pageHeader.classList.contains('searchBarForceOpen')) {
+        CloseOverlay_1.default.add("WoltLabSuite/Core/Ui/Page/Header/Fixed", () => {
+            if (_pageHeader.classList.contains("searchBarForceOpen")) {
                 return;
             }
             closeSearchBar();
         });
-        EventHandler.add('com.woltlab.wcf.MainMenuMobile', 'more', data => {
-            if (data.identifier === 'com.woltlab.wcf.search') {
+        EventHandler.add("com.woltlab.wcf.MainMenuMobile", "more", (data) => {
+            if (data.identifier === "com.woltlab.wcf.search") {
                 data.handler.close(true);
                 _userPanelSearchButton.click();
             }
@@ -61,15 +61,15 @@ define(["require", "exports", "tslib", "../../../Event/Handler", "../../Alignmen
      */
     function openSearchBar() {
         window.WCF.Dropdown.Interactive.Handler.closeAll();
-        _pageHeader.classList.add('searchBarOpen');
-        _userPanelSearchButton.parentElement.classList.add('open');
+        _pageHeader.classList.add("searchBarOpen");
+        _userPanelSearchButton.parentElement.classList.add("open");
         if (!_isMobile) {
             // calculate value for `right` on desktop
             UiAlignment.set(_pageHeaderSearch, _topMenu, {
-                horizontal: 'right',
+                horizontal: "right",
             });
         }
-        _pageHeaderSearch.style.setProperty('top', _pageHeaderPanel.clientHeight + 'px', '');
+        _pageHeaderSearch.style.setProperty("top", _pageHeaderPanel.clientHeight + "px", "");
         _searchInput.focus();
         window.setTimeout(() => {
             _searchInput.selectionStart = _searchInput.selectionEnd = _searchInput.value.length;
@@ -79,24 +79,24 @@ define(["require", "exports", "tslib", "../../../Event/Handler", "../../Alignmen
      * Closes the search bar.
      */
     function closeSearchBar() {
-        _pageHeader.classList.remove('searchBarOpen');
-        _userPanelSearchButton.parentElement.classList.remove('open');
-        ['bottom', 'left', 'right', 'top'].forEach(propertyName => {
+        _pageHeader.classList.remove("searchBarOpen");
+        _userPanelSearchButton.parentElement.classList.remove("open");
+        ["bottom", "left", "right", "top"].forEach((propertyName) => {
             _pageHeaderSearch.style.removeProperty(propertyName);
         });
         _searchInput.blur();
         // close the scope selection
-        const scope = _pageHeaderSearch.querySelector('.pageHeaderSearchType');
+        const scope = _pageHeaderSearch.querySelector(".pageHeaderSearchType");
         Simple_1.default.close(scope.id);
     }
     /**
      * Initializes the sticky page header handler.
      */
     function init() {
-        _pageHeader = document.getElementById('pageHeader');
-        _pageHeaderContainer = document.getElementById('pageHeaderContainer');
+        _pageHeader = document.getElementById("pageHeader");
+        _pageHeaderContainer = document.getElementById("pageHeaderContainer");
         initSearchBar();
-        UiScreen.on('screen-md-down', {
+        UiScreen.on("screen-md-down", {
             match() {
                 _isMobile = true;
             },
@@ -107,7 +107,7 @@ define(["require", "exports", "tslib", "../../../Event/Handler", "../../Alignmen
                 _isMobile = true;
             },
         });
-        EventHandler.add('com.woltlab.wcf.Search', 'close', closeSearchBar);
+        EventHandler.add("com.woltlab.wcf.Search", "close", closeSearchBar);
     }
     exports.init = init;
 });
index 1be3d7b579abc8d1aaa86ee8027dc6ca9079eea8..32c640430f7361803b0ab648a74b4c448aba7288 100644 (file)
@@ -33,7 +33,7 @@ define(["require", "exports", "tslib", "../../../Environment", "../../../Languag
         // issue results in the next button being shown for a short time. To circumvent this issue,
         // we wait a second before showing the obverflow controls in Safari.
         // see https://webkit.org/blog/6643/improved-font-loading/
-        if (Environment.browser() === 'safari') {
+        if (Environment.browser() === "safari") {
             window.setTimeout(rebuildVisibility, 1000);
         }
         else {
@@ -57,9 +57,9 @@ define(["require", "exports", "tslib", "../../../Environment", "../../../Languag
             const showItem = _invisibleRight.slice(0, 3).pop();
             setMarginLeft(_menu.clientWidth - (showItem.offsetLeft + showItem.clientWidth));
             if (_menu.lastElementChild === showItem) {
-                _buttonShowNext.classList.remove('active');
+                _buttonShowNext.classList.remove("active");
             }
-            _buttonShowPrevious.classList.add('active');
+            _buttonShowPrevious.classList.add("active");
         }
     }
     /**
@@ -71,9 +71,9 @@ define(["require", "exports", "tslib", "../../../Environment", "../../../Languag
             const showItem = _invisibleLeft.slice(-3)[0];
             setMarginLeft(showItem.offsetLeft * -1);
             if (_menu.firstElementChild === showItem) {
-                _buttonShowPrevious.classList.remove('active');
+                _buttonShowPrevious.classList.remove("active");
             }
-            _buttonShowNext.classList.add('active');
+            _buttonShowNext.classList.add("active");
         }
     }
     /**
@@ -82,7 +82,7 @@ define(["require", "exports", "tslib", "../../../Environment", "../../../Languag
      */
     function setMarginLeft(offset) {
         _marginLeft = Math.min(_marginLeft + offset, 0);
-        _firstElement.style.setProperty('margin-left', _marginLeft + 'px', '');
+        _firstElement.style.setProperty("margin-left", _marginLeft + "px", "");
     }
     /**
      * Toggles button overlays and rebuilds the list
@@ -105,8 +105,8 @@ define(["require", "exports", "tslib", "../../../Environment", "../../../Languag
                 }
             });
         }
-        _buttonShowPrevious.classList[(_invisibleLeft.length ? 'add' : 'remove')]('active');
-        _buttonShowNext.classList[(_invisibleRight.length ? 'add' : 'remove')]('active');
+        _buttonShowPrevious.classList[_invisibleLeft.length ? "add" : "remove"]("active");
+        _buttonShowNext.classList[_invisibleRight.length ? "add" : "remove"]("active");
     }
     /**
      * Builds the UI and binds the event listeners.
@@ -120,23 +120,23 @@ define(["require", "exports", "tslib", "../../../Environment", "../../../Languag
      */
     function setupOverflow() {
         const menuParent = _menu.parentElement;
-        _buttonShowNext = document.createElement('a');
-        _buttonShowNext.className = 'mainMenuShowNext';
-        _buttonShowNext.href = '#';
+        _buttonShowNext = document.createElement("a");
+        _buttonShowNext.className = "mainMenuShowNext";
+        _buttonShowNext.href = "#";
         _buttonShowNext.innerHTML = '<span class="icon icon32 fa-angle-right"></span>';
-        _buttonShowNext.setAttribute('aria-hidden', 'true');
-        _buttonShowNext.addEventListener('click', showNext);
+        _buttonShowNext.setAttribute("aria-hidden", "true");
+        _buttonShowNext.addEventListener("click", showNext);
         menuParent.appendChild(_buttonShowNext);
-        _buttonShowPrevious = document.createElement('a');
-        _buttonShowPrevious.className = 'mainMenuShowPrevious';
-        _buttonShowPrevious.href = '#';
+        _buttonShowPrevious = document.createElement("a");
+        _buttonShowPrevious.className = "mainMenuShowPrevious";
+        _buttonShowPrevious.href = "#";
         _buttonShowPrevious.innerHTML = '<span class="icon icon32 fa-angle-left"></span>';
-        _buttonShowPrevious.setAttribute('aria-hidden', 'true');
-        _buttonShowPrevious.addEventListener('click', showPrevious);
+        _buttonShowPrevious.setAttribute("aria-hidden", "true");
+        _buttonShowPrevious.addEventListener("click", showPrevious);
         menuParent.insertBefore(_buttonShowPrevious, menuParent.firstChild);
-        _firstElement.addEventListener('transitionend', rebuildVisibility);
-        window.addEventListener('resize', () => {
-            _firstElement.style.setProperty('margin-left', '0px', '');
+        _firstElement.addEventListener("transitionend", rebuildVisibility);
+        window.addEventListener("resize", () => {
+            _firstElement.style.setProperty("margin-left", "0px", "");
             _marginLeft = 0;
             rebuildVisibility();
         });
@@ -146,21 +146,21 @@ define(["require", "exports", "tslib", "../../../Environment", "../../../Languag
      * Setups a11y improvements.
      */
     function setupA11y() {
-        _menu.querySelectorAll('.boxMenuHasChildren').forEach(element => {
-            const link = element.querySelector('.boxMenuLink');
-            link.setAttribute('aria-haspopup', 'true');
-            link.setAttribute('aria-expanded', 'false');
-            const showMenuButton = document.createElement('button');
-            showMenuButton.className = 'visuallyHidden';
+        _menu.querySelectorAll(".boxMenuHasChildren").forEach((element) => {
+            const link = element.querySelector(".boxMenuLink");
+            link.setAttribute("aria-haspopup", "true");
+            link.setAttribute("aria-expanded", "false");
+            const showMenuButton = document.createElement("button");
+            showMenuButton.className = "visuallyHidden";
             showMenuButton.tabIndex = 0;
-            showMenuButton.setAttribute('role', 'button');
-            showMenuButton.setAttribute('aria-label', Language.get('wcf.global.button.showMenu'));
+            showMenuButton.setAttribute("role", "button");
+            showMenuButton.setAttribute("aria-label", Language.get("wcf.global.button.showMenu"));
             element.insertBefore(showMenuButton, link.nextSibling);
             let showMenu = false;
-            showMenuButton.addEventListener('click', () => {
+            showMenuButton.addEventListener("click", () => {
                 showMenu = !showMenu;
-                link.setAttribute('aria-expanded', showMenu ? 'true' : 'false');
-                showMenuButton.setAttribute('aria-label', Language.get(showMenu ? 'wcf.global.button.hideMenu' : 'wcf.global.button.showMenu'));
+                link.setAttribute("aria-expanded", showMenu ? "true" : "false");
+                showMenuButton.setAttribute("aria-label", Language.get(showMenu ? "wcf.global.button.hideMenu" : "wcf.global.button.showMenu"));
             });
         });
     }
@@ -168,14 +168,14 @@ define(["require", "exports", "tslib", "../../../Environment", "../../../Languag
      * Initializes the main menu overflow handling.
      */
     function init() {
-        const menu = document.querySelector('.mainMenu .boxMenu');
-        const firstElement = (menu && menu.childElementCount) ? menu.children[0] : null;
+        const menu = document.querySelector(".mainMenu .boxMenu");
+        const firstElement = menu && menu.childElementCount ? menu.children[0] : null;
         if (firstElement === null) {
             throw new Error("Unable to find the main menu.");
         }
         _menu = menu;
         _firstElement = firstElement;
-        UiScreen.on('screen-lg', {
+        UiScreen.on("screen-lg", {
             match: enable,
             unmatch: disable,
             setup: setup,
index bfd4f4e23661e3fd81f55f61b7a86efd158ed76c..caf1061cfd1e107882f04c73aa8fa7a4857fa045 100644 (file)
@@ -24,20 +24,19 @@ define(["require", "exports", "tslib", "../../Language", "../Dialog"], function
                 const redirectUrl = element.dataset.link;
                 if (redirectUrl) {
                     callback = function (pageNo) {
-                        window.location.href = redirectUrl.replace(/pageNo=%d/, 'pageNo=' + pageNo);
+                        window.location.href = redirectUrl.replace(/pageNo=%d/, "pageNo=" + pageNo);
                     };
                 }
                 else {
-                    callback = function () {
-                    };
+                    callback = function () { };
                 }
             }
-            else if (typeof callback !== 'function') {
+            else if (typeof callback !== "function") {
                 throw new TypeError("Expected a valid function for parameter 'callback'.");
             }
             if (!this.elements.has(element)) {
-                element.querySelectorAll('.jumpTo').forEach((jumpTo) => {
-                    jumpTo.addEventListener('click', (ev) => this.click(element, ev));
+                element.querySelectorAll(".jumpTo").forEach((jumpTo) => {
+                    jumpTo.addEventListener("click", (ev) => this.click(element, ev));
                     this.elements.set(element, callback);
                 });
             }
@@ -49,11 +48,11 @@ define(["require", "exports", "tslib", "../../Language", "../Dialog"], function
             event.preventDefault();
             this.activeElement = element;
             Dialog_1.default.open(this);
-            const pages = element.dataset.pages || '0';
+            const pages = element.dataset.pages || "0";
             this.input.value = pages;
             this.input.max = pages;
             this.input.select();
-            this.description.textContent = Language.get('wcf.page.jumpTo.description').replace(/#pages#/, pages);
+            this.description.textContent = Language.get("wcf.page.jumpTo.description").replace(/#pages#/, pages);
         }
         /**
          * Handles changes to the page number input field.
@@ -61,7 +60,7 @@ define(["require", "exports", "tslib", "../../Language", "../Dialog"], function
          * @param  {object}  event    event object
          */
         _keyUp(event) {
-            if (event.key === 'Enter' && !this.submitButton.disabled) {
+            if (event.key === "Enter" && !this.submitButton.disabled) {
                 this.submit();
                 return;
             }
@@ -78,26 +77,26 @@ define(["require", "exports", "tslib", "../../Language", "../Dialog"], function
         }
         _dialogSetup() {
             const source = `<dl>
-        <dt><label for="jsPaginationPageNo">${Language.get('wcf.page.jumpTo')}</label></dt>
+        <dt><label for="jsPaginationPageNo">${Language.get("wcf.page.jumpTo")}</label></dt>
                 <dd>
           <input type="number" id="jsPaginationPageNo" value="1" min="1" max="1" class="tiny">
           <small></small>
         </dd>
       </dl>
       <div class="formSubmit">
-        <button class="buttonPrimary">${Language.get('wcf.global.button.submit')}</button>
+        <button class="buttonPrimary">${Language.get("wcf.global.button.submit")}</button>
       </div>`;
             return {
-                id: 'paginationOverlay',
+                id: "paginationOverlay",
                 options: {
-                    onSetup: content => {
-                        this.input = content.querySelector('input');
-                        this.input.addEventListener('keyup', (ev) => this._keyUp(ev));
-                        this.description = content.querySelector('small');
-                        this.submitButton = content.querySelector('button');
-                        this.submitButton.addEventListener('click', () => this.submit());
+                    onSetup: (content) => {
+                        this.input = content.querySelector("input");
+                        this.input.addEventListener("keyup", (ev) => this._keyUp(ev));
+                        this.description = content.querySelector("small");
+                        this.submitButton = content.querySelector("button");
+                        this.submitButton.addEventListener("click", () => this.submit());
                     },
-                    title: Language.get('wcf.global.page.pagination'),
+                    title: Language.get("wcf.global.page.pagination"),
                 },
                 source: source,
             };
index eff240e5c5f87bd75779b528e57f0d67485cf53c..7fb7f21b436570cab2c478a2e2d2785c3ae9f938 100644 (file)
@@ -14,14 +14,14 @@ define(["require", "exports", "tslib", "../../../Core", "../../../Environment",
     Language = tslib_1.__importStar(Language);
     DomTraverse = tslib_1.__importStar(DomTraverse);
     UiScreen = tslib_1.__importStar(UiScreen);
-    const _pageContainer = document.getElementById('pageContainer');
+    const _pageContainer = document.getElementById("pageContainer");
     /**
      * Which edge of the menu is touched? Empty string
      * if no menu is currently touched.
      *
      * One 'left', 'right' or ''.
      */
-    let _androidTouching = '';
+    let _androidTouching = "";
     class UiPageMenuAbstract {
         constructor(eventIdentifier, elementId, buttonSelector) {
             this.activeList = [];
@@ -29,7 +29,7 @@ define(["require", "exports", "tslib", "../../../Core", "../../../Environment",
             this.enabled = true;
             this.items = new Map();
             this.removeActiveList = false;
-            if (document.body.dataset.template === 'packageInstallationSetup') {
+            if (document.body.dataset.template === "packageInstallationSetup") {
                 // work-around for WCFSetup on mobile
                 return;
             }
@@ -37,37 +37,37 @@ define(["require", "exports", "tslib", "../../../Core", "../../../Environment",
             this.menu = document.getElementById(elementId);
             const callbackOpen = this.open.bind(this);
             this.button = document.querySelector(buttonSelector);
-            this.button.addEventListener('click', callbackOpen);
+            this.button.addEventListener("click", callbackOpen);
             this.initItems();
             this.initHeader();
-            EventHandler.add(this.eventIdentifier, 'open', callbackOpen);
-            EventHandler.add(this.eventIdentifier, 'close', this.close.bind(this));
-            EventHandler.add(this.eventIdentifier, 'updateButtonState', this.updateButtonState.bind(this));
-            this.menu.addEventListener('animationend', () => {
-                if (!this.menu.classList.contains('open')) {
-                    this.menu.querySelectorAll('.menuOverlayItemList').forEach(itemList => {
+            EventHandler.add(this.eventIdentifier, "open", callbackOpen);
+            EventHandler.add(this.eventIdentifier, "close", this.close.bind(this));
+            EventHandler.add(this.eventIdentifier, "updateButtonState", this.updateButtonState.bind(this));
+            this.menu.addEventListener("animationend", () => {
+                if (!this.menu.classList.contains("open")) {
+                    this.menu.querySelectorAll(".menuOverlayItemList").forEach((itemList) => {
                         // force the main list to be displayed
-                        itemList.classList.remove('active', 'hidden');
+                        itemList.classList.remove("active", "hidden");
                     });
                 }
             });
-            this.menu.children[0].addEventListener('transitionend', () => {
-                this.menu.classList.add('allowScroll');
+            this.menu.children[0].addEventListener("transitionend", () => {
+                this.menu.classList.add("allowScroll");
                 if (this.removeActiveList) {
                     this.removeActiveList = false;
                     const list = this.activeList.pop();
                     if (list) {
-                        list.classList.remove('activeList');
+                        list.classList.remove("activeList");
                     }
                 }
             });
-            const backdrop = document.createElement('div');
-            backdrop.className = 'menuOverlayMobileBackdrop';
-            backdrop.addEventListener('click', this.close.bind(this));
-            this.menu.insertAdjacentElement('afterend', backdrop);
+            const backdrop = document.createElement("div");
+            backdrop.className = "menuOverlayMobileBackdrop";
+            backdrop.addEventListener("click", this.close.bind(this));
+            this.menu.insertAdjacentElement("afterend", backdrop);
             this.menu.parentElement.insertBefore(backdrop, this.menu.nextSibling);
             this.updateButtonState();
-            if (Environment.platform() === 'android') {
+            if (Environment.platform() === "android") {
                 this.initializeAndroid();
             }
         }
@@ -81,11 +81,11 @@ define(["require", "exports", "tslib", "../../../Core", "../../../Environment",
             if (event instanceof Event) {
                 event.preventDefault();
             }
-            this.menu.classList.add('open');
-            this.menu.classList.add('allowScroll');
-            this.menu.children[0].classList.add('activeList');
+            this.menu.classList.add("open");
+            this.menu.classList.add("allowScroll");
+            this.menu.children[0].classList.add("activeList");
             UiScreen.scrollDisable();
-            _pageContainer.classList.add('menuOverlay-' + this.menu.id);
+            _pageContainer.classList.add("menuOverlay-" + this.menu.id);
             UiScreen.pageOverlayOpen();
             return true;
         }
@@ -96,11 +96,11 @@ define(["require", "exports", "tslib", "../../../Core", "../../../Environment",
             if (event instanceof Event) {
                 event.preventDefault();
             }
-            if (this.menu.classList.contains('open')) {
-                this.menu.classList.remove('open');
+            if (this.menu.classList.contains("open")) {
+                this.menu.classList.remove("open");
                 UiScreen.scrollEnable();
                 UiScreen.pageOverlayClose();
-                _pageContainer.classList.remove('menuOverlay-' + this.menu.id);
+                _pageContainer.classList.remove("menuOverlay-" + this.menu.id);
                 return true;
             }
             return false;
@@ -125,11 +125,11 @@ define(["require", "exports", "tslib", "../../../Core", "../../../Environment",
             // specify on which side of the page the menu appears
             let appearsAt;
             switch (this.menu.id) {
-                case 'pageUserMenuMobile':
-                    appearsAt = 'right';
+                case "pageUserMenuMobile":
+                    appearsAt = "right";
                     break;
-                case 'pageMainMenuMobile':
-                    appearsAt = 'left';
+                case "pageMainMenuMobile":
+                    appearsAt = "left";
                     break;
                 default:
                     return;
@@ -137,24 +137,26 @@ define(["require", "exports", "tslib", "../../../Core", "../../../Environment",
             const backdrop = this.menu.nextElementSibling;
             // horizontal position of the touch start
             let touchStart = undefined;
-            document.addEventListener('touchstart', event => {
+            document.addEventListener("touchstart", (event) => {
                 const touches = event.touches;
                 let isLeftEdge;
                 let isRightEdge;
-                const isOpen = this.menu.classList.contains('open');
+                const isOpen = this.menu.classList.contains("open");
                 // check whether we touch the edges of the menu
-                if (appearsAt === 'left') {
-                    isLeftEdge = !isOpen && (touches[0].clientX < 20 /* AtEdge */);
-                    isRightEdge = isOpen && (Math.abs(this.menu.offsetWidth - touches[0].clientX) < 20 /* AtEdge */);
+                if (appearsAt === "left") {
+                    isLeftEdge = !isOpen && touches[0].clientX < 20 /* AtEdge */;
+                    isRightEdge = isOpen && Math.abs(this.menu.offsetWidth - touches[0].clientX) < 20 /* AtEdge */;
                 }
                 else {
-                    isLeftEdge = isOpen && (Math.abs(document.body.clientWidth - this.menu.offsetWidth - touches[0].clientX) < 20 /* AtEdge */);
-                    isRightEdge = !isOpen && ((document.body.clientWidth - touches[0].clientX) < 20 /* AtEdge */);
+                    isLeftEdge =
+                        isOpen &&
+                            Math.abs(document.body.clientWidth - this.menu.offsetWidth - touches[0].clientX) < 20 /* AtEdge */;
+                    isRightEdge = !isOpen && document.body.clientWidth - touches[0].clientX < 20 /* AtEdge */;
                 }
                 // abort if more than one touch
                 if (touches.length > 1) {
                     if (_androidTouching) {
-                        Core.triggerEvent(document, 'touchend');
+                        Core.triggerEvent(document, "touchend");
                     }
                     return;
                 }
@@ -174,7 +176,7 @@ define(["require", "exports", "tslib", "../../../Core", "../../../Environment",
                     }
                 }
                 // break if redactor is in use
-                if (document.documentElement.classList.contains('redactorActive')) {
+                if (document.documentElement.classList.contains("redactorActive")) {
                     return;
                 }
                 touchStart = {
@@ -182,20 +184,20 @@ define(["require", "exports", "tslib", "../../../Core", "../../../Environment",
                     y: touches[0].clientY,
                 };
                 if (isLeftEdge)
-                    _androidTouching = 'left';
+                    _androidTouching = "left";
                 if (isRightEdge)
-                    _androidTouching = 'right';
+                    _androidTouching = "right";
             });
-            document.addEventListener('touchend', event => {
+            document.addEventListener("touchend", (event) => {
                 // break if we did not start a touch
                 if (!_androidTouching || !touchStart) {
                     return;
                 }
                 // break if the menu did not even start opening
-                if (!this.menu.classList.contains('open')) {
+                if (!this.menu.classList.contains("open")) {
                     // reset
                     touchStart = undefined;
-                    _androidTouching = '';
+                    _androidTouching = "";
                     return;
                 }
                 // last known position of the finger
@@ -207,30 +209,30 @@ define(["require", "exports", "tslib", "../../../Core", "../../../Environment",
                     position = touchStart.x;
                 }
                 // clean up touch styles
-                this.menu.classList.add('androidMenuTouchEnd');
-                this.menu.style.removeProperty('transform');
+                this.menu.classList.add("androidMenuTouchEnd");
+                this.menu.style.removeProperty("transform");
                 backdrop.style.removeProperty(appearsAt);
-                this.menu.addEventListener('transitionend', () => {
-                    this.menu.classList.remove('androidMenuTouchEnd');
+                this.menu.addEventListener("transitionend", () => {
+                    this.menu.classList.remove("androidMenuTouchEnd");
                 }, { once: true });
                 // check whether the user moved the finger far enough
-                if (appearsAt === 'left') {
-                    if (_androidTouching === 'left' && position < (touchStart.x + 100))
+                if (appearsAt === "left") {
+                    if (_androidTouching === "left" && position < touchStart.x + 100)
                         this.close();
-                    if (_androidTouching === 'right' && position < (touchStart.x - 100))
+                    if (_androidTouching === "right" && position < touchStart.x - 100)
                         this.close();
                 }
                 else {
-                    if (_androidTouching === 'left' && position > (touchStart.x + 100))
+                    if (_androidTouching === "left" && position > touchStart.x + 100)
                         this.close();
-                    if (_androidTouching === 'right' && position > (touchStart.x - 100))
+                    if (_androidTouching === "right" && position > touchStart.x - 100)
                         this.close();
                 }
                 // reset
                 touchStart = undefined;
-                _androidTouching = '';
+                _androidTouching = "";
             });
-            document.addEventListener('touchmove', event => {
+            document.addEventListener("touchmove", (event) => {
                 // break if we did not start a touch
                 if (!_androidTouching || !touchStart) {
                     return;
@@ -239,12 +241,12 @@ define(["require", "exports", "tslib", "../../../Core", "../../../Environment",
                 // check whether the user started moving in the correct direction
                 // this avoids false positives, in case the user just wanted to tap
                 let movedFromEdge = false;
-                if (_androidTouching === 'left')
-                    movedFromEdge = touches[0].clientX > (touchStart.x + 5 /* MovedHorizontally */);
-                if (_androidTouching === 'right')
-                    movedFromEdge = touches[0].clientX < (touchStart.x - 5 /* MovedHorizontally */);
+                if (_androidTouching === "left")
+                    movedFromEdge = touches[0].clientX > touchStart.x + 5 /* MovedHorizontally */;
+                if (_androidTouching === "right")
+                    movedFromEdge = touches[0].clientX < touchStart.x - 5 /* MovedHorizontally */;
                 const movedVertically = Math.abs(touches[0].clientY - touchStart.y) > 20 /* MovedVertically */;
-                let isOpen = this.menu.classList.contains('open');
+                let isOpen = this.menu.classList.contains("open");
                 if (!isOpen && movedFromEdge && !movedVertically) {
                     // the menu is not yet open, but the user moved into the right direction
                     this.open();
@@ -253,14 +255,14 @@ define(["require", "exports", "tslib", "../../../Core", "../../../Environment",
                 if (isOpen) {
                     // update CSS to the new finger position
                     let position = touches[0].clientX;
-                    if (appearsAt === 'right')
+                    if (appearsAt === "right")
                         position = document.body.clientWidth - position;
                     if (position > this.menu.offsetWidth)
                         position = this.menu.offsetWidth;
                     if (position < 0)
                         position = 0;
-                    this.menu.style.setProperty('transform', 'translateX(' + (appearsAt === 'left' ? 1 : -1) * (position - this.menu.offsetWidth) + 'px)');
-                    backdrop.style.setProperty(appearsAt, Math.min(this.menu.offsetWidth, position) + 'px');
+                    this.menu.style.setProperty("transform", "translateX(" + (appearsAt === "left" ? 1 : -1) * (position - this.menu.offsetWidth) + "px)");
+                    backdrop.style.setProperty(appearsAt, Math.min(this.menu.offsetWidth, position) + "px");
                 }
             });
         }
@@ -268,7 +270,7 @@ define(["require", "exports", "tslib", "../../../Core", "../../../Environment",
          * Initializes all menu items.
          */
         initItems() {
-            this.menu.querySelectorAll('.menuOverlayItemLink').forEach((element) => {
+            this.menu.querySelectorAll(".menuOverlayItemLink").forEach((element) => {
                 this.initItem(element);
             });
         }
@@ -280,10 +282,10 @@ define(["require", "exports", "tslib", "../../../Core", "../../../Environment",
             const parent = item.parentElement;
             const more = parent.dataset.more;
             if (more) {
-                item.addEventListener('click', event => {
+                item.addEventListener("click", (event) => {
                     event.preventDefault();
                     event.stopPropagation();
-                    EventHandler.fire(this.eventIdentifier, 'more', {
+                    EventHandler.fire(this.eventIdentifier, "more", {
                         handler: this,
                         identifier: more,
                         item: item,
@@ -297,10 +299,10 @@ define(["require", "exports", "tslib", "../../../Core", "../../../Environment",
                 return;
             }
             // handle static items with an icon-type button next to it (acp menu)
-            if (itemList.nodeName !== 'OL' && itemList.classList.contains('menuOverlayItemLinkIcon')) {
+            if (itemList.nodeName !== "OL" && itemList.classList.contains("menuOverlayItemLinkIcon")) {
                 // add wrapper
-                const wrapper = document.createElement('span');
-                wrapper.className = 'menuOverlayItemWrapper';
+                const wrapper = document.createElement("span");
+                wrapper.className = "menuOverlayItemWrapper";
                 parent.insertBefore(wrapper, item);
                 wrapper.appendChild(item);
                 while (wrapper.nextElementSibling) {
@@ -308,7 +310,7 @@ define(["require", "exports", "tslib", "../../../Core", "../../../Environment",
                 }
                 return;
             }
-            const isLink = item.href !== '#';
+            const isLink = item.href !== "#";
             const parentItemList = parent.parentElement;
             let itemTitle = itemList.dataset.title;
             this.items.set(item, {
@@ -316,48 +318,48 @@ define(["require", "exports", "tslib", "../../../Core", "../../../Environment",
                 parentItemList: parentItemList,
             });
             if (!itemTitle) {
-                itemTitle = DomTraverse.childByClass(item, 'menuOverlayItemTitle').textContent;
+                itemTitle = DomTraverse.childByClass(item, "menuOverlayItemTitle").textContent;
                 itemList.dataset.title = itemTitle;
             }
             const callbackLink = this.showItemList.bind(this, item);
             if (isLink) {
-                const wrapper = document.createElement('span');
-                wrapper.className = 'menuOverlayItemWrapper';
+                const wrapper = document.createElement("span");
+                wrapper.className = "menuOverlayItemWrapper";
                 parent.insertBefore(wrapper, item);
                 wrapper.appendChild(item);
-                const moreLink = document.createElement('a');
-                moreLink.href = '#';
-                moreLink.className = 'menuOverlayItemLinkIcon' + (item.classList.contains('active') ? ' active' : '');
+                const moreLink = document.createElement("a");
+                moreLink.href = "#";
+                moreLink.className = "menuOverlayItemLinkIcon" + (item.classList.contains("active") ? " active" : "");
                 moreLink.innerHTML = '<span class="icon icon24 fa-angle-right"></span>';
-                moreLink.addEventListener('click', callbackLink);
+                moreLink.addEventListener("click", callbackLink);
                 wrapper.appendChild(moreLink);
             }
             else {
-                item.classList.add('menuOverlayItemLinkMore');
-                item.addEventListener('click', callbackLink);
+                item.classList.add("menuOverlayItemLinkMore");
+                item.addEventListener("click", callbackLink);
             }
-            const backLinkItem = document.createElement('li');
-            backLinkItem.className = 'menuOverlayHeader';
-            const wrapper = document.createElement('span');
-            wrapper.className = 'menuOverlayItemWrapper';
-            const backLink = document.createElement('a');
-            backLink.href = '#';
-            backLink.className = 'menuOverlayItemLink menuOverlayBackLink';
-            backLink.textContent = parentItemList.dataset.title || '';
-            backLink.addEventListener('click', this.hideItemList.bind(this, item));
-            const closeLink = document.createElement('a');
-            closeLink.href = '#';
-            closeLink.className = 'menuOverlayItemLinkIcon';
+            const backLinkItem = document.createElement("li");
+            backLinkItem.className = "menuOverlayHeader";
+            const wrapper = document.createElement("span");
+            wrapper.className = "menuOverlayItemWrapper";
+            const backLink = document.createElement("a");
+            backLink.href = "#";
+            backLink.className = "menuOverlayItemLink menuOverlayBackLink";
+            backLink.textContent = parentItemList.dataset.title || "";
+            backLink.addEventListener("click", this.hideItemList.bind(this, item));
+            const closeLink = document.createElement("a");
+            closeLink.href = "#";
+            closeLink.className = "menuOverlayItemLinkIcon";
             closeLink.innerHTML = '<span class="icon icon24 fa-times"></span>';
-            closeLink.addEventListener('click', this.close.bind(this));
+            closeLink.addEventListener("click", this.close.bind(this));
             wrapper.appendChild(backLink);
             wrapper.appendChild(closeLink);
             backLinkItem.appendChild(wrapper);
             itemList.insertBefore(backLinkItem, itemList.firstElementChild);
-            if (!backLinkItem.nextElementSibling.classList.contains('menuOverlayTitle')) {
-                const titleItem = document.createElement('li');
-                titleItem.className = 'menuOverlayTitle';
-                const title = document.createElement('span');
+            if (!backLinkItem.nextElementSibling.classList.contains("menuOverlayTitle")) {
+                const titleItem = document.createElement("li");
+                titleItem.className = "menuOverlayTitle";
+                const title = document.createElement("span");
                 title.textContent = itemTitle;
                 titleItem.appendChild(title);
                 itemList.insertBefore(titleItem, backLinkItem.nextElementSibling);
@@ -367,26 +369,26 @@ define(["require", "exports", "tslib", "../../../Core", "../../../Environment",
          * Renders the menu item list header.
          */
         initHeader() {
-            const listItem = document.createElement('li');
-            listItem.className = 'menuOverlayHeader';
-            const wrapper = document.createElement('span');
-            wrapper.className = 'menuOverlayItemWrapper';
+            const listItem = document.createElement("li");
+            listItem.className = "menuOverlayHeader";
+            const wrapper = document.createElement("span");
+            wrapper.className = "menuOverlayItemWrapper";
             listItem.appendChild(wrapper);
-            const logoWrapper = document.createElement('span');
-            logoWrapper.className = 'menuOverlayLogoWrapper';
+            const logoWrapper = document.createElement("span");
+            logoWrapper.className = "menuOverlayLogoWrapper";
             wrapper.appendChild(logoWrapper);
-            const logo = document.createElement('span');
-            logo.className = 'menuOverlayLogo';
+            const logo = document.createElement("span");
+            logo.className = "menuOverlayLogo";
             const pageLogo = this.menu.dataset.pageLogo;
-            logo.style.setProperty('background-image', `url("${pageLogo}")`, '');
+            logo.style.setProperty("background-image", `url("${pageLogo}")`, "");
             logoWrapper.appendChild(logo);
-            const closeLink = document.createElement('a');
-            closeLink.href = '#';
-            closeLink.className = 'menuOverlayItemLinkIcon';
+            const closeLink = document.createElement("a");
+            closeLink.href = "#";
+            closeLink.className = "menuOverlayItemLinkIcon";
             closeLink.innerHTML = '<span class="icon icon24 fa-times"></span>';
-            closeLink.addEventListener('click', this.close.bind(this));
+            closeLink.addEventListener("click", this.close.bind(this));
             wrapper.appendChild(closeLink);
-            const list = DomTraverse.childByClass(this.menu, 'menuOverlayItemList');
+            const list = DomTraverse.childByClass(this.menu, "menuOverlayItemList");
             list.insertBefore(listItem, list.firstElementChild);
         }
         /**
@@ -396,10 +398,10 @@ define(["require", "exports", "tslib", "../../../Core", "../../../Environment",
             if (event instanceof Event) {
                 event.preventDefault();
             }
-            this.menu.classList.remove('allowScroll');
+            this.menu.classList.remove("allowScroll");
             this.removeActiveList = true;
             const data = this.items.get(item);
-            data.parentItemList.classList.remove('hidden');
+            data.parentItemList.classList.remove("hidden");
             this.updateDepth(false);
         }
         /**
@@ -410,43 +412,43 @@ define(["require", "exports", "tslib", "../../../Core", "../../../Environment",
             const data = this.items.get(item);
             const load = data.itemList.dataset.load;
             if (load) {
-                if (!Core.stringToBool(item.dataset.loaded || '')) {
+                if (!Core.stringToBool(item.dataset.loaded || "")) {
                     const target = event.currentTarget;
                     const icon = target.firstElementChild;
-                    if (icon.classList.contains('fa-angle-right')) {
-                        icon.classList.remove('fa-angle-right');
-                        icon.classList.add('fa-spinner');
+                    if (icon.classList.contains("fa-angle-right")) {
+                        icon.classList.remove("fa-angle-right");
+                        icon.classList.add("fa-spinner");
                     }
-                    EventHandler.fire(this.eventIdentifier, 'load_' + load);
+                    EventHandler.fire(this.eventIdentifier, "load_" + load);
                     return;
                 }
             }
-            this.menu.classList.remove('allowScroll');
-            data.itemList.classList.add('activeList');
-            data.parentItemList.classList.add('hidden');
+            this.menu.classList.remove("allowScroll");
+            data.itemList.classList.add("activeList");
+            data.parentItemList.classList.add("hidden");
             this.activeList.push(data.itemList);
             this.updateDepth(true);
         }
         updateDepth(increase) {
-            this.depth += (increase) ? 1 : -1;
+            this.depth += increase ? 1 : -1;
             let offset = this.depth * -100;
-            if (Language.get('wcf.global.pageDirection') === 'rtl') {
+            if (Language.get("wcf.global.pageDirection") === "rtl") {
                 // reverse logic for RTL
                 offset *= -1;
             }
             const child = this.menu.children[0];
-            child.style.setProperty('transform', `translateX(${offset}%)`, '');
+            child.style.setProperty("transform", `translateX(${offset}%)`, "");
         }
         updateButtonState() {
             let hasNewContent = false;
-            const itemList = this.menu.querySelector('.menuOverlayItemList');
-            this.menu.querySelectorAll('.badgeUpdate').forEach(badge => {
+            const itemList = this.menu.querySelector(".menuOverlayItemList");
+            this.menu.querySelectorAll(".badgeUpdate").forEach((badge) => {
                 const value = badge.textContent;
-                if (~~value > 0 && badge.closest('.menuOverlayItemList') === itemList) {
+                if (~~value > 0 && badge.closest(".menuOverlayItemList") === itemList) {
                     hasNewContent = true;
                 }
             });
-            this.button.classList[hasNewContent ? 'add' : 'remove']('pageMenuMobileButtonHasContent');
+            this.button.classList[hasNewContent ? "add" : "remove"]("pageMenuMobileButtonHasContent");
         }
     }
     return UiPageMenuAbstract;
index 6879401c10698e1d1caa01988a479e0ee5494eed..f137dcd712971d198cc28735325a632820f29219 100644 (file)
@@ -23,7 +23,7 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Dom/Util", "../../La
             const inputContainer = this.searchInput.parentNode;
             const value = this.searchInput.value.trim();
             if (value.length < 3) {
-                Util_1.default.innerError(inputContainer, Language.get('wcf.page.search.error.tooShort'));
+                Util_1.default.innerError(inputContainer, Language.get("wcf.page.search.error.tooShort"));
                 return;
             }
             else {
@@ -38,13 +38,13 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Dom/Util", "../../La
         click(event) {
             event.preventDefault();
             const page = event.currentTarget;
-            const pageTitle = page.querySelector('h3');
-            this.callbackSelect(page.dataset.pageId + '#' + pageTitle.textContent.replace(/['"]/g, ''));
+            const pageTitle = page.querySelector("h3");
+            this.callbackSelect(page.dataset.pageId + "#" + pageTitle.textContent.replace(/['"]/g, ""));
             Dialog_1.default.close(this);
         }
         _ajaxSuccess(data) {
             const html = data.returnValues
-                .map(page => {
+                .map((page) => {
                 const name = StringUtil.escapeHTML(page.name);
                 const displayLink = StringUtil.escapeHTML(page.displayLink);
                 return `<li>
@@ -54,49 +54,49 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Dom/Util", "../../La
           </div>
         </li>`;
             })
-                .join('');
+                .join("");
             this.resultList.innerHTML = html;
-            Util_1.default[html ? 'show' : 'hide'](this.resultContainer);
+            Util_1.default[html ? "show" : "hide"](this.resultContainer);
             if (html) {
-                this.resultList.querySelectorAll('.containerHeadline').forEach((item) => {
-                    item.addEventListener('click', (ev) => this.click(ev));
+                this.resultList.querySelectorAll(".containerHeadline").forEach((item) => {
+                    item.addEventListener("click", (ev) => this.click(ev));
                 });
             }
             else {
-                Util_1.default.innerError(this.searchInput.parentElement, Language.get('wcf.page.search.error.noResults'));
+                Util_1.default.innerError(this.searchInput.parentElement, Language.get("wcf.page.search.error.noResults"));
             }
         }
         _ajaxSetup() {
             return {
                 data: {
-                    actionName: 'search',
-                    className: 'wcf\\data\\page\\PageAction',
+                    actionName: "search",
+                    className: "wcf\\data\\page\\PageAction",
                 },
             };
         }
         _dialogSetup() {
             return {
-                id: 'wcfUiPageSearch',
+                id: "wcfUiPageSearch",
                 options: {
                     onSetup: () => {
-                        this.searchInput = document.getElementById('wcfUiPageSearchInput');
-                        this.searchInput.addEventListener('keydown', event => {
-                            if (event.key === 'Enter') {
+                        this.searchInput = document.getElementById("wcfUiPageSearchInput");
+                        this.searchInput.addEventListener("keydown", (event) => {
+                            if (event.key === "Enter") {
                                 this.search(event);
                             }
                         });
-                        this.searchInput.nextElementSibling.addEventListener('click', (ev) => this.search(ev));
-                        this.resultContainer = document.getElementById('wcfUiPageSearchResultContainer');
-                        this.resultList = document.getElementById('wcfUiPageSearchResultList');
+                        this.searchInput.nextElementSibling.addEventListener("click", (ev) => this.search(ev));
+                        this.resultContainer = document.getElementById("wcfUiPageSearchResultContainer");
+                        this.resultList = document.getElementById("wcfUiPageSearchResultList");
                     },
                     onShow: () => {
                         this.searchInput.focus();
                     },
-                    title: Language.get('wcf.page.search'),
+                    title: Language.get("wcf.page.search"),
                 },
                 source: `<div class="section">
         <dl>
-          <dt><label for="wcfUiPageSearchInput">${Language.get('wcf.page.search.name')}</label></dt>
+          <dt><label for="wcfUiPageSearchInput">${Language.get("wcf.page.search.name")}</label></dt>
           <dd>
             <div class="inputAddon">
               <input type="text" id="wcfUiPageSearchInput" class="long">
@@ -107,7 +107,7 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Dom/Util", "../../La
       </div>
       <section id="wcfUiPageSearchResultContainer" class="section" style="display: none;">
         <header class="sectionHeader">
-          <h2 class="sectionTitle">${Language.get('wcf.page.search.results')}</h2>
+          <h2 class="sectionTitle">${Language.get("wcf.page.search.results")}</h2>
         </header>
         <ol id="wcfUiPageSearchResultList" class="containerList"></ol>
       </section>`,
index 6516b3a02db5db70088533aca647f344a3faa4f6..1936aa6d994633362a44b99b67e53d053d11d8ad 100644 (file)
@@ -32,7 +32,7 @@ define(["require", "exports", "tslib", "../../../Language", "../../../StringUtil
             this.callbackSuccess = callback;
             Dialog_1.default.open(this);
             Dialog_1.default.setTitle(this, title);
-            this.searchInputLabel.textContent = Language.get(labelLanguageItem || 'wcf.page.pageObjectID.search.terms');
+            this.searchInputLabel.textContent = Language.get(labelLanguageItem || "wcf.page.pageObjectID.search.terms");
             this._getSearchInputHandler().setPageId(pageId);
         }
         /**
@@ -41,17 +41,17 @@ define(["require", "exports", "tslib", "../../../Language", "../../../StringUtil
         buildList(data) {
             this.resetList();
             if (!Array.isArray(data.returnValues) || data.returnValues.length === 0) {
-                Util_1.default.innerError(this.searchInput, Language.get('wcf.page.pageObjectID.search.noResults'));
+                Util_1.default.innerError(this.searchInput, Language.get("wcf.page.pageObjectID.search.noResults"));
                 return;
             }
-            data.returnValues.forEach(item => {
+            data.returnValues.forEach((item) => {
                 let image = item.image;
                 if (/^fa-/.test(image)) {
-                    image = `<span class="icon icon48 ${image} pointer jsTooltip" title="${Language.get('wcf.global.select')}"></span>`;
+                    image = `<span class="icon icon48 ${image} pointer jsTooltip" title="${Language.get("wcf.global.select")}"></span>`;
                 }
-                const listItem = document.createElement('li');
+                const listItem = document.createElement("li");
                 listItem.dataset.objectId = item.objectID.toString();
-                const description = item.description ? `<p>${item.description}</p>` : '';
+                const description = item.description ? `<p>${item.description}</p>` : "";
                 listItem.innerHTML = `<div class="box48">
         ${image}
         <div>
@@ -63,7 +63,7 @@ define(["require", "exports", "tslib", "../../../Language", "../../../StringUtil
           </div>
         </div>
       </div>`;
-                listItem.addEventListener('click', this.click.bind(this));
+                listItem.addEventListener("click", this.click.bind(this));
                 this.resultList.appendChild(listItem);
             });
             Util_1.default.show(this.resultListContainer);
@@ -73,7 +73,7 @@ define(["require", "exports", "tslib", "../../../Language", "../../../StringUtil
          */
         resetList() {
             Util_1.default.innerError(this.searchInput, false);
-            this.resultList.innerHTML = '';
+            this.resultList.innerHTML = "";
             Util_1.default.hide(this.resultListContainer);
         }
         /**
@@ -81,7 +81,7 @@ define(["require", "exports", "tslib", "../../../Language", "../../../StringUtil
          */
         _getSearchInputHandler() {
             if (!this.searchInputHandler) {
-                const input = document.getElementById('wcfUiPageSearchInput');
+                const input = document.getElementById("wcfUiPageSearchInput");
                 this.searchInputHandler = new Input_1.default(input, {
                     callbackSuccess: this.buildList.bind(this),
                 });
@@ -93,7 +93,7 @@ define(["require", "exports", "tslib", "../../../Language", "../../../StringUtil
          */
         click(event) {
             const clickTarget = event.target;
-            if (clickTarget.nodeName === 'A') {
+            if (clickTarget.nodeName === "A") {
                 return;
             }
             event.stopPropagation();
@@ -103,28 +103,28 @@ define(["require", "exports", "tslib", "../../../Language", "../../../StringUtil
         }
         _dialogSetup() {
             return {
-                id: 'wcfUiPageSearchHandler',
+                id: "wcfUiPageSearchHandler",
                 options: {
                     onShow: (content) => {
                         if (!this.searchInput) {
-                            this.searchInput = document.getElementById('wcfUiPageSearchInput');
+                            this.searchInput = document.getElementById("wcfUiPageSearchInput");
                             this.searchInputLabel = content.querySelector('label[for="wcfUiPageSearchInput"]');
-                            this.resultList = document.getElementById('wcfUiPageSearchResultList');
-                            this.resultListContainer = document.getElementById('wcfUiPageSearchResultListContainer');
+                            this.resultList = document.getElementById("wcfUiPageSearchResultList");
+                            this.resultListContainer = document.getElementById("wcfUiPageSearchResultListContainer");
                         }
                         // clear search input
-                        this.searchInput.value = '';
+                        this.searchInput.value = "";
                         // reset results
                         Util_1.default.hide(this.resultListContainer);
-                        this.resultList.innerHTML = '';
+                        this.resultList.innerHTML = "";
                         this.searchInput.focus();
                     },
-                    title: '',
+                    title: "",
                 },
                 source: `<div class="section">
         <dl>
           <dt>
-            <label for="wcfUiPageSearchInput">${Language.get('wcf.page.pageObjectID.search.terms')}</label>
+            <label for="wcfUiPageSearchInput">${Language.get("wcf.page.pageObjectID.search.terms")}</label>
           </dt>
           <dd>
             <input type="text" id="wcfUiPageSearchInput" class="long">
@@ -133,7 +133,7 @@ define(["require", "exports", "tslib", "../../../Language", "../../../StringUtil
       </div>
       <section id="wcfUiPageSearchResultListContainer" class="section sectionContainerList">
         <header class="sectionHeader">
-          <h2 class="sectionTitle">${Language.get('wcf.page.pageObjectID.search.results')}</h2>
+          <h2 class="sectionTitle">${Language.get("wcf.page.pageObjectID.search.results")}</h2>
         </header>
         <ul id="wcfUiPageSearchResultList" class="containerList wcfUiPageSearchResultList"></ul>
       </section>`,
index 306df39044557ec95de54b566a63ced081917a0b..62dc9755d49263e207f94e1e7bb0db95d2cb10c1 100644 (file)
@@ -12,12 +12,12 @@ define(["require", "exports", "tslib", "../../../Core", "../../Search/Input"], f
     Input_1 = tslib_1.__importDefault(Input_1);
     class UiPageSearchInput extends Input_1.default {
         constructor(element, options) {
-            if (typeof options.callbackSuccess !== 'function') {
+            if (typeof options.callbackSuccess !== "function") {
                 throw new Error("Expected a valid callback function for 'callbackSuccess'.");
             }
             options = Core.extend({
                 ajax: {
-                    className: 'wcf\\data\\page\\PageAction',
+                    className: "wcf\\data\\page\\PageAction",
                 },
             }, options);
             super(element, options);
index f57020c3adcd065b120a52a33404f27969189369..a6bd04b855f0c17f1fff7481d6ffeaf87dd4a679 100644 (file)
@@ -25,13 +25,13 @@ define(["require", "exports", "tslib", "../Core", "../Language", "../StringUtil"
             this.element = element;
             this.activePage = options.activePage;
             this.maxPage = options.maxPage;
-            if (typeof options.callbackSwitch === 'function') {
+            if (typeof options.callbackSwitch === "function") {
                 this.callbackSwitch = options.callbackSwitch;
             }
-            if (typeof options.callbackShouldSwitch === 'function') {
+            if (typeof options.callbackShouldSwitch === "function") {
                 this.callbackShouldSwitch = options.callbackShouldSwitch;
             }
-            this.element.classList.add('pagination');
+            this.element.classList.add("pagination");
             this.rebuild();
         }
         /**
@@ -40,24 +40,24 @@ define(["require", "exports", "tslib", "../Core", "../Language", "../StringUtil"
         rebuild() {
             let hasHiddenPages = false;
             // clear content
-            this.element.innerHTML = '';
-            const list = document.createElement('ul');
-            let listItem = document.createElement('li');
-            listItem.className = 'skip';
+            this.element.innerHTML = "";
+            const list = document.createElement("ul");
+            let listItem = document.createElement("li");
+            listItem.className = "skip";
             list.appendChild(listItem);
-            let iconClassNames = 'icon icon24 fa-chevron-left';
+            let iconClassNames = "icon icon24 fa-chevron-left";
             if (this.activePage > 1) {
-                const link = document.createElement('a');
-                link.className = iconClassNames + ' jsTooltip';
-                link.href = '#';
-                link.title = Language.get('wcf.global.page.previous');
-                link.rel = 'prev';
+                const link = document.createElement("a");
+                link.className = iconClassNames + " jsTooltip";
+                link.href = "#";
+                link.title = Language.get("wcf.global.page.previous");
+                link.rel = "prev";
                 listItem.appendChild(link);
-                link.addEventListener('click', (ev) => this.switchPage(this.activePage - 1, ev));
+                link.addEventListener("click", (ev) => this.switchPage(this.activePage - 1, ev));
             }
             else {
                 listItem.innerHTML = '<span class="' + iconClassNames + '"></span>';
-                listItem.classList.add('disabled');
+                listItem.classList.add("disabled");
             }
             // add first page
             list.appendChild(this.createLink(1));
@@ -109,14 +109,14 @@ define(["require", "exports", "tslib", "../Core", "../Language", "../StringUtil"
                 right = this.maxPage;
             }
             // left ... links
-            const jumpToHtml = '<a class="jsTooltip" title="' + Language.get('wcf.page.jumpTo') + '">&hellip;</a>';
+            const jumpToHtml = '<a class="jsTooltip" title="' + Language.get("wcf.page.jumpTo") + '">&hellip;</a>';
             if (left > 1) {
                 if (left - 1 < 2) {
                     list.appendChild(this.createLink(2));
                 }
                 else {
-                    listItem = document.createElement('li');
-                    listItem.className = 'jumpTo';
+                    listItem = document.createElement("li");
+                    listItem.className = "jumpTo";
                     listItem.innerHTML = jumpToHtml;
                     list.appendChild(listItem);
                     hasHiddenPages = true;
@@ -132,8 +132,8 @@ define(["require", "exports", "tslib", "../Core", "../Language", "../StringUtil"
                     list.appendChild(this.createLink(this.maxPage - 1));
                 }
                 else {
-                    listItem = document.createElement('li');
-                    listItem.className = 'jumpTo';
+                    listItem = document.createElement("li");
+                    listItem.className = "jumpTo";
                     listItem.innerHTML = jumpToHtml;
                     list.appendChild(listItem);
                     hasHiddenPages = true;
@@ -142,22 +142,22 @@ define(["require", "exports", "tslib", "../Core", "../Language", "../StringUtil"
             // add last page
             list.appendChild(this.createLink(this.maxPage));
             // add next button
-            listItem = document.createElement('li');
-            listItem.className = 'skip';
+            listItem = document.createElement("li");
+            listItem.className = "skip";
             list.appendChild(listItem);
-            iconClassNames = 'icon icon24 fa-chevron-right';
+            iconClassNames = "icon icon24 fa-chevron-right";
             if (this.activePage < this.maxPage) {
-                const link = document.createElement('a');
-                link.className = iconClassNames + ' jsTooltip';
-                link.href = '#';
-                link.title = Language.get('wcf.global.page.next');
-                link.rel = 'next';
+                const link = document.createElement("a");
+                link.className = iconClassNames + " jsTooltip";
+                link.href = "#";
+                link.title = Language.get("wcf.global.page.next");
+                link.rel = "next";
                 listItem.appendChild(link);
-                link.addEventListener('click', (ev) => this.switchPage(this.activePage + 1, ev));
+                link.addEventListener("click", (ev) => this.switchPage(this.activePage + 1, ev));
             }
             else {
                 listItem.innerHTML = '<span class="' + iconClassNames + '"></span>';
-                listItem.classList.add('disabled');
+                listItem.classList.add("disabled");
             }
             if (hasHiddenPages) {
                 list.dataset.pages = this.maxPage.toString();
@@ -169,19 +169,24 @@ define(["require", "exports", "tslib", "../Core", "../Language", "../StringUtil"
          * Creates a link to a specific page.
          */
         createLink(pageNo) {
-            const listItem = document.createElement('li');
+            const listItem = document.createElement("li");
             if (pageNo !== this.activePage) {
-                const link = document.createElement('a');
+                const link = document.createElement("a");
                 link.textContent = StringUtil.addThousandsSeparator(pageNo);
-                link.addEventListener('click', (ev) => this.switchPage(pageNo, ev));
+                link.addEventListener("click", (ev) => this.switchPage(pageNo, ev));
                 listItem.appendChild(link);
             }
             else {
-                listItem.classList.add('active');
-                listItem.innerHTML = '<span>' + StringUtil.addThousandsSeparator(pageNo) + '</span><span class="invisible">' + Language.get('wcf.page.pagePosition', {
-                    pageNo: pageNo,
-                    pages: this.maxPage,
-                }) + '</span>';
+                listItem.classList.add("active");
+                listItem.innerHTML =
+                    "<span>" +
+                        StringUtil.addThousandsSeparator(pageNo) +
+                        '</span><span class="invisible">' +
+                        Language.get("wcf.page.pagePosition", {
+                            pageNo: pageNo,
+                            pages: this.maxPage,
+                        }) +
+                        "</span>";
             }
             return listItem;
         }
@@ -212,11 +217,11 @@ define(["require", "exports", "tslib", "../Core", "../Language", "../StringUtil"
                 const target = event.currentTarget;
                 // force tooltip to vanish and strip positioning
                 if (target && target.dataset.tooltip) {
-                    const tooltip = document.getElementById('balloonTooltip');
+                    const tooltip = document.getElementById("balloonTooltip");
                     if (tooltip) {
-                        Core.triggerEvent(target, 'mouseleave');
-                        tooltip.style.removeProperty('top');
-                        tooltip.style.removeProperty('bottom');
+                        Core.triggerEvent(target, "mouseleave");
+                        tooltip.style.removeProperty("top");
+                        tooltip.style.removeProperty("bottom");
                     }
                 }
             }
index 09d912638aa9e38f6069b171a29b745592a63cad..2a3f61c936c3c53c9c61286b6d7f93e049dc48ff 100644 (file)
@@ -20,18 +20,18 @@ define(["require", "exports", "tslib", "../Core", "../Environment"], function (r
     let _scrollTop = 0;
     let _pageOverlayCounter = 0;
     const _mqMap = new Map(Object.entries({
-        'screen-xs': '(max-width: 544px)',
-        'screen-sm': '(min-width: 545px) and (max-width: 768px)',
-        'screen-sm-down': '(max-width: 768px)',
-        'screen-sm-up': '(min-width: 545px)',
-        'screen-sm-md': '(min-width: 545px) and (max-width: 1024px)',
-        'screen-md': '(min-width: 769px) and (max-width: 1024px)',
-        'screen-md-down': '(max-width: 1024px)',
-        'screen-md-up': '(min-width: 769px)',
-        'screen-lg': '(min-width: 1025px)',
-        'screen-lg-only': '(min-width: 1025px) and (max-width: 1280px)',
-        'screen-lg-down': '(max-width: 1280px)',
-        'screen-xl': '(min-width: 1281px)',
+        "screen-xs": "(max-width: 544px)" /* smartphone */,
+        "screen-sm": "(min-width: 545px) and (max-width: 768px)" /* tablet (portrait) */,
+        "screen-sm-down": "(max-width: 768px)" /* smartphone + tablet (portrait) */,
+        "screen-sm-up": "(min-width: 545px)" /* tablet (portrait) + tablet (landscape) + desktop */,
+        "screen-sm-md": "(min-width: 545px) and (max-width: 1024px)" /* tablet (portrait) + tablet (landscape) */,
+        "screen-md": "(min-width: 769px) and (max-width: 1024px)" /* tablet (landscape) */,
+        "screen-md-down": "(max-width: 1024px)" /* smartphone + tablet (portrait) + tablet (landscape) */,
+        "screen-md-up": "(min-width: 769px)" /* tablet (landscape) + desktop */,
+        "screen-lg": "(min-width: 1025px)" /* desktop */,
+        "screen-lg-only": "(min-width: 1025px) and (max-width: 1280px)",
+        "screen-lg-down": "(max-width: 1280px)",
+        "screen-xl": "(min-width: 1281px)",
     }));
     // Microsoft Edge rewrites the media queries to whatever it
     // pleases, causing the input and output query to mismatch
@@ -49,13 +49,13 @@ define(["require", "exports", "tslib", "../Core", "../Environment"], function (r
      */
     function on(query, callbacks) {
         const uuid = Core.getUuid(), queryObject = _getQueryObject(query);
-        if (typeof callbacks.match === 'function') {
+        if (typeof callbacks.match === "function") {
             queryObject.callbacksMatch.set(uuid, callbacks.match);
         }
-        if (typeof callbacks.unmatch === 'function') {
+        if (typeof callbacks.unmatch === "function") {
             queryObject.callbacksUnmatch.set(uuid, callbacks.unmatch);
         }
-        if (typeof callbacks.setup === 'function') {
+        if (typeof callbacks.setup === "function") {
             if (queryObject.mql.matches) {
                 callbacks.setup();
             }
@@ -89,21 +89,21 @@ define(["require", "exports", "tslib", "../Core", "../Environment"], function (r
     function scrollDisable() {
         if (_scrollDisableCounter === 0) {
             _scrollTop = document.body.scrollTop;
-            _scrollOffsetFrom = 'body';
+            _scrollOffsetFrom = "body";
             if (!_scrollTop) {
                 _scrollTop = document.documentElement.scrollTop;
-                _scrollOffsetFrom = 'documentElement';
+                _scrollOffsetFrom = "documentElement";
             }
-            const pageContainer = document.getElementById('pageContainer');
+            const pageContainer = document.getElementById("pageContainer");
             // setting translateY causes Mobile Safari to snap
-            if (Environment.platform() === 'ios') {
-                pageContainer.style.setProperty('position', 'relative', '');
-                pageContainer.style.setProperty('top', '-' + _scrollTop + 'px', '');
+            if (Environment.platform() === "ios") {
+                pageContainer.style.setProperty("position", "relative", "");
+                pageContainer.style.setProperty("top", "-" + _scrollTop + "px", "");
             }
             else {
-                pageContainer.style.setProperty('margin-top', '-' + _scrollTop + 'px', '');
+                pageContainer.style.setProperty("margin-top", "-" + _scrollTop + "px", "");
             }
-            document.documentElement.classList.add('disableScrolling');
+            document.documentElement.classList.add("disableScrolling");
         }
         _scrollDisableCounter++;
     }
@@ -115,14 +115,14 @@ define(["require", "exports", "tslib", "../Core", "../Environment"], function (r
         if (_scrollDisableCounter) {
             _scrollDisableCounter--;
             if (_scrollDisableCounter === 0) {
-                document.documentElement.classList.remove('disableScrolling');
-                const pageContainer = document.getElementById('pageContainer');
-                if (Environment.platform() === 'ios') {
-                    pageContainer.style.removeProperty('position');
-                    pageContainer.style.removeProperty('top');
+                document.documentElement.classList.remove("disableScrolling");
+                const pageContainer = document.getElementById("pageContainer");
+                if (Environment.platform() === "ios") {
+                    pageContainer.style.removeProperty("position");
+                    pageContainer.style.removeProperty("top");
                 }
                 else {
-                    pageContainer.style.removeProperty('margin-top');
+                    pageContainer.style.removeProperty("margin-top");
                 }
                 if (_scrollTop) {
                     document[_scrollOffsetFrom].scrollTop = ~~_scrollTop;
@@ -136,7 +136,7 @@ define(["require", "exports", "tslib", "../Core", "../Environment"], function (r
      */
     function pageOverlayOpen() {
         if (_pageOverlayCounter === 0) {
-            document.documentElement.classList.add('pageOverlayActive');
+            document.documentElement.classList.add("pageOverlayActive");
         }
         _pageOverlayCounter++;
     }
@@ -148,7 +148,7 @@ define(["require", "exports", "tslib", "../Core", "../Environment"], function (r
         if (_pageOverlayCounter) {
             _pageOverlayCounter--;
             if (_pageOverlayCounter === 0) {
-                document.documentElement.classList.remove('pageOverlayActive');
+                document.documentElement.classList.remove("pageOverlayActive");
             }
         }
     }
@@ -172,8 +172,8 @@ define(["require", "exports", "tslib", "../Core", "../Environment"], function (r
     }
     exports.setDialogContainer = setDialogContainer;
     function _getQueryObject(query) {
-        if (typeof query !== 'string' || query.trim() === '') {
-            throw new TypeError('Expected a non-empty string for parameter \'query\'.');
+        if (typeof query !== "string" || query.trim() === "") {
+            throw new TypeError("Expected a non-empty string for parameter 'query'.");
         }
         // Microsoft Edge rewrites the media queries to whatever it
         // pleases, causing the input and output query to mismatch
index 9a375e75522e04b18e20b1fc04f05abf707752ea..bd701947bcb8f586c04da8f273e3b8922d4780f5 100644 (file)
@@ -17,7 +17,7 @@ define(["require", "exports", "tslib", "../Dom/Util"], function (require, export
             if (_callback !== null) {
                 _callback();
             }
-            window.removeEventListener('scroll', onScroll);
+            window.removeEventListener("scroll", onScroll);
             _callback = null;
             _timeoutScroll = null;
         }, 100);
@@ -32,7 +32,7 @@ define(["require", "exports", "tslib", "../Dom/Util"], function (require, export
         if (!(element instanceof HTMLElement)) {
             throw new TypeError("Expected a valid DOM element.");
         }
-        else if (callback !== undefined && typeof callback !== 'function') {
+        else if (callback !== undefined && typeof callback !== "function") {
             throw new TypeError("Expected a valid callback function.");
         }
         else if (!document.body.contains(element)) {
@@ -43,15 +43,15 @@ define(["require", "exports", "tslib", "../Dom/Util"], function (require, export
         }
         if (callback) {
             _callback = callback;
-            window.addEventListener('scroll', onScroll);
+            window.addEventListener("scroll", onScroll);
         }
         let y = Util_1.default.offset(element).top;
         if (_offset === null) {
             _offset = 50;
-            const pageHeader = document.getElementById('pageHeaderPanel');
+            const pageHeader = document.getElementById("pageHeaderPanel");
             if (pageHeader !== null) {
                 const position = window.getComputedStyle(pageHeader).position;
-                if (position === 'fixed' || position === 'static') {
+                if (position === "fixed" || position === "static") {
                     _offset = pageHeader.offsetHeight;
                 }
                 else {
@@ -72,7 +72,7 @@ define(["require", "exports", "tslib", "../Dom/Util"], function (require, export
         window.scrollTo({
             left: 0,
             top: y,
-            behavior: 'smooth',
+            behavior: "smooth",
         });
         window.setTimeout(() => {
             // no scrolling took place
index 10b814bef91dfe456160fa540c62f8d3760ad960..41189e02b6514dfd2064e877bf4b5489a1e5c6ae 100644 (file)
@@ -23,24 +23,24 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ut
             this.activeItem = undefined;
             this.callbackDropdownInit = undefined;
             this.callbackSelect = undefined;
-            this.dropdownContainerId = '';
+            this.dropdownContainerId = "";
             this.excludedSearchValues = new Set();
             this.list = undefined;
-            this.lastValue = '';
+            this.lastValue = "";
             this.request = undefined;
             this.timerDelay = undefined;
             this.element = element;
             if (!(this.element instanceof HTMLInputElement)) {
                 throw new TypeError("Expected a valid DOM element.");
             }
-            else if (this.element.nodeName !== 'INPUT' || (this.element.type !== 'search' && this.element.type !== 'text')) {
+            else if (this.element.nodeName !== "INPUT" || (this.element.type !== "search" && this.element.type !== "text")) {
                 throw new Error('Expected an input[type="text"].');
             }
             options = Core.extend({
                 ajax: {
-                    actionName: 'getSearchResultList',
-                    className: '',
-                    interfaceName: 'wcf\\data\\ISearchAction',
+                    actionName: "getSearchResultList",
+                    className: "",
+                    interfaceName: "wcf\\data\\ISearchAction",
                 },
                 autoFocus: true,
                 callbackDropdownInit: undefined,
@@ -48,7 +48,7 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ut
                 delay: 500,
                 excludedSearchValues: [],
                 minLength: 3,
-                noResultPlaceholder: '',
+                noResultPlaceholder: "",
                 preventSubmit: false,
             }, options);
             this.ajaxPayload = options.ajax;
@@ -56,16 +56,16 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ut
             this.callbackDropdownInit = options.callbackDropdownInit;
             this.callbackSelect = options.callbackSelect;
             this.delay = options.delay;
-            options.excludedSearchValues.forEach(value => {
+            options.excludedSearchValues.forEach((value) => {
                 this.addExcludedSearchValues(value);
             });
             this.minLength = options.minLength;
             this.noResultPlaceholder = options.noResultPlaceholder;
             this.preventSubmit = options.preventSubmit;
             // Disable auto-complete because it collides with the suggestion dropdown.
-            this.element.autocomplete = 'off';
-            this.element.addEventListener('keydown', (ev) => this.keydown(ev));
-            this.element.addEventListener('keyup', (ev) => this.keyup(ev));
+            this.element.autocomplete = "off";
+            this.element.addEventListener("keydown", (ev) => this.keydown(ev));
+            this.element.addEventListener("keyup", (ev) => this.keyup(ev));
         }
         /**
          * Adds an excluded search value.
@@ -84,11 +84,11 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ut
          */
         keydown(event) {
             if ((this.activeItem !== null && Simple_1.default.isOpen(this.dropdownContainerId)) || this.preventSubmit) {
-                if (event.key === 'Enter') {
+                if (event.key === "Enter") {
                     event.preventDefault();
                 }
             }
-            if (['ArrowUp', 'ArrowDown', 'Escape'].includes(event.key)) {
+            if (["ArrowUp", "ArrowDown", "Escape"].includes(event.key)) {
                 event.preventDefault();
             }
         }
@@ -99,15 +99,15 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ut
             // handle dropdown keyboard navigation
             if (this.activeItem !== null || !this.autoFocus) {
                 if (Simple_1.default.isOpen(this.dropdownContainerId)) {
-                    if (event.key === 'ArrowUp') {
+                    if (event.key === "ArrowUp") {
                         event.preventDefault();
                         return this.keyboardPreviousItem();
                     }
-                    else if (event.key === 'ArrowDown') {
+                    else if (event.key === "ArrowDown") {
                         event.preventDefault();
                         return this.keyboardNextItem();
                     }
-                    else if (event.key === 'Enter') {
+                    else if (event.key === "Enter") {
                         event.preventDefault();
                         return this.keyboardSelectItem();
                     }
@@ -117,7 +117,7 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ut
                 }
             }
             // close list on escape
-            if (event.key === 'Escape') {
+            if (event.key === "Escape") {
                 Simple_1.default.close(this.dropdownContainerId);
                 return;
             }
@@ -176,13 +176,13 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ut
         keyboardNextItem() {
             let nextItem = undefined;
             if (this.activeItem) {
-                this.activeItem.classList.remove('active');
+                this.activeItem.classList.remove("active");
                 if (this.activeItem.nextElementSibling) {
                     nextItem = this.activeItem.nextElementSibling;
                 }
             }
             this.activeItem = nextItem || this.list.children[0];
-            this.activeItem.classList.add('active');
+            this.activeItem.classList.add("active");
         }
         /**
          * Selects the previous dropdown item.
@@ -190,13 +190,13 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ut
         keyboardPreviousItem() {
             let nextItem = undefined;
             if (this.activeItem) {
-                this.activeItem.classList.remove('active');
+                this.activeItem.classList.remove("active");
                 if (this.activeItem.previousElementSibling) {
                     nextItem = this.activeItem.previousElementSibling;
                 }
             }
             this.activeItem = nextItem || this.list.children[this.list.childElementCount - 1];
-            this.activeItem.classList.add('active');
+            this.activeItem.classList.add("active");
         }
         /**
          * Selects the active item from the dropdown.
@@ -215,10 +215,10 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ut
          */
         selectItem(item) {
             if (this.callbackSelect && !this.callbackSelect(item)) {
-                this.element.value = '';
+                this.element.value = "";
             }
             else {
-                this.element.value = item.dataset.label || '';
+                this.element.value = item.dataset.label || "";
             }
             this.activeItem = undefined;
             Simple_1.default.close(this.dropdownContainerId);
@@ -229,23 +229,23 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ut
         _ajaxSuccess(data) {
             let createdList = false;
             if (!this.list) {
-                this.list = document.createElement('ul');
-                this.list.className = 'dropdownMenu';
+                this.list = document.createElement("ul");
+                this.list.className = "dropdownMenu";
                 createdList = true;
-                if (typeof this.callbackDropdownInit === 'function') {
+                if (typeof this.callbackDropdownInit === "function") {
                     this.callbackDropdownInit(this.list);
                 }
             }
             else {
                 // reset current list
-                this.list.innerHTML = '';
+                this.list.innerHTML = "";
             }
-            if (typeof data.returnValues === 'object') {
+            if (typeof data.returnValues === "object") {
                 const callbackClick = this.clickSelectItem.bind(this);
                 let listItem;
-                Object.keys(data.returnValues).forEach(key => {
+                Object.keys(data.returnValues).forEach((key) => {
                     listItem = this.createListItem(data.returnValues[key]);
-                    listItem.addEventListener('click', callbackClick);
+                    listItem.addEventListener("click", callbackClick);
                     this.list.appendChild(listItem);
                 });
             }
@@ -264,9 +264,9 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ut
                     Simple_1.default.open(this.dropdownContainerId, true);
                     // mark first item as active
                     const firstChild = this.list.childElementCount ? this.list.children[0] : undefined;
-                    if (this.autoFocus && firstChild && ~~(firstChild.dataset.objectId || '')) {
+                    if (this.autoFocus && firstChild && ~~(firstChild.dataset.objectId || "")) {
                         this.activeItem = firstChild;
-                        this.activeItem.classList.add('active');
+                        this.activeItem.classList.add("active");
                     }
                 }
             }
@@ -278,9 +278,9 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ut
             if (!this.noResultPlaceholder) {
                 return false;
             }
-            const listItem = document.createElement('li');
-            listItem.className = 'dropdownText';
-            const span = document.createElement('span');
+            const listItem = document.createElement("li");
+            listItem.className = "dropdownText";
+            const span = document.createElement("span");
             span.textContent = this.noResultPlaceholder;
             listItem.appendChild(span);
             this.list.appendChild(listItem);
@@ -290,10 +290,10 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ut
          * Creates an list item from response data.
          */
         createListItem(item) {
-            const listItem = document.createElement('li');
+            const listItem = document.createElement("li");
             listItem.dataset.objectId = item.objectID.toString();
             listItem.dataset.label = item.label;
-            const span = document.createElement('span');
+            const span = document.createElement("span");
             span.textContent = item.label;
             listItem.appendChild(span);
             return listItem;
index cebf0f897dba6c25eed05105c65f5a5cfd4ace4b..e4ffc9124606d432a9a621202837ca57c15e19bd 100644 (file)
@@ -10,78 +10,77 @@ define(["require", "exports", "tslib", "../../Core", "../../Dom/Traverse", "../.
     Input_1 = tslib_1.__importDefault(Input_1);
     function click(event) {
         event.preventDefault();
-        const pageHeader = document.getElementById('pageHeader');
-        pageHeader.classList.add('searchBarForceOpen');
+        const pageHeader = document.getElementById("pageHeader");
+        pageHeader.classList.add("searchBarForceOpen");
         window.setTimeout(() => {
-            pageHeader.classList.remove('searchBarForceOpen');
+            pageHeader.classList.remove("searchBarForceOpen");
         }, 10);
         const target = event.currentTarget;
         const objectType = target.dataset.objectType;
-        const container = document.getElementById('pageHeaderSearchParameters');
-        container.innerHTML = '';
+        const container = document.getElementById("pageHeaderSearchParameters");
+        container.innerHTML = "";
         const extendedLink = target.dataset.extendedLink;
         if (extendedLink) {
-            const link = document.querySelector('.pageHeaderSearchExtendedLink');
+            const link = document.querySelector(".pageHeaderSearchExtendedLink");
             link.href = extendedLink;
         }
         const parameters = new Map();
         try {
-            const data = JSON.parse(target.dataset.parameters || '');
+            const data = JSON.parse(target.dataset.parameters || "");
             if (Core.isPlainObject(data)) {
-                Object.keys(data).forEach(key => {
+                Object.keys(data).forEach((key) => {
                     parameters.set(key, data[key]);
                 });
             }
         }
-        catch (e) {
-        }
+        catch (e) { }
         if (objectType) {
-            parameters.set('types[]', objectType);
+            parameters.set("types[]", objectType);
         }
         parameters.forEach((value, key) => {
-            const input = document.createElement('input');
-            input.type = 'hidden';
+            const input = document.createElement("input");
+            input.type = "hidden";
             input.name = key;
             input.value = value;
             container.appendChild(input);
         });
         // update label
-        const inputContainer = document.getElementById('pageHeaderSearchInputContainer');
-        const button = inputContainer.querySelector('.pageHeaderSearchType > .button > .pageHeaderSearchTypeLabel');
+        const inputContainer = document.getElementById("pageHeaderSearchInputContainer");
+        const button = inputContainer.querySelector(".pageHeaderSearchType > .button > .pageHeaderSearchTypeLabel");
         button.textContent = target.textContent;
     }
     function init(objectType) {
-        const searchInput = document.getElementById('pageHeaderSearchInput');
+        const searchInput = document.getElementById("pageHeaderSearchInput");
         new Input_1.default(searchInput, {
             ajax: {
-                className: 'wcf\\data\\search\\keyword\\SearchKeywordAction',
+                className: "wcf\\data\\search\\keyword\\SearchKeywordAction",
             },
             autoFocus: false,
             callbackDropdownInit(dropdownMenu) {
-                dropdownMenu.classList.add('dropdownMenuPageSearch');
-                if (UiScreen.is('screen-lg')) {
-                    dropdownMenu.dataset.dropdownAlignmentHorizontal = 'right';
+                dropdownMenu.classList.add("dropdownMenuPageSearch");
+                if (UiScreen.is("screen-lg")) {
+                    dropdownMenu.dataset.dropdownAlignmentHorizontal = "right";
                     const minWidth = searchInput.clientWidth;
-                    dropdownMenu.style.setProperty('min-width', minWidth + 'px', '');
+                    dropdownMenu.style.setProperty("min-width", minWidth + "px", "");
                     // calculate offset to ignore the width caused by the submit button
                     const parent = searchInput.parentElement;
-                    const offsetRight = (Util_1.default.offset(parent).left + parent.clientWidth) - (Util_1.default.offset(searchInput).left + minWidth);
-                    const offsetTop = Util_1.default.styleAsInt(window.getComputedStyle(parent), 'padding-bottom');
-                    dropdownMenu.style.setProperty('transform', 'translateX(-' + Math.ceil(offsetRight) + 'px) translateY(-' + offsetTop + 'px)', '');
+                    const offsetRight = Util_1.default.offset(parent).left + parent.clientWidth - (Util_1.default.offset(searchInput).left + minWidth);
+                    const offsetTop = Util_1.default.styleAsInt(window.getComputedStyle(parent), "padding-bottom");
+                    dropdownMenu.style.setProperty("transform", "translateX(-" + Math.ceil(offsetRight) + "px) translateY(-" + offsetTop + "px)", "");
                 }
             },
             callbackSelect() {
                 setTimeout(() => {
-                    const form = DomTraverse.parentByTag(searchInput, 'FORM');
+                    const form = DomTraverse.parentByTag(searchInput, "FORM");
                     form.submit();
                 }, 1);
                 return true;
             },
         });
-        const searchType = document.querySelector('.pageHeaderSearchType');
+        const searchType = document.querySelector(".pageHeaderSearchType");
         const dropdownMenu = Simple_1.default.getDropdownMenu(Util_1.default.identify(searchType));
-        dropdownMenu.querySelectorAll('a[data-object-type]').forEach(link => {
-            link.addEventListener('click', click);
+        dropdownMenu.querySelectorAll("a[data-object-type]").forEach((link) => {
+            link.addEventListener("click", click);
         });
         // trigger click on init
         const link = dropdownMenu.querySelector('a[data-object-type="' + objectType + '"]');
index d54656304217056fccaa63d43860d4031f5337ea..1c41d1aca9a809eac5b18fe9e42680cb545a3407 100644 (file)
@@ -12,35 +12,35 @@ define(["require", "exports", "tslib", "../../Event/Handler"], function (require
     class UiSmileyInsert {
         constructor(editorId) {
             this.editorId = editorId;
-            let container = document.getElementById('smilies-' + this.editorId);
+            let container = document.getElementById("smilies-" + this.editorId);
             if (!container) {
                 // form builder
-                container = document.getElementById(this.editorId + 'SmiliesTabContainer');
+                container = document.getElementById(this.editorId + "SmiliesTabContainer");
                 if (!container) {
-                    throw new Error('Unable to find the message tab menu container containing the smilies.');
+                    throw new Error("Unable to find the message tab menu container containing the smilies.");
                 }
             }
             this.container = container;
-            this.container.addEventListener('keydown', (ev) => this.keydown(ev));
-            this.container.addEventListener('mousedown', (ev) => this.mousedown(ev));
+            this.container.addEventListener("keydown", (ev) => this.keydown(ev));
+            this.container.addEventListener("mousedown", (ev) => this.mousedown(ev));
         }
         keydown(event) {
             const activeButton = document.activeElement;
-            if (!activeButton.classList.contains('jsSmiley')) {
+            if (!activeButton.classList.contains("jsSmiley")) {
                 return;
             }
-            if (['ArrowLeft', 'ArrowRight', 'End', 'Home'].includes(event.key)) {
+            if (["ArrowLeft", "ArrowRight", "End", "Home"].includes(event.key)) {
                 event.preventDefault();
                 const target = event.currentTarget;
-                const smilies = Array.from(target.querySelectorAll('.jsSmiley'));
-                if (event.key === 'ArrowLeft') {
+                const smilies = Array.from(target.querySelectorAll(".jsSmiley"));
+                if (event.key === "ArrowLeft") {
                     smilies.reverse();
                 }
                 let index = smilies.indexOf(activeButton);
-                if (event.key === 'Home') {
+                if (event.key === "Home") {
                     index = 0;
                 }
-                else if (event.key === 'End') {
+                else if (event.key === "End") {
                     index = smilies.length - 1;
                 }
                 else {
@@ -51,26 +51,26 @@ define(["require", "exports", "tslib", "../../Event/Handler"], function (require
                 }
                 smilies[index].focus();
             }
-            else if (event.key === 'Enter' || event.key === 'Space') {
+            else if (event.key === "Enter" || event.key === "Space") {
                 event.preventDefault();
-                const image = activeButton.querySelector('img');
+                const image = activeButton.querySelector("img");
                 this.insert(image);
             }
         }
         mousedown(event) {
             const target = event.target;
             // Clicks may occur on a few different elements, but we are only looking for the image.
-            const listItem = target.closest('li');
+            const listItem = target.closest("li");
             if (listItem && this.container.contains(listItem)) {
                 event.preventDefault();
-                const img = listItem.querySelector('img');
+                const img = listItem.querySelector("img");
                 if (img) {
                     this.insert(img);
                 }
             }
         }
         insert(img) {
-            EventHandler.fire('com.woltlab.wcf.redactor2', 'insertSmiley_' + this.editorId, {
+            EventHandler.fire("com.woltlab.wcf.redactor2", "insertSmiley_" + this.editorId, {
                 img,
             });
         }
index a8858d03a37464724c137549a972a5e66d83eb3e..49097db596cf4686afd585bdefd75e1428e064fc 100644 (file)
@@ -17,29 +17,29 @@ define(["require", "exports", "tslib", "../Ajax", "../Core", "./Dropdown/Simple"
          */
         constructor(elementId, options) {
             this.dropdownMenu = null;
-            this.value = '';
+            this.value = "";
             const element = document.getElementById(elementId);
             if (element === null) {
                 throw new Error("Expected a valid element id.");
             }
             this.element = element;
             this.ajaxPayload = Core.extend({
-                actionName: 'getSearchResultList',
-                className: '',
-                interfaceName: 'wcf\\data\\ISearchAction',
+                actionName: "getSearchResultList",
+                className: "",
+                interfaceName: "wcf\\data\\ISearchAction",
                 parameters: {
                     data: {},
                 },
             }, options.ajax);
-            if (typeof options.callbackSelect !== 'function') {
+            if (typeof options.callbackSelect !== "function") {
                 throw new Error("Expected a valid callback for option 'callbackSelect'.");
             }
             this.callbackSelect = options.callbackSelect;
             this.excludedSearchValues = new Set(Array.isArray(options.excludedSearchValues) ? options.excludedSearchValues : []);
             this.threshold = options.threshold === undefined ? 3 : options.threshold;
-            this.element.addEventListener('click', (ev) => ev.preventDefault());
-            this.element.addEventListener('keydown', (ev) => this.keyDown(ev));
-            this.element.addEventListener('keyup', (ev) => this.keyUp(ev));
+            this.element.addEventListener("click", (ev) => ev.preventDefault());
+            this.element.addEventListener("keydown", (ev) => this.keyDown(ev));
+            this.element.addEventListener("keyup", (ev) => this.keyUp(ev));
         }
         /**
          * Adds an excluded search value.
@@ -66,23 +66,23 @@ define(["require", "exports", "tslib", "../Ajax", "../Core", "./Dropdown/Simple"
             if (!this.isActive()) {
                 return true;
             }
-            if (['ArrowDown', 'ArrowUp', 'Enter', 'Escape'].indexOf(event.key) === -1) {
+            if (["ArrowDown", "ArrowUp", "Enter", "Escape"].indexOf(event.key) === -1) {
                 return true;
             }
             let active;
             let i = 0, length = this.dropdownMenu.childElementCount;
             while (i < length) {
                 active = this.dropdownMenu.children[i];
-                if (active.classList.contains('active')) {
+                if (active.classList.contains("active")) {
                     break;
                 }
                 i++;
             }
-            if (event.key === 'Enter') {
+            if (event.key === "Enter") {
                 Simple_1.default.close(this.element.id);
                 this.select(undefined, active);
             }
-            else if (event.key === 'Escape') {
+            else if (event.key === "Escape") {
                 if (Simple_1.default.isOpen(this.element.id)) {
                     Simple_1.default.close(this.element.id);
                 }
@@ -93,17 +93,17 @@ define(["require", "exports", "tslib", "../Ajax", "../Core", "./Dropdown/Simple"
             }
             else {
                 let index = 0;
-                if (event.key === 'ArrowUp') {
-                    index = ((i === 0) ? length : i) - 1;
+                if (event.key === "ArrowUp") {
+                    index = (i === 0 ? length : i) - 1;
                 }
-                else if (event.key === 'ArrowDown') {
+                else if (event.key === "ArrowDown") {
                     index = i + 1;
                     if (index === length)
                         index = 0;
                 }
                 if (index !== i) {
-                    active.classList.remove('active');
-                    this.dropdownMenu.children[index].classList.add('active');
+                    active.classList.remove("active");
+                    this.dropdownMenu.children[index].classList.add("active");
                 }
             }
             event.preventDefault();
@@ -117,8 +117,8 @@ define(["require", "exports", "tslib", "../Ajax", "../Core", "./Dropdown/Simple"
             const anchor = item.children[0];
             this.callbackSelect(this.element.id, {
                 objectId: +(anchor.dataset.objectId || 0),
-                value: item.textContent || '',
-                type: anchor.dataset.type || '',
+                value: item.textContent || "",
+                type: anchor.dataset.type || "",
             });
             if (event instanceof MouseEvent) {
                 this.element.focus();
@@ -160,19 +160,19 @@ define(["require", "exports", "tslib", "../Ajax", "../Core", "./Dropdown/Simple"
          */
         _ajaxSuccess(data) {
             if (this.dropdownMenu === null) {
-                this.dropdownMenu = document.createElement('div');
-                this.dropdownMenu.className = 'dropdownMenu';
+                this.dropdownMenu = document.createElement("div");
+                this.dropdownMenu.className = "dropdownMenu";
                 Simple_1.default.initFragment(this.element, this.dropdownMenu);
             }
             else {
-                this.dropdownMenu.innerHTML = '';
+                this.dropdownMenu.innerHTML = "";
             }
             if (Array.isArray(data.returnValues)) {
                 data.returnValues.forEach((item, index) => {
-                    const anchor = document.createElement('a');
+                    const anchor = document.createElement("a");
                     if (item.icon) {
-                        anchor.className = 'box16';
-                        anchor.innerHTML = item.icon + ' <span></span>';
+                        anchor.className = "box16";
+                        anchor.innerHTML = item.icon + " <span></span>";
                         anchor.children[1].textContent = item.label;
                     }
                     else {
@@ -182,10 +182,10 @@ define(["require", "exports", "tslib", "../Ajax", "../Core", "./Dropdown/Simple"
                     if (item.type) {
                         anchor.dataset.type = item.type;
                     }
-                    anchor.addEventListener('click', (ev) => this.select(ev));
-                    const listItem = document.createElement('li');
+                    anchor.addEventListener("click", (ev) => this.select(ev));
+                    const listItem = document.createElement("li");
                     if (index === 0) {
-                        listItem.className = 'active';
+                        listItem.className = "active";
                     }
                     listItem.appendChild(anchor);
                     this.dropdownMenu.appendChild(listItem);
index 86d28bfa932f6d214fc5e33eda29a2282daa9f4c..87f1d703e33817f604fbe620004e7e3c9078cfcd 100644 (file)
@@ -24,7 +24,7 @@ define(["require", "exports", "tslib", "../Dom/Change/Listener", "../Dom/Util",
      * Initializes available tab menus.
      */
     function init() {
-        document.querySelectorAll('.tabMenuContainer:not(.staticTabMenuContainer)').forEach(container => {
+        document.querySelectorAll(".tabMenuContainer:not(.staticTabMenuContainer)").forEach((container) => {
             const containerId = Util_1.default.identify(container);
             if (_tabMenus.has(containerId)) {
                 return;
@@ -43,27 +43,27 @@ define(["require", "exports", "tslib", "../Dom/Change/Listener", "../Dom/Util",
                     tabMenu.select(returnValue.id, undefined, true);
                 }
             }
-            const list = document.querySelector('#' + containerId + ' > nav > ul');
-            list.addEventListener('click', event => {
+            const list = document.querySelector("#" + containerId + " > nav > ul");
+            list.addEventListener("click", (event) => {
                 event.preventDefault();
                 event.stopPropagation();
                 if (event.target === list) {
-                    list.classList.add('active');
+                    list.classList.add("active");
                     _activeList = list;
                 }
                 else {
-                    list.classList.remove('active');
+                    list.classList.remove("active");
                     _activeList = null;
                 }
             });
             // bind scroll listener
-            container.querySelectorAll('.tabMenu, .menu').forEach(menu => {
+            container.querySelectorAll(".tabMenu, .menu").forEach((menu) => {
                 function callback() {
                     timeout = null;
                     rebuildMenuOverflow(menu);
                 }
                 let timeout = null;
-                menu.querySelector('ul').addEventListener('scroll', () => {
+                menu.querySelector("ul").addEventListener("scroll", () => {
                     if (timeout !== null) {
                         window.clearTimeout(timeout);
                     }
@@ -76,21 +76,21 @@ define(["require", "exports", "tslib", "../Dom/Change/Listener", "../Dom/Util",
             // to not work and a warning is displayed on the console. We can work around this
             // by manually checking if the input fields validate on submit and display the
             // parent tab ourselves.
-            const form = container.closest('form');
+            const form = container.closest("form");
             if (form !== null) {
                 const submitButton = form.querySelector('input[type="submit"]');
                 if (submitButton !== null) {
-                    submitButton.addEventListener('click', event => {
+                    submitButton.addEventListener("click", (event) => {
                         if (event.defaultPrevented) {
                             return;
                         }
-                        container.querySelectorAll('input, select').forEach((element) => {
+                        container.querySelectorAll("input, select").forEach((element) => {
                             if (!element.checkValidity()) {
                                 event.preventDefault();
                                 // Select the tab that contains the erroneous element.
-                                const tabMenu = getTabMenu(element.closest('.tabMenuContainer').id);
-                                const tabMenuContent = element.closest('.tabMenuContent');
-                                tabMenu.select(tabMenuContent.dataset.name || '');
+                                const tabMenu = getTabMenu(element.closest(".tabMenuContainer").id);
+                                const tabMenuContent = element.closest(".tabMenuContent");
+                                tabMenu.select(tabMenuContent.dataset.name || "");
                                 UiScroll.element(element, () => {
                                     element.reportValidity();
                                 });
@@ -106,10 +106,10 @@ define(["require", "exports", "tslib", "../Dom/Change/Listener", "../Dom/Util",
      * Selects the first tab containing an element with class `formError`.
      */
     function selectErroneousTabs() {
-        _tabMenus.forEach(tabMenu => {
+        _tabMenus.forEach((tabMenu) => {
             let foundError = false;
-            tabMenu.getContainers().forEach(container => {
-                if (!foundError && container.querySelector('.formError') !== null) {
+            tabMenu.getContainers().forEach((container) => {
+                if (!foundError && container.querySelector(".formError") !== null) {
                     foundError = true;
                     tabMenu.select(container.id);
                 }
@@ -118,10 +118,10 @@ define(["require", "exports", "tslib", "../Dom/Change/Listener", "../Dom/Util",
     }
     function scrollEnable(isSetup) {
         _enableTabScroll = true;
-        _tabMenus.forEach(tabMenu => {
+        _tabMenus.forEach((tabMenu) => {
             const activeTab = tabMenu.getActiveTab();
             if (isSetup) {
-                rebuildMenuOverflow(activeTab.closest('.menu, .tabMenu'));
+                rebuildMenuOverflow(activeTab.closest(".menu, .tabMenu"));
             }
             else {
                 scrollToTab(activeTab);
@@ -149,19 +149,19 @@ define(["require", "exports", "tslib", "../Dom/Change/Listener", "../Dom/Util",
         if (scrollLeft === left) {
             return;
         }
-        list.classList.add('enableAnimation');
+        list.classList.add("enableAnimation");
         // new value is larger, we're scrolling towards the end
         if (scrollLeft < left) {
-            list.firstElementChild.style.setProperty('margin-left', (scrollLeft - left) + 'px', '');
+            list.firstElementChild.style.setProperty("margin-left", scrollLeft - left + "px", "");
         }
         else {
             // new value is smaller, we're scrolling towards the start
-            list.style.setProperty('padding-left', (scrollLeft - left) + 'px', '');
+            list.style.setProperty("padding-left", scrollLeft - left + "px", "");
         }
         setTimeout(() => {
-            list.classList.remove('enableAnimation');
-            list.firstElementChild.style.removeProperty('margin-left');
-            list.style.removeProperty('padding-left');
+            list.classList.remove("enableAnimation");
+            list.firstElementChild.style.removeProperty("margin-left");
+            list.style.removeProperty("padding-left");
             list.scrollLeft = left;
         }, 300);
     }
@@ -170,42 +170,42 @@ define(["require", "exports", "tslib", "../Dom/Change/Listener", "../Dom/Util",
             return;
         }
         const width = menu.clientWidth;
-        const list = menu.querySelector('ul');
+        const list = menu.querySelector("ul");
         const scrollLeft = list.scrollLeft;
         const scrollWidth = list.scrollWidth;
-        const overflowLeft = (scrollLeft > 0);
-        let overlayLeft = menu.querySelector('.tabMenuOverlayLeft');
+        const overflowLeft = scrollLeft > 0;
+        let overlayLeft = menu.querySelector(".tabMenuOverlayLeft");
         if (overflowLeft) {
             if (overlayLeft === null) {
-                overlayLeft = document.createElement('span');
-                overlayLeft.className = 'tabMenuOverlayLeft icon icon24 fa-angle-left';
-                overlayLeft.addEventListener('click', () => {
+                overlayLeft = document.createElement("span");
+                overlayLeft.className = "tabMenuOverlayLeft icon icon24 fa-angle-left";
+                overlayLeft.addEventListener("click", () => {
                     const listWidth = list.clientWidth;
                     scrollMenu(list, list.scrollLeft - ~~(listWidth / 2), list.scrollLeft, list.scrollWidth, listWidth, 0);
                 });
                 menu.insertBefore(overlayLeft, menu.firstChild);
             }
-            overlayLeft.classList.add('active');
+            overlayLeft.classList.add("active");
         }
         else if (overlayLeft !== null) {
-            overlayLeft.classList.remove('active');
+            overlayLeft.classList.remove("active");
         }
-        const overflowRight = (width + scrollLeft < scrollWidth);
-        let overlayRight = menu.querySelector('.tabMenuOverlayRight');
+        const overflowRight = width + scrollLeft < scrollWidth;
+        let overlayRight = menu.querySelector(".tabMenuOverlayRight");
         if (overflowRight) {
             if (overlayRight === null) {
-                overlayRight = document.createElement('span');
-                overlayRight.className = 'tabMenuOverlayRight icon icon24 fa-angle-right';
-                overlayRight.addEventListener('click', () => {
+                overlayRight = document.createElement("span");
+                overlayRight.className = "tabMenuOverlayRight icon icon24 fa-angle-right";
+                overlayRight.addEventListener("click", () => {
                     const listWidth = list.clientWidth;
                     scrollMenu(list, list.scrollLeft + ~~(listWidth / 2), list.scrollLeft, list.scrollWidth, listWidth, 0);
                 });
                 menu.appendChild(overlayRight);
             }
-            overlayRight.classList.add('active');
+            overlayRight.classList.add("active");
         }
         else if (overlayRight !== null) {
-            overlayRight.classList.remove('active');
+            overlayRight.classList.remove("active");
         }
     }
     /**
@@ -214,14 +214,14 @@ define(["require", "exports", "tslib", "../Dom/Change/Listener", "../Dom/Util",
     function setup() {
         init();
         selectErroneousTabs();
-        Listener_1.default.add('WoltLabSuite/Core/Ui/TabMenu', init);
-        CloseOverlay_1.default.add('WoltLabSuite/Core/Ui/TabMenu', () => {
+        Listener_1.default.add("WoltLabSuite/Core/Ui/TabMenu", init);
+        CloseOverlay_1.default.add("WoltLabSuite/Core/Ui/TabMenu", () => {
             if (_activeList) {
-                _activeList.classList.remove('active');
+                _activeList.classList.remove("active");
                 _activeList = null;
             }
         });
-        UiScreen.on('screen-sm-down', {
+        UiScreen.on("screen-sm-down", {
             match() {
                 scrollEnable(false);
             },
@@ -230,11 +230,11 @@ define(["require", "exports", "tslib", "../Dom/Change/Listener", "../Dom/Util",
                 scrollEnable(true);
             },
         });
-        window.addEventListener('hashchange', () => {
+        window.addEventListener("hashchange", () => {
             const hash = Simple_1.default.getIdentifierFromHash();
             const element = hash ? document.getElementById(hash) : null;
-            if (element !== null && element.classList.contains('tabMenuContent')) {
-                _tabMenus.forEach(tabMenu => {
+            if (element !== null && element.classList.contains("tabMenuContent")) {
+                _tabMenus.forEach((tabMenu) => {
                     if (tabMenu.hasTab(hash)) {
                         tabMenu.select(hash);
                     }
@@ -246,8 +246,8 @@ define(["require", "exports", "tslib", "../Dom/Change/Listener", "../Dom/Util",
             window.setTimeout(() => {
                 // check if page was initially scrolled using a tab id
                 const tabMenuContent = document.getElementById(hash);
-                if (tabMenuContent && tabMenuContent.classList.contains('tabMenuContent')) {
-                    const scrollY = (window.scrollY || window.pageYOffset);
+                if (tabMenuContent && tabMenuContent.classList.contains("tabMenuContent")) {
+                    const scrollY = window.scrollY || window.pageYOffset;
                     if (scrollY > 0) {
                         const parent = tabMenuContent.parentNode;
                         let offsetTop = parent.offsetTop - 50;
@@ -281,7 +281,7 @@ define(["require", "exports", "tslib", "../Dom/Change/Listener", "../Dom/Util",
         if (!_enableTabScroll) {
             return;
         }
-        const list = tab.closest('ul');
+        const list = tab.closest("ul");
         const width = list.clientWidth;
         const scrollLeft = list.scrollLeft;
         const scrollWidth = list.scrollWidth;
index 05ba0ca20967e3c271ad04488778709549054491..ab692257ed550cb3a671d5d3f2818aa1db3f5155 100644 (file)
@@ -35,19 +35,19 @@ define(["require", "exports", "tslib", "../../Dom/Traverse", "../../Dom/Util", "
          * </div>
          */
         validate() {
-            if (!this.container.classList.contains('tabMenuContainer')) {
+            if (!this.container.classList.contains("tabMenuContainer")) {
                 return false;
             }
-            const nav = DomTraverse.childByTag(this.container, 'NAV');
+            const nav = DomTraverse.childByTag(this.container, "NAV");
             if (nav === null) {
                 return false;
             }
             // get children
-            const tabs = nav.querySelectorAll('li');
+            const tabs = nav.querySelectorAll("li");
             if (tabs.length === 0) {
                 return false;
             }
-            DomTraverse.childrenByTag(this.container, 'DIV').forEach((container) => {
+            DomTraverse.childrenByTag(this.container, "DIV").forEach((container) => {
                 let name = container.dataset.name;
                 if (!name) {
                     name = Util_1.default.identify(container);
@@ -56,13 +56,17 @@ define(["require", "exports", "tslib", "../../Dom/Traverse", "../../Dom/Util", "
                 this.containers.set(name, container);
             });
             const containerId = this.container.id;
-            tabs.forEach(tab => {
+            tabs.forEach((tab) => {
                 const name = this._getTabName(tab);
                 if (!name) {
                     return;
                 }
                 if (this.tabs.has(name)) {
-                    throw new Error("Tab names must be unique, li[data-name='" + name + "'] (tab menu id: '" + containerId + "') exists more than once.");
+                    throw new Error("Tab names must be unique, li[data-name='" +
+                        name +
+                        "'] (tab menu id: '" +
+                        containerId +
+                        "') exists more than once.");
                 }
                 const container = this.containers.get(name);
                 if (container === undefined) {
@@ -72,7 +76,7 @@ define(["require", "exports", "tslib", "../../Dom/Traverse", "../../Dom/Util", "
                     throw new Error("Expected content element '" + name + "' (tab menu id: '" + containerId + "') to be a direct children.");
                 }
                 // check if tab holds exactly one children which is an anchor element
-                if (tab.childElementCount !== 1 || tab.children[0].nodeName !== 'A') {
+                if (tab.childElementCount !== 1 || tab.children[0].nodeName !== "A") {
                     throw new Error("Expected exactly one <a> as children for li[data-name='" + name + "'] (tab menu id: '" + containerId + "').");
                 }
                 this.tabs.set(name, tab);
@@ -81,9 +85,9 @@ define(["require", "exports", "tslib", "../../Dom/Traverse", "../../Dom/Util", "
                 throw new Error("Expected at least one tab (tab menu id: '" + containerId + "').");
             }
             if (this.isLegacy) {
-                this.container.dataset.isLegacy = 'true';
+                this.container.dataset.isLegacy = "true";
                 this.tabs.forEach(function (tab, name) {
-                    tab.setAttribute('aria-controls', name);
+                    tab.setAttribute("aria-controls", name);
                 });
             }
             return true;
@@ -93,29 +97,29 @@ define(["require", "exports", "tslib", "../../Dom/Traverse", "../../Dom/Util", "
          */
         init(oldTabs) {
             // bind listeners
-            this.tabs.forEach(tab => {
-                if (!oldTabs || oldTabs.get(tab.dataset.name || '') !== tab) {
+            this.tabs.forEach((tab) => {
+                if (!oldTabs || oldTabs.get(tab.dataset.name || "") !== tab) {
                     const firstChild = tab.children[0];
-                    firstChild.addEventListener('click', (ev) => this._onClick(ev));
+                    firstChild.addEventListener("click", (ev) => this._onClick(ev));
                     // iOS 13 changed the behavior for click events after scrolling the menu. It prevents
                     // the synthetic mouse events like "click" from triggering for a short duration after
                     // a scrolling has occurred. If the user scrolls to the end of the list and immediately
                     // attempts to click the tab, nothing will happen. However, if the user waits for some
                     // time, the tap will trigger a "click" event again.
-                    // 
+                    //
                     // A "click" event is basically the result of a touch without any (significant) finger
                     // movement indicated by a "touchmove" event. This changes allows the user to scroll
                     // both the menu and the page normally, but still benefit from snappy reactions when
                     // tapping a menu item.
-                    if (Environment.platform() === 'ios') {
+                    if (Environment.platform() === "ios") {
                         let isClick = false;
-                        firstChild.addEventListener('touchstart', () => {
+                        firstChild.addEventListener("touchstart", () => {
                             isClick = true;
                         });
-                        firstChild.addEventListener('touchmove', () => {
+                        firstChild.addEventListener("touchmove", () => {
                             isClick = false;
                         });
-                        firstChild.addEventListener('touchend', (event) => {
+                        firstChild.addEventListener("touchend", (event) => {
                             if (isClick) {
                                 isClick = false;
                                 // This will block the regular click event from firing.
@@ -131,12 +135,12 @@ define(["require", "exports", "tslib", "../../Dom/Traverse", "../../Dom/Util", "
             if (!oldTabs) {
                 const hash = TabMenuSimple.getIdentifierFromHash();
                 let selectTab = undefined;
-                if (hash !== '') {
+                if (hash !== "") {
                     selectTab = this.tabs.get(hash);
                     // check for parent tab menu
                     if (selectTab) {
                         const item = this.container.parentNode;
-                        if (item.classList.contains('tabMenuContainer')) {
+                        if (item.classList.contains("tabMenuContainer")) {
                             returnValue = item;
                         }
                     }
@@ -148,27 +152,29 @@ define(["require", "exports", "tslib", "../../Dom/Traverse", "../../Dom/Util", "
                     }
                     if (preselect === true) {
                         this.tabs.forEach(function (tab) {
-                            if (!selectTab && !Util_1.default.isHidden(tab) && (!tab.previousElementSibling || Util_1.default.isHidden(tab.previousElementSibling))) {
+                            if (!selectTab &&
+                                !Util_1.default.isHidden(tab) &&
+                                (!tab.previousElementSibling || Util_1.default.isHidden(tab.previousElementSibling))) {
                                 selectTab = tab;
                             }
                         });
                     }
-                    else if (typeof preselect === 'string' && preselect !== "false") {
+                    else if (typeof preselect === "string" && preselect !== "false") {
                         selectTab = this.tabs.get(preselect);
                     }
                 }
                 if (selectTab) {
-                    this.containers.forEach(container => {
-                        container.classList.add('hidden');
+                    this.containers.forEach((container) => {
+                        container.classList.add("hidden");
                     });
                     this.select(null, selectTab, true);
                 }
                 const store = this.container.dataset.store;
                 if (store) {
-                    const input = document.createElement('input');
-                    input.type = 'hidden';
+                    const input = document.createElement("input");
+                    input.type = "hidden";
                     input.name = store;
-                    input.value = this.getActiveTab().dataset.name || '';
+                    input.value = this.getActiveTab().dataset.name || "";
                     this.container.appendChild(input);
                     this.store = input;
                 }
@@ -183,14 +189,14 @@ define(["require", "exports", "tslib", "../../Dom/Traverse", "../../Dom/Util", "
          * @param  {boolean=}    disableEvent  suppress event handling
          */
         select(name, tab, disableEvent) {
-            name = (name) ? name.toString() : '';
+            name = name ? name.toString() : "";
             tab = tab || this.tabs.get(name);
             if (!tab) {
                 // check if name is an integer
                 if (~~name === +name) {
                     name = ~~name;
                     let i = 0;
-                    this.tabs.forEach(item => {
+                    this.tabs.forEach((item) => {
                         if (i === name) {
                             tab = item;
                         }
@@ -201,7 +207,7 @@ define(["require", "exports", "tslib", "../../Dom/Traverse", "../../Dom/Util", "
                     throw new Error("Expected a valid tab name, '" + name + "' given (tab menu id: '" + this.container.id + "').");
                 }
             }
-            name = (name || tab.dataset.name || '');
+            name = (name || tab.dataset.name || "");
             // unmark active tab
             const oldTab = this.getActiveTab();
             let oldContent = null;
@@ -212,57 +218,57 @@ define(["require", "exports", "tslib", "../../Dom/Traverse", "../../Dom/Util", "
                     return;
                 }
                 if (!disableEvent) {
-                    EventHandler.fire('com.woltlab.wcf.simpleTabMenu_' + this.container.id, 'beforeSelect', {
+                    EventHandler.fire("com.woltlab.wcf.simpleTabMenu_" + this.container.id, "beforeSelect", {
                         tab: oldTab,
                         tabName: oldTabName,
                     });
                 }
-                oldTab.classList.remove('active');
-                oldContent = this.containers.get(oldTab.dataset.name || '');
-                oldContent.classList.remove('active');
-                oldContent.classList.add('hidden');
+                oldTab.classList.remove("active");
+                oldContent = this.containers.get(oldTab.dataset.name || "");
+                oldContent.classList.remove("active");
+                oldContent.classList.add("hidden");
                 if (this.isLegacy) {
-                    oldTab.classList.remove('ui-state-active');
-                    oldContent.classList.remove('ui-state-active');
+                    oldTab.classList.remove("ui-state-active");
+                    oldContent.classList.remove("ui-state-active");
                 }
             }
-            tab.classList.add('active');
+            tab.classList.add("active");
             const newContent = this.containers.get(name);
-            newContent.classList.add('active');
-            newContent.classList.remove('hidden');
+            newContent.classList.add("active");
+            newContent.classList.remove("hidden");
             if (this.isLegacy) {
-                tab.classList.add('ui-state-active');
-                newContent.classList.add('ui-state-active');
+                tab.classList.add("ui-state-active");
+                newContent.classList.add("ui-state-active");
             }
             if (this.store) {
                 this.store.value = name;
             }
             if (!disableEvent) {
-                EventHandler.fire('com.woltlab.wcf.simpleTabMenu_' + this.container.id, 'select', {
+                EventHandler.fire("com.woltlab.wcf.simpleTabMenu_" + this.container.id, "select", {
                     active: tab,
                     activeName: name,
                     previous: oldTab,
                     previousName: oldTab ? oldTab.dataset.name : null,
                 });
-                const jQuery = (this.isLegacy && typeof window.jQuery === 'function') ? window.jQuery : null;
+                const jQuery = this.isLegacy && typeof window.jQuery === "function" ? window.jQuery : null;
                 if (jQuery) {
                     // simulate jQuery UI Tabs event
-                    jQuery(this.container).trigger('wcftabsbeforeactivate', {
+                    jQuery(this.container).trigger("wcftabsbeforeactivate", {
                         newTab: jQuery(tab),
                         oldTab: jQuery(oldTab),
                         newPanel: jQuery(newContent),
                         oldPanel: jQuery(oldContent),
                     });
                 }
-                let location = window.location.href.replace(/#+[^#]*$/, '');
+                let location = window.location.href.replace(/#+[^#]*$/, "");
                 if (TabMenuSimple.getIdentifierFromHash() === name) {
                     location += window.location.hash;
                 }
                 else {
-                    location += '#' + name;
+                    location += "#" + name;
                 }
                 // update history
-                window.history.replaceState(undefined, '', location);
+                window.history.replaceState(undefined, "", location);
             }
             // TODO
             /*
@@ -281,7 +287,7 @@ define(["require", "exports", "tslib", "../../Dom/Traverse", "../../Dom/Util", "
          */
         selectFirstVisible() {
             let selectTab = null;
-            this.tabs.forEach(tab => {
+            this.tabs.forEach((tab) => {
                 if (!selectTab && !Util_1.default.isHidden(tab)) {
                     selectTab = tab;
                 }
@@ -323,7 +329,7 @@ define(["require", "exports", "tslib", "../../Dom/Traverse", "../../Dom/Util", "
             let name = tab.dataset.name || null;
             // handle legacy tab menus
             if (!name) {
-                if (tab.childElementCount === 1 && tab.children[0].nodeName === 'A') {
+                if (tab.childElementCount === 1 && tab.children[0].nodeName === "A") {
                     const link = tab.children[0];
                     if (link.href.match(/#([^#]+)$/)) {
                         name = RegExp.$1;
@@ -343,7 +349,7 @@ define(["require", "exports", "tslib", "../../Dom/Traverse", "../../Dom/Util", "
          * Returns the currently active tab.
          */
         getActiveTab() {
-            return document.querySelector('#' + this.container.id + ' > nav > ul > li.active');
+            return document.querySelector("#" + this.container.id + " > nav > ul > li.active");
         }
         /**
          * Returns the list of registered content containers.
@@ -361,9 +367,8 @@ define(["require", "exports", "tslib", "../../Dom/Traverse", "../../Dom/Util", "
             if (window.location.hash.match(/^#+([^\/]+)+(?:\/.+)?/)) {
                 return RegExp.$1;
             }
-            return '';
+            return "";
         }
-        ;
     }
     return TabMenuSimple;
 });
index 35edb88db67b06d04e34c1fab25c8e536f43ea1a..afc46912e377920d66bdfe5b6fddcbd352d15e29 100644 (file)
@@ -32,22 +32,22 @@ define(["require", "exports", "tslib", "../../Dom/Util"], function (require, exp
             if (element === null) {
                 throw new Error("Unable to find element by selector '" + elementSelector + "'.");
             }
-            const type = (element.nodeName === 'INPUT') ? element.type : '';
-            if (type !== 'checkbox' && type !== 'radio') {
+            const type = element.nodeName === "INPUT" ? element.type : "";
+            if (type !== "checkbox" && type !== "radio") {
                 throw new Error("Illegal element, expected input[type='checkbox'] or input[type='radio'].");
             }
             this.element = element;
-            this.hide = this.getElements('hide', Array.isArray(options.hide) ? options.hide : []);
-            this.hide = this.getElements('show', Array.isArray(options.show) ? options.show : []);
-            this.element.addEventListener('change', (ev) => this.change(ev));
+            this.hide = this.getElements("hide", Array.isArray(options.hide) ? options.hide : []);
+            this.hide = this.getElements("show", Array.isArray(options.show) ? options.show : []);
+            this.element.addEventListener("change", (ev) => this.change(ev));
             this.updateVisibility(this.show, this.element.checked);
             this.updateVisibility(this.hide, !this.element.checked);
         }
         getElements(type, items) {
             const elements = [];
-            items.forEach(item => {
+            items.forEach((item) => {
                 let element = null;
-                if (typeof item === 'string') {
+                if (typeof item === "string") {
                     element = document.querySelector(item);
                     if (element === null) {
                         throw new Error(`Unable to find an element with the selector '${item}'.`);
@@ -76,8 +76,8 @@ define(["require", "exports", "tslib", "../../Dom/Util"], function (require, exp
          * Loops through the target elements and shows / hides them.
          */
         updateVisibility(elements, showElement) {
-            elements.forEach(element => {
-                Util_1.default[showElement ? 'show' : 'hide'](element);
+            elements.forEach((element) => {
+                Util_1.default[showElement ? "show" : "hide"](element);
             });
         }
     }
index 4ab5e9568b4cffd6abc93c701be028a571523c2f..7c00da3f6c16636dfd139812d8671500d1a70e6a 100644 (file)
@@ -22,84 +22,84 @@ define(["require", "exports", "tslib", "../Dom/Change/Listener", "../Environment
     function mouseEnter(event) {
         const element = event.currentTarget;
         let title = element.title.trim();
-        if (title !== '') {
+        if (title !== "") {
             element.dataset.tooltip = title;
-            element.setAttribute('aria-label', title);
-            element.removeAttribute('title');
+            element.setAttribute("aria-label", title);
+            element.removeAttribute("title");
         }
-        title = element.dataset.tooltip || '';
+        title = element.dataset.tooltip || "";
         // reset tooltip position
-        _tooltip.style.removeProperty('top');
-        _tooltip.style.removeProperty('left');
+        _tooltip.style.removeProperty("top");
+        _tooltip.style.removeProperty("left");
         // ignore empty tooltip
         if (!title.length) {
-            _tooltip.classList.remove('active');
+            _tooltip.classList.remove("active");
             return;
         }
         else {
-            _tooltip.classList.add('active');
+            _tooltip.classList.add("active");
         }
         _text.textContent = title;
         UiAlignment.set(_tooltip, element, {
-            horizontal: 'center',
+            horizontal: "center",
             verticalOffset: 4,
             pointer: true,
-            pointerClassNames: ['inverse'],
-            vertical: 'top',
+            pointerClassNames: ["inverse"],
+            vertical: "top",
         });
     }
     /**
      * Hides the tooltip once the mouse leaves the element.
      */
     function mouseLeave() {
-        _tooltip.classList.remove('active');
+        _tooltip.classList.remove("active");
     }
     /**
      * Initializes the tooltip element and binds event listener.
      */
     function setup() {
-        if (Environment.platform() !== 'desktop') {
+        if (Environment.platform() !== "desktop") {
             return;
         }
-        _tooltip = document.createElement('div');
-        _tooltip.id = 'balloonTooltip';
-        _tooltip.classList.add('balloonTooltip');
-        _tooltip.addEventListener('transitionend', () => {
-            if (!_tooltip.classList.contains('active')) {
+        _tooltip = document.createElement("div");
+        _tooltip.id = "balloonTooltip";
+        _tooltip.classList.add("balloonTooltip");
+        _tooltip.addEventListener("transitionend", () => {
+            if (!_tooltip.classList.contains("active")) {
                 // reset back to the upper left corner, prevent it from staying outside
                 // the viewport if the body overflow was previously hidden
-                ['bottom', 'left', 'right', 'top'].forEach(property => {
+                ["bottom", "left", "right", "top"].forEach((property) => {
                     _tooltip.style.removeProperty(property);
                 });
             }
         });
-        _text = document.createElement('span');
-        _text.id = 'balloonTooltipText';
+        _text = document.createElement("span");
+        _text.id = "balloonTooltipText";
         _tooltip.appendChild(_text);
-        _pointer = document.createElement('span');
-        _pointer.classList.add('elementPointer');
-        _pointer.appendChild(document.createElement('span'));
+        _pointer = document.createElement("span");
+        _pointer.classList.add("elementPointer");
+        _pointer.appendChild(document.createElement("span"));
         _tooltip.appendChild(_pointer);
         document.body.appendChild(_tooltip);
         init();
-        Listener_1.default.add('WoltLabSuite/Core/Ui/Tooltip', init);
-        window.addEventListener('scroll', mouseLeave);
+        Listener_1.default.add("WoltLabSuite/Core/Ui/Tooltip", init);
+        window.addEventListener("scroll", mouseLeave);
     }
     exports.setup = setup;
     /**
      * Initializes tooltip elements.
      */
     function init() {
-        document.querySelectorAll('.jsTooltip').forEach((element) => {
-            element.classList.remove('jsTooltip');
+        document.querySelectorAll(".jsTooltip").forEach((element) => {
+            element.classList.remove("jsTooltip");
             const title = element.title.trim();
             if (title.length) {
                 element.dataset.tooltip = title;
-                element.removeAttribute('title');
-                element.setAttribute('aria-label', title);
-                element.addEventListener('mouseenter', mouseEnter);
-                element.addEventListener('mouseleave', mouseLeave);
-                element.addEventListener('click', mouseLeave);
+                element.removeAttribute("title");
+                element.setAttribute("aria-label", title);
+                element.addEventListener("mouseenter", mouseEnter);
+                element.addEventListener("mouseleave", mouseLeave);
+                element.addEventListener("click", mouseLeave);
             }
         });
     }
index 4bb60a6aa0a88d8fcc1617e2c972dd17c729a541..7b2af159e133e2fc98ff0abc8560d2f8ae471701 100644 (file)
@@ -19,14 +19,14 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ut
     UiNotification = tslib_1.__importStar(UiNotification);
     class UserEditor {
         constructor() {
-            this.actionName = '';
-            this.header = document.querySelector('.userProfileUser');
-            ['ban', 'disableAvatar', 'disableCoverPhoto', 'disableSignature', 'enable'].forEach(action => {
-                const button = document.querySelector('.userProfileButtonMenu .jsButtonUser' + StringUtil.ucfirst(action));
+            this.actionName = "";
+            this.header = document.querySelector(".userProfileUser");
+            ["ban", "disableAvatar", "disableCoverPhoto", "disableSignature", "enable"].forEach((action) => {
+                const button = document.querySelector(".userProfileButtonMenu .jsButtonUser" + StringUtil.ucfirst(action));
                 // The button is missing if the current user lacks the permission.
                 if (button) {
                     button.dataset.action = action;
-                    button.addEventListener('click', (ev) => this._click(ev));
+                    button.addEventListener("click", (ev) => this._click(ev));
                 }
             });
         }
@@ -36,34 +36,34 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ut
         _click(event) {
             event.preventDefault();
             const target = event.currentTarget;
-            const action = target.dataset.action || '';
-            let actionName = '';
+            const action = target.dataset.action || "";
+            let actionName = "";
             switch (action) {
-                case 'ban':
-                    if (Core.stringToBool(this.header.dataset.banned || '')) {
-                        actionName = 'unban';
+                case "ban":
+                    if (Core.stringToBool(this.header.dataset.banned || "")) {
+                        actionName = "unban";
                     }
                     break;
-                case 'disableAvatar':
-                    if (Core.stringToBool(this.header.dataset.disableAvatar || '')) {
-                        actionName = 'enableAvatar';
+                case "disableAvatar":
+                    if (Core.stringToBool(this.header.dataset.disableAvatar || "")) {
+                        actionName = "enableAvatar";
                     }
                     break;
-                case 'disableCoverPhoto':
-                    if (Core.stringToBool(this.header.dataset.disableCoverPhoto || '')) {
-                        actionName = 'enableCoverPhoto';
+                case "disableCoverPhoto":
+                    if (Core.stringToBool(this.header.dataset.disableCoverPhoto || "")) {
+                        actionName = "enableCoverPhoto";
                     }
                     break;
-                case 'disableSignature':
-                    if (Core.stringToBool(this.header.dataset.disableSignature || '')) {
-                        actionName = 'enableSignature';
+                case "disableSignature":
+                    if (Core.stringToBool(this.header.dataset.disableSignature || "")) {
+                        actionName = "enableSignature";
                     }
                     break;
-                case 'enable':
-                    actionName = (Core.stringToBool(this.header.dataset.isDisabled || '')) ? 'enable' : 'disable';
+                case "enable":
+                    actionName = Core.stringToBool(this.header.dataset.isDisabled || "") ? "enable" : "disable";
                     break;
             }
-            if (actionName === '') {
+            if (actionName === "") {
                 this.actionName = action;
                 Dialog_1.default.open(this);
             }
@@ -78,22 +78,22 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ut
          */
         _submit(event) {
             event.preventDefault();
-            const label = document.getElementById('wcfUiUserEditorExpiresLabel');
-            let expires = '';
-            let errorMessage = '';
-            const neverExpires = document.getElementById('wcfUiUserEditorNeverExpires');
+            const label = document.getElementById("wcfUiUserEditorExpiresLabel");
+            let expires = "";
+            let errorMessage = "";
+            const neverExpires = document.getElementById("wcfUiUserEditorNeverExpires");
             if (!neverExpires.checked) {
-                const expireValue = document.getElementById('wcfUiUserEditorExpiresDatePicker');
+                const expireValue = document.getElementById("wcfUiUserEditorExpiresDatePicker");
                 expires = expireValue.value;
-                if (expires === '') {
-                    errorMessage = Language.get('wcf.global.form.error.empty');
+                if (expires === "") {
+                    errorMessage = Language.get("wcf.global.form.error.empty");
                 }
             }
             Util_1.default.innerError(label, errorMessage);
             const parameters = {};
-            parameters[this.actionName + 'Expires'] = expires;
-            const reason = document.getElementById('wcfUiUserEditorReason');
-            parameters[this.actionName + 'Reason'] = reason.value.trim();
+            parameters[this.actionName + "Expires"] = expires;
+            const reason = document.getElementById("wcfUiUserEditorReason");
+            parameters[this.actionName + "Reason"] = reason.value.trim();
             Ajax.api(this, {
                 actionName: this.actionName,
                 parameters: parameters,
@@ -102,16 +102,16 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ut
         _ajaxSuccess(data) {
             let button;
             switch (data.actionName) {
-                case 'ban':
-                case 'unban':
-                    this.header.dataset.banned = (data.actionName === 'ban') ? 'true' : 'false';
-                    button = document.querySelector('.userProfileButtonMenu .jsButtonUserBan');
-                    button.textContent = Language.get('wcf.user.' + (data.actionName === 'ban' ? 'unban' : 'ban'));
-                    const contentTitle = this.header.querySelector('.contentTitle');
-                    let banIcon = contentTitle.querySelector('.jsUserBanned');
-                    if (data.actionName === 'ban') {
-                        banIcon = document.createElement('span');
-                        banIcon.className = 'icon icon24 fa-lock jsUserBanned jsTooltip';
+                case "ban":
+                case "unban":
+                    this.header.dataset.banned = data.actionName === "ban" ? "true" : "false";
+                    button = document.querySelector(".userProfileButtonMenu .jsButtonUserBan");
+                    button.textContent = Language.get("wcf.user." + (data.actionName === "ban" ? "unban" : "ban"));
+                    const contentTitle = this.header.querySelector(".contentTitle");
+                    let banIcon = contentTitle.querySelector(".jsUserBanned");
+                    if (data.actionName === "ban") {
+                        banIcon = document.createElement("span");
+                        banIcon.className = "icon icon24 fa-lock jsUserBanned jsTooltip";
                         banIcon.title = data.returnValues;
                         contentTitle.appendChild(banIcon);
                     }
@@ -119,32 +119,32 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ut
                         banIcon.remove();
                     }
                     break;
-                case 'disableAvatar':
-                case 'enableAvatar':
-                    this.header.dataset.disableAvatar = (data.actionName === 'disableAvatar') ? 'true' : 'false';
-                    button = document.querySelector('.userProfileButtonMenu .jsButtonUserDisableAvatar');
-                    button.textContent = Language.get('wcf.user.' + (data.actionName === 'disableAvatar' ? 'enable' : 'disable') + 'Avatar');
+                case "disableAvatar":
+                case "enableAvatar":
+                    this.header.dataset.disableAvatar = data.actionName === "disableAvatar" ? "true" : "false";
+                    button = document.querySelector(".userProfileButtonMenu .jsButtonUserDisableAvatar");
+                    button.textContent = Language.get("wcf.user." + (data.actionName === "disableAvatar" ? "enable" : "disable") + "Avatar");
                     break;
-                case 'disableCoverPhoto':
-                case 'enableCoverPhoto':
-                    this.header.dataset.disableCoverPhoto = (data.actionName === 'disableCoverPhoto') ? 'true' : 'false';
-                    button = document.querySelector('.userProfileButtonMenu .jsButtonUserDisableCoverPhoto');
-                    button.textContent = Language.get('wcf.user.' + (data.actionName === 'disableCoverPhoto' ? 'enable' : 'disable') + 'CoverPhoto');
+                case "disableCoverPhoto":
+                case "enableCoverPhoto":
+                    this.header.dataset.disableCoverPhoto = data.actionName === "disableCoverPhoto" ? "true" : "false";
+                    button = document.querySelector(".userProfileButtonMenu .jsButtonUserDisableCoverPhoto");
+                    button.textContent = Language.get("wcf.user." + (data.actionName === "disableCoverPhoto" ? "enable" : "disable") + "CoverPhoto");
                     break;
-                case 'disableSignature':
-                case 'enableSignature':
-                    this.header.dataset.disableSignature = (data.actionName === 'disableSignature') ? 'true' : 'false';
-                    button = document.querySelector('.userProfileButtonMenu .jsButtonUserDisableSignature');
-                    button.textContent = Language.get('wcf.user.' + (data.actionName === 'disableSignature' ? 'enable' : 'disable') + 'Signature');
+                case "disableSignature":
+                case "enableSignature":
+                    this.header.dataset.disableSignature = data.actionName === "disableSignature" ? "true" : "false";
+                    button = document.querySelector(".userProfileButtonMenu .jsButtonUserDisableSignature");
+                    button.textContent = Language.get("wcf.user." + (data.actionName === "disableSignature" ? "enable" : "disable") + "Signature");
                     break;
-                case 'enable':
-                case 'disable':
-                    this.header.dataset.isDisabled = (data.actionName === 'disable') ? 'true' : 'false';
-                    button = document.querySelector('.userProfileButtonMenu .jsButtonUserEnable');
-                    button.textContent = Language.get('wcf.acp.user.' + (data.actionName === 'enable' ? 'disable' : 'enable'));
+                case "enable":
+                case "disable":
+                    this.header.dataset.isDisabled = data.actionName === "disable" ? "true" : "false";
+                    button = document.querySelector(".userProfileButtonMenu .jsButtonUserEnable");
+                    button.textContent = Language.get("wcf.acp.user." + (data.actionName === "enable" ? "disable" : "enable"));
                     break;
             }
-            if (['ban', 'disableAvatar', 'disableCoverPhoto', 'disableSignature'].indexOf(data.actionName) !== -1) {
+            if (["ban", "disableAvatar", "disableCoverPhoto", "disableSignature"].indexOf(data.actionName) !== -1) {
                 Dialog_1.default.close(this);
             }
             UiNotification.show();
@@ -152,42 +152,42 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ut
         _ajaxSetup() {
             return {
                 data: {
-                    className: 'wcf\\data\\user\\UserAction',
+                    className: "wcf\\data\\user\\UserAction",
                     objectIDs: [+this.header.dataset.objectId],
                 },
             };
         }
         _dialogSetup() {
             return {
-                id: 'wcfUiUserEditor',
+                id: "wcfUiUserEditor",
                 options: {
-                    onSetup: content => {
-                        const checkbox = document.getElementById('wcfUiUserEditorNeverExpires');
-                        checkbox.addEventListener('change', () => {
-                            const settings = document.getElementById('wcfUiUserEditorExpiresSettings');
-                            Util_1.default[checkbox.checked ? 'hide' : 'show'](settings);
+                    onSetup: (content) => {
+                        const checkbox = document.getElementById("wcfUiUserEditorNeverExpires");
+                        checkbox.addEventListener("change", () => {
+                            const settings = document.getElementById("wcfUiUserEditorExpiresSettings");
+                            Util_1.default[checkbox.checked ? "hide" : "show"](settings);
                         });
-                        const submitButton = content.querySelector('button.buttonPrimary');
-                        submitButton.addEventListener('click', this._submit.bind(this));
+                        const submitButton = content.querySelector("button.buttonPrimary");
+                        submitButton.addEventListener("click", this._submit.bind(this));
                     },
-                    onShow: content => {
-                        Dialog_1.default.setTitle('wcfUiUserEditor', Language.get('wcf.user.' + this.actionName + '.confirmMessage'));
-                        const reason = document.getElementById('wcfUiUserEditorReason');
+                    onShow: (content) => {
+                        Dialog_1.default.setTitle("wcfUiUserEditor", Language.get("wcf.user." + this.actionName + ".confirmMessage"));
+                        const reason = document.getElementById("wcfUiUserEditorReason");
                         let label = reason.nextElementSibling;
-                        const phrase = 'wcf.user.' + this.actionName + '.reason.description';
+                        const phrase = "wcf.user." + this.actionName + ".reason.description";
                         label.textContent = Language.get(phrase);
-                        window[(label.textContent === phrase) ? 'elHide' : 'elShow'](label);
-                        label = document.getElementById('wcfUiUserEditorNeverExpires').nextElementSibling;
-                        label.textContent = Language.get('wcf.user.' + this.actionName + '.neverExpires');
+                        window[label.textContent === phrase ? "elHide" : "elShow"](label);
+                        label = document.getElementById("wcfUiUserEditorNeverExpires").nextElementSibling;
+                        label.textContent = Language.get("wcf.user." + this.actionName + ".neverExpires");
                         label = content.querySelector('label[for="wcfUiUserEditorExpires"]');
-                        label.textContent = Language.get('wcf.user.' + this.actionName + '.expires');
-                        label = document.getElementById('wcfUiUserEditorExpiresLabel');
-                        label.textContent = Language.get('wcf.user.' + this.actionName + '.expires.description');
+                        label.textContent = Language.get("wcf.user." + this.actionName + ".expires");
+                        label = document.getElementById("wcfUiUserEditorExpiresLabel");
+                        label.textContent = Language.get("wcf.user." + this.actionName + ".expires.description");
                     },
                 },
                 source: `<div class="section">
         <dl>
-          <dt><label for="wcfUiUserEditorReason">${Language.get('wcf.global.reason')}</label></dt>
+          <dt><label for="wcfUiUserEditorReason">${Language.get("wcf.global.reason")}</label></dt>
           <dd><textarea id="wcfUiUserEditorReason" cols="40" rows="3"></textarea><small></small></dd>
         </dl>
         <dl>
@@ -203,7 +203,7 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ut
         </dl>
       </div>
       <div class="formSubmit">
-        <button class="buttonPrimary">${Language.get('wcf.global.button.submit')}</button>
+        <button class="buttonPrimary">${Language.get("wcf.global.button.submit")}</button>
       </div>`,
             };
         }
index f1131cf3fd3755e4b4450b1132296e2b5790cad4..4cc447b37903bcbba8590e87bf932bff2bf5c769 100644 (file)
@@ -11,7 +11,7 @@ define(["require", "exports", "tslib", "../../Dom/Change/Listener"], function (r
     Object.defineProperty(exports, "__esModule", { value: true });
     exports.init = void 0;
     Listener_1 = tslib_1.__importDefault(Listener_1);
-    const _availableMessages = document.getElementsByClassName('ignoredUserMessage');
+    const _availableMessages = document.getElementsByClassName("ignoredUserMessage");
     const _knownMessages = new Set();
     /**
      * Adds ignored messages to the collection.
@@ -22,7 +22,7 @@ define(["require", "exports", "tslib", "../../Dom/Change/Listener"], function (r
         for (let i = 0, length = _availableMessages.length; i < length; i++) {
             const message = _availableMessages[i];
             if (!_knownMessages.has(message)) {
-                message.addEventListener('click', showMessage, { once: true });
+                message.addEventListener("click", showMessage, { once: true });
                 _knownMessages.add(message);
             }
         }
@@ -33,7 +33,7 @@ define(["require", "exports", "tslib", "../../Dom/Change/Listener"], function (r
     function showMessage(event) {
         event.preventDefault();
         const message = event.currentTarget;
-        message.classList.remove('ignoredUserMessage');
+        message.classList.remove("ignoredUserMessage");
         _knownMessages.delete(message);
         // Firefox selects the entire message on click for no reason
         window.getSelection().removeAllRanges();
@@ -44,7 +44,7 @@ define(["require", "exports", "tslib", "../../Dom/Change/Listener"], function (r
      */
     function init() {
         rebuild();
-        Listener_1.default.add('WoltLabSuite/Core/Ui/User/Ignore', rebuild);
+        Listener_1.default.add("WoltLabSuite/Core/Ui/User/Ignore", rebuild);
     }
     exports.init = init;
 });
index 815539e6ef89070958fe691ca2fb83581321a5df..2c77cfd307e7dc5e5f32d0a317f29458ca9ae4f7 100644 (file)
@@ -27,8 +27,8 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ut
             this.pageCount = 0;
             this.pageNo = 1;
             this.options = Core.extend({
-                className: '',
-                dialogTitle: '',
+                className: "",
+                dialogTitle: "",
                 parameters: {},
             }, options);
         }
@@ -43,7 +43,7 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ut
          * Shows the current or given page.
          */
         showPage(pageNo) {
-            if (typeof pageNo === 'number') {
+            if (typeof pageNo === "number") {
                 this.pageNo = +pageNo;
             }
             if (this.pageCount !== 0 && (this.pageNo < 1 || this.pageNo > this.pageCount)) {
@@ -52,7 +52,7 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ut
             if (this.cache.has(this.pageNo)) {
                 const dialog = Dialog_1.default.open(this, this.cache.get(this.pageNo));
                 if (this.pageCount > 1) {
-                    const element = dialog.content.querySelector('.jsPagination');
+                    const element = dialog.content.querySelector(".jsPagination");
                     if (element !== null) {
                         new Pagination_1.default(element, {
                             activePage: this.pageNo,
@@ -84,9 +84,9 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Dom/Ut
         _ajaxSetup() {
             return {
                 data: {
-                    actionName: 'getGroupedUserList',
+                    actionName: "getGroupedUserList",
                     className: this.options.className,
-                    interfaceName: 'wcf\\data\\IGroupedUserListAction',
+                    interfaceName: "wcf\\data\\IGroupedUserListAction",
                 },
             };
         }
index d01713b7bdfa5369b1971ef6e7c266e0aea34f69..e4856b17cf500e2cbf064cc3722f4f1db34ac813 100644 (file)
@@ -13,13 +13,13 @@ define(["require", "exports", "tslib", "../../../Core", "../../Search/Input"], f
     Input_1 = tslib_1.__importDefault(Input_1);
     class UiUserSearchInput extends Input_1.default {
         constructor(element, options) {
-            const includeUserGroups = (Core.isPlainObject(options) && options.includeUserGroups === true);
+            const includeUserGroups = Core.isPlainObject(options) && options.includeUserGroups === true;
             options = Core.extend({
                 ajax: {
-                    className: 'wcf\\data\\user\\UserAction',
+                    className: "wcf\\data\\user\\UserAction",
                     parameters: {
                         data: {
-                            includeUserGroups: (includeUserGroups ? 1 : 0),
+                            includeUserGroups: includeUserGroups ? 1 : 0,
                         },
                     },
                 },
@@ -29,9 +29,9 @@ define(["require", "exports", "tslib", "../../../Core", "../../Search/Input"], f
         createListItem(item) {
             const listItem = super.createListItem(item);
             listItem.dataset.type = item.type;
-            const box = document.createElement('div');
-            box.className = 'box16';
-            box.innerHTML = (item.type === 'group') ? '<span class="icon icon16 fa-users"></span>' : item.icon;
+            const box = document.createElement("div");
+            box.className = "box16";
+            box.innerHTML = item.type === "group" ? '<span class="icon icon16 fa-users"></span>' : item.icon;
             box.appendChild(listItem.children[0]);
             listItem.appendChild(box);
             return listItem;
index 70d4eae019facedcfafda8173c76859bf069c27b..54694be12873e458c3a9e86ba866415dff6ac023 100644 (file)
@@ -37,16 +37,16 @@ define(["require", "exports", "tslib", "../../../Ajax", "../../../Dom/Change/Lis
             this.currentPageNo = 0;
             this.currentUser = 0;
             this.knownElements = new WeakSet();
-            Listener_1.default.add('WoltLabSuite/Core/Ui/User/Trophy/List', this.rebuild.bind(this));
+            Listener_1.default.add("WoltLabSuite/Core/Ui/User/Trophy/List", this.rebuild.bind(this));
             this.rebuild();
         }
         /**
          * Adds event userTrophyOverlayList elements.
          */
         rebuild() {
-            document.querySelectorAll('.userTrophyOverlayList').forEach((element) => {
+            document.querySelectorAll(".userTrophyOverlayList").forEach((element) => {
                 if (!this.knownElements.has(element)) {
-                    element.addEventListener('click', (ev) => this.open(element, ev));
+                    element.addEventListener("click", (ev) => this.open(element, ev));
                     this.knownElements.add(element);
                 }
             });
@@ -76,9 +76,9 @@ define(["require", "exports", "tslib", "../../../Ajax", "../../../Dom/Change/Lis
             }
             if (data && data.has(this.currentPageNo)) {
                 const dialog = Dialog_1.default.open(this, data.get(this.currentPageNo));
-                Dialog_1.default.setTitle('userTrophyListOverlay', data.title);
+                Dialog_1.default.setTitle("userTrophyListOverlay", data.title);
                 if (data.pageCount > 1) {
-                    const element = dialog.content.querySelector('.jsPagination');
+                    const element = dialog.content.querySelector(".jsPagination");
                     if (element !== null) {
                         new Pagination_1.default(element, {
                             activePage: this.currentPageNo,
@@ -112,14 +112,14 @@ define(["require", "exports", "tslib", "../../../Ajax", "../../../Dom/Change/Lis
         _ajaxSetup() {
             return {
                 data: {
-                    actionName: 'getGroupedUserTrophyList',
-                    className: 'wcf\\data\\user\\trophy\\UserTrophyAction',
+                    actionName: "getGroupedUserTrophyList",
+                    className: "wcf\\data\\user\\trophy\\UserTrophyAction",
                 },
             };
         }
         _dialogSetup() {
             return {
-                id: 'userTrophyListOverlay',
+                id: "userTrophyListOverlay",
                 options: {
                     title: "",
                 },
index 9d9926326b6b3bd39572ce91651c00c9b58a292e..06164d03696b47d164c4053a0b8a9956c6cd5a4c 100644 (file)
@@ -30,7 +30,7 @@ define(["require", "exports"], function (require, exports) {
          */
         init(userId, username, link) {
             if (user) {
-                throw new Error('User has already been initialized.');
+                throw new Error("User has already been initialized.");
             }
             user = new User(userId, username, link);
         },
index d9da0e17d3f4d9dc0ba596909c528189c623b954..9fd70636f45f2cb17ffe4da07fe56497c1eb54e7 100644 (file)
@@ -8,8 +8,8 @@
  * @module  WoltLabSuite/Core/Ajax
  */
 
-import AjaxRequest from './Ajax/Request';
-import { AjaxCallbackObject, CallbackSuccess, CallbackFailure, RequestData, RequestOptions } from './Ajax/Data';
+import AjaxRequest from "./Ajax/Request";
+import { AjaxCallbackObject, CallbackSuccess, CallbackFailure, RequestData, RequestOptions } from "./Ajax/Data";
 
 const _cache = new WeakMap();
 
@@ -17,12 +17,17 @@ const _cache = new WeakMap();
  * Shorthand function to perform a request against the WCF-API with overrides
  * for success and failure callbacks.
  */
-export function api(callbackObject: AjaxCallbackObject, data?: RequestData, success?: CallbackSuccess, failure?: CallbackFailure): AjaxRequest {
-  if (typeof data !== 'object') data = {};
+export function api(
+  callbackObject: AjaxCallbackObject,
+  data?: RequestData,
+  success?: CallbackSuccess,
+  failure?: CallbackFailure
+): AjaxRequest {
+  if (typeof data !== "object") data = {};
 
   let request = _cache.get(callbackObject);
   if (request === undefined) {
-    if (typeof callbackObject._ajaxSetup !== 'function') {
+    if (typeof callbackObject._ajaxSetup !== "function") {
       throw new TypeError("Callback object must implement at least _ajaxSetup().");
     }
 
@@ -32,7 +37,7 @@ export function api(callbackObject: AjaxCallbackObject, data?: RequestData, succ
     options.callbackObject = callbackObject;
 
     if (!options.url) {
-      options.url = 'index.php?ajax-proxy/&t=' + window.SECURITY_TOKEN;
+      options.url = "index.php?ajax-proxy/&t=" + window.SECURITY_TOKEN;
       options.withCredentials = true;
     }
 
@@ -44,21 +49,21 @@ export function api(callbackObject: AjaxCallbackObject, data?: RequestData, succ
   let oldSuccess = null;
   let oldFailure = null;
 
-  if (typeof success === 'function') {
-    oldSuccess = request.getOption('success');
-    request.setOption('success', success);
+  if (typeof success === "function") {
+    oldSuccess = request.getOption("success");
+    request.setOption("success", success);
   }
-  if (typeof failure === 'function') {
-    oldFailure = request.getOption('failure');
-    request.setOption('failure', failure);
+  if (typeof failure === "function") {
+    oldFailure = request.getOption("failure");
+    request.setOption("failure", failure);
   }
 
   request.setData(data);
   request.sendRequest();
 
   // restore callbacks
-  if (oldSuccess !== null) request.setOption('success', oldSuccess);
-  if (oldFailure !== null) request.setOption('failure', oldFailure);
+  if (oldSuccess !== null) request.setOption("success", oldSuccess);
+  if (oldFailure !== null) request.setOption("failure", oldFailure);
 
   return request;
 }
@@ -73,7 +78,7 @@ export function apiOnce(options: RequestOptions): void {
   options.pinData = false;
   options.callbackObject = null;
   if (!options.url) {
-    options.url = 'index.php?ajax-proxy/&t=' + window.SECURITY_TOKEN;
+    options.url = "index.php?ajax-proxy/&t=" + window.SECURITY_TOKEN;
     options.withCredentials = true;
   }
 
@@ -86,7 +91,7 @@ export function apiOnce(options: RequestOptions): void {
  */
 export function getRequestObject(callbackObject: AjaxCallbackObject): AjaxRequest {
   if (!_cache.has(callbackObject)) {
-    throw new Error('Expected a previously used callback object, provided object is unknown.');
+    throw new Error("Expected a previously used callback object, provided object is unknown.");
   }
 
   return _cache.get(callbackObject);
index e114b36ad1b3c0d58522fc74e76c2601138e2503..05e717b84f8e00bd11bf53ecfcef1d7f37c875f1 100644 (file)
@@ -12,7 +12,6 @@ export interface DatabaseObjectActionPayload extends RequestPayload {
   };
 }
 
-
 export type RequestData = FormData | RequestPayload | DatabaseObjectActionPayload;
 
 export interface ResponseData {
@@ -22,15 +21,27 @@ export interface ResponseData {
 export interface DatabaseObjectActionResponse extends ResponseData {
   actionName: string;
   objectIDs: number[];
-  returnValues: {
-    [key: string]: any;
-  } | any[];
+  returnValues:
+    | {
+        [key: string]: any;
+      }
+    | any[];
 }
 
-export type CallbackFailure = (data: ResponseData, responseText: string, xhr: XMLHttpRequest, requestData: RequestData) => boolean;
+export type CallbackFailure = (
+  data: ResponseData,
+  responseText: string,
+  xhr: XMLHttpRequest,
+  requestData: RequestData
+) => boolean;
 export type CallbackFinalize = (xhr: XMLHttpRequest) => void;
 export type CallbackProgress = (event: ProgressEvent) => void;
-export type CallbackSuccess = (data: ResponseData | DatabaseObjectActionResponse, responseText: string, xhr: XMLHttpRequest, requestData: RequestData) => void;
+export type CallbackSuccess = (
+  data: ResponseData | DatabaseObjectActionResponse,
+  responseText: string,
+  xhr: XMLHttpRequest,
+  requestData: RequestData
+) => void;
 export type CallbackUploadProgress = (event: ProgressEvent) => void;
 export type CallbackSetup = () => RequestOptions;
 
@@ -45,26 +56,26 @@ export interface AjaxCallbackObject {
 
 export interface RequestOptions {
   // request data
-  data?: RequestData,
-  contentType?: string,
-  responseType?: string,
-  type?: string,
-  url?: string,
-  withCredentials?: boolean,
+  data?: RequestData;
+  contentType?: string;
+  responseType?: string;
+  type?: string;
+  url?: string;
+  withCredentials?: boolean;
 
   // behavior
-  autoAbort?: boolean,
-  ignoreError?: boolean,
-  pinData?: boolean,
-  silent?: boolean,
-  includeRequestedWith?: boolean,
+  autoAbort?: boolean;
+  ignoreError?: boolean;
+  pinData?: boolean;
+  silent?: boolean;
+  includeRequestedWith?: boolean;
 
   // callbacks
-  failure?: CallbackFailure,
-  finalize?: CallbackFinalize,
-  success?: CallbackSuccess,
-  progress?: CallbackProgress,
-  uploadProgress?: CallbackUploadProgress,
+  failure?: CallbackFailure;
+  finalize?: CallbackFinalize;
+  success?: CallbackSuccess;
+  progress?: CallbackProgress;
+  uploadProgress?: CallbackUploadProgress;
 
-  callbackObject?: AjaxCallbackObject | null,
+  callbackObject?: AjaxCallbackObject | null;
 }
index 35bdce673f75cf6967cd2919945f9f09295b736b..6d5dc83b760f22f20cd801968c20f836a35dfe9b 100644 (file)
@@ -8,31 +8,39 @@
  * @module  WoltLabSuite/Core/Ajax/Jsonp
  */
 
-import * as Core from '../Core';
+import * as Core from "../Core";
 
 /**
  * Dispatch a JSONP request, the `url` must not contain a callback parameter.
  */
-export function send(url: string, success: (...args: unknown[]) => void, failure: () => void, options?: JsonpOptions): void {
-  url = (typeof (url as any) === 'string') ? url.trim() : '';
+export function send(
+  url: string,
+  success: (...args: unknown[]) => void,
+  failure: () => void,
+  options?: JsonpOptions
+): void {
+  url = typeof (url as any) === "string" ? url.trim() : "";
   if (url.length === 0) {
-    throw new Error('Expected a non-empty string for parameter \'url\'.');
+    throw new Error("Expected a non-empty string for parameter 'url'.");
   }
 
-  if (typeof success !== 'function') {
-    throw new TypeError('Expected a valid callback function for parameter \'success\'.');
+  if (typeof success !== "function") {
+    throw new TypeError("Expected a valid callback function for parameter 'success'.");
   }
 
-  options = Core.extend({
-    parameterName: 'callback',
-    timeout: 10,
-  }, options || {}) as JsonpOptions;
+  options = Core.extend(
+    {
+      parameterName: "callback",
+      timeout: 10,
+    },
+    options || {}
+  ) as JsonpOptions;
 
-  const callbackName = 'wcf_jsonp_' + Core.getUuid().replace(/-/g, '').substr(0, 8);
+  const callbackName = "wcf_jsonp_" + Core.getUuid().replace(/-/g, "").substr(0, 8);
   let script;
 
   const timeout = window.setTimeout(() => {
-    if (typeof failure === 'function') {
+    if (typeof failure === "function") {
       failure();
     }
 
@@ -49,10 +57,10 @@ export function send(url: string, success: (...args: unknown[]) => void, failure
     script.remove();
   };
 
-  url += (url.indexOf('?') === -1) ? '?' : '&';
-  url += options.parameterName + '=' + callbackName;
+  url += url.indexOf("?") === -1 ? "?" : "&";
+  url += options.parameterName + "=" + callbackName;
 
-  script = document.createElement('script');
+  script = document.createElement("script");
   script.async = true;
   script.src = url;
 
index 536795e35ae1182a127206ca91e737477de67d4f..70ae46425e7917e2e4bb31e32791a91e062c6be0 100644 (file)
  * @module  WoltLabSuite/Core/Ajax/Request
  */
 
-import * as AjaxStatus from './Status';
-import { ResponseData, RequestOptions, RequestData } from './Data';
-import * as Core from '../Core';
-import DomChangeListener from '../Dom/Change/Listener';
-import DomUtil from '../Dom/Util';
-import * as Language from '../Language';
+import * as AjaxStatus from "./Status";
+import { ResponseData, RequestOptions, RequestData } from "./Data";
+import * as Core from "../Core";
+import DomChangeListener from "../Dom/Change/Listener";
+import DomUtil from "../Dom/Util";
+import * as Language from "../Language";
 
 let _didInit = false;
 let _ignoreAllErrors = false;
@@ -30,37 +30,40 @@ class AjaxRequest {
   private _xhr?: XMLHttpRequest;
 
   constructor(options: RequestOptions) {
-    this._options = Core.extend({
-      data: {},
-      contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
-      responseType: 'application/json',
-      type: 'POST',
-      url: '',
-      withCredentials: false,
-
-      // behavior
-      autoAbort: false,
-      ignoreError: false,
-      pinData: false,
-      silent: false,
-      includeRequestedWith: true,
-
-      // callbacks
-      failure: null,
-      finalize: null,
-      success: null,
-      progress: null,
-      uploadProgress: null,
-
-      callbackObject: null,
-    }, options);
-
-    if (typeof options.callbackObject === 'object') {
+    this._options = Core.extend(
+      {
+        data: {},
+        contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+        responseType: "application/json",
+        type: "POST",
+        url: "",
+        withCredentials: false,
+
+        // behavior
+        autoAbort: false,
+        ignoreError: false,
+        pinData: false,
+        silent: false,
+        includeRequestedWith: true,
+
+        // callbacks
+        failure: null,
+        finalize: null,
+        success: null,
+        progress: null,
+        uploadProgress: null,
+
+        callbackObject: null,
+      },
+      options
+    );
+
+    if (typeof options.callbackObject === "object") {
       this._options.callbackObject = options.callbackObject;
     }
 
     this._options.url = Core.convertLegacyUrl(this._options.url!);
-    if (this._options.url.indexOf('index.php') === 0) {
+    if (this._options.url.indexOf("index.php") === 0) {
       this._options.url = window.WSC_API_URL + this._options.url;
     }
 
@@ -75,17 +78,24 @@ class AjaxRequest {
     }
 
     if (this._options.callbackObject) {
-      if (typeof this._options.callbackObject._ajaxFailure === 'function') this._options.failure = this._options.callbackObject._ajaxFailure.bind(this._options.callbackObject);
-      if (typeof this._options.callbackObject._ajaxFinalize === 'function') this._options.finalize = this._options.callbackObject._ajaxFinalize.bind(this._options.callbackObject);
-      if (typeof this._options.callbackObject._ajaxSuccess === 'function') this._options.success = this._options.callbackObject._ajaxSuccess.bind(this._options.callbackObject);
-      if (typeof this._options.callbackObject._ajaxProgress === 'function') this._options.progress = this._options.callbackObject._ajaxProgress.bind(this._options.callbackObject);
-      if (typeof this._options.callbackObject._ajaxUploadProgress === 'function') this._options.uploadProgress = this._options.callbackObject._ajaxUploadProgress.bind(this._options.callbackObject);
+      if (typeof this._options.callbackObject._ajaxFailure === "function")
+        this._options.failure = this._options.callbackObject._ajaxFailure.bind(this._options.callbackObject);
+      if (typeof this._options.callbackObject._ajaxFinalize === "function")
+        this._options.finalize = this._options.callbackObject._ajaxFinalize.bind(this._options.callbackObject);
+      if (typeof this._options.callbackObject._ajaxSuccess === "function")
+        this._options.success = this._options.callbackObject._ajaxSuccess.bind(this._options.callbackObject);
+      if (typeof this._options.callbackObject._ajaxProgress === "function")
+        this._options.progress = this._options.callbackObject._ajaxProgress.bind(this._options.callbackObject);
+      if (typeof this._options.callbackObject._ajaxUploadProgress === "function")
+        this._options.uploadProgress = this._options.callbackObject._ajaxUploadProgress.bind(
+          this._options.callbackObject
+        );
     }
 
     if (!_didInit) {
       _didInit = true;
 
-      window.addEventListener('beforeunload', () => _ignoreAllErrors = true);
+      window.addEventListener("beforeunload", () => (_ignoreAllErrors = true));
     }
   }
 
@@ -108,10 +118,10 @@ class AjaxRequest {
     this._xhr = new XMLHttpRequest();
     this._xhr.open(this._options.type!, this._options.url!, true);
     if (this._options.contentType) {
-      this._xhr.setRequestHeader('Content-Type', this._options.contentType);
+      this._xhr.setRequestHeader("Content-Type", this._options.contentType);
     }
     if (this._options.withCredentials || this._options.includeRequestedWith) {
-      this._xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
+      this._xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
     }
     if (this._options.withCredentials) {
       this._xhr.withCredentials = true;
@@ -121,8 +131,8 @@ class AjaxRequest {
     const options = Core.clone(this._options) as RequestOptions;
     this._xhr.onload = function () {
       if (this.readyState === XMLHttpRequest.DONE) {
-        if (this.status >= 200 && this.status < 300 || this.status === 304) {
-          if (options.responseType && this.getResponseHeader('Content-Type')!.indexOf(options.responseType) !== 0) {
+        if ((this.status >= 200 && this.status < 300) || this.status === 304) {
+          if (options.responseType && this.getResponseHeader("Content-Type")!.indexOf(options.responseType) !== 0) {
             // request succeeded but invalid response type
             self._failure(this, options);
           } else {
@@ -144,9 +154,9 @@ class AjaxRequest {
       this._xhr.upload.onprogress = this._options.uploadProgress;
     }
 
-    if (this._options.type === 'POST') {
+    if (this._options.type === "POST") {
       let data: string | RequestData = this._options.data!;
-      if (typeof data === 'object' && Core.getType(data) !== 'FormData') {
+      if (typeof data === "object" && Core.getType(data) !== "FormData") {
         data = Core.serialize(data);
       }
 
@@ -194,7 +204,7 @@ class AjaxRequest {
    * Sets request data while honoring pinned data from setup callback.
    */
   setData(data: RequestData): void {
-    if (this._data !== null && Core.getType(data) !== 'FormData') {
+    if (this._data !== null && Core.getType(data) !== "FormData") {
       data = Core.extend(this._data, data);
     }
 
@@ -209,9 +219,9 @@ class AjaxRequest {
       AjaxStatus.hide();
     }
 
-    if (typeof options.success === 'function') {
+    if (typeof options.success === "function") {
       let data: ResponseData | null = null;
-      if (xhr.getResponseHeader('Content-Type')!.split(';', 1)[0].trim() === 'application/json') {
+      if (xhr.getResponseHeader("Content-Type")!.split(";", 1)[0].trim() === "application/json") {
         try {
           data = JSON.parse(xhr.responseText) as ResponseData;
         } catch (e) {
@@ -228,7 +238,7 @@ class AjaxRequest {
 
         // force-invoke the background queue
         if (data && data.forceBackgroundQueuePerform) {
-          import('../BackgroundQueue').then(backgroundQueue => backgroundQueue.invoke());
+          import("../BackgroundQueue").then((backgroundQueue) => backgroundQueue.invoke());
         }
       }
 
@@ -254,21 +264,20 @@ class AjaxRequest {
     let data: ResponseData | null = null;
     try {
       data = JSON.parse(xhr.responseText);
-    } catch (e) {
-    }
+    } catch (e) {}
 
     let showError = true;
-    if (typeof options.failure === 'function') {
-      showError = options.failure((data || {}), (xhr.responseText || ''), xhr, options.data!);
+    if (typeof options.failure === "function") {
+      showError = options.failure(data || {}, xhr.responseText || "", xhr, options.data!);
     }
 
     if (options.ignoreError !== true && showError) {
       const html = this.getErrorHtml(data, xhr);
 
       if (html) {
-        import('../Ui/Dialog').then(UiDialog => {
+        import("../Ui/Dialog").then((UiDialog) => {
           UiDialog.openStatic(DomUtil.getUniqueId(), html, {
-            title: Language.get('wcf.global.error.title'),
+            title: Language.get("wcf.global.error.title"),
           });
         });
       }
@@ -281,38 +290,38 @@ class AjaxRequest {
    * Returns the inner HTML for an error/exception display.
    */
   getErrorHtml(data: ResponseData | null, xhr: XMLHttpRequest): string | null {
-    let details = '';
+    let details = "";
     let message: string;
 
     if (data !== null) {
       if (data.returnValues && data.returnValues.description) {
-        details += '<br><p>Description:</p><p>' + data.returnValues.description + '</p>';
+        details += "<br><p>Description:</p><p>" + data.returnValues.description + "</p>";
       }
 
       if (data.file && data.line) {
-        details += '<br><p>File:</p><p>' + data.file + ' in line ' + data.line + '</p>';
+        details += "<br><p>File:</p><p>" + data.file + " in line " + data.line + "</p>";
       }
 
-      if (data.stacktrace) details += '<br><p>Stacktrace:</p><p>' + data.stacktrace + '</p>';
-      else if (data.exceptionID) details += '<br><p>Exception ID: <code>' + data.exceptionID + '</code></p>';
+      if (data.stacktrace) details += "<br><p>Stacktrace:</p><p>" + data.stacktrace + "</p>";
+      else if (data.exceptionID) details += "<br><p>Exception ID: <code>" + data.exceptionID + "</code></p>";
 
       message = data.message;
 
       data.previous.forEach(function (previous) {
-        details += '<hr><p>' + previous.message + '</p>';
-        details += '<br><p>Stacktrace</p><p>' + previous.stacktrace + '</p>';
+        details += "<hr><p>" + previous.message + "</p>";
+        details += "<br><p>Stacktrace</p><p>" + previous.stacktrace + "</p>";
       });
     } else {
       message = xhr.responseText;
     }
 
-    if (!message || message === 'undefined') {
+    if (!message || message === "undefined") {
       if (!window.ENABLE_DEBUG_MODE) return null;
 
-      message = 'XMLHttpRequest failed without a responseText. Check your browser console.';
+      message = "XMLHttpRequest failed without a responseText. Check your browser console.";
     }
 
-    return '<div class="ajaxDebugMessage"><p>' + message + '</p>' + details + '</div>';
+    return '<div class="ajaxDebugMessage"><p>' + message + "</p>" + details + "</div>";
   }
 
   /**
@@ -321,7 +330,7 @@ class AjaxRequest {
    * @param  {Object}  options    request options
    */
   _finalize(options: RequestOptions): void {
-    if (typeof options.finalize === 'function') {
+    if (typeof options.finalize === "function") {
       options.finalize(this._xhr!);
     }
 
@@ -332,9 +341,9 @@ class AjaxRequest {
     // fix anchor tags generated through WCF::getAnchor()
     document.querySelectorAll('a[href*="#"]').forEach((link: HTMLAnchorElement) => {
       let href = link.href;
-      if (href.indexOf('AJAXProxy') !== -1 || href.indexOf('ajax-proxy') !== -1) {
-        href = href.substr(href.indexOf('#'));
-        link.href = document.location.toString().replace(/#.*/, '') + href;
+      if (href.indexOf("AJAXProxy") !== -1 || href.indexOf("ajax-proxy") !== -1) {
+        href = href.substr(href.indexOf("#"));
+        link.href = document.location.toString().replace(/#.*/, "") + href;
       }
     });
   }
index e337d327d4856622c76443aa652efb49b355e063..627bca16d61e62b15c756f487fd1424952382040 100644 (file)
@@ -7,50 +7,50 @@
  * @module  WoltLabSuite/Core/Ajax/Status
  */
 
-import * as Language from '../Language';
+import * as Language from "../Language";
 
 class AjaxStatus {
   private _activeRequests = 0;
   private readonly _overlay: Element;
   private _timer: number | null = null;
-  
+
   constructor() {
-    this._overlay = document.createElement('div');
-    this._overlay.classList.add('spinner');
-    this._overlay.setAttribute('role', 'status');
+    this._overlay = document.createElement("div");
+    this._overlay.classList.add("spinner");
+    this._overlay.setAttribute("role", "status");
 
-    const icon = document.createElement('span');
-    icon.className = 'icon icon48 fa-spinner';
+    const icon = document.createElement("span");
+    icon.className = "icon icon48 fa-spinner";
     this._overlay.appendChild(icon);
 
-    const title = document.createElement('span');
-    title.textContent = Language.get('wcf.global.loading');
+    const title = document.createElement("span");
+    title.textContent = Language.get("wcf.global.loading");
     this._overlay.appendChild(title);
 
     document.body.appendChild(this._overlay);
   }
-  
+
   show(): void {
     this._activeRequests++;
 
     if (this._timer === null) {
       this._timer = window.setTimeout(() => {
         if (this._activeRequests) {
-          this._overlay.classList.add('active');
+          this._overlay.classList.add("active");
         }
 
         this._timer = null;
       }, 250);
     }
   }
-  
+
   hide(): void {
     if (--this._activeRequests === 0) {
       if (this._timer !== null) {
         window.clearTimeout(this._timer);
       }
 
-      this._overlay.classList.remove('active');
+      this._overlay.classList.remove("active");
     }
   }
 }
@@ -60,7 +60,7 @@ function getStatus(): AjaxStatus {
   if (status === undefined) {
     status = new AjaxStatus();
   }
-  
+
   return status;
 }
 
index e56cd0b2cbf92efa0dc9c564b0185e0f5d4ec1f1..c9dc8d074239d5f93c0c57051092e1e8ac91110b 100644 (file)
@@ -7,8 +7,8 @@
  * @module  WoltLabSuite/Core/BackgroundQueue
  */
 
-import * as Ajax from './Ajax';
-import { AjaxCallbackObject, RequestOptions, ResponseData } from './Ajax/Data';
+import * as Ajax from "./Ajax";
+import { AjaxCallbackObject, RequestOptions, ResponseData } from "./Ajax/Data";
 
 class BackgroundQueue implements AjaxCallbackObject {
   private _invocations = 0;
@@ -31,7 +31,7 @@ class BackgroundQueue implements AjaxCallbackObject {
     this._invocations++;
 
     // invoke the queue up to 5 times in a row
-    if ((data as unknown) as number > 0 && this._invocations < 5) {
+    if (((data as unknown) as number) > 0 && this._invocations < 5) {
       window.setTimeout(() => {
         this._isBusy = false;
         this.invoke();
@@ -67,7 +67,7 @@ export function setUrl(url: string): void {
  */
 export function invoke(): void {
   if (!queue) {
-    console.error('The background queue has not been initialized yet.');
+    console.error("The background queue has not been initialized yet.");
     return;
   }
 
index 1ddefeff12cd66b999278a15cc89ae576e0acc54..9061183a5e49ee2a8cb17f7ef2d271372fb87cb7 100644 (file)
@@ -15,8 +15,8 @@ class CallbackList {
    * Adds a callback for given identifier.
    */
   add(identifier: string, callback: Callback): void {
-    if (typeof callback !== 'function') {
-      throw new TypeError('Expected a valid callback as second argument for identifier \'' + identifier + '\'.');
+    if (typeof callback !== "function") {
+      throw new TypeError("Expected a valid callback as second argument for identifier '" + identifier + "'.");
     }
 
     if (!this._callbacks.has(identifier)) {
index b8cd5029f898602b8e189a2b0e6f013dee6418a3..087fd6ca286965ad10430afc84c9eaa9bc857a95 100644 (file)
@@ -14,7 +14,7 @@
  * @see  https://secure.wikimedia.org/wikipedia/de/wiki/HSV-Farbraum#Transformation_von_RGB_und_HSV
  */
 export function hsvToRgb(h: number, s: number, v: number): RGB {
-  const rgb: RGB = {r: 0, g: 0, b: 0};
+  const rgb: RGB = { r: 0, g: 0, b: 0 };
   let h2: number, f: number, p: number, q: number, t: number;
 
   h2 = Math.floor(h / 60);
@@ -136,25 +136,25 @@ export function rgbToHsv(r: number, g: number, b: number): HSV {
 export function hexToRgb(hex: string): RGB | typeof Number.NaN {
   if (/^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(hex)) {
     // only convert #abc and #abcdef
-    const parts = hex.split('');
+    const parts = hex.split("");
 
     // drop the hashtag
-    if (parts[0] === '#') {
+    if (parts[0] === "#") {
       parts.shift();
     }
 
     // parse shorthand #xyz
     if (parts.length === 3) {
       return {
-        r: parseInt(parts[0] + '' + parts[0], 16),
-        g: parseInt(parts[1] + '' + parts[1], 16),
-        b: parseInt(parts[2] + '' + parts[2], 16),
+        r: parseInt(parts[0] + "" + parts[0], 16),
+        g: parseInt(parts[1] + "" + parts[1], 16),
+        b: parseInt(parts[2] + "" + parts[2], 16),
       };
     } else {
       return {
-        r: parseInt(parts[0] + '' + parts[1], 16),
-        g: parseInt(parts[2] + '' + parts[3], 16),
-        b: parseInt(parts[4] + '' + parts[5], 16),
+        r: parseInt(parts[0] + "" + parts[1], 16),
+        g: parseInt(parts[2] + "" + parts[3], 16),
+        b: parseInt(parts[4] + "" + parts[5], 16),
       };
     }
   }
@@ -168,7 +168,7 @@ export function hexToRgb(hex: string): RGB | typeof Number.NaN {
  * @see  http://www.linuxtopia.org/online_books/javascript_guides/javascript_faq/rgbtohex.htm
  */
 export function rgbToHex(r: number, g: number, b: number): string {
-  const charList = '0123456789ABCDEF';
+  const charList = "0123456789ABCDEF";
 
   if (g === undefined) {
     if (r.toString().match(/^rgba?\((\d+), ?(\d+), ?(\d+)(?:, ?[0-9.]+)?\)$/)) {
@@ -178,7 +178,15 @@ export function rgbToHex(r: number, g: number, b: number): string {
     }
   }
 
-  return (charList.charAt((r - r % 16) / 16) + '' + charList.charAt(r % 16)) + '' + (charList.charAt((g - g % 16) / 16) + '' + charList.charAt(g % 16)) + '' + (charList.charAt((b - b % 16) / 16) + '' + charList.charAt(b % 16));
+  return (
+    charList.charAt((r - (r % 16)) / 16) +
+    "" +
+    charList.charAt(r % 16) +
+    "" +
+    (charList.charAt((g - (g % 16)) / 16) + "" + charList.charAt(g % 16)) +
+    "" +
+    (charList.charAt((b - (b % 16)) / 16) + "" + charList.charAt(b % 16))
+  );
 }
 
 interface RGB {
index 6ad3dcbd60a6ebc88e604a51154734dea6dd6b67..11bf0457efe1c656a0c4aaf72b92adda8f3bd77f 100644 (file)
@@ -9,7 +9,7 @@
  */
 
 const _clone = function (variable: any): any {
-  if (typeof variable === 'object' && (Array.isArray(variable) || isPlainObject(variable))) {
+  if (typeof variable === "object" && (Array.isArray(variable) || isPlainObject(variable))) {
     return _cloneObject(variable);
   }
 
@@ -26,12 +26,12 @@ const _cloneObject = function (obj: object | any[]): object | any[] | null {
   }
 
   const newObj = {};
-  Object.keys(obj).forEach(key => newObj[key] = _clone(obj[key]));
+  Object.keys(obj).forEach((key) => (newObj[key] = _clone(obj[key])));
 
   return newObj;
 };
 
-const _prefix = 'wsc' + window.WCF_PATH.hashCode() + '-';
+const _prefix = "wsc" + window.WCF_PATH.hashCode() + "-";
 
 /**
  * Deep clones an object.
@@ -46,11 +46,11 @@ export function clone(obj: object | any[]): object | any[] {
 export function convertLegacyUrl(url: string): string {
   return url.replace(/^index\.php\/(.*?)\/\?/, (match: string, controller: string) => {
     const parts = controller.split(/([A-Z][a-z0-9]+)/);
-    controller = '';
+    controller = "";
     for (let i = 0, length = parts.length; i < length; i++) {
       const part = parts[i].trim();
       if (part.length) {
-        if (controller.length) controller += '-';
+        if (controller.length) controller += "-";
         controller += part.toLowerCase();
       }
     }
@@ -77,7 +77,7 @@ export function extend(out: object, ...args: object[]): object {
 
     for (const key in obj) {
       if (obj.hasOwnProperty(key)) {
-        if (!Array.isArray(obj[key]) && typeof obj[key] === 'object') {
+        if (!Array.isArray(obj[key]) && typeof obj[key] === "object") {
           if (isPlainObject(obj[key])) {
             // object literals have the prototype of Object which in return has no parent prototype
             newObj[key] = extend(out[key], obj[key]);
@@ -103,10 +103,10 @@ export function extend(out: object, ...args: object[]): object {
  * function MyDerivedClass() {}
  * Core.inherit(MyDerivedClass, TheAwesomeBaseClass, {
  *      // regular prototype for `MyDerivedClass`
- *      
+ *
  *      overwrittenMethodFromBaseClass: function(foo, bar) {
  *              // do stuff
- *              
+ *
  *              // invoke parent
  *              MyDerivedClass._super.prototype.overwrittenMethodFromBaseClass.call(this, foo, bar);
  *      }
@@ -114,44 +114,47 @@ export function extend(out: object, ...args: object[]): object {
  *
  * @see  https://github.com/nodejs/node/blob/7d14dd9b5e78faabb95d454a79faa513d0bbc2a5/lib/util.js#L697-L735
  */
-export function inherit(constructor: new() => any, superConstructor: new() => any, propertiesObject: object): void {
+export function inherit(constructor: new () => any, superConstructor: new () => any, propertiesObject: object): void {
   if (constructor === undefined || constructor === null) {
-    throw new TypeError('The constructor must not be undefined or null.');
+    throw new TypeError("The constructor must not be undefined or null.");
   }
   if (superConstructor === undefined || superConstructor === null) {
-    throw new TypeError('The super constructor must not be undefined or null.');
+    throw new TypeError("The super constructor must not be undefined or null.");
   }
   if (superConstructor.prototype === undefined) {
-    throw new TypeError('The super constructor must have a prototype.');
+    throw new TypeError("The super constructor must have a prototype.");
   }
 
   (constructor as any)._super = superConstructor;
-  constructor.prototype = extend(Object.create(superConstructor.prototype, {
-    constructor: {
-      configurable: true,
-      enumerable: false,
-      value: constructor,
-      writable: true,
-    },
-  }), propertiesObject || {});
+  constructor.prototype = extend(
+    Object.create(superConstructor.prototype, {
+      constructor: {
+        configurable: true,
+        enumerable: false,
+        value: constructor,
+        writable: true,
+      },
+    }),
+    propertiesObject || {}
+  );
 }
 
 /**
  * Returns true if `obj` is an object literal.
  */
 export function isPlainObject(obj: any): boolean {
-  if (typeof obj !== 'object' || obj === null || obj.nodeType) {
+  if (typeof obj !== "object" || obj === null || obj.nodeType) {
     return false;
   }
 
-  return (Object.getPrototypeOf(obj) === Object.prototype);
+  return Object.getPrototypeOf(obj) === Object.prototype;
 }
 
 /**
  * Returns the object's class name.
  */
 export function getType(obj: object): string {
-  return Object.prototype.toString.call(obj).replace(/^\[object (.+)]$/, '$1');
+  return Object.prototype.toString.call(obj).replace(/^\[object (.+)]$/, "$1");
 }
 
 /**
@@ -160,8 +163,9 @@ export function getType(obj: object): string {
  * @see    http://stackoverflow.com/a/2117523
  */
 export function getUuid(): string {
-  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
-    const r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
+  return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
+    const r = (Math.random() * 16) | 0,
+      v = c == "x" ? r : (r & 0x3) | 0x8;
     return v.toString(16);
   });
 }
@@ -174,18 +178,18 @@ export function serialize(obj: object, prefix?: string): string {
 
   for (const key in obj) {
     if (obj.hasOwnProperty(key)) {
-      const parameterKey = (prefix) ? prefix + '[' + key + ']' : key;
+      const parameterKey = prefix ? prefix + "[" + key + "]" : key;
       const value = obj[key];
 
-      if (typeof value === 'object') {
+      if (typeof value === "object") {
         parameters.push(serialize(value, parameterKey));
       } else {
-        parameters.push(encodeURIComponent(parameterKey) + '=' + encodeURIComponent(value));
+        parameters.push(encodeURIComponent(parameterKey) + "=" + encodeURIComponent(value));
       }
     }
   }
 
-  return parameters.join('&');
+  return parameters.join("&");
 }
 
 /**
@@ -212,10 +216,9 @@ export function getStoragePrefix() {
  * legacy functions `elAttrBool()` and `elDataBool()`.
  */
 export function stringToBool(value: string | null): boolean {
-  return value === '1' || value === 'true';
+  return value === "1" || value === "true";
 }
 
-
 type DebounceCallback = (...args: any[]) => void;
 
 interface DebounceOptions {
@@ -232,7 +235,7 @@ export function debounce<F extends DebounceCallback>(
   waitMilliseconds = 50,
   options: DebounceOptions = {
     isImmediate: false,
-  },
+  }
 ): (this: ThisParameterType<F>, ...args: Parameters<F>) => void {
   let timeoutId: ReturnType<typeof setTimeout> | undefined;
 
index 6a9b7003f3f7ab0e17a24661aeb45fe74cd572f8..3ae49d1d20d4ed082a58297cfb8fa8e32581a084 100644 (file)
@@ -7,14 +7,14 @@
  * @module  WoltLabSuite/Core/Date/Picker
  */
 
-import * as Core from '../Core';
-import * as DateUtil from './Util';
-import DomChangeListener from '../Dom/Change/Listener';
-import * as EventHandler from '../Event/Handler';
-import * as Language from '../Language';
-import * as UiAlignment from '../Ui/Alignment';
-import UiCloseOverlay from '../Ui/CloseOverlay';
-import DomUtil from '../Dom/Util';
+import * as Core from "../Core";
+import * as DateUtil from "./Util";
+import DomChangeListener from "../Dom/Change/Listener";
+import * as EventHandler from "../Event/Handler";
+import * as Language from "../Language";
+import * as UiAlignment from "../Ui/Alignment";
+import UiCloseOverlay from "../Ui/CloseOverlay";
+import DomUtil from "../Dom/Util";
 
 let _didInit = false;
 let _firstDayOfWeek = 0;
@@ -44,104 +44,104 @@ function createPicker() {
     return;
   }
 
-  _datePicker = document.createElement('div');
-  _datePicker.className = 'datePicker';
-  _datePicker.addEventListener('click', event => {
+  _datePicker = document.createElement("div");
+  _datePicker.className = "datePicker";
+  _datePicker.addEventListener("click", (event) => {
     event.stopPropagation();
   });
 
-  const header = document.createElement('header');
+  const header = document.createElement("header");
   _datePicker.appendChild(header);
 
-  _dateMonthPrevious = document.createElement('a');
-  _dateMonthPrevious.className = 'previous jsTooltip';
-  _dateMonthPrevious.href = '#';
-  _dateMonthPrevious.setAttribute('role', 'button');
+  _dateMonthPrevious = document.createElement("a");
+  _dateMonthPrevious.className = "previous jsTooltip";
+  _dateMonthPrevious.href = "#";
+  _dateMonthPrevious.setAttribute("role", "button");
   _dateMonthPrevious.tabIndex = 0;
-  _dateMonthPrevious.title = Language.get('wcf.date.datePicker.previousMonth');
-  _dateMonthPrevious.setAttribute('aria-label', Language.get('wcf.date.datePicker.previousMonth'));
+  _dateMonthPrevious.title = Language.get("wcf.date.datePicker.previousMonth");
+  _dateMonthPrevious.setAttribute("aria-label", Language.get("wcf.date.datePicker.previousMonth"));
   _dateMonthPrevious.innerHTML = '<span class="icon icon16 fa-arrow-left"></span>';
-  _dateMonthPrevious.addEventListener('click', DatePicker.previousMonth);
+  _dateMonthPrevious.addEventListener("click", DatePicker.previousMonth);
   header.appendChild(_dateMonthPrevious);
 
-  const monthYearContainer = document.createElement('span');
+  const monthYearContainer = document.createElement("span");
   header.appendChild(monthYearContainer);
 
-  _dateMonth = document.createElement('select');
-  _dateMonth.className = 'month jsTooltip';
-  _dateMonth.title = Language.get('wcf.date.datePicker.month');
-  _dateMonth.setAttribute('aria-label', Language.get('wcf.date.datePicker.month'));
-  _dateMonth.addEventListener('change', changeMonth);
+  _dateMonth = document.createElement("select");
+  _dateMonth.className = "month jsTooltip";
+  _dateMonth.title = Language.get("wcf.date.datePicker.month");
+  _dateMonth.setAttribute("aria-label", Language.get("wcf.date.datePicker.month"));
+  _dateMonth.addEventListener("change", changeMonth);
   monthYearContainer.appendChild(_dateMonth);
 
-  let months = '';
-  const monthNames = Language.get('__monthsShort');
+  let months = "";
+  const monthNames = Language.get("__monthsShort");
   for (let i = 0; i < 12; i++) {
-    months += '<option value="' + i + '">' + monthNames[i] + '</option>';
+    months += '<option value="' + i + '">' + monthNames[i] + "</option>";
   }
   _dateMonth.innerHTML = months;
 
-  _dateYear = document.createElement('select');
-  _dateYear.className = 'year jsTooltip';
-  _dateYear.title = Language.get('wcf.date.datePicker.year');
-  _dateYear.setAttribute('aria-label', Language.get('wcf.date.datePicker.year'));
-  _dateYear.addEventListener('change', changeYear);
+  _dateYear = document.createElement("select");
+  _dateYear.className = "year jsTooltip";
+  _dateYear.title = Language.get("wcf.date.datePicker.year");
+  _dateYear.setAttribute("aria-label", Language.get("wcf.date.datePicker.year"));
+  _dateYear.addEventListener("change", changeYear);
   monthYearContainer.appendChild(_dateYear);
 
-  _dateMonthNext = document.createElement('a');
-  _dateMonthNext.className = 'next jsTooltip';
-  _dateMonthNext.href = '#';
-  _dateMonthNext.setAttribute('role', 'button');
+  _dateMonthNext = document.createElement("a");
+  _dateMonthNext.className = "next jsTooltip";
+  _dateMonthNext.href = "#";
+  _dateMonthNext.setAttribute("role", "button");
   _dateMonthNext.tabIndex = 0;
-  _dateMonthNext.title = Language.get('wcf.date.datePicker.nextMonth');
-  _dateMonthNext.setAttribute('aria-label', Language.get('wcf.date.datePicker.nextMonth'));
+  _dateMonthNext.title = Language.get("wcf.date.datePicker.nextMonth");
+  _dateMonthNext.setAttribute("aria-label", Language.get("wcf.date.datePicker.nextMonth"));
   _dateMonthNext.innerHTML = '<span class="icon icon16 fa-arrow-right"></span>';
-  _dateMonthNext.addEventListener('click', DatePicker.nextMonth);
+  _dateMonthNext.addEventListener("click", DatePicker.nextMonth);
   header.appendChild(_dateMonthNext);
 
-  _dateGrid = document.createElement('ul');
+  _dateGrid = document.createElement("ul");
   _datePicker.appendChild(_dateGrid);
 
-  const item = document.createElement('li');
-  item.className = 'weekdays';
+  const item = document.createElement("li");
+  item.className = "weekdays";
   _dateGrid.appendChild(item);
 
-  const weekdays = Language.get('__daysShort');
+  const weekdays = Language.get("__daysShort");
   for (let i = 0; i < 7; i++) {
     let day = i + _firstDayOfWeek;
     if (day > 6) day -= 7;
 
-    const span = document.createElement('span');
+    const span = document.createElement("span");
     span.textContent = weekdays[day];
     item.appendChild(span);
   }
 
   // create date grid
   for (let i = 0; i < 6; i++) {
-    const row = document.createElement('li');
+    const row = document.createElement("li");
     _dateGrid.appendChild(row);
 
     for (let j = 0; j < 7; j++) {
-      const cell = document.createElement('a');
-      cell.addEventListener('click', click);
+      const cell = document.createElement("a");
+      cell.addEventListener("click", click);
       _dateCells.push(cell);
 
       row.appendChild(cell);
     }
   }
 
-  _dateTime = document.createElement('footer');
+  _dateTime = document.createElement("footer");
   _datePicker.appendChild(_dateTime);
 
-  _dateHour = document.createElement('select');
-  _dateHour.className = 'hour';
-  _dateHour.title = Language.get('wcf.date.datePicker.hour');
-  _dateHour.setAttribute('aria-label', Language.get('wcf.date.datePicker.hour'));
-  _dateHour.addEventListener('change', formatValue);
+  _dateHour = document.createElement("select");
+  _dateHour.className = "hour";
+  _dateHour.title = Language.get("wcf.date.datePicker.hour");
+  _dateHour.setAttribute("aria-label", Language.get("wcf.date.datePicker.hour"));
+  _dateHour.addEventListener("change", formatValue);
 
   const date = new Date(2000, 0, 1);
-  const timeFormat = Language.get('wcf.date.timeFormat').replace(/:/, '').replace(/[isu]/g, '');
-  let tmp = '';
+  const timeFormat = Language.get("wcf.date.timeFormat").replace(/:/, "").replace(/[isu]/g, "");
+  let tmp = "";
   for (let i = 0; i < 24; i++) {
     date.setHours(i);
     tmp += '<option value="' + i + '">' + DateUtil.format(date, timeFormat) + "</option>";
@@ -150,17 +150,17 @@ function createPicker() {
 
   _dateTime.appendChild(_dateHour);
 
-  _dateTime.appendChild(document.createTextNode('\u00A0:\u00A0'));
+  _dateTime.appendChild(document.createTextNode("\u00A0:\u00A0"));
 
-  _dateMinute = document.createElement('select');
-  _dateMinute.className = 'minute';
-  _dateMinute.title = Language.get('wcf.date.datePicker.minute');
-  _dateMinute.setAttribute('aria-label', Language.get('wcf.date.datePicker.minute'));
-  _dateMinute.addEventListener('change', formatValue);
+  _dateMinute = document.createElement("select");
+  _dateMinute.className = "minute";
+  _dateMinute.title = Language.get("wcf.date.datePicker.minute");
+  _dateMinute.setAttribute("aria-label", Language.get("wcf.date.datePicker.minute"));
+  _dateMinute.addEventListener("change", formatValue);
 
-  tmp = '';
+  tmp = "";
   for (let i = 0; i < 60; i++) {
-    tmp += '<option value="' + i + '">' + (i < 10 ? '0' + i.toString() : i) + '</option>';
+    tmp += '<option value="' + i + '">' + (i < 10 ? "0" + i.toString() : i) + "</option>";
   }
   _dateMinute.innerHTML = tmp;
 
@@ -168,20 +168,20 @@ function createPicker() {
 
   document.body.appendChild(_datePicker);
 
-  document.body.addEventListener('focus', maintainFocus, {capture: true});
+  document.body.addEventListener("focus", maintainFocus, { capture: true });
 }
 
 /**
  * Initializes the minimum/maximum date range.
  */
 function initDateRange(element: HTMLInputElement, now: Date, isMinDate: boolean): void {
-  const name = isMinDate ? 'minDate' : 'maxDate';
-  let value = (element.dataset[name] || '').trim();
+  const name = isMinDate ? "minDate" : "maxDate";
+  let value = (element.dataset[name] || "").trim();
 
   if (value.match(/^(\d{4})-(\d{2})-(\d{2})$/)) {
     // YYYY-mm-dd
     value = new Date(value).getTime().toString();
-  } else if (value === 'now') {
+  } else if (value === "now") {
     value = now.getTime().toString();
   } else if (value.match(/^\d{1,3}$/)) {
     // relative time span in years
@@ -194,12 +194,14 @@ function initDateRange(element: HTMLInputElement, now: Date, isMinDate: boolean)
     value = RegExp.$1;
 
     if (document.getElementById(value) === null) {
-      throw new Error("Reference date picker identified by '" + value + "' does not exists (element id: '" + element.id + "').");
+      throw new Error(
+        "Reference date picker identified by '" + value + "' does not exists (element id: '" + element.id + "')."
+      );
     }
   } else if (/^\d{4}-\d{2}-\d{2}T/.test(value)) {
     value = new Date(value).getTime().toString();
   } else {
-    value = new Date((isMinDate ? 1902 : 2038), 0, 1).getTime().toString();
+    value = new Date(isMinDate ? 1902 : 2038, 0, 1).getTime().toString();
   }
 
   element.dataset[name] = value;
@@ -212,20 +214,20 @@ function setup() {
   if (_didInit) return;
   _didInit = true;
 
-  _firstDayOfWeek = parseInt(Language.get('wcf.date.firstDayOfTheWeek'), 10);
+  _firstDayOfWeek = parseInt(Language.get("wcf.date.firstDayOfTheWeek"), 10);
 
-  DomChangeListener.add('WoltLabSuite/Core/Date/Picker', DatePicker.init);
-  UiCloseOverlay.add('WoltLabSuite/Core/Date/Picker', close);
+  DomChangeListener.add("WoltLabSuite/Core/Date/Picker", DatePicker.init);
+  UiCloseOverlay.add("WoltLabSuite/Core/Date/Picker", close);
 }
 
 function getDateValue(attributeName: string): Date {
-  let date = _input!.dataset[attributeName] || '';
+  let date = _input!.dataset[attributeName] || "";
   if (date.match(/^datePicker-(.+)$/)) {
     const referenceElement = document.getElementById(RegExp.$1);
     if (referenceElement === null) {
       throw new Error(`Unable to find an element with the id '${RegExp.$1}'.`);
     }
-    date = referenceElement.dataset.value || '';
+    date = referenceElement.dataset.value || "";
   }
 
   return new Date(parseInt(date, 10));
@@ -241,17 +243,17 @@ function open(event: MouseEvent): void {
   createPicker();
 
   const target = event.currentTarget as HTMLInputElement;
-  const input = (target.nodeName === 'INPUT') ? target : target.previousElementSibling as HTMLInputElement;
+  const input = target.nodeName === "INPUT" ? target : (target.previousElementSibling as HTMLInputElement);
   if (input === _input) {
     close();
     return;
   }
 
-  const dialogContent = input.closest('.dialogContent') as HTMLElement;
+  const dialogContent = input.closest(".dialogContent") as HTMLElement;
   if (dialogContent !== null) {
-    if (!Core.stringToBool(dialogContent.dataset.hasDatepickerScrollListener || '')) {
-      dialogContent.addEventListener('scroll', onDialogScroll);
-      dialogContent.dataset.hasDatepickerScrollListener = '1';
+    if (!Core.stringToBool(dialogContent.dataset.hasDatepickerScrollListener || "")) {
+      dialogContent.addEventListener("scroll", onDialogScroll);
+      dialogContent.dataset.hasDatepickerScrollListener = "1";
     }
   }
 
@@ -262,7 +264,7 @@ function open(event: MouseEvent): void {
   if (value) {
     date = new Date(parseInt(value, 10));
 
-    if (date.toString() === 'Invalid Date') {
+    if (date.toString() === "Invalid Date") {
       date = new Date();
     }
   } else {
@@ -270,29 +272,29 @@ function open(event: MouseEvent): void {
   }
 
   // set min/max date
-  _minDate = getDateValue('minDate');
+  _minDate = getDateValue("minDate");
   if (_minDate.getTime() > date.getTime()) {
     date = _minDate;
   }
 
-  _maxDate = getDateValue('maxDate');
+  _maxDate = getDateValue("maxDate");
 
   if (data.isDateTime) {
     _dateHour.value = date.getHours().toString();
     _dateMinute.value = date.getMinutes().toString();
 
-    _datePicker!.classList.add('datePickerTime');
+    _datePicker!.classList.add("datePickerTime");
   } else {
-    _datePicker!.classList.remove('datePickerTime');
+    _datePicker!.classList.remove("datePickerTime");
   }
 
-  _datePicker!.classList[(data.isTimeOnly) ? 'add' : 'remove']('datePickerTimeOnly');
+  _datePicker!.classList[data.isTimeOnly ? "add" : "remove"]("datePickerTimeOnly");
 
   renderPicker(date.getDate(), date.getMonth(), date.getFullYear());
 
   UiAlignment.set(_datePicker!, _input);
 
-  _input.nextElementSibling!.setAttribute('aria-expanded', 'true');
+  _input.nextElementSibling!.setAttribute("aria-expanded", "true");
 
   _wasInsidePicker = false;
 }
@@ -301,21 +303,21 @@ function open(event: MouseEvent): void {
  * Closes the date picker.
  */
 function close() {
-  if (_datePicker === null || !_datePicker.classList.contains('active')) {
+  if (_datePicker === null || !_datePicker.classList.contains("active")) {
     return;
   }
 
-  _datePicker.classList.remove('active');
+  _datePicker.classList.remove("active");
 
   const data = _data.get(_input!) as DatePickerData;
-  if (typeof data.onClose === 'function') {
+  if (typeof data.onClose === "function") {
     data.onClose();
   }
 
-  EventHandler.fire('WoltLabSuite/Core/Date/Picker', 'close', {element: _input});
+  EventHandler.fire("WoltLabSuite/Core/Date/Picker", "close", { element: _input });
 
   const sibling = _input!.nextElementSibling as HTMLElement;
-  sibling.setAttribute('aria-expanded', 'false');
+  sibling.setAttribute("aria-expanded", "false");
   _input = null;
 }
 
@@ -358,38 +360,38 @@ function renderPicker(day: number, month: number, year: number): void {
   renderGrid(day, month, year);
 
   // create options for month and year
-  let years = '';
+  let years = "";
   for (let i = _minDate.getFullYear(), last = _maxDate.getFullYear(); i <= last; i++) {
-    years += '<option value="' + i + '">' + i + '</option>';
+    years += '<option value="' + i + '">' + i + "</option>";
   }
   _dateYear.innerHTML = years;
   _dateYear.value = year.toString();
 
   _dateMonth.value = month.toString();
 
-  _datePicker!.classList.add('active');
+  _datePicker!.classList.add("active");
 }
 
 /**
  * Updates the date grid.
  */
 function renderGrid(day?: number, month?: number, year?: number): void {
-  const hasDay = (day !== undefined);
-  const hasMonth = (month !== undefined);
+  const hasDay = day !== undefined;
+  const hasMonth = month !== undefined;
 
-  if (typeof day !== 'number') {
-    day = parseInt(day || _dateGrid.dataset.day || '0', 10);
+  if (typeof day !== "number") {
+    day = parseInt(day || _dateGrid.dataset.day || "0", 10);
   }
-  if (typeof month !== 'number') {
-    month = parseInt(month || '0', 10);
+  if (typeof month !== "number") {
+    month = parseInt(month || "0", 10);
   }
-  if (typeof year !== 'number') {
-    year = parseInt(year || '0', 10);
+  if (typeof year !== "number") {
+    year = parseInt(year || "0", 10);
   }
 
   // rebuild cells
   if (hasMonth || year) {
-    let rebuildMonths = (year !== 0);
+    let rebuildMonths = year !== 0;
 
     // rebuild grid
     const fragment = document.createDocumentFragment();
@@ -403,7 +405,7 @@ function renderGrid(day?: number, month?: number, year?: number): void {
     }
 
     // check if current selection exceeds min/max date
-    let date = new Date(year + '-' + ('0' + (month + 1).toString()).slice(-2) + '-' + ('0' + day.toString()).slice(-2));
+    let date = new Date(year + "-" + ("0" + (month + 1).toString()).slice(-2) + "-" + ("0" + day.toString()).slice(-2));
     if (date < _minDate) {
       year = _minDate.getFullYear();
       month = _minDate.getMonth();
@@ -424,7 +426,7 @@ function renderGrid(day?: number, month?: number, year?: number): void {
       rebuildMonths = true;
     }
 
-    date = new Date(year + '-' + ('0' + (month + 1).toString()).slice(-2) + '-01');
+    date = new Date(year + "-" + ("0" + (month + 1).toString()).slice(-2) + "-01");
 
     // shift until first displayed day equals first day of week
     while (date.getDay() !== _firstDayOfWeek) {
@@ -447,19 +449,19 @@ function renderGrid(day?: number, month?: number, year?: number): void {
       const cell = _dateCells[i];
 
       cell.textContent = date.getDate().toString();
-      selectable = (date.getMonth() === month);
+      selectable = date.getMonth() === month;
       if (selectable) {
         if (date < comparableMinDate) selectable = false;
         else if (date > _maxDate) selectable = false;
       }
 
-      cell.classList[selectable ? 'remove' : 'add']('otherMonth');
+      cell.classList[selectable ? "remove" : "add"]("otherMonth");
       if (selectable) {
-        cell.href = '#';
-        cell.setAttribute('role', 'button');
+        cell.href = "#";
+        cell.setAttribute("role", "button");
         cell.tabIndex = 0;
         cell.title = DateUtil.formatDate(date);
-        cell.setAttribute('aria-label', DateUtil.formatDate(date));
+        cell.setAttribute("aria-label", DateUtil.formatDate(date));
       }
 
       date.setDate(date.getDate() + 1);
@@ -486,18 +488,20 @@ function renderGrid(day?: number, month?: number, year?: number): void {
       for (let i = 0; i < 12; i++) {
         const currentMonth = _dateMonth.children[i] as HTMLOptionElement;
 
-        currentMonth.disabled = (year === _minDate.getFullYear() && +currentMonth.value < _minDate.getMonth()) || (year === _maxDate.getFullYear() && +currentMonth.value > _maxDate.getMonth());
+        currentMonth.disabled =
+          (year === _minDate.getFullYear() && +currentMonth.value < _minDate.getMonth()) ||
+          (year === _maxDate.getFullYear() && +currentMonth.value > _maxDate.getMonth());
       }
 
-      const nextMonth = new Date(year + '-' + ('0' + (month + 1).toString()).slice(-2) + '-01');
+      const nextMonth = new Date(year + "-" + ("0" + (month + 1).toString()).slice(-2) + "-01");
       nextMonth.setMonth(nextMonth.getMonth() + 1);
 
-      _dateMonthNext.classList[(nextMonth < _maxDate) ? 'add' : 'remove']('active');
+      _dateMonthNext.classList[nextMonth < _maxDate ? "add" : "remove"]("active");
 
-      const previousMonth = new Date(year + '-' + ('0' + (month + 1).toString()).slice(-2) + '-01');
+      const previousMonth = new Date(year + "-" + ("0" + (month + 1).toString()).slice(-2) + "-01");
       previousMonth.setDate(previousMonth.getDate() - 1);
 
-      _dateMonthPrevious.classList[(previousMonth > _minDate) ? 'add' : 'remove']('active');
+      _dateMonthPrevious.classList[previousMonth > _minDate ? "add" : "remove"]("active");
     }
   }
 
@@ -506,7 +510,7 @@ function renderGrid(day?: number, month?: number, year?: number): void {
     for (let i = 0; i < 35; i++) {
       const cell = _dateCells[i];
 
-      cell.classList[(!cell.classList.contains('otherMonth') && +cell.textContent! === day) ? 'add' : 'remove']('active');
+      cell.classList[!cell.classList.contains("otherMonth") && +cell.textContent! === day ? "add" : "remove"]("active");
     }
 
     _dateGrid.dataset.day = day.toString();
@@ -522,7 +526,7 @@ function formatValue(): void {
   const data = _data.get(_input!) as DatePickerData;
   let date: Date;
 
-  if (Core.stringToBool(_input!.dataset.empty || '')) {
+  if (Core.stringToBool(_input!.dataset.empty || "")) {
     return;
   }
 
@@ -532,14 +536,10 @@ function formatValue(): void {
       +_dateGrid.dataset.month!,
       +_dateGrid.dataset.day!,
       +_dateHour.value,
-      +_dateMinute.value,
+      +_dateMinute.value
     );
   } else {
-    date = new Date(
-      +_dateGrid.dataset.year!,
-      +_dateGrid.dataset.month!,
-      +_dateGrid.dataset.day!,
-    );
+    date = new Date(+_dateGrid.dataset.year!, +_dateGrid.dataset.month!, +_dateGrid.dataset.day!);
   }
 
   DatePicker.setDate(_input!, date);
@@ -568,11 +568,11 @@ function click(event: MouseEvent): void {
   event.preventDefault();
 
   const target = event.currentTarget as HTMLAnchorElement;
-  if (target.classList.contains('otherMonth')) {
+  if (target.classList.contains("otherMonth")) {
     return;
   }
 
-  _input!.dataset.empty = 'false';
+  _input!.dataset.empty = "false";
 
   renderGrid(+target.textContent!);
 
@@ -586,11 +586,11 @@ function click(event: MouseEvent): void {
  * Validates given element or id if it represents an active date picker.
  */
 function getElement(element: InputElementOrString): HTMLInputElement {
-  if (typeof element === 'string') {
+  if (typeof element === "string") {
     element = document.getElementById(element) as HTMLInputElement;
   }
 
-  if (!(element instanceof HTMLInputElement) || !element.classList.contains('inputDatePicker') || !_data.has(element)) {
+  if (!(element instanceof HTMLInputElement) || !element.classList.contains("inputDatePicker") || !_data.has(element)) {
     throw new Error("Expected a valid date picker input element or id.");
   }
 
@@ -598,7 +598,7 @@ function getElement(element: InputElementOrString): HTMLInputElement {
 }
 
 function maintainFocus(event: FocusEvent): void {
-  if (_datePicker === null || !_datePicker.classList.contains('active')) {
+  if (_datePicker === null || !_datePicker.classList.contains("active")) {
     return;
   }
 
@@ -608,7 +608,7 @@ function maintainFocus(event: FocusEvent): void {
       sibling.focus();
       _wasInsidePicker = false;
     } else {
-      _datePicker!.querySelector<HTMLElement>('.previous')!.focus();
+      _datePicker!.querySelector<HTMLElement>(".previous")!.focus();
     }
   } else {
     _wasInsidePicker = true;
@@ -623,186 +623,190 @@ const DatePicker = {
     setup();
 
     const now = new Date();
-    document.querySelectorAll<HTMLInputElement>('input[type="date"]:not(.inputDatePicker), input[type="datetime"]:not(.inputDatePicker)').forEach(element => {
-      element.classList.add('inputDatePicker');
-      element.readOnly = true;
-
-      const isDateTime = (element.type === 'datetime');
-      const isTimeOnly = isDateTime && Core.stringToBool(element.dataset.timeOnly || '');
-      const disableClear = Core.stringToBool(element.dataset.disableClear || '');
-      const ignoreTimezone = isDateTime && Core.stringToBool(element.dataset.ignoreTimezone || '');
-      const isBirthday = element.classList.contains('birthday');
-
-      element.dataset.isDateTime = isDateTime ? 'true' : 'false';
-      element.dataset.isTimeOnly = isTimeOnly ? 'true' : 'false';
-
-      // convert value
-      let date: Date | null = null;
-      let value = element.value;
-
-      // ignore the timezone, if the value is only a date (YYYY-MM-DD)
-      const isDateOnly = /^\d+-\d+-\d+$/.test(value);
-
-      if (value) {
-        if (isTimeOnly) {
-          date = new Date();
-          const tmp = value.split(':');
-          date.setHours(+tmp[0], +tmp[1]);
-        } else {
-          if (ignoreTimezone || isBirthday || isDateOnly) {
-            let timezoneOffset = new Date(value).getTimezoneOffset();
-            let timezone = (timezoneOffset > 0) ? '-' : '+'; // -120 equals GMT+0200
-            timezoneOffset = Math.abs(timezoneOffset);
-
-            const hours = (Math.floor(timezoneOffset / 60)).toString();
-            const minutes = (timezoneOffset % 60).toString();
-            timezone += (hours.length === 2) ? hours : '0' + hours;
-            timezone += ':';
-            timezone += (minutes.length === 2) ? minutes : '0' + minutes;
-
-            if (isBirthday || isDateOnly) {
-              value += 'T00:00:00' + timezone;
-            } else {
-              value = value.replace(/[+-][0-9]{2}:[0-9]{2}$/, timezone);
+    document
+      .querySelectorAll<HTMLInputElement>(
+        'input[type="date"]:not(.inputDatePicker), input[type="datetime"]:not(.inputDatePicker)'
+      )
+      .forEach((element) => {
+        element.classList.add("inputDatePicker");
+        element.readOnly = true;
+
+        const isDateTime = element.type === "datetime";
+        const isTimeOnly = isDateTime && Core.stringToBool(element.dataset.timeOnly || "");
+        const disableClear = Core.stringToBool(element.dataset.disableClear || "");
+        const ignoreTimezone = isDateTime && Core.stringToBool(element.dataset.ignoreTimezone || "");
+        const isBirthday = element.classList.contains("birthday");
+
+        element.dataset.isDateTime = isDateTime ? "true" : "false";
+        element.dataset.isTimeOnly = isTimeOnly ? "true" : "false";
+
+        // convert value
+        let date: Date | null = null;
+        let value = element.value;
+
+        // ignore the timezone, if the value is only a date (YYYY-MM-DD)
+        const isDateOnly = /^\d+-\d+-\d+$/.test(value);
+
+        if (value) {
+          if (isTimeOnly) {
+            date = new Date();
+            const tmp = value.split(":");
+            date.setHours(+tmp[0], +tmp[1]);
+          } else {
+            if (ignoreTimezone || isBirthday || isDateOnly) {
+              let timezoneOffset = new Date(value).getTimezoneOffset();
+              let timezone = timezoneOffset > 0 ? "-" : "+"; // -120 equals GMT+0200
+              timezoneOffset = Math.abs(timezoneOffset);
+
+              const hours = Math.floor(timezoneOffset / 60).toString();
+              const minutes = (timezoneOffset % 60).toString();
+              timezone += hours.length === 2 ? hours : "0" + hours;
+              timezone += ":";
+              timezone += minutes.length === 2 ? minutes : "0" + minutes;
+
+              if (isBirthday || isDateOnly) {
+                value += "T00:00:00" + timezone;
+              } else {
+                value = value.replace(/[+-][0-9]{2}:[0-9]{2}$/, timezone);
+              }
             }
-          }
 
-          date = new Date(value);
-        }
+            date = new Date(value);
+          }
 
-        const time = date.getTime();
+          const time = date.getTime();
 
-        // check for invalid dates
-        if (isNaN(time)) {
-          value = '';
-        } else {
-          element.dataset.value = time.toString();
-          const format = (isTimeOnly) ? 'formatTime' : ('formatDate' + (isDateTime ? 'Time' : ''));
-          value = DateUtil[format](date);
+          // check for invalid dates
+          if (isNaN(time)) {
+            value = "";
+          } else {
+            element.dataset.value = time.toString();
+            const format = isTimeOnly ? "formatTime" : "formatDate" + (isDateTime ? "Time" : "");
+            value = DateUtil[format](date);
+          }
         }
-      }
 
-      const isEmpty = (value.length === 0);
+        const isEmpty = value.length === 0;
 
-      // handle birthday input
-      if (isBirthday) {
-        element.dataset.minDate = '120';
+        // handle birthday input
+        if (isBirthday) {
+          element.dataset.minDate = "120";
 
-        // do not use 'now' here, all though it makes sense, it causes bad UX 
-        element.dataset.maxDate = new Date().getFullYear() + '-12-31';
-      } else {
-        if (element.min) {
-          element.dataset.minDate = element.min;
-        }
-        if (element.max) {
-          element.dataset.maxDate = element.max;
+          // do not use 'now' here, all though it makes sense, it causes bad UX
+          element.dataset.maxDate = new Date().getFullYear() + "-12-31";
+        } else {
+          if (element.min) {
+            element.dataset.minDate = element.min;
+          }
+          if (element.max) {
+            element.dataset.maxDate = element.max;
+          }
         }
-      }
 
-      initDateRange(element, now, true);
-      initDateRange(element, now, false);
+        initDateRange(element, now, true);
+        initDateRange(element, now, false);
 
-      if ((element.dataset.minDate || '') === (element.dataset.maxDate || '')) {
-        throw new Error("Minimum and maximum date cannot be the same (element id '" + element.id + "').");
-      }
+        if ((element.dataset.minDate || "") === (element.dataset.maxDate || "")) {
+          throw new Error("Minimum and maximum date cannot be the same (element id '" + element.id + "').");
+        }
 
-      // change type to prevent browser's datepicker to trigger
-      element.type = 'text';
-      element.value = value;
-      element.dataset.empty = isEmpty ? 'true' : 'false';
+        // change type to prevent browser's datepicker to trigger
+        element.type = "text";
+        element.value = value;
+        element.dataset.empty = isEmpty ? "true" : "false";
 
-      const placeholder = element.dataset.placeholder || '';
-      if (placeholder) {
-        element.placeholder = placeholder;
-      }
+        const placeholder = element.dataset.placeholder || "";
+        if (placeholder) {
+          element.placeholder = placeholder;
+        }
 
-      // add a hidden element to hold the actual date
-      const shadowElement = document.createElement('input');
-      shadowElement.id = element.id + 'DatePicker';
-      shadowElement.name = element.name;
-      shadowElement.type = 'hidden';
-
-      if (date !== null) {
-        if (isTimeOnly) {
-          shadowElement.value = DateUtil.format(date, 'H:i');
-        } else if (ignoreTimezone) {
-          shadowElement.value = DateUtil.format(date, 'Y-m-dTH:i:s');
-        } else {
-          shadowElement.value = DateUtil.format(date, (isDateTime) ? 'c' : 'Y-m-d');
+        // add a hidden element to hold the actual date
+        const shadowElement = document.createElement("input");
+        shadowElement.id = element.id + "DatePicker";
+        shadowElement.name = element.name;
+        shadowElement.type = "hidden";
+
+        if (date !== null) {
+          if (isTimeOnly) {
+            shadowElement.value = DateUtil.format(date, "H:i");
+          } else if (ignoreTimezone) {
+            shadowElement.value = DateUtil.format(date, "Y-m-dTH:i:s");
+          } else {
+            shadowElement.value = DateUtil.format(date, isDateTime ? "c" : "Y-m-d");
+          }
         }
-      }
 
-      element.parentNode!.insertBefore(shadowElement, element);
-      element.removeAttribute('name');
+        element.parentNode!.insertBefore(shadowElement, element);
+        element.removeAttribute("name");
 
-      element.addEventListener('click', open);
+        element.addEventListener("click", open);
 
-      let clearButton: HTMLAnchorElement | null = null;
-      if (!element.disabled) {
-        // create input addon
-        const container = document.createElement('div');
-        container.className = 'inputAddon';
+        let clearButton: HTMLAnchorElement | null = null;
+        if (!element.disabled) {
+          // create input addon
+          const container = document.createElement("div");
+          container.className = "inputAddon";
 
-        clearButton = document.createElement('a');
+          clearButton = document.createElement("a");
 
-        clearButton.className = 'inputSuffix button jsTooltip';
-        clearButton.href = '#';
-        clearButton.setAttribute('role', 'button');
-        clearButton.tabIndex = 0;
-        clearButton.title = Language.get('wcf.date.datePicker');
-        clearButton.setAttribute('aria-label', Language.get('wcf.date.datePicker'));
-        clearButton.setAttribute('aria-haspopup', 'true');
-        clearButton.setAttribute('aria-expanded', 'false');
-        clearButton.addEventListener('click', open);
-        container.appendChild(clearButton);
+          clearButton.className = "inputSuffix button jsTooltip";
+          clearButton.href = "#";
+          clearButton.setAttribute("role", "button");
+          clearButton.tabIndex = 0;
+          clearButton.title = Language.get("wcf.date.datePicker");
+          clearButton.setAttribute("aria-label", Language.get("wcf.date.datePicker"));
+          clearButton.setAttribute("aria-haspopup", "true");
+          clearButton.setAttribute("aria-expanded", "false");
+          clearButton.addEventListener("click", open);
+          container.appendChild(clearButton);
 
-        let icon = document.createElement('span');
-        icon.className = 'icon icon16 fa-calendar';
-        clearButton.appendChild(icon);
+          let icon = document.createElement("span");
+          icon.className = "icon icon16 fa-calendar";
+          clearButton.appendChild(icon);
 
-        element.parentNode!.insertBefore(container, element);
-        container.insertBefore(element, clearButton);
+          element.parentNode!.insertBefore(container, element);
+          container.insertBefore(element, clearButton);
 
-        if (!disableClear) {
-          const button = document.createElement('a');
-          button.className = 'inputSuffix button';
-          button.addEventListener('click', this.clear.bind(this, element));
-          if (isEmpty) button.style.setProperty('visibility', 'hidden', '');
+          if (!disableClear) {
+            const button = document.createElement("a");
+            button.className = "inputSuffix button";
+            button.addEventListener("click", this.clear.bind(this, element));
+            if (isEmpty) button.style.setProperty("visibility", "hidden", "");
 
-          container.appendChild(button);
+            container.appendChild(button);
 
-          icon = document.createElement('span');
-          icon.className = 'icon icon16 fa-times';
-          button.appendChild(icon);
+            icon = document.createElement("span");
+            icon.className = "icon icon16 fa-times";
+            button.appendChild(icon);
+          }
         }
-      }
 
-      // check if the date input has one of the following classes set otherwise default to 'short'
-      const knownClasses = ['tiny', 'short', 'medium', 'long'];
-      let hasClass = false;
-      for (let j = 0; j < 4; j++) {
-        if (element.classList.contains(knownClasses[j])) {
-          hasClass = true;
+        // check if the date input has one of the following classes set otherwise default to 'short'
+        const knownClasses = ["tiny", "short", "medium", "long"];
+        let hasClass = false;
+        for (let j = 0; j < 4; j++) {
+          if (element.classList.contains(knownClasses[j])) {
+            hasClass = true;
+          }
         }
-      }
 
-      if (!hasClass) {
-        element.classList.add('short');
-      }
+        if (!hasClass) {
+          element.classList.add("short");
+        }
 
-      _data.set(element, {
-        clearButton,
-        shadow: shadowElement,
+        _data.set(element, {
+          clearButton,
+          shadow: shadowElement,
 
-        disableClear,
-        isDateTime,
-        isEmpty,
-        isTimeOnly,
-        ignoreTimezone,
+          disableClear,
+          isDateTime,
+          isEmpty,
+          isTimeOnly,
+          ignoreTimezone,
 
-        onClose: null,
+          onClose: null,
+        });
       });
-    });
   },
 
   /**
@@ -811,8 +815,8 @@ const DatePicker = {
   previousMonth(event: MouseEvent): void {
     event.preventDefault();
 
-    if (_dateMonth.value === '0') {
-      _dateMonth.value = '11';
+    if (_dateMonth.value === "0") {
+      _dateMonth.value = "11";
       _dateYear.value = (+_dateYear.value - 1).toString();
     } else {
       _dateMonth.value = (+_dateMonth.value - 1).toString();
@@ -827,8 +831,8 @@ const DatePicker = {
   nextMonth(event: MouseEvent): void {
     event.preventDefault();
 
-    if (_dateMonth.value === '11') {
-      _dateMonth.value = '0';
+    if (_dateMonth.value === "11") {
+      _dateMonth.value = "0";
       _dateYear.value = (+_dateYear.value + 1).toString();
     } else {
       _dateMonth.value = (+_dateMonth.value + 1).toString();
@@ -843,7 +847,7 @@ const DatePicker = {
   getDate(element: InputElementOrString): Date | null {
     element = getElement(element);
 
-    const value = element.dataset.value || '';
+    const value = element.dataset.value || "";
     if (value) {
       return new Date(+value);
     }
@@ -863,22 +867,22 @@ const DatePicker = {
 
     element.dataset.value = date.getTime().toString();
 
-    let format = '';
+    let format = "";
     let value: string;
     if (data.isDateTime) {
       if (data.isTimeOnly) {
         value = DateUtil.formatTime(date);
-        format = 'H:i';
+        format = "H:i";
       } else if (data.ignoreTimezone) {
         value = DateUtil.formatDateTime(date);
-        format = 'Y-m-dTH:i:s';
+        format = "Y-m-dTH:i:s";
       } else {
         value = DateUtil.formatDateTime(date);
-        format = 'c';
+        format = "c";
       }
     } else {
       value = DateUtil.formatDate(date);
-      format = 'Y-m-d';
+      format = "Y-m-d";
     }
 
     element.value = value;
@@ -886,7 +890,7 @@ const DatePicker = {
 
     // show clear button
     if (!data.disableClear) {
-      data.clearButton!.style.removeProperty('visibility');
+      data.clearButton!.style.removeProperty("visibility");
     }
   },
 
@@ -901,7 +905,7 @@ const DatePicker = {
       return data.shadow.value;
     }
 
-    return '';
+    return "";
   },
 
   /**
@@ -911,15 +915,15 @@ const DatePicker = {
     element = getElement(element);
     const data = _data.get(element) as DatePickerData;
 
-    element.removeAttribute('data-value');
-    element.value = '';
+    element.removeAttribute("data-value");
+    element.value = "";
 
     if (!data.disableClear) {
-      data.clearButton!.style.setProperty('visibility', 'hidden', '');
+      data.clearButton!.style.setProperty("visibility", "hidden", "");
     }
 
     data.isEmpty = true;
-    data.shadow.value = '';
+    data.shadow.value = "";
   },
 
   /**
@@ -933,15 +937,15 @@ const DatePicker = {
     container.parentNode!.insertBefore(element, container);
     container.remove();
 
-    element.type = 'date' + (data.isDateTime ? 'time' : '');
+    element.type = "date" + (data.isDateTime ? "time" : "");
     element.name = data.shadow.name;
     element.value = data.shadow.value;
 
-    element.removeAttribute('data-value');
-    element.removeEventListener('click', open);
+    element.removeAttribute("data-value");
+    element.removeEventListener("click", open);
     data.shadow.remove();
 
-    element.classList.remove('inputDatePicker');
+    element.classList.remove("inputDatePicker");
     element.readOnly = false;
     _data.delete(element);
   },
index 85f545527539670011365b73269b9b0d97387c3b..3b1aaf055f0ed13817df2a56833708d147ae686e 100644 (file)
@@ -7,17 +7,16 @@
  * @module  WoltLabSuite/Core/Date/Time/Relative
  */
 
-import * as Core from '../../Core';
-import * as DateUtil from '../Util';
-import DomChangeListener from '../../Dom/Change/Listener';
-import * as Language from '../../Language';
-import RepeatingTimer from '../../Timer/Repeating';
+import * as Core from "../../Core";
+import * as DateUtil from "../Util";
+import DomChangeListener from "../../Dom/Change/Listener";
+import * as Language from "../../Language";
+import RepeatingTimer from "../../Timer/Repeating";
 
 let _isActive = true;
 let _isPending = false;
 let _offset: number;
 
-
 function onVisibilityChange(): void {
   if (document.hidden) {
     _isActive = false;
@@ -45,13 +44,13 @@ function refresh() {
   const timestamp = (date.getTime() - date.getMilliseconds()) / 1_000;
   if (_offset === null) _offset = timestamp - window.TIME_NOW;
 
-  document.querySelectorAll('time').forEach(element => {
+  document.querySelectorAll("time").forEach((element) => {
     rebuild(element, date, timestamp);
   });
 }
 
 function rebuild(element: HTMLTimeElement, date: Date, timestamp: number): void {
-  if (!element.classList.contains('datetime') || Core.stringToBool(element.dataset.isFutureDate || '')) {
+  if (!element.classList.contains("datetime") || Core.stringToBool(element.dataset.isFutureDate || "")) {
     return;
   }
 
@@ -61,38 +60,42 @@ function rebuild(element: HTMLTimeElement, date: Date, timestamp: number): void
   const elOffset = element.dataset.offset!;
 
   if (!element.title) {
-    element.title = Language.get('wcf.date.dateTimeFormat').replace(/%date%/, elDate).replace(/%time%/, elTime);
+    element.title = Language.get("wcf.date.dateTimeFormat")
+      .replace(/%date%/, elDate)
+      .replace(/%time%/, elTime);
   }
 
   // timestamp is less than 60 seconds ago
-  if (elTimestamp >= timestamp || timestamp < (elTimestamp + 60)) {
-    element.textContent = Language.get('wcf.date.relative.now');
+  if (elTimestamp >= timestamp || timestamp < elTimestamp + 60) {
+    element.textContent = Language.get("wcf.date.relative.now");
   }
   // timestamp is less than 60 minutes ago (display 1 hour ago rather than 60 minutes ago)
-  else if (timestamp < (elTimestamp + 3540)) {
+  else if (timestamp < elTimestamp + 3540) {
     const minutes = Math.max(Math.round((timestamp - elTimestamp) / 60), 1);
-    element.textContent = Language.get('wcf.date.relative.minutes', {minutes: minutes});
+    element.textContent = Language.get("wcf.date.relative.minutes", { minutes: minutes });
   }
   // timestamp is less than 24 hours ago
-  else if (timestamp < (elTimestamp + 86400)) {
+  else if (timestamp < elTimestamp + 86400) {
     const hours = Math.round((timestamp - elTimestamp) / 3600);
-    element.textContent = Language.get('wcf.date.relative.hours', {hours: hours});
+    element.textContent = Language.get("wcf.date.relative.hours", { hours: hours });
   }
   // timestamp is less than 6 days ago
-  else if (timestamp < (elTimestamp + 518400)) {
+  else if (timestamp < elTimestamp + 518400) {
     const midnight = new Date(date.getFullYear(), date.getMonth(), date.getDate());
     const days = Math.ceil((midnight.getTime() / 1000 - elTimestamp) / 86400);
 
     // get day of week
-    const dateObj = DateUtil.getTimezoneDate((elTimestamp * 1000), parseInt(elOffset, 10) * 1000);
+    const dateObj = DateUtil.getTimezoneDate(elTimestamp * 1000, parseInt(elOffset, 10) * 1000);
     const dow = dateObj.getDay();
-    const day = Language.get('__days')[dow];
+    const day = Language.get("__days")[dow];
 
-    element.textContent = Language.get('wcf.date.relative.pastDays', {days: days, day: day, time: elTime});
+    element.textContent = Language.get("wcf.date.relative.pastDays", { days: days, day: day, time: elTime });
   }
   // timestamp is between ~700 million years BC and last week
   else {
-    element.textContent = Language.get('wcf.date.shortDateTimeFormat').replace(/%date%/, elDate).replace(/%time%/, elTime);
+    element.textContent = Language.get("wcf.date.shortDateTimeFormat")
+      .replace(/%date%/, elDate)
+      .replace(/%time%/, elTime);
   }
 }
 
@@ -102,7 +105,7 @@ function rebuild(element: HTMLTimeElement, date: Date, timestamp: number): void
 export function setup(): void {
   new RepeatingTimer(refresh, 60_000);
 
-  DomChangeListener.add('WoltLabSuite/Core/Date/Time/Relative', refresh);
+  DomChangeListener.add("WoltLabSuite/Core/Date/Time/Relative", refresh);
 
-  document.addEventListener('visibilitychange', onVisibilityChange);
+  document.addEventListener("visibilitychange", onVisibilityChange);
 }
index 656319783e7b7a324fc411adf0ac11ce4a0ce666..8e471b3142b7a9de1dc7b58dac25f25904555f80 100644 (file)
@@ -8,29 +8,29 @@
  * @module  WoltLabSuite/Core/Date/Util
  */
 
-import * as Language from '../Language';
+import * as Language from "../Language";
 
 /**
  * Returns the formatted date.
  */
 export function formatDate(date: Date): string {
-  return format(date, Language.get('wcf.date.dateFormat'));
+  return format(date, Language.get("wcf.date.dateFormat"));
 }
 
 /**
  * Returns the formatted time.
  */
 export function formatTime(date: Date): string {
-  return format(date, Language.get('wcf.date.timeFormat'));
+  return format(date, Language.get("wcf.date.timeFormat"));
 }
 
 /**
  * Returns the formatted date time.
  */
 export function formatDateTime(date: Date): string {
-  const dateTimeFormat = Language.get('wcf.date.dateTimeFormat');
-  const dateFormat = Language.get('wcf.date.dateFormat');
-  const timeFormat = Language.get('wcf.date.timeFormat');
+  const dateTimeFormat = Language.get("wcf.date.dateTimeFormat");
+  const dateFormat = Language.get("wcf.date.dateFormat");
+  const timeFormat = Language.get("wcf.date.timeFormat");
 
   return format(date, dateTimeFormat.replace(/%date%/, dateFormat).replace(/%time%/, timeFormat));
 }
@@ -40,11 +40,11 @@ export function formatDateTime(date: Date): string {
  */
 export function format(date: Date, format: string): string {
   let char: string;
-  let out = '';
+  let out = "";
 
   // ISO 8601 date, best recognition by PHP's strtotime()
-  if (format === 'c') {
-    format = 'Y-m-dTH:i:sP';
+  if (format === "c") {
+    format = "Y-m-dTH:i:sP";
   }
 
   for (let i = 0, length = format.length; i < length; i++) {
@@ -52,125 +52,125 @@ export function format(date: Date, format: string): string {
 
     switch (format[i]) {
       // seconds
-      case 's':
+      case "s":
         // `00` through `59`
-        char = ('0' + date.getSeconds().toString()).slice(-2);
+        char = ("0" + date.getSeconds().toString()).slice(-2);
         break;
 
       // minutes
-      case 'i':
+      case "i":
         // `00` through `59`
-        char = date.getMinutes().toString().padStart(2, '0');
+        char = date.getMinutes().toString().padStart(2, "0");
         break;
 
       // hours
-      case 'a':
+      case "a":
         // `am` or `pm`
-        char = (date.getHours() > 11) ? 'pm' : 'am';
+        char = date.getHours() > 11 ? "pm" : "am";
         break;
-      case 'g':
+      case "g":
         // `1` through `12`
         hours = date.getHours();
-        if (hours === 0) char = '12';
+        if (hours === 0) char = "12";
         else if (hours > 12) char = (hours - 12).toString();
         else char = hours.toString();
         break;
-      case 'h':
+      case "h":
         // `01` through `12`
         hours = date.getHours();
-        if (hours === 0) char = '12';
+        if (hours === 0) char = "12";
         else if (hours > 12) char = (hours - 12).toString();
         else char = hours.toString();
 
-        char = char.padStart(2, '0');
+        char = char.padStart(2, "0");
         break;
-      case 'A':
+      case "A":
         // `AM` or `PM`
-        char = (date.getHours() > 11) ? 'PM' : 'AM';
+        char = date.getHours() > 11 ? "PM" : "AM";
         break;
-      case 'G':
+      case "G":
         // `0` through `23`
         char = date.getHours().toString();
         break;
-      case 'H':
+      case "H":
         // `00` through `23`
-        char = date.getHours().toString().padStart(2, '0');
+        char = date.getHours().toString().padStart(2, "0");
         break;
 
       // day
-      case 'd':
+      case "d":
         // `01` through `31`
-        char = date.getDate().toString().padStart(2, '0');
+        char = date.getDate().toString().padStart(2, "0");
         break;
-      case 'j':
+      case "j":
         // `1` through `31`
         char = date.getDate().toString();
         break;
-      case 'l':
+      case "l":
         // `Monday` through `Sunday` (localized)
-        char = Language.get('__days')[date.getDay()];
+        char = Language.get("__days")[date.getDay()];
         break;
-      case 'D':
+      case "D":
         // `Mon` through `Sun` (localized)
-        char = Language.get('__daysShort')[date.getDay()];
+        char = Language.get("__daysShort")[date.getDay()];
         break;
-      case 'S':
+      case "S":
         // ignore english ordinal suffix
-        char = '';
+        char = "";
         break;
 
       // month
-      case 'm':
+      case "m":
         // `01` through `12`
-        char = (date.getMonth() + 1).toString().padStart(2, '0');
+        char = (date.getMonth() + 1).toString().padStart(2, "0");
         break;
-      case 'n':
+      case "n":
         // `1` through `12`
         char = (date.getMonth() + 1).toString();
         break;
-      case 'F':
+      case "F":
         // `January` through `December` (localized)
-        char = Language.get('__months')[date.getMonth()];
+        char = Language.get("__months")[date.getMonth()];
         break;
-      case 'M':
+      case "M":
         // `Jan` through `Dec` (localized)
-        char = Language.get('__monthsShort')[date.getMonth()];
+        char = Language.get("__monthsShort")[date.getMonth()];
         break;
 
       // year
-      case 'y':
+      case "y":
         // `00` through `99`
         char = date.getFullYear().toString().substr(2);
         break;
-      case 'Y':
+      case "Y":
         // Examples: `1988` or `2015`
         char = date.getFullYear().toString();
         break;
 
       // timezone
-      case 'P':
+      case "P":
         let offset = date.getTimezoneOffset();
-        char = (offset > 0) ? '-' : '+';
+        char = offset > 0 ? "-" : "+";
 
         offset = Math.abs(offset);
 
-        char += ('0' + (~~(offset / 60)).toString()).slice(-2);
-        char += ':';
-        char += ('0' + (offset % 60).toString()).slice(-2);
+        char += ("0" + (~~(offset / 60)).toString()).slice(-2);
+        char += ":";
+        char += ("0" + (offset % 60).toString()).slice(-2);
 
         break;
 
       // specials
-      case 'r':
+      case "r":
         char = date.toString();
         break;
-      case 'U':
+      case "U":
         char = Math.round(date.getTime() / 1000).toString();
         break;
 
       // escape sequence
-      case '\\':
-        char = '';
+      case "\\":
+        char = "";
         if (i + 1 < length) {
           char = format[++i];
         }
@@ -195,14 +195,16 @@ export function gmdate(date: Date): number {
     date = new Date();
   }
 
-  return Math.round(Date.UTC(
-    date.getUTCFullYear(),
-    date.getUTCMonth(),
-    date.getUTCDay(),
-    date.getUTCHours(),
-    date.getUTCMinutes(),
-    date.getUTCSeconds(),
-  ) / 1000);
+  return Math.round(
+    Date.UTC(
+      date.getUTCFullYear(),
+      date.getUTCMonth(),
+      date.getUTCDay(),
+      date.getUTCHours(),
+      date.getUTCMinutes(),
+      date.getUTCSeconds()
+    ) / 1000
+  );
 }
 
 /**
@@ -214,24 +216,24 @@ export function gmdate(date: Date): number {
  * (for dates not in the future) after the DOM change listener has been triggered.
  */
 export function getTimeElement(date: Date): HTMLElement {
-  const time = document.createElement('time');
-  time.className = 'datetime';
+  const time = document.createElement("time");
+  time.className = "datetime";
 
   const formattedDate = formatDate(date);
   const formattedTime = formatTime(date);
 
-  time.setAttribute('datetime', format(date, 'c'));
+  time.setAttribute("datetime", format(date, "c"));
   time.dataset.timestamp = ((date.getTime() - date.getMilliseconds()) / 1_000).toString();
   time.dataset.date = formattedDate;
   time.dataset.time = formattedTime;
   time.dataset.offset = (date.getTimezoneOffset() * 60).toString(); // PHP returns minutes, JavaScript returns seconds
 
   if (date.getTime() > Date.now()) {
-    time.dataset.isFutureDate = 'true';
+    time.dataset.isFutureDate = "true";
 
-    time.textContent = Language.get('wcf.date.dateTimeFormat')
-      .replace('%time%', formattedTime)
-      .replace('%date%', formattedDate);
+    time.textContent = Language.get("wcf.date.dateTimeFormat")
+      .replace("%time%", formattedTime)
+      .replace("%date%", formattedDate);
   }
 
   return time;
@@ -244,5 +246,5 @@ export function getTimezoneDate(timestamp: number, offset: number): Date {
   const date = new Date(timestamp);
   const localOffset = date.getTimezoneOffset() * 60_000;
 
-  return new Date((timestamp + localOffset + offset));
+  return new Date(timestamp + localOffset + offset);
 }
index 4463c3fd52ca5c4d3f8c726090fb93ef17502dea..aca831d0417b01510588aedad2b1b5ef467dd30e 100644 (file)
@@ -15,7 +15,7 @@ let _settings = {
 
 function _updateConfig() {
   if (window.sessionStorage) {
-    window.sessionStorage.setItem('__wsc_devtools_config', JSON.stringify(_settings));
+    window.sessionStorage.setItem("__wsc_devtools_config", JSON.stringify(_settings));
   }
 }
 
@@ -24,20 +24,20 @@ const Devtools = {
    * Prints the list of available commands.
    */
   help(): void {
-    window.console.log('');
-    window.console.log('%cAvailable commands:', 'text-decoration: underline');
+    window.console.log("");
+    window.console.log("%cAvailable commands:", "text-decoration: underline");
 
     const commands: string[] = [];
     for (const cmd in Devtools) {
-      if (cmd !== '_internal_' && Devtools.hasOwnProperty(cmd)) {
+      if (cmd !== "_internal_" && Devtools.hasOwnProperty(cmd)) {
         commands.push(cmd);
       }
     }
     commands.sort().forEach(function (cmd) {
-      window.console.log('\tDevtools.' + cmd + '()');
+      window.console.log("\tDevtools." + cmd + "()");
     });
 
-    window.console.log('');
+    window.console.log("");
   },
 
   /**
@@ -47,7 +47,10 @@ const Devtools = {
     _settings.editorAutosave = forceDisable ? false : !_settings.editorAutosave;
     _updateConfig();
 
-    window.console.log('%c\tEditor autosave ' + (_settings.editorAutosave ? 'enabled' : 'disabled'), 'font-style: italic');
+    window.console.log(
+      "%c\tEditor autosave " + (_settings.editorAutosave ? "enabled" : "disabled"),
+      "font-style: italic"
+    );
   },
 
   /**
@@ -57,7 +60,7 @@ const Devtools = {
     _settings.eventLogging = forceEnable ? true : !_settings.eventLogging;
     _updateConfig();
 
-    window.console.log('%c\tEvent logging ' + (_settings.eventLogging ? 'enabled' : 'disabled'), 'font-style: italic');
+    window.console.log("%c\tEvent logging " + (_settings.eventLogging ? "enabled" : "disabled"), "font-style: italic");
   },
 
   /**
@@ -67,23 +70,22 @@ const Devtools = {
     enable(): void {
       window.Devtools = Devtools;
 
-      window.console.log('%cDevtools for WoltLab Suite loaded', 'font-weight: bold');
+      window.console.log("%cDevtools for WoltLab Suite loaded", "font-weight: bold");
 
       if (window.sessionStorage) {
-        const settings = window.sessionStorage.getItem('__wsc_devtools_config');
+        const settings = window.sessionStorage.getItem("__wsc_devtools_config");
         try {
           if (settings !== null) {
             _settings = JSON.parse(settings);
           }
-        } catch (e) {
-        }
+        } catch (e) {}
 
         if (!_settings.editorAutosave) Devtools.toggleEditorAutosave(true);
         if (_settings.eventLogging) Devtools.toggleEventLogging(true);
       }
 
-      window.console.log('Settings are saved per browser session, enter `Devtools.help()` to learn more.');
-      window.console.log('');
+      window.console.log("Settings are saved per browser session, enter `Devtools.help()` to learn more.");
+      window.console.log("");
     },
 
     editorAutosave(): boolean {
@@ -92,7 +94,7 @@ const Devtools = {
 
     eventLog(identifier: string, action: string): void {
       if (_settings.eventLogging) {
-        window.console.log('[Devtools.EventLogging] Firing event: ' + action + ' @ ' + identifier);
+        window.console.log("[Devtools.EventLogging] Firing event: " + action + " @ " + identifier);
       }
     },
   },
index ac85fcb39ad1906eaeda976515c50129ca3ffdff..be316efbe8c550d58f58d63f8e5e7e5a5853db71 100644 (file)
@@ -50,8 +50,8 @@ class Dictionary {
    * value as first parameter and the key name second.
    */
   forEach(callback: (value: any, key: string) => void): void {
-    if (typeof callback !== 'function') {
-      throw new TypeError('forEach() expects a callback as first parameter.');
+    if (typeof callback !== "function") {
+      throw new TypeError("forEach() expects a callback as first parameter.");
     }
 
     this._dictionary.forEach(callback);
@@ -73,7 +73,7 @@ class Dictionary {
    */
   toObject(): object {
     const object = {};
-    this._dictionary.forEach((value, key) => object[key] = value);
+    this._dictionary.forEach((value, key) => (object[key] = value));
 
     return object;
   }
index 95dbaf2e082052b6ad60cc957c433c77aa531886..6cce555ebd99385b0a15e9b7e92e98cfc58ea74f 100644 (file)
@@ -9,7 +9,7 @@
  * @module  WoltLabSuite/Core/Dom/Change/Listener
  */
 
-import CallbackList from '../../CallbackList';
+import CallbackList from "../../CallbackList";
 
 const _callbackList = new CallbackList();
 let _hot = false;
@@ -36,11 +36,11 @@ const DomChangeListener = {
 
     try {
       _hot = true;
-      _callbackList.forEach(null, callback => callback());
+      _callbackList.forEach(null, (callback) => callback());
     } finally {
       _hot = false;
     }
   },
 };
 
-export = DomChangeListener
+export = DomChangeListener;
index 4ae5e7cf7f5f5ce013e77efb90bc95ca6085e326..8c76750f515bafa3487047b56b29bd41578e7e56 100644 (file)
@@ -24,7 +24,7 @@ const _test = new Map<Type, (...args: any[]) => boolean>([
 
 function _getChildren(element: Element, type: Type, value: string): Element[] {
   if (!(element instanceof Element)) {
-    throw new TypeError('Expected a valid element as first argument.');
+    throw new TypeError("Expected a valid element as first argument.");
   }
 
   const children: Element[] = [];
@@ -39,7 +39,7 @@ function _getChildren(element: Element, type: Type, value: string): Element[] {
 
 function _getParent(element: Element, type: Type, value: string, untilElement?: Element): Element | null {
   if (!(element instanceof Element)) {
-    throw new TypeError('Expected a valid element as first argument.');
+    throw new TypeError("Expected a valid element as first argument.");
   }
 
   let target = element.parentNode;
@@ -60,7 +60,7 @@ function _getParent(element: Element, type: Type, value: string, untilElement?:
 
 function _getSibling(element: Element, siblingType: string, type: Type, value: string): Element | null {
   if (!(element instanceof Element)) {
-    throw new TypeError('Expected a valid element as first argument.');
+    throw new TypeError("Expected a valid element as first argument.");
   }
 
   if (element instanceof Element) {
@@ -141,28 +141,28 @@ export function parentByTag(element: Element, tagName: string, untilElement?: El
  * @deprecated 5.4 Use `element.nextElementSibling` instead.
  */
 export function next(element: Element): Element | null {
-  return _getSibling(element, 'nextElementSibling', Type.None, '');
+  return _getSibling(element, "nextElementSibling", Type.None, "");
 }
 
 /**
  * Returns the next element sibling that matches the given selector.
  */
 export function nextBySel(element: Element, selector: string): Element | null {
-  return _getSibling(element, 'nextElementSibling', Type.Selector, selector);
+  return _getSibling(element, "nextElementSibling", Type.Selector, selector);
 }
 
 /**
  * Returns the next element sibling with given CSS class.
  */
 export function nextByClass(element: Element, className: string): Element | null {
-  return _getSibling(element, 'nextElementSibling', Type.ClassName, className);
+  return _getSibling(element, "nextElementSibling", Type.ClassName, className);
 }
 
 /**
  * Returns the next element sibling with given CSS class.
  */
 export function nextByTag(element: Element, tagName: string): Element | null {
-  return _getSibling(element, 'nextElementSibling', Type.TagName, tagName);
+  return _getSibling(element, "nextElementSibling", Type.TagName, tagName);
 }
 
 /**
@@ -171,26 +171,26 @@ export function nextByTag(element: Element, tagName: string): Element | null {
  * @deprecated 5.4 Use `element.previousElementSibling` instead.
  */
 export function prev(element: Element): Element | null {
-  return _getSibling(element, 'previousElementSibling', Type.None, '');
+  return _getSibling(element, "previousElementSibling", Type.None, "");
 }
 
 /**
  * Returns the previous element sibling that matches the given selector.
  */
 export function prevBySel(element: Element, selector: string): Element | null {
-  return _getSibling(element, 'previousElementSibling', Type.Selector, selector);
+  return _getSibling(element, "previousElementSibling", Type.Selector, selector);
 }
 
 /**
  * Returns the previous element sibling with given CSS class.
  */
 export function prevByClass(element: Element, className: string): Element | null {
-  return _getSibling(element, 'previousElementSibling', Type.ClassName, className);
+  return _getSibling(element, "previousElementSibling", Type.ClassName, className);
 }
 
 /**
  * Returns the previous element sibling with given CSS class.
  */
 export function prevByTag(element: Element, tagName: string): Element | null {
-  return _getSibling(element, 'previousElementSibling', Type.TagName, tagName);
+  return _getSibling(element, "previousElementSibling", Type.TagName, tagName);
 }
index 5d9d089fbf25a850f7cd1380451ec8d0b3500e1d..6af47fae37bcbfefec77726bdb0b69553e7b89eb 100644 (file)
@@ -8,23 +8,23 @@
  * @module  WoltLabSuite/Core/Dom/Util
  */
 
-import * as StringUtil from '../StringUtil';
+import * as StringUtil from "../StringUtil";
 
 function _isBoundaryNode(element: Element, ancestor: Element, position: string): boolean {
   if (!ancestor.contains(element)) {
-    throw new Error('Ancestor element does not contain target element.');
+    throw new Error("Ancestor element does not contain target element.");
   }
 
   let node: Node;
   let target: Node | null = element;
-  const whichSibling = position + 'Sibling';
+  const whichSibling = position + "Sibling";
   while (target !== null && target !== ancestor) {
-    if (target[position + 'ElementSibling'] !== null) {
+    if (target[position + "ElementSibling"] !== null) {
       return false;
     } else if (target[whichSibling]) {
       node = target[whichSibling];
       while (node) {
-        if (node.textContent!.trim() !== '') {
+        if (node.textContent!.trim() !== "") {
           return false;
         }
 
@@ -45,7 +45,7 @@ const DomUtil = {
    * Returns a DocumentFragment containing the provided HTML string as DOM nodes.
    */
   createFragmentFromHtml(html: string): DocumentFragment {
-    const tmp = document.createElement('div');
+    const tmp = document.createElement("div");
     this.setInnerHtml(tmp, html);
 
     const fragment = document.createDocumentFragment();
@@ -63,9 +63,8 @@ const DomUtil = {
     let elementId: string;
 
     do {
-      elementId = 'wcf' + _idCounter++;
-    }
-    while (document.getElementById(elementId) !== null);
+      elementId = "wcf" + _idCounter++;
+    } while (document.getElementById(elementId) !== null);
 
     return elementId;
   },
@@ -76,7 +75,7 @@ const DomUtil = {
    */
   identify(element: Element): string {
     if (!(element instanceof Element)) {
-      throw new TypeError('Expected a valid DOM element as argument.');
+      throw new TypeError("Expected a valid DOM element as argument.");
     }
 
     let id = element.id;
@@ -145,7 +144,7 @@ const DomUtil = {
    * @deprecated 5.3 Use `parent.insertAdjacentElement('afterbegin', element)` instead.
    */
   prepend(element: Element, parent: Element): void {
-    parent.insertAdjacentElement('afterbegin', element);
+    parent.insertAdjacentElement("afterbegin", element);
   },
 
   /**
@@ -154,7 +153,7 @@ const DomUtil = {
    * @deprecated 5.3 Use `element.insertAdjacentElement('afterend', newElement)` instead.
    */
   insertAfter(newElement: Element, element: Element): void {
-    element.insertAdjacentElement('afterend', newElement);
+    element.insertAdjacentElement("afterend", newElement);
   },
 
   /**
@@ -167,7 +166,7 @@ const DomUtil = {
         if (/ !important$/.test(styles[property])) {
           important = true;
 
-          styles[property] = styles[property].replace(/ !important$/, '');
+          styles[property] = styles[property].replace(/ !important$/, "");
         } else {
           important = false;
         }
@@ -175,11 +174,11 @@ const DomUtil = {
         // for a set style property with priority = important, some browsers are
         // not able to overwrite it with a property != important; removing the
         // property first solves this issue
-        if (element.style.getPropertyPriority(property) === 'important' && !important) {
+        if (element.style.getPropertyPriority(property) === "important" && !important) {
           element.style.removeProperty(property);
         }
 
-        element.style.setProperty(property, styles[property], (important ? 'important' : ''));
+        element.style.setProperty(property, styles[property], important ? "important" : "");
       }
     }
   },
@@ -209,10 +208,10 @@ const DomUtil = {
   setInnerHtml(element: Element, innerHtml: string): void {
     element.innerHTML = innerHtml;
 
-    const scripts = element.querySelectorAll<HTMLScriptElement>('script');
+    const scripts = element.querySelectorAll<HTMLScriptElement>("script");
     for (let i = 0, length = scripts.length; i < length; i++) {
       const script = scripts[i];
-      const newScript = document.createElement('script');
+      const newScript = document.createElement("script");
       if (script.src) {
         newScript.src = script.src;
       } else {
@@ -231,7 +230,7 @@ const DomUtil = {
    * @param insertMethod
    */
   insertHtml(html: string, referenceElement: Element, insertMethod: string): void {
-    const element = document.createElement('div');
+    const element = document.createElement("div");
     this.setInnerHtml(element, html);
 
     if (!element.childNodes.length) {
@@ -240,28 +239,28 @@ const DomUtil = {
 
     let node = element.childNodes[0] as Element;
     switch (insertMethod) {
-      case 'append':
+      case "append":
         referenceElement.appendChild(node);
         break;
 
-      case 'after':
+      case "after":
         this.insertAfter(node, referenceElement);
         break;
 
-      case 'prepend':
+      case "prepend":
         this.prepend(node, referenceElement);
         break;
 
-      case 'before':
+      case "before":
         if (referenceElement.parentNode === null) {
-          throw new Error('The reference element has no parent, but the insert position was set to \'before\'.');
+          throw new Error("The reference element has no parent, but the insert position was set to 'before'.");
         }
 
         referenceElement.parentNode.insertBefore(node, referenceElement);
         break;
 
       default:
-        throw new Error('Unknown insert method \'' + insertMethod + '\'.');
+        throw new Error("Unknown insert method '" + insertMethod + "'.");
     }
 
     let tmp;
@@ -289,25 +288,30 @@ const DomUtil = {
    *
    * @deprecated 5.4 Use `element.dataset` instead.
    */
-  getDataAttributes(element: Element, prefix?: string, camelCaseName?: boolean, idToUpperCase?: boolean): DataAttributes {
-    prefix = prefix || '';
-    if (prefix.indexOf('data-') !== 0) prefix = 'data-' + prefix;
-    camelCaseName = (camelCaseName === true);
-    idToUpperCase = (idToUpperCase === true);
+  getDataAttributes(
+    element: Element,
+    prefix?: string,
+    camelCaseName?: boolean,
+    idToUpperCase?: boolean
+  ): DataAttributes {
+    prefix = prefix || "";
+    if (prefix.indexOf("data-") !== 0) prefix = "data-" + prefix;
+    camelCaseName = camelCaseName === true;
+    idToUpperCase = idToUpperCase === true;
 
     const attributes = {};
     for (let i = 0, length = element.attributes.length; i < length; i++) {
       const attribute = element.attributes[i];
 
       if (attribute.name.indexOf(prefix) === 0) {
-        let name = attribute.name.replace(new RegExp('^' + prefix), '');
+        let name = attribute.name.replace(new RegExp("^" + prefix), "");
         if (camelCaseName) {
-          let tmp = name.split('-');
-          name = '';
+          let tmp = name.split("-");
+          name = "";
           for (let j = 0, innerLength = tmp.length; j < innerLength; j++) {
             if (name.length) {
-              if (idToUpperCase && tmp[j] === 'id') {
-                tmp[j] = 'ID';
+              if (idToUpperCase && tmp[j] === "id") {
+                tmp[j] = "ID";
               } else {
                 tmp[j] = StringUtil.ucfirst(tmp[j]);
               }
@@ -331,7 +335,7 @@ const DomUtil = {
    */
   unwrapChildNodes(element: Element): void {
     if (element.parentNode === null) {
-      throw new Error('The element has no parent.');
+      throw new Error("The element has no parent.");
     }
 
     let parent = element.parentNode;
@@ -349,7 +353,7 @@ const DomUtil = {
    */
   replaceElement(oldElement: Element, newElement: Element): void {
     if (oldElement.parentNode === null) {
-      throw new Error('The old element has no parent.');
+      throw new Error("The old element has no parent.");
     }
 
     while (oldElement.childNodes.length) {
@@ -365,7 +369,7 @@ const DomUtil = {
    * a node without any content nor elements before it or its parent nodes.
    */
   isAtNodeStart(element: Element, ancestor: Element): boolean {
-    return _isBoundaryNode(element, ancestor, 'previous');
+    return _isBoundaryNode(element, ancestor, "previous");
   },
 
   /**
@@ -373,7 +377,7 @@ const DomUtil = {
    * a node without any content nor elements after it or its parent nodes.
    */
   isAtNodeEnd(element: Element, ancestor: Element): boolean {
-    return _isBoundaryNode(element, ancestor, 'next');
+    return _isBoundaryNode(element, ancestor, "next");
   },
 
   /**
@@ -384,7 +388,7 @@ const DomUtil = {
    */
   getFixedParent(element: HTMLElement): Element | null {
     while (element && element !== document.body) {
-      if (window.getComputedStyle(element).getPropertyValue('position') === 'fixed') {
+      if (window.getComputedStyle(element).getPropertyValue("position") === "fixed") {
         return element;
       }
 
@@ -398,14 +402,14 @@ const DomUtil = {
    * Shorthand function to hide an element by setting its 'display' value to 'none'.
    */
   hide(element: HTMLElement): void {
-    element.style.setProperty('display', 'none', '');
+    element.style.setProperty("display", "none", "");
   },
 
   /**
    * Shorthand function to show an element previously hidden by using `hide()`.
    */
   show(element: HTMLElement): void {
-    element.style.removeProperty('display');
+    element.style.removeProperty("display");
   },
 
   /**
@@ -413,7 +417,7 @@ const DomUtil = {
    * value to 'none'.
    */
   isHidden(element: HTMLElement): boolean {
-    return element.style.getPropertyValue('display') === 'none';
+    return element.style.getPropertyValue("display") === "none";
   },
 
   /**
@@ -422,35 +426,37 @@ const DomUtil = {
   innerError(element: HTMLElement, errorMessage?: string | false | null, isHtml?: boolean): HTMLElement | null {
     const parent = element.parentNode;
     if (parent === null) {
-      throw new Error('Only elements that have a parent element or document are valid.');
+      throw new Error("Only elements that have a parent element or document are valid.");
     }
 
-    if (typeof errorMessage !== 'string') {
+    if (typeof errorMessage !== "string") {
       if (!errorMessage) {
-        errorMessage = '';
+        errorMessage = "";
       } else {
-        throw new TypeError('The error message must be a string; `false`, `null` or `undefined` can be used as a substitute for an empty string.');
+        throw new TypeError(
+          "The error message must be a string; `false`, `null` or `undefined` can be used as a substitute for an empty string."
+        );
       }
     }
 
     let innerError = element.nextElementSibling;
-    if (innerError === null || innerError.nodeName !== 'SMALL' || !innerError.classList.contains('innerError')) {
-      if (errorMessage === '') {
+    if (innerError === null || innerError.nodeName !== "SMALL" || !innerError.classList.contains("innerError")) {
+      if (errorMessage === "") {
         innerError = null;
       } else {
-        innerError = document.createElement('small');
-        innerError.className = 'innerError';
+        innerError = document.createElement("small");
+        innerError.className = "innerError";
         parent.insertBefore(innerError, element.nextSibling);
       }
     }
 
-    if (errorMessage === '') {
+    if (errorMessage === "") {
       if (innerError !== null) {
         innerError.remove();
         innerError = null;
       }
     } else {
-      innerError![isHtml ? 'innerHTML' : 'textContent'] = errorMessage;
+      innerError![isHtml ? "innerHTML" : "textContent"] = errorMessage;
     }
 
     return innerError as HTMLElement | null;
index 69cbe9b286f46935aa3f59151f0a37a81c7639a4..fbfba80d4716a177d20742be45527bd511f9827b 100644 (file)
@@ -8,59 +8,62 @@
  * @module  WoltLabSuite/Core/Environment
  */
 
-let _browser = 'other';
-let _editor = 'none';
-let _platform = 'desktop';
+let _browser = "other";
+let _editor = "none";
+let _platform = "desktop";
 let _touch = false;
 
 /**
  * Determines environment variables.
  */
 export function setup(): void {
-  if (typeof (window as any).chrome === 'object') {
+  if (typeof (window as any).chrome === "object") {
     // this detects Opera as well, we could check for window.opr if we need to
-    _browser = 'chrome';
+    _browser = "chrome";
   } else {
     const styles = window.getComputedStyle(document.documentElement);
     for (let i = 0, length = styles.length; i < length; i++) {
       const property = styles[i];
 
-      if (property.indexOf('-ms-') === 0) {
+      if (property.indexOf("-ms-") === 0) {
         // it is tempting to use 'msie', but it wouldn't really represent 'Edge'
-        _browser = 'microsoft';
-      } else if (property.indexOf('-moz-') === 0) {
-        _browser = 'firefox';
-      } else if (_browser !== 'firefox' && property.indexOf('-webkit-') === 0) {
-        _browser = 'safari';
+        _browser = "microsoft";
+      } else if (property.indexOf("-moz-") === 0) {
+        _browser = "firefox";
+      } else if (_browser !== "firefox" && property.indexOf("-webkit-") === 0) {
+        _browser = "safari";
       }
     }
   }
 
   const ua = window.navigator.userAgent.toLowerCase();
-  if (ua.indexOf('crios') !== -1) {
-    _browser = 'chrome';
-    _platform = 'ios';
+  if (ua.indexOf("crios") !== -1) {
+    _browser = "chrome";
+    _platform = "ios";
   } else if (/(?:iphone|ipad|ipod)/.test(ua)) {
-    _browser = 'safari';
-    _platform = 'ios';
-  } else if (ua.indexOf('android') !== -1) {
-    _platform = 'android';
-  } else if (ua.indexOf('iemobile') !== -1) {
-    _browser = 'microsoft';
-    _platform = 'windows';
+    _browser = "safari";
+    _platform = "ios";
+  } else if (ua.indexOf("android") !== -1) {
+    _platform = "android";
+  } else if (ua.indexOf("iemobile") !== -1) {
+    _browser = "microsoft";
+    _platform = "windows";
   }
 
-  if (_platform === 'desktop' && (ua.indexOf('mobile') !== -1 || ua.indexOf('tablet') !== -1)) {
-    _platform = 'mobile';
+  if (_platform === "desktop" && (ua.indexOf("mobile") !== -1 || ua.indexOf("tablet") !== -1)) {
+    _platform = "mobile";
   }
 
-  _editor = 'redactor';
-  _touch = (('ontouchstart' in window) || (('msMaxTouchPoints' in window.navigator) && window.navigator.msMaxTouchPoints > 0) || (window as any).DocumentTouch && document instanceof (window as any).DocumentTouch);
+  _editor = "redactor";
+  _touch =
+    "ontouchstart" in window ||
+    ("msMaxTouchPoints" in window.navigator && window.navigator.msMaxTouchPoints > 0) ||
+    ((window as any).DocumentTouch && document instanceof (window as any).DocumentTouch);
 
   // The iPad Pro 12.9" masquerades as a desktop browser.
-  if (window.navigator.platform === 'MacIntel' && window.navigator.maxTouchPoints > 1) {
-    _browser = 'safari';
-    _platform = 'ios';
+  if (window.navigator.platform === "MacIntel" && window.navigator.maxTouchPoints > 1) {
+    _browser = "safari";
+    _platform = "ios";
   }
 }
 
index f958343a13f71d73a9179d51577069b2731d31a8..3caf413c7d48a3da98fb36eb3eae783d11f3b86f 100644 (file)
@@ -8,8 +8,8 @@
  * @module  WoltLabSuite/Core/Event/Handler
  */
 
-import * as Core from '../Core';
-import Devtools from '../Devtools';
+import * as Core from "../Core";
+import Devtools from "../Devtools";
 
 type Identifier = string;
 type Action = string;
@@ -20,7 +20,7 @@ const _listeners = new Map<Identifier, Map<Action, Map<Uuid, Callback>>>();
  * Registers an event listener.
  */
 export function add(identifier: Identifier, action: Action, callback: Callback): Uuid {
-  if (typeof callback !== 'function') {
+  if (typeof callback !== "function") {
     throw new TypeError(`Expected a valid callback for '${action}'@'${identifier}'.`);
   }
 
@@ -50,18 +50,17 @@ export function fire(identifier: Identifier, action: Action, data?: object): voi
 
   data = data || {};
 
-  _listeners.get(identifier)
+  _listeners
+    .get(identifier)
     ?.get(action)
-    ?.forEach(callback => callback(data));
+    ?.forEach((callback) => callback(data));
 }
 
 /**
  * Removes an event listener, requires the uuid returned by add().
  */
 export function remove(identifier: Identifier, action: Action, uuid: Uuid): void {
-  _listeners.get(identifier)
-    ?.get(action)
-    ?.delete(uuid);
+  _listeners.get(identifier)?.get(action)?.delete(uuid);
 }
 
 /**
@@ -69,7 +68,7 @@ export function remove(identifier: Identifier, action: Action, uuid: Uuid): void
  * remove all listeners for this identifier.
  */
 export function removeAll(identifier: Identifier, action?: Action): void {
-  if (typeof action !== 'string') action = undefined;
+  if (typeof action !== "string") action = undefined;
 
   const actions = _listeners.get(identifier);
   if (actions === undefined) {
@@ -93,7 +92,7 @@ export function removeAllBySuffix(identifier: Identifier, suffix: string): void
     return;
   }
 
-  suffix = '_' + suffix;
+  suffix = "_" + suffix;
   const length = suffix.length * -1;
   actions.forEach((callbacks, action) => {
     if (action.substr(length) === suffix) {
index b7741afc243b4a86fc9df80f9ce96813259701ac..e6f1000917ce7e5be54208c2a1626f2254e7ecb0 100644 (file)
@@ -23,7 +23,7 @@ function _test(event: KeyboardEvent, key: string, which: number) {
  * @deprecated 5.4 Use `event.key === "ArrowDown"` instead.
  */
 export function ArrowDown(event: KeyboardEvent): boolean {
-  return _test(event, 'ArrowDown', 40);
+  return _test(event, "ArrowDown", 40);
 }
 
 /**
@@ -32,7 +32,7 @@ export function ArrowDown(event: KeyboardEvent): boolean {
  * @deprecated 5.4 Use `event.key === "ArrowLeft"` instead.
  */
 export function ArrowLeft(event: KeyboardEvent): boolean {
-  return _test(event, 'ArrowLeft', 37);
+  return _test(event, "ArrowLeft", 37);
 }
 
 /**
@@ -41,7 +41,7 @@ export function ArrowLeft(event: KeyboardEvent): boolean {
  * @deprecated 5.4 Use `event.key === "ArrowRight"` instead.
  */
 export function ArrowRight(event: KeyboardEvent): boolean {
-  return _test(event, 'ArrowRight', 39);
+  return _test(event, "ArrowRight", 39);
 }
 
 /**
@@ -50,7 +50,7 @@ export function ArrowRight(event: KeyboardEvent): boolean {
  * @deprecated 5.4 Use `event.key === "ArrowUp"` instead.
  */
 export function ArrowUp(event: KeyboardEvent): boolean {
-  return _test(event, 'ArrowUp', 38);
+  return _test(event, "ArrowUp", 38);
 }
 
 /**
@@ -59,7 +59,7 @@ export function ArrowUp(event: KeyboardEvent): boolean {
  * @deprecated 5.4 Use `event.key === ","` instead.
  */
 export function Comma(event: KeyboardEvent): boolean {
-  return _test(event, ',', 44);
+  return _test(event, ",", 44);
 }
 
 /**
@@ -68,7 +68,7 @@ export function Comma(event: KeyboardEvent): boolean {
  * @deprecated 5.4 Use `event.key === "End"` instead.
  */
 export function End(event: KeyboardEvent): boolean {
-  return _test(event, 'End', 35);
+  return _test(event, "End", 35);
 }
 
 /**
@@ -77,7 +77,7 @@ export function End(event: KeyboardEvent): boolean {
  * @deprecated 5.4 Use `event.key === "Enter"` instead.
  */
 export function Enter(event: KeyboardEvent): boolean {
-  return _test(event, 'Enter', 13);
+  return _test(event, "Enter", 13);
 }
 
 /**
@@ -86,7 +86,7 @@ export function Enter(event: KeyboardEvent): boolean {
  * @deprecated 5.4 Use `event.key === "Escape"` instead.
  */
 export function Escape(event: KeyboardEvent): boolean {
-  return _test(event, 'Escape', 27);
+  return _test(event, "Escape", 27);
 }
 
 /**
@@ -95,7 +95,7 @@ export function Escape(event: KeyboardEvent): boolean {
  * @deprecated 5.4 Use `event.key === "Home"` instead.
  */
 export function Home(event: KeyboardEvent): boolean {
-  return _test(event, 'Home', 36);
+  return _test(event, "Home", 36);
 }
 
 /**
@@ -104,7 +104,7 @@ export function Home(event: KeyboardEvent): boolean {
  * @deprecated 5.4 Use `event.key === "Space"` instead.
  */
 export function Space(event: KeyboardEvent): boolean {
-  return _test(event, 'Space', 32);
+  return _test(event, "Space", 32);
 }
 
 /**
@@ -113,5 +113,5 @@ export function Space(event: KeyboardEvent): boolean {
  * @deprecated 5.4 Use `event.key === "Tab"` instead.
  */
 export function Tab(event: KeyboardEvent): boolean {
-  return _test(event, 'Tab', 9);
+  return _test(event, "Tab", 9);
 }
index 5dc855ca04ecd0fd28386426fd294e5267fe95a1..8c6399eeab47155bef396b0169e58d0839eecbdd 100644 (file)
  * @module  WoltLabSuite/Core/FileUtil
  */
 
-import * as StringUtil from './StringUtil';
-
-const _fileExtensionIconMapping = new Map<string, string>(Object.entries({
-  // archive
-  zip: 'archive',
-  rar: 'archive',
-  tar: 'archive',
-  gz: 'archive',
-
-  // audio
-  mp3: 'audio',
-  ogg: 'audio',
-  wav: 'audio',
-
-  // code
-  php: 'code',
-  html: 'code',
-  htm: 'code',
-  tpl: 'code',
-  js: 'code',
-
-  // excel
-  xls: 'excel',
-  ods: 'excel',
-  xlsx: 'excel',
-
-  // image
-  gif: 'image',
-  jpg: 'image',
-  jpeg: 'image',
-  png: 'image',
-  bmp: 'image',
-  webp: 'image',
-
-  // video
-  avi: 'video',
-  wmv: 'video',
-  mov: 'video',
-  mp4: 'video',
-  mpg: 'video',
-  mpeg: 'video',
-  flv: 'video',
-
-  // pdf
-  pdf: 'pdf',
-
-  // powerpoint
-  ppt: 'powerpoint',
-  pptx: 'powerpoint',
-
-  // text
-  txt: 'text',
-
-  // word
-  doc: 'word',
-  docx: 'word',
-  odt: 'word',
-}));
-
-const _mimeTypeExtensionMapping = new Map<string, string>(Object.entries({
-  // archive
-  'application/zip': 'zip',
-  'application/x-zip-compressed': 'zip',
-  'application/rar': 'rar',
-  'application/vnd.rar': 'rar',
-  'application/x-rar-compressed': 'rar',
-  'application/x-tar': 'tar',
-  'application/x-gzip': 'gz',
-  'application/gzip': 'gz',
-
-  // audio
-  'audio/mpeg': 'mp3',
-  'audio/mp3': 'mp3',
-  'audio/ogg': 'ogg',
-  'audio/x-wav': 'wav',
-
-  // code
-  'application/x-php': 'php',
-  'text/html': 'html',
-  'application/javascript': 'js',
-
-  // excel
-  'application/vnd.ms-excel': 'xls',
-  'application/vnd.oasis.opendocument.spreadsheet': 'ods',
-  'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'xlsx',
-
-  // image
-  'image/gif': 'gif',
-  'image/jpeg': 'jpg',
-  'image/png': 'png',
-  'image/x-ms-bmp': 'bmp',
-  'image/bmp': 'bmp',
-  'image/webp': 'webp',
-
-  // video
-  'video/x-msvideo': 'avi',
-  'video/x-ms-wmv': 'wmv',
-  'video/quicktime': 'mov',
-  'video/mp4': 'mp4',
-  'video/mpeg': 'mpg',
-  'video/x-flv': 'flv',
-
-  // pdf
-  'application/pdf': 'pdf',
-
-  // powerpoint
-  'application/vnd.ms-powerpoint': 'ppt',
-  'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'pptx',
-
-  // text
-  'text/plain': 'txt',
-
-  // word
-  'application/msword': 'doc',
-  'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',
-  'application/vnd.oasis.opendocument.text': 'odt',
-}));
+import * as StringUtil from "./StringUtil";
+
+const _fileExtensionIconMapping = new Map<string, string>(
+  Object.entries({
+    // archive
+    zip: "archive",
+    rar: "archive",
+    tar: "archive",
+    gz: "archive",
+
+    // audio
+    mp3: "audio",
+    ogg: "audio",
+    wav: "audio",
+
+    // code
+    php: "code",
+    html: "code",
+    htm: "code",
+    tpl: "code",
+    js: "code",
+
+    // excel
+    xls: "excel",
+    ods: "excel",
+    xlsx: "excel",
+
+    // image
+    gif: "image",
+    jpg: "image",
+    jpeg: "image",
+    png: "image",
+    bmp: "image",
+    webp: "image",
+
+    // video
+    avi: "video",
+    wmv: "video",
+    mov: "video",
+    mp4: "video",
+    mpg: "video",
+    mpeg: "video",
+    flv: "video",
+
+    // pdf
+    pdf: "pdf",
+
+    // powerpoint
+    ppt: "powerpoint",
+    pptx: "powerpoint",
+
+    // text
+    txt: "text",
+
+    // word
+    doc: "word",
+    docx: "word",
+    odt: "word",
+  })
+);
+
+const _mimeTypeExtensionMapping = new Map<string, string>(
+  Object.entries({
+    // archive
+    "application/zip": "zip",
+    "application/x-zip-compressed": "zip",
+    "application/rar": "rar",
+    "application/vnd.rar": "rar",
+    "application/x-rar-compressed": "rar",
+    "application/x-tar": "tar",
+    "application/x-gzip": "gz",
+    "application/gzip": "gz",
+
+    // audio
+    "audio/mpeg": "mp3",
+    "audio/mp3": "mp3",
+    "audio/ogg": "ogg",
+    "audio/x-wav": "wav",
+
+    // code
+    "application/x-php": "php",
+    "text/html": "html",
+    "application/javascript": "js",
+
+    // excel
+    "application/vnd.ms-excel": "xls",
+    "application/vnd.oasis.opendocument.spreadsheet": "ods",
+    "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": "xlsx",
+
+    // image
+    "image/gif": "gif",
+    "image/jpeg": "jpg",
+    "image/png": "png",
+    "image/x-ms-bmp": "bmp",
+    "image/bmp": "bmp",
+    "image/webp": "webp",
+
+    // video
+    "video/x-msvideo": "avi",
+    "video/x-ms-wmv": "wmv",
+    "video/quicktime": "mov",
+    "video/mp4": "mp4",
+    "video/mpeg": "mpg",
+    "video/x-flv": "flv",
+
+    // pdf
+    "application/pdf": "pdf",
+
+    // powerpoint
+    "application/vnd.ms-powerpoint": "ppt",
+    "application/vnd.openxmlformats-officedocument.presentationml.presentation": "pptx",
+
+    // text
+    "text/plain": "txt",
+
+    // word
+    "application/msword": "doc",
+    "application/vnd.openxmlformats-officedocument.wordprocessingml.document": "docx",
+    "application/vnd.oasis.opendocument.text": "odt",
+  })
+);
 
 /**
  * Formats the given filesize.
@@ -133,25 +137,25 @@ export function formatFilesize(byte: number, precision: number): string {
     precision = 2;
   }
 
-  let symbol = 'Byte';
+  let symbol = "Byte";
   if (byte >= 1000) {
     byte /= 1000;
-    symbol = 'kB';
+    symbol = "kB";
   }
   if (byte >= 1000) {
     byte /= 1000;
-    symbol = 'MB';
+    symbol = "MB";
   }
   if (byte >= 1000) {
     byte /= 1000;
-    symbol = 'GB';
+    symbol = "GB";
   }
   if (byte >= 1000) {
     byte /= 1000;
-    symbol = 'TB';
+    symbol = "TB";
   }
 
-  return StringUtil.formatNumeric(byte, -precision) + ' ' + symbol;
+  return StringUtil.formatNumeric(byte, -precision) + " " + symbol;
 }
 
 /**
@@ -161,7 +165,7 @@ export function formatFilesize(byte: number, precision: number): string {
  * will be returned by this method.
  */
 export function getIconNameByFilename(filename: string): string {
-  const lastDotPosition = filename.lastIndexOf('.');
+  const lastDotPosition = filename.lastIndexOf(".");
   if (lastDotPosition !== -1) {
     const extension = filename.substr(lastDotPosition + 1);
 
@@ -170,7 +174,7 @@ export function getIconNameByFilename(filename: string): string {
     }
   }
 
-  return '';
+  return "";
 }
 
 /**
@@ -178,13 +182,12 @@ export function getIconNameByFilename(filename: string): string {
  */
 export function getExtensionByMimeType(mimetype: string): string {
   if (_mimeTypeExtensionMapping.has(mimetype)) {
-    return '.' + _mimeTypeExtensionMapping.get(mimetype);
+    return "." + _mimeTypeExtensionMapping.get(mimetype);
   }
 
-  return '';
+  return "";
 }
 
-
 /**
  * Constructs a File object from a Blob
  *
@@ -195,5 +198,5 @@ export function getExtensionByMimeType(mimetype: string): string {
 export function blobToFile(blob: Blob, filename: string): File {
   const ext = getExtensionByMimeType(blob.type);
 
-  return new File([blob], filename + ext, {type: blob.type});
+  return new File([blob], filename + ext, { type: blob.type });
 }
index f88e1f4423b59705422f1ac85437a188a82eeb29..eef3242a3edd1b39e68af5b80617674a686d9bc2 100644 (file)
@@ -7,14 +7,14 @@
  * @module  WoltLabSuite/Core/I18n/Plural
  */
 
-import * as StringUtil from '../StringUtil';
+import * as StringUtil from "../StringUtil";
 
-const PLURAL_FEW = 'few';
-const PLURAL_MANY = 'many';
-const PLURAL_ONE = 'one';
-const PLURAL_OTHER = 'other';
-const PLURAL_TWO = 'two';
-const PLURAL_ZERO = 'zero';
+const PLURAL_FEW = "few";
+const PLURAL_MANY = "many";
+const PLURAL_ONE = "one";
+const PLURAL_OTHER = "other";
+const PLURAL_TWO = "two";
+const PLURAL_ZERO = "zero";
 
 const Plural = {
   /**
@@ -26,8 +26,8 @@ const Plural = {
     }
 
     // Fallback: handle unknown languages as English
-    if (typeof Plural[languageCode] !== 'function') {
-      languageCode = 'en';
+    if (typeof Plural[languageCode] !== "function") {
+      languageCode = "en";
     }
 
     const category = Plural[languageCode](value);
@@ -44,14 +44,14 @@ const Plural = {
    * @see    wcf\system\template\plugin\PluralFunctionTemplatePlugin::execute()
    */
   getCategoryFromTemplateParameters(parameters: object): string {
-    if (!parameters['value']) {
-      throw new Error('Missing parameter value');
+    if (!parameters["value"]) {
+      throw new Error("Missing parameter value");
     }
-    if (!parameters['other']) {
-      throw new Error('Missing parameter other');
+    if (!parameters["other"]) {
+      throw new Error("Missing parameter other");
     }
 
-    let value = parameters['value'];
+    let value = parameters["value"];
     if (Array.isArray(value)) {
       value = value.length;
     }
@@ -69,8 +69,8 @@ const Plural = {
     }
 
     const string = parameters[category];
-    if (string.indexOf('#') !== -1) {
-      return string.replace('#', StringUtil.formatNumeric(value));
+    if (string.indexOf("#") !== -1) {
+      return string.replace("#", StringUtil.formatNumeric(value));
     }
 
     return string;
@@ -81,7 +81,7 @@ const Plural = {
    */
   getF(n: number): number {
     const tmp = n.toString();
-    const pos = tmp.indexOf('.');
+    const pos = tmp.indexOf(".");
     if (pos === -1) {
       return 0;
     }
@@ -93,7 +93,7 @@ const Plural = {
    * `v` represents the number of digits of the fractional part (1.234 yields 3)
    */
   getV(n: number): number {
-    return n.toString().replace(/^[^.]*\.?/, '').length;
+    return n.toString().replace(/^[^.]*\.?/, "").length;
   },
 
   // Afrikaans
@@ -151,8 +151,7 @@ const Plural = {
   },
 
   // Tibetan
-  bo(n: number) {
-  },
+  bo(n: number) {},
 
   // Bosnian
   bs(n: number): string | undefined {
@@ -164,8 +163,11 @@ const Plural = {
     const fMod100 = f % 100;
 
     if ((v == 0 && mod10 == 1 && mod100 != 11) || (fMod10 == 1 && fMod100 != 11)) return PLURAL_ONE;
-    if ((v == 0 && mod10 >= 2 && mod10 <= 4 && mod100 >= 12 && mod100 <= 14)
-      || (fMod10 >= 2 && fMod10 <= 4 && fMod100 >= 12 && fMod100 <= 14)) return PLURAL_FEW;
+    if (
+      (v == 0 && mod10 >= 2 && mod10 <= 4 && mod100 >= 12 && mod100 <= 14) ||
+      (fMod10 >= 2 && fMod10 <= 4 && fMod100 >= 12 && fMod100 <= 14)
+    )
+      return PLURAL_FEW;
   },
 
   // Czech
@@ -274,23 +276,20 @@ const Plural = {
   },
 
   // Indonesian
-  id(n: number) {
-  },
+  id(n: number) {},
 
   // Icelandic
   is(n: number): string | undefined {
     const f = Plural.getF(n);
 
-    if (f === 0 && n % 10 === 1 && !(n % 100 === 11) || !(f === 0)) return PLURAL_ONE;
+    if ((f === 0 && n % 10 === 1 && !(n % 100 === 11)) || !(f === 0)) return PLURAL_ONE;
   },
 
   // Japanese
-  ja(n: number) {
-  },
+  ja(n: number) {},
 
   // Javanese
-  jv(n: number) {
-  },
+  jv(n: number) {},
 
   // Georgian
   ka(n: number): string | undefined {
@@ -303,8 +302,7 @@ const Plural = {
   },
 
   // Khmer
-  km(n: number) {
-  },
+  km(n: number) {},
 
   // Kannada
   kn(n: number): string | undefined {
@@ -312,8 +310,7 @@ const Plural = {
   },
 
   // Korean
-  ko(n: number) {
-  },
+  ko(n: number) {},
 
   // Kurdish
   ku(n: number): string | undefined {
@@ -331,8 +328,7 @@ const Plural = {
   },
 
   // Lao
-  lo(n: number) {
-  },
+  lo(n: number) {},
 
   // Lithuanian
   lt(n: number): string | undefined {
@@ -354,7 +350,8 @@ const Plural = {
     const fMod100 = f % 100;
 
     if (mod10 == 0 || (mod100 >= 11 && mod100 <= 19) || (v == 2 && fMod100 >= 11 && fMod100 <= 19)) return PLURAL_ZERO;
-    if ((mod10 == 1 && mod100 != 11) || (v == 2 && fMod10 == 1 && fMod100 != 11) || (v != 2 && fMod10 == 1)) return PLURAL_ONE;
+    if ((mod10 == 1 && mod100 != 11) || (v == 2 && fMod10 == 1 && fMod100 != 11) || (v != 2 && fMod10 == 1))
+      return PLURAL_ONE;
   },
 
   // Macedonian
@@ -367,21 +364,20 @@ const Plural = {
     if (n == 1) return PLURAL_ONE;
   },
 
-  // Mongolian 
+  // Mongolian
   mn(n: number): string | undefined {
     if (n == 1) return PLURAL_ONE;
   },
 
-  // Marathi 
+  // Marathi
   mr(n: number): string | undefined {
     if (n == 1) return PLURAL_ONE;
   },
 
-  // Malay 
-  ms(n: number) {
-  },
+  // Malay
+  ms(n: number) {},
 
-  // Maltese 
+  // Maltese
   mt(n: number): string | undefined {
     const mod100 = n % 100;
 
@@ -391,8 +387,7 @@ const Plural = {
   },
 
   // Burmese
-  my(n: number) {
-  },
+  my(n: number) {},
 
   // Norwegian
   no(n: number): string | undefined {
@@ -422,7 +417,11 @@ const Plural = {
 
     if (n == 1 && v == 0) return PLURAL_ONE;
     if (v == 0 && mod10 >= 2 && mod10 <= 4 && !(mod100 >= 12 && mod100 <= 14)) return PLURAL_FEW;
-    if (v == 0 && ((n != 1 && mod10 >= 0 && mod10 <= 1) || (mod10 >= 5 && mod10 <= 9) || (mod100 >= 12 && mod100 <= 14))) return PLURAL_MANY;
+    if (
+      v == 0 &&
+      ((n != 1 && mod10 >= 0 && mod10 <= 1) || (mod10 >= 5 && mod10 <= 9) || (mod100 >= 12 && mod100 <= 14))
+    )
+      return PLURAL_MANY;
   },
 
   // Pashto
@@ -504,12 +503,10 @@ const Plural = {
   },
 
   // Tajik
-  tg(n: number) {
-  },
+  tg(n: number) {},
 
   // Thai
-  th(n: number) {
-  },
+  th(n: number) {},
 
   // Turkmen
   tk(n: number): string | undefined {
@@ -538,12 +535,10 @@ const Plural = {
   },
 
   // Vietnamese
-  vi(n: number) {
-  },
+  vi(n: number) {},
 
   // Chinese
-  zh(n: number) {
-  },
+  zh(n: number) {},
 };
 
-export = Plural
+export = Plural;
index b34e46d7610075a496d246695f7b8143203ee548..3c59a8134f68429fa3c168c1c280b3d4dd2ee573 100644 (file)
@@ -8,7 +8,7 @@
  * @module  WoltLabSuite/Core/Language
  */
 
-import Template from './Template';
+import Template from "./Template";
 
 const _languageItems = new Map<string, string | Template>();
 
@@ -16,7 +16,7 @@ const _languageItems = new Map<string, string | Template>();
  * Adds all the language items in the given object to the store.
  */
 export function addObject(object: LanguageItems): void {
-  Object.keys(object).forEach(key => {
+  Object.keys(object).forEach((key) => {
     _languageItems.set(key, object[key]);
   });
 }
@@ -44,16 +44,20 @@ export function get(key: string, parameters?: object): string {
   }
 
   // fetch Template, as it cannot be provided because of a circular dependency
-  if (Template === undefined) { //@ts-ignore
-    Template = require('./Template');
+  if (Template === undefined) {
+    //@ts-ignore
+    Template = require("./Template");
   }
 
-  if (typeof value === 'string') {
+  if (typeof value === "string") {
     // lazily convert to WCF.Template
     try {
       _languageItems.set(key, new Template(value));
     } catch (e) {
-      _languageItems.set(key, new Template('{literal}' + value.replace(/{\/literal}/g, '{/literal}{ldelim}/literal}{literal}') + '{/literal}'));
+      _languageItems.set(
+        key,
+        new Template("{literal}" + value.replace(/{\/literal}/g, "{/literal}{ldelim}/literal}{literal}") + "{/literal}")
+      );
     }
     value = _languageItems.get(key);
   }
@@ -67,4 +71,4 @@ export function get(key: string, parameters?: object): string {
 
 interface LanguageItems {
   [key: string]: string;
-} 
+}
index d73ac0c2f80bd6384e66a2e0d7475d4131b70444..a60f5b26959b987491a9e3af804d6bb9c412e00b 100644 (file)
  */
 export function round(value: number, exp: number): number {
   // If the exp is undefined or zero...
-  if (typeof exp === 'undefined' || +exp === 0) {
+  if (typeof exp === "undefined" || +exp === 0) {
     return Math.round(value);
   }
   value = +value;
   exp = +exp;
 
   // If the value is not a number or the exp is not an integer...
-  if (isNaN(value) || !(typeof (exp as any) === 'number' && exp % 1 === 0)) {
+  if (isNaN(value) || !(typeof (exp as any) === "number" && exp % 1 === 0)) {
     return NaN;
   }
 
   // Shift
-  let tmp = value.toString().split('e');
-  value = Math.round(+(tmp[0] + 'e' + (tmp[1] ? (+tmp[1] - exp) : -exp)));
+  let tmp = value.toString().split("e");
+  value = Math.round(+(tmp[0] + "e" + (tmp[1] ? +tmp[1] - exp : -exp)));
 
   // Shift back
-  tmp = value.toString().split('e');
-  return +(tmp[0] + 'e' + (tmp[1] ? (+tmp[1] + exp) : exp));
+  tmp = value.toString().split("e");
+  return +(tmp[0] + "e" + (tmp[1] ? +tmp[1] + exp : exp));
 }
-       
index fd366c2af9f3c40a5d16aa1f3721441cc80727fe..79a42be90d1f52b6745d8ceacb8a6b138d129a0b 100644 (file)
@@ -18,12 +18,12 @@ class ObjectMap {
    * Sets a new key with given value, will overwrite an existing key.
    */
   set(key: object, value: object): void {
-    if (typeof key !== 'object' || key === null) {
-      throw new TypeError('Only objects can be used as key');
+    if (typeof key !== "object" || key === null) {
+      throw new TypeError("Only objects can be used as key");
     }
 
-    if (typeof value !== 'object' || value === null) {
-      throw new TypeError('Only objects can be used as value');
+    if (typeof value !== "object" || value === null) {
+      throw new TypeError("Only objects can be used as value");
     }
 
     this._map.set(key, value);
@@ -34,7 +34,6 @@ class ObjectMap {
    */
   delete(key: object): void {
     this._map.delete(key);
-
   }
 
   /**
@@ -44,7 +43,6 @@ class ObjectMap {
     return this._map.has(key);
   }
 
-
   /**
    * Retrieves a value by key, returns undefined if there is no match.
    */
@@ -53,4 +51,4 @@ class ObjectMap {
   }
 }
 
-export = ObjectMap
+export = ObjectMap;
index eec3e32d8737ce0964ab885f2ef1d4749818d96c..c67a2aea6651e86bba0fc55f37e28840b6d5a2e8 100644 (file)
@@ -14,8 +14,8 @@ const _permissions = new Map<string, boolean>();
  * Adds a single permission to the store.
  */
 export function add(permission: string, value: boolean): void {
-  if (typeof (value as any) !== 'boolean') {
-    throw new TypeError('The permission value has to be boolean.');
+  if (typeof (value as any) !== "boolean") {
+    throw new TypeError("The permission value has to be boolean.");
   }
 
   _permissions.set(permission, value);
@@ -32,7 +32,6 @@ export function addObject(object: PermissionObject): void {
   }
 }
 
-
 /**
  * Returns the value of a permission.
  *
index ae9747d869f6ec9e0c90917c39656633b3243e04..ba686e7c9b88aa2fd9cbab84afedf4c9d8753b68 100644 (file)
@@ -8,8 +8,8 @@
  * @module  WoltLabSuite/Core/StringUtil
  */
 
-import * as Language from './Language';
-import * as NumberUtil from './NumberUtil';
+import * as Language from "./Language";
+import * as NumberUtil from "./NumberUtil";
 
 /**
  * Adds thousands separators to a given number.
@@ -18,18 +18,22 @@ import * as NumberUtil from './NumberUtil';
  */
 export function addThousandsSeparator(number: number): string {
   // Fetch Language, as it cannot be provided because of a circular dependency
-  if (Language === undefined) { //@ts-ignore
-    Language = require('./Language');
+  if (Language === undefined) {
+    //@ts-ignore
+    Language = require("./Language");
   }
 
-  return String(number).replace(/(^-?\d{1,3}|\d{3})(?=(?:\d{3})+(?:$|\.))/g, '$1' + Language.get('wcf.global.thousandsSeparator'));
+  return String(number).replace(
+    /(^-?\d{1,3}|\d{3})(?=(?:\d{3})+(?:$|\.))/g,
+    "$1" + Language.get("wcf.global.thousandsSeparator")
+  );
 }
 
 /**
  * Escapes special HTML-characters within a string
  */
 export function escapeHTML(string: string): string {
-  return String(string).replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
+  return String(string).replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
 }
 
 /**
@@ -38,7 +42,7 @@ export function escapeHTML(string: string): string {
  * @see    https://github.com/sstephenson/prototype/blob/master/src/prototype/lang/regexp.js#L25
  */
 export function escapeRegExp(string: string): string {
-  return String(string).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
+  return String(string).replace(/([.*+?^=!:${}()|[\]\/\\])/g, "\\$1");
 }
 
 /**
@@ -46,17 +50,18 @@ export function escapeRegExp(string: string): string {
  */
 export function formatNumeric(number: number, decimalPlaces?: number): string {
   // Fetch Language, as it cannot be provided because of a circular dependency
-  if (Language === undefined) { //@ts-ignore
-    Language = require('./Language');
+  if (Language === undefined) {
+    //@ts-ignore
+    Language = require("./Language");
   }
 
   let tmp = NumberUtil.round(number, decimalPlaces || -2).toString();
-  const numberParts = tmp.split('.');
+  const numberParts = tmp.split(".");
 
   tmp = addThousandsSeparator(+numberParts[0]);
-  if (numberParts.length > 1) tmp += Language.get('wcf.global.decimalPoint') + numberParts[1];
+  if (numberParts.length > 1) tmp += Language.get("wcf.global.decimalPoint") + numberParts[1];
 
-  tmp = tmp.replace('-', '\u2212');
+  tmp = tmp.replace("-", "\u2212");
 
   return tmp;
 }
@@ -79,14 +84,18 @@ export function ucfirst(string: string): string {
  * Unescapes special HTML-characters within a string.
  */
 export function unescapeHTML(string: string): string {
-  return String(string).replace(/&amp;/g, '&').replace(/&quot;/g, '"').replace(/&lt;/g, '<').replace(/&gt;/g, '>');
+  return String(string)
+    .replace(/&amp;/g, "&")
+    .replace(/&quot;/g, '"')
+    .replace(/&lt;/g, "<")
+    .replace(/&gt;/g, ">");
 }
 
 /**
  * Shortens numbers larger than 1000 by using unit suffixes.
  */
 export function shortUnit(number: number): string {
-  let unitSuffix = '';
+  let unitSuffix = "";
 
   if (number >= 1000000) {
     number /= 1000000;
@@ -97,7 +106,7 @@ export function shortUnit(number: number): string {
       number = NumberUtil.round(number, -1);
     }
 
-    unitSuffix = 'M';
+    unitSuffix = "M";
   } else if (number >= 1000) {
     number /= 1000;
 
@@ -107,7 +116,7 @@ export function shortUnit(number: number): string {
       number = NumberUtil.round(number, -1);
     }
 
-    unitSuffix = 'k';
+    unitSuffix = "k";
   }
 
   return formatNumeric(number) + unitSuffix;
index a5d71e4fa9b7df6bd5f3267c5af048560685e993..0270b9de88d537406fa06c34d980ed4904128c77 100644 (file)
  * @module  WoltLabSuite/Core/Template
  */
 
-import * as parser from './Template.grammar';
-import * as StringUtil from './StringUtil';
-import * as Language from './Language';
-import * as I18nPlural from './I18n/Plural';
+import * as parser from "./Template.grammar";
+import * as StringUtil from "./StringUtil";
+import * as Language from "./Language";
+import * as I18nPlural from "./I18n/Plural";
 
 // @todo: still required?
 // work around bug in AMD module generation of Jison
@@ -28,22 +28,31 @@ parser = new Parser();*/
 class Template {
   constructor(template: string) {
     // Fetch Language/StringUtil, as it cannot be provided because of a circular dependency
-    if (Language === undefined) { //@ts-ignore
-      Language = require('./Language');
+    if (Language === undefined) {
+      //@ts-ignore
+      Language = require("./Language");
     }
-    if (StringUtil === undefined) { //@ts-ignore
-      StringUtil = require('./StringUtil');
+    if (StringUtil === undefined) {
+      //@ts-ignore
+      StringUtil = require("./StringUtil");
     }
 
     try {
       template = parser.parse(template) as string;
-      template = 'var tmp = {};\n'
-        + 'for (var key in v) tmp[key] = v[key];\n'
-        + 'v = tmp;\n'
-        + 'v.__wcf = window.WCF; v.__window = window;\n'
-        + 'return ' + template;
+      template =
+        "var tmp = {};\n" +
+        "for (var key in v) tmp[key] = v[key];\n" +
+        "v = tmp;\n" +
+        "v.__wcf = window.WCF; v.__window = window;\n" +
+        "return " +
+        template;
 
-      this.fetch = new Function('StringUtil', 'Language', 'I18nPlural', 'v', template).bind(undefined, StringUtil, Language, I18nPlural);
+      this.fetch = new Function("StringUtil", "Language", "I18nPlural", "v", template).bind(
+        undefined,
+        StringUtil,
+        Language,
+        I18nPlural
+      );
     } catch (e) {
       console.debug(e.message);
       throw e;
@@ -57,18 +66,18 @@ class Template {
    */
   fetch(v: object): string {
     // this will be replaced in the init function
-    throw new Error('This Template is not initialized.');
+    throw new Error("This Template is not initialized.");
   }
 }
 
-Object.defineProperty(Template, 'callbacks', {
+Object.defineProperty(Template, "callbacks", {
   enumerable: false,
   configurable: false,
   get: function () {
-    throw new Error('WCF.Template.callbacks is no longer supported');
+    throw new Error("WCF.Template.callbacks is no longer supported");
   },
   set: function (value) {
-    throw new Error('WCF.Template.callbacks is no longer supported');
+    throw new Error("WCF.Template.callbacks is no longer supported");
   },
 });
 
index 360769f8929d2255fe442f8f1dcdb9c309558d2b..0434bfcd4c2306c246989ae9e02b4a223336f776 100644 (file)
@@ -18,7 +18,7 @@ class RepeatingTimer {
    * The `callback` will be passed the owning instance of `Repeating`.
    */
   constructor(callback: (timer: RepeatingTimer) => void, delta: number) {
-    if (typeof callback !== 'function') {
+    if (typeof callback !== "function") {
       throw new TypeError("Expected a valid callback as first argument.");
     }
     if (delta < 0 || delta > 86_400 * 1_000) {
index cc0e6e1a4e2085f1e10a69418f981fbd1c5ed81a..1005e774824273b23d8717ef320f9a34930aed14 100644 (file)
@@ -1,8 +1,8 @@
-import * as Language from '../../Language';
-import * as StringUtil from '../../StringUtil';
-import DomChangeListener from '../../Dom/Change/Listener';
-import DomUtil from '../../Dom/Util';
-import UiUserSearchInput from '../User/Search/Input';
+import * as Language from "../../Language";
+import * as StringUtil from "../../StringUtil";
+import DomChangeListener from "../../Dom/Change/Listener";
+import DomUtil from "../../Dom/Util";
+import UiUserSearchInput from "../User/Search/Input";
 
 class UiAclSimple {
   private readonly aclListContainer: HTMLElement;
@@ -12,37 +12,37 @@ class UiAclSimple {
   private readonly searchInput: UiUserSearchInput;
 
   constructor(prefix?: string, inputName?: string) {
-    this.prefix = prefix || '';
-    this.inputName = inputName || 'aclValues';
+    this.prefix = prefix || "";
+    this.inputName = inputName || "aclValues";
 
-    const container = document.getElementById(this.prefix + 'aclInputContainer')!;
+    const container = document.getElementById(this.prefix + "aclInputContainer")!;
 
-    const allowAll = document.getElementById(this.prefix + 'aclAllowAll') as HTMLInputElement;
-    allowAll.addEventListener('change', () => {
+    const allowAll = document.getElementById(this.prefix + "aclAllowAll") as HTMLInputElement;
+    allowAll.addEventListener("change", () => {
       DomUtil.hide(container);
     });
 
-    const denyAll = document.getElementById(this.prefix + 'aclAllowAll_no')!;
-    denyAll.addEventListener('change', () => {
+    const denyAll = document.getElementById(this.prefix + "aclAllowAll_no")!;
+    denyAll.addEventListener("change", () => {
       DomUtil.show(container);
     });
 
-    this.list = document.getElementById(this.prefix + 'aclAccessList') as HTMLUListElement;
-    this.list.addEventListener('click', this.removeItem.bind(this));
+    this.list = document.getElementById(this.prefix + "aclAccessList") as HTMLUListElement;
+    this.list.addEventListener("click", this.removeItem.bind(this));
 
     const excludedSearchValues: string[] = [];
-    this.list.querySelectorAll('.aclLabel').forEach(label => {
+    this.list.querySelectorAll(".aclLabel").forEach((label) => {
       excludedSearchValues.push(label.textContent!);
     });
 
-    this.searchInput = new UiUserSearchInput(document.getElementById(this.prefix + 'aclSearchInput'), {
+    this.searchInput = new UiUserSearchInput(document.getElementById(this.prefix + "aclSearchInput"), {
       callbackSelect: this.select.bind(this),
       includeUserGroups: true,
       excludedSearchValues: excludedSearchValues,
       preventSubmit: true,
     });
 
-    this.aclListContainer = document.getElementById(this.prefix + 'aclListContainer')!;
+    this.aclListContainer = document.getElementById(this.prefix + "aclListContainer")!;
 
     DomChangeListener.trigger();
   }
@@ -52,16 +52,16 @@ class UiAclSimple {
     const label = listItem.dataset.label!;
     const objectId = listItem.dataset.objectId!;
 
-    const iconName = type === 'group' ? 'users' : 'user';
+    const iconName = type === "group" ? "users" : "user";
     const html = `<span class="icon icon16 fa-${iconName}"></span>
       <span class="aclLabel">${StringUtil.escapeHTML(label)}</span>
-      <span class="icon icon16 fa-times pointer jsTooltip" title="${Language.get('wcf.global.button.delete')}"></span>
+      <span class="icon icon16 fa-times pointer jsTooltip" title="${Language.get("wcf.global.button.delete")}"></span>
       <input type="hidden" name="${this.inputName}[${type}][]" value="${objectId}">`;
 
-    const item = document.createElement('li');
+    const item = document.createElement("li");
     item.innerHTML = html;
 
-    const firstUser = this.list.querySelector('.fa-user');
+    const firstUser = this.list.querySelector(".fa-user");
     if (firstUser === null) {
       this.list.appendChild(item);
     } else {
@@ -79,12 +79,12 @@ class UiAclSimple {
 
   private removeItem(event: MouseEvent): void {
     const target = event.target as HTMLElement;
-    if (target.classList.contains('fa-times')) {
+    if (target.classList.contains("fa-times")) {
       const parent = target.parentElement!;
-      const label = parent.querySelector('.aclLabel')!;
+      const label = parent.querySelector(".aclLabel")!;
       this.searchInput.removeExcludedSearchValues(label.textContent!);
 
-      parent.remove()
+      parent.remove();
 
       if (this.list.childElementCount === 0) {
         DomUtil.hide(this.aclListContainer);
@@ -93,4 +93,4 @@ class UiAclSimple {
   }
 }
 
-export = UiAclSimple
+export = UiAclSimple;
index 393d1cb5d426c4a352a17fd0a5fd1d49e92c82e1..afad6ec0649e79377c757bb4b89ff2319395abcd 100644 (file)
@@ -8,14 +8,14 @@
  * @module  WoltLabSuite/Core/Ui/Alignment
  */
 
-import * as Core from '../Core';
-import * as DomTraverse from '../Dom/Traverse';
-import DomUtil from '../Dom/Util';
-import * as Language from '../Language';
+import * as Core from "../Core";
+import * as DomTraverse from "../Dom/Traverse";
+import DomUtil from "../Dom/Util";
+import * as Language from "../Language";
 
-type HorizontalAlignment = 'center' | 'left' | 'right';
-type VerticalAlignment = 'bottom' | 'top';
-type Offset = number | 'auto';
+type HorizontalAlignment = "center" | "left" | "right";
+type VerticalAlignment = "bottom" | "top";
+type Offset = number | "auto";
 
 interface HorizontalResult {
   align: HorizontalAlignment;
@@ -46,18 +46,24 @@ const enum PointerClass {
  * @param  {int}      windowWidth  window width
  * @returns  {Object<string, *>}  calculation results
  */
-function tryAlignmentHorizontal(alignment: HorizontalAlignment, elDimensions, refDimensions, refOffsets, windowWidth): HorizontalResult {
-  let left: Offset = 'auto';
-  let right: Offset = 'auto';
+function tryAlignmentHorizontal(
+  alignment: HorizontalAlignment,
+  elDimensions,
+  refDimensions,
+  refOffsets,
+  windowWidth
+): HorizontalResult {
+  let left: Offset = "auto";
+  let right: Offset = "auto";
   let result = true;
 
-  if (alignment === 'left') {
+  if (alignment === "left") {
     left = refOffsets.left;
 
     if (left + elDimensions.width > windowWidth) {
       result = false;
     }
-  } else if (alignment === 'right') {
+  } else if (alignment === "right") {
     if (refOffsets.left + refDimensions.width < elDimensions.width) {
       result = false;
     } else {
@@ -68,7 +74,7 @@ function tryAlignmentHorizontal(alignment: HorizontalAlignment, elDimensions, re
       }
     }
   } else {
-    left = refOffsets.left + (refDimensions.width / 2) - (elDimensions.width / 2);
+    left = refOffsets.left + refDimensions.width / 2 - elDimensions.width / 2;
     left = ~~left;
 
     if (left < 0 || left + elDimensions.width > windowWidth) {
@@ -95,25 +101,32 @@ function tryAlignmentHorizontal(alignment: HorizontalAlignment, elDimensions, re
  * @param  {int}      verticalOffset  desired gap between element and reference element
  * @returns  {object<string, *>}  calculation results
  */
-function tryAlignmentVertical(alignment: VerticalAlignment, elDimensions, refDimensions, refOffsets, windowHeight, verticalOffset): VerticalResult {
-  let bottom: Offset = 'auto';
-  let top: Offset = 'auto';
+function tryAlignmentVertical(
+  alignment: VerticalAlignment,
+  elDimensions,
+  refDimensions,
+  refOffsets,
+  windowHeight,
+  verticalOffset
+): VerticalResult {
+  let bottom: Offset = "auto";
+  let top: Offset = "auto";
   let result = true;
   let pageHeaderOffset = 50;
 
-  const pageHeaderPanel = document.getElementById('pageHeaderPanel');
+  const pageHeaderPanel = document.getElementById("pageHeaderPanel");
   if (pageHeaderPanel !== null) {
     const position = window.getComputedStyle(pageHeaderPanel).position;
-    if (position === 'fixed' || position === 'static') {
+    if (position === "fixed" || position === "static") {
       pageHeaderOffset = pageHeaderPanel.offsetHeight;
     } else {
       pageHeaderOffset = 0;
     }
   }
 
-  if (alignment === 'top') {
+  if (alignment === "top") {
     const bodyHeight = document.body.clientHeight;
-    bottom = (bodyHeight - refOffsets.top) + verticalOffset;
+    bottom = bodyHeight - refOffsets.top + verticalOffset;
     if (bodyHeight - (bottom + elDimensions.height) < (window.scrollY || window.pageYOffset) + pageHeaderOffset) {
       result = false;
     }
@@ -140,58 +153,63 @@ function tryAlignmentVertical(alignment: VerticalAlignment, elDimensions, refDim
  * @param  {Object<string, *>}  options    list of options to alter the behavior
  */
 export function set(element: HTMLElement, referenceElement: HTMLElement, options?: AlignmentOptions): void {
-  options = Core.extend({
-    // offset to reference element
-    verticalOffset: 0,
-    // align the pointer element, expects .elementPointer as a direct child of given element
-    pointer: false,
-    // use static pointer positions, expects two items: class to move it to the bottom and the second to move it to the right
-    pointerClassNames: [],
-    // alternate element used to calculate dimensions
-    refDimensionsElement: null,
-    // preferred alignment, possible values: left/right/center and top/bottom
-    horizontal: 'left',
-    vertical: 'bottom',
-    // allow flipping over axis, possible values: both, horizontal, vertical and none
-    allowFlip: 'both',
-  }, options || {}) as AlignmentOptions;
+  options = Core.extend(
+    {
+      // offset to reference element
+      verticalOffset: 0,
+      // align the pointer element, expects .elementPointer as a direct child of given element
+      pointer: false,
+      // use static pointer positions, expects two items: class to move it to the bottom and the second to move it to the right
+      pointerClassNames: [],
+      // alternate element used to calculate dimensions
+      refDimensionsElement: null,
+      // preferred alignment, possible values: left/right/center and top/bottom
+      horizontal: "left",
+      vertical: "bottom",
+      // allow flipping over axis, possible values: both, horizontal, vertical and none
+      allowFlip: "both",
+    },
+    options || {}
+  ) as AlignmentOptions;
 
   if (!Array.isArray(options.pointerClassNames) || options.pointerClassNames.length !== (options.pointer ? 1 : 2)) {
     options.pointerClassNames = [];
   }
-  if (['left', 'right', 'center'].indexOf(options.horizontal!) === -1) {
-    options.horizontal = 'left';
+  if (["left", "right", "center"].indexOf(options.horizontal!) === -1) {
+    options.horizontal = "left";
   }
-  if (options.vertical !== 'bottom') {
-    options.vertical = 'top';
+  if (options.vertical !== "bottom") {
+    options.vertical = "top";
   }
-  if (['both', 'horizontal', 'vertical', 'none'].indexOf(options.allowFlip!) === -1) {
-    options.allowFlip = 'both';
+  if (["both", "horizontal", "vertical", "none"].indexOf(options.allowFlip!) === -1) {
+    options.allowFlip = "both";
   }
 
   // Place the element in the upper left corner to prevent calculation issues due to possible scrollbars.
   DomUtil.setStyles(element, {
-    bottom: 'auto !important',
-    left: '0 !important',
-    right: 'auto !important',
-    top: '0 !important',
-    visibility: 'hidden !important',
+    bottom: "auto !important",
+    left: "0 !important",
+    right: "auto !important",
+    top: "0 !important",
+    visibility: "hidden !important",
   });
 
   const elDimensions = DomUtil.outerDimensions(element);
-  const refDimensions = DomUtil.outerDimensions(options.refDimensionsElement instanceof HTMLElement ? options.refDimensionsElement : referenceElement);
+  const refDimensions = DomUtil.outerDimensions(
+    options.refDimensionsElement instanceof HTMLElement ? options.refDimensionsElement : referenceElement
+  );
   const refOffsets = DomUtil.offset(referenceElement);
   const windowHeight = window.innerHeight;
   const windowWidth = document.body.clientWidth;
 
   let horizontal: HorizontalResult | null = null;
   let alignCenter = false;
-  if (options.horizontal === 'center') {
+  if (options.horizontal === "center") {
     alignCenter = true;
     horizontal = tryAlignmentHorizontal(options.horizontal, elDimensions, refDimensions, refOffsets, windowWidth);
     if (!horizontal.result) {
-      if (options.allowFlip === 'both' || options.allowFlip === 'horizontal') {
-        options.horizontal = 'left';
+      if (options.allowFlip === "both" || options.allowFlip === "horizontal") {
+        options.horizontal = "left";
       } else {
         horizontal.result = true;
       }
@@ -199,15 +217,21 @@ export function set(element: HTMLElement, referenceElement: HTMLElement, options
   }
 
   // in rtl languages we simply swap the value for 'horizontal'
-  if (Language.get('wcf.global.pageDirection') === 'rtl') {
-    options.horizontal = (options.horizontal === 'left') ? 'right' : 'left';
+  if (Language.get("wcf.global.pageDirection") === "rtl") {
+    options.horizontal = options.horizontal === "left" ? "right" : "left";
   }
 
   if (horizontal === null || !horizontal.result) {
     const horizontalCenter = horizontal;
     horizontal = tryAlignmentHorizontal(options.horizontal!, elDimensions, refDimensions, refOffsets, windowWidth);
-    if (!horizontal.result && (options.allowFlip === 'both' || options.allowFlip === 'horizontal')) {
-      const horizontalFlipped = tryAlignmentHorizontal((options.horizontal === 'left' ? 'right' : 'left'), elDimensions, refDimensions, refOffsets, windowWidth);
+    if (!horizontal.result && (options.allowFlip === "both" || options.allowFlip === "horizontal")) {
+      const horizontalFlipped = tryAlignmentHorizontal(
+        options.horizontal === "left" ? "right" : "left",
+        elDimensions,
+        refDimensions,
+        refOffsets,
+        windowWidth
+      );
       // only use these results if it fits into the boundaries, otherwise both directions exceed and we honor the demanded direction
       if (horizontalFlipped.result) {
         horizontal = horizontalFlipped;
@@ -219,9 +243,23 @@ export function set(element: HTMLElement, referenceElement: HTMLElement, options
 
   const left = horizontal!.left;
   const right = horizontal!.right;
-  let vertical = tryAlignmentVertical(options.vertical, elDimensions, refDimensions, refOffsets, windowHeight, options.verticalOffset);
-  if (!vertical.result && (options.allowFlip === 'both' || options.allowFlip === 'vertical')) {
-    const verticalFlipped = tryAlignmentVertical((options.vertical === 'top' ? 'bottom' : 'top'), elDimensions, refDimensions, refOffsets, windowHeight, options.verticalOffset);
+  let vertical = tryAlignmentVertical(
+    options.vertical,
+    elDimensions,
+    refDimensions,
+    refOffsets,
+    windowHeight,
+    options.verticalOffset
+  );
+  if (!vertical.result && (options.allowFlip === "both" || options.allowFlip === "vertical")) {
+    const verticalFlipped = tryAlignmentVertical(
+      options.vertical === "top" ? "bottom" : "top",
+      elDimensions,
+      refDimensions,
+      refOffsets,
+      windowHeight,
+      options.verticalOffset
+    );
     // only use these results if it fits into the boundaries, otherwise both directions exceed and we honor the demanded direction
     if (verticalFlipped.result) {
       vertical = verticalFlipped;
@@ -232,43 +270,43 @@ export function set(element: HTMLElement, referenceElement: HTMLElement, options
   const top = vertical.top;
   // set pointer position
   if (options.pointer) {
-    const pointers = DomTraverse.childrenByClass(element, 'elementPointer');
+    const pointers = DomTraverse.childrenByClass(element, "elementPointer");
     const pointer = pointers[0] || null;
     if (pointer === null) {
       throw new Error("Expected the .elementPointer element to be a direct children.");
     }
 
-    if (horizontal!.align === 'center') {
-      pointer.classList.add('center');
-      pointer.classList.remove('left', 'right');
+    if (horizontal!.align === "center") {
+      pointer.classList.add("center");
+      pointer.classList.remove("left", "right");
     } else {
       pointer.classList.add(horizontal!.align);
-      pointer.classList.remove('center');
-      pointer.classList.remove(horizontal!.align === 'left' ? 'right' : 'left');
+      pointer.classList.remove("center");
+      pointer.classList.remove(horizontal!.align === "left" ? "right" : "left");
     }
 
-    if (vertical.align === 'top') {
-      pointer.classList.add('flipVertical');
+    if (vertical.align === "top") {
+      pointer.classList.add("flipVertical");
     } else {
-      pointer.classList.remove('flipVertical');
+      pointer.classList.remove("flipVertical");
     }
   } else if (options.pointerClassNames.length === 2) {
-    element.classList[(top === 'auto' ? 'add' : 'remove')](options.pointerClassNames[PointerClass.Bottom]);
-    element.classList[(left === 'auto' ? 'add' : 'remove')](options.pointerClassNames[PointerClass.Right]);
+    element.classList[top === "auto" ? "add" : "remove"](options.pointerClassNames[PointerClass.Bottom]);
+    element.classList[left === "auto" ? "add" : "remove"](options.pointerClassNames[PointerClass.Right]);
   }
-  
+
   DomUtil.setStyles(element, {
-    bottom: bottom === 'auto' ? bottom : Math.round(bottom) + 'px',
-    left: left === 'auto' ? left : Math.ceil(left) + 'px',
-    right: right === 'auto' ? right : Math.floor(right) + 'px',
-    top: top === 'auto' ? top : Math.round(top) + 'px',
+    bottom: bottom === "auto" ? bottom : Math.round(bottom) + "px",
+    left: left === "auto" ? left : Math.ceil(left) + "px",
+    right: right === "auto" ? right : Math.floor(right) + "px",
+    top: top === "auto" ? top : Math.round(top) + "px",
   });
-  
+
   DomUtil.show(element);
-  element.style.removeProperty('visibility');
+  element.style.removeProperty("visibility");
 }
 
-export type AllowFlip = 'both' | 'horizontal' | 'none' | 'vertical';
+export type AllowFlip = "both" | "horizontal" | "none" | "vertical";
 
 export interface AlignmentOptions {
   // offset to reference element
index 10a89e75de3fea9a766aae35ff31ebf3e561bb39..a1c9df2d54831f22b23ebbba98f558f3f78e3f5c 100644 (file)
@@ -7,13 +7,13 @@
  * @module  WoltLabSuite/Core/Ui/Article/MarkAllAsRead
  */
 
-import * as Ajax from '../../Ajax';
-import { AjaxCallbackObject } from '../../Ajax/Data';
+import * as Ajax from "../../Ajax";
+import { AjaxCallbackObject } from "../../Ajax/Data";
 
 class UiArticleMarkAllAsRead implements AjaxCallbackObject {
   constructor() {
-    document.querySelectorAll('.markAllAsReadButton').forEach(button => {
-      button.addEventListener('click', this.click.bind(this));
+    document.querySelectorAll(".markAllAsReadButton").forEach((button) => {
+      button.addEventListener("click", this.click.bind(this));
     });
   }
 
@@ -26,18 +26,18 @@ class UiArticleMarkAllAsRead implements AjaxCallbackObject {
   _ajaxSuccess() {
     /* remove obsolete badges */
     // main menu
-    const badge = document.querySelector('.mainMenu .active .badge');
+    const badge = document.querySelector(".mainMenu .active .badge");
     if (badge) badge.remove();
 
     // article list
-    document.querySelectorAll('.articleList .newMessageBadge').forEach(el => el.remove());
+    document.querySelectorAll(".articleList .newMessageBadge").forEach((el) => el.remove());
   }
 
   _ajaxSetup() {
     return {
       data: {
-        actionName: 'markAllAsRead',
-        className: 'wcf\\data\\article\\ArticleAction',
+        actionName: "markAllAsRead",
+        className: "wcf\\data\\article\\ArticleAction",
       },
     };
   }
index 861e6cab90f5d0b18b16e479cf2c046373ce4a53..4ff65ee804e4ebba786a3e897d821351e638f852 100644 (file)
@@ -1,10 +1,10 @@
-import * as Ajax from '../../Ajax';
-import { AjaxCallbackObject, DatabaseObjectActionResponse } from '../../Ajax/Data';
-import { DialogCallbackObject } from '../Dialog/Data';
-import DomUtil from '../../Dom/Util';
-import * as Language from '../../Language';
-import * as StringUtil from '../../StringUtil';
-import UiDialog from '../Dialog';
+import * as Ajax from "../../Ajax";
+import { AjaxCallbackObject, DatabaseObjectActionResponse } from "../../Ajax/Data";
+import { DialogCallbackObject } from "../Dialog/Data";
+import DomUtil from "../../Dom/Util";
+import * as Language from "../../Language";
+import * as StringUtil from "../../StringUtil";
+import UiDialog from "../Dialog";
 
 type CallbackSelect = (articleId: number) => void;
 
@@ -37,7 +37,7 @@ class UiArticleSearch implements AjaxCallbackObject, DialogCallbackObject {
 
     const value = this.searchInput!.value.trim();
     if (value.length < 3) {
-      DomUtil.innerError(inputContainer, Language.get('wcf.article.search.error.tooShort'));
+      DomUtil.innerError(inputContainer, Language.get("wcf.article.search.error.tooShort"));
       return;
     } else {
       DomUtil.innerError(inputContainer, false);
@@ -61,7 +61,7 @@ class UiArticleSearch implements AjaxCallbackObject, DialogCallbackObject {
 
   _ajaxSuccess(data: AjaxResponse): void {
     let html = data.returnValues
-      .map(article => {
+      .map((article) => {
         return `<li>
           <div class="containerHeadline pointer" data-article-id="${article.articleID}">
             <h3>${StringUtil.escapeHTML(article.name)}</h3>
@@ -69,58 +69,58 @@ class UiArticleSearch implements AjaxCallbackObject, DialogCallbackObject {
           </div>
         </li>`;
       })
-      .join('');
+      .join("");
 
     this.resultList!.innerHTML = html;
 
-    DomUtil[html ? 'show' : 'hide'](this.resultList!);
+    DomUtil[html ? "show" : "hide"](this.resultList!);
 
     if (html) {
-      this.resultList!.querySelectorAll('.containerHeadline').forEach(item => {
-        item.addEventListener('click', this.click.bind(this));
+      this.resultList!.querySelectorAll(".containerHeadline").forEach((item) => {
+        item.addEventListener("click", this.click.bind(this));
       });
     } else {
       const parent = this.searchInput!.parentElement!;
-      DomUtil.innerError(parent, Language.get('wcf.article.search.error.noResults'));
+      DomUtil.innerError(parent, Language.get("wcf.article.search.error.noResults"));
     }
   }
 
   _ajaxSetup() {
     return {
       data: {
-        actionName: 'search',
-        className: 'wcf\\data\\article\\ArticleAction',
+        actionName: "search",
+        className: "wcf\\data\\article\\ArticleAction",
       },
     };
   }
 
   _dialogSetup() {
     return {
-      id: 'wcfUiArticleSearch',
+      id: "wcfUiArticleSearch",
       options: {
         onSetup: () => {
-          this.searchInput = document.getElementById('wcfUiArticleSearchInput') as HTMLInputElement;
-          this.searchInput.addEventListener('keydown', event => {
-            if (event.key === 'Enter') {
+          this.searchInput = document.getElementById("wcfUiArticleSearchInput") as HTMLInputElement;
+          this.searchInput.addEventListener("keydown", (event) => {
+            if (event.key === "Enter") {
               this.search(event);
             }
           });
 
           const button = this.searchInput.nextElementSibling!;
-          button.addEventListener('click', this.search.bind(this));
+          button.addEventListener("click", this.search.bind(this));
 
-          this.resultContainer = document.getElementById('wcfUiArticleSearchResultContainer')!;
-          this.resultList = document.getElementById('wcfUiArticleSearchResultList') as HTMLOListElement;
+          this.resultContainer = document.getElementById("wcfUiArticleSearchResultContainer")!;
+          this.resultList = document.getElementById("wcfUiArticleSearchResultList") as HTMLOListElement;
         },
         onShow: () => {
           this.searchInput!.focus();
         },
-        title: Language.get('wcf.article.search'),
+        title: Language.get("wcf.article.search"),
       },
       source: `<div class="section">
           <dl>
             <dt>
-              <label for="wcfUiArticleSearchInput">${Language.get('wcf.article.search.name')}</label>
+              <label for="wcfUiArticleSearchInput">${Language.get("wcf.article.search.name")}</label>
             </dt>
             <dd>
               <div class="inputAddon">
@@ -132,7 +132,7 @@ class UiArticleSearch implements AjaxCallbackObject, DialogCallbackObject {
         </div>
         <section id="wcfUiArticleSearchResultContainer" class="section" style="display: none;">
           <header class="sectionHeader">
-            <h2 class="sectionTitle">${Language.get('wcf.article.search.results')}</h2>
+            <h2 class="sectionTitle">${Language.get("wcf.article.search.results")}</h2>
           </header>
           <ol id="wcfUiArticleSearchResultList" class="containerList"></ol>
         </section>`,
index 6e9c8a4c172c25fc2d1f75734f04d1daa8c782d1..61113fcd1070d124146395596e185c8c7471c8e3 100644 (file)
@@ -8,7 +8,7 @@
  * @module  WoltLabSuite/Core/Ui/CloseOverlay
  */
 
-import CallbackList from '../CallbackList';
+import CallbackList from "../CallbackList";
 
 const _callbackList = new CallbackList();
 
@@ -17,20 +17,20 @@ const UiCloseOverlay = {
    * @see CallbackList.add
    */
   add: _callbackList.add.bind(_callbackList),
-  
+
   /**
    * @see CallbackList.remove
    */
   remove: _callbackList.remove.bind(_callbackList),
-  
+
   /**
    * Invokes all registered callbacks.
    */
   execute() {
-    _callbackList.forEach(null, callback => callback());
+    _callbackList.forEach(null, (callback) => callback());
   },
 };
 
-document.body.addEventListener('click', UiCloseOverlay.execute);
+document.body.addEventListener("click", UiCloseOverlay.execute);
 
 export = UiCloseOverlay;
index 3321ca0827a3c2afd516294a6aeb298849a5805a..0da77a351640dacfdf4097950d1408bf82a558f1 100644 (file)
@@ -8,10 +8,10 @@
  * @module  WoltLabSuite/Core/Ui/Confirmation
  */
 
-import * as Core from '../Core';
-import * as Language from '../Language';
-import UiDialog from './Dialog';
-import { DialogCallbackObject } from './Dialog/Data';
+import * as Core from "../Core";
+import * as Language from "../Language";
+import UiDialog from "./Dialog";
+import { DialogCallbackObject } from "./Dialog/Data";
 
 class UiConfirmation implements DialogCallbackObject {
   private _active = false;
@@ -26,30 +26,30 @@ class UiConfirmation implements DialogCallbackObject {
   private callbackConfirm: CallbackConfirm;
 
   constructor() {
-    this.dialog = document.createElement('div');
-    this.dialog.id = 'wcfSystemConfirmation';
-    this.dialog.classList.add('systemConfirmation');
+    this.dialog = document.createElement("div");
+    this.dialog.id = "wcfSystemConfirmation";
+    this.dialog.classList.add("systemConfirmation");
 
-    this.text = document.createElement('p');
+    this.text = document.createElement("p");
     this.dialog.appendChild(this.text);
 
-    this._content = document.createElement('div');
-    this._content.id = 'wcfSystemConfirmationContent';
+    this._content = document.createElement("div");
+    this._content.id = "wcfSystemConfirmationContent";
     this.dialog.appendChild(this._content);
 
-    const formSubmit = document.createElement('div');
-    formSubmit.classList.add('formSubmit');
+    const formSubmit = document.createElement("div");
+    formSubmit.classList.add("formSubmit");
     this.dialog.appendChild(formSubmit);
 
-    this.confirmButton = document.createElement('button');
-    this.confirmButton.classList.add('buttonPrimary');
-    this.confirmButton.textContent = Language.get('wcf.global.confirmation.confirm');
-    this.confirmButton.addEventListener('click', (ev) => this._confirm());
+    this.confirmButton = document.createElement("button");
+    this.confirmButton.classList.add("buttonPrimary");
+    this.confirmButton.textContent = Language.get("wcf.global.confirmation.confirm");
+    this.confirmButton.addEventListener("click", (ev) => this._confirm());
     formSubmit.appendChild(this.confirmButton);
 
-    const cancelButton = document.createElement('button');
-    cancelButton.textContent = Language.get('wcf.global.confirmation.cancel');
-    cancelButton.addEventListener('click', () => {
+    const cancelButton = document.createElement("button");
+    cancelButton.textContent = Language.get("wcf.global.confirmation.cancel");
+    cancelButton.addEventListener("click", () => {
       UiDialog.close(this);
     });
     formSubmit.appendChild(cancelButton);
@@ -59,21 +59,20 @@ class UiConfirmation implements DialogCallbackObject {
 
   public open(options: ConfirmationOptions): void {
     this.parameters = options.parameters || {};
-    
-    this._content.innerHTML = (typeof options.template === 'string') ? options.template.trim() : '';
-    this.text[options.messageIsHtml ? 'innerHTML' : 'textContent'] = options.message;
 
-    if (typeof options.legacyCallback === 'function') {
-      this.callbackCancel = parameters => {
-        options.legacyCallback!('cancel', parameters, this.content);
+    this._content.innerHTML = typeof options.template === "string" ? options.template.trim() : "";
+    this.text[options.messageIsHtml ? "innerHTML" : "textContent"] = options.message;
+
+    if (typeof options.legacyCallback === "function") {
+      this.callbackCancel = (parameters) => {
+        options.legacyCallback!("cancel", parameters, this.content);
       };
-      this.callbackConfirm = parameters => {
-        options.legacyCallback!('confirm', parameters, this.content);
+      this.callbackConfirm = (parameters) => {
+        options.legacyCallback!("confirm", parameters, this.content);
       };
     } else {
-      if (typeof options.cancel !== 'function') {
-        options.cancel = () => {
-        };
+      if (typeof options.cancel !== "function") {
+        options.cancel = () => {};
       }
 
       this.callbackCancel = options.cancel;
@@ -98,10 +97,10 @@ class UiConfirmation implements DialogCallbackObject {
    */
   _confirm(): void {
     this.callbackConfirm(this.parameters, this.content);
-    
+
     this._active = false;
 
-    UiDialog.close('wcfSystemConfirmation');
+    UiDialog.close("wcfSystemConfirmation");
   }
 
   /**
@@ -127,11 +126,11 @@ class UiConfirmation implements DialogCallbackObject {
 
   _dialogSetup() {
     return {
-      id: 'wcfSystemConfirmation',
+      id: "wcfSystemConfirmation",
       options: {
         onClose: this._onClose.bind(this),
         onShow: this._onShow.bind(this),
-        title: Language.get('wcf.global.confirmation.title'),
+        title: Language.get("wcf.global.confirmation.title"),
       },
     };
   }
@@ -146,16 +145,16 @@ function getConfirmation(): UiConfirmation {
   return confirmation;
 }
 
-type LegacyResult = 'cancel' | 'confirm';
+type LegacyResult = "cancel" | "confirm";
 
 type CallbackParameters = {
-  [key: string]: any,
-}
+  [key: string]: any;
+};
 
 interface BasicConfirmationOptions {
   message: string;
   messageIsHtml?: boolean;
-  parameters?: CallbackParameters,
+  parameters?: CallbackParameters;
   template?: string;
 }
 
@@ -184,20 +183,23 @@ export function show(options: ConfirmationOptions): void {
     return;
   }
 
-  options = Core.extend({
-    cancel: null,
-    confirm: null,
-    legacyCallback: null,
-    message: '',
-    messageIsHtml: false,
-    parameters: {},
-    template: '',
-  }, options) as ConfirmationOptions;
-  options.message = (typeof (options.message as any) === 'string') ? options.message.trim() : '';
+  options = Core.extend(
+    {
+      cancel: null,
+      confirm: null,
+      legacyCallback: null,
+      message: "",
+      messageIsHtml: false,
+      parameters: {},
+      template: "",
+    },
+    options
+  ) as ConfirmationOptions;
+  options.message = typeof (options.message as any) === "string" ? options.message.trim() : "";
   if (!options.message) {
     throw new Error("Expected a non-empty string for option 'message'.");
   }
-  if (typeof options.confirm !== 'function' && typeof options.legacyCallback !== 'function') {
+  if (typeof options.confirm !== "function" && typeof options.legacyCallback !== "function") {
     throw new TypeError("Expected a valid callback for option 'confirm'.");
   }
 
index 7361be0695e3df8b6dc8e1d1fdc351a8be85d165..5fa7f2fedac98dfadaa6065292a5218ef6f09d8f 100644 (file)
@@ -8,10 +8,10 @@
  * @module  WoltLabSuite/Core/Ui/Dialog
  */
 
-import * as Core from '../Core';
-import DomChangeListener from '../Dom/Change/Listener';
-import * as UiScreen from './Screen';
-import DomUtil from '../Dom/Util';
+import * as Core from "../Core";
+import DomChangeListener from "../Dom/Change/Listener";
+import * as UiScreen from "./Screen";
+import DomUtil from "../Dom/Util";
 import {
   DialogCallbackObject,
   DialogData,
@@ -19,11 +19,11 @@ import {
   DialogOptions,
   DialogHtml,
   AjaxInitialization,
-} from './Dialog/Data';
-import * as Language from '../Language';
-import * as Environment from '../Environment';
-import * as EventHandler from '../Event/Handler';
-import UiDropdownSimple from './Dropdown/Simple';
+} from "./Dialog/Data";
+import * as Language from "../Language";
+import * as Environment from "../Environment";
+import * as EventHandler from "../Event/Handler";
+import UiDropdownSimple from "./Dropdown/Simple";
 
 let _activeDialog: string | null = null;
 let _callbackFocus: (event: FocusEvent) => void;
@@ -34,18 +34,18 @@ const _dialogObjects = new WeakMap<DialogCallbackObject, DialogInternalData>();
 const _dialogToObject = new Map<ElementId, DialogCallbackObject>();
 let _focusedBeforeDialog: Element | null;
 let _keyupListener: (event: KeyboardEvent) => boolean;
-const _validCallbacks = ['onBeforeClose', 'onClose', 'onShow'];
+const _validCallbacks = ["onBeforeClose", "onClose", "onShow"];
 
 // list of supported `input[type]` values for dialog submit
-const _validInputTypes = ['number', 'password', 'search', 'tel', 'text', 'url'];
+const _validInputTypes = ["number", "password", "search", "tel", "text", "url"];
 
 const _focusableElements = [
   'a[href]:not([tabindex^="-"]):not([inert])',
   'area[href]:not([tabindex^="-"]):not([inert])',
-  'input:not([disabled]):not([inert])',
-  'select:not([disabled]):not([inert])',
-  'textarea:not([disabled]):not([inert])',
-  'button:not([disabled]):not([inert])',
+  "input:not([disabled]):not([inert])",
+  "select:not([disabled]):not([inert])",
+  "textarea:not([disabled]):not([inert])",
+  "button:not([disabled]):not([inert])",
   'iframe:not([tabindex^="-"]):not([inert])',
   'audio:not([tabindex^="-"]):not([inert])',
   'video:not([tabindex^="-"]):not([inert])',
@@ -61,22 +61,26 @@ const UiDialog = {
    * Sets up global container and internal variables.
    */
   setup(): void {
-    _container = document.createElement('div');
-    _container.classList.add('dialogOverlay');
-    _container.setAttribute('aria-hidden', 'true');
-    _container.addEventListener('mousedown', (ev) => this._closeOnBackdrop(ev));
-    _container.addEventListener('wheel', event => {
-      if (event.target === _container) {
-        event.preventDefault();
-      }
-    }, {passive: false});
+    _container = document.createElement("div");
+    _container.classList.add("dialogOverlay");
+    _container.setAttribute("aria-hidden", "true");
+    _container.addEventListener("mousedown", (ev) => this._closeOnBackdrop(ev));
+    _container.addEventListener(
+      "wheel",
+      (event) => {
+        if (event.target === _container) {
+          event.preventDefault();
+        }
+      },
+      { passive: false }
+    );
 
-    document.getElementById('content')!.appendChild(_container);
+    document.getElementById("content")!.appendChild(_container);
 
     _keyupListener = (event: KeyboardEvent): boolean => {
       if (event.key === "Escape") {
         const target = event.target as HTMLElement;
-        if (target.nodeName !== 'INPUT' && target.nodeName !== 'TEXTAREA') {
+        if (target.nodeName !== "INPUT" && target.nodeName !== "TEXTAREA") {
           this.close(_activeDialog!);
 
           return false;
@@ -86,7 +90,7 @@ const UiDialog = {
       return true;
     };
 
-    UiScreen.on('screen-xs', {
+    UiScreen.on("screen-xs", {
       match() {
         _dialogFullHeight = true;
       },
@@ -99,37 +103,37 @@ const UiDialog = {
     });
 
     this._initStaticDialogs();
-    DomChangeListener.add('Ui/Dialog', () => {
+    DomChangeListener.add("Ui/Dialog", () => {
       this._initStaticDialogs();
     });
 
     UiScreen.setDialogContainer(_container);
 
-    window.addEventListener('resize', () => {
-      _dialogs.forEach(dialog => {
-        if (!Core.stringToBool(dialog.dialog.getAttribute('aria-hidden'))) {
-          this.rebuild(dialog.dialog.dataset.id || '');
+    window.addEventListener("resize", () => {
+      _dialogs.forEach((dialog) => {
+        if (!Core.stringToBool(dialog.dialog.getAttribute("aria-hidden"))) {
+          this.rebuild(dialog.dialog.dataset.id || "");
         }
       });
     });
   },
 
   _initStaticDialogs(): void {
-    document.querySelectorAll('.jsStaticDialog').forEach((button: HTMLElement) => {
-      button.classList.remove('jsStaticDialog');
+    document.querySelectorAll(".jsStaticDialog").forEach((button: HTMLElement) => {
+      button.classList.remove("jsStaticDialog");
 
-      const id = button.dataset.dialogId || '';
+      const id = button.dataset.dialogId || "";
       if (id) {
         const container = document.getElementById(id);
         if (container !== null) {
-          container.classList.remove('jsStaticDialogContent');
-          container.dataset.isStaticDialog = 'true';
+          container.classList.remove("jsStaticDialogContent");
+          container.dataset.isStaticDialog = "true";
           DomUtil.hide(container);
 
-          button.addEventListener('click', event => {
+          button.addEventListener("click", (event) => {
             event.preventDefault();
 
-            this.openStatic(container.id, null, {title: container.dataset.title || ''});
+            this.openStatic(container.id, null, { title: container.dataset.title || "" });
           });
         }
       }
@@ -143,11 +147,11 @@ const UiDialog = {
     let dialogData = _dialogObjects.get(callbackObject);
     if (dialogData && Core.isPlainObject(dialogData)) {
       // dialog already exists
-      return this.openStatic(dialogData.id, typeof html === 'undefined' ? null : html);
+      return this.openStatic(dialogData.id, typeof html === "undefined" ? null : html);
     }
 
     // initialize a new dialog
-    if (typeof callbackObject._dialogSetup !== 'function') {
+    if (typeof callbackObject._dialogSetup !== "function") {
       throw new Error("Callback object does not implement the method '_dialogSetup()'.");
     }
 
@@ -157,36 +161,40 @@ const UiDialog = {
     }
 
     const id = setupData.id;
-    dialogData = {id};
+    dialogData = { id };
 
     let dialogElement: HTMLElement | null;
     if (setupData.source === undefined) {
       dialogElement = document.getElementById(id);
       if (dialogElement === null) {
-        throw new Error("Element id '" + id + "' is invalid and no source attribute was given. If you want to use the `html` argument instead, please add `source: null` to your dialog configuration.");
+        throw new Error(
+          "Element id '" +
+            id +
+            "' is invalid and no source attribute was given. If you want to use the `html` argument instead, please add `source: null` to your dialog configuration."
+        );
       }
 
       setupData.source = document.createDocumentFragment();
       setupData.source.appendChild(dialogElement);
 
-      dialogElement.removeAttribute('id');
+      dialogElement.removeAttribute("id");
       DomUtil.show(dialogElement);
     } else if (setupData.source === null) {
       // `null` means there is no static markup and `html` should be used instead
       setupData.source = html;
-    } else if (typeof setupData.source === 'function') {
+    } else if (typeof setupData.source === "function") {
       setupData.source();
     } else if (Core.isPlainObject(setupData.source)) {
-      if (typeof html === 'string' && html.trim() !== '') {
+      if (typeof html === "string" && html.trim() !== "") {
         setupData.source = html;
       } else {
-        import('../Ajax').then(Ajax => {
+        import("../Ajax").then((Ajax) => {
           const source = setupData.source as AjaxInitialization;
-          Ajax.api(this as any, source.data, data => {
-            if (data.returnValues && typeof data.returnValues.template === 'string') {
+          Ajax.api(this as any, source.data, (data) => {
+            if (data.returnValues && typeof data.returnValues.template === "string") {
               this.open(callbackObject, data.returnValues.template);
 
-              if (typeof source.after === 'function') {
+              if (typeof source.after === "function") {
                 source.after(_dialogs.get(id)!.content, data);
               }
             }
@@ -196,8 +204,8 @@ const UiDialog = {
         return {};
       }
     } else {
-      if (typeof setupData.source === 'string') {
-        dialogElement = document.createElement('div');
+      if (typeof setupData.source === "string") {
+        dialogElement = document.createElement("div");
         dialogElement.id = id;
         DomUtil.setInnerHtml(dialogElement, setupData.source);
 
@@ -226,7 +234,7 @@ const UiDialog = {
   openStatic(id: string, html: DialogHtml, options?: DialogOptions): DialogData {
     UiScreen.pageOverlayOpen();
 
-    if (Environment.platform() !== 'desktop') {
+    if (Environment.platform() !== "desktop") {
       if (!this.isOpen(id)) {
         UiScreen.scrollDisable();
       }
@@ -235,26 +243,29 @@ const UiDialog = {
     if (_dialogs.has(id)) {
       this._updateDialog(id, html as string);
     } else {
-      options = Core.extend({
-        backdropCloseOnClick: true,
-        closable: true,
-        closeButtonLabel: Language.get('wcf.global.button.close'),
-        closeConfirmMessage: '',
-        disableContentPadding: false,
-        title: '',
-
-        onBeforeClose: null,
-        onClose: null,
-        onShow: null,
-      }, options || {}) as InternalDialogOptions;
+      options = Core.extend(
+        {
+          backdropCloseOnClick: true,
+          closable: true,
+          closeButtonLabel: Language.get("wcf.global.button.close"),
+          closeConfirmMessage: "",
+          disableContentPadding: false,
+          title: "",
+
+          onBeforeClose: null,
+          onClose: null,
+          onShow: null,
+        },
+        options || {}
+      ) as InternalDialogOptions;
 
       if (!options.closable) options.backdropCloseOnClick = false;
       if (options.closeConfirmMessage) {
-        options.onBeforeClose = id => {
-          import('./Confirmation').then(UiConfirmation => {
+        options.onBeforeClose = (id) => {
+          import("./Confirmation").then((UiConfirmation) => {
             UiConfirmation.show({
               confirm: this.close.bind(this, id),
-              message: options!.closeConfirmMessage || '',
+              message: options!.closeConfirmMessage || "",
             });
           });
         };
@@ -268,9 +279,9 @@ const UiDialog = {
     // iOS breaks `position: fixed` when input elements or `contenteditable`
     // are focused, this will freeze the screen and force Safari to scroll
     // to the input field
-    if (Environment.platform() === 'ios') {
+    if (Environment.platform() === "ios") {
       window.setTimeout(() => {
-        data.content.querySelector<HTMLElement>('input, textarea')?.focus();
+        data.content.querySelector<HTMLElement>("input, textarea")?.focus();
       }, 200);
     }
 
@@ -288,7 +299,7 @@ const UiDialog = {
       throw new Error("Expected a valid dialog id, '" + id + "' does not match any active dialog.");
     }
 
-    const dialogTitle = data.dialog.querySelector('.dialogTitle');
+    const dialogTitle = data.dialog.querySelector(".dialogTitle");
     if (dialogTitle) {
       dialogTitle.textContent = title;
     }
@@ -298,7 +309,7 @@ const UiDialog = {
    * Sets a callback function on runtime.
    */
   setCallback(id: ElementIdOrCallbackObject, key: string, value: (...args: any[]) => void | null): void {
-    if (typeof id === 'object') {
+    if (typeof id === "object") {
       const dialogData = _dialogObjects.get(id);
       if (dialogData !== undefined) {
         id = dialogData.id;
@@ -314,8 +325,10 @@ const UiDialog = {
       throw new Error("Invalid callback identifier, '" + key + "' is not recognized.");
     }
 
-    if (typeof value !== 'function' && value !== null) {
-      throw new Error("Only functions or the 'null' value are acceptable callback values ('" + typeof value + "' given).");
+    if (typeof value !== "function" && value !== null) {
+      throw new Error(
+        "Only functions or the 'null' value are acceptable callback values ('" + typeof value + "' given)."
+      );
     }
 
     data[key] = value;
@@ -333,82 +346,86 @@ const UiDialog = {
       }
     }
 
-    const dialog = document.createElement('div');
-    dialog.classList.add('dialogContainer');
-    dialog.setAttribute('aria-hidden', 'true');
-    dialog.setAttribute('role', 'dialog');
+    const dialog = document.createElement("div");
+    dialog.classList.add("dialogContainer");
+    dialog.setAttribute("aria-hidden", "true");
+    dialog.setAttribute("role", "dialog");
     dialog.id = id;
 
-    const header = document.createElement('header');
+    const header = document.createElement("header");
     dialog.appendChild(header);
 
     const titleId = DomUtil.getUniqueId();
-    dialog.setAttribute('aria-labelledby', titleId);
+    dialog.setAttribute("aria-labelledby", titleId);
 
-    const title = document.createElement('span');
-    title.classList.add('dialogTitle');
+    const title = document.createElement("span");
+    title.classList.add("dialogTitle");
     title.textContent = options.title!;
     title.id = titleId;
     header.appendChild(title);
 
     if (options.closable) {
-      const closeButton = document.createElement('a');
-      closeButton.className = 'dialogCloseButton jsTooltip';
-      closeButton.href = '#';
-      closeButton.setAttribute('role', 'button');
+      const closeButton = document.createElement("a");
+      closeButton.className = "dialogCloseButton jsTooltip";
+      closeButton.href = "#";
+      closeButton.setAttribute("role", "button");
       closeButton.tabIndex = 0;
       closeButton.title = options.closeButtonLabel;
-      closeButton.setAttribute('aria-label', options.closeButtonLabel);
-      closeButton.addEventListener('click', (ev) => this._close(ev));
+      closeButton.setAttribute("aria-label", options.closeButtonLabel);
+      closeButton.addEventListener("click", (ev) => this._close(ev));
       header.appendChild(closeButton);
 
-      const span = document.createElement('span');
-      span.className = 'icon icon24 fa-times';
+      const span = document.createElement("span");
+      span.className = "icon icon24 fa-times";
       closeButton.appendChild(span);
     }
 
-    const contentContainer = document.createElement('div');
-    contentContainer.classList.add('dialogContent');
-    if (options.disableContentPadding) contentContainer.classList.add('dialogContentNoPadding');
+    const contentContainer = document.createElement("div");
+    contentContainer.classList.add("dialogContent");
+    if (options.disableContentPadding) contentContainer.classList.add("dialogContentNoPadding");
     dialog.appendChild(contentContainer);
 
-    contentContainer.addEventListener('wheel', event => {
-      let allowScroll = false;
-      let element: HTMLElement | null = event.target as HTMLElement;
-      let clientHeight, scrollHeight, scrollTop;
-      while (true) {
-        clientHeight = element.clientHeight;
-        scrollHeight = element.scrollHeight;
-
-        if (clientHeight < scrollHeight) {
-          scrollTop = element.scrollTop;
+    contentContainer.addEventListener(
+      "wheel",
+      (event) => {
+        let allowScroll = false;
+        let element: HTMLElement | null = event.target as HTMLElement;
+        let clientHeight, scrollHeight, scrollTop;
+        while (true) {
+          clientHeight = element.clientHeight;
+          scrollHeight = element.scrollHeight;
+
+          if (clientHeight < scrollHeight) {
+            scrollTop = element.scrollTop;
+
+            // negative value: scrolling up
+            if (event.deltaY < 0 && scrollTop > 0) {
+              allowScroll = true;
+              break;
+            } else if (event.deltaY > 0 && scrollTop + clientHeight < scrollHeight) {
+              allowScroll = true;
+              break;
+            }
+          }
 
-          // negative value: scrolling up
-          if (event.deltaY < 0 && scrollTop > 0) {
-            allowScroll = true;
-            break;
-          } else if (event.deltaY > 0 && (scrollTop + clientHeight < scrollHeight)) {
-            allowScroll = true;
+          if (!element || element === contentContainer) {
             break;
           }
-        }
 
-        if (!element || element === contentContainer) {
-          break;
+          element = element.parentNode as HTMLElement;
         }
 
-        element = element.parentNode as HTMLElement;
-      }
-
-      if (!allowScroll) {
-        event.preventDefault();
-      }
-    }, {passive: false});
+        if (!allowScroll) {
+          event.preventDefault();
+        }
+      },
+      { passive: false }
+    );
 
     let content: HTMLElement;
     if (element === null) {
-      if (typeof html === 'string') {
-        content = document.createElement('div');
+      if (typeof html === "string") {
+        content = document.createElement("div");
         content.id = id;
         DomUtil.setInnerHtml(content, html);
       } else if (html instanceof DocumentFragment) {
@@ -422,8 +439,8 @@ const UiDialog = {
           }
         }
 
-        if (children[0].nodeName !== 'DIV' || children.length > 1) {
-          content = document.createElement('div');
+        if (children[0].nodeName !== "DIV" || children.length > 1) {
+          content = document.createElement("div");
           content.id = id;
           content.appendChild(html);
         } else {
@@ -438,7 +455,7 @@ const UiDialog = {
 
     contentContainer.appendChild(content);
 
-    if (content.style.getPropertyValue('display') === 'none') {
+    if (content.style.getPropertyValue("display") === "none") {
       DomUtil.show(content);
     }
 
@@ -458,7 +475,7 @@ const UiDialog = {
 
     _container.insertBefore(dialog, _container.firstChild);
 
-    if (typeof options.onSetup === 'function') {
+    if (typeof options.onSetup === "function") {
       options.onSetup(content);
     }
 
@@ -474,48 +491,48 @@ const UiDialog = {
       throw new Error("Expected a valid dialog id, '" + id + "' does not match any active dialog.");
     }
 
-    if (typeof html === 'string') {
+    if (typeof html === "string") {
       DomUtil.setInnerHtml(data.content, html);
     }
 
-    if (Core.stringToBool(data.dialog.getAttribute('aria-hidden'))) {
+    if (Core.stringToBool(data.dialog.getAttribute("aria-hidden"))) {
       // close existing dropdowns
       UiDropdownSimple.closeAll();
       window.WCF.Dropdown.Interactive.Handler.closeAll();
 
       if (_callbackFocus === null) {
         _callbackFocus = this._maintainFocus.bind(this);
-        document.body.addEventListener('focus', _callbackFocus, {capture: true});
+        document.body.addEventListener("focus", _callbackFocus, { capture: true });
       }
 
-      if (data.closable && Core.stringToBool(_container.getAttribute('aria-hidden'))) {
-        window.addEventListener('keyup', _keyupListener);
+      if (data.closable && Core.stringToBool(_container.getAttribute("aria-hidden"))) {
+        window.addEventListener("keyup", _keyupListener);
       }
 
       // Move the dialog to the front to prevent it being hidden behind already open dialogs
       // if it was previously visible.
       data.dialog.parentNode!.insertBefore(data.dialog, data.dialog.parentNode!.firstChild);
 
-      data.dialog.setAttribute('aria-hidden', 'false');
-      _container.setAttribute('aria-hidden', 'false');
-      _container.setAttribute('close-on-click', (data.backdropCloseOnClick ? 'true' : 'false'));
+      data.dialog.setAttribute("aria-hidden", "false");
+      _container.setAttribute("aria-hidden", "false");
+      _container.setAttribute("close-on-click", data.backdropCloseOnClick ? "true" : "false");
       _activeDialog = id;
 
       // Keep a reference to the currently focused element to be able to restore it later.
       _focusedBeforeDialog = document.activeElement;
 
       // Set the focus to the first focusable child of the dialog element.
-      const closeButton = data.header.querySelector('.dialogCloseButton');
-      if (closeButton) closeButton.setAttribute('inert', 'true');
+      const closeButton = data.header.querySelector(".dialogCloseButton");
+      if (closeButton) closeButton.setAttribute("inert", "true");
       this._setFocusToFirstItem(data.dialog, false);
-      if (closeButton) closeButton.removeAttribute('inert');
+      if (closeButton) closeButton.removeAttribute("inert");
 
-      if (typeof data.onShow === 'function') {
+      if (typeof data.onShow === "function") {
         data.onShow(data.content);
       }
 
-      if (Core.stringToBool(data.content.dataset.isStaticDialog || '')) {
-        EventHandler.fire('com.woltlab.wcf.dialog', 'openStatic', {
+      if (Core.stringToBool(data.content.dataset.isStaticDialog || "")) {
+        EventHandler.fire("com.woltlab.wcf.dialog", "openStatic", {
           content: data.content,
           id: id,
         });
@@ -531,7 +548,11 @@ const UiDialog = {
     if (_activeDialog) {
       const data = _dialogs.get(_activeDialog) as DialogData;
       const target = event.target as HTMLElement;
-      if (!data.dialog.contains(target) && !target.closest('.dropdownMenuContainer') && !target.closest('.datePicker')) {
+      if (
+        !data.dialog.contains(target) &&
+        !target.closest(".dropdownMenuContainer") &&
+        !target.closest(".datePicker")
+      ) {
         this._setFocusToFirstItem(data.dialog, true);
       }
     }
@@ -541,9 +562,9 @@ const UiDialog = {
     let focusElement = this._getFirstFocusableChild(dialog);
     if (focusElement !== null) {
       if (maintain) {
-        if (focusElement.id === 'username' || (focusElement as HTMLInputElement).name === 'username') {
-          if (Environment.browser() === 'safari' && Environment.platform() === 'ios') {
-            // iOS Safari's username/password autofill breaks if the input field is focused 
+        if (focusElement.id === "username" || (focusElement as HTMLInputElement).name === "username") {
+          if (Environment.browser() === "safari" && Environment.platform() === "ios") {
+            // iOS Safari's username/password autofill breaks if the input field is focused
             focusElement = null;
           }
         }
@@ -553,12 +574,12 @@ const UiDialog = {
         // Setting the focus to a select element in iOS is pretty strange, because
         // it focuses it, but also displays the keyboard for a fraction of a second,
         // causing it to pop out from below and immediately vanish.
-        // 
+        //
         // iOS will only show the keyboard if an input element is focused *and* the
         // focus is an immediate result of a user interaction. This method must be
         // assumed to be called from within a click event, but we want to set the
         // focus without triggering the keyboard.
-        // 
+        //
         // We can break the condition by wrapping it in a setTimeout() call,
         // effectively tricking iOS into focusing the element without showing the
         // keyboard.
@@ -570,7 +591,7 @@ const UiDialog = {
   },
 
   _getFirstFocusableChild(element: HTMLElement): HTMLElement | null {
-    const nodeList = element.querySelectorAll<HTMLElement>(_focusableElements.join(','));
+    const nodeList = element.querySelectorAll<HTMLElement>(_focusableElements.join(","));
     for (let i = 0, length = nodeList.length; i < length; i++) {
       if (nodeList[i].offsetWidth && nodeList[i].offsetHeight && nodeList[i].getClientRects().length) {
         return nodeList[i];
@@ -592,17 +613,17 @@ const UiDialog = {
     }
 
     // ignore non-active dialogs
-    if (Core.stringToBool(data.dialog.getAttribute('aria-hidden'))) {
+    if (Core.stringToBool(data.dialog.getAttribute("aria-hidden"))) {
       return;
     }
 
     const contentContainer = data.content.parentNode as HTMLElement;
 
-    const formSubmit = data.content.querySelector('.formSubmit') as HTMLElement;
+    const formSubmit = data.content.querySelector(".formSubmit") as HTMLElement;
     let unavailableHeight = 0;
     if (formSubmit !== null) {
-      contentContainer.classList.add('dialogForm');
-      formSubmit.classList.add('dialogFormSubmit');
+      contentContainer.classList.add("dialogForm");
+      formSubmit.classList.add("dialogFormSubmit");
 
       unavailableHeight += DomUtil.outerHeight(formSubmit);
 
@@ -611,45 +632,47 @@ const UiDialog = {
       // working around fractional values, without visually changing anything.
       unavailableHeight -= 1;
 
-      contentContainer.style.setProperty('margin-bottom', unavailableHeight + 'px', '');
+      contentContainer.style.setProperty("margin-bottom", unavailableHeight + "px", "");
     } else {
-      contentContainer.classList.remove('dialogForm');
-      contentContainer.style.removeProperty('margin-bottom');
+      contentContainer.classList.remove("dialogForm");
+      contentContainer.style.removeProperty("margin-bottom");
     }
 
     unavailableHeight += DomUtil.outerHeight(data.header);
 
-    const maximumHeight = (window.innerHeight * (_dialogFullHeight ? 1 : 0.8)) - unavailableHeight;
-    contentContainer.style.setProperty('max-height', ~~maximumHeight + 'px', '');
+    const maximumHeight = window.innerHeight * (_dialogFullHeight ? 1 : 0.8) - unavailableHeight;
+    contentContainer.style.setProperty("max-height", ~~maximumHeight + "px", "");
 
     // fix for a calculation bug in Chrome causing the scrollbar to overlap the border
-    if (Environment.browser() === 'chrome') {
+    if (Environment.browser() === "chrome") {
       if (data.content.scrollHeight > maximumHeight) {
-        data.content.style.setProperty('margin-right', '-1px', '');
+        data.content.style.setProperty("margin-right", "-1px", "");
       } else {
-        data.content.style.removeProperty('margin-right');
+        data.content.style.removeProperty("margin-right");
       }
     }
 
     // Chrome and Safari use heavy anti-aliasing when the dialog's width
     // cannot be evenly divided, causing the whole text to become blurry
-    if (Environment.browser() === 'chrome' || Environment.browser() === 'safari') {
+    if (Environment.browser() === "chrome" || Environment.browser() === "safari") {
       // The new Microsoft Edge is detected as "chrome", because effectively we're detecting
       // Chromium rather than Chrome specifically. The workaround for fractional pixels does
       // not work well in Edge, there seems to be a different logic for fractional positions,
       // causing the text to be blurry.
-      // 
+      //
       // We can use `backface-visibility: hidden` to prevent the anti aliasing artifacts in
       // WebKit/Blink, which will also prevent some weird font rendering issues when resizing.
-      contentContainer.classList.add('jsWebKitFractionalPixelFix');
+      contentContainer.classList.add("jsWebKitFractionalPixelFix");
     }
 
     const callbackObject = _dialogToObject.get(id);
     //noinspection JSUnresolvedVariable
-    if (callbackObject !== undefined && typeof callbackObject._dialogSubmit === 'function') {
+    if (callbackObject !== undefined && typeof callbackObject._dialogSubmit === "function") {
       const inputFields = data.content.querySelectorAll<HTMLInputElement>('input[data-dialog-submit-on-enter="true"]');
 
-      const submitButton = data.content.querySelector('.formSubmit > input[type="submit"], .formSubmit > button[data-type="submit"]');
+      const submitButton = data.content.querySelector(
+        '.formSubmit > input[type="submit"], .formSubmit > button[data-type="submit"]'
+      );
       if (submitButton === null) {
         // check if there is at least one input field with submit handling,
         // otherwise we'll assume the dialog has not been populated yet
@@ -663,14 +686,14 @@ const UiDialog = {
       if (data.submitButton !== submitButton) {
         data.submitButton = submitButton as HTMLElement;
 
-        submitButton.addEventListener('click', event => {
+        submitButton.addEventListener("click", (event) => {
           event.preventDefault();
 
           this._submit(id);
         });
 
         const _callbackKeydown = (event: KeyboardEvent): void => {
-          if (event.key === 'Enter') {
+          if (event.key === "Enter") {
             event.preventDefault();
 
             this._submit(id);
@@ -691,7 +714,7 @@ const UiDialog = {
 
           data.inputFields.add(inputField);
 
-          inputField.addEventListener('keydown', _callbackKeydown);
+          inputField.addEventListener("keydown", _callbackKeydown);
         }
       }
     }
@@ -704,10 +727,10 @@ const UiDialog = {
     const data = _dialogs.get(id);
 
     let isValid = true;
-    data!.inputFields.forEach(inputField => {
+    data!.inputFields.forEach((inputField) => {
       if (inputField.required) {
-        if (inputField.value.trim() === '') {
-          DomUtil.innerError(inputField, Language.get('wcf.global.form.error.empty'));
+        if (inputField.value.trim() === "") {
+          DomUtil.innerError(inputField, Language.get("wcf.global.form.error.empty"));
 
           isValid = false;
         } else {
@@ -718,7 +741,7 @@ const UiDialog = {
 
     if (isValid) {
       const callbackObject = _dialogToObject.get(id) as DialogCallbackObject;
-      if (typeof callbackObject._dialogSubmit === 'function') {
+      if (typeof callbackObject._dialogSubmit === "function") {
         callbackObject._dialogSubmit();
       }
     }
@@ -731,7 +754,7 @@ const UiDialog = {
     event.preventDefault();
 
     const data = _dialogs.get(_activeDialog!) as DialogData;
-    if (typeof data.onBeforeClose === 'function') {
+    if (typeof data.onBeforeClose === "function") {
       data.onBeforeClose(_activeDialog!);
 
       return false;
@@ -750,7 +773,7 @@ const UiDialog = {
       return;
     }
 
-    if (Core.stringToBool(_container.getAttribute('close-on-click'))) {
+    if (Core.stringToBool(_container.getAttribute("close-on-click"))) {
       this._close(event);
     } else {
       event.preventDefault();
@@ -768,15 +791,15 @@ const UiDialog = {
       throw new Error("Expected a valid dialog id, '" + id + "' does not match any active dialog.");
     }
 
-    data.dialog.setAttribute('aria-hidden', 'true');
+    data.dialog.setAttribute("aria-hidden", "true");
 
     // Move the keyboard focus away from a now hidden element.
     const activeElement = document.activeElement as HTMLElement;
-    if (activeElement.closest('.dialogContainer') === data.dialog) {
+    if (activeElement.closest(".dialogContainer") === data.dialog) {
       activeElement.blur();
     }
 
-    if (typeof data.onClose === 'function') {
+    if (typeof data.onClose === "function") {
       data.onClose(id);
     }
 
@@ -784,8 +807,8 @@ const UiDialog = {
     _activeDialog = null;
     for (let i = 0; i < _container.childElementCount; i++) {
       const child = _container.children[i] as HTMLElement;
-      if (!Core.stringToBool(child.getAttribute('aria-hidden'))) {
-        _activeDialog = child.dataset.id || '';
+      if (!Core.stringToBool(child.getAttribute("aria-hidden"))) {
+        _activeDialog = child.dataset.id || "";
         break;
       }
     }
@@ -793,18 +816,18 @@ const UiDialog = {
     UiScreen.pageOverlayClose();
 
     if (_activeDialog === null) {
-      _container.setAttribute('aria-hidden', 'true');
-      _container.dataset.closeOnClick = 'false';
+      _container.setAttribute("aria-hidden", "true");
+      _container.dataset.closeOnClick = "false";
 
       if (data.closable) {
-        window.removeEventListener('keyup', _keyupListener);
+        window.removeEventListener("keyup", _keyupListener);
       }
     } else {
       data = _dialogs.get(_activeDialog) as DialogData;
-      _container.dataset.closeOnClick = data.backdropCloseOnClick ? 'true' : 'false';
+      _container.dataset.closeOnClick = data.backdropCloseOnClick ? "true" : "false";
     }
 
-    if (Environment.platform() !== 'desktop') {
+    if (Environment.platform() !== "desktop") {
       UiScreen.scrollEnable();
     }
   },
@@ -821,7 +844,7 @@ const UiDialog = {
    */
   isOpen(id: ElementIdOrCallbackObject): boolean {
     const data = this.getDialog(id);
-    return data !== undefined && data.dialog.getAttribute('aria-hidden') === 'false';
+    return data !== undefined && data.dialog.getAttribute("aria-hidden") === "false";
   },
 
   /**
@@ -830,7 +853,7 @@ const UiDialog = {
    * @param  {Object}  callbackObject  the same object that was used to invoke `_dialogSetup()` on first call
    */
   destroy(callbackObject: DialogCallbackObject): void {
-    if (typeof callbackObject !== 'object') {
+    if (typeof callbackObject !== "object") {
       throw new TypeError("Expected the callback object as parameter.");
     }
 
@@ -859,7 +882,7 @@ const UiDialog = {
    * @protected
    */
   _getDialogId(id: ElementIdOrCallbackObject): DialogId {
-    if (typeof id === 'object') {
+    if (typeof id === "object") {
       const dialogData = _dialogObjects.get(id);
       if (dialogData !== undefined) {
         return dialogData.id;
index eb5b76427e5e8b44916ef855dbcc134d5d9d3562..c9a7845660ece76b7bc01b316f9190798dd5b7fb 100644 (file)
@@ -1,4 +1,4 @@
-import { RequestPayload, ResponseData } from '../../Ajax/Data';
+import { RequestPayload, ResponseData } from "../../Ajax/Data";
 
 export type DialogHtml = DocumentFragment | string | null;
 
index 76053ed82a973600c76737c7959e336f06700643..1ca6eadf2f03ef3a1683520efd08c884ab625b04 100644 (file)
@@ -7,55 +7,55 @@
  * @module      WoltLabSuite/Core/Ui/Dropdown/Builder
  */
 
-import * as Core from '../../Core';
-import UiDropdownSimple from './Simple';
+import * as Core from "../../Core";
+import UiDropdownSimple from "./Simple";
 
 const _validIconSizes = [16, 24, 32, 48, 64, 96, 144];
 
 function validateList(list: HTMLUListElement): void {
   if (!(list instanceof HTMLUListElement)) {
-    throw new TypeError('Expected a reference to an <ul> element.');
+    throw new TypeError("Expected a reference to an <ul> element.");
   }
 
-  if (!list.classList.contains('dropdownMenu')) {
-    throw new Error('List does not appear to be a dropdown menu.');
+  if (!list.classList.contains("dropdownMenu")) {
+    throw new Error("List does not appear to be a dropdown menu.");
   }
 }
 
 function buildItemFromData(data: DropdownBuilderItemData): HTMLLIElement {
-  const item = document.createElement('li');
+  const item = document.createElement("li");
 
   // handle special `divider` type
-  if (data === 'divider') {
-    item.className = 'dropdownDivider';
+  if (data === "divider") {
+    item.className = "dropdownDivider";
     return item;
   }
 
-  if (typeof data.identifier === 'string') {
+  if (typeof data.identifier === "string") {
     item.dataset.identifier = data.identifier;
   }
 
-  const link = document.createElement('a');
-  link.href = (typeof data.href === 'string') ? data.href : '#';
-  if (typeof data.callback === 'function') {
-    link.addEventListener('click', event => {
+  const link = document.createElement("a");
+  link.href = typeof data.href === "string" ? data.href : "#";
+  if (typeof data.callback === "function") {
+    link.addEventListener("click", (event) => {
       event.preventDefault();
 
       data.callback!(link);
     });
-  } else if (link.href === '#') {
-    throw new Error('Expected either a `href` value or a `callback`.');
+  } else if (link.href === "#") {
+    throw new Error("Expected either a `href` value or a `callback`.");
   }
 
   if (data.attributes && Core.isPlainObject(data.attributes)) {
-    Object.keys(data.attributes).forEach(key => {
+    Object.keys(data.attributes).forEach((key) => {
       const value = data.attributes![key];
-      if (typeof (value as any) !== 'string') {
-        throw new Error('Expected only string values.');
+      if (typeof (value as any) !== "string") {
+        throw new Error("Expected only string values.");
       }
 
       // Support the dash notation for backwards compatibility.
-      if (key.indexOf('-') !== -1) {
+      if (key.indexOf("-") !== -1) {
         link.setAttribute(`data-${key}`, value);
       } else {
         link.dataset[key] = value;
@@ -65,31 +65,31 @@ function buildItemFromData(data: DropdownBuilderItemData): HTMLLIElement {
 
   item.appendChild(link);
 
-  if (typeof data.icon !== 'undefined' && Core.isPlainObject(data.icon)) {
-    if (typeof (data.icon.name as any) !== 'string') {
-      throw new TypeError('Expected a valid icon name.');
+  if (typeof data.icon !== "undefined" && Core.isPlainObject(data.icon)) {
+    if (typeof (data.icon.name as any) !== "string") {
+      throw new TypeError("Expected a valid icon name.");
     }
 
     let size = 16;
-    if (typeof data.icon.size === 'number' && _validIconSizes.indexOf(~~data.icon.size) !== -1) {
+    if (typeof data.icon.size === "number" && _validIconSizes.indexOf(~~data.icon.size) !== -1) {
       size = ~~data.icon.size;
     }
 
-    const icon = document.createElement('span');
-    icon.className = 'icon icon' + size + ' fa-' + data.icon.name;
+    const icon = document.createElement("span");
+    icon.className = "icon icon" + size + " fa-" + data.icon.name;
 
     link.appendChild(icon);
   }
 
-  const label = (typeof (data.label as any) === 'string') ? data.label!.trim() : '';
-  const labelHtml = (typeof (data.labelHtml as any) === 'string') ? data.labelHtml!.trim() : '';
-  if (label === '' && labelHtml === '') {
-    throw new TypeError('Expected either a label or a `labelHtml`.');
+  const label = typeof (data.label as any) === "string" ? data.label!.trim() : "";
+  const labelHtml = typeof (data.labelHtml as any) === "string" ? data.labelHtml!.trim() : "";
+  if (label === "" && labelHtml === "") {
+    throw new TypeError("Expected either a label or a `labelHtml`.");
   }
 
-  const span = document.createElement('span');
-  span[label ? 'textContent' : 'innerHTML'] = (label) ? label : labelHtml;
-  link.appendChild(document.createTextNode(' '));
+  const span = document.createElement("span");
+  span[label ? "textContent" : "innerHTML"] = label ? label : labelHtml;
+  link.appendChild(document.createTextNode(" "));
   link.appendChild(span);
 
   return item;
@@ -101,9 +101,9 @@ function buildItemFromData(data: DropdownBuilderItemData): HTMLLIElement {
  * into the DOM by the callee.
  */
 export function create(items: DropdownBuilderItemData[], identifier?: string): HTMLUListElement {
-  const list = document.createElement('ul');
-  list.className = 'dropdownMenu';
-  if (typeof identifier === 'string') {
+  const list = document.createElement("ul");
+  list.className = "dropdownMenu";
+  if (typeof identifier === "string") {
     list.dataset.identifier = identifier;
   }
 
@@ -137,19 +137,19 @@ export function appendItems(list: HTMLUListElement, items: DropdownBuilderItemDa
   validateList(list);
 
   if (!Array.isArray(items)) {
-    throw new TypeError('Expected an array of items.');
+    throw new TypeError("Expected an array of items.");
   }
 
   const length = items.length;
   if (length === 0) {
-    throw new Error('Expected a non-empty list of items.');
+    throw new Error("Expected a non-empty list of items.");
   }
 
   if (length === 1) {
     appendItem(list, items[0]);
   } else {
     const fragment = document.createDocumentFragment();
-    items.forEach(item => {
+    items.forEach((item) => {
       fragment.appendChild(buildItemFromData(item));
     });
     list.appendChild(fragment);
@@ -162,7 +162,7 @@ export function appendItems(list: HTMLUListElement, items: DropdownBuilderItemDa
 export function setItems(list: HTMLUListElement, items: DropdownBuilderItemData[]): void {
   validateList(list);
 
-  list.innerHTML = '';
+  list.innerHTML = "";
 
   appendItems(list, items);
 }
@@ -177,7 +177,7 @@ export function attach(list: HTMLUListElement, button: HTMLElement): void {
 
   UiDropdownSimple.initFragment(button, list);
 
-  button.addEventListener('click', event => {
+  button.addEventListener("click", (event) => {
     event.preventDefault();
     event.stopPropagation();
 
@@ -190,7 +190,7 @@ export function attach(list: HTMLUListElement, button: HTMLElement): void {
  * be created.
  */
 export function divider(): string {
-  return 'divider';
+  return "divider";
 }
 
 interface BaseItemData {
@@ -202,7 +202,7 @@ interface BaseItemData {
   icon?: {
     name: string;
     size?: 16 | 24 | 32 | 48 | 64 | 96 | 144;
-  }
+  };
   identifier?: string;
   label?: string;
   labelHtml?: string;
index 4a2de38c3b3716bc1a00596efa80a1847e97152d..bd494c28f550e32adaacc07dfc0a589cec4b0bd8 100644 (file)
@@ -1,2 +1,2 @@
-export type NotificationAction = 'close' | 'open';
+export type NotificationAction = "close" | "open";
 export type NotificationCallback = (containerId: string, action: NotificationAction) => void;
index 0f958db8950c35f91b20d5eef9feb4a26adf9ce7..68fd93635cce4c19b36f49354a01737855d7abed 100644 (file)
@@ -8,8 +8,8 @@
  * @module  WoltLabSuite/Core/Ui/Dropdown/Reusable
  */
 
-import UiDropdownSimple from './Simple';
-import { NotificationCallback } from './Data';
+import UiDropdownSimple from "./Simple";
+import { NotificationCallback } from "./Data";
 
 const _dropdowns = new Map<string, string>();
 let _ghostElementId = 0;
@@ -33,8 +33,8 @@ export function init(identifier: string, menu: HTMLElement): void {
     return;
   }
 
-  const ghostElement = document.createElement('div');
-  ghostElement.id = 'reusableDropdownGhost' + _ghostElementId++;
+  const ghostElement = document.createElement("div");
+  ghostElement.id = "reusableDropdownGhost" + _ghostElementId++;
 
   UiDropdownSimple.initFragment(ghostElement, menu);
 
index 22be28fcb8640ac8cf9c44f2d4920c3905ca25fe..a29560309cf3239d27df2ff303f05676f66cf6ba 100644 (file)
@@ -8,15 +8,15 @@
  * @module  WoltLabSuite/Core/Ui/Dropdown/Simple
  */
 
-import CallbackList from '../../CallbackList';
-import * as Core from '../../Core';
-import DomChangeListener from '../../Dom/Change/Listener';
-import * as DomTraverse from '../../Dom/Traverse';
-import DomUtil from '../../Dom/Util';
-import * as UiAlignment from '../Alignment';
-import UiCloseOverlay from '../CloseOverlay';
-import { AllowFlip } from '../Alignment';
-import { NotificationAction, NotificationCallback } from './Data';
+import CallbackList from "../../CallbackList";
+import * as Core from "../../Core";
+import DomChangeListener from "../../Dom/Change/Listener";
+import * as DomTraverse from "../../Dom/Traverse";
+import DomUtil from "../../Dom/Util";
+import * as UiAlignment from "../Alignment";
+import UiCloseOverlay from "../CloseOverlay";
+import { AllowFlip } from "../Alignment";
+import { NotificationAction, NotificationCallback } from "./Data";
 
 let _availableDropdowns: HTMLCollectionOf<HTMLElement>;
 const _callbacks = new CallbackList();
@@ -24,14 +24,14 @@ let _didInit = false;
 const _dropdowns = new Map<string, HTMLElement>();
 const _menus = new Map<string, HTMLElement>();
 let _menuContainer: HTMLElement;
-let _activeTargetId = '';
+let _activeTargetId = "";
 
 /**
  * Handles drop-down positions in overlays when scrolling in the overlay.
  */
 function onDialogScroll(event: WheelEvent): void {
   const dialogContent = event.currentTarget as HTMLElement;
-  const dropdowns = dialogContent.querySelectorAll('.dropdown.dropdownOpen');
+  const dropdowns = dialogContent.querySelectorAll(".dropdown.dropdownOpen");
 
   for (let i = 0, length = dropdowns.length; i < length; i++) {
     const dropdown = dropdowns[i];
@@ -63,12 +63,12 @@ function onDialogScroll(event: WheelEvent): void {
  */
 function onScroll() {
   _dropdowns.forEach((dropdown, containerId) => {
-    if (dropdown.classList.contains('dropdownOpen')) {
-      if (Core.stringToBool(dropdown.dataset.isOverlayDropdownButton || '')) {
+    if (dropdown.classList.contains("dropdownOpen")) {
+      if (Core.stringToBool(dropdown.dataset.isOverlayDropdownButton || "")) {
         UiDropdownSimple.setAlignment(dropdown, _menus.get(containerId)!);
       } else {
         const menu = _menus.get(dropdown.id) as HTMLElement;
-        if (!Core.stringToBool(menu.dataset.dropdownIgnorePageScroll || '')) {
+        if (!Core.stringToBool(menu.dataset.dropdownIgnorePageScroll || "")) {
           UiDropdownSimple.close(containerId);
         }
       }
@@ -80,7 +80,7 @@ function onScroll() {
  * Notifies callbacks on status change.
  */
 function notifyCallbacks(containerId: string, action: NotificationAction): void {
-  _callbacks.forEach(containerId, callback => {
+  _callbacks.forEach(containerId, (callback) => {
     callback(containerId, action);
   });
 }
@@ -88,7 +88,12 @@ function notifyCallbacks(containerId: string, action: NotificationAction): void
 /**
  * Toggles the drop-down's state between open and close.
  */
-function toggle(event: KeyboardEvent | MouseEvent | null, targetId?: string, alternateElement?: HTMLElement, disableAutoFocus?: boolean): boolean {
+function toggle(
+  event: KeyboardEvent | MouseEvent | null,
+  targetId?: string,
+  alternateElement?: HTMLElement,
+  disableAutoFocus?: boolean
+): boolean {
   if (event !== null) {
     event.preventDefault();
     event.stopPropagation();
@@ -112,12 +117,12 @@ function toggle(event: KeyboardEvent | MouseEvent | null, targetId?: string, alt
       button = event.currentTarget;
       parent = button.parentNode;
       if (parent !== dropdown) {
-        parent.classList.add('dropdown');
+        parent.classList.add("dropdown");
         parent.id = dropdown.id;
 
         // remove dropdown class and id from old parent
-        dropdown.classList.remove('dropdown');
-        dropdown.id = '';
+        dropdown.classList.remove("dropdown");
+        dropdown.id = "";
 
         dropdown = parent;
         _dropdowns.set(targetId!, parent);
@@ -125,16 +130,16 @@ function toggle(event: KeyboardEvent | MouseEvent | null, targetId?: string, alt
     }
 
     if (disableAutoFocus === undefined) {
-      button = dropdown.closest('.dropdownToggle');
+      button = dropdown.closest(".dropdownToggle");
       if (!button) {
-        button = dropdown.querySelector('.dropdownToggle');
+        button = dropdown.querySelector(".dropdownToggle");
 
         if (!button && dropdown.id) {
           button = document.querySelector('[data-target="' + dropdown.id + '"]');
         }
       }
 
-      if (button && Core.stringToBool(button.dataset.dropdownLazyInit || '')) {
+      if (button && Core.stringToBool(button.dataset.dropdownLazyInit || "")) {
         disableAutoFocus = true;
       }
     }
@@ -143,82 +148,85 @@ function toggle(event: KeyboardEvent | MouseEvent | null, targetId?: string, alt
     // to close it is by clicking somewhere else in the document or on another dropdown
     // toggle. This is used with the search bar to prevent the dropdown from closing by
     // setting the caret position in the search input field.
-    if (Core.stringToBool(dropdown.dataset.dropdownPreventToggle || '') && dropdown.classList.contains('dropdownOpen')) {
+    if (
+      Core.stringToBool(dropdown.dataset.dropdownPreventToggle || "") &&
+      dropdown.classList.contains("dropdownOpen")
+    ) {
       preventToggle = true;
     }
 
     // check if 'isOverlayDropdownButton' is set which indicates that the dropdown toggle is within an overlay
-    if (dropdown.dataset.isOverlayDropdownButton === '') {
-      const dialogContent = DomTraverse.parentByClass(dropdown, 'dialogContent');
-      dropdown.dataset.isOverlayDropdownButton = (dialogContent !== null) ? 'true' : 'false';
+    if (dropdown.dataset.isOverlayDropdownButton === "") {
+      const dialogContent = DomTraverse.parentByClass(dropdown, "dialogContent");
+      dropdown.dataset.isOverlayDropdownButton = dialogContent !== null ? "true" : "false";
 
       if (dialogContent !== null) {
-        dialogContent.addEventListener('scroll', onDialogScroll);
+        dialogContent.addEventListener("scroll", onDialogScroll);
       }
     }
   }
 
   // close all dropdowns
-  _activeTargetId = '';
+  _activeTargetId = "";
   _dropdowns.forEach((dropdown, containerId) => {
     const menu = _menus.get(containerId) as HTMLElement;
     let firstListItem: HTMLLIElement | null = null;
 
-    if (dropdown.classList.contains('dropdownOpen')) {
+    if (dropdown.classList.contains("dropdownOpen")) {
       if (!preventToggle) {
-        dropdown.classList.remove('dropdownOpen');
-        menu.classList.remove('dropdownOpen');
+        dropdown.classList.remove("dropdownOpen");
+        menu.classList.remove("dropdownOpen");
 
-        const button = dropdown.querySelector('.dropdownToggle');
-        if (button) button.setAttribute('aria-expanded', 'false');
+        const button = dropdown.querySelector(".dropdownToggle");
+        if (button) button.setAttribute("aria-expanded", "false");
 
-        notifyCallbacks(containerId, 'close');
+        notifyCallbacks(containerId, "close");
       } else {
         _activeTargetId = targetId!;
       }
     } else if (containerId === targetId && menu.childElementCount > 0) {
       _activeTargetId = targetId;
-      dropdown.classList.add('dropdownOpen');
-      menu.classList.add('dropdownOpen');
+      dropdown.classList.add("dropdownOpen");
+      menu.classList.add("dropdownOpen");
 
-      const button = dropdown.querySelector('.dropdownToggle');
-      if (button) button.setAttribute('aria-expanded', 'true');
+      const button = dropdown.querySelector(".dropdownToggle");
+      if (button) button.setAttribute("aria-expanded", "true");
 
-      const list: HTMLElement | null = menu.childElementCount > 0 ? menu.children[0] as HTMLElement : null;
-      if (list && Core.stringToBool(list.dataset.scrollToActive || '')) {
+      const list: HTMLElement | null = menu.childElementCount > 0 ? (menu.children[0] as HTMLElement) : null;
+      if (list && Core.stringToBool(list.dataset.scrollToActive || "")) {
         delete list.dataset.scrollToActive;
 
         let active: HTMLElement | null = null;
         for (let i = 0, length = list.childElementCount; i < length; i++) {
-          if (list.children[i].classList.contains('active')) {
+          if (list.children[i].classList.contains("active")) {
             active = list.children[i] as HTMLElement;
             break;
           }
         }
 
         if (active) {
-          list.scrollTop = Math.max((active.offsetTop + active.clientHeight) - menu.clientHeight, 0);
+          list.scrollTop = Math.max(active.offsetTop + active.clientHeight - menu.clientHeight, 0);
         }
       }
 
-      const itemList = menu.querySelector('.scrollableDropdownMenu');
+      const itemList = menu.querySelector(".scrollableDropdownMenu");
       if (itemList !== null) {
-        itemList.classList[(itemList.scrollHeight > itemList.clientHeight ? 'add' : 'remove')]('forceScrollbar');
+        itemList.classList[itemList.scrollHeight > itemList.clientHeight ? "add" : "remove"]("forceScrollbar");
       }
 
-      notifyCallbacks(containerId, 'open');
+      notifyCallbacks(containerId, "open");
 
       if (!disableAutoFocus) {
-        menu.setAttribute('role', 'menu');
+        menu.setAttribute("role", "menu");
         menu.tabIndex = -1;
-        menu.removeEventListener('keydown', dropdownMenuKeyDown);
-        menu.addEventListener('keydown', dropdownMenuKeyDown);
-        menu.querySelectorAll('li').forEach(listItem => {
+        menu.removeEventListener("keydown", dropdownMenuKeyDown);
+        menu.addEventListener("keydown", dropdownMenuKeyDown);
+        menu.querySelectorAll("li").forEach((listItem) => {
           if (!listItem.clientHeight) return;
           if (firstListItem === null) firstListItem = listItem;
-          else if (listItem.classList.contains('active')) firstListItem = listItem;
+          else if (listItem.classList.contains("active")) firstListItem = listItem;
 
-          listItem.setAttribute('role', 'menuitem');
+          listItem.setAttribute("role", "menuitem");
           listItem.tabIndex = -1;
         });
       }
@@ -233,18 +241,18 @@ function toggle(event: KeyboardEvent | MouseEvent | null, targetId?: string, alt
 
   window.WCF.Dropdown.Interactive.Handler.closeAll();
 
-  return (event === null);
+  return event === null;
 }
 
 function handleKeyDown(event: KeyboardEvent): void {
   // <input> elements are not valid targets for drop-down menus. However, some developers
   // might still decide to combine them, in which case we try not to break things even more.
   const target = event.currentTarget as HTMLElement;
-  if (target.nodeName === 'INPUT') {
+  if (target.nodeName === "INPUT") {
     return;
   }
 
-  if (event.key === 'Enter' || event.key === 'Space') {
+  if (event.key === "Enter" || event.key === "Space") {
     event.preventDefault();
     toggle(event);
   }
@@ -252,25 +260,25 @@ function handleKeyDown(event: KeyboardEvent): void {
 
 function dropdownMenuKeyDown(event: KeyboardEvent): void {
   const activeItem = document.activeElement as HTMLElement;
-  if (activeItem.nodeName !== 'LI') {
+  if (activeItem.nodeName !== "LI") {
     return;
   }
 
-  if (event.key === 'ArrowDown' || event.key === 'ArrowUp' || event.key === 'End' || event.key === 'Home') {
+  if (event.key === "ArrowDown" || event.key === "ArrowUp" || event.key === "End" || event.key === "Home") {
     event.preventDefault();
 
-    const listItems: HTMLElement[] = Array.from(activeItem.closest('.dropdownMenu')!.querySelectorAll('li'));
-    if (event.key === 'ArrowUp' || event.key === 'End') {
+    const listItems: HTMLElement[] = Array.from(activeItem.closest(".dropdownMenu")!.querySelectorAll("li"));
+    if (event.key === "ArrowUp" || event.key === "End") {
       listItems.reverse();
     }
 
     let newActiveItem: HTMLElement | null = null;
-    const isValidItem = listItem => {
-      return !listItem.classList.contains('dropdownDivider') && listItem.clientHeight > 0;
+    const isValidItem = (listItem) => {
+      return !listItem.classList.contains("dropdownDivider") && listItem.clientHeight > 0;
     };
 
     let activeIndex = listItems.indexOf(activeItem);
-    if (event.key === 'End' || event.key === 'Home') {
+    if (event.key === "End" || event.key === "Home") {
       activeIndex = -1;
     }
 
@@ -288,32 +296,35 @@ function dropdownMenuKeyDown(event: KeyboardEvent): void {
     if (newActiveItem !== null) {
       newActiveItem.focus();
     }
-  } else if (event.key === 'Enter' || event.key === 'Space') {
+  } else if (event.key === "Enter" || event.key === "Space") {
     event.preventDefault();
 
     let target = activeItem;
-    if (target.childElementCount === 1 && (target.children[0].nodeName === 'SPAN' || target.children[0].nodeName === 'A')) {
+    if (
+      target.childElementCount === 1 &&
+      (target.children[0].nodeName === "SPAN" || target.children[0].nodeName === "A")
+    ) {
       target = target.children[0] as HTMLElement;
     }
 
     const dropdown = _dropdowns.get(_activeTargetId)!;
-    const button = dropdown.querySelector('.dropdownToggle') as HTMLElement;
+    const button = dropdown.querySelector(".dropdownToggle") as HTMLElement;
 
-    const mouseEvent = dropdown.dataset.a11yMouseEvent || 'click';
+    const mouseEvent = dropdown.dataset.a11yMouseEvent || "click";
     Core.triggerEvent(target, mouseEvent);
 
     if (button) {
       button.focus();
     }
-  } else if (event.key === 'Escape' || event.key === 'Tab') {
+  } else if (event.key === "Escape" || event.key === "Tab") {
     event.preventDefault();
 
     const dropdown = _dropdowns.get(_activeTargetId)!;
-    let button: HTMLElement | null = dropdown.querySelector('.dropdownToggle');
+    let button: HTMLElement | null = dropdown.querySelector(".dropdownToggle");
 
     // Remote controlled drop-down menus may not have a dedicated toggle button, instead the
     // `dropdown` element itself is the button.
-    if (button === null && !dropdown.classList.contains('dropdown')) {
+    if (button === null && !dropdown.classList.contains("dropdown")) {
       button = dropdown;
     }
 
@@ -332,18 +343,18 @@ const UiDropdownSimple = {
     if (_didInit) return;
     _didInit = true;
 
-    _menuContainer = document.createElement('div');
-    _menuContainer.className = 'dropdownMenuContainer';
+    _menuContainer = document.createElement("div");
+    _menuContainer.className = "dropdownMenuContainer";
     document.body.appendChild(_menuContainer);
 
-    _availableDropdowns = document.getElementsByClassName('dropdownToggle') as HTMLCollectionOf<HTMLElement>;
+    _availableDropdowns = document.getElementsByClassName("dropdownToggle") as HTMLCollectionOf<HTMLElement>;
 
     UiDropdownSimple.initAll();
 
-    UiCloseOverlay.add('WoltLabSuite/Core/Ui/Dropdown/Simple', UiDropdownSimple.closeAll);
-    DomChangeListener.add('WoltLabSuite/Core/Ui/Dropdown/Simple', UiDropdownSimple.initAll);
+    UiCloseOverlay.add("WoltLabSuite/Core/Ui/Dropdown/Simple", UiDropdownSimple.closeAll);
+    DomChangeListener.add("WoltLabSuite/Core/Ui/Dropdown/Simple", UiDropdownSimple.initAll);
 
-    document.addEventListener('scroll', onScroll);
+    document.addEventListener("scroll", onScroll);
 
     // expose on window object for backward compatibility
     window.bc_wcfSimpleDropdown = this;
@@ -364,23 +375,27 @@ const UiDropdownSimple = {
   init(button: HTMLElement, isLazyInitialization?: boolean | MouseEvent): boolean {
     UiDropdownSimple.setup();
 
-    button.setAttribute('role', 'button');
+    button.setAttribute("role", "button");
     button.tabIndex = 0;
-    button.setAttribute('aria-haspopup', 'true');
-    button.setAttribute('aria-expanded', 'false');
+    button.setAttribute("aria-haspopup", "true");
+    button.setAttribute("aria-expanded", "false");
 
-    if (button.classList.contains('jsDropdownEnabled') || button.dataset.target) {
+    if (button.classList.contains("jsDropdownEnabled") || button.dataset.target) {
       return false;
     }
 
-    const dropdown = DomTraverse.parentByClass(button, 'dropdown') as HTMLElement;
+    const dropdown = DomTraverse.parentByClass(button, "dropdown") as HTMLElement;
     if (dropdown === null) {
-      throw new Error("Invalid dropdown passed, button '" + DomUtil.identify(button) + "' does not have a parent with .dropdown.");
+      throw new Error(
+        "Invalid dropdown passed, button '" + DomUtil.identify(button) + "' does not have a parent with .dropdown."
+      );
     }
 
-    const menu = DomTraverse.nextByClass(button, 'dropdownMenu') as HTMLElement;
+    const menu = DomTraverse.nextByClass(button, "dropdownMenu") as HTMLElement;
     if (menu === null) {
-      throw new Error("Invalid dropdown passed, button '" + DomUtil.identify(button) + "' does not have a menu as next sibling.");
+      throw new Error(
+        "Invalid dropdown passed, button '" + DomUtil.identify(button) + "' does not have a menu as next sibling."
+      );
     }
 
     // move menu into global container
@@ -388,9 +403,9 @@ const UiDropdownSimple = {
 
     const containerId = DomUtil.identify(dropdown);
     if (!_dropdowns.has(containerId)) {
-      button.classList.add('jsDropdownEnabled');
-      button.addEventListener('click', toggle);
-      button.addEventListener('keydown', handleKeyDown);
+      button.classList.add("jsDropdownEnabled");
+      button.addEventListener("click", toggle);
+      button.addEventListener("keydown", handleKeyDown);
 
       _dropdowns.set(containerId, dropdown);
       _menus.set(containerId, menu);
@@ -400,23 +415,27 @@ const UiDropdownSimple = {
       }
 
       // prevent page scrolling
-      if (menu.childElementCount && menu.children[0].classList.contains('scrollableDropdownMenu')) {
+      if (menu.childElementCount && menu.children[0].classList.contains("scrollableDropdownMenu")) {
         const child = menu.children[0] as HTMLElement;
-        child.dataset.scrollToActive = 'true';
+        child.dataset.scrollToActive = "true";
 
         let menuHeight: number | null = null;
         let menuRealHeight: number | null = null;
-        child.addEventListener('wheel', event => {
-          if (menuHeight === null) menuHeight = child.clientHeight;
-          if (menuRealHeight === null) menuRealHeight = child.scrollHeight;
-
-          // negative value: scrolling up
-          if (event.deltaY < 0 && child.scrollTop === 0) {
-            event.preventDefault();
-          } else if (event.deltaY > 0 && (child.scrollTop + menuHeight === menuRealHeight)) {
-            event.preventDefault();
-          }
-        }, {passive: false});
+        child.addEventListener(
+          "wheel",
+          (event) => {
+            if (menuHeight === null) menuHeight = child.clientHeight;
+            if (menuRealHeight === null) menuRealHeight = child.scrollHeight;
+
+            // negative value: scrolling up
+            if (event.deltaY < 0 && child.scrollTop === 0) {
+              event.preventDefault();
+            } else if (event.deltaY > 0 && child.scrollTop + menuHeight === menuRealHeight) {
+              event.preventDefault();
+            }
+          },
+          { passive: false }
+        );
       }
     }
 
@@ -424,9 +443,9 @@ const UiDropdownSimple = {
 
     if (isLazyInitialization) {
       setTimeout(() => {
-        button.dataset.dropdownLazyInit = (isLazyInitialization instanceof MouseEvent) ? 'true' : 'false';
+        button.dataset.dropdownLazyInit = isLazyInitialization instanceof MouseEvent ? "true" : "false";
 
-        Core.triggerEvent(button, 'click');
+        Core.triggerEvent(button, "click");
 
         setTimeout(() => {
           delete button.dataset.dropdownLazyInit;
@@ -487,22 +506,22 @@ const UiDropdownSimple = {
    */
   setAlignment(dropdown: HTMLElement, dropdownMenu: HTMLElement, alternateElement?: HTMLElement): void {
     // check if button belongs to an i18n textarea
-    const button = dropdown.querySelector('.dropdownToggle');
-    const parent = (button !== null) ? button.parentNode as HTMLElement : null;
+    const button = dropdown.querySelector(".dropdownToggle");
+    const parent = button !== null ? (button.parentNode as HTMLElement) : null;
     let refDimensionsElement;
-    if (parent && parent.classList.contains('inputAddonTextarea')) {
+    if (parent && parent.classList.contains("inputAddonTextarea")) {
       refDimensionsElement = button;
     }
 
     UiAlignment.set(dropdownMenu, alternateElement || dropdown, {
-      pointerClassNames: ['dropdownArrowBottom', 'dropdownArrowRight'],
+      pointerClassNames: ["dropdownArrowBottom", "dropdownArrowRight"],
       refDimensionsElement: refDimensionsElement || null,
 
       // alignment
-      horizontal: dropdownMenu.dataset.dropdownAlignmentHorizontal === 'right' ? 'right' : 'left',
-      vertical: dropdownMenu.dataset.dropdownAlignmentVertical === 'top' ? 'top' : 'bottom',
+      horizontal: dropdownMenu.dataset.dropdownAlignmentHorizontal === "right" ? "right" : "left",
+      vertical: dropdownMenu.dataset.dropdownAlignmentVertical === "top" ? "top" : "bottom",
 
-      allowFlip: dropdownMenu.dataset.dropdownAllowFlip as AllowFlip || 'both',
+      allowFlip: (dropdownMenu.dataset.dropdownAllowFlip as AllowFlip) || "both",
     });
   },
 
@@ -525,7 +544,7 @@ const UiDropdownSimple = {
    */
   isOpen(containerId: string): boolean {
     const menu = _menus.get(containerId);
-    return (menu !== undefined && menu.classList.contains('dropdownOpen'));
+    return menu !== undefined && menu.classList.contains("dropdownOpen");
   },
 
   /**
@@ -533,7 +552,7 @@ const UiDropdownSimple = {
    */
   open(containerId: string, disableAutoFocus?: boolean): void {
     const menu = _menus.get(containerId);
-    if (menu !== undefined && !menu.classList.contains('dropdownOpen')) {
+    if (menu !== undefined && !menu.classList.contains("dropdownOpen")) {
       UiDropdownSimple.toggleDropdown(containerId, undefined, disableAutoFocus);
     }
   },
@@ -544,8 +563,8 @@ const UiDropdownSimple = {
   close(containerId: string): void {
     const dropdown = _dropdowns.get(containerId);
     if (dropdown !== undefined) {
-      dropdown.classList.remove('dropdownOpen');
-      _menus.get(containerId)!.classList.remove('dropdownOpen');
+      dropdown.classList.remove("dropdownOpen");
+      _menus.get(containerId)!.classList.remove("dropdownOpen");
     }
   },
 
@@ -554,11 +573,11 @@ const UiDropdownSimple = {
    */
   closeAll(): void {
     _dropdowns.forEach((dropdown, containerId) => {
-      if (dropdown.classList.contains('dropdownOpen')) {
-        dropdown.classList.remove('dropdownOpen');
-        _menus.get(containerId)!.classList.remove('dropdownOpen');
+      if (dropdown.classList.contains("dropdownOpen")) {
+        dropdown.classList.remove("dropdownOpen");
+        _menus.get(containerId)!.classList.remove("dropdownOpen");
 
-        notifyCallbacks(containerId, 'close');
+        notifyCallbacks(containerId, "close");
       }
     });
   },
@@ -586,7 +605,12 @@ const UiDropdownSimple = {
   },
 
   // Legacy call required for `WCF.Dropdown`
-  _toggle(event: KeyboardEvent | MouseEvent | null, targetId?: string, alternateElement?: HTMLElement, disableAutoFocus?: boolean): boolean {
+  _toggle(
+    event: KeyboardEvent | MouseEvent | null,
+    targetId?: string,
+    alternateElement?: HTMLElement,
+    disableAutoFocus?: boolean
+  ): boolean {
     return toggle(event, targetId, alternateElement, disableAutoFocus);
   },
 };
index 8a6596fbbb6d3a4e1e6f13ed2134b74c0423aa52..c62417475eb9f13b246c1472659808062d3021c2 100644 (file)
@@ -8,11 +8,11 @@
  * @since  5.2
  */
 
-import * as Ajax from '../../Ajax';
-import { AjaxCallbackObject, DatabaseObjectActionResponse } from '../../Ajax/Data';
-import * as Core from '../../Core';
-import DomChangeListener from '../../Dom/Change/Listener';
-import * as Language from '../../Language';
+import * as Ajax from "../../Ajax";
+import { AjaxCallbackObject, DatabaseObjectActionResponse } from "../../Ajax/Data";
+import * as Core from "../../Core";
+import DomChangeListener from "../../Dom/Change/Listener";
+import * as Language from "../../Language";
 
 interface AjaxResponse extends DatabaseObjectActionResponse {
   uniqueFileId: string;
@@ -64,7 +64,7 @@ class UiFileDelete implements AjaxCallbackObject {
    */
   private createButtons(): void {
     let triggerChange = false;
-    this.target.querySelectorAll('li.uploadedFile').forEach((element: HTMLElement) => {
+    this.target.querySelectorAll("li.uploadedFile").forEach((element: HTMLElement) => {
       const uniqueFileId = element.dataset.uniqueFileId!;
       if (this.containers.has(uniqueFileId)) {
         return;
@@ -90,19 +90,19 @@ class UiFileDelete implements AjaxCallbackObject {
    * Init the delete button for a specific element.
    */
   private initDeleteButton(element: HTMLElement, elementData: ElementData): void {
-    const buttonGroup = element.querySelector('.buttonGroup');
+    const buttonGroup = element.querySelector(".buttonGroup");
     if (buttonGroup === null) {
       throw new Error(`Button group in '${this.target.id}' is unknown.`);
     }
 
-    const li = document.createElement('li');
-    const span = document.createElement('span');
+    const li = document.createElement("li");
+    const span = document.createElement("span");
     span.className = "button jsDeleteButton small";
-    span.textContent = Language.get('wcf.global.button.delete');
+    span.textContent = Language.get("wcf.global.button.delete");
     li.appendChild(span);
     buttonGroup.appendChild(li);
 
-    li.addEventListener('click', this.deleteElement.bind(this, elementData.uniqueFileId));
+    li.addEventListener("click", this.deleteElement.bind(this, elementData.uniqueFileId));
   }
 
   /**
@@ -124,7 +124,7 @@ class UiFileDelete implements AjaxCallbackObject {
       return;
     }
 
-    const img = this.target.querySelector('img');
+    const img = this.target.querySelector("img");
     if (img !== null) {
       const uniqueFileId = img.dataset.uniqueFileId!;
 
@@ -136,16 +136,16 @@ class UiFileDelete implements AjaxCallbackObject {
 
         this.containers.set(uniqueFileId, elementData);
 
-        this.deleteButton = document.createElement('p');
-        this.deleteButton.className = 'button deleteButton';
+        this.deleteButton = document.createElement("p");
+        this.deleteButton.className = "button deleteButton";
 
-        const span = document.createElement('span');
-        span.textContent = Language.get('wcf.global.button.delete');
+        const span = document.createElement("span");
+        span.textContent = Language.get("wcf.global.button.delete");
         this.deleteButton.appendChild(span);
 
         this.buttonContainer.appendChild(this.deleteButton);
 
-        this.deleteButton.addEventListener('click', this.deleteElement.bind(this, elementData.uniqueFileId));
+        this.deleteButton.addEventListener("click", this.deleteElement.bind(this, elementData.uniqueFileId));
       }
     }
   }
@@ -160,14 +160,14 @@ class UiFileDelete implements AjaxCallbackObject {
     }
 
     this.uploadHandler.checkMaxFiles();
-    Core.triggerEvent(this.target, 'change');
+    Core.triggerEvent(this.target, "change");
   }
 
   _ajaxSetup() {
     return {
-      url: 'index.php?ajax-file-delete/&t=' + window.SECURITY_TOKEN,
+      url: "index.php?ajax-file-delete/&t=" + window.SECURITY_TOKEN,
     };
   }
 }
 
-export = UiFileDelete
+export = UiFileDelete;
index fba1e07cff8388b3dfd88ef7819eafdd749b27d0..ef142804632ee4f7cee5c3478ed114a952ab78d3 100644 (file)
@@ -8,10 +8,10 @@
  * @module  WoltLabSuite/Core/Ui/FlexibleMenu
  */
 
-import DomChangeListener from '../Dom/Change/Listener';
-import DomUtil from '../Dom/Util';
-import * as DomTraverse from '../Dom/Traverse';
-import UiDropdownSimple from './Dropdown/Simple';
+import DomChangeListener from "../Dom/Change/Listener";
+import DomUtil from "../Dom/Util";
+import * as DomTraverse from "../Dom/Traverse";
+import UiDropdownSimple from "./Dropdown/Simple";
 
 const _containers = new Map<string, HTMLElement>();
 const _dropdowns = new Map<string, HTMLLIElement>();
@@ -22,17 +22,17 @@ const _itemLists = new Map<string, HTMLUListElement>();
  * Register default menus and set up event listeners.
  */
 export function setup(): void {
-  if (document.getElementById('mainMenu') !== null) {
-    register('mainMenu');
+  if (document.getElementById("mainMenu") !== null) {
+    register("mainMenu");
   }
 
-  const navigationHeader = document.querySelector('.navigationHeader');
+  const navigationHeader = document.querySelector(".navigationHeader");
   if (navigationHeader !== null) {
     register(DomUtil.identify(navigationHeader));
   }
 
-  window.addEventListener('resize', rebuildAll);
-  DomChangeListener.add('WoltLabSuite/Core/Ui/FlexibleMenu', registerTabMenus);
+  window.addEventListener("resize", rebuildAll);
+  DomChangeListener.add("WoltLabSuite/Core/Ui/FlexibleMenu", registerTabMenus);
 }
 
 /**
@@ -48,7 +48,7 @@ export function register(containerId: string): void {
     return;
   }
 
-  const list = DomTraverse.childByTag(container, 'UL') as HTMLUListElement;
+  const list = DomTraverse.childByTag(container, "UL") as HTMLUListElement;
   if (list === null) {
     throw "Expected an <ul> element as child of container '" + containerId + "'.";
   }
@@ -63,13 +63,15 @@ export function register(containerId: string): void {
  * Registers tab menus.
  */
 export function registerTabMenus(): void {
-  document.querySelectorAll('.tabMenuContainer:not(.jsFlexibleMenuEnabled), .messageTabMenu:not(.jsFlexibleMenuEnabled)').forEach(tabMenu => {
-    const nav = DomTraverse.childByTag(tabMenu, 'NAV');
-    if (nav !== null) {
-      tabMenu.classList.add('jsFlexibleMenuEnabled');
-      register(DomUtil.identify(nav));
-    }
-  });
+  document
+    .querySelectorAll(".tabMenuContainer:not(.jsFlexibleMenuEnabled), .messageTabMenu:not(.jsFlexibleMenuEnabled)")
+    .forEach((tabMenu) => {
+      const nav = DomTraverse.childByTag(tabMenu, "NAV");
+      if (nav !== null) {
+        tabMenu.classList.add("jsFlexibleMenuEnabled");
+        register(DomUtil.identify(nav));
+      }
+    });
 }
 
 /**
@@ -93,18 +95,18 @@ export function rebuild(containerId: string): void {
   const styles = window.getComputedStyle(container);
   const parent = container.parentNode as HTMLElement;
   let availableWidth = parent.clientWidth;
-  availableWidth -= DomUtil.styleAsInt(styles, 'margin-left');
-  availableWidth -= DomUtil.styleAsInt(styles, 'margin-right');
+  availableWidth -= DomUtil.styleAsInt(styles, "margin-left");
+  availableWidth -= DomUtil.styleAsInt(styles, "margin-right");
 
   const list = _itemLists.get(containerId)!;
-  const items = DomTraverse.childrenByTag(list, 'LI') as HTMLLIElement[];
+  const items = DomTraverse.childrenByTag(list, "LI") as HTMLLIElement[];
   let dropdown = _dropdowns.get(containerId);
   let dropdownWidth = 0;
   if (dropdown !== undefined) {
     // show all items for calculation
     for (let i = 0, length = items.length; i < length; i++) {
       const item = items[i];
-      if (item.classList.contains('dropdown')) {
+      if (item.classList.contains("dropdown")) {
         continue;
       }
 
@@ -123,7 +125,11 @@ export function rebuild(containerId: string): void {
       const item = items[i];
 
       // ignore dropdown and active item
-      if (item.classList.contains('dropdown') || item.classList.contains('active') || item.classList.contains('ui-state-active')) {
+      if (
+        item.classList.contains("dropdown") ||
+        item.classList.contains("active") ||
+        item.classList.contains("ui-state-active")
+      ) {
         continue;
       }
 
@@ -139,15 +145,15 @@ export function rebuild(containerId: string): void {
   if (hiddenItems.length) {
     let dropdownMenu: HTMLUListElement;
     if (dropdown === undefined) {
-      dropdown = document.createElement('li');
-      dropdown.className = 'dropdown jsFlexibleMenuDropdown';
+      dropdown = document.createElement("li");
+      dropdown.className = "dropdown jsFlexibleMenuDropdown";
 
-      const icon = document.createElement('a');
-      icon.className = 'icon icon16 fa-list';
+      const icon = document.createElement("a");
+      icon.className = "icon icon16 fa-list";
       dropdown.appendChild(icon);
 
-      dropdownMenu = document.createElement('ul');
-      dropdownMenu.classList.add('dropdownMenu');
+      dropdownMenu = document.createElement("ul");
+      dropdownMenu.classList.add("dropdownMenu");
       dropdown.appendChild(dropdownMenu);
 
       _dropdowns.set(containerId, dropdown);
@@ -163,14 +169,14 @@ export function rebuild(containerId: string): void {
 
     // build dropdown menu
     const fragment = document.createDocumentFragment();
-    hiddenItems.forEach(hiddenItem => {
-      const item = document.createElement('li');
+    hiddenItems.forEach((hiddenItem) => {
+      const item = document.createElement("li");
       item.innerHTML = hiddenItem.innerHTML;
 
-      item.addEventListener('click', event => {
+      item.addEventListener("click", (event) => {
         event.preventDefault();
 
-        hiddenItem.querySelector('a')?.click();
+        hiddenItem.querySelector("a")?.click();
 
         // force a rebuild to guarantee the active item being visible
         setTimeout(() => {
@@ -181,7 +187,7 @@ export function rebuild(containerId: string): void {
       fragment.appendChild(item);
     });
 
-    dropdownMenu.innerHTML = '';
+    dropdownMenu.innerHTML = "";
     dropdownMenu.appendChild(fragment);
   } else if (dropdown !== undefined && dropdown.parentNode !== null) {
     dropdown.remove();
index eed41aa83235bfd9986a76cd36f34da991ff1a2c..16828591a3f5a68b1b805fabd0046f668830650f 100644 (file)
@@ -7,15 +7,15 @@
  * @module  WoltLabSuite/Core/Ui/ItemList
  */
 
-import * as Core from '../Core';
-import * as DomTraverse from '../Dom/Traverse';
-import * as Language from '../Language';
-import UiSuggestion from './Suggestion';
-import UiDropdownSimple from './Dropdown/Simple';
-import { DatabaseObjectActionPayload } from '../Ajax/Data';
-import DomUtil from '../Dom/Util';
-
-let _activeId = '';
+import * as Core from "../Core";
+import * as DomTraverse from "../Dom/Traverse";
+import * as Language from "../Language";
+import UiSuggestion from "./Suggestion";
+import UiDropdownSimple from "./Dropdown/Simple";
+import { DatabaseObjectActionPayload } from "../Ajax/Data";
+import DomUtil from "../Dom/Util";
+
+let _activeId = "";
 const _data = new Map<string, ElementData>();
 
 /**
@@ -25,28 +25,28 @@ const _data = new Map<string, ElementData>();
 function createUI(element: ItemListInputElement, options: ItemListOptions): UiData {
   const parentElement = element.parentElement!;
 
-  const list = document.createElement('ol');
-  list.className = 'inputItemList' + (element.disabled ? ' disabled' : '');
+  const list = document.createElement("ol");
+  list.className = "inputItemList" + (element.disabled ? " disabled" : "");
   list.dataset.elementId = element.id;
-  list.addEventListener('click', event => {
+  list.addEventListener("click", (event) => {
     if (event.target === list) {
       element.focus();
     }
   });
 
-  const listItem = document.createElement('li');
-  listItem.className = 'input';
+  const listItem = document.createElement("li");
+  listItem.className = "input";
   list.appendChild(listItem);
-  element.addEventListener('keydown', keyDown);
-  element.addEventListener('keypress', keyPress);
-  element.addEventListener('keyup', keyUp);
-  element.addEventListener('paste', paste);
+  element.addEventListener("keydown", keyDown);
+  element.addEventListener("keypress", keyPress);
+  element.addEventListener("keyup", keyUp);
+  element.addEventListener("paste", paste);
 
-  const hasFocus = (element === document.activeElement);
+  const hasFocus = element === document.activeElement;
   if (hasFocus) {
     element.blur();
   }
-  element.addEventListener('blur', blur);
+  element.addEventListener("blur", blur);
   parentElement.insertBefore(list, element);
   listItem.appendChild(element);
 
@@ -60,32 +60,32 @@ function createUI(element: ItemListInputElement, options: ItemListOptions): UiDa
     element.maxLength = options.maxLength;
   }
 
-  const limitReached = document.createElement('span');
-  limitReached.className = 'inputItemListLimitReached';
-  limitReached.textContent = Language.get('wcf.global.form.input.maxItems');
+  const limitReached = document.createElement("span");
+  limitReached.className = "inputItemListLimitReached";
+  limitReached.textContent = Language.get("wcf.global.form.input.maxItems");
   DomUtil.hide(limitReached);
   listItem.appendChild(limitReached);
 
   let shadow: HTMLInputElement | null = null;
   const values: string[] = [];
   if (options.isCSV) {
-    shadow = document.createElement('input');
-    shadow.className = 'itemListInputShadow';
-    shadow.type = 'hidden';
+    shadow = document.createElement("input");
+    shadow.className = "itemListInputShadow";
+    shadow.type = "hidden";
     shadow.name = element.name;
-    element.removeAttribute('name');
+    element.removeAttribute("name");
     list.parentNode!.insertBefore(shadow, list);
 
-    element.value.split(',').forEach(value => {
+    element.value.split(",").forEach((value) => {
       value = value.trim();
       if (value) {
         values.push(value);
       }
     });
 
-    if (element.nodeName === 'TEXTAREA') {
-      const inputElement = document.createElement('input');
-      inputElement.type = 'text';
+    if (element.nodeName === "TEXTAREA") {
+      const inputElement = document.createElement("input");
+      inputElement.type = "text";
       parentElement.insertBefore(inputElement, element);
       inputElement.id = element.id;
 
@@ -112,7 +112,7 @@ function acceptsNewItems(elementId: string): boolean {
     return true;
   }
 
-  return (data.list.childElementCount - 1 < data.options.maxItems);
+  return data.list.childElementCount - 1 < data.options.maxItems;
 }
 
 /**
@@ -137,19 +137,19 @@ function keyDown(event: KeyboardEvent): void {
   _activeId = input.id;
 
   const lastItem = input.parentElement!.previousElementSibling as HTMLElement | null;
-  if (event.key === 'Backspace') {
+  if (event.key === "Backspace") {
     if (input.value.length === 0) {
       if (lastItem !== null) {
-        if (lastItem.classList.contains('active')) {
+        if (lastItem.classList.contains("active")) {
           removeItem(lastItem);
         } else {
-          lastItem.classList.add('active');
+          lastItem.classList.add("active");
         }
       }
     }
-  } else if (event.key === 'Escape') {
-    if (lastItem !== null && lastItem.classList.contains('active')) {
-      lastItem.classList.remove('active');
+  } else if (event.key === "Escape") {
+    if (lastItem !== null && lastItem.classList.contains("active")) {
+      lastItem.classList.remove("active");
     }
   }
 }
@@ -158,7 +158,7 @@ function keyDown(event: KeyboardEvent): void {
  * Handles the `[ENTER]` and `[,]` key to add an item to the list unless it is restricted.
  */
 function keyPress(event: KeyboardEvent): void {
-  if (event.key === 'Enter' || event.key === ',') {
+  if (event.key === "Enter" || event.key === ",") {
     event.preventDefault();
 
     const input = event.currentTarget as HTMLInputElement;
@@ -168,7 +168,7 @@ function keyPress(event: KeyboardEvent): void {
     }
     const value = input.value.trim();
     if (value.length) {
-      addItem(input.id, {objectId: 0, value: value});
+      addItem(input.id, { objectId: 0, value: value });
     }
   }
 }
@@ -179,12 +179,12 @@ function keyPress(event: KeyboardEvent): void {
 function paste(event: ClipboardEvent): void {
   event.preventDefault();
 
-  const text = event.clipboardData!.getData('text/plain');
+  const text = event.clipboardData!.getData("text/plain");
 
   const element = event.currentTarget as HTMLInputElement;
   const elementId = element.id;
   const maxLength = +element.maxLength;
-  text.split(/,/).forEach(item => {
+  text.split(/,/).forEach((item) => {
     item = item.trim();
     if (maxLength && item.length > maxLength) {
       // truncating items provides a better UX than throwing an error or silently discarding it
@@ -192,7 +192,7 @@ function paste(event: ClipboardEvent): void {
     }
 
     if (item.length > 0 && acceptsNewItems(elementId)) {
-      addItem(elementId, {objectId: 0, value: item});
+      addItem(elementId, { objectId: 0, value: item });
     }
   });
 }
@@ -205,7 +205,7 @@ function keyUp(event: KeyboardEvent): void {
   if (input.value.length > 0) {
     const lastItem = input.parentElement!.previousElementSibling;
     if (lastItem !== null) {
-      lastItem.classList.remove('active');
+      lastItem.classList.remove("active");
     }
   }
 }
@@ -215,11 +215,11 @@ function keyUp(event: KeyboardEvent): void {
  */
 function addItem(elementId: string, value: ItemData): void {
   const data = _data.get(elementId)!;
-  const listItem = document.createElement('li');
-  listItem.className = 'item';
+  const listItem = document.createElement("li");
+  listItem.className = "item";
 
-  const content = document.createElement('span');
-  content.className = 'content';
+  const content = document.createElement("span");
+  content.className = "content";
   content.dataset.objectId = value.objectId.toString();
   if (value.type) {
     content.dataset.type = value.type;
@@ -228,21 +228,21 @@ function addItem(elementId: string, value: ItemData): void {
   listItem.appendChild(content);
 
   if (!data.element.disabled) {
-    const button = document.createElement('a');
-    button.className = 'icon icon16 fa-times';
-    button.addEventListener('click', removeItem);
+    const button = document.createElement("a");
+    button.className = "icon icon16 fa-times";
+    button.addEventListener("click", removeItem);
     listItem.appendChild(button);
   }
 
   data.list.insertBefore(listItem, data.listItem);
   data.suggestion.addExcludedValue(value.value);
-  data.element.value = '';
+  data.element.value = "";
   if (!data.element.disabled) {
     handleLimit(elementId);
   }
 
   let values = syncShadow(data);
-  if (typeof data.options.callbackChange === 'function') {
+  if (typeof data.options.callbackChange === "function") {
     if (values === null) {
       values = getValues(elementId);
     }
@@ -261,7 +261,7 @@ function removeItem(item: Event | HTMLElement, noFocus?: boolean): void {
   }
 
   const parent = item.parentElement!;
-  const elementId = parent.dataset.elementId || '';
+  const elementId = parent.dataset.elementId || "";
   const data = _data.get(elementId)!;
   if (item.children[0].textContent) {
     data.suggestion.removeExcludedValue(item.children[0].textContent);
@@ -276,7 +276,7 @@ function removeItem(item: Event | HTMLElement, noFocus?: boolean): void {
   handleLimit(elementId);
 
   let values = syncShadow(data);
-  if (typeof data.options.callbackChange === 'function') {
+  if (typeof data.options.callbackChange === "function") {
     if (values === null) {
       values = getValues(elementId);
     }
@@ -293,15 +293,15 @@ function syncShadow(data: ElementData): ItemData[] | null {
     return null;
   }
 
-  if (typeof data.options.callbackSyncShadow === 'function') {
+  if (typeof data.options.callbackSyncShadow === "function") {
     return data.options.callbackSyncShadow(data);
   }
 
   const values = getValues(data.element.id);
 
   data.shadow!.value = getValues(data.element.id)
-    .map(value => value.value)
-    .join(',');
+    .map((value) => value.value)
+    .join(",");
 
   return values;
 }
@@ -321,12 +321,11 @@ function blur(event: FocusEvent): void {
   const value = input.value.trim();
   if (value.length) {
     if (!data.suggestion || !data.suggestion.isActive()) {
-      addItem(input.id, {objectId: 0, value: value});
+      addItem(input.id, { objectId: 0, value: value });
     }
   }
 }
 
-
 /**
  * Initializes an item list.
  *
@@ -342,7 +341,7 @@ export function init(elementId: string, values: ItemDataOrPlainValue[], options:
   // remove data from previous instance
   if (_data.has(elementId)) {
     const tmp = _data.get(elementId)!;
-    Object.keys(tmp).forEach(key => {
+    Object.keys(tmp).forEach((key) => {
       const el = tmp[key];
       if (el instanceof Element && el.parentNode) {
         el.remove();
@@ -353,56 +352,61 @@ export function init(elementId: string, values: ItemDataOrPlainValue[], options:
     _data.delete(elementId);
   }
 
-  options = Core.extend({
-    // search parameters for suggestions
-    ajax: {
-      actionName: 'getSearchResultList',
-      className: '',
-      data: {},
+  options = Core.extend(
+    {
+      // search parameters for suggestions
+      ajax: {
+        actionName: "getSearchResultList",
+        className: "",
+        data: {},
+      },
+      // list of excluded string values, e.g. `['ignore', 'these strings', 'when', 'searching']`
+      excludedSearchValues: [],
+      // maximum number of items this list may contain, `-1` for infinite
+      maxItems: -1,
+      // maximum length of an item value, `-1` for infinite
+      maxLength: -1,
+      // disallow custom values, only values offered by the suggestion dropdown are accepted
+      restricted: false,
+      // initial value will be interpreted as comma separated value and submitted as such
+      isCSV: false,
+      // will be invoked whenever the items change, receives the element id first and list of values second
+      callbackChange: null,
+      // callback once the form is about to be submitted
+      callbackSubmit: null,
+      // Callback for the custom shadow synchronization.
+      callbackSyncShadow: null,
+      // Callback to set values during the setup.
+      callbackSetupValues: null,
+      // value may contain the placeholder `{$objectId}`
+      submitFieldName: "",
     },
-    // list of excluded string values, e.g. `['ignore', 'these strings', 'when', 'searching']`
-    excludedSearchValues: [],
-    // maximum number of items this list may contain, `-1` for infinite
-    maxItems: -1,
-    // maximum length of an item value, `-1` for infinite
-    maxLength: -1,
-    // disallow custom values, only values offered by the suggestion dropdown are accepted
-    restricted: false,
-    // initial value will be interpreted as comma separated value and submitted as such
-    isCSV: false,
-    // will be invoked whenever the items change, receives the element id first and list of values second
-    callbackChange: null,
-    // callback once the form is about to be submitted
-    callbackSubmit: null,
-    // Callback for the custom shadow synchronization.
-    callbackSyncShadow: null,
-    // Callback to set values during the setup.
-    callbackSetupValues: null,
-    // value may contain the placeholder `{$objectId}`
-    submitFieldName: '',
-  }, options) as ItemListOptions;
-
-  const form = DomTraverse.parentByTag(element, 'FORM') as HTMLFormElement;
+    options
+  ) as ItemListOptions;
+
+  const form = DomTraverse.parentByTag(element, "FORM") as HTMLFormElement;
   if (form !== null) {
     if (!options.isCSV) {
-      if (!options.submitFieldName.length && typeof options.callbackSubmit !== 'function') {
-        throw new Error("Expected a valid function for option 'callbackSubmit', a non-empty value for option 'submitFieldName' or enabling the option 'submitFieldCSV'.");
+      if (!options.submitFieldName.length && typeof options.callbackSubmit !== "function") {
+        throw new Error(
+          "Expected a valid function for option 'callbackSubmit', a non-empty value for option 'submitFieldName' or enabling the option 'submitFieldCSV'."
+        );
       }
 
-      form.addEventListener('submit', () => {
+      form.addEventListener("submit", () => {
         if (acceptsNewItems(elementId)) {
           const value = _data.get(elementId)!.element.value.trim();
           if (value.length) {
-            addItem(elementId, {objectId: 0, value: value});
+            addItem(elementId, { objectId: 0, value: value });
           }
         }
 
         const values = getValues(elementId);
         if (options.submitFieldName.length) {
-          values.forEach(value => {
-            const input = document.createElement('input');
-            input.type = 'hidden';
-            input.name = options.submitFieldName.replace('{$objectId}', value.objectId.toString());
+          values.forEach((value) => {
+            const input = document.createElement("input");
+            input.type = "hidden";
+            input.name = options.submitFieldName.replace("{$objectId}", value.objectId.toString());
             input.value = value.value;
             form.appendChild(input);
           });
@@ -411,11 +415,11 @@ export function init(elementId: string, values: ItemDataOrPlainValue[], options:
         }
       });
     } else {
-      form.addEventListener('submit', () => {
+      form.addEventListener("submit", () => {
         if (acceptsNewItems(elementId)) {
           const value = _data.get(elementId)!.element.value.trim();
           if (value.length) {
-            addItem(elementId, {objectId: 0, value: value});
+            addItem(elementId, { objectId: 0, value: value });
           }
         }
       });
@@ -444,13 +448,13 @@ export function init(elementId: string, values: ItemDataOrPlainValue[], options:
   if (options.callbackSetupValues) {
     values = options.callbackSetupValues();
   } else {
-    values = (data.values.length) ? data.values : values;
+    values = data.values.length ? data.values : values;
   }
 
   if (Array.isArray(values)) {
-    values.forEach(value => {
-      if (typeof value === 'string') {
-        value = {objectId: 0, value: value};
+    values.forEach((value) => {
+      if (typeof value === "string") {
+        value = { objectId: 0, value: value };
       }
 
       addItem(elementId, value);
@@ -468,9 +472,9 @@ export function getValues(elementId: string): ItemData[] {
   }
 
   const values: ItemData[] = [];
-  data.list.querySelectorAll('.item > span').forEach((span: HTMLSpanElement) => {
+  data.list.querySelectorAll(".item > span").forEach((span: HTMLSpanElement) => {
     values.push({
-      objectId: +(span.dataset.objectId || ''),
+      objectId: +(span.dataset.objectId || ""),
       value: span.textContent!.trim(),
       type: span.dataset.type,
     });
@@ -489,12 +493,12 @@ export function setValues(elementId: string, values: ItemData[]): void {
   }
 
   // remove all existing items first
-  DomTraverse.childrenByClass(data.list, 'item').forEach((item: HTMLElement) => {
+  DomTraverse.childrenByClass(data.list, "item").forEach((item: HTMLElement) => {
     removeItem(item, true);
   });
 
   // add new items
-  values.forEach(value => {
+  values.forEach((value) => {
     addItem(elementId, value);
   });
 }
@@ -552,7 +556,7 @@ interface ElementData {
   limitReached: HTMLSpanElement;
   list: HTMLElement;
   listItem: HTMLElement;
-  options: ItemListOptions,
+  options: ItemListOptions;
   shadow: HTMLInputElement | null;
   suggestion: UiSuggestion;
 }
index a3e582f88cca527a519a7786ac222e451bfeed3a..69314ca8d09a5a64f0faa7d9665f58a791a7270e 100644 (file)
@@ -8,7 +8,7 @@
  * @module  WoltLabSuite/Core/Ui/Notification
  */
 
-import * as Language from '../Language';
+import * as Language from "../Language";
 
 type Callback = () => void;
 
@@ -22,12 +22,12 @@ let _timeout: number;
 function init() {
   if (_didInit) return;
   _didInit = true;
-  
-  _notificationElement = document.createElement('div');
-  _notificationElement.id = 'systemNotification';
 
-  _message = document.createElement('p');
-  _message.addEventListener('click', hide);
+  _notificationElement = document.createElement("div");
+  _notificationElement.id = "systemNotification";
+
+  _message = document.createElement("p");
+  _message.addEventListener("click", hide);
   _notificationElement.appendChild(_message);
 
   document.body.appendChild(_notificationElement);
@@ -39,7 +39,7 @@ function init() {
 function hide() {
   clearTimeout(_timeout);
 
-  _notificationElement.classList.remove('active');
+  _notificationElement.classList.remove("active");
 
   if (_callback !== null) {
     _callback();
@@ -59,10 +59,10 @@ export function show(message?: string, callback?: Callback, cssClassName?: strin
 
   init();
 
-  _callback = (typeof callback === 'function') ? callback : null;
-  _message.className = cssClassName || 'success';
-  _message.textContent = Language.get(message || 'wcf.global.success');
+  _callback = typeof callback === "function" ? callback : null;
+  _message.className = cssClassName || "success";
+  _message.textContent = Language.get(message || "wcf.global.success");
 
-  _notificationElement.classList.add('active');
+  _notificationElement.classList.add("active");
   _timeout = setTimeout(hide, 2000);
 }
index fffec8342f3063c704a166e1b61973c1de9622da..b4b97ab32e46a64c13967666b1ddef585ed6ed21 100644 (file)
@@ -7,8 +7,8 @@
  * @module  WoltLabSuite/Core/Ui/Page/Action
  */
 
-import * as Core from '../../Core';
-import * as Language from '../../Language';
+import * as Core from "../../Core";
+import * as Language from "../../Language";
 
 const _buttons = new Map<string, HTMLElement>();
 
@@ -19,20 +19,20 @@ let _toTopButton: HTMLElement;
 let _wrapper: HTMLElement;
 
 function buildToTopButton(): HTMLAnchorElement {
-  const button = document.createElement('a');
-  button.className = 'button buttonPrimary pageActionButtonToTop initiallyHidden jsTooltip';
-  button.href = '';
-  button.title = Language.get('wcf.global.scrollUp');
-  button.setAttribute('aria-hidden', 'true');
+  const button = document.createElement("a");
+  button.className = "button buttonPrimary pageActionButtonToTop initiallyHidden jsTooltip";
+  button.href = "";
+  button.title = Language.get("wcf.global.scrollUp");
+  button.setAttribute("aria-hidden", "true");
   button.innerHTML = '<span class="icon icon32 fa-angle-up"></span>';
 
-  button.addEventListener('click', scrollToTop);
+  button.addEventListener("click", scrollToTop);
 
   return button;
 }
 
 function onScroll(): void {
-  if (document.documentElement.classList.contains('disableScrolling')) {
+  if (document.documentElement.classList.contains("disableScrolling")) {
     // Ignore any scroll events that take place while body scrolling is disabled,
     // because it messes up the scroll offsets.
     return;
@@ -46,19 +46,19 @@ function onScroll(): void {
   }
 
   if (offset >= 300) {
-    if (_toTopButton.classList.contains('initiallyHidden')) {
-      _toTopButton.classList.remove('initiallyHidden');
+    if (_toTopButton.classList.contains("initiallyHidden")) {
+      _toTopButton.classList.remove("initiallyHidden");
     }
 
-    _toTopButton.setAttribute('aria-hidden', 'false');
+    _toTopButton.setAttribute("aria-hidden", "false");
   } else {
-    _toTopButton.setAttribute('aria-hidden', 'true');
+    _toTopButton.setAttribute("aria-hidden", "true");
   }
 
   renderContainer();
 
   if (_lastPosition !== -1) {
-    _wrapper.classList[offset < _lastPosition ? 'remove' : 'add']('scrolledDown');
+    _wrapper.classList[offset < _lastPosition ? "remove" : "add"]("scrolledDown");
   }
 
   _lastPosition = offset;
@@ -67,19 +67,19 @@ function onScroll(): void {
 function scrollToTop(event: MouseEvent): void {
   event.preventDefault();
 
-  const topAnchor = document.getElementById('top')!;
-  topAnchor.scrollIntoView({behavior: 'smooth'});
+  const topAnchor = document.getElementById("top")!;
+  topAnchor.scrollIntoView({ behavior: "smooth" });
 }
 
 /**
  * Toggles the container's visibility.
  */
 function renderContainer() {
-  const visibleChild = Array.from(_container.children).find(element => {
-    return element.getAttribute('aria-hidden') === 'false';
+  const visibleChild = Array.from(_container.children).find((element) => {
+    return element.getAttribute("aria-hidden") === "false";
   });
 
-  _container.classList[visibleChild ? 'add' : 'remove']('active');
+  _container.classList[visibleChild ? "add" : "remove"]("active");
 }
 
 /**
@@ -92,11 +92,11 @@ export function setup() {
 
   _didInit = true;
 
-  _wrapper = document.createElement('div');
-  _wrapper.className = 'pageAction';
+  _wrapper = document.createElement("div");
+  _wrapper.className = "pageAction";
 
-  _container = document.createElement('div');
-  _container.className = 'pageActionButtons';
+  _container = document.createElement("div");
+  _container.className = "pageActionButtons";
   _wrapper.appendChild(_container);
 
   _toTopButton = buildToTopButton();
@@ -104,11 +104,7 @@ export function setup() {
 
   document.body.appendChild(_wrapper);
 
-  window.addEventListener(
-    'scroll',
-    Core.debounce(onScroll, 100),
-    {passive: true},
-  );
+  window.addEventListener("scroll", Core.debounce(onScroll, 100), { passive: true });
 
   onScroll();
 }
@@ -123,13 +119,13 @@ export function add(buttonName: string, button: HTMLElement, insertBeforeButton?
 
   // The wrapper is required for backwards compatibility, because some implementations rely on a
   // dedicated parent element to insert elements, for example, for drop-down menus.
-  const wrapper = document.createElement('div');
-  wrapper.className = 'pageActionButton';
+  const wrapper = document.createElement("div");
+  wrapper.className = "pageActionButton";
   wrapper.dataset.name = buttonName;
-  wrapper.setAttribute('aria-hidden', 'true');
+  wrapper.setAttribute("aria-hidden", "true");
 
-  button.classList.add('button');
-  button.classList.add('buttonPrimary');
+  button.classList.add("button");
+  button.classList.add("buttonPrimary");
   wrapper.appendChild(button);
 
   let insertBefore: HTMLElement | null = null;
@@ -148,7 +144,7 @@ export function add(buttonName: string, button: HTMLElement, insertBeforeButton?
   }
 
   _container.insertBefore(wrapper, insertBefore);
-  _wrapper.classList.remove('scrolledDown');
+  _wrapper.classList.remove("scrolledDown");
 
   _buttons.set(buttonName, button);
 
@@ -157,7 +153,7 @@ export function add(buttonName: string, button: HTMLElement, insertBeforeButton?
   wrapper.offsetParent;
 
   // Toggle the visibility to force the transition to be applied.
-  wrapper.setAttribute('aria-hidden', 'false');
+  wrapper.setAttribute("aria-hidden", "false");
 
   renderContainer();
 }
@@ -185,18 +181,18 @@ export function remove(buttonName: string): void {
     const listItem = button.parentElement!;
     const callback = () => {
       try {
-        if (Core.stringToBool(listItem.getAttribute('aria-hidden'))) {
+        if (Core.stringToBool(listItem.getAttribute("aria-hidden"))) {
           _container.removeChild(listItem);
           _buttons.delete(buttonName);
         }
 
-        listItem.removeEventListener('transitionend', callback);
+        listItem.removeEventListener("transitionend", callback);
       } catch (e) {
         // ignore errors if the element has already been removed
       }
     };
 
-    listItem.addEventListener('transitionend', callback);
+    listItem.addEventListener("transitionend", callback);
 
     hide(buttonName);
   }
@@ -209,7 +205,7 @@ export function hide(buttonName: string): void {
   const button = _buttons.get(buttonName);
   if (button) {
     const parent = button.parentElement!;
-    parent.setAttribute('aria-hidden', 'true');
+    parent.setAttribute("aria-hidden", "true");
 
     renderContainer();
   }
@@ -222,15 +218,13 @@ export function show(buttonName: string): void {
   const button = _buttons.get(buttonName);
   if (button) {
     const parent = button.parentElement!;
-    if (parent.classList.contains('initiallyHidden')) {
-      parent.classList.remove('initiallyHidden');
+    if (parent.classList.contains("initiallyHidden")) {
+      parent.classList.remove("initiallyHidden");
     }
 
-    parent.setAttribute('aria-hidden', 'false');
-    _wrapper.classList.remove('scrolledDown');
+    parent.setAttribute("aria-hidden", "false");
+    _wrapper.classList.remove("scrolledDown");
 
     renderContainer();
   }
 }
-               
-               
index 3acd266caf83daa6abdad4e60036cde8d872b06a..a2efebc8c33fc36e0b2ae8726498ba88029ff098 100644 (file)
@@ -7,11 +7,11 @@
  * @module  WoltLabSuite/Core/Ui/Page/Header/Fixed
  */
 
-import * as EventHandler from '../../../Event/Handler';
-import * as UiAlignment from '../../Alignment';
-import UiCloseOverlay from '../../CloseOverlay';
-import UiDropdownSimple from '../../Dropdown/Simple';
-import * as UiScreen from '../../Screen';
+import * as EventHandler from "../../../Event/Handler";
+import * as UiAlignment from "../../Alignment";
+import UiCloseOverlay from "../../CloseOverlay";
+import UiDropdownSimple from "../../Dropdown/Simple";
+import * as UiScreen from "../../Screen";
 
 let _isMobile = false;
 
@@ -27,35 +27,35 @@ let _userPanelSearchButton: HTMLElement;
  * Provides the collapsible search bar.
  */
 function initSearchBar(): void {
-  _pageHeaderSearch = document.getElementById('pageHeaderSearch')!;
-  _pageHeaderSearch.addEventListener('click', ev => ev.stopPropagation());
+  _pageHeaderSearch = document.getElementById("pageHeaderSearch")!;
+  _pageHeaderSearch.addEventListener("click", (ev) => ev.stopPropagation());
 
-  _pageHeaderPanel = document.getElementById('pageHeaderPanel')!;
-  _searchInput = document.getElementById('pageHeaderSearchInput') as HTMLInputElement;
-  _topMenu = document.getElementById('topMenu')!;
+  _pageHeaderPanel = document.getElementById("pageHeaderPanel")!;
+  _searchInput = document.getElementById("pageHeaderSearchInput") as HTMLInputElement;
+  _topMenu = document.getElementById("topMenu")!;
 
-  _userPanelSearchButton = document.getElementById('userPanelSearchButton')!;
-  _userPanelSearchButton.addEventListener('click', event => {
+  _userPanelSearchButton = document.getElementById("userPanelSearchButton")!;
+  _userPanelSearchButton.addEventListener("click", (event) => {
     event.preventDefault();
     event.stopPropagation();
 
-    if (_pageHeader.classList.contains('searchBarOpen')) {
+    if (_pageHeader.classList.contains("searchBarOpen")) {
       closeSearchBar();
     } else {
       openSearchBar();
     }
   });
 
-  UiCloseOverlay.add('WoltLabSuite/Core/Ui/Page/Header/Fixed', () => {
-    if (_pageHeader.classList.contains('searchBarForceOpen')) {
+  UiCloseOverlay.add("WoltLabSuite/Core/Ui/Page/Header/Fixed", () => {
+    if (_pageHeader.classList.contains("searchBarForceOpen")) {
       return;
     }
 
     closeSearchBar();
   });
 
-  EventHandler.add('com.woltlab.wcf.MainMenuMobile', 'more', data => {
-    if (data.identifier === 'com.woltlab.wcf.search') {
+  EventHandler.add("com.woltlab.wcf.MainMenuMobile", "more", (data) => {
+    if (data.identifier === "com.woltlab.wcf.search") {
       data.handler.close(true);
 
       _userPanelSearchButton.click();
@@ -69,17 +69,17 @@ function initSearchBar(): void {
 function openSearchBar(): void {
   window.WCF.Dropdown.Interactive.Handler.closeAll();
 
-  _pageHeader.classList.add('searchBarOpen');
-  _userPanelSearchButton.parentElement!.classList.add('open');
+  _pageHeader.classList.add("searchBarOpen");
+  _userPanelSearchButton.parentElement!.classList.add("open");
 
   if (!_isMobile) {
     // calculate value for `right` on desktop
     UiAlignment.set(_pageHeaderSearch, _topMenu, {
-      horizontal: 'right',
+      horizontal: "right",
     });
   }
 
-  _pageHeaderSearch.style.setProperty('top', _pageHeaderPanel.clientHeight + 'px', '');
+  _pageHeaderSearch.style.setProperty("top", _pageHeaderPanel.clientHeight + "px", "");
   _searchInput.focus();
 
   window.setTimeout(() => {
@@ -91,17 +91,17 @@ function openSearchBar(): void {
  * Closes the search bar.
  */
 function closeSearchBar(): void {
-  _pageHeader.classList.remove('searchBarOpen');
-  _userPanelSearchButton.parentElement!.classList.remove('open');
+  _pageHeader.classList.remove("searchBarOpen");
+  _userPanelSearchButton.parentElement!.classList.remove("open");
 
-  ['bottom', 'left', 'right', 'top'].forEach(propertyName => {
+  ["bottom", "left", "right", "top"].forEach((propertyName) => {
     _pageHeaderSearch.style.removeProperty(propertyName);
   });
 
   _searchInput.blur();
 
   // close the scope selection
-  const scope = _pageHeaderSearch.querySelector('.pageHeaderSearchType')!;
+  const scope = _pageHeaderSearch.querySelector(".pageHeaderSearchType")!;
   UiDropdownSimple.close(scope.id);
 }
 
@@ -109,12 +109,12 @@ function closeSearchBar(): void {
  * Initializes the sticky page header handler.
  */
 export function init(): void {
-  _pageHeader = document.getElementById('pageHeader')!;
-  _pageHeaderContainer = document.getElementById('pageHeaderContainer')!;
+  _pageHeader = document.getElementById("pageHeader")!;
+  _pageHeaderContainer = document.getElementById("pageHeaderContainer")!;
 
   initSearchBar();
 
-  UiScreen.on('screen-md-down', {
+  UiScreen.on("screen-md-down", {
     match() {
       _isMobile = true;
     },
@@ -126,5 +126,5 @@ export function init(): void {
     },
   });
 
-  EventHandler.add('com.woltlab.wcf.Search', 'close', closeSearchBar);
+  EventHandler.add("com.woltlab.wcf.Search", "close", closeSearchBar);
 }
index 6e967f148721f4ac1aedd0e34d131d98638506a7..cfde2c1c106044c6e7467063bca68911c6fc9f29 100644 (file)
@@ -7,9 +7,9 @@
  * @module  WoltLabSuite/Core/Ui/Page/Header/Menu
  */
 
-import * as Environment from '../../../Environment';
-import * as Language from '../../../Language';
-import * as UiScreen from '../../Screen';
+import * as Environment from "../../../Environment";
+import * as Language from "../../../Language";
+import * as UiScreen from "../../Screen";
 
 let _enabled = false;
 
@@ -35,7 +35,7 @@ function enable(): void {
   // issue results in the next button being shown for a short time. To circumvent this issue,
   // we wait a second before showing the obverflow controls in Safari.
   // see https://webkit.org/blog/6643/improved-font-loading/
-  if (Environment.browser() === 'safari') {
+  if (Environment.browser() === "safari") {
     window.setTimeout(rebuildVisibility, 1000);
   } else {
     rebuildVisibility();
@@ -63,10 +63,10 @@ function showNext(event: MouseEvent): void {
     setMarginLeft(_menu.clientWidth - (showItem.offsetLeft + showItem.clientWidth));
 
     if (_menu.lastElementChild === showItem) {
-      _buttonShowNext.classList.remove('active');
+      _buttonShowNext.classList.remove("active");
     }
 
-    _buttonShowPrevious.classList.add('active');
+    _buttonShowPrevious.classList.add("active");
   }
 }
 
@@ -81,10 +81,10 @@ function showPrevious(event: MouseEvent): void {
     setMarginLeft(showItem.offsetLeft * -1);
 
     if (_menu.firstElementChild === showItem) {
-      _buttonShowPrevious.classList.remove('active');
+      _buttonShowPrevious.classList.remove("active");
     }
 
-    _buttonShowNext.classList.add('active');
+    _buttonShowNext.classList.add("active");
   }
 }
 
@@ -95,7 +95,7 @@ function showPrevious(event: MouseEvent): void {
 function setMarginLeft(offset: number): void {
   _marginLeft = Math.min(_marginLeft + offset, 0);
 
-  _firstElement.style.setProperty('margin-left', _marginLeft + 'px', '');
+  _firstElement.style.setProperty("margin-left", _marginLeft + "px", "");
 }
 
 /**
@@ -120,8 +120,8 @@ function rebuildVisibility(): void {
     });
   }
 
-  _buttonShowPrevious.classList[(_invisibleLeft.length ? 'add' : 'remove')]('active');
-  _buttonShowNext.classList[(_invisibleRight.length ? 'add' : 'remove')]('active');
+  _buttonShowPrevious.classList[_invisibleLeft.length ? "add" : "remove"]("active");
+  _buttonShowNext.classList[_invisibleRight.length ? "add" : "remove"]("active");
 }
 
 /**
@@ -138,28 +138,28 @@ function setup(): void {
 function setupOverflow(): void {
   const menuParent = _menu.parentElement!;
 
-  _buttonShowNext = document.createElement('a');
-  _buttonShowNext.className = 'mainMenuShowNext';
-  _buttonShowNext.href = '#';
+  _buttonShowNext = document.createElement("a");
+  _buttonShowNext.className = "mainMenuShowNext";
+  _buttonShowNext.href = "#";
   _buttonShowNext.innerHTML = '<span class="icon icon32 fa-angle-right"></span>';
-  _buttonShowNext.setAttribute('aria-hidden', 'true');
-  _buttonShowNext.addEventListener('click', showNext);
+  _buttonShowNext.setAttribute("aria-hidden", "true");
+  _buttonShowNext.addEventListener("click", showNext);
 
   menuParent.appendChild(_buttonShowNext);
 
-  _buttonShowPrevious = document.createElement('a');
-  _buttonShowPrevious.className = 'mainMenuShowPrevious';
-  _buttonShowPrevious.href = '#';
+  _buttonShowPrevious = document.createElement("a");
+  _buttonShowPrevious.className = "mainMenuShowPrevious";
+  _buttonShowPrevious.href = "#";
   _buttonShowPrevious.innerHTML = '<span class="icon icon32 fa-angle-left"></span>';
-  _buttonShowPrevious.setAttribute('aria-hidden', 'true');
-  _buttonShowPrevious.addEventListener('click', showPrevious);
+  _buttonShowPrevious.setAttribute("aria-hidden", "true");
+  _buttonShowPrevious.addEventListener("click", showPrevious);
 
   menuParent.insertBefore(_buttonShowPrevious, menuParent.firstChild);
 
-  _firstElement.addEventListener('transitionend', rebuildVisibility);
+  _firstElement.addEventListener("transitionend", rebuildVisibility);
 
-  window.addEventListener('resize', () => {
-    _firstElement.style.setProperty('margin-left', '0px', '');
+  window.addEventListener("resize", () => {
+    _firstElement.style.setProperty("margin-left", "0px", "");
     _marginLeft = 0;
 
     rebuildVisibility();
@@ -172,23 +172,26 @@ function setupOverflow(): void {
  * Setups a11y improvements.
  */
 function setupA11y(): void {
-  _menu.querySelectorAll('.boxMenuHasChildren').forEach(element => {
-    const link = element.querySelector('.boxMenuLink')!;
-    link.setAttribute('aria-haspopup', 'true');
-    link.setAttribute('aria-expanded', 'false');
+  _menu.querySelectorAll(".boxMenuHasChildren").forEach((element) => {
+    const link = element.querySelector(".boxMenuLink")!;
+    link.setAttribute("aria-haspopup", "true");
+    link.setAttribute("aria-expanded", "false");
 
-    const showMenuButton = document.createElement('button');
-    showMenuButton.className = 'visuallyHidden';
+    const showMenuButton = document.createElement("button");
+    showMenuButton.className = "visuallyHidden";
     showMenuButton.tabIndex = 0;
-    showMenuButton.setAttribute('role', 'button');
-    showMenuButton.setAttribute('aria-label', Language.get('wcf.global.button.showMenu'));
+    showMenuButton.setAttribute("role", "button");
+    showMenuButton.setAttribute("aria-label", Language.get("wcf.global.button.showMenu"));
     element.insertBefore(showMenuButton, link.nextSibling);
 
     let showMenu = false;
-    showMenuButton.addEventListener('click', () => {
+    showMenuButton.addEventListener("click", () => {
       showMenu = !showMenu;
-      link.setAttribute('aria-expanded', showMenu ? 'true' : 'false');
-      showMenuButton.setAttribute('aria-label', Language.get(showMenu ? 'wcf.global.button.hideMenu' : 'wcf.global.button.showMenu'));
+      link.setAttribute("aria-expanded", showMenu ? "true" : "false");
+      showMenuButton.setAttribute(
+        "aria-label",
+        Language.get(showMenu ? "wcf.global.button.hideMenu" : "wcf.global.button.showMenu")
+      );
     });
   });
 }
@@ -197,8 +200,8 @@ function setupA11y(): void {
  * Initializes the main menu overflow handling.
  */
 export function init(): void {
-  const menu = document.querySelector('.mainMenu .boxMenu') as HTMLElement;
-  const firstElement = (menu && menu.childElementCount) ? menu.children[0] as HTMLElement : null;
+  const menu = document.querySelector(".mainMenu .boxMenu") as HTMLElement;
+  const firstElement = menu && menu.childElementCount ? (menu.children[0] as HTMLElement) : null;
   if (firstElement === null) {
     throw new Error("Unable to find the main menu.");
   }
@@ -206,7 +209,7 @@ export function init(): void {
   _menu = menu;
   _firstElement = firstElement;
 
-  UiScreen.on('screen-lg', {
+  UiScreen.on("screen-lg", {
     match: enable,
     unmatch: disable,
     setup: setup,
index 36be6b9587c73668154ac9c15da535fb3d4eb63b..83ee8bee007e8beb0a06a18cb2a9245c6f2118c9 100644 (file)
@@ -7,9 +7,9 @@
  * @module  WoltLabSuite/Core/Ui/Page/JumpTo
  */
 
-import { DialogCallbackObject, DialogSettings } from '../Dialog/Data';
-import * as Language from '../../Language';
-import UiDialog from '../Dialog';
+import { DialogCallbackObject, DialogSettings } from "../Dialog/Data";
+import * as Language from "../../Language";
+import UiDialog from "../Dialog";
 
 class UiPageJumpTo implements DialogCallbackObject {
   private activeElement: HTMLElement;
@@ -26,19 +26,18 @@ class UiPageJumpTo implements DialogCallbackObject {
       const redirectUrl = element.dataset.link;
       if (redirectUrl) {
         callback = function (pageNo) {
-          window.location.href = redirectUrl.replace(/pageNo=%d/, 'pageNo=' + pageNo);
+          window.location.href = redirectUrl.replace(/pageNo=%d/, "pageNo=" + pageNo);
         };
       } else {
-        callback = function () {
-        };
+        callback = function () {};
       }
-    } else if (typeof callback !== 'function') {
+    } else if (typeof callback !== "function") {
       throw new TypeError("Expected a valid function for parameter 'callback'.");
     }
 
     if (!this.elements.has(element)) {
-      element.querySelectorAll('.jumpTo').forEach((jumpTo: HTMLElement) => {
-        jumpTo.addEventListener('click', (ev) => this.click(element, ev));
+      element.querySelectorAll(".jumpTo").forEach((jumpTo: HTMLElement) => {
+        jumpTo.addEventListener("click", (ev) => this.click(element, ev));
         this.elements.set(element, callback!);
       });
     }
@@ -54,12 +53,12 @@ class UiPageJumpTo implements DialogCallbackObject {
 
     UiDialog.open(this);
 
-    const pages = element.dataset.pages || '0';
+    const pages = element.dataset.pages || "0";
     this.input.value = pages;
     this.input.max = pages;
     this.input.select();
 
-    this.description.textContent = Language.get('wcf.page.jumpTo.description').replace(/#pages#/, pages);
+    this.description.textContent = Language.get("wcf.page.jumpTo.description").replace(/#pages#/, pages);
   }
 
   /**
@@ -68,7 +67,7 @@ class UiPageJumpTo implements DialogCallbackObject {
    * @param  {object}  event    event object
    */
   _keyUp(event: KeyboardEvent): void {
-    if (event.key === 'Enter' && !this.submitButton.disabled) {
+    if (event.key === "Enter" && !this.submitButton.disabled) {
       this.submit();
       return;
     }
@@ -89,29 +88,29 @@ class UiPageJumpTo implements DialogCallbackObject {
 
   _dialogSetup(): DialogSettings {
     const source = `<dl>
-        <dt><label for="jsPaginationPageNo">${Language.get('wcf.page.jumpTo')}</label></dt>
+        <dt><label for="jsPaginationPageNo">${Language.get("wcf.page.jumpTo")}</label></dt>
                 <dd>
           <input type="number" id="jsPaginationPageNo" value="1" min="1" max="1" class="tiny">
           <small></small>
         </dd>
       </dl>
       <div class="formSubmit">
-        <button class="buttonPrimary">${Language.get('wcf.global.button.submit')}</button>
+        <button class="buttonPrimary">${Language.get("wcf.global.button.submit")}</button>
       </div>`;
 
     return {
-      id: 'paginationOverlay',
+      id: "paginationOverlay",
       options: {
-        onSetup: content => {
-          this.input = content.querySelector('input')!;
-          this.input.addEventListener('keyup', (ev) => this._keyUp(ev));
+        onSetup: (content) => {
+          this.input = content.querySelector("input")!;
+          this.input.addEventListener("keyup", (ev) => this._keyUp(ev));
 
-          this.description = content.querySelector('small')!;
+          this.description = content.querySelector("small")!;
 
-          this.submitButton = content.querySelector('button')!;
-          this.submitButton.addEventListener('click', () => this.submit());
+          this.submitButton = content.querySelector("button")!;
+          this.submitButton.addEventListener("click", () => this.submit());
         },
-        title: Language.get('wcf.global.page.pagination'),
+        title: Language.get("wcf.global.page.pagination"),
       },
       source: source,
     };
index 4317a7d4be1f2c710dc6142a35e9573dfb8079be..1b9bff90dd539858b7fe7373209a0f5c77227ada 100644 (file)
@@ -7,14 +7,14 @@
  * @module  WoltLabSuite/Core/Ui/Page/Menu/Abstract
  */
 
-import * as Core from '../../../Core';
-import * as Environment from '../../../Environment';
-import * as EventHandler from '../../../Event/Handler';
-import * as Language from '../../../Language';
-import * as DomTraverse from '../../../Dom/Traverse';
-import * as UiScreen from '../../Screen';
+import * as Core from "../../../Core";
+import * as Environment from "../../../Environment";
+import * as EventHandler from "../../../Event/Handler";
+import * as Language from "../../../Language";
+import * as DomTraverse from "../../../Dom/Traverse";
+import * as UiScreen from "../../Screen";
 
-const _pageContainer = document.getElementById('pageContainer')!;
+const _pageContainer = document.getElementById("pageContainer")!;
 
 const enum TouchPosition {
   AtEdge = 20,
@@ -28,7 +28,7 @@ const enum TouchPosition {
  *
  * One 'left', 'right' or ''.
  */
-let _androidTouching = '';
+let _androidTouching = "";
 
 interface ItemData {
   itemList: HTMLOListElement;
@@ -46,7 +46,7 @@ abstract class UiPageMenuAbstract {
   private removeActiveList = false;
 
   protected constructor(eventIdentifier: string, elementId: string, buttonSelector: string) {
-    if (document.body.dataset.template === 'packageInstallationSetup') {
+    if (document.body.dataset.template === "packageInstallationSetup") {
       // work-around for WCFSetup on mobile
       return;
     }
@@ -56,48 +56,48 @@ abstract class UiPageMenuAbstract {
 
     const callbackOpen = this.open.bind(this);
     this.button = document.querySelector(buttonSelector) as HTMLElement;
-    this.button.addEventListener('click', callbackOpen);
+    this.button.addEventListener("click", callbackOpen);
 
     this.initItems();
     this.initHeader();
 
-    EventHandler.add(this.eventIdentifier, 'open', callbackOpen);
-    EventHandler.add(this.eventIdentifier, 'close', this.close.bind(this));
-    EventHandler.add(this.eventIdentifier, 'updateButtonState', this.updateButtonState.bind(this));
+    EventHandler.add(this.eventIdentifier, "open", callbackOpen);
+    EventHandler.add(this.eventIdentifier, "close", this.close.bind(this));
+    EventHandler.add(this.eventIdentifier, "updateButtonState", this.updateButtonState.bind(this));
 
-    this.menu.addEventListener('animationend', () => {
-      if (!this.menu.classList.contains('open')) {
-        this.menu.querySelectorAll('.menuOverlayItemList').forEach(itemList => {
+    this.menu.addEventListener("animationend", () => {
+      if (!this.menu.classList.contains("open")) {
+        this.menu.querySelectorAll(".menuOverlayItemList").forEach((itemList) => {
           // force the main list to be displayed
-          itemList.classList.remove('active', 'hidden');
+          itemList.classList.remove("active", "hidden");
         });
       }
     });
 
-    this.menu.children[0].addEventListener('transitionend', () => {
-      this.menu.classList.add('allowScroll');
+    this.menu.children[0].addEventListener("transitionend", () => {
+      this.menu.classList.add("allowScroll");
 
       if (this.removeActiveList) {
         this.removeActiveList = false;
 
         const list = this.activeList.pop();
         if (list) {
-          list.classList.remove('activeList');
+          list.classList.remove("activeList");
         }
       }
     });
 
-    const backdrop = document.createElement('div');
-    backdrop.className = 'menuOverlayMobileBackdrop';
-    backdrop.addEventListener('click', this.close.bind(this));
+    const backdrop = document.createElement("div");
+    backdrop.className = "menuOverlayMobileBackdrop";
+    backdrop.addEventListener("click", this.close.bind(this));
 
-    this.menu.insertAdjacentElement('afterend', backdrop);
+    this.menu.insertAdjacentElement("afterend", backdrop);
 
     this.menu.parentElement!.insertBefore(backdrop, this.menu.nextSibling);
 
     this.updateButtonState();
 
-    if (Environment.platform() === 'android') {
+    if (Environment.platform() === "android") {
       this.initializeAndroid();
     }
   }
@@ -114,13 +114,13 @@ abstract class UiPageMenuAbstract {
       event.preventDefault();
     }
 
-    this.menu.classList.add('open');
-    this.menu.classList.add('allowScroll');
-    this.menu.children[0].classList.add('activeList');
+    this.menu.classList.add("open");
+    this.menu.classList.add("allowScroll");
+    this.menu.children[0].classList.add("activeList");
 
     UiScreen.scrollDisable();
 
-    _pageContainer.classList.add('menuOverlay-' + this.menu.id);
+    _pageContainer.classList.add("menuOverlay-" + this.menu.id);
 
     UiScreen.pageOverlayOpen();
 
@@ -135,13 +135,13 @@ abstract class UiPageMenuAbstract {
       event.preventDefault();
     }
 
-    if (this.menu.classList.contains('open')) {
-      this.menu.classList.remove('open');
+    if (this.menu.classList.contains("open")) {
+      this.menu.classList.remove("open");
 
       UiScreen.scrollEnable();
       UiScreen.pageOverlayClose();
 
-      _pageContainer.classList.remove('menuOverlay-' + this.menu.id);
+      _pageContainer.classList.remove("menuOverlay-" + this.menu.id);
 
       return true;
     }
@@ -172,11 +172,11 @@ abstract class UiPageMenuAbstract {
     // specify on which side of the page the menu appears
     let appearsAt: "left" | "right";
     switch (this.menu.id) {
-      case 'pageUserMenuMobile':
-        appearsAt = 'right';
+      case "pageUserMenuMobile":
+        appearsAt = "right";
         break;
-      case 'pageMainMenuMobile':
-        appearsAt = 'left';
+      case "pageMainMenuMobile":
+        appearsAt = "left";
         break;
       default:
         return;
@@ -187,27 +187,29 @@ abstract class UiPageMenuAbstract {
     // horizontal position of the touch start
     let touchStart: { x: number; y: number } | undefined = undefined;
 
-    document.addEventListener('touchstart', event => {
+    document.addEventListener("touchstart", (event) => {
       const touches = event.touches;
 
       let isLeftEdge: boolean;
       let isRightEdge: boolean;
 
-      const isOpen = this.menu.classList.contains('open');
+      const isOpen = this.menu.classList.contains("open");
 
       // check whether we touch the edges of the menu
-      if (appearsAt === 'left') {
-        isLeftEdge = !isOpen && (touches[0].clientX < TouchPosition.AtEdge);
-        isRightEdge = isOpen && (Math.abs(this.menu.offsetWidth - touches[0].clientX) < TouchPosition.AtEdge);
+      if (appearsAt === "left") {
+        isLeftEdge = !isOpen && touches[0].clientX < TouchPosition.AtEdge;
+        isRightEdge = isOpen && Math.abs(this.menu.offsetWidth - touches[0].clientX) < TouchPosition.AtEdge;
       } else {
-        isLeftEdge = isOpen && (Math.abs(document.body.clientWidth - this.menu.offsetWidth - touches[0].clientX) < TouchPosition.AtEdge);
-        isRightEdge = !isOpen && ((document.body.clientWidth - touches[0].clientX) < TouchPosition.AtEdge);
+        isLeftEdge =
+          isOpen &&
+          Math.abs(document.body.clientWidth - this.menu.offsetWidth - touches[0].clientX) < TouchPosition.AtEdge;
+        isRightEdge = !isOpen && document.body.clientWidth - touches[0].clientX < TouchPosition.AtEdge;
       }
 
       // abort if more than one touch
       if (touches.length > 1) {
         if (_androidTouching) {
-          Core.triggerEvent(document, 'touchend');
+          Core.triggerEvent(document, "touchend");
         }
         return;
       }
@@ -230,7 +232,7 @@ abstract class UiPageMenuAbstract {
         }
       }
       // break if redactor is in use
-      if (document.documentElement.classList.contains('redactorActive')) {
+      if (document.documentElement.classList.contains("redactorActive")) {
         return;
       }
 
@@ -239,21 +241,21 @@ abstract class UiPageMenuAbstract {
         y: touches[0].clientY,
       };
 
-      if (isLeftEdge) _androidTouching = 'left';
-      if (isRightEdge) _androidTouching = 'right';
+      if (isLeftEdge) _androidTouching = "left";
+      if (isRightEdge) _androidTouching = "right";
     });
 
-    document.addEventListener('touchend', event => {
+    document.addEventListener("touchend", (event) => {
       // break if we did not start a touch
       if (!_androidTouching || !touchStart) {
         return;
       }
 
       // break if the menu did not even start opening
-      if (!this.menu.classList.contains('open')) {
+      if (!this.menu.classList.contains("open")) {
         // reset
         touchStart = undefined;
-        _androidTouching = '';
+        _androidTouching = "";
         return;
       }
 
@@ -266,28 +268,32 @@ abstract class UiPageMenuAbstract {
       }
 
       // clean up touch styles
-      this.menu.classList.add('androidMenuTouchEnd');
-      this.menu.style.removeProperty('transform');
+      this.menu.classList.add("androidMenuTouchEnd");
+      this.menu.style.removeProperty("transform");
       backdrop.style.removeProperty(appearsAt);
-      this.menu.addEventListener('transitionend', () => {
-        this.menu.classList.remove('androidMenuTouchEnd');
-      }, {once: true});
+      this.menu.addEventListener(
+        "transitionend",
+        () => {
+          this.menu.classList.remove("androidMenuTouchEnd");
+        },
+        { once: true }
+      );
 
       // check whether the user moved the finger far enough
-      if (appearsAt === 'left') {
-        if (_androidTouching === 'left' && position < (touchStart.x + 100)) this.close();
-        if (_androidTouching === 'right' && position < (touchStart.x - 100)) this.close();
+      if (appearsAt === "left") {
+        if (_androidTouching === "left" && position < touchStart.x + 100) this.close();
+        if (_androidTouching === "right" && position < touchStart.x - 100) this.close();
       } else {
-        if (_androidTouching === 'left' && position > (touchStart.x + 100)) this.close();
-        if (_androidTouching === 'right' && position > (touchStart.x - 100)) this.close();
+        if (_androidTouching === "left" && position > touchStart.x + 100) this.close();
+        if (_androidTouching === "right" && position > touchStart.x - 100) this.close();
       }
 
       // reset
       touchStart = undefined;
-      _androidTouching = '';
+      _androidTouching = "";
     });
 
-    document.addEventListener('touchmove', event => {
+    document.addEventListener("touchmove", (event) => {
       // break if we did not start a touch
       if (!_androidTouching || !touchStart) {
         return;
@@ -298,12 +304,14 @@ abstract class UiPageMenuAbstract {
       // check whether the user started moving in the correct direction
       // this avoids false positives, in case the user just wanted to tap
       let movedFromEdge = false;
-      if (_androidTouching === 'left') movedFromEdge = touches[0].clientX > (touchStart.x + TouchPosition.MovedHorizontally);
-      if (_androidTouching === 'right') movedFromEdge = touches[0].clientX < (touchStart.x - TouchPosition.MovedHorizontally);
+      if (_androidTouching === "left")
+        movedFromEdge = touches[0].clientX > touchStart.x + TouchPosition.MovedHorizontally;
+      if (_androidTouching === "right")
+        movedFromEdge = touches[0].clientX < touchStart.x - TouchPosition.MovedHorizontally;
 
       const movedVertically = Math.abs(touches[0].clientY - touchStart.y) > TouchPosition.MovedVertically;
 
-      let isOpen = this.menu.classList.contains('open');
+      let isOpen = this.menu.classList.contains("open");
       if (!isOpen && movedFromEdge && !movedVertically) {
         // the menu is not yet open, but the user moved into the right direction
         this.open();
@@ -313,11 +321,14 @@ abstract class UiPageMenuAbstract {
       if (isOpen) {
         // update CSS to the new finger position
         let position = touches[0].clientX;
-        if (appearsAt === 'right') position = document.body.clientWidth - position;
+        if (appearsAt === "right") position = document.body.clientWidth - position;
         if (position > this.menu.offsetWidth) position = this.menu.offsetWidth;
         if (position < 0) position = 0;
-        this.menu.style.setProperty('transform', 'translateX(' + (appearsAt === 'left' ? 1 : -1) * (position - this.menu.offsetWidth) + 'px)');
-        backdrop.style.setProperty(appearsAt, Math.min(this.menu.offsetWidth, position) + 'px');
+        this.menu.style.setProperty(
+          "transform",
+          "translateX(" + (appearsAt === "left" ? 1 : -1) * (position - this.menu.offsetWidth) + "px)"
+        );
+        backdrop.style.setProperty(appearsAt, Math.min(this.menu.offsetWidth, position) + "px");
       }
     });
   }
@@ -326,7 +337,7 @@ abstract class UiPageMenuAbstract {
    * Initializes all menu items.
    */
   private initItems(): void {
-    this.menu.querySelectorAll('.menuOverlayItemLink').forEach((element: HTMLAnchorElement) => {
+    this.menu.querySelectorAll(".menuOverlayItemLink").forEach((element: HTMLAnchorElement) => {
       this.initItem(element);
     });
   }
@@ -339,11 +350,11 @@ abstract class UiPageMenuAbstract {
     const parent = item.parentElement!;
     const more = parent.dataset.more;
     if (more) {
-      item.addEventListener('click', event => {
+      item.addEventListener("click", (event) => {
         event.preventDefault();
         event.stopPropagation();
 
-        EventHandler.fire(this.eventIdentifier, 'more', {
+        EventHandler.fire(this.eventIdentifier, "more", {
           handler: this,
           identifier: more,
           item: item,
@@ -360,10 +371,10 @@ abstract class UiPageMenuAbstract {
     }
 
     // handle static items with an icon-type button next to it (acp menu)
-    if (itemList.nodeName !== 'OL' && itemList.classList.contains('menuOverlayItemLinkIcon')) {
+    if (itemList.nodeName !== "OL" && itemList.classList.contains("menuOverlayItemLinkIcon")) {
       // add wrapper
-      const wrapper = document.createElement('span');
-      wrapper.className = 'menuOverlayItemWrapper';
+      const wrapper = document.createElement("span");
+      wrapper.className = "menuOverlayItemWrapper";
       parent.insertBefore(wrapper, item);
       wrapper.appendChild(item);
 
@@ -374,7 +385,7 @@ abstract class UiPageMenuAbstract {
       return;
     }
 
-    const isLink = item.href !== '#';
+    const isLink = item.href !== "#";
     const parentItemList = parent.parentElement as HTMLOListElement;
     let itemTitle = itemList.dataset.title;
 
@@ -384,45 +395,45 @@ abstract class UiPageMenuAbstract {
     });
 
     if (!itemTitle) {
-      itemTitle = DomTraverse.childByClass(item, 'menuOverlayItemTitle')!.textContent!;
+      itemTitle = DomTraverse.childByClass(item, "menuOverlayItemTitle")!.textContent!;
       itemList.dataset.title = itemTitle;
     }
 
     const callbackLink = this.showItemList.bind(this, item);
     if (isLink) {
-      const wrapper = document.createElement('span');
-      wrapper.className = 'menuOverlayItemWrapper';
+      const wrapper = document.createElement("span");
+      wrapper.className = "menuOverlayItemWrapper";
       parent.insertBefore(wrapper, item);
       wrapper.appendChild(item);
 
-      const moreLink = document.createElement('a');
-      moreLink.href = '#';
-      moreLink.className = 'menuOverlayItemLinkIcon' + (item.classList.contains('active') ? ' active' : '');
+      const moreLink = document.createElement("a");
+      moreLink.href = "#";
+      moreLink.className = "menuOverlayItemLinkIcon" + (item.classList.contains("active") ? " active" : "");
       moreLink.innerHTML = '<span class="icon icon24 fa-angle-right"></span>';
-      moreLink.addEventListener('click', callbackLink);
+      moreLink.addEventListener("click", callbackLink);
       wrapper.appendChild(moreLink);
     } else {
-      item.classList.add('menuOverlayItemLinkMore');
-      item.addEventListener('click', callbackLink);
+      item.classList.add("menuOverlayItemLinkMore");
+      item.addEventListener("click", callbackLink);
     }
 
-    const backLinkItem = document.createElement('li');
-    backLinkItem.className = 'menuOverlayHeader';
+    const backLinkItem = document.createElement("li");
+    backLinkItem.className = "menuOverlayHeader";
 
-    const wrapper = document.createElement('span');
-    wrapper.className = 'menuOverlayItemWrapper';
+    const wrapper = document.createElement("span");
+    wrapper.className = "menuOverlayItemWrapper";
 
-    const backLink = document.createElement('a');
-    backLink.href = '#';
-    backLink.className = 'menuOverlayItemLink menuOverlayBackLink';
-    backLink.textContent = parentItemList.dataset.title || '';
-    backLink.addEventListener('click', this.hideItemList.bind(this, item));
+    const backLink = document.createElement("a");
+    backLink.href = "#";
+    backLink.className = "menuOverlayItemLink menuOverlayBackLink";
+    backLink.textContent = parentItemList.dataset.title || "";
+    backLink.addEventListener("click", this.hideItemList.bind(this, item));
 
-    const closeLink = document.createElement('a');
-    closeLink.href = '#';
-    closeLink.className = 'menuOverlayItemLinkIcon';
+    const closeLink = document.createElement("a");
+    closeLink.href = "#";
+    closeLink.className = "menuOverlayItemLinkIcon";
     closeLink.innerHTML = '<span class="icon icon24 fa-times"></span>';
-    closeLink.addEventListener('click', this.close.bind(this));
+    closeLink.addEventListener("click", this.close.bind(this));
 
     wrapper.appendChild(backLink);
     wrapper.appendChild(closeLink);
@@ -430,10 +441,10 @@ abstract class UiPageMenuAbstract {
 
     itemList.insertBefore(backLinkItem, itemList.firstElementChild);
 
-    if (!backLinkItem.nextElementSibling!.classList.contains('menuOverlayTitle')) {
-      const titleItem = document.createElement('li');
-      titleItem.className = 'menuOverlayTitle';
-      const title = document.createElement('span');
+    if (!backLinkItem.nextElementSibling!.classList.contains("menuOverlayTitle")) {
+      const titleItem = document.createElement("li");
+      titleItem.className = "menuOverlayTitle";
+      const title = document.createElement("span");
       title.textContent = itemTitle;
       titleItem.appendChild(title);
 
@@ -445,31 +456,31 @@ abstract class UiPageMenuAbstract {
    * Renders the menu item list header.
    */
   private initHeader(): void {
-    const listItem = document.createElement('li');
-    listItem.className = 'menuOverlayHeader';
+    const listItem = document.createElement("li");
+    listItem.className = "menuOverlayHeader";
 
-    const wrapper = document.createElement('span');
-    wrapper.className = 'menuOverlayItemWrapper';
+    const wrapper = document.createElement("span");
+    wrapper.className = "menuOverlayItemWrapper";
     listItem.appendChild(wrapper);
 
-    const logoWrapper = document.createElement('span');
-    logoWrapper.className = 'menuOverlayLogoWrapper';
+    const logoWrapper = document.createElement("span");
+    logoWrapper.className = "menuOverlayLogoWrapper";
     wrapper.appendChild(logoWrapper);
 
-    const logo = document.createElement('span');
-    logo.className = 'menuOverlayLogo';
+    const logo = document.createElement("span");
+    logo.className = "menuOverlayLogo";
     const pageLogo = this.menu.dataset.pageLogo!;
-    logo.style.setProperty('background-image', `url("${pageLogo}")`, '');
+    logo.style.setProperty("background-image", `url("${pageLogo}")`, "");
     logoWrapper.appendChild(logo);
 
-    const closeLink = document.createElement('a');
-    closeLink.href = '#';
-    closeLink.className = 'menuOverlayItemLinkIcon';
+    const closeLink = document.createElement("a");
+    closeLink.href = "#";
+    closeLink.className = "menuOverlayItemLinkIcon";
     closeLink.innerHTML = '<span class="icon icon24 fa-times"></span>';
-    closeLink.addEventListener('click', this.close.bind(this));
+    closeLink.addEventListener("click", this.close.bind(this));
     wrapper.appendChild(closeLink);
 
-    const list = DomTraverse.childByClass(this.menu, 'menuOverlayItemList')!;
+    const list = DomTraverse.childByClass(this.menu, "menuOverlayItemList")!;
     list.insertBefore(listItem, list.firstElementChild);
   }
 
@@ -481,11 +492,11 @@ abstract class UiPageMenuAbstract {
       event.preventDefault();
     }
 
-    this.menu.classList.remove('allowScroll');
+    this.menu.classList.remove("allowScroll");
     this.removeActiveList = true;
 
     const data = this.items.get(item)!;
-    data.parentItemList.classList.remove('hidden');
+    data.parentItemList.classList.remove("hidden");
 
     this.updateDepth(false);
   }
@@ -500,24 +511,24 @@ abstract class UiPageMenuAbstract {
 
     const load = data.itemList.dataset.load;
     if (load) {
-      if (!Core.stringToBool(item.dataset.loaded || '')) {
+      if (!Core.stringToBool(item.dataset.loaded || "")) {
         const target = event.currentTarget as HTMLElement;
         const icon = target.firstElementChild!;
-        if (icon.classList.contains('fa-angle-right')) {
-          icon.classList.remove('fa-angle-right');
-          icon.classList.add('fa-spinner');
+        if (icon.classList.contains("fa-angle-right")) {
+          icon.classList.remove("fa-angle-right");
+          icon.classList.add("fa-spinner");
         }
 
-        EventHandler.fire(this.eventIdentifier, 'load_' + load);
+        EventHandler.fire(this.eventIdentifier, "load_" + load);
 
         return;
       }
     }
 
-    this.menu.classList.remove('allowScroll');
+    this.menu.classList.remove("allowScroll");
 
-    data.itemList.classList.add('activeList');
-    data.parentItemList.classList.add('hidden');
+    data.itemList.classList.add("activeList");
+    data.parentItemList.classList.add("hidden");
 
     this.activeList.push(data.itemList);
 
@@ -525,29 +536,29 @@ abstract class UiPageMenuAbstract {
   }
 
   private updateDepth(increase: boolean): void {
-    this.depth += (increase) ? 1 : -1;
+    this.depth += increase ? 1 : -1;
 
     let offset = this.depth * -100;
-    if (Language.get('wcf.global.pageDirection') === 'rtl') {
+    if (Language.get("wcf.global.pageDirection") === "rtl") {
       // reverse logic for RTL
       offset *= -1;
     }
 
     const child = this.menu.children[0] as HTMLElement;
-    child.style.setProperty('transform', `translateX(${offset}%)`, '');
+    child.style.setProperty("transform", `translateX(${offset}%)`, "");
   }
 
   private updateButtonState(): void {
     let hasNewContent = false;
-    const itemList = this.menu.querySelector('.menuOverlayItemList');
-    this.menu.querySelectorAll('.badgeUpdate').forEach(badge => {
+    const itemList = this.menu.querySelector(".menuOverlayItemList");
+    this.menu.querySelectorAll(".badgeUpdate").forEach((badge) => {
       const value = badge.textContent!;
-      if (~~value > 0 && badge.closest('.menuOverlayItemList') === itemList) {
+      if (~~value > 0 && badge.closest(".menuOverlayItemList") === itemList) {
         hasNewContent = true;
       }
     });
 
-    this.button.classList[hasNewContent ? 'add' : 'remove']('pageMenuMobileButtonHasContent');
+    this.button.classList[hasNewContent ? "add" : "remove"]("pageMenuMobileButtonHasContent");
   }
 }
 
index b2e1e7ed00d00c0541a446510018d39c6ac45bf0..5bc7439f42bfab089e72787887c80e138dc0c0f8 100644 (file)
@@ -1,12 +1,12 @@
-import * as Ajax from '../../Ajax';
-import { AjaxCallbackObject, DatabaseObjectActionResponse } from '../../Ajax/Data';
-import { DialogCallbackObject } from '../Dialog/Data';
-import DomUtil from '../../Dom/Util';
-import * as Language from '../../Language';
-import * as StringUtil from '../../StringUtil';
-import UiDialog from '../Dialog';
+import * as Ajax from "../../Ajax";
+import { AjaxCallbackObject, DatabaseObjectActionResponse } from "../../Ajax/Data";
+import { DialogCallbackObject } from "../Dialog/Data";
+import DomUtil from "../../Dom/Util";
+import * as Language from "../../Language";
+import * as StringUtil from "../../StringUtil";
+import UiDialog from "../Dialog";
 
-type CallbackSelect = (value: string) => void
+type CallbackSelect = (value: string) => void;
 
 interface SearchResult {
   displayLink: string;
@@ -37,7 +37,7 @@ class UiPageSearch implements AjaxCallbackObject, DialogCallbackObject {
 
     const value = this.searchInput!.value.trim();
     if (value.length < 3) {
-      DomUtil.innerError(inputContainer, Language.get('wcf.page.search.error.tooShort'));
+      DomUtil.innerError(inputContainer, Language.get("wcf.page.search.error.tooShort"));
       return;
     } else {
       DomUtil.innerError(inputContainer, false);
@@ -54,16 +54,16 @@ class UiPageSearch implements AjaxCallbackObject, DialogCallbackObject {
     event.preventDefault();
 
     const page = event.currentTarget as HTMLElement;
-    const pageTitle = page.querySelector('h3')!;
+    const pageTitle = page.querySelector("h3")!;
 
-    this.callbackSelect!(page.dataset.pageId! + '#' + pageTitle.textContent!.replace(/['"]/g, ''));
+    this.callbackSelect!(page.dataset.pageId! + "#" + pageTitle.textContent!.replace(/['"]/g, ""));
 
     UiDialog.close(this);
   }
 
   _ajaxSuccess(data: AjaxResponse): void {
     const html = data.returnValues
-      .map(page => {
+      .map((page) => {
         const name = StringUtil.escapeHTML(page.name);
         const displayLink = StringUtil.escapeHTML(page.displayLink);
 
@@ -74,55 +74,55 @@ class UiPageSearch implements AjaxCallbackObject, DialogCallbackObject {
           </div>
         </li>`;
       })
-      .join('');
+      .join("");
 
     this.resultList!.innerHTML = html;
 
-    DomUtil[html ? 'show' : 'hide'](this.resultContainer!);
+    DomUtil[html ? "show" : "hide"](this.resultContainer!);
 
     if (html) {
-      this.resultList!.querySelectorAll('.containerHeadline').forEach((item: HTMLElement) => {
-        item.addEventListener('click', (ev) => this.click(ev));
+      this.resultList!.querySelectorAll(".containerHeadline").forEach((item: HTMLElement) => {
+        item.addEventListener("click", (ev) => this.click(ev));
       });
     } else {
-      DomUtil.innerError(this.searchInput!.parentElement!, Language.get('wcf.page.search.error.noResults'));
+      DomUtil.innerError(this.searchInput!.parentElement!, Language.get("wcf.page.search.error.noResults"));
     }
   }
 
   _ajaxSetup() {
     return {
       data: {
-        actionName: 'search',
-        className: 'wcf\\data\\page\\PageAction',
+        actionName: "search",
+        className: "wcf\\data\\page\\PageAction",
       },
     };
   }
 
   _dialogSetup() {
     return {
-      id: 'wcfUiPageSearch',
+      id: "wcfUiPageSearch",
       options: {
         onSetup: () => {
-          this.searchInput = document.getElementById('wcfUiPageSearchInput') as HTMLInputElement;
-          this.searchInput.addEventListener('keydown', event => {
-            if (event.key === 'Enter') {
+          this.searchInput = document.getElementById("wcfUiPageSearchInput") as HTMLInputElement;
+          this.searchInput.addEventListener("keydown", (event) => {
+            if (event.key === "Enter") {
               this.search(event);
             }
           });
 
-          this.searchInput.nextElementSibling!.addEventListener('click', (ev) => this.search(ev));
+          this.searchInput.nextElementSibling!.addEventListener("click", (ev) => this.search(ev));
 
-          this.resultContainer = document.getElementById('wcfUiPageSearchResultContainer') as HTMLElement;
-          this.resultList = document.getElementById('wcfUiPageSearchResultList') as HTMLOListElement;
+          this.resultContainer = document.getElementById("wcfUiPageSearchResultContainer") as HTMLElement;
+          this.resultList = document.getElementById("wcfUiPageSearchResultList") as HTMLOListElement;
         },
         onShow: () => {
           this.searchInput!.focus();
         },
-        title: Language.get('wcf.page.search'),
+        title: Language.get("wcf.page.search"),
       },
       source: `<div class="section">
         <dl>
-          <dt><label for="wcfUiPageSearchInput">${Language.get('wcf.page.search.name')}</label></dt>
+          <dt><label for="wcfUiPageSearchInput">${Language.get("wcf.page.search.name")}</label></dt>
           <dd>
             <div class="inputAddon">
               <input type="text" id="wcfUiPageSearchInput" class="long">
@@ -133,7 +133,7 @@ class UiPageSearch implements AjaxCallbackObject, DialogCallbackObject {
       </div>
       <section id="wcfUiPageSearchResultContainer" class="section" style="display: none;">
         <header class="sectionHeader">
-          <h2 class="sectionTitle">${Language.get('wcf.page.search.results')}</h2>
+          <h2 class="sectionTitle">${Language.get("wcf.page.search.results")}</h2>
         </header>
         <ol id="wcfUiPageSearchResultList" class="containerList"></ol>
       </section>`,
index fdfd144392a66714967aab98f610ad4209aa64fb..ace186a0413fcfdeb77bc89562e71ac58ff5ad7f 100644 (file)
@@ -8,14 +8,14 @@
  * @module  WoltLabSuite/Core/Ui/Page/Search/Handler
  */
 
-import * as Language from '../../../Language';
-import * as StringUtil from '../../../StringUtil';
-import DomUtil from '../../../Dom/Util';
-import UiDialog from '../../Dialog';
-import UiPageSearchInput from './Input';
-import { DatabaseObjectActionResponse } from '../../../Ajax/Data';
+import * as Language from "../../../Language";
+import * as StringUtil from "../../../StringUtil";
+import DomUtil from "../../../Dom/Util";
+import UiDialog from "../../Dialog";
+import UiPageSearchInput from "./Input";
+import { DatabaseObjectActionResponse } from "../../../Ajax/Data";
 
-type CallbackSelect = (objectId: number) => void
+type CallbackSelect = (objectId: number) => void;
 
 interface ItemData {
   description?: string;
@@ -46,7 +46,7 @@ class UiPageSearchHandler {
     UiDialog.open(this);
     UiDialog.setTitle(this, title);
 
-    this.searchInputLabel!.textContent = Language.get(labelLanguageItem || 'wcf.page.pageObjectID.search.terms');
+    this.searchInputLabel!.textContent = Language.get(labelLanguageItem || "wcf.page.pageObjectID.search.terms");
 
     this._getSearchInputHandler().setPageId(pageId);
   }
@@ -58,20 +58,22 @@ class UiPageSearchHandler {
     this.resetList();
 
     if (!Array.isArray(data.returnValues) || data.returnValues.length === 0) {
-      DomUtil.innerError(this.searchInput!, Language.get('wcf.page.pageObjectID.search.noResults'));
+      DomUtil.innerError(this.searchInput!, Language.get("wcf.page.pageObjectID.search.noResults"));
       return;
     }
 
-    data.returnValues.forEach(item => {
+    data.returnValues.forEach((item) => {
       let image = item.image;
       if (/^fa-/.test(image)) {
-        image = `<span class="icon icon48 ${image} pointer jsTooltip" title="${Language.get('wcf.global.select')}"></span>`;
+        image = `<span class="icon icon48 ${image} pointer jsTooltip" title="${Language.get(
+          "wcf.global.select"
+        )}"></span>`;
       }
 
-      const listItem = document.createElement('li');
+      const listItem = document.createElement("li");
       listItem.dataset.objectId = item.objectID.toString();
 
-      const description = item.description ? `<p>${item.description}</p>` : '' 
+      const description = item.description ? `<p>${item.description}</p>` : "";
       listItem.innerHTML = `<div class="box48">
         ${image}
         <div>
@@ -84,7 +86,7 @@ class UiPageSearchHandler {
         </div>
       </div>`;
 
-      listItem.addEventListener('click', this.click.bind(this));
+      listItem.addEventListener("click", this.click.bind(this));
 
       this.resultList!.appendChild(listItem);
     });
@@ -98,7 +100,7 @@ class UiPageSearchHandler {
   private resetList(): void {
     DomUtil.innerError(this.searchInput!, false);
 
-    this.resultList!.innerHTML = '';
+    this.resultList!.innerHTML = "";
 
     DomUtil.hide(this.resultListContainer!);
   }
@@ -108,7 +110,7 @@ class UiPageSearchHandler {
    */
   _getSearchInputHandler(): UiPageSearchInput {
     if (!this.searchInputHandler) {
-      const input = document.getElementById('wcfUiPageSearchInput') as HTMLInputElement;
+      const input = document.getElementById("wcfUiPageSearchInput") as HTMLInputElement;
       this.searchInputHandler = new UiPageSearchInput(input, {
         callbackSuccess: this.buildList.bind(this),
       });
@@ -122,7 +124,7 @@ class UiPageSearchHandler {
    */
   private click(event: MouseEvent): void {
     const clickTarget = event.target as HTMLElement;
-    if (clickTarget.nodeName === 'A') {
+    if (clickTarget.nodeName === "A") {
       return;
     }
 
@@ -136,31 +138,31 @@ class UiPageSearchHandler {
 
   _dialogSetup() {
     return {
-      id: 'wcfUiPageSearchHandler',
+      id: "wcfUiPageSearchHandler",
       options: {
         onShow: (content: HTMLElement): void => {
           if (!this.searchInput) {
-            this.searchInput = document.getElementById('wcfUiPageSearchInput') as HTMLInputElement;
+            this.searchInput = document.getElementById("wcfUiPageSearchInput") as HTMLInputElement;
             this.searchInputLabel = content.querySelector('label[for="wcfUiPageSearchInput"]') as HTMLLabelElement;
-            this.resultList = document.getElementById('wcfUiPageSearchResultList') as HTMLUListElement;
-            this.resultListContainer = document.getElementById('wcfUiPageSearchResultListContainer') as HTMLElement;
+            this.resultList = document.getElementById("wcfUiPageSearchResultList") as HTMLUListElement;
+            this.resultListContainer = document.getElementById("wcfUiPageSearchResultListContainer") as HTMLElement;
           }
 
           // clear search input
-          this.searchInput.value = '';
+          this.searchInput.value = "";
 
           // reset results
           DomUtil.hide(this.resultListContainer!);
-          this.resultList!.innerHTML = '';
+          this.resultList!.innerHTML = "";
 
           this.searchInput.focus();
         },
-        title: '',
+        title: "",
       },
       source: `<div class="section">
         <dl>
           <dt>
-            <label for="wcfUiPageSearchInput">${Language.get('wcf.page.pageObjectID.search.terms')}</label>
+            <label for="wcfUiPageSearchInput">${Language.get("wcf.page.pageObjectID.search.terms")}</label>
           </dt>
           <dd>
             <input type="text" id="wcfUiPageSearchInput" class="long">
@@ -169,7 +171,7 @@ class UiPageSearchHandler {
       </div>
       <section id="wcfUiPageSearchResultListContainer" class="section sectionContainerList">
         <header class="sectionHeader">
-          <h2 class="sectionTitle">${Language.get('wcf.page.pageObjectID.search.results')}</h2>
+          <h2 class="sectionTitle">${Language.get("wcf.page.pageObjectID.search.results")}</h2>
         </header>
         <ul id="wcfUiPageSearchResultList" class="containerList wcfUiPageSearchResultList"></ul>
       </section>`,
index 194fcd23c8c0aed5017b1f1cff6e1c77ea9083b1..f75e4551133c1dd5bfed6e12d90882307d0dc756 100644 (file)
@@ -7,15 +7,15 @@
  * @module  WoltLabSuite/Core/Ui/Page/Search/Input
  */
 
-import * as Core from '../../../Core';
-import UiSearchInput from '../../Search/Input';
-import { SearchInputOptions } from '../../Search/Data';
-import { DatabaseObjectActionPayload, DatabaseObjectActionResponse } from '../../../Ajax/Data';
+import * as Core from "../../../Core";
+import UiSearchInput from "../../Search/Input";
+import { SearchInputOptions } from "../../Search/Data";
+import { DatabaseObjectActionPayload, DatabaseObjectActionResponse } from "../../../Ajax/Data";
 
-type CallbackSuccess = (data: DatabaseObjectActionResponse) => void
+type CallbackSuccess = (data: DatabaseObjectActionResponse) => void;
 
 interface PageSearchOptions extends SearchInputOptions {
-  callbackSuccess: CallbackSuccess
+  callbackSuccess: CallbackSuccess;
 }
 
 class UiPageSearchInput extends UiSearchInput {
@@ -23,15 +23,18 @@ class UiPageSearchInput extends UiSearchInput {
   private pageId: number;
 
   constructor(element: HTMLInputElement, options: PageSearchOptions) {
-    if (typeof options.callbackSuccess !== 'function') {
+    if (typeof options.callbackSuccess !== "function") {
       throw new Error("Expected a valid callback function for 'callbackSuccess'.");
     }
 
-    options = Core.extend({
-      ajax: {
-        className: 'wcf\\data\\page\\PageAction',
+    options = Core.extend(
+      {
+        ajax: {
+          className: "wcf\\data\\page\\PageAction",
+        },
       },
-    }, options) as any;
+      options
+    ) as any;
 
     super(element, options);
 
index fe5fc77c81cf6f6d597379921813bed5504808d0..1f5a47e3960b978976e199c23e336b28b90ee96c 100644 (file)
@@ -7,10 +7,10 @@
  * @module  WoltLabSuite/Core/Ui/Pagination
  */
 
-import * as Core from '../Core';
-import * as Language from '../Language';
-import * as StringUtil from '../StringUtil';
-import * as UiPageJumpTo from './Page/JumpTo';
+import * as Core from "../Core";
+import * as Language from "../Language";
+import * as StringUtil from "../StringUtil";
+import * as UiPageJumpTo from "./Page/JumpTo";
 
 class UiPagination {
   /**
@@ -36,14 +36,14 @@ class UiPagination {
     this.element = element;
     this.activePage = options.activePage;
     this.maxPage = options.maxPage;
-    if (typeof options.callbackSwitch === 'function') {
+    if (typeof options.callbackSwitch === "function") {
       this.callbackSwitch = options.callbackSwitch;
     }
-    if (typeof options.callbackShouldSwitch === 'function') {
+    if (typeof options.callbackShouldSwitch === "function") {
       this.callbackShouldSwitch = options.callbackShouldSwitch;
     }
 
-    this.element.classList.add('pagination');
+    this.element.classList.add("pagination");
     this.rebuild();
   }
 
@@ -54,25 +54,25 @@ class UiPagination {
     let hasHiddenPages = false;
 
     // clear content
-    this.element.innerHTML = '';
+    this.element.innerHTML = "";
 
-    const list = document.createElement('ul');
-    let listItem = document.createElement('li');
-    listItem.className = 'skip';
+    const list = document.createElement("ul");
+    let listItem = document.createElement("li");
+    listItem.className = "skip";
     list.appendChild(listItem);
 
-    let iconClassNames = 'icon icon24 fa-chevron-left';
+    let iconClassNames = "icon icon24 fa-chevron-left";
     if (this.activePage > 1) {
-      const link = document.createElement('a');
-      link.className = iconClassNames + ' jsTooltip';
-      link.href = '#';
-      link.title = Language.get('wcf.global.page.previous');
-      link.rel = 'prev';
+      const link = document.createElement("a");
+      link.className = iconClassNames + " jsTooltip";
+      link.href = "#";
+      link.title = Language.get("wcf.global.page.previous");
+      link.rel = "prev";
       listItem.appendChild(link);
-      link.addEventListener('click', (ev) => this.switchPage(this.activePage - 1, ev));
+      link.addEventListener("click", (ev) => this.switchPage(this.activePage - 1, ev));
     } else {
       listItem.innerHTML = '<span class="' + iconClassNames + '"></span>';
-      listItem.classList.add('disabled');
+      listItem.classList.add("disabled");
     }
 
     // add first page
@@ -130,13 +130,13 @@ class UiPagination {
     }
 
     // left ... links
-    const jumpToHtml = '<a class="jsTooltip" title="' + Language.get('wcf.page.jumpTo') + '">&hellip;</a>';
+    const jumpToHtml = '<a class="jsTooltip" title="' + Language.get("wcf.page.jumpTo") + '">&hellip;</a>';
     if (left > 1) {
       if (left - 1 < 2) {
         list.appendChild(this.createLink(2));
       } else {
-        listItem = document.createElement('li');
-        listItem.className = 'jumpTo';
+        listItem = document.createElement("li");
+        listItem.className = "jumpTo";
         listItem.innerHTML = jumpToHtml;
         list.appendChild(listItem);
         hasHiddenPages = true;
@@ -153,8 +153,8 @@ class UiPagination {
       if (this.maxPage - right < 2) {
         list.appendChild(this.createLink(this.maxPage - 1));
       } else {
-        listItem = document.createElement('li');
-        listItem.className = 'jumpTo';
+        listItem = document.createElement("li");
+        listItem.className = "jumpTo";
         listItem.innerHTML = jumpToHtml;
         list.appendChild(listItem);
         hasHiddenPages = true;
@@ -165,21 +165,21 @@ class UiPagination {
     list.appendChild(this.createLink(this.maxPage));
 
     // add next button
-    listItem = document.createElement('li');
-    listItem.className = 'skip';
+    listItem = document.createElement("li");
+    listItem.className = "skip";
     list.appendChild(listItem);
-    iconClassNames = 'icon icon24 fa-chevron-right';
+    iconClassNames = "icon icon24 fa-chevron-right";
     if (this.activePage < this.maxPage) {
-      const link = document.createElement('a');
-      link.className = iconClassNames + ' jsTooltip';
-      link.href = '#';
-      link.title = Language.get('wcf.global.page.next');
-      link.rel = 'next';
+      const link = document.createElement("a");
+      link.className = iconClassNames + " jsTooltip";
+      link.href = "#";
+      link.title = Language.get("wcf.global.page.next");
+      link.rel = "next";
       listItem.appendChild(link);
-      link.addEventListener('click', (ev) => this.switchPage(this.activePage + 1, ev));
+      link.addEventListener("click", (ev) => this.switchPage(this.activePage + 1, ev));
     } else {
       listItem.innerHTML = '<span class="' + iconClassNames + '"></span>';
-      listItem.classList.add('disabled');
+      listItem.classList.add("disabled");
     }
 
     if (hasHiddenPages) {
@@ -194,18 +194,23 @@ class UiPagination {
    * Creates a link to a specific page.
    */
   private createLink(pageNo: number): HTMLElement {
-    const listItem = document.createElement('li');
+    const listItem = document.createElement("li");
     if (pageNo !== this.activePage) {
-      const link = document.createElement('a');
+      const link = document.createElement("a");
       link.textContent = StringUtil.addThousandsSeparator(pageNo);
-      link.addEventListener('click', (ev) => this.switchPage(pageNo, ev));
+      link.addEventListener("click", (ev) => this.switchPage(pageNo, ev));
       listItem.appendChild(link);
     } else {
-      listItem.classList.add('active');
-      listItem.innerHTML = '<span>' + StringUtil.addThousandsSeparator(pageNo) + '</span><span class="invisible">' + Language.get('wcf.page.pagePosition', {
-        pageNo: pageNo,
-        pages: this.maxPage,
-      }) + '</span>';
+      listItem.classList.add("active");
+      listItem.innerHTML =
+        "<span>" +
+        StringUtil.addThousandsSeparator(pageNo) +
+        '</span><span class="invisible">' +
+        Language.get("wcf.page.pagePosition", {
+          pageNo: pageNo,
+          pages: this.maxPage,
+        }) +
+        "</span>";
     }
     return listItem;
   }
@@ -241,11 +246,11 @@ class UiPagination {
       const target = event.currentTarget as HTMLElement;
       // force tooltip to vanish and strip positioning
       if (target && target.dataset.tooltip) {
-        const tooltip = document.getElementById('balloonTooltip');
+        const tooltip = document.getElementById("balloonTooltip");
         if (tooltip) {
-          Core.triggerEvent(target, 'mouseleave');
-          tooltip.style.removeProperty('top');
-          tooltip.style.removeProperty('bottom');
+          Core.triggerEvent(target, "mouseleave");
+          tooltip.style.removeProperty("top");
+          tooltip.style.removeProperty("bottom");
         }
       }
     }
@@ -268,7 +273,7 @@ class UiPagination {
   }
 }
 
-export = UiPagination
+export = UiPagination;
 
 type CallbackSwitch = (pageNo: number) => void;
 type CallbackShouldSwitch = (pageNo: number) => boolean;
@@ -276,6 +281,6 @@ type CallbackShouldSwitch = (pageNo: number) => boolean;
 interface PaginationOptions {
   activePage: number;
   maxPage: number;
-  callbackShouldSwitch?: CallbackShouldSwitch | null,
-  callbackSwitch?: CallbackSwitch | null,
+  callbackShouldSwitch?: CallbackShouldSwitch | null;
+  callbackSwitch?: CallbackSwitch | null;
 }
index adf36aafa9d55f88e3ba454e088487e1b17d728b..f5005127f19e8594d21866d03c1fc2e7d3dea259 100644 (file)
@@ -8,8 +8,8 @@
  * @module  WoltLabSuite/Core/Ui/Screen
  */
 
-import * as Core from '../Core';
-import * as Environment from '../Environment';
+import * as Core from "../Core";
+import * as Environment from "../Environment";
 
 const _mql = new Map<string, MediaQueryData>();
 
@@ -19,20 +19,22 @@ let _scrollOffsetFrom: string;
 let _scrollTop = 0;
 let _pageOverlayCounter = 0;
 
-const _mqMap = new Map<string, string>(Object.entries({
-  'screen-xs': '(max-width: 544px)',                               /* smartphone */
-  'screen-sm': '(min-width: 545px) and (max-width: 768px)',        /* tablet (portrait) */
-  'screen-sm-down': '(max-width: 768px)',                          /* smartphone + tablet (portrait) */
-  'screen-sm-up': '(min-width: 545px)',                            /* tablet (portrait) + tablet (landscape) + desktop */
-  'screen-sm-md': '(min-width: 545px) and (max-width: 1024px)',    /* tablet (portrait) + tablet (landscape) */
-  'screen-md': '(min-width: 769px) and (max-width: 1024px)',       /* tablet (landscape) */
-  'screen-md-down': '(max-width: 1024px)',                         /* smartphone + tablet (portrait) + tablet (landscape) */
-  'screen-md-up': '(min-width: 769px)',                            /* tablet (landscape) + desktop */
-  'screen-lg': '(min-width: 1025px)',                              /* desktop */
-  'screen-lg-only': '(min-width: 1025px) and (max-width: 1280px)',
-  'screen-lg-down': '(max-width: 1280px)',
-  'screen-xl': '(min-width: 1281px)',
-}));
+const _mqMap = new Map<string, string>(
+  Object.entries({
+    "screen-xs": "(max-width: 544px)" /* smartphone */,
+    "screen-sm": "(min-width: 545px) and (max-width: 768px)" /* tablet (portrait) */,
+    "screen-sm-down": "(max-width: 768px)" /* smartphone + tablet (portrait) */,
+    "screen-sm-up": "(min-width: 545px)" /* tablet (portrait) + tablet (landscape) + desktop */,
+    "screen-sm-md": "(min-width: 545px) and (max-width: 1024px)" /* tablet (portrait) + tablet (landscape) */,
+    "screen-md": "(min-width: 769px) and (max-width: 1024px)" /* tablet (landscape) */,
+    "screen-md-down": "(max-width: 1024px)" /* smartphone + tablet (portrait) + tablet (landscape) */,
+    "screen-md-up": "(min-width: 769px)" /* tablet (landscape) + desktop */,
+    "screen-lg": "(min-width: 1025px)" /* desktop */,
+    "screen-lg-only": "(min-width: 1025px) and (max-width: 1280px)",
+    "screen-lg-down": "(max-width: 1280px)",
+    "screen-xl": "(min-width: 1281px)",
+  })
+);
 
 // Microsoft Edge rewrites the media queries to whatever it
 // pleases, causing the input and output query to mismatch
@@ -50,17 +52,18 @@ const _mqMapEdge = new Map<string, string>();
  * to remove binding by calling the `remove` method.
  */
 export function on(query: string, callbacks: Callbacks): string {
-  const uuid = Core.getUuid(), queryObject = _getQueryObject(query);
+  const uuid = Core.getUuid(),
+    queryObject = _getQueryObject(query);
 
-  if (typeof callbacks.match === 'function') {
+  if (typeof callbacks.match === "function") {
     queryObject.callbacksMatch.set(uuid, callbacks.match);
   }
 
-  if (typeof callbacks.unmatch === 'function') {
+  if (typeof callbacks.unmatch === "function") {
     queryObject.callbacksUnmatch.set(uuid, callbacks.unmatch);
   }
 
-  if (typeof callbacks.setup === 'function') {
+  if (typeof callbacks.setup === "function") {
     if (queryObject.mql.matches) {
       callbacks.setup();
     } else {
@@ -95,23 +98,23 @@ export function is(query: string): boolean {
 export function scrollDisable(): void {
   if (_scrollDisableCounter === 0) {
     _scrollTop = document.body.scrollTop;
-    _scrollOffsetFrom = 'body';
+    _scrollOffsetFrom = "body";
     if (!_scrollTop) {
       _scrollTop = document.documentElement.scrollTop;
-      _scrollOffsetFrom = 'documentElement';
+      _scrollOffsetFrom = "documentElement";
     }
 
-    const pageContainer = document.getElementById('pageContainer')!;
+    const pageContainer = document.getElementById("pageContainer")!;
 
     // setting translateY causes Mobile Safari to snap
-    if (Environment.platform() === 'ios') {
-      pageContainer.style.setProperty('position', 'relative', '');
-      pageContainer.style.setProperty('top', '-' + _scrollTop + 'px', '');
+    if (Environment.platform() === "ios") {
+      pageContainer.style.setProperty("position", "relative", "");
+      pageContainer.style.setProperty("top", "-" + _scrollTop + "px", "");
     } else {
-      pageContainer.style.setProperty('margin-top', '-' + _scrollTop + 'px', '');
+      pageContainer.style.setProperty("margin-top", "-" + _scrollTop + "px", "");
     }
 
-    document.documentElement.classList.add('disableScrolling');
+    document.documentElement.classList.add("disableScrolling");
   }
 
   _scrollDisableCounter++;
@@ -125,14 +128,14 @@ export function scrollEnable(): void {
     _scrollDisableCounter--;
 
     if (_scrollDisableCounter === 0) {
-      document.documentElement.classList.remove('disableScrolling');
+      document.documentElement.classList.remove("disableScrolling");
 
-      const pageContainer = document.getElementById('pageContainer')!;
-      if (Environment.platform() === 'ios') {
-        pageContainer.style.removeProperty('position');
-        pageContainer.style.removeProperty('top');
+      const pageContainer = document.getElementById("pageContainer")!;
+      if (Environment.platform() === "ios") {
+        pageContainer.style.removeProperty("position");
+        pageContainer.style.removeProperty("top");
       } else {
-        pageContainer.style.removeProperty('margin-top');
+        pageContainer.style.removeProperty("margin-top");
       }
 
       if (_scrollTop) {
@@ -147,7 +150,7 @@ export function scrollEnable(): void {
  */
 export function pageOverlayOpen(): void {
   if (_pageOverlayCounter === 0) {
-    document.documentElement.classList.add('pageOverlayActive');
+    document.documentElement.classList.add("pageOverlayActive");
   }
 
   _pageOverlayCounter++;
@@ -161,7 +164,7 @@ export function pageOverlayClose(): void {
     _pageOverlayCounter--;
 
     if (_pageOverlayCounter === 0) {
-      document.documentElement.classList.remove('pageOverlayActive');
+      document.documentElement.classList.remove("pageOverlayActive");
     }
   }
 }
@@ -185,8 +188,8 @@ export function setDialogContainer(container: Element): void {
 }
 
 function _getQueryObject(query: string): MediaQueryData {
-  if (typeof (query as any) !== 'string' || query.trim() === '') {
-    throw new TypeError('Expected a non-empty string for parameter \'query\'.');
+  if (typeof (query as any) !== "string" || query.trim() === "") {
+    throw new TypeError("Expected a non-empty string for parameter 'query'.");
   }
 
   // Microsoft Edge rewrites the media queries to whatever it
@@ -253,5 +256,5 @@ interface MediaQueryData {
   callbacksMatch: Map<string, Callback>;
   callbacksSetup: Map<string, Callback>;
   callbacksUnmatch: Map<string, Callback>;
-  mql: MediaQueryList
+  mql: MediaQueryList;
 }
index b618d21264c71abb6c07b357420105a0dfe04a67..afee101c23ea43305a23bb19af5184b299806d77 100644 (file)
@@ -7,7 +7,7 @@
  * @module  Ui/Scroll (alias)
  * @module  WoltLabSuite/Core/Ui/Scroll
  */
-import DomUtil from '../Dom/Util';
+import DomUtil from "../Dom/Util";
 
 type Callback = () => void;
 
@@ -28,7 +28,7 @@ function onScroll(): void {
       _callback();
     }
 
-    window.removeEventListener('scroll', onScroll);
+    window.removeEventListener("scroll", onScroll);
     _callback = null;
     _timeoutScroll = null;
   }, 100);
@@ -43,7 +43,7 @@ function onScroll(): void {
 export function element(element: HTMLElement, callback?: Callback): void {
   if (!(element instanceof HTMLElement)) {
     throw new TypeError("Expected a valid DOM element.");
-  } else if (callback !== undefined && typeof callback !== 'function') {
+  } else if (callback !== undefined && typeof callback !== "function") {
     throw new TypeError("Expected a valid callback function.");
   } else if (!document.body.contains(element)) {
     throw new Error("Element must be part of the visible DOM.");
@@ -53,16 +53,16 @@ export function element(element: HTMLElement, callback?: Callback): void {
 
   if (callback) {
     _callback = callback;
-    window.addEventListener('scroll', onScroll);
+    window.addEventListener("scroll", onScroll);
   }
 
   let y = DomUtil.offset(element).top;
   if (_offset === null) {
     _offset = 50;
-    const pageHeader = document.getElementById('pageHeaderPanel');
+    const pageHeader = document.getElementById("pageHeaderPanel");
     if (pageHeader !== null) {
       const position = window.getComputedStyle(pageHeader).position;
-      if (position === 'fixed' || position === 'static') {
+      if (position === "fixed" || position === "static") {
         _offset = pageHeader.offsetHeight;
       } else {
         _offset = 0;
@@ -83,7 +83,7 @@ export function element(element: HTMLElement, callback?: Callback): void {
   window.scrollTo({
     left: 0,
     top: y,
-    behavior: 'smooth',
+    behavior: "smooth",
   });
 
   window.setTimeout(() => {
index fba749a8a0c175ae183bce96b1b43be2eaa9b159..dc0d30933326045c76e7bd5895b8bead67dc1c59 100644 (file)
@@ -1,8 +1,8 @@
-import { DatabaseObjectActionPayload } from '../../Ajax/Data';
+import { DatabaseObjectActionPayload } from "../../Ajax/Data";
 
-export type CallbackDropdownInit = (list: HTMLUListElement) => void
+export type CallbackDropdownInit = (list: HTMLUListElement) => void;
 
-export type CallbackSelect = (item: HTMLElement) => boolean
+export type CallbackSelect = (item: HTMLElement) => boolean;
 
 export interface SearchInputOptions {
   ajax?: Partial<DatabaseObjectActionPayload>;
index 7f6619a840f5882254bdabcfacdd9b629c6ca200..d92d2a23214e82227a73e9e20178d48f1595936b 100644 (file)
@@ -7,13 +7,13 @@
  * @module  WoltLabSuite/Core/Ui/Search/Input
  */
 
-import * as Ajax from '../../Ajax';
-import * as Core from '../../Core';
-import DomUtil from '../../Dom/Util';
-import UiDropdownSimple from '../Dropdown/Simple';
-import { DatabaseObjectActionPayload, DatabaseObjectActionResponse } from '../../Ajax/Data';
-import AjaxRequest from '../../Ajax/Request';
-import { CallbackDropdownInit, CallbackSelect, SearchInputOptions } from './Data';
+import * as Ajax from "../../Ajax";
+import * as Core from "../../Core";
+import DomUtil from "../../Dom/Util";
+import UiDropdownSimple from "../Dropdown/Simple";
+import { DatabaseObjectActionPayload, DatabaseObjectActionResponse } from "../../Ajax/Data";
+import AjaxRequest from "../../Ajax/Request";
+import { CallbackDropdownInit, CallbackSelect, SearchInputOptions } from "./Data";
 
 class UiSearchInput {
   private activeItem?: HTMLLIElement = undefined;
@@ -22,11 +22,11 @@ class UiSearchInput {
   private readonly callbackDropdownInit?: CallbackDropdownInit = undefined;
   private readonly callbackSelect?: CallbackSelect = undefined;
   private readonly delay: number;
-  private dropdownContainerId = '';
+  private dropdownContainerId = "";
   private readonly element: HTMLInputElement;
   private readonly excludedSearchValues = new Set<string>();
   private list?: HTMLUListElement = undefined;
-  private lastValue = '';
+  private lastValue = "";
   private readonly minLength: number;
   private readonly noResultPlaceholder: string;
   private readonly preventSubmit: boolean;
@@ -43,32 +43,35 @@ class UiSearchInput {
     this.element = element;
     if (!(this.element instanceof HTMLInputElement)) {
       throw new TypeError("Expected a valid DOM element.");
-    } else if (this.element.nodeName !== 'INPUT' || (this.element.type !== 'search' && this.element.type !== 'text')) {
+    } else if (this.element.nodeName !== "INPUT" || (this.element.type !== "search" && this.element.type !== "text")) {
       throw new Error('Expected an input[type="text"].');
     }
 
-    options = Core.extend({
-      ajax: {
-        actionName: 'getSearchResultList',
-        className: '',
-        interfaceName: 'wcf\\data\\ISearchAction',
+    options = Core.extend(
+      {
+        ajax: {
+          actionName: "getSearchResultList",
+          className: "",
+          interfaceName: "wcf\\data\\ISearchAction",
+        },
+        autoFocus: true,
+        callbackDropdownInit: undefined,
+        callbackSelect: undefined,
+        delay: 500,
+        excludedSearchValues: [],
+        minLength: 3,
+        noResultPlaceholder: "",
+        preventSubmit: false,
       },
-      autoFocus: true,
-      callbackDropdownInit: undefined,
-      callbackSelect: undefined,
-      delay: 500,
-      excludedSearchValues: [],
-      minLength: 3,
-      noResultPlaceholder: '',
-      preventSubmit: false,
-    }, options) as SearchInputOptions;
+      options
+    ) as SearchInputOptions;
 
     this.ajaxPayload = options.ajax as DatabaseObjectActionPayload;
     this.autoFocus = options.autoFocus!;
     this.callbackDropdownInit = options.callbackDropdownInit;
     this.callbackSelect = options.callbackSelect;
     this.delay = options.delay!;
-    options.excludedSearchValues!.forEach(value => {
+    options.excludedSearchValues!.forEach((value) => {
       this.addExcludedSearchValues(value);
     });
     this.minLength = options.minLength!;
@@ -76,10 +79,10 @@ class UiSearchInput {
     this.preventSubmit = options.preventSubmit!;
 
     // Disable auto-complete because it collides with the suggestion dropdown.
-    this.element.autocomplete = 'off';
+    this.element.autocomplete = "off";
 
-    this.element.addEventListener('keydown', (ev) => this.keydown(ev));
-    this.element.addEventListener('keyup', (ev) => this.keyup(ev));
+    this.element.addEventListener("keydown", (ev) => this.keydown(ev));
+    this.element.addEventListener("keyup", (ev) => this.keyup(ev));
   }
 
   /**
@@ -101,12 +104,12 @@ class UiSearchInput {
    */
   private keydown(event: KeyboardEvent): void {
     if ((this.activeItem !== null && UiDropdownSimple.isOpen(this.dropdownContainerId)) || this.preventSubmit) {
-      if (event.key === 'Enter') {
+      if (event.key === "Enter") {
         event.preventDefault();
       }
     }
 
-    if (['ArrowUp', 'ArrowDown', 'Escape'].includes(event.key)) {
+    if (["ArrowUp", "ArrowDown", "Escape"].includes(event.key)) {
       event.preventDefault();
     }
   }
@@ -118,15 +121,15 @@ class UiSearchInput {
     // handle dropdown keyboard navigation
     if (this.activeItem !== null || !this.autoFocus) {
       if (UiDropdownSimple.isOpen(this.dropdownContainerId)) {
-        if (event.key === 'ArrowUp') {
+        if (event.key === "ArrowUp") {
           event.preventDefault();
 
           return this.keyboardPreviousItem();
-        } else if (event.key === 'ArrowDown') {
+        } else if (event.key === "ArrowDown") {
           event.preventDefault();
 
           return this.keyboardNextItem();
-        } else if (event.key === 'Enter') {
+        } else if (event.key === "Enter") {
           event.preventDefault();
 
           return this.keyboardSelectItem();
@@ -137,7 +140,7 @@ class UiSearchInput {
     }
 
     // close list on escape
-    if (event.key === 'Escape') {
+    if (event.key === "Escape") {
       UiDropdownSimple.close(this.dropdownContainerId);
 
       return;
@@ -207,15 +210,15 @@ class UiSearchInput {
     let nextItem: HTMLLIElement | undefined = undefined;
 
     if (this.activeItem) {
-      this.activeItem.classList.remove('active');
+      this.activeItem.classList.remove("active");
 
       if (this.activeItem.nextElementSibling) {
         nextItem = this.activeItem.nextElementSibling as HTMLLIElement;
       }
     }
 
-    this.activeItem = nextItem || this.list!.children[0] as HTMLLIElement;
-    this.activeItem.classList.add('active');
+    this.activeItem = nextItem || (this.list!.children[0] as HTMLLIElement);
+    this.activeItem.classList.add("active");
   }
 
   /**
@@ -225,15 +228,15 @@ class UiSearchInput {
     let nextItem: HTMLLIElement | undefined = undefined;
 
     if (this.activeItem) {
-      this.activeItem.classList.remove('active');
+      this.activeItem.classList.remove("active");
 
       if (this.activeItem.previousElementSibling) {
         nextItem = this.activeItem.previousElementSibling as HTMLLIElement;
       }
     }
 
-    this.activeItem = nextItem || this.list!.children[this.list!.childElementCount - 1] as HTMLLIElement;
-    this.activeItem.classList.add('active');
+    this.activeItem = nextItem || (this.list!.children[this.list!.childElementCount - 1] as HTMLLIElement);
+    this.activeItem.classList.add("active");
   }
 
   /**
@@ -255,9 +258,9 @@ class UiSearchInput {
    */
   private selectItem(item: HTMLLIElement): void {
     if (this.callbackSelect && !this.callbackSelect(item)) {
-      this.element.value = '';
+      this.element.value = "";
     } else {
-      this.element.value = item.dataset.label || '';
+      this.element.value = item.dataset.label || "";
     }
 
     this.activeItem = undefined;
@@ -270,27 +273,27 @@ class UiSearchInput {
   _ajaxSuccess(data: DatabaseObjectActionResponse): void {
     let createdList = false;
     if (!this.list) {
-      this.list = document.createElement('ul');
-      this.list.className = 'dropdownMenu';
+      this.list = document.createElement("ul");
+      this.list.className = "dropdownMenu";
 
       createdList = true;
 
-      if (typeof this.callbackDropdownInit === 'function') {
+      if (typeof this.callbackDropdownInit === "function") {
         this.callbackDropdownInit(this.list);
       }
     } else {
       // reset current list
-      this.list.innerHTML = '';
+      this.list.innerHTML = "";
     }
 
-    if (typeof data.returnValues === 'object') {
+    if (typeof data.returnValues === "object") {
       const callbackClick = this.clickSelectItem.bind(this);
       let listItem;
 
-      Object.keys(data.returnValues).forEach(key => {
+      Object.keys(data.returnValues).forEach((key) => {
         listItem = this.createListItem(data.returnValues[key]);
 
-        listItem.addEventListener('click', callbackClick);
+        listItem.addEventListener("click", callbackClick);
         this.list!.appendChild(listItem);
       });
     }
@@ -312,10 +315,10 @@ class UiSearchInput {
         UiDropdownSimple.open(this.dropdownContainerId, true);
 
         // mark first item as active
-        const firstChild = this.list.childElementCount ? this.list.children[0] as HTMLLIElement : undefined;
-        if (this.autoFocus && firstChild && ~~(firstChild.dataset.objectId || '')) {
+        const firstChild = this.list.childElementCount ? (this.list.children[0] as HTMLLIElement) : undefined;
+        if (this.autoFocus && firstChild && ~~(firstChild.dataset.objectId || "")) {
           this.activeItem = firstChild;
-          this.activeItem.classList.add('active');
+          this.activeItem.classList.add("active");
         }
       }
     }
@@ -329,10 +332,10 @@ class UiSearchInput {
       return false;
     }
 
-    const listItem = document.createElement('li');
-    listItem.className = 'dropdownText';
+    const listItem = document.createElement("li");
+    listItem.className = "dropdownText";
 
-    const span = document.createElement('span');
+    const span = document.createElement("span");
     span.textContent = this.noResultPlaceholder;
     listItem.appendChild(span);
 
@@ -345,11 +348,11 @@ class UiSearchInput {
    * Creates an list item from response data.
    */
   protected createListItem(item: ListItemData): HTMLLIElement {
-    const listItem = document.createElement('li');
+    const listItem = document.createElement("li");
     listItem.dataset.objectId = item.objectID.toString();
     listItem.dataset.label = item.label;
 
-    const span = document.createElement('span');
+    const span = document.createElement("span");
     span.textContent = item.label;
     listItem.appendChild(span);
 
@@ -363,7 +366,7 @@ class UiSearchInput {
   }
 }
 
-export = UiSearchInput
+export = UiSearchInput;
 
 interface ListItemData {
   label: string;
index 41a95974b66e6c5b37f28d8d27d80dc355273afe..8f06c2da2c73f58a20359ff49014cf1206e23319 100644 (file)
@@ -1,87 +1,93 @@
-import * as Core from '../../Core';
-import * as DomTraverse from '../../Dom/Traverse';
-import DomUtil from '../../Dom/Util';
-import UiDropdownSimple from '../Dropdown/Simple';
-import * as UiScreen from '../Screen';
-import UiSearchInput from './Input';
+import * as Core from "../../Core";
+import * as DomTraverse from "../../Dom/Traverse";
+import DomUtil from "../../Dom/Util";
+import UiDropdownSimple from "../Dropdown/Simple";
+import * as UiScreen from "../Screen";
+import UiSearchInput from "./Input";
 
 function click(event: MouseEvent): void {
   event.preventDefault();
 
-  const pageHeader = document.getElementById('pageHeader') as HTMLElement;
-  pageHeader.classList.add('searchBarForceOpen');
+  const pageHeader = document.getElementById("pageHeader") as HTMLElement;
+  pageHeader.classList.add("searchBarForceOpen");
   window.setTimeout(() => {
-    pageHeader.classList.remove('searchBarForceOpen');
+    pageHeader.classList.remove("searchBarForceOpen");
   }, 10);
 
   const target = event.currentTarget as HTMLElement;
   const objectType = target.dataset.objectType;
 
-  const container = document.getElementById('pageHeaderSearchParameters') as HTMLElement;
-  container.innerHTML = '';
+  const container = document.getElementById("pageHeaderSearchParameters") as HTMLElement;
+  container.innerHTML = "";
 
   const extendedLink = target.dataset.extendedLink;
   if (extendedLink) {
-    const link = document.querySelector('.pageHeaderSearchExtendedLink') as HTMLAnchorElement;
+    const link = document.querySelector(".pageHeaderSearchExtendedLink") as HTMLAnchorElement;
     link.href = extendedLink;
   }
 
   const parameters = new Map<string, string>();
   try {
-    const data = JSON.parse(target.dataset.parameters || '');
+    const data = JSON.parse(target.dataset.parameters || "");
     if (Core.isPlainObject(data)) {
-      Object.keys(data).forEach(key => {
+      Object.keys(data).forEach((key) => {
         parameters.set(key, data[key]);
       });
     }
-  } catch (e) {
-  }
+  } catch (e) {}
 
   if (objectType) {
-    parameters.set('types[]', objectType);
+    parameters.set("types[]", objectType);
   }
 
   parameters.forEach((value, key) => {
-    const input = document.createElement('input');
-    input.type = 'hidden';
+    const input = document.createElement("input");
+    input.type = "hidden";
     input.name = key;
     input.value = value;
     container.appendChild(input);
   });
 
   // update label
-  const inputContainer = document.getElementById('pageHeaderSearchInputContainer') as HTMLElement;
-  const button = inputContainer.querySelector('.pageHeaderSearchType > .button > .pageHeaderSearchTypeLabel') as HTMLElement;
+  const inputContainer = document.getElementById("pageHeaderSearchInputContainer") as HTMLElement;
+  const button = inputContainer.querySelector(
+    ".pageHeaderSearchType > .button > .pageHeaderSearchTypeLabel"
+  ) as HTMLElement;
   button.textContent = target.textContent;
 }
 
 export function init(objectType: string): void {
-  const searchInput = document.getElementById('pageHeaderSearchInput') as HTMLInputElement;
+  const searchInput = document.getElementById("pageHeaderSearchInput") as HTMLInputElement;
 
   new UiSearchInput(searchInput, {
     ajax: {
-      className: 'wcf\\data\\search\\keyword\\SearchKeywordAction',
+      className: "wcf\\data\\search\\keyword\\SearchKeywordAction",
     },
     autoFocus: false,
     callbackDropdownInit(dropdownMenu) {
-      dropdownMenu.classList.add('dropdownMenuPageSearch');
+      dropdownMenu.classList.add("dropdownMenuPageSearch");
 
-      if (UiScreen.is('screen-lg')) {
-        dropdownMenu.dataset.dropdownAlignmentHorizontal = 'right';
+      if (UiScreen.is("screen-lg")) {
+        dropdownMenu.dataset.dropdownAlignmentHorizontal = "right";
 
         const minWidth = searchInput.clientWidth;
-        dropdownMenu.style.setProperty('min-width', minWidth + 'px', '');
+        dropdownMenu.style.setProperty("min-width", minWidth + "px", "");
 
         // calculate offset to ignore the width caused by the submit button
         const parent = searchInput.parentElement!;
-        const offsetRight = (DomUtil.offset(parent).left + parent.clientWidth) - (DomUtil.offset(searchInput).left + minWidth);
-        const offsetTop = DomUtil.styleAsInt(window.getComputedStyle(parent), 'padding-bottom');
-        dropdownMenu.style.setProperty('transform', 'translateX(-' + Math.ceil(offsetRight) + 'px) translateY(-' + offsetTop + 'px)', '');
+        const offsetRight =
+          DomUtil.offset(parent).left + parent.clientWidth - (DomUtil.offset(searchInput).left + minWidth);
+        const offsetTop = DomUtil.styleAsInt(window.getComputedStyle(parent), "padding-bottom");
+        dropdownMenu.style.setProperty(
+          "transform",
+          "translateX(-" + Math.ceil(offsetRight) + "px) translateY(-" + offsetTop + "px)",
+          ""
+        );
       }
     },
     callbackSelect() {
       setTimeout(() => {
-        const form = DomTraverse.parentByTag(searchInput, 'FORM') as HTMLFormElement;
+        const form = DomTraverse.parentByTag(searchInput, "FORM") as HTMLFormElement;
         form.submit();
       }, 1);
 
@@ -89,15 +95,13 @@ export function init(objectType: string): void {
     },
   });
 
-  const searchType = document.querySelector('.pageHeaderSearchType') as HTMLElement;
+  const searchType = document.querySelector(".pageHeaderSearchType") as HTMLElement;
   const dropdownMenu = UiDropdownSimple.getDropdownMenu(DomUtil.identify(searchType))!;
-  dropdownMenu.querySelectorAll('a[data-object-type]').forEach(link => {
-    link.addEventListener('click', click);
+  dropdownMenu.querySelectorAll("a[data-object-type]").forEach((link) => {
+    link.addEventListener("click", click);
   });
 
   // trigger click on init
   const link = dropdownMenu.querySelector('a[data-object-type="' + objectType + '"]') as HTMLAnchorElement;
   link.click();
 }
-
-  
index e3fe5593b948647559ebf0a2c9a89f34e3857c94..c92b578b2c42966b18b1424ddf3945875d5300af 100644 (file)
@@ -7,7 +7,7 @@
  * @module      WoltLabSuite/Core/Ui/Smiley/Insert
  */
 
-import * as EventHandler from '../../Event/Handler';
+import * as EventHandler from "../../Event/Handler";
 
 class UiSmileyInsert {
   private readonly container: HTMLElement;
@@ -16,40 +16,40 @@ class UiSmileyInsert {
   constructor(editorId: string) {
     this.editorId = editorId;
 
-    let container = document.getElementById('smilies-' + this.editorId);
+    let container = document.getElementById("smilies-" + this.editorId);
     if (!container) {
       // form builder
-      container = document.getElementById(this.editorId + 'SmiliesTabContainer');
+      container = document.getElementById(this.editorId + "SmiliesTabContainer");
       if (!container) {
-        throw new Error('Unable to find the message tab menu container containing the smilies.');
+        throw new Error("Unable to find the message tab menu container containing the smilies.");
       }
     }
 
     this.container = container;
 
-    this.container.addEventListener('keydown', (ev) => this.keydown(ev));
-    this.container.addEventListener('mousedown', (ev) => this.mousedown(ev));
+    this.container.addEventListener("keydown", (ev) => this.keydown(ev));
+    this.container.addEventListener("mousedown", (ev) => this.mousedown(ev));
   }
 
   keydown(event: KeyboardEvent): void {
     const activeButton = document.activeElement as HTMLAnchorElement;
-    if (!activeButton.classList.contains('jsSmiley')) {
+    if (!activeButton.classList.contains("jsSmiley")) {
       return;
     }
 
-    if (['ArrowLeft', 'ArrowRight', 'End', 'Home'].includes(event.key)) {
+    if (["ArrowLeft", "ArrowRight", "End", "Home"].includes(event.key)) {
       event.preventDefault();
 
       const target = event.currentTarget as HTMLAnchorElement;
-      const smilies: HTMLAnchorElement[] = Array.from(target.querySelectorAll('.jsSmiley'));
-      if (event.key === 'ArrowLeft') {
+      const smilies: HTMLAnchorElement[] = Array.from(target.querySelectorAll(".jsSmiley"));
+      if (event.key === "ArrowLeft") {
         smilies.reverse();
       }
 
       let index = smilies.indexOf(activeButton);
-      if (event.key === 'Home') {
+      if (event.key === "Home") {
         index = 0;
-      } else if (event.key === 'End') {
+      } else if (event.key === "End") {
         index = smilies.length - 1;
       } else {
         index = index + 1;
@@ -59,10 +59,10 @@ class UiSmileyInsert {
       }
 
       smilies[index].focus();
-    } else if (event.key === 'Enter' || event.key === 'Space') {
+    } else if (event.key === "Enter" || event.key === "Space") {
       event.preventDefault();
 
-      const image = activeButton.querySelector('img') as HTMLImageElement;
+      const image = activeButton.querySelector("img") as HTMLImageElement;
       this.insert(image);
     }
   }
@@ -71,11 +71,11 @@ class UiSmileyInsert {
     const target = event.target as HTMLElement;
 
     // Clicks may occur on a few different elements, but we are only looking for the image.
-    const listItem = target.closest('li');
+    const listItem = target.closest("li");
     if (listItem && this.container.contains(listItem)) {
       event.preventDefault();
 
-      const img = listItem.querySelector('img');
+      const img = listItem.querySelector("img");
       if (img) {
         this.insert(img);
       }
@@ -83,10 +83,10 @@ class UiSmileyInsert {
   }
 
   insert(img: HTMLImageElement): void {
-    EventHandler.fire('com.woltlab.wcf.redactor2', 'insertSmiley_' + this.editorId, {
+    EventHandler.fire("com.woltlab.wcf.redactor2", "insertSmiley_" + this.editorId, {
       img,
     });
   }
 }
 
-export = UiSmileyInsert
+export = UiSmileyInsert;
index 2667e22c2f03a196b4219185fcaec26f0d5f2cb9..a1e9752ae0033e00da54adf61fdee7b3cdc95232 100644 (file)
@@ -7,15 +7,15 @@
  * @module  WoltLabSuite/Core/Ui/Suggestion
  */
 
-import * as Ajax from '../Ajax';
-import * as Core from '../Core';
+import * as Ajax from "../Ajax";
+import * as Core from "../Core";
 import {
   AjaxCallbackObject,
   DatabaseObjectActionPayload,
   DatabaseObjectActionResponse,
   RequestPayload,
-} from '../Ajax/Data';
-import UiDropdownSimple from './Dropdown/Simple';
+} from "../Ajax/Data";
+import UiDropdownSimple from "./Dropdown/Simple";
 
 class UiSuggestion implements AjaxCallbackObject {
   private readonly ajaxPayload: DatabaseObjectActionPayload;
@@ -24,7 +24,7 @@ class UiSuggestion implements AjaxCallbackObject {
   private readonly excludedSearchValues: Set<string>;
   private readonly element: HTMLElement;
   private readonly threshold: number;
-  private value = '';
+  private value = "";
 
   /**
    * Initializes a new suggestion input.
@@ -37,26 +37,31 @@ class UiSuggestion implements AjaxCallbackObject {
 
     this.element = element;
 
-    this.ajaxPayload = Core.extend({
-      actionName: 'getSearchResultList',
-      className: '',
-      interfaceName: 'wcf\\data\\ISearchAction',
-      parameters: {
-        data: {},
+    this.ajaxPayload = Core.extend(
+      {
+        actionName: "getSearchResultList",
+        className: "",
+        interfaceName: "wcf\\data\\ISearchAction",
+        parameters: {
+          data: {},
+        },
       },
-    }, options.ajax) as DatabaseObjectActionPayload;
+      options.ajax
+    ) as DatabaseObjectActionPayload;
 
-    if (typeof options.callbackSelect !== 'function') {
+    if (typeof options.callbackSelect !== "function") {
       throw new Error("Expected a valid callback for option 'callbackSelect'.");
     }
     this.callbackSelect = options.callbackSelect;
 
-    this.excludedSearchValues = new Set(Array.isArray(options.excludedSearchValues) ? options.excludedSearchValues : []);
+    this.excludedSearchValues = new Set(
+      Array.isArray(options.excludedSearchValues) ? options.excludedSearchValues : []
+    );
     this.threshold = options.threshold === undefined ? 3 : options.threshold;
 
-    this.element.addEventListener('click', (ev) => ev.preventDefault());
-    this.element.addEventListener('keydown', (ev) => this.keyDown(ev));
-    this.element.addEventListener('keyup', (ev) => this.keyUp(ev));
+    this.element.addEventListener("click", (ev) => ev.preventDefault());
+    this.element.addEventListener("keydown", (ev) => this.keyDown(ev));
+    this.element.addEventListener("keyup", (ev) => this.keyUp(ev));
   }
 
   /**
@@ -88,24 +93,25 @@ class UiSuggestion implements AjaxCallbackObject {
       return true;
     }
 
-    if (['ArrowDown', 'ArrowUp', 'Enter', 'Escape'].indexOf(event.key) === -1) {
+    if (["ArrowDown", "ArrowUp", "Enter", "Escape"].indexOf(event.key) === -1) {
       return true;
     }
 
     let active!: HTMLElement;
-    let i = 0, length = this.dropdownMenu!.childElementCount;
+    let i = 0,
+      length = this.dropdownMenu!.childElementCount;
     while (i < length) {
       active = this.dropdownMenu!.children[i] as HTMLElement;
-      if (active.classList.contains('active')) {
+      if (active.classList.contains("active")) {
         break;
       }
       i++;
     }
 
-    if (event.key === 'Enter') {
+    if (event.key === "Enter") {
       UiDropdownSimple.close(this.element.id);
       this.select(undefined, active);
-    } else if (event.key === 'Escape') {
+    } else if (event.key === "Escape") {
       if (UiDropdownSimple.isOpen(this.element.id)) {
         UiDropdownSimple.close(this.element.id);
       } else {
@@ -114,16 +120,15 @@ class UiSuggestion implements AjaxCallbackObject {
       }
     } else {
       let index = 0;
-      if (event.key === 'ArrowUp') {
-        index = ((i === 0) ? length : i) - 1;
-      } else if (event.key === 'ArrowDown') {
+      if (event.key === "ArrowUp") {
+        index = (i === 0 ? length : i) - 1;
+      } else if (event.key === "ArrowDown") {
         index = i + 1;
-        if (index === length)
-          index = 0;
+        if (index === length) index = 0;
       }
       if (index !== i) {
-        active.classList.remove('active');
-        this.dropdownMenu!.children[index].classList.add('active');
+        active.classList.remove("active");
+        this.dropdownMenu!.children[index].classList.add("active");
       }
     }
 
@@ -145,8 +150,8 @@ class UiSuggestion implements AjaxCallbackObject {
     const anchor = item!.children[0] as HTMLElement;
     this.callbackSelect(this.element.id, {
       objectId: +(anchor.dataset.objectId || 0),
-      value: item!.textContent || '',
-      type: anchor.dataset.type || '',
+      value: item!.textContent || "",
+      type: anchor.dataset.type || "",
     });
 
     if (event instanceof MouseEvent) {
@@ -193,19 +198,19 @@ class UiSuggestion implements AjaxCallbackObject {
    */
   _ajaxSuccess(data: DatabaseObjectActionResponse): void {
     if (this.dropdownMenu === null) {
-      this.dropdownMenu = document.createElement('div');
-      this.dropdownMenu.className = 'dropdownMenu';
+      this.dropdownMenu = document.createElement("div");
+      this.dropdownMenu.className = "dropdownMenu";
       UiDropdownSimple.initFragment(this.element, this.dropdownMenu);
     } else {
-      this.dropdownMenu.innerHTML = '';
+      this.dropdownMenu.innerHTML = "";
     }
 
     if (Array.isArray(data.returnValues)) {
       data.returnValues.forEach((item, index) => {
-        const anchor = document.createElement('a');
+        const anchor = document.createElement("a");
         if (item.icon) {
-          anchor.className = 'box16';
-          anchor.innerHTML = item.icon + ' <span></span>';
+          anchor.className = "box16";
+          anchor.innerHTML = item.icon + " <span></span>";
           anchor.children[1].textContent = item.label;
         } else {
           anchor.textContent = item.label;
@@ -215,11 +220,11 @@ class UiSuggestion implements AjaxCallbackObject {
         if (item.type) {
           anchor.dataset.type = item.type;
         }
-        anchor.addEventListener('click', (ev) => this.select(ev));
+        anchor.addEventListener("click", (ev) => this.select(ev));
 
-        const listItem = document.createElement('li');
+        const listItem = document.createElement("li");
         if (index === 0) {
-          listItem.className = 'active';
+          listItem.className = "active";
         }
         listItem.appendChild(anchor);
         this.dropdownMenu!.appendChild(listItem);
@@ -232,7 +237,7 @@ class UiSuggestion implements AjaxCallbackObject {
   }
 }
 
-export = UiSuggestion
+export = UiSuggestion;
 
 interface CallbackSelectData {
   objectId: number;
index 9f0f67a3366dccc11fb4dcd85177ff7e0d9b700a..13076595ebf8e7f3c27c4b819a3492fc91753b30 100644 (file)
@@ -8,12 +8,12 @@
  * @module  WoltLabSuite/Core/Ui/TabMenu
  */
 
-import DomChangeListener from '../Dom/Change/Listener';
-import DomUtil from '../Dom/Util';
-import TabMenuSimple from './TabMenu/Simple';
-import UiCloseOverlay from './CloseOverlay';
-import * as UiScreen from './Screen';
-import * as UiScroll from './Scroll';
+import DomChangeListener from "../Dom/Change/Listener";
+import DomUtil from "../Dom/Util";
+import TabMenuSimple from "./TabMenu/Simple";
+import UiCloseOverlay from "./CloseOverlay";
+import * as UiScreen from "./Screen";
+import * as UiScroll from "./Scroll";
 
 let _activeList: HTMLUListElement | null = null;
 let _enableTabScroll = false;
@@ -23,7 +23,7 @@ const _tabMenus = new Map<string, TabMenuSimple>();
  * Initializes available tab menus.
  */
 function init() {
-  document.querySelectorAll('.tabMenuContainer:not(.staticTabMenuContainer)').forEach(container => {
+  document.querySelectorAll(".tabMenuContainer:not(.staticTabMenuContainer)").forEach((container) => {
     const containerId = DomUtil.identify(container);
     if (_tabMenus.has(containerId)) {
       return;
@@ -45,21 +45,21 @@ function init() {
       }
     }
 
-    const list = document.querySelector('#' + containerId + ' > nav > ul') as HTMLUListElement;
-    list.addEventListener('click', event => {
+    const list = document.querySelector("#" + containerId + " > nav > ul") as HTMLUListElement;
+    list.addEventListener("click", (event) => {
       event.preventDefault();
       event.stopPropagation();
       if (event.target === list) {
-        list.classList.add('active');
+        list.classList.add("active");
         _activeList = list;
       } else {
-        list.classList.remove('active');
+        list.classList.remove("active");
         _activeList = null;
       }
     });
 
     // bind scroll listener
-    container.querySelectorAll('.tabMenu, .menu').forEach(menu => {
+    container.querySelectorAll(".tabMenu, .menu").forEach((menu) => {
       function callback() {
         timeout = null;
 
@@ -67,14 +67,18 @@ function init() {
       }
 
       let timeout: number | null = null;
-      menu.querySelector('ul')!.addEventListener('scroll', () => {
-        if (timeout !== null) {
-          window.clearTimeout(timeout);
-        }
+      menu.querySelector("ul")!.addEventListener(
+        "scroll",
+        () => {
+          if (timeout !== null) {
+            window.clearTimeout(timeout);
+          }
 
-        // slight delay to avoid calling this function too often
-        timeout = window.setTimeout(callback, 10);
-      }, {passive: true});
+          // slight delay to avoid calling this function too often
+          timeout = window.setTimeout(callback, 10);
+        },
+        { passive: true }
+      );
     });
 
     // The validation of input fields, e.g. [required], yields strange results when
@@ -82,23 +86,23 @@ function init() {
     // to not work and a warning is displayed on the console. We can work around this
     // by manually checking if the input fields validate on submit and display the
     // parent tab ourselves.
-    const form = container.closest('form');
+    const form = container.closest("form");
     if (form !== null) {
       const submitButton = form.querySelector('input[type="submit"]');
       if (submitButton !== null) {
-        submitButton.addEventListener('click', event => {
+        submitButton.addEventListener("click", (event) => {
           if (event.defaultPrevented) {
             return;
           }
 
-          container.querySelectorAll('input, select').forEach((element: HTMLInputElement | HTMLSelectElement) => {
+          container.querySelectorAll("input, select").forEach((element: HTMLInputElement | HTMLSelectElement) => {
             if (!element.checkValidity()) {
               event.preventDefault();
 
               // Select the tab that contains the erroneous element.
-              const tabMenu = getTabMenu(element.closest('.tabMenuContainer')!.id)!;
-              const tabMenuContent = element.closest('.tabMenuContent') as HTMLElement;
-              tabMenu.select(tabMenuContent.dataset.name || '');
+              const tabMenu = getTabMenu(element.closest(".tabMenuContainer")!.id)!;
+              const tabMenuContent = element.closest(".tabMenuContent") as HTMLElement;
+              tabMenu.select(tabMenuContent.dataset.name || "");
               UiScroll.element(element, () => {
                 element.reportValidity();
               });
@@ -116,10 +120,10 @@ function init() {
  * Selects the first tab containing an element with class `formError`.
  */
 function selectErroneousTabs(): void {
-  _tabMenus.forEach(tabMenu => {
+  _tabMenus.forEach((tabMenu) => {
     let foundError = false;
-    tabMenu.getContainers().forEach(container => {
-      if (!foundError && container.querySelector('.formError') !== null) {
+    tabMenu.getContainers().forEach((container) => {
+      if (!foundError && container.querySelector(".formError") !== null) {
         foundError = true;
         tabMenu.select(container.id);
       }
@@ -129,10 +133,10 @@ function selectErroneousTabs(): void {
 
 function scrollEnable(isSetup) {
   _enableTabScroll = true;
-  _tabMenus.forEach(tabMenu => {
+  _tabMenus.forEach((tabMenu) => {
     const activeTab = tabMenu.getActiveTab();
     if (isSetup) {
-      rebuildMenuOverflow(activeTab.closest('.menu, .tabMenu'));
+      rebuildMenuOverflow(activeTab.closest(".menu, .tabMenu"));
     } else {
       scrollToTab(activeTab);
     }
@@ -162,20 +166,20 @@ function scrollMenu(list, left, scrollLeft, scrollWidth, width, paddingRight) {
     return;
   }
 
-  list.classList.add('enableAnimation');
+  list.classList.add("enableAnimation");
 
   // new value is larger, we're scrolling towards the end
   if (scrollLeft < left) {
-    list.firstElementChild.style.setProperty('margin-left', (scrollLeft - left) + 'px', '');
+    list.firstElementChild.style.setProperty("margin-left", scrollLeft - left + "px", "");
   } else {
     // new value is smaller, we're scrolling towards the start
-    list.style.setProperty('padding-left', (scrollLeft - left) + 'px', '');
+    list.style.setProperty("padding-left", scrollLeft - left + "px", "");
   }
 
   setTimeout(() => {
-    list.classList.remove('enableAnimation');
-    list.firstElementChild.style.removeProperty('margin-left');
-    list.style.removeProperty('padding-left');
+    list.classList.remove("enableAnimation");
+    list.firstElementChild.style.removeProperty("margin-left");
+    list.style.removeProperty("padding-left");
     list.scrollLeft = left;
   }, 300);
 }
@@ -186,48 +190,47 @@ function rebuildMenuOverflow(menu) {
   }
 
   const width = menu.clientWidth;
-  const list = menu.querySelector('ul') as HTMLElement;
+  const list = menu.querySelector("ul") as HTMLElement;
   const scrollLeft = list.scrollLeft;
   const scrollWidth = list.scrollWidth;
-  const overflowLeft = (scrollLeft > 0);
+  const overflowLeft = scrollLeft > 0;
 
-  let overlayLeft = menu.querySelector('.tabMenuOverlayLeft');
+  let overlayLeft = menu.querySelector(".tabMenuOverlayLeft");
   if (overflowLeft) {
     if (overlayLeft === null) {
-      overlayLeft = document.createElement('span');
-      overlayLeft.className = 'tabMenuOverlayLeft icon icon24 fa-angle-left';
-      overlayLeft.addEventListener('click', () => {
+      overlayLeft = document.createElement("span");
+      overlayLeft.className = "tabMenuOverlayLeft icon icon24 fa-angle-left";
+      overlayLeft.addEventListener("click", () => {
         const listWidth = list.clientWidth;
         scrollMenu(list, list.scrollLeft - ~~(listWidth / 2), list.scrollLeft, list.scrollWidth, listWidth, 0);
       });
       menu.insertBefore(overlayLeft, menu.firstChild);
     }
 
-    overlayLeft.classList.add('active');
+    overlayLeft.classList.add("active");
   } else if (overlayLeft !== null) {
-    overlayLeft.classList.remove('active');
+    overlayLeft.classList.remove("active");
   }
 
-  const overflowRight = (width + scrollLeft < scrollWidth);
-  let overlayRight = menu.querySelector('.tabMenuOverlayRight');
+  const overflowRight = width + scrollLeft < scrollWidth;
+  let overlayRight = menu.querySelector(".tabMenuOverlayRight");
   if (overflowRight) {
     if (overlayRight === null) {
-      overlayRight = document.createElement('span');
-      overlayRight.className = 'tabMenuOverlayRight icon icon24 fa-angle-right';
-      overlayRight.addEventListener('click', () => {
+      overlayRight = document.createElement("span");
+      overlayRight.className = "tabMenuOverlayRight icon icon24 fa-angle-right";
+      overlayRight.addEventListener("click", () => {
         const listWidth = list.clientWidth;
         scrollMenu(list, list.scrollLeft + ~~(listWidth / 2), list.scrollLeft, list.scrollWidth, listWidth, 0);
       });
 
       menu.appendChild(overlayRight);
     }
-    overlayRight.classList.add('active');
+    overlayRight.classList.add("active");
   } else if (overlayRight !== null) {
-    overlayRight.classList.remove('active');
+    overlayRight.classList.remove("active");
   }
 }
 
-
 /**
  * Sets up tab menus and binds listeners.
  */
@@ -235,15 +238,15 @@ export function setup() {
   init();
   selectErroneousTabs();
 
-  DomChangeListener.add('WoltLabSuite/Core/Ui/TabMenu', init);
-  UiCloseOverlay.add('WoltLabSuite/Core/Ui/TabMenu', () => {
+  DomChangeListener.add("WoltLabSuite/Core/Ui/TabMenu", init);
+  UiCloseOverlay.add("WoltLabSuite/Core/Ui/TabMenu", () => {
     if (_activeList) {
-      _activeList.classList.remove('active');
+      _activeList.classList.remove("active");
       _activeList = null;
     }
   });
 
-  UiScreen.on('screen-sm-down', {
+  UiScreen.on("screen-sm-down", {
     match() {
       scrollEnable(false);
     },
@@ -253,11 +256,11 @@ export function setup() {
     },
   });
 
-  window.addEventListener('hashchange', () => {
+  window.addEventListener("hashchange", () => {
     const hash = TabMenuSimple.getIdentifierFromHash();
     const element = hash ? document.getElementById(hash) : null;
-    if (element !== null && element.classList.contains('tabMenuContent')) {
-      _tabMenus.forEach(tabMenu => {
+    if (element !== null && element.classList.contains("tabMenuContent")) {
+      _tabMenus.forEach((tabMenu) => {
         if (tabMenu.hasTab(hash)) {
           tabMenu.select(hash);
         }
@@ -270,8 +273,8 @@ export function setup() {
     window.setTimeout(() => {
       // check if page was initially scrolled using a tab id
       const tabMenuContent = document.getElementById(hash);
-      if (tabMenuContent && tabMenuContent.classList.contains('tabMenuContent')) {
-        const scrollY = (window.scrollY || window.pageYOffset);
+      if (tabMenuContent && tabMenuContent.classList.contains("tabMenuContent")) {
+        const scrollY = window.scrollY || window.pageYOffset;
         if (scrollY > 0) {
           const parent = tabMenuContent.parentNode as HTMLElement;
 
@@ -308,7 +311,7 @@ export function scrollToTab(tab) {
     return;
   }
 
-  const list = tab.closest('ul');
+  const list = tab.closest("ul");
   const width = list.clientWidth;
   const scrollLeft = list.scrollLeft;
   const scrollWidth = list.scrollWidth;
index effbaf7370853446563956416d7b5f4365ac36db..804f19ba52723585670a45be346fd550da0fc1d3 100644 (file)
@@ -7,10 +7,10 @@
  * @module  WoltLabSuite/Core/Ui/TabMenu/Simple
  */
 
-import * as DomTraverse from '../../Dom/Traverse';
-import DomUtil from '../../Dom/Util';
-import * as Environment from '../../Environment';
-import * as EventHandler from '../../Event/Handler';
+import * as DomTraverse from "../../Dom/Traverse";
+import DomUtil from "../../Dom/Util";
+import * as Environment from "../../Environment";
+import * as EventHandler from "../../Event/Handler";
 
 class TabMenuSimple {
   private readonly container: HTMLElement;
@@ -38,22 +38,22 @@ class TabMenuSimple {
    * </div>
    */
   validate(): boolean {
-    if (!this.container.classList.contains('tabMenuContainer')) {
+    if (!this.container.classList.contains("tabMenuContainer")) {
       return false;
     }
 
-    const nav = DomTraverse.childByTag(this.container, 'NAV') as HTMLElement;
+    const nav = DomTraverse.childByTag(this.container, "NAV") as HTMLElement;
     if (nav === null) {
       return false;
     }
 
     // get children
-    const tabs = nav.querySelectorAll('li');
+    const tabs = nav.querySelectorAll("li");
     if (tabs.length === 0) {
       return false;
     }
 
-    DomTraverse.childrenByTag(this.container, 'DIV').forEach((container: HTMLElement) => {
+    DomTraverse.childrenByTag(this.container, "DIV").forEach((container: HTMLElement) => {
       let name = container.dataset.name;
       if (!name) {
         name = DomUtil.identify(container);
@@ -64,26 +64,38 @@ class TabMenuSimple {
     });
 
     const containerId = this.container.id;
-    tabs.forEach(tab => {
+    tabs.forEach((tab) => {
       const name = this._getTabName(tab);
       if (!name) {
         return;
       }
 
       if (this.tabs.has(name)) {
-        throw new Error("Tab names must be unique, li[data-name='" + name + "'] (tab menu id: '" + containerId + "') exists more than once.");
+        throw new Error(
+          "Tab names must be unique, li[data-name='" +
+            name +
+            "'] (tab menu id: '" +
+            containerId +
+            "') exists more than once."
+        );
       }
 
       const container = this.containers.get(name);
       if (container === undefined) {
-        throw new Error("Expected content element for li[data-name='" + name + "'] (tab menu id: '" + containerId + "').");
+        throw new Error(
+          "Expected content element for li[data-name='" + name + "'] (tab menu id: '" + containerId + "')."
+        );
       } else if (container.parentNode !== this.container) {
-        throw new Error("Expected content element '" + name + "' (tab menu id: '" + containerId + "') to be a direct children.");
+        throw new Error(
+          "Expected content element '" + name + "' (tab menu id: '" + containerId + "') to be a direct children."
+        );
       }
 
       // check if tab holds exactly one children which is an anchor element
-      if (tab.childElementCount !== 1 || tab.children[0].nodeName !== 'A') {
-        throw new Error("Expected exactly one <a> as children for li[data-name='" + name + "'] (tab menu id: '" + containerId + "').");
+      if (tab.childElementCount !== 1 || tab.children[0].nodeName !== "A") {
+        throw new Error(
+          "Expected exactly one <a> as children for li[data-name='" + name + "'] (tab menu id: '" + containerId + "')."
+        );
       }
 
       this.tabs.set(name, tab);
@@ -94,10 +106,10 @@ class TabMenuSimple {
     }
 
     if (this.isLegacy) {
-      this.container.dataset.isLegacy = 'true';
+      this.container.dataset.isLegacy = "true";
 
       this.tabs.forEach(function (tab, name) {
-        tab.setAttribute('aria-controls', name);
+        tab.setAttribute("aria-controls", name);
       });
     }
 
@@ -109,30 +121,30 @@ class TabMenuSimple {
    */
   init(oldTabs?: Map<string, HTMLLIElement> | null): HTMLElement | null {
     // bind listeners
-    this.tabs.forEach(tab => {
-      if (!oldTabs || oldTabs.get(tab.dataset.name || '') !== tab) {
+    this.tabs.forEach((tab) => {
+      if (!oldTabs || oldTabs.get(tab.dataset.name || "") !== tab) {
         const firstChild = tab.children[0] as HTMLElement;
-        firstChild.addEventListener('click', (ev) => this._onClick(ev));
+        firstChild.addEventListener("click", (ev) => this._onClick(ev));
 
         // iOS 13 changed the behavior for click events after scrolling the menu. It prevents
         // the synthetic mouse events like "click" from triggering for a short duration after
         // a scrolling has occurred. If the user scrolls to the end of the list and immediately
         // attempts to click the tab, nothing will happen. However, if the user waits for some
         // time, the tap will trigger a "click" event again.
-        // 
+        //
         // A "click" event is basically the result of a touch without any (significant) finger
         // movement indicated by a "touchmove" event. This changes allows the user to scroll
         // both the menu and the page normally, but still benefit from snappy reactions when
         // tapping a menu item.
-        if (Environment.platform() === 'ios') {
+        if (Environment.platform() === "ios") {
           let isClick = false;
-          firstChild.addEventListener('touchstart', () => {
+          firstChild.addEventListener("touchstart", () => {
             isClick = true;
           });
-          firstChild.addEventListener('touchmove', () => {
+          firstChild.addEventListener("touchmove", () => {
             isClick = false;
           });
-          firstChild.addEventListener('touchend', (event) => {
+          firstChild.addEventListener("touchend", (event) => {
             if (isClick) {
               isClick = false;
 
@@ -151,13 +163,13 @@ class TabMenuSimple {
     if (!oldTabs) {
       const hash = TabMenuSimple.getIdentifierFromHash();
       let selectTab: HTMLLIElement | undefined = undefined;
-      if (hash !== '') {
+      if (hash !== "") {
         selectTab = this.tabs.get(hash);
 
         // check for parent tab menu
         if (selectTab) {
           const item = this.container.parentNode as HTMLElement;
-          if (item.classList.contains('tabMenuContainer')) {
+          if (item.classList.contains("tabMenuContainer")) {
             returnValue = item;
           }
         }
@@ -171,18 +183,22 @@ class TabMenuSimple {
 
         if (preselect === true) {
           this.tabs.forEach(function (tab) {
-            if (!selectTab && !DomUtil.isHidden(tab) && (!tab.previousElementSibling || DomUtil.isHidden(tab.previousElementSibling as HTMLElement))) {
+            if (
+              !selectTab &&
+              !DomUtil.isHidden(tab) &&
+              (!tab.previousElementSibling || DomUtil.isHidden(tab.previousElementSibling as HTMLElement))
+            ) {
               selectTab = tab;
             }
           });
-        } else if (typeof preselect === 'string' && preselect !== "false") {
+        } else if (typeof preselect === "string" && preselect !== "false") {
           selectTab = this.tabs.get(preselect);
         }
       }
 
       if (selectTab) {
-        this.containers.forEach(container => {
-          container.classList.add('hidden');
+        this.containers.forEach((container) => {
+          container.classList.add("hidden");
         });
 
         this.select(null, selectTab, true);
@@ -190,10 +206,10 @@ class TabMenuSimple {
 
       const store = this.container.dataset.store;
       if (store) {
-        const input = document.createElement('input');
-        input.type = 'hidden';
+        const input = document.createElement("input");
+        input.type = "hidden";
         input.name = store;
-        input.value = this.getActiveTab().dataset.name || '';
+        input.value = this.getActiveTab().dataset.name || "";
 
         this.container.appendChild(input);
 
@@ -212,7 +228,7 @@ class TabMenuSimple {
    * @param  {boolean=}    disableEvent  suppress event handling
    */
   select(name: number | string | null, tab?: HTMLLIElement, disableEvent?: boolean): void {
-    name = (name) ? name.toString() : '';
+    name = name ? name.toString() : "";
     tab = tab || this.tabs.get(name);
 
     if (!tab) {
@@ -221,7 +237,7 @@ class TabMenuSimple {
         name = ~~name;
 
         let i = 0;
-        this.tabs.forEach(item => {
+        this.tabs.forEach((item) => {
           if (i === name) {
             tab = item;
           }
@@ -235,7 +251,7 @@ class TabMenuSimple {
       }
     }
 
-    name = (name || tab.dataset.name || '') as string;
+    name = (name || tab.dataset.name || "") as string;
 
     // unmark active tab
     const oldTab = this.getActiveTab();
@@ -248,31 +264,31 @@ class TabMenuSimple {
       }
 
       if (!disableEvent) {
-        EventHandler.fire('com.woltlab.wcf.simpleTabMenu_' + this.container.id, 'beforeSelect', {
+        EventHandler.fire("com.woltlab.wcf.simpleTabMenu_" + this.container.id, "beforeSelect", {
           tab: oldTab,
           tabName: oldTabName,
         });
       }
 
-      oldTab.classList.remove('active');
-      oldContent = this.containers.get(oldTab.dataset.name || '')!;
-      oldContent.classList.remove('active');
-      oldContent.classList.add('hidden');
+      oldTab.classList.remove("active");
+      oldContent = this.containers.get(oldTab.dataset.name || "")!;
+      oldContent.classList.remove("active");
+      oldContent.classList.add("hidden");
 
       if (this.isLegacy) {
-        oldTab.classList.remove('ui-state-active');
-        oldContent.classList.remove('ui-state-active');
+        oldTab.classList.remove("ui-state-active");
+        oldContent.classList.remove("ui-state-active");
       }
     }
 
-    tab.classList.add('active');
+    tab.classList.add("active");
     const newContent = this.containers.get(name)!;
-    newContent.classList.add('active');
-    newContent.classList.remove('hidden');
+    newContent.classList.add("active");
+    newContent.classList.remove("hidden");
 
     if (this.isLegacy) {
-      tab.classList.add('ui-state-active');
-      newContent.classList.add('ui-state-active');
+      tab.classList.add("ui-state-active");
+      newContent.classList.add("ui-state-active");
     }
 
     if (this.store) {
@@ -280,17 +296,17 @@ class TabMenuSimple {
     }
 
     if (!disableEvent) {
-      EventHandler.fire('com.woltlab.wcf.simpleTabMenu_' + this.container.id, 'select', {
+      EventHandler.fire("com.woltlab.wcf.simpleTabMenu_" + this.container.id, "select", {
         active: tab,
         activeName: name,
         previous: oldTab,
         previousName: oldTab ? oldTab.dataset.name : null,
       });
 
-      const jQuery = (this.isLegacy && typeof window.jQuery === 'function') ? window.jQuery : null;
+      const jQuery = this.isLegacy && typeof window.jQuery === "function" ? window.jQuery : null;
       if (jQuery) {
         // simulate jQuery UI Tabs event
-        jQuery(this.container).trigger('wcftabsbeforeactivate', {
+        jQuery(this.container).trigger("wcftabsbeforeactivate", {
           newTab: jQuery(tab),
           oldTab: jQuery(oldTab),
           newPanel: jQuery(newContent),
@@ -298,19 +314,15 @@ class TabMenuSimple {
         });
       }
 
-      let location = window.location.href.replace(/#+[^#]*$/, '');
+      let location = window.location.href.replace(/#+[^#]*$/, "");
       if (TabMenuSimple.getIdentifierFromHash() === name) {
         location += window.location.hash;
       } else {
-        location += '#' + name;
+        location += "#" + name;
       }
 
       // update history
-      window.history.replaceState(
-        undefined,
-        '',
-        location,
-      );
+      window.history.replaceState(undefined, "", location);
     }
 
     // TODO
@@ -331,7 +343,7 @@ class TabMenuSimple {
    */
   selectFirstVisible(): boolean {
     let selectTab: HTMLLIElement | null = null;
-    this.tabs.forEach(tab => {
+    this.tabs.forEach((tab) => {
       if (!selectTab && !DomUtil.isHidden(tab)) {
         selectTab = tab;
       }
@@ -382,7 +394,7 @@ class TabMenuSimple {
 
     // handle legacy tab menus
     if (!name) {
-      if (tab.childElementCount === 1 && tab.children[0].nodeName === 'A') {
+      if (tab.childElementCount === 1 && tab.children[0].nodeName === "A") {
         const link = tab.children[0] as HTMLAnchorElement;
         if (link.href.match(/#([^#]+)$/)) {
           name = RegExp.$1;
@@ -404,7 +416,7 @@ class TabMenuSimple {
    * Returns the currently active tab.
    */
   getActiveTab(): HTMLLIElement {
-    return document.querySelector('#' + this.container.id + ' > nav > ul > li.active') as HTMLLIElement;
+    return document.querySelector("#" + this.container.id + " > nav > ul > li.active") as HTMLLIElement;
   }
 
   /**
@@ -426,9 +438,8 @@ class TabMenuSimple {
       return RegExp.$1;
     }
 
-    return '';
-  };
+    return "";
+  }
 }
 
 export = TabMenuSimple;
-       
index bf7fe8dab9a0229bed8b1baf6c1fff0a67076c9a..d1802c70320b8dd790916e844bde9e2f28720239 100644 (file)
@@ -21,7 +21,7 @@
  * @module  WoltLabSuite/Core/Ui/Toggle/Input
  */
 
-import DomUtil from '../../Dom/Util';
+import DomUtil from "../../Dom/Util";
 
 class UiToggleInput {
   private readonly element: HTMLInputElement;
@@ -37,17 +37,17 @@ class UiToggleInput {
       throw new Error("Unable to find element by selector '" + elementSelector + "'.");
     }
 
-    const type = (element.nodeName === 'INPUT') ? element.type : '';
-    if (type !== 'checkbox' && type !== 'radio') {
+    const type = element.nodeName === "INPUT" ? element.type : "";
+    if (type !== "checkbox" && type !== "radio") {
       throw new Error("Illegal element, expected input[type='checkbox'] or input[type='radio'].");
     }
 
     this.element = element;
 
-    this.hide = this.getElements('hide', Array.isArray(options.hide) ? options.hide : []);
-    this.hide = this.getElements('show', Array.isArray(options.show) ? options.show : []);
+    this.hide = this.getElements("hide", Array.isArray(options.hide) ? options.hide : []);
+    this.hide = this.getElements("show", Array.isArray(options.show) ? options.show : []);
 
-    this.element.addEventListener('change', (ev) => this.change(ev));
+    this.element.addEventListener("change", (ev) => this.change(ev));
 
     this.updateVisibility(this.show, this.element.checked);
     this.updateVisibility(this.hide, !this.element.checked);
@@ -55,9 +55,9 @@ class UiToggleInput {
 
   private getElements(type: string, items: ElementOrSelector[]): HTMLElement[] {
     const elements: HTMLElement[] = [];
-    items.forEach(item => {
+    items.forEach((item) => {
       let element: HTMLElement | null = null;
-      if (typeof item === 'string') {
+      if (typeof item === "string") {
         element = document.querySelector(item);
         if (element === null) {
           throw new Error(`Unable to find an element with the selector '${item}'.`);
@@ -89,8 +89,8 @@ class UiToggleInput {
    * Loops through the target elements and shows / hides them.
    */
   private updateVisibility(elements: HTMLElement[], showElement: boolean) {
-    elements.forEach(element => {
-      DomUtil[showElement ? 'show' : 'hide'](element);
+    elements.forEach((element) => {
+      DomUtil[showElement ? "show" : "hide"](element);
     });
   }
 }
index 76d10649c64796721474f55273a08e5e99a1409d..ee91a07966a544337be8b38fd5911968749dbfee 100644 (file)
@@ -7,9 +7,9 @@
  * @module  WoltLabSuite/Core/Ui/Tooltip
  */
 
-import DomChangeListener from '../Dom/Change/Listener';
-import * as Environment from '../Environment';
-import * as UiAlignment from './Alignment';
+import DomChangeListener from "../Dom/Change/Listener";
+import * as Environment from "../Environment";
+import * as UiAlignment from "./Alignment";
 
 let _pointer: HTMLElement;
 let _text: HTMLElement;
@@ -22,33 +22,33 @@ function mouseEnter(event: MouseEvent): void {
   const element = event.currentTarget as HTMLElement;
 
   let title = element.title.trim();
-  if (title !== '') {
+  if (title !== "") {
     element.dataset.tooltip = title;
-    element.setAttribute('aria-label', title);
-    element.removeAttribute('title');
+    element.setAttribute("aria-label", title);
+    element.removeAttribute("title");
   }
 
-  title = element.dataset.tooltip || '';
+  title = element.dataset.tooltip || "";
 
   // reset tooltip position
-  _tooltip.style.removeProperty('top');
-  _tooltip.style.removeProperty('left');
+  _tooltip.style.removeProperty("top");
+  _tooltip.style.removeProperty("left");
 
   // ignore empty tooltip
   if (!title.length) {
-    _tooltip.classList.remove('active');
+    _tooltip.classList.remove("active");
     return;
   } else {
-    _tooltip.classList.add('active');
+    _tooltip.classList.add("active");
   }
 
   _text.textContent = title;
   UiAlignment.set(_tooltip, element, {
-    horizontal: 'center',
+    horizontal: "center",
     verticalOffset: 4,
     pointer: true,
-    pointerClassNames: ['inverse'],
-    vertical: 'top',
+    pointerClassNames: ["inverse"],
+    vertical: "top",
   });
 }
 
@@ -56,63 +56,63 @@ function mouseEnter(event: MouseEvent): void {
  * Hides the tooltip once the mouse leaves the element.
  */
 function mouseLeave(): void {
-  _tooltip.classList.remove('active');
+  _tooltip.classList.remove("active");
 }
 
 /**
  * Initializes the tooltip element and binds event listener.
  */
 export function setup(): void {
-  if (Environment.platform() !== 'desktop') {
+  if (Environment.platform() !== "desktop") {
     return;
   }
 
-  _tooltip = document.createElement('div');
-  _tooltip.id = 'balloonTooltip';
-  _tooltip.classList.add('balloonTooltip');
-  _tooltip.addEventListener('transitionend', () => {
-    if (!_tooltip.classList.contains('active')) {
+  _tooltip = document.createElement("div");
+  _tooltip.id = "balloonTooltip";
+  _tooltip.classList.add("balloonTooltip");
+  _tooltip.addEventListener("transitionend", () => {
+    if (!_tooltip.classList.contains("active")) {
       // reset back to the upper left corner, prevent it from staying outside
       // the viewport if the body overflow was previously hidden
-      ['bottom', 'left', 'right', 'top'].forEach(property => {
+      ["bottom", "left", "right", "top"].forEach((property) => {
         _tooltip.style.removeProperty(property);
       });
     }
   });
 
-  _text = document.createElement('span');
-  _text.id = 'balloonTooltipText';
+  _text = document.createElement("span");
+  _text.id = "balloonTooltipText";
   _tooltip.appendChild(_text);
 
-  _pointer = document.createElement('span');
-  _pointer.classList.add('elementPointer');
-  _pointer.appendChild(document.createElement('span'));
+  _pointer = document.createElement("span");
+  _pointer.classList.add("elementPointer");
+  _pointer.appendChild(document.createElement("span"));
   _tooltip.appendChild(_pointer);
 
   document.body.appendChild(_tooltip);
 
   init();
 
-  DomChangeListener.add('WoltLabSuite/Core/Ui/Tooltip', init);
-  window.addEventListener('scroll', mouseLeave);
+  DomChangeListener.add("WoltLabSuite/Core/Ui/Tooltip", init);
+  window.addEventListener("scroll", mouseLeave);
 }
 
 /**
  * Initializes tooltip elements.
  */
 export function init(): void {
-  document.querySelectorAll('.jsTooltip').forEach((element: HTMLElement) => {
-    element.classList.remove('jsTooltip');
+  document.querySelectorAll(".jsTooltip").forEach((element: HTMLElement) => {
+    element.classList.remove("jsTooltip");
 
     const title = element.title.trim();
     if (title.length) {
       element.dataset.tooltip = title;
-      element.removeAttribute('title');
-      element.setAttribute('aria-label', title);
+      element.removeAttribute("title");
+      element.setAttribute("aria-label", title);
 
-      element.addEventListener('mouseenter', mouseEnter);
-      element.addEventListener('mouseleave', mouseLeave);
-      element.addEventListener('click', mouseLeave);
+      element.addEventListener("mouseenter", mouseEnter);
+      element.addEventListener("mouseleave", mouseLeave);
+      element.addEventListener("click", mouseLeave);
     }
   });
 }
index 3eeb3d994c169546d6249f4bbd7f2d557befbc42..74ada47594817f1c3ff644b2b8bc3a5a022fae43 100644 (file)
@@ -7,30 +7,32 @@
  * @module  WoltLabSuite/Core/Ui/User/Editor
  */
 
-import * as Ajax from '../../Ajax';
-import { AjaxCallbackObject } from '../../Ajax/Data';
-import * as Core from '../../Core';
-import { DialogCallbackObject, DialogSettings } from '../Dialog/Data';
-import DomUtil from '../../Dom/Util';
-import * as Language from '../../Language';
-import * as StringUtil from '../../StringUtil';
-import UiDialog from '../Dialog';
-import * as UiNotification from '../Notification';
+import * as Ajax from "../../Ajax";
+import { AjaxCallbackObject } from "../../Ajax/Data";
+import * as Core from "../../Core";
+import { DialogCallbackObject, DialogSettings } from "../Dialog/Data";
+import DomUtil from "../../Dom/Util";
+import * as Language from "../../Language";
+import * as StringUtil from "../../StringUtil";
+import UiDialog from "../Dialog";
+import * as UiNotification from "../Notification";
 
 class UserEditor implements AjaxCallbackObject, DialogCallbackObject {
-  private actionName = '';
+  private actionName = "";
   private readonly header: HTMLElement;
 
   constructor() {
-    this.header = document.querySelector('.userProfileUser') as HTMLElement;
+    this.header = document.querySelector(".userProfileUser") as HTMLElement;
 
-    ['ban', 'disableAvatar', 'disableCoverPhoto', 'disableSignature', 'enable'].forEach(action => {
-      const button = document.querySelector('.userProfileButtonMenu .jsButtonUser' + StringUtil.ucfirst(action)) as HTMLElement;
+    ["ban", "disableAvatar", "disableCoverPhoto", "disableSignature", "enable"].forEach((action) => {
+      const button = document.querySelector(
+        ".userProfileButtonMenu .jsButtonUser" + StringUtil.ucfirst(action)
+      ) as HTMLElement;
 
       // The button is missing if the current user lacks the permission.
       if (button) {
         button.dataset.action = action;
-        button.addEventListener('click', (ev) => this._click(ev));
+        button.addEventListener("click", (ev) => this._click(ev));
       }
     });
   }
@@ -42,39 +44,39 @@ class UserEditor implements AjaxCallbackObject, DialogCallbackObject {
     event.preventDefault();
 
     const target = event.currentTarget as HTMLElement;
-    const action = target.dataset.action || '';
-    let actionName = '';
+    const action = target.dataset.action || "";
+    let actionName = "";
     switch (action) {
-      case 'ban':
-        if (Core.stringToBool(this.header.dataset.banned || '')) {
-          actionName = 'unban';
+      case "ban":
+        if (Core.stringToBool(this.header.dataset.banned || "")) {
+          actionName = "unban";
         }
         break;
 
-      case 'disableAvatar':
-        if (Core.stringToBool(this.header.dataset.disableAvatar || '')) {
-          actionName = 'enableAvatar';
+      case "disableAvatar":
+        if (Core.stringToBool(this.header.dataset.disableAvatar || "")) {
+          actionName = "enableAvatar";
         }
         break;
 
-      case 'disableCoverPhoto':
-        if (Core.stringToBool(this.header.dataset.disableCoverPhoto || '')) {
-          actionName = 'enableCoverPhoto';
+      case "disableCoverPhoto":
+        if (Core.stringToBool(this.header.dataset.disableCoverPhoto || "")) {
+          actionName = "enableCoverPhoto";
         }
         break;
 
-      case 'disableSignature':
-        if (Core.stringToBool(this.header.dataset.disableSignature || '')) {
-          actionName = 'enableSignature';
+      case "disableSignature":
+        if (Core.stringToBool(this.header.dataset.disableSignature || "")) {
+          actionName = "enableSignature";
         }
         break;
 
-      case 'enable':
-        actionName = (Core.stringToBool(this.header.dataset.isDisabled || '')) ? 'enable' : 'disable';
+      case "enable":
+        actionName = Core.stringToBool(this.header.dataset.isDisabled || "") ? "enable" : "disable";
         break;
     }
 
-    if (actionName === '') {
+    if (actionName === "") {
       this.actionName = action;
 
       UiDialog.open(this);
@@ -91,25 +93,25 @@ class UserEditor implements AjaxCallbackObject, DialogCallbackObject {
   _submit(event: Event): void {
     event.preventDefault();
 
-    const label = document.getElementById('wcfUiUserEditorExpiresLabel') as HTMLElement;
+    const label = document.getElementById("wcfUiUserEditorExpiresLabel") as HTMLElement;
 
-    let expires = '';
-    let errorMessage = '';
-    const neverExpires = document.getElementById('wcfUiUserEditorNeverExpires') as HTMLInputElement;
+    let expires = "";
+    let errorMessage = "";
+    const neverExpires = document.getElementById("wcfUiUserEditorNeverExpires") as HTMLInputElement;
     if (!neverExpires.checked) {
-      const expireValue = document.getElementById('wcfUiUserEditorExpiresDatePicker') as HTMLInputElement;
+      const expireValue = document.getElementById("wcfUiUserEditorExpiresDatePicker") as HTMLInputElement;
       expires = expireValue.value;
-      if (expires === '') {
-        errorMessage = Language.get('wcf.global.form.error.empty');
+      if (expires === "") {
+        errorMessage = Language.get("wcf.global.form.error.empty");
       }
     }
 
     DomUtil.innerError(label, errorMessage);
 
     const parameters = {};
-    parameters[this.actionName + 'Expires'] = expires;
-    const reason = document.getElementById('wcfUiUserEditorReason') as HTMLTextAreaElement;
-    parameters[this.actionName + 'Reason'] = reason.value.trim();
+    parameters[this.actionName + "Expires"] = expires;
+    const reason = document.getElementById("wcfUiUserEditorReason") as HTMLTextAreaElement;
+    parameters[this.actionName + "Reason"] = reason.value.trim();
 
     Ajax.api(this, {
       actionName: this.actionName,
@@ -120,17 +122,17 @@ class UserEditor implements AjaxCallbackObject, DialogCallbackObject {
   _ajaxSuccess(data) {
     let button: HTMLElement;
     switch (data.actionName) {
-      case 'ban':
-      case 'unban':
-        this.header.dataset.banned = (data.actionName === 'ban') ? 'true' : 'false';
-        button = document.querySelector('.userProfileButtonMenu .jsButtonUserBan') as HTMLElement;
-        button.textContent = Language.get('wcf.user.' + (data.actionName === 'ban' ? 'unban' : 'ban'));
-
-        const contentTitle = this.header.querySelector('.contentTitle') as HTMLElement;
-        let banIcon = contentTitle.querySelector('.jsUserBanned') as HTMLElement;
-        if (data.actionName === 'ban') {
-          banIcon = document.createElement('span');
-          banIcon.className = 'icon icon24 fa-lock jsUserBanned jsTooltip';
+      case "ban":
+      case "unban":
+        this.header.dataset.banned = data.actionName === "ban" ? "true" : "false";
+        button = document.querySelector(".userProfileButtonMenu .jsButtonUserBan") as HTMLElement;
+        button.textContent = Language.get("wcf.user." + (data.actionName === "ban" ? "unban" : "ban"));
+
+        const contentTitle = this.header.querySelector(".contentTitle") as HTMLElement;
+        let banIcon = contentTitle.querySelector(".jsUserBanned") as HTMLElement;
+        if (data.actionName === "ban") {
+          banIcon = document.createElement("span");
+          banIcon.className = "icon icon24 fa-lock jsUserBanned jsTooltip";
           banIcon.title = data.returnValues;
           contentTitle.appendChild(banIcon);
         } else if (banIcon) {
@@ -138,36 +140,42 @@ class UserEditor implements AjaxCallbackObject, DialogCallbackObject {
         }
         break;
 
-      case 'disableAvatar':
-      case 'enableAvatar':
-        this.header.dataset.disableAvatar = (data.actionName === 'disableAvatar') ? 'true' : 'false';
-        button = document.querySelector('.userProfileButtonMenu .jsButtonUserDisableAvatar') as HTMLElement;
-        button.textContent = Language.get('wcf.user.' + (data.actionName === 'disableAvatar' ? 'enable' : 'disable') + 'Avatar');
+      case "disableAvatar":
+      case "enableAvatar":
+        this.header.dataset.disableAvatar = data.actionName === "disableAvatar" ? "true" : "false";
+        button = document.querySelector(".userProfileButtonMenu .jsButtonUserDisableAvatar") as HTMLElement;
+        button.textContent = Language.get(
+          "wcf.user." + (data.actionName === "disableAvatar" ? "enable" : "disable") + "Avatar"
+        );
         break;
 
-      case 'disableCoverPhoto':
-      case 'enableCoverPhoto':
-        this.header.dataset.disableCoverPhoto = (data.actionName === 'disableCoverPhoto') ? 'true' : 'false';
-        button = document.querySelector('.userProfileButtonMenu .jsButtonUserDisableCoverPhoto') as HTMLElement;
-        button.textContent = Language.get('wcf.user.' + (data.actionName === 'disableCoverPhoto' ? 'enable' : 'disable') + 'CoverPhoto');
+      case "disableCoverPhoto":
+      case "enableCoverPhoto":
+        this.header.dataset.disableCoverPhoto = data.actionName === "disableCoverPhoto" ? "true" : "false";
+        button = document.querySelector(".userProfileButtonMenu .jsButtonUserDisableCoverPhoto") as HTMLElement;
+        button.textContent = Language.get(
+          "wcf.user." + (data.actionName === "disableCoverPhoto" ? "enable" : "disable") + "CoverPhoto"
+        );
         break;
 
-      case 'disableSignature':
-      case 'enableSignature':
-        this.header.dataset.disableSignature = (data.actionName === 'disableSignature') ? 'true' : 'false';
-        button = document.querySelector('.userProfileButtonMenu .jsButtonUserDisableSignature') as HTMLElement;
-        button.textContent = Language.get('wcf.user.' + (data.actionName === 'disableSignature' ? 'enable' : 'disable') + 'Signature');
+      case "disableSignature":
+      case "enableSignature":
+        this.header.dataset.disableSignature = data.actionName === "disableSignature" ? "true" : "false";
+        button = document.querySelector(".userProfileButtonMenu .jsButtonUserDisableSignature") as HTMLElement;
+        button.textContent = Language.get(
+          "wcf.user." + (data.actionName === "disableSignature" ? "enable" : "disable") + "Signature"
+        );
         break;
 
-      case 'enable':
-      case 'disable':
-        this.header.dataset.isDisabled = (data.actionName === 'disable') ? 'true' : 'false';
-        button = document.querySelector('.userProfileButtonMenu .jsButtonUserEnable') as HTMLElement;
-        button.textContent = Language.get('wcf.acp.user.' + (data.actionName === 'enable' ? 'disable' : 'enable'));
+      case "enable":
+      case "disable":
+        this.header.dataset.isDisabled = data.actionName === "disable" ? "true" : "false";
+        button = document.querySelector(".userProfileButtonMenu .jsButtonUserEnable") as HTMLElement;
+        button.textContent = Language.get("wcf.acp.user." + (data.actionName === "enable" ? "disable" : "enable"));
         break;
     }
 
-    if (['ban', 'disableAvatar', 'disableCoverPhoto', 'disableSignature'].indexOf(data.actionName) !== -1) {
+    if (["ban", "disableAvatar", "disableCoverPhoto", "disableSignature"].indexOf(data.actionName) !== -1) {
       UiDialog.close(this);
     }
 
@@ -177,7 +185,7 @@ class UserEditor implements AjaxCallbackObject, DialogCallbackObject {
   _ajaxSetup() {
     return {
       data: {
-        className: 'wcf\\data\\user\\UserAction',
+        className: "wcf\\data\\user\\UserAction",
         objectIDs: [+this.header.dataset.objectId!],
       },
     };
@@ -185,40 +193,40 @@ class UserEditor implements AjaxCallbackObject, DialogCallbackObject {
 
   _dialogSetup(): DialogSettings {
     return {
-      id: 'wcfUiUserEditor',
+      id: "wcfUiUserEditor",
       options: {
-        onSetup: content => {
-          const checkbox = document.getElementById('wcfUiUserEditorNeverExpires') as HTMLInputElement;
-          checkbox.addEventListener('change', () => {
-            const settings = document.getElementById('wcfUiUserEditorExpiresSettings') as HTMLElement;
-            DomUtil[checkbox.checked ? 'hide' : 'show'](settings);
+        onSetup: (content) => {
+          const checkbox = document.getElementById("wcfUiUserEditorNeverExpires") as HTMLInputElement;
+          checkbox.addEventListener("change", () => {
+            const settings = document.getElementById("wcfUiUserEditorExpiresSettings") as HTMLElement;
+            DomUtil[checkbox.checked ? "hide" : "show"](settings);
           });
 
-          const submitButton = content.querySelector('button.buttonPrimary') as HTMLButtonElement;
-          submitButton.addEventListener('click', this._submit.bind(this));
+          const submitButton = content.querySelector("button.buttonPrimary") as HTMLButtonElement;
+          submitButton.addEventListener("click", this._submit.bind(this));
         },
-        onShow: content => {
-          UiDialog.setTitle('wcfUiUserEditor', Language.get('wcf.user.' + this.actionName + '.confirmMessage'));
+        onShow: (content) => {
+          UiDialog.setTitle("wcfUiUserEditor", Language.get("wcf.user." + this.actionName + ".confirmMessage"));
 
-          const reason = document.getElementById('wcfUiUserEditorReason') as HTMLElement;
+          const reason = document.getElementById("wcfUiUserEditorReason") as HTMLElement;
           let label = reason.nextElementSibling as HTMLElement;
-          const phrase = 'wcf.user.' + this.actionName + '.reason.description';
+          const phrase = "wcf.user." + this.actionName + ".reason.description";
           label.textContent = Language.get(phrase);
-          window[(label.textContent === phrase) ? 'elHide' : 'elShow'](label);
+          window[label.textContent === phrase ? "elHide" : "elShow"](label);
 
-          label = document.getElementById('wcfUiUserEditorNeverExpires')!.nextElementSibling as HTMLElement;
-          label.textContent = Language.get('wcf.user.' + this.actionName + '.neverExpires');
+          label = document.getElementById("wcfUiUserEditorNeverExpires")!.nextElementSibling as HTMLElement;
+          label.textContent = Language.get("wcf.user." + this.actionName + ".neverExpires");
 
           label = content.querySelector('label[for="wcfUiUserEditorExpires"]') as HTMLElement;
-          label.textContent = Language.get('wcf.user.' + this.actionName + '.expires');
+          label.textContent = Language.get("wcf.user." + this.actionName + ".expires");
 
-          label = document.getElementById('wcfUiUserEditorExpiresLabel') as HTMLElement;
-          label.textContent = Language.get('wcf.user.' + this.actionName + '.expires.description');
+          label = document.getElementById("wcfUiUserEditorExpiresLabel") as HTMLElement;
+          label.textContent = Language.get("wcf.user." + this.actionName + ".expires.description");
         },
       },
       source: `<div class="section">
         <dl>
-          <dt><label for="wcfUiUserEditorReason">${Language.get('wcf.global.reason')}</label></dt>
+          <dt><label for="wcfUiUserEditorReason">${Language.get("wcf.global.reason")}</label></dt>
           <dd><textarea id="wcfUiUserEditorReason" cols="40" rows="3"></textarea><small></small></dd>
         </dl>
         <dl>
@@ -228,13 +236,15 @@ class UserEditor implements AjaxCallbackObject, DialogCallbackObject {
         <dl id="wcfUiUserEditorExpiresSettings" style="display: none">
           <dt><label for="wcfUiUserEditorExpires"></label></dt>
           <dd>
-            <input type="date" name="wcfUiUserEditorExpires" id="wcfUiUserEditorExpires" class="medium" min="${new Date(window.TIME_NOW * 1000).toISOString()}" data-ignore-timezone="true">
+            <input type="date" name="wcfUiUserEditorExpires" id="wcfUiUserEditorExpires" class="medium" min="${new Date(
+              window.TIME_NOW * 1000
+            ).toISOString()}" data-ignore-timezone="true">
             <small id="wcfUiUserEditorExpiresLabel"></small>
           </dd>
         </dl>
       </div>
       <div class="formSubmit">
-        <button class="buttonPrimary">${Language.get('wcf.global.button.submit')}</button>
+        <button class="buttonPrimary">${Language.get("wcf.global.button.submit")}</button>
       </div>`,
     };
   }
index afb1422e5ecd740a6b07855d78b826d470d9af69..71ba282bdeef679ad26122b3b2b40f19fbfb46ad 100644 (file)
@@ -7,9 +7,9 @@
  * @module  WoltLabSuite/Core/Ui/User/Ignore
  */
 
-import DomChangeListener from '../../Dom/Change/Listener';
+import DomChangeListener from "../../Dom/Change/Listener";
 
-const _availableMessages = document.getElementsByClassName('ignoredUserMessage');
+const _availableMessages = document.getElementsByClassName("ignoredUserMessage");
 const _knownMessages = new Set<HTMLElement>();
 
 /**
@@ -22,7 +22,7 @@ function rebuild() {
     const message = _availableMessages[i] as HTMLElement;
 
     if (!_knownMessages.has(message)) {
-      message.addEventListener('click', showMessage, {once: true});
+      message.addEventListener("click", showMessage, { once: true });
 
       _knownMessages.add(message);
     }
@@ -36,7 +36,7 @@ function showMessage(event: MouseEvent): void {
   event.preventDefault();
 
   const message = event.currentTarget as HTMLElement;
-  message.classList.remove('ignoredUserMessage');
+  message.classList.remove("ignoredUserMessage");
   _knownMessages.delete(message);
 
   // Firefox selects the entire message on click for no reason
@@ -50,5 +50,5 @@ function showMessage(event: MouseEvent): void {
 export function init() {
   rebuild();
 
-  DomChangeListener.add('WoltLabSuite/Core/Ui/User/Ignore', rebuild);
+  DomChangeListener.add("WoltLabSuite/Core/Ui/User/Ignore", rebuild);
 }
index 764730b6493a5ea28451a6426a0e8c37a03e71fa..92a4c7cd97cbe8c9b78a57e9d2ecbbf8d6ba30f0 100644 (file)
@@ -7,13 +7,13 @@
  * @module  WoltLabSuite/Core/Ui/User/List
  */
 
-import * as Ajax from '../../Ajax';
-import * as Core from '../../Core';
-import DomUtil from '../../Dom/Util';
-import UiDialog from '../Dialog';
-import UiPagination from '../Pagination';
-import { AjaxCallbackObject, DatabaseObjectActionResponse, RequestOptions } from '../../Ajax/Data';
-import { DialogCallbackObject, DialogData, DialogSettings } from '../Dialog/Data';
+import * as Ajax from "../../Ajax";
+import * as Core from "../../Core";
+import DomUtil from "../../Dom/Util";
+import UiDialog from "../Dialog";
+import UiPagination from "../Pagination";
+import { AjaxCallbackObject, DatabaseObjectActionResponse, RequestOptions } from "../../Ajax/Data";
+import { DialogCallbackObject, DialogData, DialogSettings } from "../Dialog/Data";
 
 /**
  * @constructor
@@ -30,11 +30,14 @@ class UiUserList implements AjaxCallbackObject, DialogCallbackObject {
    * @param  {object}  options    list of initialization options
    */
   constructor(options: AjaxRequestOptions) {
-    this.options = Core.extend({
-      className: '',
-      dialogTitle: '',
-      parameters: {},
-    }, options) as AjaxRequestOptions;
+    this.options = Core.extend(
+      {
+        className: "",
+        dialogTitle: "",
+        parameters: {},
+      },
+      options
+    ) as AjaxRequestOptions;
   }
 
   /**
@@ -49,7 +52,7 @@ class UiUserList implements AjaxCallbackObject, DialogCallbackObject {
    * Shows the current or given page.
    */
   private showPage(pageNo?: number): void {
-    if (typeof pageNo === 'number') {
+    if (typeof pageNo === "number") {
       this.pageNo = +pageNo;
     }
 
@@ -61,7 +64,7 @@ class UiUserList implements AjaxCallbackObject, DialogCallbackObject {
       const dialog = UiDialog.open(this, this.cache.get(this.pageNo)) as DialogData;
 
       if (this.pageCount > 1) {
-        const element = dialog.content.querySelector('.jsPagination') as HTMLElement;
+        const element = dialog.content.querySelector(".jsPagination") as HTMLElement;
         if (element !== null) {
           new UiPagination(element, {
             activePage: this.pageNo,
@@ -98,9 +101,9 @@ class UiUserList implements AjaxCallbackObject, DialogCallbackObject {
   _ajaxSetup(): RequestOptions {
     return {
       data: {
-        actionName: 'getGroupedUserList',
+        actionName: "getGroupedUserList",
         className: this.options.className,
-        interfaceName: 'wcf\\data\\IGroupedUserListAction',
+        interfaceName: "wcf\\data\\IGroupedUserListAction",
       },
     };
   }
@@ -116,7 +119,7 @@ class UiUserList implements AjaxCallbackObject, DialogCallbackObject {
   }
 }
 
-export = UiUserList
+export = UiUserList;
 
 interface AjaxRequestOptions {
   className: string;
@@ -130,5 +133,5 @@ interface AjaxResponse extends DatabaseObjectActionResponse {
   returnValues: {
     pageCount?: number;
     template: string;
-  }
+  };
 }
index 2a4ca126c5bcd76e7e8d083f38fa184212600f53..1ac8818fcdcd638abf4deca9de545389a29a3e81 100644 (file)
@@ -8,23 +8,26 @@
  * @see  module:WoltLabSuite/Core/Ui/Search/Input
  */
 
-import * as Core from '../../../Core';
-import UiSearchInput from '../../Search/Input';
+import * as Core from "../../../Core";
+import UiSearchInput from "../../Search/Input";
 
 class UiUserSearchInput extends UiSearchInput {
   constructor(element, options) {
-    const includeUserGroups = (Core.isPlainObject(options) && options.includeUserGroups === true);
-
-    options = Core.extend({
-      ajax: {
-        className: 'wcf\\data\\user\\UserAction',
-        parameters: {
-          data: {
-            includeUserGroups: (includeUserGroups ? 1 : 0),
+    const includeUserGroups = Core.isPlainObject(options) && options.includeUserGroups === true;
+
+    options = Core.extend(
+      {
+        ajax: {
+          className: "wcf\\data\\user\\UserAction",
+          parameters: {
+            data: {
+              includeUserGroups: includeUserGroups ? 1 : 0,
+            },
           },
         },
       },
-    }, options);
+      options
+    );
 
     super(element, options);
   }
@@ -33,9 +36,9 @@ class UiUserSearchInput extends UiSearchInput {
     const listItem = super.createListItem(item);
     listItem.dataset.type = item.type;
 
-    const box = document.createElement('div');
-    box.className = 'box16';
-    box.innerHTML = (item.type === 'group') ? '<span class="icon icon16 fa-users"></span>' : item.icon;
+    const box = document.createElement("div");
+    box.className = "box16";
+    box.innerHTML = item.type === "group" ? '<span class="icon icon16 fa-users"></span>' : item.icon;
     box.appendChild(listItem.children[0]);
     listItem.appendChild(box);
 
@@ -43,7 +46,7 @@ class UiUserSearchInput extends UiSearchInput {
   }
 }
 
-export = UiUserSearchInput
+export = UiUserSearchInput;
 
 // https://stackoverflow.com/a/50677584/782822
 // This is a dirty hack, because the ListItemData cannot be exported for compatibility reasons.
index ddc4d6559a25bfb31bd2e03b7623ee145f14b8f9..73458a611573d953760670e8a9803fc9452bb4a6 100644 (file)
@@ -7,18 +7,17 @@
  * @module  WoltLabSuite/Core/Ui/User/Trophy/List
  */
 
-import * as Ajax from '../../../Ajax';
-import { AjaxCallbackObject, DatabaseObjectActionResponse } from '../../../Ajax/Data';
-import { DialogCallbackObject, DialogData } from '../../Dialog/Data';
-import DomChangeListener from '../../../Dom/Change/Listener';
-import UiDialog from '../../Dialog';
-import UiPagination from '../../Pagination';
+import * as Ajax from "../../../Ajax";
+import { AjaxCallbackObject, DatabaseObjectActionResponse } from "../../../Ajax/Data";
+import { DialogCallbackObject, DialogData } from "../../Dialog/Data";
+import DomChangeListener from "../../../Dom/Change/Listener";
+import UiDialog from "../../Dialog";
+import UiPagination from "../../Pagination";
 
 class CacheData {
   private readonly cache = new Map<number, string>();
 
-  constructor(readonly pageCount: number, readonly title: string) {
-  }
+  constructor(readonly pageCount: number, readonly title: string) {}
 
   has(pageNo: number): boolean {
     return this.cache.has(pageNo);
@@ -43,7 +42,7 @@ class UiUserTrophyList implements AjaxCallbackObject, DialogCallbackObject {
    * Initializes the user trophy list.
    */
   constructor() {
-    DomChangeListener.add('WoltLabSuite/Core/Ui/User/Trophy/List', this.rebuild.bind(this));
+    DomChangeListener.add("WoltLabSuite/Core/Ui/User/Trophy/List", this.rebuild.bind(this));
 
     this.rebuild();
   }
@@ -52,9 +51,9 @@ class UiUserTrophyList implements AjaxCallbackObject, DialogCallbackObject {
    * Adds event userTrophyOverlayList elements.
    */
   private rebuild(): void {
-    document.querySelectorAll('.userTrophyOverlayList').forEach((element: HTMLElement) => {
+    document.querySelectorAll(".userTrophyOverlayList").forEach((element: HTMLElement) => {
       if (!this.knownElements.has(element)) {
-        element.addEventListener('click', (ev) => this.open(element, ev));
+        element.addEventListener("click", (ev) => this.open(element, ev));
 
         this.knownElements.add(element);
       }
@@ -90,10 +89,10 @@ class UiUserTrophyList implements AjaxCallbackObject, DialogCallbackObject {
 
     if (data && data.has(this.currentPageNo)) {
       const dialog = UiDialog.open(this, data.get(this.currentPageNo)) as DialogData;
-      UiDialog.setTitle('userTrophyListOverlay', data.title);
+      UiDialog.setTitle("userTrophyListOverlay", data.title);
 
       if (data.pageCount > 1) {
-        const element = dialog.content.querySelector('.jsPagination') as HTMLElement;
+        const element = dialog.content.querySelector(".jsPagination") as HTMLElement;
         if (element !== null) {
           new UiPagination(element, {
             activePage: this.currentPageNo,
@@ -128,15 +127,15 @@ class UiUserTrophyList implements AjaxCallbackObject, DialogCallbackObject {
   _ajaxSetup() {
     return {
       data: {
-        actionName: 'getGroupedUserTrophyList',
-        className: 'wcf\\data\\user\\trophy\\UserTrophyAction',
+        actionName: "getGroupedUserTrophyList",
+        className: "wcf\\data\\user\\trophy\\UserTrophyAction",
       },
     };
   }
 
   _dialogSetup() {
     return {
-      id: 'userTrophyListOverlay',
+      id: "userTrophyListOverlay",
       options: {
         title: "",
       },
@@ -145,12 +144,12 @@ class UiUserTrophyList implements AjaxCallbackObject, DialogCallbackObject {
   }
 }
 
-export = UiUserTrophyList
+export = UiUserTrophyList;
 
 interface AjaxResponse extends DatabaseObjectActionResponse {
   returnValues: {
     pageCount?: number;
     template: string;
     title?: string;
-  }
+  };
 }
index 7c5788d3ecd9659ca465226ecc630f5ae20c1052..54dfeb3e40c0a691641780d3e5cd03c2043b06db 100644 (file)
@@ -9,8 +9,7 @@
  */
 
 class User {
-  constructor(readonly userId: number, readonly username: string, readonly link: string) {
-  }
+  constructor(readonly userId: number, readonly username: string, readonly link: string) {}
 }
 
 let user: User;
@@ -29,7 +28,7 @@ export = {
    */
   init(userId: number, username: string, link: string): void {
     if (user) {
-      throw new Error('User has already been initialized.');
+      throw new Error("User has already been initialized.");
     }
 
     user = new User(userId, username, link);
@@ -42,4 +41,4 @@ export = {
   get username(): string {
     return user.username;
   },
-}
+};