gg-wf-scripts 2.4.0 → 2.8.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/README.md +52 -0
- package/dist/action-engine.d.ts +3 -0
- package/dist/action-engine.js +78 -0
- package/dist/action-engine.js.map +1 -0
- package/dist/actions.d.ts +14 -0
- package/dist/actions.js +12 -0
- package/dist/actions.js.map +1 -0
- package/dist/auth.d.ts +6 -0
- package/dist/auth.js +27 -0
- package/dist/auth.js.map +1 -0
- package/dist/bridges.d.ts +1 -0
- package/dist/bridges.js +33 -0
- package/dist/bridges.js.map +1 -0
- package/dist/data-engine.d.ts +3 -0
- package/dist/data-engine.js +158 -0
- package/dist/data-engine.js.map +1 -0
- package/dist/dialog.d.ts +1 -0
- package/dist/dialog.js +89 -0
- package/dist/dialog.js.map +1 -0
- package/dist/form-action-engine.d.ts +3 -0
- package/dist/form-action-engine.js +156 -0
- package/dist/form-action-engine.js.map +1 -0
- package/dist/form-actions.d.ts +22 -0
- package/dist/form-actions.js +15 -0
- package/dist/form-actions.js.map +1 -0
- package/dist/form-visibility.d.ts +1 -0
- package/dist/form-visibility.js +108 -0
- package/dist/form-visibility.js.map +1 -0
- package/dist/helpers/dom.d.ts +16 -0
- package/dist/helpers/dom.js +39 -0
- package/dist/helpers/dom.js.map +1 -0
- package/dist/helpers/path.d.ts +2 -0
- package/dist/helpers/path.js +9 -0
- package/dist/helpers/path.js.map +1 -0
- package/dist/helpers/run-handler.d.ts +22 -0
- package/dist/helpers/run-handler.js +33 -0
- package/dist/helpers/run-handler.js.map +1 -0
- package/dist/helpers/run-with-loading.d.ts +6 -0
- package/dist/helpers/run-with-loading.js +28 -0
- package/dist/helpers/run-with-loading.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/dist/queries.d.ts +10 -0
- package/dist/queries.js +12 -0
- package/dist/queries.js.map +1 -0
- package/dist/query-params.d.ts +19 -0
- package/dist/query-params.js +142 -0
- package/dist/query-params.js.map +1 -0
- package/dist/switch-engine.d.ts +1 -0
- package/dist/switch-engine.js +21 -0
- package/dist/switch-engine.js.map +1 -0
- package/package.json +20 -2
- package/src/action-engine.js +0 -64
- package/src/actions.js +0 -14
- package/src/auth.js +0 -28
- package/src/bridges.js +0 -31
- package/src/data-engine.js +0 -145
- package/src/dialog.js +0 -86
- package/src/form-action-engine.js +0 -149
- package/src/form-actions.js +0 -21
- package/src/form-visibility.js +0 -122
- package/src/helpers/dom.js +0 -35
- package/src/helpers/log.js +0 -34
- package/src/helpers/path.js +0 -4
- package/src/index.js +0 -60
- package/src/queries.js +0 -14
- package/src/query-params.js +0 -144
- package/src/switch-engine.js +0 -22
package/README.md
CHANGED
|
@@ -86,6 +86,25 @@ Display data from your queries in the DOM.
|
|
|
86
86
|
|
|
87
87
|
`gg-field` supports dot-paths for nested data (e.g. `author.name`).
|
|
88
88
|
|
|
89
|
+
#### Passing data to web components / React
|
|
90
|
+
|
|
91
|
+
For elements that manage their own DOM (custom elements wrapping React, Lit, etc.), use `gg-data-key` to receive a JSON-serialized value as a `gg-data-value` attribute. The component listens for attribute changes and updates its own state.
|
|
92
|
+
|
|
93
|
+
```html
|
|
94
|
+
<div gg-data="post_form">
|
|
95
|
+
<!-- record.schools is e.g. [{ id, name }, ...] -->
|
|
96
|
+
<my-select gg-data-key="schools"></my-select>
|
|
97
|
+
</div>
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
After the query runs, the engine resolves the dot-path against the record and writes the result:
|
|
101
|
+
|
|
102
|
+
```html
|
|
103
|
+
<my-select gg-data-key="schools" gg-data-value='[{"id":1,"name":"Acme"}]'></my-select>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
The lookup pierces shadow roots, so the marker can live inside a component's shadow DOM. Leaving `gg-data-key=""` passes the entire record. Note: if the component renders after the query runs, it won't be found — re-run the query (e.g. via `gg-data-on`) once the component has mounted, or have the component pull from `host.__ggRecord` on connect.
|
|
107
|
+
|
|
89
108
|
#### Re-running on URL changes
|
|
90
109
|
|
|
91
110
|
Add `gg-data-on` to re-run a query when specific URL params change:
|
|
@@ -299,6 +318,39 @@ app.addAction("delete_post", async ({ sb }, { id }) => {
|
|
|
299
318
|
});
|
|
300
319
|
```
|
|
301
320
|
|
|
321
|
+
### Loading states
|
|
322
|
+
|
|
323
|
+
While an action, query, or form action is in flight, the engine sets `gg-loading="true"` on the relevant element so you can style spinners, skeletons, or disabled visuals purely in CSS.
|
|
324
|
+
|
|
325
|
+
| Trigger | Where `gg-loading` is set | Disabled? |
|
|
326
|
+
|---|---|---|
|
|
327
|
+
| `gg-action` | The trigger element itself | Native `disabled` is set if it's a `<button>` or `<input>` |
|
|
328
|
+
| `gg-data` / `gg-data-list` / `gg-data-form` | The container | n/a (not click-triggered) |
|
|
329
|
+
| `gg-form-action` | The `<form>` and every submit control inside it (`button[type="submit"]`, untyped `<button>`, `input[type="submit"]`) | Submit controls get native `disabled` |
|
|
330
|
+
|
|
331
|
+
Re-clicks on a loading `gg-action` and re-submits on a loading `gg-form-action` are ignored. The attribute is removed in a `finally` block, so it's cleared even if the handler throws.
|
|
332
|
+
|
|
333
|
+
Style with CSS:
|
|
334
|
+
|
|
335
|
+
```css
|
|
336
|
+
[gg-loading] { opacity: 0.6; pointer-events: none; }
|
|
337
|
+
[gg-loading]::after { content: " ⟳"; }
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### Confirm prompts
|
|
341
|
+
|
|
342
|
+
Add `gg-confirm` to a `gg-action` trigger or `gg-form-action` form to require a `window.confirm` dialog before the handler runs. If the user cancels, the action is skipped (and form submission is prevented). Customize the prompt text with `gg-confirm-text`; if omitted it defaults to `"Are you sure?"`.
|
|
343
|
+
|
|
344
|
+
```html
|
|
345
|
+
<button gg-action="delete_post" gg-confirm gg-confirm-text="Delete this post?">
|
|
346
|
+
Delete
|
|
347
|
+
</button>
|
|
348
|
+
|
|
349
|
+
<form gg-form-action="wipe_account" gg-confirm gg-confirm-text="This cannot be undone. Continue?">
|
|
350
|
+
...
|
|
351
|
+
</form>
|
|
352
|
+
```
|
|
353
|
+
|
|
302
354
|
## Config
|
|
303
355
|
|
|
304
356
|
### `init(options)`
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { actionRegistry } from "./actions.js";
|
|
2
|
+
import { runHandler } from "./helpers/run-handler.js";
|
|
3
|
+
import { runWithLoading } from "./helpers/run-with-loading.js";
|
|
4
|
+
import { getParams } from "./query-params.js";
|
|
5
|
+
function parseActionData(el) {
|
|
6
|
+
const attr = el.getAttribute("gg-action-data");
|
|
7
|
+
if (!attr)
|
|
8
|
+
return {};
|
|
9
|
+
const data = {};
|
|
10
|
+
attr
|
|
11
|
+
.split(",")
|
|
12
|
+
.filter(Boolean)
|
|
13
|
+
.forEach((pair) => {
|
|
14
|
+
const [key, value] = pair.split(":");
|
|
15
|
+
if (key?.trim())
|
|
16
|
+
data[key.trim()] = value?.trim() ?? "";
|
|
17
|
+
});
|
|
18
|
+
return data;
|
|
19
|
+
}
|
|
20
|
+
function findRecord(el) {
|
|
21
|
+
let node = el.parentElement;
|
|
22
|
+
while (node) {
|
|
23
|
+
if (node.__ggRecord)
|
|
24
|
+
return node.__ggRecord;
|
|
25
|
+
node = node.parentElement;
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
export function initActionEngine(context, { debug = false } = {}) {
|
|
30
|
+
async function handleAction(el) {
|
|
31
|
+
if (el.hasAttribute("gg-loading"))
|
|
32
|
+
return;
|
|
33
|
+
const id = el.getAttribute("gg-action");
|
|
34
|
+
if (!id)
|
|
35
|
+
return;
|
|
36
|
+
const action = actionRegistry[id];
|
|
37
|
+
if (!action) {
|
|
38
|
+
console.warn(`[gg-action] no action registered for "${id}"`);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (el.hasAttribute("gg-confirm")) {
|
|
42
|
+
const text = el.getAttribute("gg-confirm-text") || "Are you sure?";
|
|
43
|
+
if (!window.confirm(text))
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const record = findRecord(el);
|
|
47
|
+
const explicit = parseActionData(el);
|
|
48
|
+
const data = record ? { ...record, ...explicit } : explicit;
|
|
49
|
+
const params = getParams();
|
|
50
|
+
const result = await runWithLoading([el], () => runHandler({
|
|
51
|
+
prefix: "[gg-action]",
|
|
52
|
+
id,
|
|
53
|
+
fields: { trigger: el, data, params: Object.fromEntries(params) },
|
|
54
|
+
debug,
|
|
55
|
+
}, () => action(context, data, params)));
|
|
56
|
+
if (!result.ok)
|
|
57
|
+
return;
|
|
58
|
+
if (result.value && result.value.ok === false) {
|
|
59
|
+
const failure = result.value;
|
|
60
|
+
console.warn(`[gg-action] "${id}" failed:`, failure.error ?? "unknown error");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
document.addEventListener("click", (e) => {
|
|
64
|
+
const target = e.target;
|
|
65
|
+
if (!(target instanceof Element))
|
|
66
|
+
return;
|
|
67
|
+
const trigger = target.closest("[gg-action]");
|
|
68
|
+
if (trigger)
|
|
69
|
+
handleAction(trigger);
|
|
70
|
+
});
|
|
71
|
+
document.addEventListener("gg:shadow:click", (e) => {
|
|
72
|
+
const detail = e.detail;
|
|
73
|
+
const trigger = detail?.target?.closest?.("[gg-action]");
|
|
74
|
+
if (trigger)
|
|
75
|
+
handleAction(trigger);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=action-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-engine.js","sourceRoot":"","sources":["../src/action-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type ActionResult = {
|
|
2
|
+
ok: boolean;
|
|
3
|
+
error?: unknown;
|
|
4
|
+
};
|
|
5
|
+
export type Action = (context: unknown, data: Record<string, unknown>, params: URLSearchParams) => Promise<ActionResult | void> | ActionResult | void;
|
|
6
|
+
export declare const actionRegistry: Record<string, Action>;
|
|
7
|
+
/**
|
|
8
|
+
* Register an action triggered by gg-action="<id>" on click.
|
|
9
|
+
*
|
|
10
|
+
* Receives the context object passed to init(), a data object (merged from the nearest
|
|
11
|
+
* gg-data record and any explicit gg-action-data attribute), and a URLSearchParams
|
|
12
|
+
* snapshot of the current URL query string. Return { ok: true } or { ok: false, error }.
|
|
13
|
+
*/
|
|
14
|
+
export declare function registerAction(id: string, fn: Action): void;
|
package/dist/actions.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export const actionRegistry = {};
|
|
2
|
+
/**
|
|
3
|
+
* Register an action triggered by gg-action="<id>" on click.
|
|
4
|
+
*
|
|
5
|
+
* Receives the context object passed to init(), a data object (merged from the nearest
|
|
6
|
+
* gg-data record and any explicit gg-action-data attribute), and a URLSearchParams
|
|
7
|
+
* snapshot of the current URL query string. Return { ok: true } or { ok: false, error }.
|
|
8
|
+
*/
|
|
9
|
+
export function registerAction(id, fn) {
|
|
10
|
+
actionRegistry[id] = fn;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,cAAc,GAA2B,EAAE,CAAC;AAEzD;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,EAAU,EAAE,EAAU;IACnD,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;AAC1B,CAAC"}
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type AuthAdapter = {
|
|
2
|
+
getUser: () => string | null | Promise<string | null>;
|
|
3
|
+
onChange?: (cb: (userId: string | null) => void) => void;
|
|
4
|
+
roleQuery?: (context: unknown, userId: string) => Promise<string | null> | string | null;
|
|
5
|
+
};
|
|
6
|
+
export declare function initAuth(context: unknown, auth: AuthAdapter): Promise<void>;
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export async function initAuth(context, auth) {
|
|
2
|
+
const { getUser, onChange, roleQuery } = auth;
|
|
3
|
+
async function applyAuthAttrs(userId) {
|
|
4
|
+
const body = document.body;
|
|
5
|
+
if (!userId) {
|
|
6
|
+
body.setAttribute("gg-auth", "false");
|
|
7
|
+
body.removeAttribute("gg-role");
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
body.setAttribute("gg-auth", "true");
|
|
11
|
+
if (roleQuery) {
|
|
12
|
+
const role = await roleQuery(context, userId);
|
|
13
|
+
if (role) {
|
|
14
|
+
body.setAttribute("gg-role", role);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
body.removeAttribute("gg-role");
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const userId = await getUser();
|
|
22
|
+
applyAuthAttrs(userId ?? null);
|
|
23
|
+
if (onChange) {
|
|
24
|
+
onChange((userId) => applyAuthAttrs(userId ?? null));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,OAAgB,EAChB,IAAiB;IAEjB,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAE9C,KAAK,UAAU,cAAc,CAAC,MAAqB;QACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACtC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACrC,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC9C,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;IAC/B,cAAc,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;IAE/B,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC;IACvD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function initBridges(): void;
|
package/dist/bridges.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { setSwitchState } from "./helpers/dom.js";
|
|
2
|
+
import { onQueryChanged } from "./query-params.js";
|
|
3
|
+
export function initBridges() {
|
|
4
|
+
// ---- gg-switch-query: URL params → gg-switch-state ----
|
|
5
|
+
// On any URL param change, mirror its value onto matching
|
|
6
|
+
// [gg-switch-query="<key>"] elements' gg-switch-state.
|
|
7
|
+
onQueryChanged((key, value) => {
|
|
8
|
+
document
|
|
9
|
+
.querySelectorAll(`[gg-switch-query="${CSS.escape(key)}"]`)
|
|
10
|
+
.forEach((el) => setSwitchState(el, value));
|
|
11
|
+
});
|
|
12
|
+
// Initial-load pass: read current URL params and set state for every
|
|
13
|
+
// [gg-switch-query] on the page, so we don't flash before the first change.
|
|
14
|
+
const params = new URLSearchParams(window.location.search);
|
|
15
|
+
document.querySelectorAll("[gg-switch-query]").forEach((el) => {
|
|
16
|
+
const key = el.getAttribute("gg-switch-query");
|
|
17
|
+
if (!key)
|
|
18
|
+
return;
|
|
19
|
+
setSwitchState(el, params.get(key));
|
|
20
|
+
});
|
|
21
|
+
// ---- webflow:emit → Webflow IX ----
|
|
22
|
+
window.addEventListener("load", () => {
|
|
23
|
+
Webflow.push(() => {
|
|
24
|
+
const wfIx = Webflow.require("ix3");
|
|
25
|
+
document.addEventListener("webflow:emit", (e) => {
|
|
26
|
+
const detail = e.detail;
|
|
27
|
+
if (detail?.event)
|
|
28
|
+
wfIx.emit(detail.event);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=bridges.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridges.js","sourceRoot":"","sources":["../src/bridges.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,UAAU,WAAW;IACzB,0DAA0D;IAC1D,0DAA0D;IAC1D,uDAAuD;IACvD,cAAc,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QAC5B,QAAQ;aACL,gBAAgB,CAAC,qBAAqB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;aAC1D,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,qEAAqE;IACrE,4EAA4E;IAC5E,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3D,QAAQ,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;QAC5D,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,cAAc,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,sCAAsC;IACtC,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE;QACnC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE;YAChB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACpC,QAAQ,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE;gBAC9C,MAAM,MAAM,GAAI,CAAoC,CAAC,MAAM,CAAC;gBAC5D,IAAI,MAAM,EAAE,KAAK;oBAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { getPath } from "./helpers/path.js";
|
|
2
|
+
import { populateFields, setSwitchState, applySwitchState, } from "./helpers/dom.js";
|
|
3
|
+
import { runHandler } from "./helpers/run-handler.js";
|
|
4
|
+
import { runWithLoading } from "./helpers/run-with-loading.js";
|
|
5
|
+
import { queryRegistry } from "./queries.js";
|
|
6
|
+
import { onQueryChanged, getParams } from "./query-params.js";
|
|
7
|
+
function applySwitchFields(root, record) {
|
|
8
|
+
root.querySelectorAll("[gg-switch-field]").forEach((el) => {
|
|
9
|
+
const path = el.getAttribute("gg-switch-field");
|
|
10
|
+
if (!path)
|
|
11
|
+
return;
|
|
12
|
+
const value = getPath(record, path);
|
|
13
|
+
setSwitchState(el, value);
|
|
14
|
+
applySwitchState(el);
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
function queryDeep(root, selector) {
|
|
18
|
+
const results = [...root.querySelectorAll(selector)];
|
|
19
|
+
root.querySelectorAll("*").forEach((el) => {
|
|
20
|
+
if (el.shadowRoot)
|
|
21
|
+
results.push(...queryDeep(el.shadowRoot, selector));
|
|
22
|
+
});
|
|
23
|
+
return results;
|
|
24
|
+
}
|
|
25
|
+
function applyDataValues(root, record) {
|
|
26
|
+
queryDeep(root, "[gg-data-key]").forEach((el) => {
|
|
27
|
+
const path = el.getAttribute("gg-data-key");
|
|
28
|
+
const value = path ? getPath(record, path) : record;
|
|
29
|
+
if (value === undefined)
|
|
30
|
+
return;
|
|
31
|
+
el.setAttribute("gg-data-value", JSON.stringify(value));
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
function populateFormFields(root, record) {
|
|
35
|
+
root
|
|
36
|
+
.querySelectorAll("input[name], select[name], textarea[name]")
|
|
37
|
+
.forEach((el) => {
|
|
38
|
+
const name = el.getAttribute("name");
|
|
39
|
+
if (!name)
|
|
40
|
+
return;
|
|
41
|
+
const value = getPath(record, name);
|
|
42
|
+
if (value == null)
|
|
43
|
+
return;
|
|
44
|
+
if (el instanceof HTMLInputElement) {
|
|
45
|
+
if (el.type === "checkbox") {
|
|
46
|
+
el.checked = Boolean(value);
|
|
47
|
+
}
|
|
48
|
+
else if (el.type === "radio") {
|
|
49
|
+
el.checked = String(el.value) === String(value);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
el.value = String(value);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
el.value = String(value);
|
|
57
|
+
}
|
|
58
|
+
el.dispatchEvent(new Event("input", { bubbles: true }));
|
|
59
|
+
el.dispatchEvent(new Event("change", { bubbles: true }));
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
export function initDataEngine(context, { debug = false } = {}) {
|
|
63
|
+
async function runQuery(container) {
|
|
64
|
+
const isList = container.hasAttribute("gg-data-list");
|
|
65
|
+
const isForm = container.hasAttribute("gg-data-form");
|
|
66
|
+
const id = container.getAttribute(isList ? "gg-data-list" : isForm ? "gg-data-form" : "gg-data");
|
|
67
|
+
if (!id)
|
|
68
|
+
return;
|
|
69
|
+
const query = queryRegistry[id];
|
|
70
|
+
if (!query) {
|
|
71
|
+
console.warn(`[gg-data] no query registered for "${id}"`);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const params = getParams();
|
|
75
|
+
const handlerResult = await runWithLoading([container], () => runHandler({
|
|
76
|
+
prefix: "[gg-data]",
|
|
77
|
+
id,
|
|
78
|
+
fields: { container, params: Object.fromEntries(params) },
|
|
79
|
+
debug,
|
|
80
|
+
}, () => query(context, params)));
|
|
81
|
+
if (!handlerResult.ok)
|
|
82
|
+
return;
|
|
83
|
+
const result = handlerResult.value;
|
|
84
|
+
if (result === undefined)
|
|
85
|
+
return;
|
|
86
|
+
if (isList) {
|
|
87
|
+
if (!Array.isArray(result)) {
|
|
88
|
+
console.warn(`[gg-data-list] query "${id}" did not return an array`);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const template = container.querySelector("[gg-list-template]");
|
|
92
|
+
if (!template) {
|
|
93
|
+
console.warn(`[gg-data-list] no [gg-list-template] inside "${id}"`);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
Array.from(container.children).forEach((child) => {
|
|
97
|
+
if (child !== template)
|
|
98
|
+
child.remove();
|
|
99
|
+
});
|
|
100
|
+
result.forEach((record) => {
|
|
101
|
+
const clone = template.cloneNode(true);
|
|
102
|
+
clone.removeAttribute("gg-list-template");
|
|
103
|
+
clone.setAttribute("gg-query-set", `modal:view,id:${record.id}`);
|
|
104
|
+
clone.style.display = "flex";
|
|
105
|
+
if (record?.id != null)
|
|
106
|
+
clone.id = String(record.id);
|
|
107
|
+
clone.__ggRecord = record;
|
|
108
|
+
populateFields(clone, record);
|
|
109
|
+
applySwitchFields(clone, record);
|
|
110
|
+
applyDataValues(clone, record);
|
|
111
|
+
container.appendChild(clone);
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
else if (isForm) {
|
|
115
|
+
if (Array.isArray(result)) {
|
|
116
|
+
console.warn(`[gg-data-form] query "${id}" returned an array; expected a single record`);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (!result)
|
|
120
|
+
return;
|
|
121
|
+
const record = result;
|
|
122
|
+
container.__ggRecord = record;
|
|
123
|
+
populateFormFields(container, record);
|
|
124
|
+
applyDataValues(container, record);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
if (Array.isArray(result)) {
|
|
128
|
+
console.warn(`[gg-data] query "${id}" returned an array; use gg-data-list instead`);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (!result)
|
|
132
|
+
return;
|
|
133
|
+
const record = result;
|
|
134
|
+
container.__ggRecord = record;
|
|
135
|
+
populateFields(container, record);
|
|
136
|
+
applySwitchFields(container, record);
|
|
137
|
+
applyDataValues(container, record);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Run all data containers on load
|
|
141
|
+
document
|
|
142
|
+
.querySelectorAll("[gg-data], [gg-data-list], [gg-data-form]")
|
|
143
|
+
.forEach(runQuery);
|
|
144
|
+
// Re-run queries when matching URL params change
|
|
145
|
+
onQueryChanged((key) => {
|
|
146
|
+
document
|
|
147
|
+
.querySelectorAll("[gg-data][gg-data-on], [gg-data-list][gg-data-on], [gg-data-form][gg-data-on]")
|
|
148
|
+
.forEach((c) => {
|
|
149
|
+
const attr = c.getAttribute("gg-data-on");
|
|
150
|
+
if (!attr)
|
|
151
|
+
return;
|
|
152
|
+
const keys = attr.split(",").map((s) => s.trim());
|
|
153
|
+
if (keys.includes(key))
|
|
154
|
+
runQuery(c);
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=data-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-engine.js","sourceRoot":"","sources":["../src/data-engine.ts"],"names":[],"mappings":"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"}
|
package/dist/dialog.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function initDialog(): void;
|
package/dist/dialog.js
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { removeQueryParams, onQueryChanged } from "./query-params.js";
|
|
2
|
+
function stopLenis() {
|
|
3
|
+
if (typeof lenis !== "undefined")
|
|
4
|
+
lenis.stop();
|
|
5
|
+
}
|
|
6
|
+
function startLenis() {
|
|
7
|
+
if (typeof lenis !== "undefined")
|
|
8
|
+
lenis.start();
|
|
9
|
+
}
|
|
10
|
+
function openDialog() {
|
|
11
|
+
const dialog = document.querySelector("dialog");
|
|
12
|
+
if (!dialog)
|
|
13
|
+
return;
|
|
14
|
+
dialog.removeAttribute("aria-hidden");
|
|
15
|
+
dialog.removeAttribute("inert");
|
|
16
|
+
dialog.showModal();
|
|
17
|
+
stopLenis();
|
|
18
|
+
}
|
|
19
|
+
function closeDialog() {
|
|
20
|
+
const dialog = document.querySelector("dialog");
|
|
21
|
+
if (!dialog)
|
|
22
|
+
return;
|
|
23
|
+
dialog.setAttribute("aria-hidden", "true");
|
|
24
|
+
dialog.setAttribute("inert", "");
|
|
25
|
+
dialog.close();
|
|
26
|
+
startLenis();
|
|
27
|
+
}
|
|
28
|
+
function dismissViaUrlOrDirect() {
|
|
29
|
+
const modalParam = new URLSearchParams(window.location.search).get("modal");
|
|
30
|
+
if (modalParam) {
|
|
31
|
+
removeQueryParams(["modal", "id"]);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
closeDialog();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function syncDialogToUrl() {
|
|
38
|
+
const modalParam = new URLSearchParams(window.location.search).get("modal");
|
|
39
|
+
if (modalParam) {
|
|
40
|
+
openDialog();
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
closeDialog();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export function initDialog() {
|
|
47
|
+
// Subscribe to query param changes — open/close when "modal" changes
|
|
48
|
+
onQueryChanged((key, value) => {
|
|
49
|
+
if (key !== "modal")
|
|
50
|
+
return;
|
|
51
|
+
if (value) {
|
|
52
|
+
openDialog();
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
closeDialog();
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
// Inbound events from external code
|
|
59
|
+
document.addEventListener("gg:dialog:open", openDialog);
|
|
60
|
+
document.addEventListener("gg:dialog:close", closeDialog);
|
|
61
|
+
// Backdrop click
|
|
62
|
+
document.addEventListener("click", (e) => {
|
|
63
|
+
const target = e.target;
|
|
64
|
+
if (!(target instanceof HTMLDialogElement))
|
|
65
|
+
return;
|
|
66
|
+
if (!target.matches("dialog[open]"))
|
|
67
|
+
return;
|
|
68
|
+
const rect = target.getBoundingClientRect();
|
|
69
|
+
const outside = e.clientX < rect.left ||
|
|
70
|
+
e.clientX > rect.right ||
|
|
71
|
+
e.clientY < rect.top ||
|
|
72
|
+
e.clientY > rect.bottom;
|
|
73
|
+
if (outside)
|
|
74
|
+
dismissViaUrlOrDirect();
|
|
75
|
+
});
|
|
76
|
+
// Escape key — preempt the default close so the URL stays source of truth
|
|
77
|
+
document.addEventListener("cancel", (e) => {
|
|
78
|
+
const target = e.target;
|
|
79
|
+
if (!(target instanceof HTMLDialogElement))
|
|
80
|
+
return;
|
|
81
|
+
e.preventDefault();
|
|
82
|
+
dismissViaUrlOrDirect();
|
|
83
|
+
});
|
|
84
|
+
// Back button
|
|
85
|
+
window.addEventListener("popstate", syncDialogToUrl);
|
|
86
|
+
// Initial load
|
|
87
|
+
syncDialogToUrl();
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=dialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialog.js","sourceRoot":"","sources":["../src/dialog.ts"],"names":[],"mappings":"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"}
|