Improve typing in Form/Builder/Dialog.ts
authorTim Düsterhus <duesterhus@woltlab.com>
Thu, 11 Mar 2021 13:38:17 +0000 (14:38 +0100)
committerTim Düsterhus <duesterhus@woltlab.com>
Thu, 11 Mar 2021 13:39:47 +0000 (14:39 +0100)
see 155f9dd41571c72b79815783efc0924ff5279ad8

ts/WoltLabSuite/Core/Form/Builder/Data.ts
ts/WoltLabSuite/Core/Form/Builder/Dialog.ts
wcfsetup/install/files/js/WoltLabSuite/Core/Form/Builder/Dialog.js

index 20a39a7beaba9bcc59fc7d7e6fcd0c4b1b9a9f1f..b87b1c5ba091b9f247a272bac6d112f6fdead65b 100644 (file)
@@ -5,11 +5,6 @@ interface InternalFormBuilderData {
   [key: string]: any;
 }
 
-export interface AjaxResponseReturnValues {
-  dialog: string;
-  formId: string;
-}
-
 export type FormBuilderData = InternalFormBuilderData | Promise<InternalFormBuilderData>;
 
 export interface FormBuilderDialogOptions {
index 17b88324b4ab6af1d76ccf7c526fe5c8dcfa5dfd..0b607c91823a2990ef92f519ebe3dbf5d93eaa86 100644 (file)
@@ -14,10 +14,27 @@ import { DialogCallbackObject, DialogCallbackSetup, DialogData } from "../../Ui/
 import * as Ajax from "../../Ajax";
 import { AjaxCallbackObject, AjaxCallbackSetup, DatabaseObjectActionResponse, RequestOptions } from "../../Ajax/Data";
 import * as FormBuilderManager from "./Manager";
-import { AjaxResponseReturnValues, FormBuilderData, FormBuilderDialogOptions } from "./Data";
+import { FormBuilderData, FormBuilderDialogOptions } from "./Data";
+
+interface DialogResponse {
+  dialog: string;
+  formId: string;
+}
+
+function isDialogResponse(val: any): val is DialogResponse {
+  return val.dialog !== undefined && val.formId !== undefined;
+}
+
+function assertDialogResponse(val: any): asserts val is DialogResponse {
+  if (val.dialog === undefined) {
+    throw new Error("Missing dialog template in return data.");
+  } else if (val.formId === undefined) {
+    throw new Error("Missing form id in return data.");
+  }
+}
 
 interface AjaxResponse extends DatabaseObjectActionResponse {
-  returnValues: AjaxResponseReturnValues;
+  returnValues: DialogResponse | DatabaseObjectActionResponse["returnValues"];
 }
 
 class FormBuilderDialog implements AjaxCallbackObject, DialogCallbackObject {
@@ -82,19 +99,17 @@ class FormBuilderDialog implements AjaxCallbackObject, DialogCallbackObject {
       case this._actionName:
         if (data.returnValues === undefined) {
           throw new Error("Missing return data.");
-        } else if (data.returnValues.dialog === undefined) {
-          throw new Error("Missing dialog template in return data.");
-        } else if (data.returnValues.formId === undefined) {
-          throw new Error("Missing form id in return data.");
         }
 
+        assertDialogResponse(data.returnValues);
+
         this._openDialogContent(data.returnValues.formId, data.returnValues.dialog);
 
         break;
 
       case this._options.submitActionName:
         // If the validation failed, the dialog is shown again.
-        if (data.returnValues && data.returnValues.formId && data.returnValues.dialog) {
+        if (data.returnValues && isDialogResponse(data.returnValues)) {
           if (data.returnValues.formId !== this._formId) {
             throw new Error(
               "Mismatch between form ids: expected '" + this._formId + "' but got '" + data.returnValues.formId + "'.",
index c91d29e30e5bff175d29eff363a5189453df32d3..92d372dea3c8da73f0955a8a7888a0c3d90733b7 100644 (file)
@@ -13,6 +13,17 @@ define(["require", "exports", "tslib", "../../Core", "../../Ui/Dialog", "../../A
     Dialog_1 = tslib_1.__importDefault(Dialog_1);
     Ajax = tslib_1.__importStar(Ajax);
     FormBuilderManager = tslib_1.__importStar(FormBuilderManager);
+    function isDialogResponse(val) {
+        return val.dialog !== undefined && val.formId !== undefined;
+    }
+    function assertDialogResponse(val) {
+        if (val.dialog === undefined) {
+            throw new Error("Missing dialog template in return data.");
+        }
+        else if (val.formId === undefined) {
+            throw new Error("Missing form id in return data.");
+        }
+    }
     class FormBuilderDialog {
         constructor(dialogId, className, actionName, options) {
             this.init(dialogId, className, actionName, options);
@@ -54,17 +65,12 @@ define(["require", "exports", "tslib", "../../Core", "../../Ui/Dialog", "../../A
                     if (data.returnValues === undefined) {
                         throw new Error("Missing return data.");
                     }
-                    else if (data.returnValues.dialog === undefined) {
-                        throw new Error("Missing dialog template in return data.");
-                    }
-                    else if (data.returnValues.formId === undefined) {
-                        throw new Error("Missing form id in return data.");
-                    }
+                    assertDialogResponse(data.returnValues);
                     this._openDialogContent(data.returnValues.formId, data.returnValues.dialog);
                     break;
                 case this._options.submitActionName:
                     // If the validation failed, the dialog is shown again.
-                    if (data.returnValues && data.returnValues.formId && data.returnValues.dialog) {
+                    if (data.returnValues && isDialogResponse(data.returnValues)) {
                         if (data.returnValues.formId !== this._formId) {
                             throw new Error("Mismatch between form ids: expected '" + this._formId + "' but got '" + data.returnValues.formId + "'.");
                         }