Updated Form Error

This commit is contained in:
2025-08-17 21:20:01 +05:30
parent 0f8795dedf
commit 0c287ecae5
+52 -4
View File
@@ -15,6 +15,7 @@ interface Props extends HTMLAttributes<"form"> {
resetOnSubmit?: boolean; resetOnSubmit?: boolean;
validateOn?: string; validateOn?: string;
showSuccesInput?: boolean; showSuccesInput?: boolean;
formError?: string;
} }
const { const {
@@ -30,6 +31,7 @@ const {
resetOnSubmit = false, resetOnSubmit = false,
validateOn = "input,blur,change", validateOn = "input,blur,change",
showSuccesInput = false, showSuccesInput = false,
formError = "",
...rest ...rest
}: Props = Astro.props; }: Props = Astro.props;
@@ -57,6 +59,17 @@ const formId = `f-${Math.random().toString(36).slice(2)}`;
data-validateon={validateOn} data-validateon={validateOn}
novalidate novalidate
> >
<div
data-form-error
id={`${formId}-formerr`}
role="alert"
aria-live="polite"
class="wr:mt-2 wr:bg-red-100 wr:border wr:border-red-200 wr:text-sm wr:text-red-800 wr:rounded-lg wr:p-4 wr:dark:bg-red-800/10 wr:dark:border-red-900 wr:dark:text-red-500"
hidden={!formError}
>
{formError ?? ""}
</div>
<div> <div>
{ {
title && ( title && (
@@ -98,6 +111,7 @@ const formId = `f-${Math.random().toString(36).slice(2)}`;
]; ];
const form = document.getElementById(formId); const form = document.getElementById(formId);
if (!form || form.dataset.__afInit) return; if (!form || form.dataset.__afInit) return;
form.dataset.__afInit = "1"; form.dataset.__afInit = "1";
@@ -332,6 +346,12 @@ const formId = `f-${Math.random().toString(36).slice(2)}`;
setError(root, issue.message); setError(root, issue.message);
if (!firstRoot) firstRoot = root; if (!firstRoot) firstRoot = root;
} }
const globalIssue = (zodError.issues ?? []).find(
(i) => !i.path || i.path.length === 0,
);
setFormError(globalIssue?.message || "");
if (firstRoot) fieldControls(firstRoot).ctrls[0]?.focus(); if (firstRoot) fieldControls(firstRoot).ctrls[0]?.focus();
} }
@@ -374,6 +394,7 @@ const formId = `f-${Math.random().toString(36).slice(2)}`;
showErrors(form, result.error); showErrors(form, result.error);
return; return;
} }
setFormError("");
form.querySelectorAll("[data-field]").forEach(clearState); form.querySelectorAll("[data-field]").forEach(clearState);
if (!onSubmitName) { if (!onSubmitName) {
form.submit(); form.submit();
@@ -415,13 +436,40 @@ const formId = `f-${Math.random().toString(36).slice(2)}`;
form.addEventListener("wr:set-errors", (e) => { form.addEventListener("wr:set-errors", (e) => {
const map = e.detail || {}; const map = e.detail || {};
Object.entries(map).forEach(([name, message]) => { if ("_form" in map) setFormError(map._form);
for (const [key, val] of Object.entries(map)) {
if (key === "_form") continue;
const root = form.querySelector( const root = form.querySelector(
`[data-field="${CSS.escape(name)}"]`, `[data-field="${CSS.escape(key)}"]`,
); );
if (root) setError(root, message || "Invalid value"); if (root) {
}); setError(root, val);
}
}
}); });
const formErrEl = form.querySelector("[data-form-error]");
function setFormError(msg) {
if (!formErrEl) return;
if (msg && String(msg).trim()) {
formErrEl.textContent = String(msg);
formErrEl.hidden = false;
} else {
formErrEl.textContent = "";
formErrEl.hidden = true;
}
}
form.addEventListener("input", () => setFormError(""));
form.addEventListener("wr:set-form-error", (e) => {
const msg = e.detail;
setFormError(msg);
});
form.addEventListener("wr:clear-form-error", () => setFormError(""));
}; };
if (document.readyState === "loading") { if (document.readyState === "loading") {