diff --git a/web/src/elements/forms/Form.ts b/web/src/elements/forms/Form.ts index 2f68ca5e0..6da2baff7 100644 --- a/web/src/elements/forms/Form.ts +++ b/web/src/elements/forms/Form.ts @@ -197,17 +197,21 @@ export abstract class Form extends AKElement { "multiple" in inputElement.attributes ) { const selectElement = inputElement as unknown as HTMLSelectElement; - json[element.name] = Array.from(selectElement.selectedOptions).map((v) => v.value); + this.assignValue( + inputElement, + Array.from(selectElement.selectedOptions).map((v) => v.value), + json, + ); } else if ( inputElement.tagName.toLowerCase() === "input" && inputElement.type === "date" ) { - json[element.name] = inputElement.valueAsDate; + this.assignValue(inputElement, inputElement.valueAsDate, json); } else if ( inputElement.tagName.toLowerCase() === "input" && inputElement.type === "datetime-local" ) { - json[element.name] = new Date(inputElement.valueAsNumber); + this.assignValue(inputElement, new Date(inputElement.valueAsNumber), json); } else if ( inputElement.tagName.toLowerCase() === "input" && "type" in inputElement.dataset && @@ -215,19 +219,19 @@ export abstract class Form extends AKElement { ) { // Workaround for Firefox <93, since 92 and older don't support // datetime-local fields - json[element.name] = new Date(inputElement.value); + this.assignValue(inputElement, new Date(inputElement.value), json); } else if ( inputElement.tagName.toLowerCase() === "input" && inputElement.type === "checkbox" ) { - json[element.name] = inputElement.checked; + this.assignValue(inputElement, inputElement.checked, json); } else if ("selectedFlow" in inputElement) { - json[element.name] = inputElement.value; + this.assignValue(inputElement, inputElement.value, json); } else if (inputElement.tagName.toLowerCase() === "ak-search-select") { const select = inputElement as unknown as SearchSelect; try { const value = select.toForm(); - json[element.name] = value; + this.assignValue(inputElement, value, json); } catch (exc) { if (exc instanceof PreventFormSubmit) { throw new PreventFormSubmit(exc.message, element); @@ -235,16 +239,16 @@ export abstract class Form extends AKElement { throw exc; } } else { - this.serializeFieldRecursive(inputElement, inputElement.value, json); + this.assignValue(inputElement, inputElement.value, json); } }); return json as unknown as T; } /** - * As far as anyone can remember, this isn't being used. + * Recursively assign `value` into `json` while interpreting the dot-path of `element.name` */ - private serializeFieldRecursive( + private assignValue( element: HTMLInputElement, value: unknown, json: { [key: string]: unknown },