gg-wf-scripts 2.8.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/action-engine.d.ts +2 -3
  2. package/dist/action-engine.js +59 -40
  3. package/dist/action-engine.js.map +1 -1
  4. package/dist/actions.d.ts +1 -10
  5. package/dist/actions.js +1 -11
  6. package/dist/actions.js.map +1 -1
  7. package/dist/attrs.d.ts +59 -0
  8. package/dist/attrs.js +67 -0
  9. package/dist/attrs.js.map +1 -0
  10. package/dist/auth.d.ts +3 -3
  11. package/dist/auth.js +6 -5
  12. package/dist/auth.js.map +1 -1
  13. package/dist/bridges.d.ts +1 -1
  14. package/dist/bridges.js +23 -13
  15. package/dist/bridges.js.map +1 -1
  16. package/dist/data-engine.d.ts +2 -3
  17. package/dist/data-engine.js +101 -106
  18. package/dist/data-engine.js.map +1 -1
  19. package/dist/dialog.d.ts +1 -1
  20. package/dist/dialog.js +15 -11
  21. package/dist/dialog.js.map +1 -1
  22. package/dist/dom-observer.d.ts +4 -0
  23. package/dist/dom-observer.js +47 -0
  24. package/dist/dom-observer.js.map +1 -0
  25. package/dist/engine-deps.d.ts +23 -0
  26. package/dist/engine-deps.js +2 -0
  27. package/dist/engine-deps.js.map +1 -0
  28. package/dist/errors.d.ts +25 -0
  29. package/dist/errors.js +30 -0
  30. package/dist/errors.js.map +1 -0
  31. package/dist/form-action-engine.d.ts +2 -3
  32. package/dist/form-action-engine.js +90 -73
  33. package/dist/form-action-engine.js.map +1 -1
  34. package/dist/form-actions.d.ts +1 -13
  35. package/dist/form-actions.js +1 -14
  36. package/dist/form-actions.js.map +1 -1
  37. package/dist/form-visibility.d.ts +1 -1
  38. package/dist/form-visibility.js +89 -88
  39. package/dist/form-visibility.js.map +1 -1
  40. package/dist/helpers/form-field.d.ts +19 -0
  41. package/dist/helpers/form-field.js +58 -0
  42. package/dist/helpers/form-field.js.map +1 -0
  43. package/dist/helpers/run-handler.d.ts +6 -2
  44. package/dist/helpers/run-handler.js +5 -2
  45. package/dist/helpers/run-handler.js.map +1 -1
  46. package/dist/index.d.ts +46 -14
  47. package/dist/index.js +43 -17
  48. package/dist/index.js.map +1 -1
  49. package/dist/queries.d.ts +1 -10
  50. package/dist/queries.js +1 -11
  51. package/dist/queries.js.map +1 -1
  52. package/dist/query-params.d.ts +1 -1
  53. package/dist/query-params.js +40 -22
  54. package/dist/query-params.js.map +1 -1
  55. package/dist/switch-engine.d.ts +1 -1
  56. package/dist/switch-engine.js +16 -9
  57. package/dist/switch-engine.js.map +1 -1
  58. package/package.json +8 -3
@@ -1,35 +1,33 @@
1
- import { formActionRegistry } from "./form-actions.js";
1
+ import { ATTR, SEL } from "./attrs.js";
2
2
  import { populateFields } from "./helpers/dom.js";
3
+ import { findInputs } from "./helpers/form-field.js";
3
4
  import { runHandler } from "./helpers/run-handler.js";
4
5
  import { runWithLoading } from "./helpers/run-with-loading.js";
6
+ import { onElement } from "./dom-observer.js";
5
7
  import { getParams } from "./query-params.js";
6
- function findInputs(form, name) {
7
- const escaped = CSS.escape(name);
8
- return form.querySelectorAll(`input[name="${escaped}"], select[name="${escaped}"], textarea[name="${escaped}"]`);
9
- }
10
8
  function clearFieldError(form, name) {
11
9
  findInputs(form, name).forEach((el) => {
12
- el.removeAttribute("gg-form-field-invalid");
10
+ el.removeAttribute(ATTR.formFieldInvalid);
13
11
  });
14
12
  const escaped = CSS.escape(name);
15
13
  form
16
- .querySelectorAll(`[gg-form-field-error="${escaped}"]`)
14
+ .querySelectorAll(`[${ATTR.formFieldError}="${escaped}"]`)
17
15
  .forEach((el) => {
18
16
  el.textContent = "";
19
17
  });
20
18
  }
21
19
  function clearFormErrors(form) {
22
- form.querySelectorAll("[gg-form-field-invalid]").forEach((el) => {
23
- el.removeAttribute("gg-form-field-invalid");
20
+ form.querySelectorAll(SEL.formFieldInvalid).forEach((el) => {
21
+ el.removeAttribute(ATTR.formFieldInvalid);
24
22
  });
25
- form.querySelectorAll("[gg-form-field-error]").forEach((el) => {
23
+ form.querySelectorAll(SEL.formFieldError).forEach((el) => {
26
24
  el.textContent = "";
27
25
  });
28
- form.querySelectorAll("[gg-form-error]").forEach((el) => {
26
+ form.querySelectorAll(SEL.formError).forEach((el) => {
29
27
  el.textContent = "";
30
28
  });
31
- form.querySelectorAll("[gg-form-error-list]").forEach((list) => {
32
- const template = list.querySelector("[gg-list-template]");
29
+ form.querySelectorAll(SEL.formErrorList).forEach((list) => {
30
+ const template = list.querySelector(SEL.listTemplate);
33
31
  Array.from(list.children).forEach((child) => {
34
32
  if (child !== template)
35
33
  child.remove();
@@ -41,26 +39,26 @@ function applyFieldErrors(form, fieldErrors) {
41
39
  if (!name)
42
40
  return;
43
41
  findInputs(form, name).forEach((el) => {
44
- el.setAttribute("gg-form-field-invalid", "true");
42
+ el.setAttribute(ATTR.formFieldInvalid, "true");
45
43
  });
46
44
  const escaped = CSS.escape(name);
47
45
  form
48
- .querySelectorAll(`[gg-form-field-error="${escaped}"]`)
46
+ .querySelectorAll(`[${ATTR.formFieldError}="${escaped}"]`)
49
47
  .forEach((el) => {
50
48
  el.textContent = message ?? "";
51
49
  });
52
50
  });
53
51
  }
54
52
  function applyErrorList(form, fieldErrors) {
55
- form.querySelectorAll("[gg-form-error-list]").forEach((list) => {
56
- const template = list.querySelector("[gg-list-template]");
53
+ form.querySelectorAll(SEL.formErrorList).forEach((list) => {
54
+ const template = list.querySelector(SEL.listTemplate);
57
55
  if (!template) {
58
- console.warn("[gg-form-error-list] no [gg-list-template] inside list:", list);
56
+ console.warn(`[${ATTR.formErrorList}] no [${ATTR.listTemplate}] inside list:`, list);
59
57
  return;
60
58
  }
61
59
  fieldErrors.forEach((record) => {
62
60
  const clone = template.cloneNode(true);
63
- clone.removeAttribute("gg-list-template");
61
+ clone.removeAttribute(ATTR.listTemplate);
64
62
  clone.style.display = "";
65
63
  populateFields(clone, record);
66
64
  list.appendChild(clone);
@@ -71,7 +69,7 @@ function applyFormError(form, error) {
71
69
  if (error == null)
72
70
  return;
73
71
  const message = typeof error === "string" ? error : String(error);
74
- form.querySelectorAll("[gg-form-error]").forEach((el) => {
72
+ form.querySelectorAll(SEL.formError).forEach((el) => {
75
73
  el.textContent = message;
76
74
  });
77
75
  }
@@ -86,71 +84,90 @@ function bindFieldClearOnInput(form) {
86
84
  const name = target.getAttribute("name");
87
85
  if (!name)
88
86
  return;
89
- if (target.hasAttribute("gg-form-field-invalid")) {
87
+ if (target.hasAttribute(ATTR.formFieldInvalid)) {
90
88
  clearFieldError(form, name);
91
89
  }
92
90
  });
93
91
  }
94
- export function initFormActionEngine(context, { debug = false } = {}) {
95
- async function handleSubmit(form, event) {
96
- const id = form.getAttribute("gg-form-action");
97
- if (!id)
98
- return;
99
- const action = formActionRegistry[id];
100
- if (!action) {
101
- console.warn(`[gg-form-action] no form action registered for "${id}"`);
102
- return;
103
- }
104
- event.preventDefault();
105
- if (form.hasAttribute("gg-loading"))
106
- return;
107
- if (form.hasAttribute("gg-confirm")) {
108
- const text = form.getAttribute("gg-confirm-text") || "Are you sure?";
109
- if (!window.confirm(text))
110
- return;
111
- }
112
- clearFormErrors(form);
113
- const formData = new FormData(form);
114
- const params = getParams();
115
- const submitControls = form.querySelectorAll('button[type="submit"], button:not([type]), input[type="submit"]');
116
- const handlerResult = await runWithLoading([form, ...submitControls], () => runHandler({
92
+ async function handleSubmit(form, event, deps) {
93
+ const id = form.getAttribute(ATTR.formAction);
94
+ if (!id)
95
+ return;
96
+ const action = deps.formActions[id];
97
+ if (!action) {
98
+ console.warn(`[gg-form-action] no form action registered for "${id}"`);
99
+ deps.emitError({
117
100
  prefix: "[gg-form-action]",
118
101
  id,
119
- fields: {
120
- form,
121
- formData: Object.fromEntries(formData),
122
- params: Object.fromEntries(params),
123
- },
124
- debug,
125
- }, () => action(context, formData, params)));
126
- if (!handlerResult.ok) {
127
- applyFormError(form, "Something went wrong. Please try again.");
102
+ error: "no form action registered",
103
+ fields: { form },
104
+ });
105
+ return;
106
+ }
107
+ event.preventDefault();
108
+ if (form.hasAttribute(ATTR.loading))
109
+ return;
110
+ if (form.hasAttribute(ATTR.confirm)) {
111
+ const text = form.getAttribute(ATTR.confirmText) || "Are you sure?";
112
+ if (!window.confirm(text))
128
113
  return;
114
+ }
115
+ clearFormErrors(form);
116
+ const formData = new FormData(form);
117
+ const params = getParams();
118
+ const submitControls = form.querySelectorAll('button[type="submit"], button:not([type]), input[type="submit"]');
119
+ const handlerResult = await runWithLoading([form, ...submitControls], () => runHandler({
120
+ prefix: "[gg-form-action]",
121
+ id,
122
+ fields: {
123
+ form,
124
+ formData: Object.fromEntries(formData),
125
+ params: Object.fromEntries(params),
126
+ },
127
+ debug: deps.debug,
128
+ emitError: deps.emitError,
129
+ }, () => action(deps.context, formData, params)));
130
+ if (!handlerResult.ok) {
131
+ applyFormError(form, "Something went wrong. Please try again.");
132
+ return;
133
+ }
134
+ const result = handlerResult.value;
135
+ if (result && result.ok === false) {
136
+ const failure = result;
137
+ const fieldErrors = Array.isArray(failure.field_errors)
138
+ ? failure.field_errors
139
+ : [];
140
+ applyFieldErrors(form, fieldErrors);
141
+ applyErrorList(form, fieldErrors);
142
+ applyFormError(form, failure.error);
143
+ if (!fieldErrors.length && failure.error == null) {
144
+ console.warn(`[gg-form-action] "${id}" returned ok:false with no error or field_errors`);
129
145
  }
130
- const result = handlerResult.value;
131
- if (result && result.ok === false) {
132
- const failure = result;
133
- const fieldErrors = Array.isArray(failure.field_errors)
134
- ? failure.field_errors
135
- : [];
136
- applyFieldErrors(form, fieldErrors);
137
- applyErrorList(form, fieldErrors);
138
- applyFormError(form, failure.error);
139
- if (!fieldErrors.length && failure.error == null) {
140
- console.warn(`[gg-form-action] "${id}" returned ok:false with no error or field_errors`);
141
- }
142
- }
146
+ deps.emitError({
147
+ prefix: "[gg-form-action]",
148
+ id,
149
+ error: failure.error ?? "validation",
150
+ fields: { form, fieldErrors },
151
+ });
143
152
  }
144
- document
145
- .querySelectorAll("form[gg-form-action]")
146
- .forEach(bindFieldClearOnInput);
147
- document.addEventListener("submit", (e) => {
153
+ }
154
+ export function initFormActionEngine(deps) {
155
+ const unbind = onElement(SEL.formAction, (el) => {
156
+ if (el instanceof HTMLFormElement)
157
+ bindFieldClearOnInput(el);
158
+ });
159
+ const onSubmit = (e) => {
148
160
  const form = e.target;
149
161
  if (form instanceof HTMLFormElement &&
150
- form.hasAttribute("gg-form-action")) {
162
+ form.hasAttribute(ATTR.formAction)) {
151
163
  bindFieldClearOnInput(form);
152
- handleSubmit(form, e);
164
+ handleSubmit(form, e, deps);
153
165
  }
154
- });
166
+ };
167
+ document.addEventListener("submit", onSubmit);
168
+ return () => {
169
+ unbind();
170
+ document.removeEventListener("submit", onSubmit);
171
+ };
155
172
  }
156
173
  //# sourceMappingURL=form-action-engine.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"form-action-engine.js","sourceRoot":"","sources":["../src/form-action-engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"form-action-engine.js","sourceRoot":"","sources":["../src/form-action-engine.ts"],"names":[],"mappings":"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"}
@@ -7,16 +7,4 @@ export type FormActionResult = {
7
7
  error?: unknown;
8
8
  field_errors?: FormFieldError[];
9
9
  };
10
- export type FormAction = (context: unknown, formData: FormData, params: URLSearchParams) => Promise<FormActionResult | void> | FormActionResult | void;
11
- export declare const formActionRegistry: Record<string, FormAction>;
12
- /**
13
- * Register a form action triggered by submitting a form with gg-form-action="<id>".
14
- *
15
- * Receives the context object passed to init(), a FormData snapshot of the submitted form,
16
- * and a URLSearchParams snapshot of the current URL query string. Return:
17
- * - { ok: true } on success
18
- * - { ok: false, field_errors: [{ name, message }, ...] } for validation errors
19
- * - { ok: false, error: "..." } for a single form-level error
20
- * - Both field_errors and error may be present together.
21
- */
22
- export declare function registerFormAction(id: string, fn: FormAction): void;
10
+ export type FormAction<TContext = unknown> = (context: TContext, formData: FormData, params: URLSearchParams) => Promise<FormActionResult | void> | FormActionResult | void;
@@ -1,15 +1,2 @@
1
- export const formActionRegistry = {};
2
- /**
3
- * Register a form action triggered by submitting a form with gg-form-action="<id>".
4
- *
5
- * Receives the context object passed to init(), a FormData snapshot of the submitted form,
6
- * and a URLSearchParams snapshot of the current URL query string. Return:
7
- * - { ok: true } on success
8
- * - { ok: false, field_errors: [{ name, message }, ...] } for validation errors
9
- * - { ok: false, error: "..." } for a single form-level error
10
- * - Both field_errors and error may be present together.
11
- */
12
- export function registerFormAction(id, fn) {
13
- formActionRegistry[id] = fn;
14
- }
1
+ export {};
15
2
  //# sourceMappingURL=form-actions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"form-actions.js","sourceRoot":"","sources":["../src/form-actions.ts"],"names":[],"mappings":"AAcA,MAAM,CAAC,MAAM,kBAAkB,GAA+B,EAAE,CAAC;AAEjE;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAU,EAAE,EAAc;IAC3D,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"form-actions.js","sourceRoot":"","sources":["../src/form-actions.ts"],"names":[],"mappings":""}
@@ -1 +1 @@
1
- export declare function initFormVisibility(): void;
1
+ export declare function initFormVisibility(): () => void;
@@ -1,3 +1,6 @@
1
+ import { ATTR, SEL } from "./attrs.js";
2
+ import { readField } from "./helpers/form-field.js";
3
+ import { onElement } from "./dom-observer.js";
1
4
  const TRANSITION_MS = 200;
2
5
  function parseConditions(attr) {
3
6
  return attr
@@ -8,101 +11,99 @@ function parseConditions(attr) {
8
11
  })
9
12
  .filter((p) => p.name && p.value);
10
13
  }
11
- function getFieldValue(scope, name) {
12
- const escaped = CSS.escape(name);
13
- const inputs = scope.querySelectorAll(`input[name="${escaped}"], select[name="${escaped}"], textarea[name="${escaped}"]`);
14
- if (!inputs.length)
15
- return null;
16
- const first = inputs[0];
17
- const type = (first.getAttribute("type") || "").toLowerCase();
18
- if (type === "radio" || type === "checkbox") {
19
- for (const input of inputs) {
20
- if (input instanceof HTMLInputElement && input.checked)
21
- return input.value;
14
+ function matchesAny(scope, conditions) {
15
+ return conditions.some(({ name, value }) => readField(scope, name) === value);
16
+ }
17
+ const bindings = new WeakMap();
18
+ function setupVisibility(el) {
19
+ if (bindings.has(el))
20
+ return;
21
+ const attr = el.getAttribute(ATTR.visibleWhen);
22
+ if (!attr)
23
+ return;
24
+ const scope = el.closest(SEL.formScopeOrForm);
25
+ if (!scope) {
26
+ console.warn(`[${ATTR.visibleWhen}] element is not inside a <form> or [${ATTR.formScope}]:`, el);
27
+ return;
28
+ }
29
+ const conditions = parseConditions(attr);
30
+ el.style.transition = "none";
31
+ el.style.opacity = "0";
32
+ el.style.display = "none";
33
+ el.style.pointerEvents = "none";
34
+ el.setAttribute("inert", "");
35
+ el.setAttribute("aria-hidden", "true");
36
+ let lastState = false;
37
+ let hideTimer;
38
+ function show() {
39
+ if (hideTimer !== undefined) {
40
+ clearTimeout(hideTimer);
41
+ hideTimer = undefined;
22
42
  }
23
- return null;
43
+ el.removeAttribute("inert");
44
+ el.removeAttribute("aria-hidden");
45
+ el.style.display = "";
46
+ el.style.pointerEvents = "";
47
+ requestAnimationFrame(() => {
48
+ el.style.opacity = "1";
49
+ });
24
50
  }
25
- return first.value.trim();
26
- }
27
- function matchesAny(scope, conditions) {
28
- return conditions.some(({ name, value }) => getFieldValue(scope, name) === value);
51
+ function hide() {
52
+ el.style.opacity = "0";
53
+ el.style.pointerEvents = "none";
54
+ el.setAttribute("inert", "");
55
+ el.setAttribute("aria-hidden", "true");
56
+ hideTimer = setTimeout(() => {
57
+ el.style.display = "none";
58
+ hideTimer = undefined;
59
+ }, TRANSITION_MS);
60
+ }
61
+ function evaluate() {
62
+ const shouldShow = matchesAny(scope, conditions);
63
+ if (shouldShow === lastState)
64
+ return;
65
+ lastState = shouldShow;
66
+ if (shouldShow)
67
+ show();
68
+ else
69
+ hide();
70
+ }
71
+ scope.addEventListener("change", evaluate);
72
+ scope.addEventListener("input", evaluate);
73
+ requestAnimationFrame(() => {
74
+ el.style.transition = `opacity ${TRANSITION_MS}ms ease`;
75
+ evaluate();
76
+ });
77
+ bindings.set(el, {
78
+ el,
79
+ scope,
80
+ conditions,
81
+ evaluate,
82
+ cleanup: () => {
83
+ scope.removeEventListener("change", evaluate);
84
+ scope.removeEventListener("input", evaluate);
85
+ if (hideTimer !== undefined)
86
+ clearTimeout(hideTimer);
87
+ },
88
+ });
29
89
  }
30
90
  export function initFormVisibility() {
31
- // Group all [gg-visible-when] elements by their nearest scope —
32
- // either an explicit [gg-form-scope] or a <form>.
33
- const scopeTargets = new Map();
34
- document.querySelectorAll("[gg-visible-when]").forEach((el) => {
35
- if (!Boolean(el.getAttribute("gg-visible-when"))) {
36
- return;
37
- }
38
- const scope = el.closest("[gg-form-scope], form");
39
- if (!scope) {
40
- console.warn("[gg-visible-when] element is not inside a <form> or [gg-form-scope]:", el);
91
+ const tracked = [];
92
+ const unbind = onElement(SEL.visibleWhen, (el) => {
93
+ if (!(el instanceof HTMLElement))
41
94
  return;
42
- }
43
- if (!scopeTargets.has(scope))
44
- scopeTargets.set(scope, []);
45
- scopeTargets.get(scope).push(el);
95
+ tracked.push(el);
96
+ setupVisibility(el);
46
97
  });
47
- scopeTargets.forEach((targets, scope) => {
48
- const conditions = new WeakMap();
49
- const lastState = new WeakMap();
50
- const hideTimers = new WeakMap();
51
- targets.forEach((el) => {
52
- conditions.set(el, parseConditions(el.getAttribute("gg-visible-when") ?? ""));
53
- el.style.transition = "none";
54
- el.style.opacity = "0";
55
- el.style.display = "none";
56
- el.style.pointerEvents = "none";
57
- el.setAttribute("inert", "");
58
- el.setAttribute("aria-hidden", "true");
59
- lastState.set(el, false);
60
- });
61
- function show(el) {
62
- const pending = hideTimers.get(el);
63
- if (pending) {
64
- clearTimeout(pending);
65
- hideTimers.delete(el);
98
+ return () => {
99
+ unbind();
100
+ tracked.forEach((el) => {
101
+ const b = bindings.get(el);
102
+ if (b) {
103
+ b.cleanup();
104
+ bindings.delete(el);
66
105
  }
67
- el.removeAttribute("inert");
68
- el.removeAttribute("aria-hidden");
69
- el.style.display = "";
70
- el.style.pointerEvents = "";
71
- requestAnimationFrame(() => {
72
- el.style.opacity = "1";
73
- });
74
- }
75
- function hide(el) {
76
- el.style.opacity = "0";
77
- el.style.pointerEvents = "none";
78
- el.setAttribute("inert", "");
79
- el.setAttribute("aria-hidden", "true");
80
- const t = setTimeout(() => {
81
- el.style.display = "none";
82
- hideTimers.delete(el);
83
- }, TRANSITION_MS);
84
- hideTimers.set(el, t);
85
- }
86
- function evaluate() {
87
- targets.forEach((el) => {
88
- const shouldShow = matchesAny(scope, conditions.get(el) ?? []);
89
- if (shouldShow === lastState.get(el))
90
- return;
91
- lastState.set(el, shouldShow);
92
- if (shouldShow)
93
- show(el);
94
- else
95
- hide(el);
96
- });
97
- }
98
- requestAnimationFrame(() => {
99
- targets.forEach((el) => {
100
- el.style.transition = `opacity ${TRANSITION_MS}ms ease`;
101
- });
102
- evaluate();
103
106
  });
104
- scope.addEventListener("change", evaluate);
105
- scope.addEventListener("input", evaluate);
106
- });
107
+ };
107
108
  }
108
109
  //# sourceMappingURL=form-visibility.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"form-visibility.js","sourceRoot":"","sources":["../src/form-visibility.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"form-visibility.js","sourceRoot":"","sources":["../src/form-visibility.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export type FieldInput = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;
2
+ /**
3
+ * Find every named input/select/textarea matching `name` within `scope`.
4
+ * Used by the data engine, form-action engine, and form-visibility — anywhere
5
+ * we need to read or write a form field by its `name` attribute.
6
+ */
7
+ export declare function findInputs(scope: ParentNode, name: string): FieldInput[];
8
+ /**
9
+ * Read the current value of a named field. For radio/checkbox groups, returns
10
+ * the value of the checked input (or null if none checked). Returns null when
11
+ * no matching input exists. Trimmed for text-like inputs.
12
+ */
13
+ export declare function readField(scope: ParentNode, name: string): string | null;
14
+ /**
15
+ * Write a value into every input matching `name`, dispatching input/change so
16
+ * downstream listeners (visibility, query-bind) react. Skipped when value is
17
+ * null/undefined, so callers can pass `getPath(record, name)` directly.
18
+ */
19
+ export declare function writeField(scope: ParentNode, name: string, value: unknown): void;
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Find every named input/select/textarea matching `name` within `scope`.
3
+ * Used by the data engine, form-action engine, and form-visibility — anywhere
4
+ * we need to read or write a form field by its `name` attribute.
5
+ */
6
+ export function findInputs(scope, name) {
7
+ const escaped = CSS.escape(name);
8
+ return Array.from(scope.querySelectorAll(`input[name="${escaped}"], select[name="${escaped}"], textarea[name="${escaped}"]`));
9
+ }
10
+ /**
11
+ * Read the current value of a named field. For radio/checkbox groups, returns
12
+ * the value of the checked input (or null if none checked). Returns null when
13
+ * no matching input exists. Trimmed for text-like inputs.
14
+ */
15
+ export function readField(scope, name) {
16
+ const inputs = findInputs(scope, name);
17
+ if (!inputs.length)
18
+ return null;
19
+ const first = inputs[0];
20
+ const type = (first.getAttribute("type") || "").toLowerCase();
21
+ if (type === "radio" || type === "checkbox") {
22
+ for (const input of inputs) {
23
+ if (input instanceof HTMLInputElement && input.checked) {
24
+ return input.value;
25
+ }
26
+ }
27
+ return null;
28
+ }
29
+ return first.value.trim();
30
+ }
31
+ /**
32
+ * Write a value into every input matching `name`, dispatching input/change so
33
+ * downstream listeners (visibility, query-bind) react. Skipped when value is
34
+ * null/undefined, so callers can pass `getPath(record, name)` directly.
35
+ */
36
+ export function writeField(scope, name, value) {
37
+ if (value == null)
38
+ return;
39
+ findInputs(scope, name).forEach((el) => {
40
+ if (el instanceof HTMLInputElement) {
41
+ if (el.type === "checkbox") {
42
+ el.checked = Boolean(value);
43
+ }
44
+ else if (el.type === "radio") {
45
+ el.checked = String(el.value) === String(value);
46
+ }
47
+ else {
48
+ el.value = String(value);
49
+ }
50
+ }
51
+ else {
52
+ el.value = String(value);
53
+ }
54
+ el.dispatchEvent(new Event("input", { bubbles: true }));
55
+ el.dispatchEvent(new Event("change", { bubbles: true }));
56
+ });
57
+ }
58
+ //# sourceMappingURL=form-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-field.js","sourceRoot":"","sources":["../../src/helpers/form-field.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,KAAiB,EAAE,IAAY;IACxD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC,IAAI,CACf,KAAK,CAAC,gBAAgB,CACpB,eAAe,OAAO,oBAAoB,OAAO,sBAAsB,OAAO,IAAI,CACnF,CACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,KAAiB,EAAE,IAAY;IACvD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEhC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9D,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QAC5C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,YAAY,gBAAgB,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBACvD,OAAO,KAAK,CAAC,KAAK,CAAC;YACrB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,KAAiB,EACjB,IAAY,EACZ,KAAc;IAEd,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO;IAC1B,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;QACrC,IAAI,EAAE,YAAY,gBAAgB,EAAE,CAAC;YACnC,IAAI,EAAE,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC3B,EAAE,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;iBAAM,IAAI,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC/B,EAAE,CAAC,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QACD,EAAE,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACxD,EAAE,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC"}