Clear a dialog callback on runtime
authorAlexander Ebert <ebert@woltlab.com>
Sun, 21 Feb 2021 11:20:48 +0000 (12:20 +0100)
committerAlexander Ebert <ebert@woltlab.com>
Sun, 21 Feb 2021 11:20:48 +0000 (12:20 +0100)
See #3932

ts/WoltLabSuite/Core/Acp/Ui/Worker.ts
ts/WoltLabSuite/Core/Ui/Dialog.ts
wcfsetup/install/files/js/WoltLabSuite/Core/Acp/Ui/Worker.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Dialog.js

index 43f425d6d13793ff37ef7eff2edbc0dd18b9ae94..55c1d1f6512dd3b82fb9f004e0ed0a7f659461aa 100644 (file)
@@ -100,7 +100,7 @@ class AcpUiWorker implements AjaxCallbackObject, DialogCallbackObject {
         parameters: data.parameters,
       });
     } else {
-      UiDialog.setCallback(this, "onClose", () => {});
+      UiDialog.removeCallback(this, "onClose");
 
       const spinner = content.querySelector(".fa-spinner") as HTMLSpanElement;
       spinner.classList.remove("fa-spinner");
index d09f55f71c095a72029112c6f629d61a0714adfb..2541f196d5bbfa2045a9fc3472fc2b7d58a3c896 100644 (file)
@@ -332,6 +332,29 @@ const UiDialog = {
     data[key] = value;
   },
 
+  /**
+   * Clears a callback function on runtime.
+   */
+  removeCallback(id: ElementIdOrCallbackObject, key: string): void {
+    if (typeof id === "object") {
+      const dialogData = _dialogObjects.get(id);
+      if (dialogData !== undefined) {
+        id = dialogData.id;
+      }
+    }
+
+    const data = _dialogs.get(id as string);
+    if (data === undefined) {
+      throw new Error(`Expected a valid dialog id, '${id as string}' does not match any active dialog.`);
+    }
+
+    if (_validCallbacks.indexOf(key) === -1) {
+      throw new Error("Invalid callback identifier, '" + key + "' is not recognized.");
+    }
+
+    data[key] = undefined;
+  },
+
   /**
    * Creates the DOM for a new dialog and opens it.
    */
index 7868d55ea6b413a6b26aa164442f9bbdee9154f8..561718e469e1826050b9339c2510775c842c5840 100644 (file)
@@ -57,7 +57,7 @@ define(["require", "exports", "tslib", "../../Ajax", "../../Core", "../../Langua
                 });
             }
             else {
-                Dialog_1.default.setCallback(this, "onClose", () => { });
+                Dialog_1.default.removeCallback(this, "onClose");
                 const spinner = content.querySelector(".fa-spinner");
                 spinner.classList.remove("fa-spinner");
                 spinner.classList.add("fa-check", "green");
index 5ed9e232f683e2682fb293c37ff0caa91d347d4a..be131e65954aab6b633dc0e06ad2a22cafdefad0 100644 (file)
@@ -275,6 +275,25 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
             }
             data[key] = value;
         },
+        /**
+         * Clears a callback function on runtime.
+         */
+        removeCallback(id, key) {
+            if (typeof id === "object") {
+                const dialogData = _dialogObjects.get(id);
+                if (dialogData !== undefined) {
+                    id = dialogData.id;
+                }
+            }
+            const data = _dialogs.get(id);
+            if (data === undefined) {
+                throw new Error(`Expected a valid dialog id, '${id}' does not match any active dialog.`);
+            }
+            if (_validCallbacks.indexOf(key) === -1) {
+                throw new Error("Invalid callback identifier, '" + key + "' is not recognized.");
+            }
+            data[key] = undefined;
+        },
         /**
          * Creates the DOM for a new dialog and opens it.
          */