Convert `Ui/Comment/Response/Edit` to TypeScript
authorAlexander Ebert <ebert@woltlab.com>
Fri, 6 Nov 2020 15:54:50 +0000 (16:54 +0100)
committerAlexander Ebert <ebert@woltlab.com>
Fri, 6 Nov 2020 15:54:50 +0000 (16:54 +0100)
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Comment/Response/Edit.js
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Comment/Response/Edit.js [deleted file]
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Comment/Response/Edit.ts [new file with mode: 0644]

index f7fd40137e4eef8a5af1621651403f84749549ed..c65c8fa963d30e911113eb5dc45ca1014490956c 100644 (file)
 /**
  * Provides editing support for comment responses.
  *
- * @author     Alexander Ebert
- * @copyright  2001-2019 WoltLab GmbH
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
- * @module     WoltLabSuite/Core/Ui/Comment/Response/Edit
+ * @author  Alexander Ebert
+ * @copyright  2001-2019 WoltLab GmbH
+ * @license  GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @module  WoltLabSuite/Core/Ui/Comment/Response/Edit
  */
-define([
-    'Ajax', 'Core', 'Dictionary', 'Environment',
-    'EventHandler', 'Language', 'List', 'Dom/ChangeListener', 'Dom/Traverse',
-    'Dom/Util', 'Ui/Notification', 'Ui/ReusableDropdown', 'WoltLabSuite/Core/Ui/Scroll', 'WoltLabSuite/Core/Ui/Comment/Edit'
-], function (Ajax, Core, Dictionary, Environment, EventHandler, Language, List, DomChangeListener, DomTraverse, DomUtil, UiNotification, UiReusableDropdown, UiScroll, UiCommentEdit) {
+define(["require", "exports", "tslib", "../../../Ajax", "../../../Core", "../../../Dom/Change/Listener", "../../../Dom/Util", "../Edit", "../../Notification"], function (require, exports, tslib_1, Ajax, Core, Listener_1, Util_1, Edit_1, UiNotification) {
     "use strict";
-    if (!COMPILER_TARGET_DEFAULT) {
-        var Fake = function () { };
-        Fake.prototype = {
-            init: function () { },
-            rebuild: function () { },
-            _click: function () { },
-            _prepare: function () { },
-            _showEditor: function () { },
-            _restoreMessage: function () { },
-            _save: function () { },
-            _validate: function () { },
-            throwError: function () { },
-            _showMessage: function () { },
-            _hideEditor: function () { },
-            _restoreEditor: function () { },
-            _destroyEditor: function () { },
-            _getEditorId: function () { },
-            _getObjectId: function () { },
-            _ajaxFailure: function () { },
-            _ajaxSuccess: function () { },
-            _ajaxSetup: function () { }
-        };
-        return Fake;
-    }
-    /**
-     * @constructor
-     */
-    function UiCommentResponseEdit(container) { this.init(container); }
-    Core.inherit(UiCommentResponseEdit, UiCommentEdit, {
+    Ajax = tslib_1.__importStar(Ajax);
+    Core = tslib_1.__importStar(Core);
+    Listener_1 = tslib_1.__importDefault(Listener_1);
+    Util_1 = tslib_1.__importDefault(Util_1);
+    Edit_1 = tslib_1.__importDefault(Edit_1);
+    UiNotification = tslib_1.__importStar(UiNotification);
+    class UiCommentResponseEdit extends Edit_1.default {
         /**
          * Initializes the comment edit manager.
          *
-         * @param      {Element}       container       container element
+         * @param  {Element}       container       container element
          */
-        init: function (container) {
-            this._activeElement = null;
-            this._callbackClick = null;
-            this._container = container;
-            this._editorContainer = null;
-            this._responses = new List();
-            this.rebuild();
-            DomChangeListener.add('Ui/Comment/Response/Edit_' + DomUtil.identify(this._container), this.rebuild.bind(this));
-        },
+        constructor(container) {
+            super(container);
+            this._responses = new Set();
+            this.rebuildResponses();
+            Listener_1.default.add("Ui/Comment/Response/Edit_" + Util_1.default.identify(this._container), () => this.rebuildResponses());
+        }
+        rebuild() {
+            // Do nothing, we want to avoid implicitly invoking `UiCommentEdit.rebuild()`.
+        }
         /**
          * Initializes each applicable message, should be called whenever new
          * messages are being displayed.
          */
-        rebuild: function () {
-            elBySelAll('.commentResponse', this._container, (function (response) {
+        rebuildResponses() {
+            this._container.querySelectorAll(".commentResponse").forEach((response) => {
                 if (this._responses.has(response)) {
                     return;
                 }
-                if (elDataBool(response, 'can-edit')) {
-                    var button = elBySel('.jsCommentResponseEditButton', response);
+                if (Core.stringToBool(response.dataset.canEdit || "")) {
+                    const button = response.querySelector(".jsCommentResponseEditButton");
                     if (button !== null) {
-                        if (this._callbackClick === null) {
-                            this._callbackClick = this._click.bind(this);
-                        }
-                        button.addEventListener('click', this._callbackClick);
+                        button.addEventListener("click", (ev) => this._click(ev));
                     }
                 }
                 this._responses.add(response);
-            }).bind(this));
-        },
+            });
+        }
         /**
          * Handles clicks on the edit button.
-         *
-         * @param      {?Event}        event           event object
-         * @protected
          */
-        _click: function (event) {
+        _click(event) {
             event.preventDefault();
             if (this._activeElement === null) {
-                this._activeElement = event.currentTarget.closest('.commentResponse');
+                const target = event.currentTarget;
+                this._activeElement = target.closest(".commentResponse");
                 this._prepare();
                 Ajax.api(this, {
-                    actionName: 'beginEdit',
-                    objectIDs: [this._getObjectId(this._activeElement)]
+                    actionName: "beginEdit",
+                    objectIDs: [this._getObjectId(this._activeElement)],
                 });
             }
             else {
-                UiNotification.show('wcf.message.error.editorAlreadyInUse', null, 'warning');
+                UiNotification.show("wcf.message.error.editorAlreadyInUse", null, "warning");
             }
-        },
+        }
         /**
          * Prepares the message for editor display.
          *
          * @protected
          */
-        _prepare: function () {
-            this._editorContainer = elCreate('div');
-            this._editorContainer.className = 'commentEditorContainer';
+        _prepare() {
+            this._editorContainer = document.createElement("div");
+            this._editorContainer.className = "commentEditorContainer";
             this._editorContainer.innerHTML = '<span class="icon icon48 fa-spinner"></span>';
-            var content = elBySel('.commentResponseContent', this._activeElement);
+            const content = this._activeElement.querySelector(".commentResponseContent");
             content.insertBefore(this._editorContainer, content.firstChild);
-        },
+        }
         /**
          * Shows the update message.
-         *
-         * @param      {Object}        data            ajax response data
-         * @protected
          */
-        _showMessage: function (data) {
+        _showMessage(data) {
             // set new content
-            //noinspection JSCheckFunctionSignatures
-            DomUtil.setInnerHtml(elBySel('.commentResponseContent .userMessage', this._editorContainer.parentNode), data.returnValues.message);
+            const parent = this._editorContainer.parentElement;
+            Util_1.default.setInnerHtml(parent.querySelector(".commentResponseContent .userMessage"), data.returnValues.message);
             this._restoreMessage();
             UiNotification.show();
-        },
+        }
         /**
          * Returns the unique editor id.
-         *
-         * @return     {string}        editor id
-         * @protected
          */
-        _getEditorId: function () {
-            return 'commentResponseEditor' + this._getObjectId(this._activeElement);
-        },
-        _ajaxSetup: function () {
-            var objectTypeId = ~~elData(this._container, 'object-type-id');
+        _getEditorId() {
+            return `commentResponseEditor${this._getObjectId(this._activeElement)}`;
+        }
+        _ajaxSetup() {
+            const objectTypeId = ~~this._container.dataset.objectTypeId;
             return {
                 data: {
-                    className: 'wcf\\data\\comment\\response\\CommentResponseAction',
+                    className: "wcf\\data\\comment\\response\\CommentResponseAction",
                     parameters: {
                         data: {
-                            objectTypeID: objectTypeId
-                        }
-                    }
+                            objectTypeID: objectTypeId,
+                        },
+                    },
                 },
-                silent: true
+                silent: true,
             };
         }
-    });
+    }
+    Core.enableLegacyInheritance(UiCommentResponseEdit);
     return UiCommentResponseEdit;
 });
diff --git a/wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Comment/Response/Edit.js b/wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Comment/Response/Edit.js
deleted file mode 100644 (file)
index a7c5244..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-/**
- * Provides editing support for comment responses.
- * 
- * @author     Alexander Ebert
- * @copyright  2001-2019 WoltLab GmbH
- * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
- * @module     WoltLabSuite/Core/Ui/Comment/Response/Edit
- */
-define(
-       [
-               'Ajax',         'Core',            'Dictionary',          'Environment',
-               'EventHandler', 'Language',        'List',                'Dom/ChangeListener', 'Dom/Traverse',
-               'Dom/Util',     'Ui/Notification', 'Ui/ReusableDropdown', 'WoltLabSuite/Core/Ui/Scroll', 'WoltLabSuite/Core/Ui/Comment/Edit'
-       ],
-       function(
-               Ajax,            Core,              Dictionary,            Environment,
-               EventHandler,    Language,          List,                  DomChangeListener,    DomTraverse,
-               DomUtil,         UiNotification,    UiReusableDropdown,    UiScroll, UiCommentEdit
-       )
-{
-       "use strict";
-       
-       if (!COMPILER_TARGET_DEFAULT) {
-               var Fake = function() {};
-               Fake.prototype = {
-                       init: function() {},
-                       rebuild: function() {},
-                       _click: function() {},
-                       _prepare: function() {},
-                       _showEditor: function() {},
-                       _restoreMessage: function() {},
-                       _save: function() {},
-                       _validate: function() {},
-                       throwError: function() {},
-                       _showMessage: function() {},
-                       _hideEditor: function() {},
-                       _restoreEditor: function() {},
-                       _destroyEditor: function() {},
-                       _getEditorId: function() {},
-                       _getObjectId: function() {},
-                       _ajaxFailure: function() {},
-                       _ajaxSuccess: function() {},
-                       _ajaxSetup: function() {}
-               };
-               return Fake;
-       }
-       
-       /**
-        * @constructor
-        */
-       function UiCommentResponseEdit(container) { this.init(container); }
-       Core.inherit(UiCommentResponseEdit, UiCommentEdit, {
-               /**
-                * Initializes the comment edit manager.
-                * 
-                * @param       {Element}       container       container element
-                */
-               init: function(container) {
-                       this._activeElement = null;
-                       this._callbackClick = null;
-                       this._container = container;
-                       this._editorContainer = null;
-                       this._responses = new List();
-                       
-                       this.rebuild();
-                       
-                       DomChangeListener.add('Ui/Comment/Response/Edit_' + DomUtil.identify(this._container), this.rebuild.bind(this));
-               },
-               
-               /**
-                * Initializes each applicable message, should be called whenever new
-                * messages are being displayed.
-                */
-               rebuild: function() {
-                       elBySelAll('.commentResponse', this._container, (function (response) {
-                               if (this._responses.has(response)) {
-                                       return;
-                               }
-                               
-                               if (elDataBool(response, 'can-edit')) {
-                                       var button = elBySel('.jsCommentResponseEditButton', response);
-                                       if (button !== null) {
-                                               if (this._callbackClick === null) {
-                                                       this._callbackClick = this._click.bind(this);
-                                               }
-                                               
-                                               button.addEventListener('click', this._callbackClick);
-                                       }
-                               }
-                               
-                               this._responses.add(response);
-                       }).bind(this));
-               },
-               
-               /**
-                * Handles clicks on the edit button.
-                *
-                * @param       {?Event}        event           event object
-                * @protected
-                */
-               _click: function(event) {
-                       event.preventDefault();
-                       
-                       if (this._activeElement === null) {
-                               this._activeElement = event.currentTarget.closest('.commentResponse');
-                               
-                               this._prepare();
-                               
-                               Ajax.api(this, {
-                                       actionName: 'beginEdit',
-                                       objectIDs: [this._getObjectId(this._activeElement)]
-                               });
-                       }
-                       else {
-                               UiNotification.show('wcf.message.error.editorAlreadyInUse', null, 'warning');
-                       }
-               },
-               
-               /**
-                * Prepares the message for editor display.
-                * 
-                * @protected
-                */
-               _prepare: function() {
-                       this._editorContainer = elCreate('div');
-                       this._editorContainer.className = 'commentEditorContainer';
-                       this._editorContainer.innerHTML = '<span class="icon icon48 fa-spinner"></span>';
-                       
-                       var content = elBySel('.commentResponseContent', this._activeElement);
-                       content.insertBefore(this._editorContainer, content.firstChild);
-               },
-               
-               /**
-                * Shows the update message.
-                * 
-                * @param       {Object}        data            ajax response data
-                * @protected
-                */
-               _showMessage: function(data) {
-                       // set new content
-                       //noinspection JSCheckFunctionSignatures
-                       DomUtil.setInnerHtml(elBySel('.commentResponseContent .userMessage', this._editorContainer.parentNode), data.returnValues.message);
-                       
-                       this._restoreMessage();
-                       
-                       UiNotification.show();
-               },
-               
-               /**
-                * Returns the unique editor id.
-                * 
-                * @return      {string}        editor id
-                * @protected
-                */
-               _getEditorId: function() {
-                       return 'commentResponseEditor' + this._getObjectId(this._activeElement);
-               },
-               
-               _ajaxSetup: function() {
-                       var objectTypeId = ~~elData(this._container, 'object-type-id');
-                       
-                       return {
-                               data: {
-                                       className: 'wcf\\data\\comment\\response\\CommentResponseAction',
-                                       parameters: {
-                                               data: {
-                                                       objectTypeID: objectTypeId
-                                               }
-                                       }
-                               },
-                               silent: true
-                       };
-               }
-       });
-       
-       return UiCommentResponseEdit;
-});
diff --git a/wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Comment/Response/Edit.ts b/wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/Comment/Response/Edit.ts
new file mode 100644 (file)
index 0000000..f28f11e
--- /dev/null
@@ -0,0 +1,143 @@
+/**
+ * Provides editing support for comment responses.
+ *
+ * @author  Alexander Ebert
+ * @copyright  2001-2019 WoltLab GmbH
+ * @license  GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @module  WoltLabSuite/Core/Ui/Comment/Response/Edit
+ */
+
+import * as Ajax from "../../../Ajax";
+import { AjaxCallbackSetup } from "../../../Ajax/Data";
+import * as Core from "../../../Core";
+import DomChangeListener from "../../../Dom/Change/Listener";
+import DomUtil from "../../../Dom/Util";
+import UiCommentEdit from "../Edit";
+import * as UiNotification from "../../Notification";
+
+interface AjaxResponse {
+  actionName: string;
+  returnValues: {
+    message: string;
+    template: string;
+  };
+}
+
+class UiCommentResponseEdit extends UiCommentEdit {
+  protected readonly _responses = new Set<HTMLElement>();
+
+  /**
+   * Initializes the comment edit manager.
+   *
+   * @param  {Element}       container       container element
+   */
+  constructor(container: HTMLElement) {
+    super(container);
+
+    this.rebuildResponses();
+
+    DomChangeListener.add("Ui/Comment/Response/Edit_" + DomUtil.identify(this._container), () =>
+      this.rebuildResponses(),
+    );
+  }
+
+  rebuild(): void {
+    // Do nothing, we want to avoid implicitly invoking `UiCommentEdit.rebuild()`.
+  }
+
+  /**
+   * Initializes each applicable message, should be called whenever new
+   * messages are being displayed.
+   */
+  rebuildResponses(): void {
+    this._container.querySelectorAll(".commentResponse").forEach((response: HTMLElement) => {
+      if (this._responses.has(response)) {
+        return;
+      }
+
+      if (Core.stringToBool(response.dataset.canEdit || "")) {
+        const button = response.querySelector(".jsCommentResponseEditButton") as HTMLAnchorElement;
+        if (button !== null) {
+          button.addEventListener("click", (ev) => this._click(ev));
+        }
+      }
+
+      this._responses.add(response);
+    });
+  }
+
+  /**
+   * Handles clicks on the edit button.
+   */
+  protected _click(event: MouseEvent): void {
+    event.preventDefault();
+
+    if (this._activeElement === null) {
+      const target = event.currentTarget as HTMLElement;
+      this._activeElement = target.closest(".commentResponse") as HTMLElement;
+
+      this._prepare();
+
+      Ajax.api(this, {
+        actionName: "beginEdit",
+        objectIDs: [this._getObjectId(this._activeElement)],
+      });
+    } else {
+      UiNotification.show("wcf.message.error.editorAlreadyInUse", null, "warning");
+    }
+  }
+
+  /**
+   * Prepares the message for editor display.
+   *
+   * @protected
+   */
+  protected _prepare(): void {
+    this._editorContainer = document.createElement("div");
+    this._editorContainer.className = "commentEditorContainer";
+    this._editorContainer.innerHTML = '<span class="icon icon48 fa-spinner"></span>';
+
+    const content = this._activeElement!.querySelector(".commentResponseContent")!;
+    content.insertBefore(this._editorContainer, content.firstChild);
+  }
+
+  /**
+   * Shows the update message.
+   */
+  protected _showMessage(data: AjaxResponse): void {
+    // set new content
+    const parent = this._editorContainer!.parentElement!;
+    DomUtil.setInnerHtml(parent.querySelector(".commentResponseContent .userMessage")!, data.returnValues.message);
+
+    this._restoreMessage();
+
+    UiNotification.show();
+  }
+
+  /**
+   * Returns the unique editor id.
+   */
+  protected _getEditorId(): string {
+    return `commentResponseEditor${this._getObjectId(this._activeElement!)}`;
+  }
+
+  _ajaxSetup(): ReturnType<AjaxCallbackSetup> {
+    const objectTypeId = ~~this._container.dataset.objectTypeId!;
+
+    return {
+      data: {
+        className: "wcf\\data\\comment\\response\\CommentResponseAction",
+        parameters: {
+          data: {
+            objectTypeID: objectTypeId,
+          },
+        },
+      },
+      silent: true,
+    };
+  }
+}
+
+Core.enableLegacyInheritance(UiCommentResponseEdit);
+
+export = UiCommentResponseEdit;