@lattice-php/lattice 0.26.0 → 0.28.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 (57) hide show
  1. package/dist/action/components/action-form.js +2 -2
  2. package/dist/action/components/action-form.js.map +1 -1
  3. package/dist/action/hooks/use-action.js +2 -2
  4. package/dist/chat/components/chat-box.js +1 -1
  5. package/dist/core/api.d.ts +13 -0
  6. package/dist/core/api.js +38 -4
  7. package/dist/core/api.js.map +1 -1
  8. package/dist/core/component-ref.d.ts +3 -0
  9. package/dist/core/component-ref.js +20 -2
  10. package/dist/core/component-ref.js.map +1 -1
  11. package/dist/core/headers.js +1 -1
  12. package/dist/core/index.js +4 -4
  13. package/dist/create-app.js +6 -1
  14. package/dist/create-app.js.map +1 -1
  15. package/dist/dnd/index.d.ts +16 -0
  16. package/dist/dnd/index.js +13 -0
  17. package/dist/form/components/fields/date-picker-field.js +1 -1
  18. package/dist/form/components/fields/date-picker-field.js.map +1 -1
  19. package/dist/form/components/fields/file-upload.js +3 -2
  20. package/dist/form/components/fields/file-upload.js.map +1 -1
  21. package/dist/form/components/fields/select.js +4 -3
  22. package/dist/form/components/fields/select.js.map +1 -1
  23. package/dist/form/components/form.js +63 -27
  24. package/dist/form/components/form.js.map +1 -1
  25. package/dist/form/hooks/use-form-resolver.js +1 -1
  26. package/dist/form/hooks/use-form-resolver.js.map +1 -1
  27. package/dist/form/hooks/values.d.ts +8 -0
  28. package/dist/form/hooks/values.js +18 -1
  29. package/dist/form/hooks/values.js.map +1 -1
  30. package/dist/i18n/backend.js +1 -1
  31. package/dist/i18n/instance.js +1 -1
  32. package/dist/i18n/timezone.js +1 -1
  33. package/dist/index.d.ts +1 -1
  34. package/dist/index.js +3 -3
  35. package/dist/inertia.d.ts +7 -0
  36. package/dist/inertia.js +19 -1
  37. package/dist/inertia.js.map +1 -1
  38. package/dist/lattice.css +38 -33
  39. package/dist/remote/components/data-list.js +2 -2
  40. package/dist/table/components/bulk-bar.js +1 -1
  41. package/dist/table/hooks/use-table.js +3 -2
  42. package/dist/table/hooks/use-table.js.map +1 -1
  43. package/dist/ui/fragment.js +1 -1
  44. package/dist-standalone/chunks/{chart-view-8xEKTUJV.js → chart-view-CpYsLvzR.js} +4 -4
  45. package/dist-standalone/chunks/date-picker-field-lX8N40Ii.js +1 -0
  46. package/dist-standalone/chunks/{page-props-D3FnL614.js → page-props-ClpVjpOc.js} +1 -1
  47. package/dist-standalone/chunks/{rich-editor-field-47ov3Bny.js → rich-editor-field-C71csVJv.js} +2 -2
  48. package/dist-standalone/chunks/{subscriptions-C-0lSr7X.js → subscriptions-B1STcwPE.js} +1 -1
  49. package/dist-standalone/chunks/use-effect-dispatcher-I8So0l_I.js +97 -0
  50. package/dist-standalone/lattice.css +1 -1
  51. package/dist-standalone/lattice.js +15 -15
  52. package/dist-standalone/manifest.json +8 -8
  53. package/package.json +11 -7
  54. package/dist/clipboard/index.d.ts +0 -1
  55. package/dist/clipboard/index.js +0 -2
  56. package/dist-standalone/chunks/date-picker-field-cdhxtVSG.js +0 -1
  57. package/dist-standalone/chunks/use-effect-dispatcher-EVZxmfoo.js +0 -97
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import { initializeAppearance, updateAppearance, useAppearance } from "./appearance/index.js";
2
- import { createPlugin, createRegistry, eagerComponent, extendRegistry, lazyComponent } from "./core/registry.js";
3
- import { useColumnRegistry, useComponentRegistry } from "./core/registry-context.js";
4
- import { LATTICE_EVENT } from "./core/event-names.js";
5
2
  import { LATTICE_REF_HEADER, withRefHeader } from "./core/component-ref.js";
3
+ import { LATTICE_EVENT } from "./core/event-names.js";
6
4
  import { withHeaders } from "./core/headers.js";
5
+ import { createPlugin, createRegistry, eagerComponent, extendRegistry, lazyComponent } from "./core/registry.js";
6
+ import { useColumnRegistry, useComponentRegistry } from "./core/registry-context.js";
7
7
  import { Icon, SpriteProvider } from "./icons/sprite.js";
8
8
  import { IconRenderer, IconRendererProvider } from "./icons/icon-renderer.js";
9
9
  import { CollapsedContext, useCollapsed } from "./core/collapsed-context.js";
package/dist/inertia.d.ts CHANGED
@@ -11,3 +11,10 @@ export type CreateLayoutResolverOptions = {
11
11
  export declare function createPageResolver(pages: PageModules): (name: string) => ResolvedPage;
12
12
  export declare function createLayoutResolver({ defaultLayout }?: CreateLayoutResolverOptions): (name: string, page: InertiaPage) => unknown;
13
13
  export declare function withVisitHeaders(_href: string, options: VisitOptions): VisitOptions;
14
+ /**
15
+ * Resolve the outgoing X-Lattice-Ref header through the renewed-token map at
16
+ * request time. Component props bake the originally sealed ref into headers at
17
+ * render time, so without this rewrite an Inertia request fired between a
18
+ * renewal and the next re-render would still carry the expired token.
19
+ */
20
+ export declare function registerRefRenewal(): void;
package/dist/inertia.js CHANGED
@@ -1,6 +1,8 @@
1
+ import { LATTICE_REF_HEADER, latestRef } from "./core/component-ref.js";
1
2
  import { withHeaders } from "./core/headers.js";
2
3
  import SchemaLayout from "./layout/components/schema-layout.js";
3
4
  import Page from "./page.js";
5
+ import { http } from "@inertiajs/react";
4
6
  //#region resources/js/inertia.ts
5
7
  var pageComponentName = "lattice/page";
6
8
  function createPageResolver(pages) {
@@ -23,7 +25,23 @@ function withVisitHeaders(_href, options) {
23
25
  headers: withHeaders("", options.headers)
24
26
  };
25
27
  }
28
+ var refRenewalRegistered = false;
29
+ /**
30
+ * Resolve the outgoing X-Lattice-Ref header through the renewed-token map at
31
+ * request time. Component props bake the originally sealed ref into headers at
32
+ * render time, so without this rewrite an Inertia request fired between a
33
+ * renewal and the next re-render would still carry the expired token.
34
+ */
35
+ function registerRefRenewal() {
36
+ if (refRenewalRegistered) return;
37
+ refRenewalRegistered = true;
38
+ http.onRequest((config) => {
39
+ const sealed = config.headers?.[LATTICE_REF_HEADER];
40
+ if (config.headers && typeof sealed === "string" && sealed !== "") config.headers[LATTICE_REF_HEADER] = latestRef(sealed);
41
+ return config;
42
+ });
43
+ }
26
44
  //#endregion
27
- export { createLayoutResolver, createPageResolver, pageComponentName, withVisitHeaders };
45
+ export { createLayoutResolver, createPageResolver, pageComponentName, registerRefRenewal, withVisitHeaders };
28
46
 
29
47
  //# sourceMappingURL=inertia.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"inertia.js","names":[],"sources":["../resources/js/inertia.ts"],"sourcesContent":["import type { Page as InertiaPage, VisitOptions } from \"@inertiajs/core\";\nimport type { ResolvedComponent } from \"@inertiajs/react\";\nimport { withHeaders } from \"./core/headers\";\nimport { SchemaLayout } from \"./layout\";\nimport Page from \"./page\";\nimport type { PagePayload } from \"./core/types\";\n\nexport const pageComponentName = \"lattice/page\";\n\nexport type ResolvedPage =\n | ResolvedComponent\n | Promise<ResolvedComponent>\n | { default: ResolvedComponent };\nexport type PageModules = Record<string, () => Promise<ResolvedComponent>>;\n\nexport type CreateLayoutResolverOptions = {\n defaultLayout?: (name: string, page: InertiaPage) => unknown;\n};\n\nexport function createPageResolver(pages: PageModules) {\n return (name: string): ResolvedPage => {\n if (name === pageComponentName) {\n return { default: Page };\n }\n\n const resolvedPage = pages[`./Pages/${name}.tsx`] ?? pages[`./pages/${name}.tsx`];\n\n if (resolvedPage) {\n return resolvedPage();\n }\n\n throw new Error(`Page not found: ${name}`);\n };\n}\n\nexport function createLayoutResolver({ defaultLayout }: CreateLayoutResolverOptions = {}) {\n return (name: string, page: InertiaPage): unknown => {\n if (name === pageComponentName) {\n const lattice = page.props.lattice as PagePayload | undefined;\n\n return lattice?.layout ? SchemaLayout : null;\n }\n\n return defaultLayout?.(name, page) ?? null;\n };\n}\n\nexport function withVisitHeaders(_href: string, options: VisitOptions): VisitOptions {\n return {\n ...options,\n headers: withHeaders(\"\", options.headers),\n };\n}\n"],"mappings":";;;;AAOA,IAAa,oBAAoB;AAYjC,SAAgB,mBAAmB,OAAoB;CACrD,QAAQ,SAA+B;EACrC,IAAI,SAAA,gBACF,OAAO,EAAE,SAAS,KAAK;EAGzB,MAAM,eAAe,MAAM,WAAW,KAAK,UAAU,MAAM,WAAW,KAAK;EAE3E,IAAI,cACF,OAAO,aAAa;EAGtB,MAAM,IAAI,MAAM,mBAAmB,MAAM;CAC3C;AACF;AAEA,SAAgB,qBAAqB,EAAE,kBAA+C,CAAC,GAAG;CACxF,QAAQ,MAAc,SAA+B;EACnD,IAAI,SAAA,gBAGF,OAFgB,KAAK,MAAM,SAEX,SAAS,eAAe;EAG1C,OAAO,gBAAgB,MAAM,IAAI,KAAK;CACxC;AACF;AAEA,SAAgB,iBAAiB,OAAe,SAAqC;CACnF,OAAO;EACL,GAAG;EACH,SAAS,YAAY,IAAI,QAAQ,OAAO;CAC1C;AACF"}
1
+ {"version":3,"file":"inertia.js","names":[],"sources":["../resources/js/inertia.ts"],"sourcesContent":["import type { Page as InertiaPage, VisitOptions } from \"@inertiajs/core\";\nimport { http, type ResolvedComponent } from \"@inertiajs/react\";\nimport { LATTICE_REF_HEADER, latestRef } from \"./core/component-ref\";\nimport { withHeaders } from \"./core/headers\";\nimport { SchemaLayout } from \"./layout\";\nimport Page from \"./page\";\nimport type { PagePayload } from \"./core/types\";\n\nexport const pageComponentName = \"lattice/page\";\n\nexport type ResolvedPage =\n | ResolvedComponent\n | Promise<ResolvedComponent>\n | { default: ResolvedComponent };\nexport type PageModules = Record<string, () => Promise<ResolvedComponent>>;\n\nexport type CreateLayoutResolverOptions = {\n defaultLayout?: (name: string, page: InertiaPage) => unknown;\n};\n\nexport function createPageResolver(pages: PageModules) {\n return (name: string): ResolvedPage => {\n if (name === pageComponentName) {\n return { default: Page };\n }\n\n const resolvedPage = pages[`./Pages/${name}.tsx`] ?? pages[`./pages/${name}.tsx`];\n\n if (resolvedPage) {\n return resolvedPage();\n }\n\n throw new Error(`Page not found: ${name}`);\n };\n}\n\nexport function createLayoutResolver({ defaultLayout }: CreateLayoutResolverOptions = {}) {\n return (name: string, page: InertiaPage): unknown => {\n if (name === pageComponentName) {\n const lattice = page.props.lattice as PagePayload | undefined;\n\n return lattice?.layout ? SchemaLayout : null;\n }\n\n return defaultLayout?.(name, page) ?? null;\n };\n}\n\nexport function withVisitHeaders(_href: string, options: VisitOptions): VisitOptions {\n return {\n ...options,\n headers: withHeaders(\"\", options.headers),\n };\n}\n\nlet refRenewalRegistered = false;\n\n/**\n * Resolve the outgoing X-Lattice-Ref header through the renewed-token map at\n * request time. Component props bake the originally sealed ref into headers at\n * render time, so without this rewrite an Inertia request fired between a\n * renewal and the next re-render would still carry the expired token.\n */\nexport function registerRefRenewal(): void {\n if (refRenewalRegistered) {\n return;\n }\n\n refRenewalRegistered = true;\n\n http.onRequest((config) => {\n const sealed = config.headers?.[LATTICE_REF_HEADER];\n\n if (config.headers && typeof sealed === \"string\" && sealed !== \"\") {\n config.headers[LATTICE_REF_HEADER] = latestRef(sealed);\n }\n\n return config;\n });\n}\n"],"mappings":";;;;;;AAQA,IAAa,oBAAoB;AAYjC,SAAgB,mBAAmB,OAAoB;CACrD,QAAQ,SAA+B;EACrC,IAAI,SAAA,gBACF,OAAO,EAAE,SAAS,KAAK;EAGzB,MAAM,eAAe,MAAM,WAAW,KAAK,UAAU,MAAM,WAAW,KAAK;EAE3E,IAAI,cACF,OAAO,aAAa;EAGtB,MAAM,IAAI,MAAM,mBAAmB,MAAM;CAC3C;AACF;AAEA,SAAgB,qBAAqB,EAAE,kBAA+C,CAAC,GAAG;CACxF,QAAQ,MAAc,SAA+B;EACnD,IAAI,SAAA,gBAGF,OAFgB,KAAK,MAAM,SAEX,SAAS,eAAe;EAG1C,OAAO,gBAAgB,MAAM,IAAI,KAAK;CACxC;AACF;AAEA,SAAgB,iBAAiB,OAAe,SAAqC;CACnF,OAAO;EACL,GAAG;EACH,SAAS,YAAY,IAAI,QAAQ,OAAO;CAC1C;AACF;AAEA,IAAI,uBAAuB;;;;;;;AAQ3B,SAAgB,qBAA2B;CACzC,IAAI,sBACF;CAGF,uBAAuB;CAEvB,KAAK,WAAW,WAAW;EACzB,MAAM,SAAS,OAAO,UAAU;EAEhC,IAAI,OAAO,WAAW,OAAO,WAAW,YAAY,WAAW,IAC7D,OAAO,QAAQ,sBAAsB,UAAU,MAAM;EAGvD,OAAO;CACT,CAAC;AACH"}
package/dist/lattice.css CHANGED
@@ -20,31 +20,37 @@
20
20
  --lt-secondary-fg: oklch(0.25 0.012 220);
21
21
  --lt-muted: oklch(0.955 0.004 210);
22
22
  --lt-muted-fg: oklch(0.52 0.015 220);
23
- --lt-accent: oklch(0.95 0.024 195);
24
- --lt-accent-fg: oklch(0.36 0.085 195);
23
+ /* Accent tint and focus ring take their hue from the primary, so a themed
24
+ primary keeps them coherent; an explicit override still wins. */
25
+ --lt-accent: oklch(from var(--lt-primary) 0.95 0.024 h);
26
+ --lt-accent-fg: oklch(from var(--lt-primary) 0.36 0.085 h);
25
27
  --lt-danger: oklch(0.55 0.2 26);
26
28
  --lt-danger-fg: oklch(0.985 0 0);
27
29
  --lt-border: oklch(0.915 0.005 210);
28
30
  --lt-input: oklch(0.88 0.007 210);
29
- --lt-ring: oklch(0.7 0.1 195);
31
+ --lt-ring: oklch(from var(--lt-primary) 0.7 0.1 h);
30
32
  --lt-overlay: oklch(0.15 0.02 225 / 0.5);
31
33
  --lt-warning: oklch(0.83 0.15 85);
34
+ --lt-warning-fg: oklch(0.28 0.06 70);
32
35
  --lt-success: oklch(0.56 0.13 158);
33
36
  --lt-success-fg: oklch(0.985 0 0);
34
37
  --lt-info: oklch(0.55 0.13 245);
35
38
  --lt-info-fg: oklch(0.985 0 0);
36
- --lt-primary-hover: oklch(0.46 0.12 195);
37
- --lt-primary-active: oklch(0.41 0.12 195);
38
- --lt-danger-hover: oklch(0.5 0.2 26);
39
- --lt-danger-active: oklch(0.45 0.2 26);
40
- --lt-success-hover: oklch(0.51 0.13 158);
41
- --lt-success-active: oklch(0.47 0.13 158);
42
- --lt-info-hover: oklch(0.5 0.13 245);
43
- --lt-info-active: oklch(0.46 0.13 245);
44
- --lt-warning-hover: oklch(0.78 0.15 85);
45
- --lt-warning-active: oklch(0.73 0.15 85);
46
- --lt-secondary-hover: oklch(0.925 0.006 210);
47
- --lt-secondary-active: oklch(0.9 0.007 210);
39
+ /* Hover/active derive from the base colour so a themed base recolours its
40
+ whole state family; setting the state token directly still wins. Light
41
+ surfaces darken on interaction, the near-white secondary by less. */
42
+ --lt-primary-hover: oklch(from var(--lt-primary) calc(l - 0.05) c h);
43
+ --lt-primary-active: oklch(from var(--lt-primary) calc(l - 0.1) c h);
44
+ --lt-danger-hover: oklch(from var(--lt-danger) calc(l - 0.05) c h);
45
+ --lt-danger-active: oklch(from var(--lt-danger) calc(l - 0.1) c h);
46
+ --lt-success-hover: oklch(from var(--lt-success) calc(l - 0.05) c h);
47
+ --lt-success-active: oklch(from var(--lt-success) calc(l - 0.1) c h);
48
+ --lt-info-hover: oklch(from var(--lt-info) calc(l - 0.05) c h);
49
+ --lt-info-active: oklch(from var(--lt-info) calc(l - 0.1) c h);
50
+ --lt-warning-hover: oklch(from var(--lt-warning) calc(l - 0.05) c h);
51
+ --lt-warning-active: oklch(from var(--lt-warning) calc(l - 0.1) c h);
52
+ --lt-secondary-hover: oklch(from var(--lt-secondary) calc(l - 0.03) c h);
53
+ --lt-secondary-active: oklch(from var(--lt-secondary) calc(l - 0.06) c h);
48
54
  --lt-disabled: oklch(0.945 0.003 210);
49
55
  --lt-disabled-fg: oklch(0.68 0.008 220);
50
56
 
@@ -66,8 +72,6 @@
66
72
  --lt-font-mono: ui-monospace, "SFMono-Regular", "Menlo", monospace;
67
73
  --lt-font-display: var(--lt-font-sans);
68
74
 
69
- --lt-warning-fg: oklch(0.28 0.06 70);
70
-
71
75
  --lt-shadow-inner: inset 0 1px 2px 0 oklch(0.2 0.02 225 / 0.06);
72
76
 
73
77
  --lt-chart-1: oklch(0.55 0.12 195);
@@ -87,7 +91,6 @@
87
91
  --lt-icon-2xl: 2rem;
88
92
  --lt-icon-3xl: 2.5rem;
89
93
  --lt-icon-4xl: 3rem;
90
- --lt-icon-stroke: 1.5;
91
94
 
92
95
  /* Control heights — density lever */
93
96
  --lt-control-h-sm: 2rem;
@@ -161,32 +164,34 @@
161
164
  --lt-secondary-fg: oklch(0.955 0.005 210);
162
165
  --lt-muted: oklch(0.26 0.01 225);
163
166
  --lt-muted-fg: oklch(0.72 0.012 220);
164
- --lt-accent: oklch(0.29 0.03 195);
165
- --lt-accent-fg: oklch(0.97 0.005 210);
167
+ --lt-accent: oklch(from var(--lt-primary) 0.29 0.03 h);
168
+ --lt-accent-fg: oklch(from var(--lt-primary) 0.97 0.005 h);
166
169
  --lt-danger: oklch(0.55 0.18 25);
167
170
  --lt-danger-fg: oklch(0.985 0 0);
168
171
  --lt-border: oklch(0.285 0.012 225);
169
172
  --lt-input: oklch(0.33 0.014 225);
170
- --lt-ring: oklch(0.6 0.1 192);
173
+ --lt-ring: oklch(from var(--lt-primary) 0.6 0.1 h);
171
174
  --lt-overlay: oklch(0.08 0.01 225 / 0.65);
172
175
  --lt-warning: oklch(0.75 0.14 82);
176
+ --lt-warning-fg: oklch(0.28 0.06 70);
173
177
  --lt-success: oklch(0.72 0.14 160);
174
178
  --lt-success-fg: oklch(0.2 0.04 160);
175
179
  --lt-info: oklch(0.72 0.13 242);
176
180
  --lt-info-fg: oklch(0.2 0.04 242);
177
181
 
178
- --lt-primary-hover: oklch(0.79 0.115 190);
179
- --lt-primary-active: oklch(0.83 0.11 190);
180
- --lt-danger-hover: oklch(0.6 0.18 25);
181
- --lt-danger-active: oklch(0.65 0.17 25);
182
- --lt-success-hover: oklch(0.76 0.14 160);
183
- --lt-success-active: oklch(0.8 0.13 160);
184
- --lt-info-hover: oklch(0.76 0.13 242);
185
- --lt-info-active: oklch(0.8 0.12 242);
186
- --lt-warning-hover: oklch(0.79 0.14 82);
187
- --lt-warning-active: oklch(0.83 0.13 82);
188
- --lt-secondary-hover: oklch(0.31 0.013 225);
189
- --lt-secondary-active: oklch(0.35 0.014 225);
182
+ /* Dark surfaces lighten on interaction. */
183
+ --lt-primary-hover: oklch(from var(--lt-primary) calc(l + 0.04) c h);
184
+ --lt-primary-active: oklch(from var(--lt-primary) calc(l + 0.08) c h);
185
+ --lt-danger-hover: oklch(from var(--lt-danger) calc(l + 0.04) c h);
186
+ --lt-danger-active: oklch(from var(--lt-danger) calc(l + 0.08) c h);
187
+ --lt-success-hover: oklch(from var(--lt-success) calc(l + 0.04) c h);
188
+ --lt-success-active: oklch(from var(--lt-success) calc(l + 0.08) c h);
189
+ --lt-info-hover: oklch(from var(--lt-info) calc(l + 0.04) c h);
190
+ --lt-info-active: oklch(from var(--lt-info) calc(l + 0.08) c h);
191
+ --lt-warning-hover: oklch(from var(--lt-warning) calc(l + 0.04) c h);
192
+ --lt-warning-active: oklch(from var(--lt-warning) calc(l + 0.08) c h);
193
+ --lt-secondary-hover: oklch(from var(--lt-secondary) calc(l + 0.04) c h);
194
+ --lt-secondary-active: oklch(from var(--lt-secondary) calc(l + 0.08) c h);
190
195
  --lt-disabled: oklch(0.28 0.01 225);
191
196
  --lt-disabled-fg: oklch(0.56 0.012 225);
192
197
 
@@ -1,7 +1,7 @@
1
- import { useT } from "../../i18n/instance.js";
1
+ import { remoteJson } from "../../core/api.js";
2
2
  import { materializeSchema } from "../../core/materialize.js";
3
+ import { useT } from "../../i18n/instance.js";
3
4
  import { Renderer } from "../../core/renderer.js";
4
- import { remoteJson } from "../../core/api.js";
5
5
  import { useEffect, useState } from "react";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
  //#region resources/js/remote/components/data-list.tsx
@@ -1,10 +1,10 @@
1
+ import { apiFetch } from "../../core/api.js";
1
2
  import { useT } from "../../i18n/instance.js";
2
3
  import { prefixedTestId } from "../../core/test-id.js";
3
4
  import { useEffectDispatcher } from "../../effects/use-effect-dispatcher.js";
4
5
  import { Button } from "../../ui/button.js";
5
6
  import { Spinner } from "../../ui/spinner.js";
6
7
  import { ConfirmDialog } from "../../ui/confirm-dialog.js";
7
- import { apiFetch } from "../../core/api.js";
8
8
  import { runAction } from "../../action/lib/run-action.js";
9
9
  import { ActionForm } from "../../action/components/action-form.js";
10
10
  import { useState } from "react";
@@ -1,6 +1,6 @@
1
1
  import { LATTICE_EVENT } from "../../core/event-names.js";
2
- import { useWindowEvent } from "../../core/hooks/use-window-event.js";
3
2
  import { apiFetch, apiJson } from "../../core/api.js";
3
+ import { useWindowEvent } from "../../core/hooks/use-window-event.js";
4
4
  import { getColumns, getPagination, getQuery, getRows } from "../lib/payload.js";
5
5
  import { isEmptyFilterValue, isFilterValue } from "../lib/filter-values.js";
6
6
  import { buildEndpoint, nextSort } from "../lib/query.js";
@@ -109,7 +109,8 @@ function useTable(node) {
109
109
  const searchFilterOptions = useCallback(async (searchKey, search, signal) => {
110
110
  if (!endpoint) return [];
111
111
  const url = new URL(endpoint, window.location.origin);
112
- url.searchParams.set("_search", searchKey);
112
+ url.searchParams.set("_sub", "search");
113
+ url.searchParams.set("_target", searchKey);
113
114
  url.searchParams.set("_q", search);
114
115
  const response = await apiFetch(`${url.pathname}${url.search}`, {
115
116
  ref: componentRef,
@@ -1 +1 @@
1
- {"version":3,"file":"use-table.js","names":[],"sources":["../../../resources/js/table/hooks/use-table.ts"],"sourcesContent":["import { apiFetch, apiJson } from \"@lattice-php/lattice/core/api\";\nimport { LATTICE_EVENT, type ReloadComponentEvent } from \"@lattice-php/lattice/core/event-names\";\nimport { useWindowEvent } from \"@lattice-php/lattice/core/hooks/use-window-event\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { Option } from \"@lattice-php/lattice/types/generated\";\nimport { isEmptyFilterValue, isFilterValue } from \"@lattice-php/lattice/table/lib/filter-values\";\nimport {\n getColumns,\n getPagination,\n getRows,\n getQuery,\n} from \"@lattice-php/lattice/table/lib/payload\";\nimport { buildEndpoint, nextSort } from \"@lattice-php/lattice/table/lib/query\";\nimport type {\n FilterClause,\n TableColumn,\n TableNode,\n TableResult,\n TableSort,\n TableQuery,\n} from \"@lattice-php/lattice/table/types\";\n\nexport function useTable(node: TableNode) {\n const columns = useMemo(() => getColumns(node.props?.columns), [node.props?.columns]);\n const endpoint = typeof node.props?.endpoint === \"string\" ? node.props.endpoint : null;\n const componentRef = typeof node.props?.ref === \"string\" ? node.props.ref : \"\";\n const isLazy = node.props?.lazy === true;\n const initialQuery = useMemo(() => getQuery(node.props?.query), [node.props?.query]);\n const initialRows = useMemo(() => getRows(node.props?.data), [node.props?.data]);\n const initialPagination = useMemo(\n () => getPagination(node.props?.pagination),\n [node.props?.pagination],\n );\n const [rows, setRows] = useState(initialRows);\n const [pagination, setPagination] = useState(initialPagination);\n const [query, setQuery] = useState(initialQuery);\n const [processing, setProcessing] = useState(isLazy);\n const [hasLoaded, setHasLoaded] = useState(!isLazy);\n const infiniteLoaderRef = useRef<HTMLDivElement | null>(null);\n const currentPage = pagination.currentPage ?? query.page;\n const isInfinite = (pagination.mode ?? \"table\") === \"infinite\";\n\n const load = useCallback(\n async (nextQuery: TableQuery, append = false): Promise<void> => {\n if (!endpoint) {\n return;\n }\n\n setProcessing(true);\n\n try {\n const result = await apiJson<TableResult>(buildEndpoint(endpoint, nextQuery), {\n ref: componentRef,\n });\n const resultQuery = getQuery(result.query);\n const resultRows = getRows(result.data);\n\n setRows((currentRows) => (append ? [...currentRows, ...resultRows] : resultRows));\n setPagination(getPagination(result.pagination));\n setQuery(resultQuery);\n setHasLoaded(true);\n } finally {\n setProcessing(false);\n }\n },\n [endpoint, componentRef],\n );\n\n function sort(column: TableColumn): void {\n void load({\n ...query,\n page: 1,\n sorts: nextSort(query.sorts, column),\n });\n }\n\n function clearSort(sort: TableSort): void {\n void load({\n ...query,\n page: 1,\n sorts: query.sorts.filter((currentSort) => currentSort.key !== sort.key),\n });\n }\n\n function applyFilters(next: FilterClause[]): void {\n const nextQuery = { ...query, filters: next, page: 1 };\n\n setQuery(nextQuery);\n void load(nextQuery);\n }\n\n function addFilter(clause: FilterClause): void {\n applyFilters([...query.filters, clause]);\n }\n\n function updateFilter(index: number, clause: FilterClause): void {\n applyFilters(query.filters.map((current, position) => (position === index ? clause : current)));\n }\n\n function removeFilter(index: number): void {\n applyFilters(query.filters.filter((_, current) => current !== index));\n }\n\n function replaceColumnFilters(field: string, clauses: FilterClause[]): void {\n applyFilters([...query.filters.filter((clause) => clause.field !== field), ...clauses]);\n }\n\n function setTableFilter(key: string, value: unknown): void {\n const next = { ...query.tableFilters };\n\n if (isEmptyFilterValue(value) || !isFilterValue(value)) {\n delete next[key];\n } else {\n next[key] = value;\n }\n\n const nextQuery = {\n ...query,\n tableFilters: next,\n tableFilterIndicators: query.tableFilterIndicators.filter(\n (indicator) => indicator.filter !== key,\n ),\n page: 1,\n };\n\n setQuery(nextQuery);\n void load(nextQuery);\n }\n\n function resetFilters(): void {\n const nextQuery = {\n ...query,\n filters: [],\n tableFilters: {},\n tableFilterIndicators: [],\n search: \"\",\n page: 1,\n };\n\n setQuery(nextQuery);\n void load(nextQuery);\n }\n\n function setSearch(search: string): void {\n const nextQuery = { ...query, search, page: 1 };\n\n setQuery(nextQuery);\n void load(nextQuery);\n }\n\n const searchFilterOptions = useCallback(\n async (searchKey: string, search: string, signal?: AbortSignal): Promise<Option[]> => {\n if (!endpoint) {\n return [];\n }\n\n const url = new URL(endpoint, window.location.origin);\n url.searchParams.set(\"_search\", searchKey);\n url.searchParams.set(\"_q\", search);\n\n const response = await apiFetch(`${url.pathname}${url.search}`, {\n ref: componentRef,\n signal,\n throwOnError: false,\n });\n\n if (!response.ok) {\n return [];\n }\n\n const result = (await response.json()) as { options?: Option[] };\n\n return result.options ?? [];\n },\n [endpoint, componentRef],\n );\n\n function goToPage(page: number): void {\n void load({\n ...query,\n page,\n });\n }\n\n const loadMore = useCallback((): void => {\n if (processing || !pagination.hasMore) {\n return;\n }\n\n void load(\n {\n ...query,\n page: pagination.nextPage ?? currentPage + 1,\n },\n true,\n );\n }, [currentPage, load, pagination.hasMore, pagination.nextPage, processing, query]);\n\n useEffect(() => {\n setRows(initialRows);\n setPagination(initialPagination);\n setQuery(initialQuery);\n setProcessing(isLazy);\n setHasLoaded(!isLazy);\n }, [initialRows, initialPagination, initialQuery, isLazy]);\n\n useEffect(() => {\n if (!isLazy || hasLoaded) {\n return;\n }\n\n void load(query);\n }, [hasLoaded, isLazy, load, query]);\n\n useWindowEvent(LATTICE_EVENT.reloadComponent, (event) => {\n const detail = (event as ReloadComponentEvent).detail;\n\n if (detail?.component === node.id) {\n void load(query);\n }\n });\n\n useEffect(() => {\n if (\n !isInfinite ||\n !pagination.hasMore ||\n processing ||\n !infiniteLoaderRef.current ||\n typeof IntersectionObserver === \"undefined\"\n ) {\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n loadMore();\n }\n },\n {\n rootMargin: \"240px\",\n },\n );\n\n observer.observe(infiniteLoaderRef.current);\n\n return () => observer.disconnect();\n }, [isInfinite, loadMore, pagination.hasMore, processing]);\n\n return {\n columns,\n rows,\n pagination,\n query,\n filters: query.filters,\n tableFilters: query.tableFilters,\n search: query.search,\n addFilter,\n updateFilter,\n removeFilter,\n replaceColumnFilters,\n setTableFilter,\n resetFilters,\n setSearch,\n searchFilterOptions,\n processing,\n hasLoaded,\n infiniteLoaderRef,\n sort,\n clearSort,\n goToPage,\n loadMore,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-table.js","names":[],"sources":["../../../resources/js/table/hooks/use-table.ts"],"sourcesContent":["import { apiFetch, apiJson } from \"@lattice-php/lattice/core/api\";\nimport { LATTICE_EVENT, type ReloadComponentEvent } from \"@lattice-php/lattice/core/event-names\";\nimport { useWindowEvent } from \"@lattice-php/lattice/core/hooks/use-window-event\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { Option } from \"@lattice-php/lattice/types/generated\";\nimport { isEmptyFilterValue, isFilterValue } from \"@lattice-php/lattice/table/lib/filter-values\";\nimport {\n getColumns,\n getPagination,\n getRows,\n getQuery,\n} from \"@lattice-php/lattice/table/lib/payload\";\nimport { buildEndpoint, nextSort } from \"@lattice-php/lattice/table/lib/query\";\nimport type {\n FilterClause,\n TableColumn,\n TableNode,\n TableResult,\n TableSort,\n TableQuery,\n} from \"@lattice-php/lattice/table/types\";\n\nexport function useTable(node: TableNode) {\n const columns = useMemo(() => getColumns(node.props?.columns), [node.props?.columns]);\n const endpoint = typeof node.props?.endpoint === \"string\" ? node.props.endpoint : null;\n const componentRef = typeof node.props?.ref === \"string\" ? node.props.ref : \"\";\n const isLazy = node.props?.lazy === true;\n const initialQuery = useMemo(() => getQuery(node.props?.query), [node.props?.query]);\n const initialRows = useMemo(() => getRows(node.props?.data), [node.props?.data]);\n const initialPagination = useMemo(\n () => getPagination(node.props?.pagination),\n [node.props?.pagination],\n );\n const [rows, setRows] = useState(initialRows);\n const [pagination, setPagination] = useState(initialPagination);\n const [query, setQuery] = useState(initialQuery);\n const [processing, setProcessing] = useState(isLazy);\n const [hasLoaded, setHasLoaded] = useState(!isLazy);\n const infiniteLoaderRef = useRef<HTMLDivElement | null>(null);\n const currentPage = pagination.currentPage ?? query.page;\n const isInfinite = (pagination.mode ?? \"table\") === \"infinite\";\n\n const load = useCallback(\n async (nextQuery: TableQuery, append = false): Promise<void> => {\n if (!endpoint) {\n return;\n }\n\n setProcessing(true);\n\n try {\n const result = await apiJson<TableResult>(buildEndpoint(endpoint, nextQuery), {\n ref: componentRef,\n });\n const resultQuery = getQuery(result.query);\n const resultRows = getRows(result.data);\n\n setRows((currentRows) => (append ? [...currentRows, ...resultRows] : resultRows));\n setPagination(getPagination(result.pagination));\n setQuery(resultQuery);\n setHasLoaded(true);\n } finally {\n setProcessing(false);\n }\n },\n [endpoint, componentRef],\n );\n\n function sort(column: TableColumn): void {\n void load({\n ...query,\n page: 1,\n sorts: nextSort(query.sorts, column),\n });\n }\n\n function clearSort(sort: TableSort): void {\n void load({\n ...query,\n page: 1,\n sorts: query.sorts.filter((currentSort) => currentSort.key !== sort.key),\n });\n }\n\n function applyFilters(next: FilterClause[]): void {\n const nextQuery = { ...query, filters: next, page: 1 };\n\n setQuery(nextQuery);\n void load(nextQuery);\n }\n\n function addFilter(clause: FilterClause): void {\n applyFilters([...query.filters, clause]);\n }\n\n function updateFilter(index: number, clause: FilterClause): void {\n applyFilters(query.filters.map((current, position) => (position === index ? clause : current)));\n }\n\n function removeFilter(index: number): void {\n applyFilters(query.filters.filter((_, current) => current !== index));\n }\n\n function replaceColumnFilters(field: string, clauses: FilterClause[]): void {\n applyFilters([...query.filters.filter((clause) => clause.field !== field), ...clauses]);\n }\n\n function setTableFilter(key: string, value: unknown): void {\n const next = { ...query.tableFilters };\n\n if (isEmptyFilterValue(value) || !isFilterValue(value)) {\n delete next[key];\n } else {\n next[key] = value;\n }\n\n const nextQuery = {\n ...query,\n tableFilters: next,\n tableFilterIndicators: query.tableFilterIndicators.filter(\n (indicator) => indicator.filter !== key,\n ),\n page: 1,\n };\n\n setQuery(nextQuery);\n void load(nextQuery);\n }\n\n function resetFilters(): void {\n const nextQuery = {\n ...query,\n filters: [],\n tableFilters: {},\n tableFilterIndicators: [],\n search: \"\",\n page: 1,\n };\n\n setQuery(nextQuery);\n void load(nextQuery);\n }\n\n function setSearch(search: string): void {\n const nextQuery = { ...query, search, page: 1 };\n\n setQuery(nextQuery);\n void load(nextQuery);\n }\n\n const searchFilterOptions = useCallback(\n async (searchKey: string, search: string, signal?: AbortSignal): Promise<Option[]> => {\n if (!endpoint) {\n return [];\n }\n\n const url = new URL(endpoint, window.location.origin);\n url.searchParams.set(\"_sub\", \"search\");\n url.searchParams.set(\"_target\", searchKey);\n url.searchParams.set(\"_q\", search);\n\n const response = await apiFetch(`${url.pathname}${url.search}`, {\n ref: componentRef,\n signal,\n throwOnError: false,\n });\n\n if (!response.ok) {\n return [];\n }\n\n const result = (await response.json()) as { options?: Option[] };\n\n return result.options ?? [];\n },\n [endpoint, componentRef],\n );\n\n function goToPage(page: number): void {\n void load({\n ...query,\n page,\n });\n }\n\n const loadMore = useCallback((): void => {\n if (processing || !pagination.hasMore) {\n return;\n }\n\n void load(\n {\n ...query,\n page: pagination.nextPage ?? currentPage + 1,\n },\n true,\n );\n }, [currentPage, load, pagination.hasMore, pagination.nextPage, processing, query]);\n\n useEffect(() => {\n setRows(initialRows);\n setPagination(initialPagination);\n setQuery(initialQuery);\n setProcessing(isLazy);\n setHasLoaded(!isLazy);\n }, [initialRows, initialPagination, initialQuery, isLazy]);\n\n useEffect(() => {\n if (!isLazy || hasLoaded) {\n return;\n }\n\n void load(query);\n }, [hasLoaded, isLazy, load, query]);\n\n useWindowEvent(LATTICE_EVENT.reloadComponent, (event) => {\n const detail = (event as ReloadComponentEvent).detail;\n\n if (detail?.component === node.id) {\n void load(query);\n }\n });\n\n useEffect(() => {\n if (\n !isInfinite ||\n !pagination.hasMore ||\n processing ||\n !infiniteLoaderRef.current ||\n typeof IntersectionObserver === \"undefined\"\n ) {\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n loadMore();\n }\n },\n {\n rootMargin: \"240px\",\n },\n );\n\n observer.observe(infiniteLoaderRef.current);\n\n return () => observer.disconnect();\n }, [isInfinite, loadMore, pagination.hasMore, processing]);\n\n return {\n columns,\n rows,\n pagination,\n query,\n filters: query.filters,\n tableFilters: query.tableFilters,\n search: query.search,\n addFilter,\n updateFilter,\n removeFilter,\n replaceColumnFilters,\n setTableFilter,\n resetFilters,\n setSearch,\n searchFilterOptions,\n processing,\n hasLoaded,\n infiniteLoaderRef,\n sort,\n clearSort,\n goToPage,\n loadMore,\n };\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { LATTICE_EVENT } from "../core/event-names.js";
2
+ import { apiJson } from "../core/api.js";
2
3
  import { toNodes } from "../core/nodes.js";
3
4
  import { Renderer } from "../core/renderer.js";
4
- import { apiJson } from "../core/api.js";
5
5
  import { Skeleton } from "./skeleton.js";
6
6
  import { useCallback, useEffect, useState } from "react";
7
7
  import { jsx } from "react/jsx-runtime";