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.
- package/dist/action-engine.d.ts +2 -3
- package/dist/action-engine.js +59 -40
- package/dist/action-engine.js.map +1 -1
- package/dist/actions.d.ts +1 -10
- package/dist/actions.js +1 -11
- package/dist/actions.js.map +1 -1
- package/dist/attrs.d.ts +59 -0
- package/dist/attrs.js +67 -0
- package/dist/attrs.js.map +1 -0
- package/dist/auth.d.ts +3 -3
- package/dist/auth.js +6 -5
- package/dist/auth.js.map +1 -1
- package/dist/bridges.d.ts +1 -1
- package/dist/bridges.js +23 -13
- package/dist/bridges.js.map +1 -1
- package/dist/data-engine.d.ts +2 -3
- package/dist/data-engine.js +101 -106
- package/dist/data-engine.js.map +1 -1
- package/dist/dialog.d.ts +1 -1
- package/dist/dialog.js +15 -11
- package/dist/dialog.js.map +1 -1
- package/dist/dom-observer.d.ts +4 -0
- package/dist/dom-observer.js +47 -0
- package/dist/dom-observer.js.map +1 -0
- package/dist/engine-deps.d.ts +23 -0
- package/dist/engine-deps.js +2 -0
- package/dist/engine-deps.js.map +1 -0
- package/dist/errors.d.ts +25 -0
- package/dist/errors.js +30 -0
- package/dist/errors.js.map +1 -0
- package/dist/form-action-engine.d.ts +2 -3
- package/dist/form-action-engine.js +90 -73
- package/dist/form-action-engine.js.map +1 -1
- package/dist/form-actions.d.ts +1 -13
- package/dist/form-actions.js +1 -14
- package/dist/form-actions.js.map +1 -1
- package/dist/form-visibility.d.ts +1 -1
- package/dist/form-visibility.js +89 -88
- package/dist/form-visibility.js.map +1 -1
- package/dist/helpers/form-field.d.ts +19 -0
- package/dist/helpers/form-field.js +58 -0
- package/dist/helpers/form-field.js.map +1 -0
- package/dist/helpers/run-handler.d.ts +6 -2
- package/dist/helpers/run-handler.js +5 -2
- package/dist/helpers/run-handler.js.map +1 -1
- package/dist/index.d.ts +46 -14
- package/dist/index.js +43 -17
- package/dist/index.js.map +1 -1
- package/dist/queries.d.ts +1 -10
- package/dist/queries.js +1 -11
- package/dist/queries.js.map +1 -1
- package/dist/query-params.d.ts +1 -1
- package/dist/query-params.js +40 -22
- package/dist/query-params.js.map +1 -1
- package/dist/switch-engine.d.ts +1 -1
- package/dist/switch-engine.js +16 -9
- package/dist/switch-engine.js.map +1 -1
- package/package.json +8 -3
|
@@ -1,35 +1,33 @@
|
|
|
1
|
-
import {
|
|
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(
|
|
10
|
+
el.removeAttribute(ATTR.formFieldInvalid);
|
|
13
11
|
});
|
|
14
12
|
const escaped = CSS.escape(name);
|
|
15
13
|
form
|
|
16
|
-
.querySelectorAll(`[
|
|
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(
|
|
23
|
-
el.removeAttribute(
|
|
20
|
+
form.querySelectorAll(SEL.formFieldInvalid).forEach((el) => {
|
|
21
|
+
el.removeAttribute(ATTR.formFieldInvalid);
|
|
24
22
|
});
|
|
25
|
-
form.querySelectorAll(
|
|
23
|
+
form.querySelectorAll(SEL.formFieldError).forEach((el) => {
|
|
26
24
|
el.textContent = "";
|
|
27
25
|
});
|
|
28
|
-
form.querySelectorAll(
|
|
26
|
+
form.querySelectorAll(SEL.formError).forEach((el) => {
|
|
29
27
|
el.textContent = "";
|
|
30
28
|
});
|
|
31
|
-
form.querySelectorAll(
|
|
32
|
-
const template = list.querySelector(
|
|
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(
|
|
42
|
+
el.setAttribute(ATTR.formFieldInvalid, "true");
|
|
45
43
|
});
|
|
46
44
|
const escaped = CSS.escape(name);
|
|
47
45
|
form
|
|
48
|
-
.querySelectorAll(`[
|
|
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(
|
|
56
|
-
const template = list.querySelector(
|
|
53
|
+
form.querySelectorAll(SEL.formErrorList).forEach((list) => {
|
|
54
|
+
const template = list.querySelector(SEL.listTemplate);
|
|
57
55
|
if (!template) {
|
|
58
|
-
console.warn(
|
|
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(
|
|
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(
|
|
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(
|
|
87
|
+
if (target.hasAttribute(ATTR.formFieldInvalid)) {
|
|
90
88
|
clearFieldError(form, name);
|
|
91
89
|
}
|
|
92
90
|
});
|
|
93
91
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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(
|
|
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":"
|
|
1
|
+
{"version":3,"file":"form-action-engine.js","sourceRoot":"","sources":["../src/form-action-engine.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,SAAS,eAAe,CAAC,IAAqB,EAAE,IAAY;IAC1D,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;QACpC,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI;SACD,gBAAgB,CAAC,IAAI,IAAI,CAAC,cAAc,KAAK,OAAO,IAAI,CAAC;SACzD,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;QACd,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,eAAe,CAAC,IAAqB;IAC5C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;QACzD,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;QACvD,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;QAClD,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC1C,IAAI,KAAK,KAAK,QAAQ;gBAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CACvB,IAAqB,EACrB,WAA6B;IAE7B,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QACxC,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YACpC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI;aACD,gBAAgB,CAAC,IAAI,IAAI,CAAC,cAAc,KAAK,OAAO,IAAI,CAAC;aACzD,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YACd,EAAE,CAAC,WAAW,GAAG,OAAO,IAAI,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CACrB,IAAqB,EACrB,WAA6B;IAE7B,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACtD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CACV,IAAI,IAAI,CAAC,aAAa,SAAS,IAAI,CAAC,YAAY,gBAAgB,EAChE,IAAI,CACL,CAAC;YACF,OAAO;QACT,CAAC;QACD,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC7B,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAgB,CAAC;YACtD,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACzC,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;YACzB,cAAc,CAAC,KAAK,EAAE,MAA4C,CAAC,CAAC;YACpE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,IAAqB,EAAE,KAAc;IAC3D,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO;IAC1B,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;QAClD,EAAE,CAAC,WAAW,GAAG,OAAO,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAqB;IAClD,IAAI,IAAI,CAAC,kBAAkB;QAAE,OAAO;IACpC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;QACnC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;QACxB,IAAI,CAAC,CAAC,MAAM,YAAY,OAAO,CAAC;YAAE,OAAO;QACzC,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC/C,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,IAAqB,EACrB,KAAY,EACZ,IAAoC;IAEpC,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,CAAC,EAAE;QAAE,OAAO;IAChB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,mDAAmD,EAAE,GAAG,CAAC,CAAC;QACvE,IAAI,CAAC,SAAS,CAAC;YACb,MAAM,EAAE,kBAAkB;YAC1B,EAAE;YACF,KAAK,EAAE,2BAA2B;YAClC,MAAM,EAAE,EAAE,IAAI,EAAE;SACjB,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,KAAK,CAAC,cAAc,EAAE,CAAC;IACvB,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO;IAE5C,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,eAAe,CAAC;QACpE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,OAAO;IACpC,CAAC;IAED,eAAe,CAAC,IAAI,CAAC,CAAC;IAEtB,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAC1C,iEAAiE,CAClE,CAAC;IAEF,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,CAAC,IAAI,EAAE,GAAG,cAAc,CAAC,EAAE,GAAG,EAAE,CACzE,UAAU,CACR;QACE,MAAM,EAAE,kBAAkB;QAC1B,EAAE;QACF,MAAM,EAAE;YACN,IAAI;YACJ,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC;YACtC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC;SACnC;QACD,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,EACD,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAC7C,CACF,CAAC;IAEF,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;QACtB,cAAc,CAAC,IAAI,EAAE,yCAAyC,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC;IACnC,IAAI,MAAM,IAAK,MAA2B,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;QACxD,MAAM,OAAO,GAAG,MAGf,CAAC;QACF,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC;YACrD,CAAC,CAAC,OAAO,CAAC,YAAY;YACtB,CAAC,CAAC,EAAE,CAAC;QACP,gBAAgB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACpC,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAClC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;YACjD,OAAO,CAAC,IAAI,CACV,qBAAqB,EAAE,mDAAmD,CAC3E,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,SAAS,CAAC;YACb,MAAM,EAAE,kBAAkB;YAC1B,EAAE;YACF,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,YAAY;YACpC,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;SAC9B,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,IAAoC;IAEpC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE;QAC9C,IAAI,EAAE,YAAY,eAAe;YAAE,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,CAAC,CAAQ,EAAE,EAAE;QAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC;QACtB,IACE,IAAI,YAAY,eAAe;YAC/B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,EAClC,CAAC;YACD,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAC5B,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC;IAEF,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE9C,OAAO,GAAG,EAAE;QACV,MAAM,EAAE,CAAC;QACT,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/form-actions.d.ts
CHANGED
|
@@ -7,16 +7,4 @@ export type FormActionResult = {
|
|
|
7
7
|
error?: unknown;
|
|
8
8
|
field_errors?: FormFieldError[];
|
|
9
9
|
};
|
|
10
|
-
export type FormAction = (context:
|
|
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;
|
package/dist/form-actions.js
CHANGED
|
@@ -1,15 +1,2 @@
|
|
|
1
|
-
export
|
|
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
|
package/dist/form-actions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-actions.js","sourceRoot":"","sources":["../src/form-actions.ts"],"names":[],"mappings":"
|
|
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;
|
package/dist/form-visibility.js
CHANGED
|
@@ -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
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
|
|
44
|
-
scopeTargets.set(scope, []);
|
|
45
|
-
scopeTargets.get(scope).push(el);
|
|
95
|
+
tracked.push(el);
|
|
96
|
+
setupVisibility(el);
|
|
46
97
|
});
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
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":"AAAA,MAAM,aAAa,GAAG,GAAG,CAAC;AAI1B,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,IAAI;SACR,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAa,EAAE;QACvB,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;IAClE,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC;
|
|
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"}
|