From a3764460e47ad4961393d9aed940af1cfd04d146 Mon Sep 17 00:00:00 2001 From: Christian Fehmer Date: Thu, 14 Aug 2025 11:30:06 +0200 Subject: [PATCH] impr(validation): don't debounce if delay is zero (@fehmer, @miodec) (#6878) after #6866 set debounceDelay to 0 for email validation --- .../src/ts/commandline/commandline-metadata.ts | 3 +++ frontend/src/ts/elements/input-validation.ts | 16 ++++++++++++++-- frontend/src/ts/modals/edit-tag.ts | 4 ++-- frontend/src/ts/modals/simple-modals.ts | 1 + 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/frontend/src/ts/commandline/commandline-metadata.ts b/frontend/src/ts/commandline/commandline-metadata.ts index df0978c61..a60cfa997 100644 --- a/frontend/src/ts/commandline/commandline-metadata.ts +++ b/frontend/src/ts/commandline/commandline-metadata.ts @@ -582,6 +582,9 @@ export const commandlineConfigMetadata: CommandlineConfigMetadataObject = { fontSize: { input: { inputValueConvert: Number, + validation: { + isValid: async (number: number) => number < 100, + }, }, }, fontFamily: { diff --git a/frontend/src/ts/elements/input-validation.ts b/frontend/src/ts/elements/input-validation.ts index 913714342..665f98051 100644 --- a/frontend/src/ts/elements/input-validation.ts +++ b/frontend/src/ts/elements/input-validation.ts @@ -36,6 +36,18 @@ export type Validation = { /** Resets the value to the current config if empty */ resetIfEmpty?: false; }; + +// oxlint-disable-next-line no-explicit-any +export function debounceIfNeeded any>( + delay: number, + callback: T +): T | debounce { + if (delay === undefined || delay <= 0) { + return callback; + } + return debounce(delay, callback); +} + /** * Create input handler for validated input element. * the `callback` is called for each validation state change, including "checking". @@ -51,7 +63,7 @@ export function createInputEventHandler( ): (e: Event) => Promise { let callIsValid = validation.isValid !== undefined - ? debounce( + ? debounceIfNeeded( validation.debounceDelay ?? 100, async ( originalInput: HTMLInputElement, @@ -115,7 +127,7 @@ export function createInputEventHandler( return; } - callIsValid(originalInput, currentValue, checkValue as T); + await callIsValid(originalInput, currentValue, checkValue as T); //call original handler if defined originalInput.oninput?.(e); }; diff --git a/frontend/src/ts/modals/edit-tag.ts b/frontend/src/ts/modals/edit-tag.ts index 27abc796d..701169818 100644 --- a/frontend/src/ts/modals/edit-tag.ts +++ b/frontend/src/ts/modals/edit-tag.ts @@ -21,7 +21,7 @@ const actionModals: Record = { { placeholder: "tag name", type: "text", - validation: { isValid: tagNameValidation }, + validation: { isValid: tagNameValidation, debounceDelay: 0 }, }, ], onlineOnly: true, @@ -63,7 +63,7 @@ const actionModals: Record = { { placeholder: "tag name", type: "text", - validation: { isValid: tagNameValidation }, + validation: { isValid: tagNameValidation, debounceDelay: 0 }, }, ], onlineOnly: true, diff --git a/frontend/src/ts/modals/simple-modals.ts b/frontend/src/ts/modals/simple-modals.ts index b8238a796..d5f4baa0b 100644 --- a/frontend/src/ts/modals/simple-modals.ts +++ b/frontend/src/ts/modals/simple-modals.ts @@ -247,6 +247,7 @@ list.updateEmail = new SimpleModal({ isValid: async (currentValue, thisPopup) => currentValue === thisPopup.inputs?.[1]?.currentValue() || "Emails don't match", + debounceDelay: 0, }, }, ],