@aintela/bi 0.2.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 (175) hide show
  1. package/README.md +299 -0
  2. package/dist/BiClientProvider-CWJochvi.js +219 -0
  3. package/dist/BiClientProvider-CWJochvi.js.map +1 -0
  4. package/dist/ChartCardDefaultsContext-Cl5T25H0.js +32 -0
  5. package/dist/ChartCardDefaultsContext-Cl5T25H0.js.map +1 -0
  6. package/dist/ChartContext-C_f_6khG.js +14 -0
  7. package/dist/ChartContext-C_f_6khG.js.map +1 -0
  8. package/dist/DashboardParametersContext-Clv--79U.js +39 -0
  9. package/dist/DashboardParametersContext-Clv--79U.js.map +1 -0
  10. package/dist/cards/ChartCard.d.ts +62 -0
  11. package/dist/cards/DataTableCard.d.ts +55 -0
  12. package/dist/cards/GaugeCard.d.ts +20 -0
  13. package/dist/cards/GaugeGroup.d.ts +12 -0
  14. package/dist/cards/MapBubbles.d.ts +35 -0
  15. package/dist/cards/MapConnections.d.ts +28 -0
  16. package/dist/cards/MetricCard.d.ts +15 -0
  17. package/dist/cards/MetricGroupCard.d.ts +10 -0
  18. package/dist/cards/TreeMapCard.d.ts +15 -0
  19. package/dist/cards/geoLayers.d.ts +23 -0
  20. package/dist/cards/index.d.ts +24 -0
  21. package/dist/cards/licenseGuard.d.ts +9 -0
  22. package/dist/cards/mapUtils.d.ts +23 -0
  23. package/dist/cards/useContainerRectangle.d.ts +9 -0
  24. package/dist/cards/worldMapPath.d.ts +7 -0
  25. package/dist/cards.d.ts +2 -0
  26. package/dist/cards.js +28 -0
  27. package/dist/cards.js.map +1 -0
  28. package/dist/client/BiClient.d.ts +160 -0
  29. package/dist/client/BiClientProvider.d.ts +21 -0
  30. package/dist/client/index.d.ts +4 -0
  31. package/dist/client.d.ts +2 -0
  32. package/dist/client.js +11 -0
  33. package/dist/client.js.map +1 -0
  34. package/dist/composer/environment/environmentDom.d.ts +31 -0
  35. package/dist/composer/environment/types.d.ts +67 -0
  36. package/dist/composer/icons/cardTypeIcons.d.ts +31 -0
  37. package/dist/composer/index.d.ts +66 -0
  38. package/dist/composer/llm/ExampleCardSketch.d.ts +22 -0
  39. package/dist/composer/llm/ExamplePad.d.ts +18 -0
  40. package/dist/composer/llm/PrototypePad.d.ts +13 -0
  41. package/dist/composer/llm/useDashboardPad.d.ts +25 -0
  42. package/dist/composer/models/catalog.d.ts +33 -0
  43. package/dist/composer/models/sketchModels.d.ts +102 -0
  44. package/dist/composer/models/utils.d.ts +9 -0
  45. package/dist/composer/pad/CardSketch.d.ts +25 -0
  46. package/dist/composer/pad/ClonedComponent.d.ts +13 -0
  47. package/dist/composer/pad/DashboardPad.d.ts +38 -0
  48. package/dist/composer/pad/DashboardPadEditor.d.ts +35 -0
  49. package/dist/composer/pad/DashboardPadSketch.d.ts +31 -0
  50. package/dist/composer/pad/DatasetParameterizationControls.d.ts +34 -0
  51. package/dist/composer/pad/FilterSketch.d.ts +10 -0
  52. package/dist/composer/pad/HoverButton.d.ts +12 -0
  53. package/dist/composer/pad/TitleSketch.d.ts +19 -0
  54. package/dist/composer/pad/ToolBox.d.ts +11 -0
  55. package/dist/composer/store/ComposerProvider.d.ts +36 -0
  56. package/dist/composer/store/createComposerStore.d.ts +107 -0
  57. package/dist/composer/store/drafts.d.ts +20 -0
  58. package/dist/composer/view/ComposerChatBinding.d.ts +10 -0
  59. package/dist/composer/view/ComposerView.d.ts +49 -0
  60. package/dist/composer/view/DashboardPin.d.ts +3 -0
  61. package/dist/composer/view/DashboardSidePanel.d.ts +10 -0
  62. package/dist/composer/view/DrawablePrompt.d.ts +22 -0
  63. package/dist/composer/view/EntryEmptyState.d.ts +22 -0
  64. package/dist/composer/view/SpotlightOverlay.d.ts +21 -0
  65. package/dist/composer/view/composerAnimations.d.ts +11 -0
  66. package/dist/composer/view/composerTypes.d.ts +18 -0
  67. package/dist/composer/view/data/suggestions.d.ts +10 -0
  68. package/dist/composer/view/data/templates.d.ts +33 -0
  69. package/dist/composer/view/surfaces.d.ts +19 -0
  70. package/dist/composer/view/useComposerChatBridge.d.ts +43 -0
  71. package/dist/composer.d.ts +2 -0
  72. package/dist/composer.js +99 -0
  73. package/dist/composer.js.map +1 -0
  74. package/dist/createBiTheme-TyUv_UHM.js +93 -0
  75. package/dist/createBiTheme-TyUv_UHM.js.map +1 -0
  76. package/dist/data/ChartCardDefaultsContext.d.ts +43 -0
  77. package/dist/data/dataUtils.d.ts +152 -0
  78. package/dist/data/index.d.ts +5 -0
  79. package/dist/data/queryModel.d.ts +23 -0
  80. package/dist/data.d.ts +2 -0
  81. package/dist/data.js +37 -0
  82. package/dist/data.js.map +1 -0
  83. package/dist/dataUtils-CAUE5uZY.js +372 -0
  84. package/dist/dataUtils-CAUE5uZY.js.map +1 -0
  85. package/dist/filters/VizAutoComplete.d.ts +23 -0
  86. package/dist/filters/VizDatePicker.d.ts +9 -0
  87. package/dist/filters/VizDateRangePicker.d.ts +14 -0
  88. package/dist/filters/VizSelect.d.ts +12 -0
  89. package/dist/filters/VizTextField.d.ts +8 -0
  90. package/dist/filters/VizTriggerButton.d.ts +9 -0
  91. package/dist/filters/filterFactory.d.ts +30 -0
  92. package/dist/filters/friendlyName.d.ts +4 -0
  93. package/dist/filters/index.d.ts +15 -0
  94. package/dist/filters.d.ts +2 -0
  95. package/dist/filters.js +15 -0
  96. package/dist/filters.js.map +1 -0
  97. package/dist/grid/BiErrorBoundary.d.ts +24 -0
  98. package/dist/grid/ChartContext.d.ts +14 -0
  99. package/dist/grid/GridCard.d.ts +45 -0
  100. package/dist/grid/GridCardPlaceHolder.d.ts +8 -0
  101. package/dist/grid/GridLayout.d.ts +147 -0
  102. package/dist/grid/gridModels.d.ts +33 -0
  103. package/dist/grid/index.d.ts +14 -0
  104. package/dist/grid/types.d.ts +23 -0
  105. package/dist/grid/useGridConfigTranslator.d.ts +72 -0
  106. package/dist/grid.d.ts +2 -0
  107. package/dist/grid.js +20 -0
  108. package/dist/grid.js.map +1 -0
  109. package/dist/hooks/DashboardParametersContext.d.ts +32 -0
  110. package/dist/hooks/index.d.ts +8 -0
  111. package/dist/hooks/useDashboardData.d.ts +20 -0
  112. package/dist/hooks/useDashboardLazyData.d.ts +79 -0
  113. package/dist/hooks.d.ts +2 -0
  114. package/dist/hooks.js +16 -0
  115. package/dist/hooks.js.map +1 -0
  116. package/dist/index-BYc79sSy.js +131 -0
  117. package/dist/index-BYc79sSy.js.map +1 -0
  118. package/dist/index-C6JQ6770.js +4545 -0
  119. package/dist/index-C6JQ6770.js.map +1 -0
  120. package/dist/index-CZbCaXMC.js +15 -0
  121. package/dist/index-CZbCaXMC.js.map +1 -0
  122. package/dist/index-D3OoOPjl.js +259 -0
  123. package/dist/index-D3OoOPjl.js.map +1 -0
  124. package/dist/index-D7Oo_dC-.js +94 -0
  125. package/dist/index-D7Oo_dC-.js.map +1 -0
  126. package/dist/index-D7tVPX8d.js +347 -0
  127. package/dist/index-D7tVPX8d.js.map +1 -0
  128. package/dist/index-DGyvUtY3.js +494 -0
  129. package/dist/index-DGyvUtY3.js.map +1 -0
  130. package/dist/index-DOpx0R4Y.js +41 -0
  131. package/dist/index-DOpx0R4Y.js.map +1 -0
  132. package/dist/index-wtSLspPh.js +1065 -0
  133. package/dist/index-wtSLspPh.js.map +1 -0
  134. package/dist/index.d.ts +12 -0
  135. package/dist/index.js +236 -0
  136. package/dist/index.js.map +1 -0
  137. package/dist/inline/Chart.d.ts +29 -0
  138. package/dist/inline/IFrame.d.ts +19 -0
  139. package/dist/inline/Metric.d.ts +16 -0
  140. package/dist/inline/MetricGroup.d.ts +11 -0
  141. package/dist/inline/index.d.ts +9 -0
  142. package/dist/inline/parseKnownNumbers.d.ts +11 -0
  143. package/dist/inline.d.ts +2 -0
  144. package/dist/inline.js +9 -0
  145. package/dist/inline.js.map +1 -0
  146. package/dist/runtime/IDashboardDefinition.d.ts +22 -0
  147. package/dist/runtime/biModuleSurface.d.ts +2 -0
  148. package/dist/runtime/createBiUiTools.d.ts +74 -0
  149. package/dist/runtime/index.d.ts +9 -0
  150. package/dist/runtime/loadDashboardBundle.d.ts +32 -0
  151. package/dist/runtime/registerBiModules.d.ts +36 -0
  152. package/dist/runtime/version.d.ts +6 -0
  153. package/dist/runtime.d.ts +2 -0
  154. package/dist/runtime.js +19 -0
  155. package/dist/runtime.js.map +1 -0
  156. package/dist/style.css +1 -0
  157. package/dist/theme/BiThemeBridge.d.ts +32 -0
  158. package/dist/theme/biPalette.d.ts +23 -0
  159. package/dist/theme/createBiTheme.d.ts +25 -0
  160. package/dist/theme/index.d.ts +5 -0
  161. package/dist/theme.d.ts +2 -0
  162. package/dist/theme.js +15 -0
  163. package/dist/theme.js.map +1 -0
  164. package/dist/version-DnqajORq.js +83 -0
  165. package/dist/version-DnqajORq.js.map +1 -0
  166. package/dist/viewer/ScriptDashboardViewer.d.ts +82 -0
  167. package/dist/viewer/ScriptDashboardViewerVertical.d.ts +24 -0
  168. package/dist/viewer/cardMetadata.d.ts +15 -0
  169. package/dist/viewer/index.d.ts +8 -0
  170. package/dist/viewer/models.d.ts +67 -0
  171. package/dist/viewer/useDashboardBundle.d.ts +73 -0
  172. package/dist/viewer.d.ts +2 -0
  173. package/dist/viewer.js +9 -0
  174. package/dist/viewer.js.map +1 -0
  175. package/package.json +196 -0
@@ -0,0 +1,15 @@
1
+ import { B as e, b as i, c as t, d as a, u as s, a as o, e as l } from "./BiClientProvider-CWJochvi.js";
2
+ const n = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
3
+ __proto__: null,
4
+ BiClientProvider: e,
5
+ biDateReviver: i,
6
+ createBiClient: t,
7
+ defaultBiRoutes: a,
8
+ useBiClient: s,
9
+ useBiClientOptional: o,
10
+ useBiSessionId: l
11
+ }, Symbol.toStringTag, { value: "Module" }));
12
+ export {
13
+ n as C
14
+ };
15
+ //# sourceMappingURL=index-CZbCaXMC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CZbCaXMC.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;"}
@@ -0,0 +1,259 @@
1
+ var ae = Object.defineProperty;
2
+ var $ = (a, s) => ae(a, "name", { value: s, configurable: !0 });
3
+ import { useState as D, useRef as E, useCallback as v, useEffect as _, useMemo as J } from "react";
4
+ import { d as H, D as ce, e as ie } from "./dataUtils-CAUE5uZY.js";
5
+ import { u as q, D as le, a as ue } from "./DashboardParametersContext-Clv--79U.js";
6
+ import { u as V, B as de, c as fe, a as ye, e as he } from "./BiClientProvider-CWJochvi.js";
7
+ import { useGridApiRef as me } from "@mui/x-data-grid-pro";
8
+ function pe(a) {
9
+ const s = V(), o = q(), c = {
10
+ parameters: o == null ? void 0 : o.parameters,
11
+ datasetOverride: o == null ? void 0 : o.datasetOverride
12
+ }, [h, m] = D(null), [i, l] = D(!0), [O, b] = D(null), [p, R] = D(0), x = E(""), M = E(null), j = v(() => R((y) => y + 1), []), k = JSON.stringify(c), Q = (o == null ? void 0 : o.refreshTick) ?? 0, S = o == null ? void 0 : o.dashboardId;
13
+ _(() => {
14
+ if (!a) {
15
+ m(null), l(!1), b("[QueryError:] No query hash provided");
16
+ return;
17
+ }
18
+ if (!S) {
19
+ m(null), l(!1), b(
20
+ o ? "[QueryError:] dashboardId is empty in DashboardParametersContext." : "[QueryError:] DashboardParametersContext is undefined. Wrap the consumer in a DashboardParametersProvider."
21
+ );
22
+ return;
23
+ }
24
+ const y = M.current !== null && M.current !== Q;
25
+ if (M.current = Q, !y && x.current === k && h !== null && p === 0)
26
+ return;
27
+ x.current = k, l(!0), b(null);
28
+ const g = new AbortController();
29
+ return s.runQuery(S, a, c, { noCache: y, signal: g.signal }).then((u) => {
30
+ g.signal.aborted || m({ rows: u.rows, headers: u.headers });
31
+ }).catch((u) => {
32
+ g.signal.aborted || u instanceof DOMException && u.name === "AbortError" || b(u instanceof Error ? `[QueryError:] ${u.message}` : "[QueryError:] Unknown error fetching data");
33
+ }).finally(() => {
34
+ g.signal.aborted || l(!1);
35
+ }), () => {
36
+ };
37
+ }, [a, p, k, Q, S, s]);
38
+ const N = v(
39
+ (y) => {
40
+ if (!h) return null;
41
+ const u = typeof y.build == "function" ? y : H(y), P = new ce(h, u.definition);
42
+ return P.columnSchema = u, P;
43
+ },
44
+ [h]
45
+ );
46
+ return { data: h, loading: i, error: O, refetch: j, toDataResult: N };
47
+ }
48
+ $(pe, "useDashboardData");
49
+ function X(a) {
50
+ if (a.operator === "isEmpty" || a.operator === "isNotEmpty") return !0;
51
+ const s = a.value;
52
+ return s == null || s === "" ? !1 : Array.isArray(s) ? s.some((o) => o != null && o !== "") : !0;
53
+ }
54
+ $(X, "isFilterItemMeaningful");
55
+ function be(a, s, o, c) {
56
+ const h = /* @__PURE__ */ new Map();
57
+ a.forEach((i, l) => h.set(i.toLowerCase(), l));
58
+ const m = { id: c };
59
+ for (const i of Object.keys(s)) {
60
+ const l = s[i], O = typeof l == "string" && l.endsWith("[]"), b = h.get(i.toLowerCase()) ?? -1, p = b >= 0 ? o.values[b] : void 0;
61
+ O ? m[i] = (p == null ? void 0 : p.vs) ?? [] : m[i] = (p == null ? void 0 : p.v) ?? null;
62
+ }
63
+ return m;
64
+ }
65
+ $(be, "rowToModel");
66
+ function ge(a, s) {
67
+ const o = V(), c = q(), h = (c == null ? void 0 : c.refreshTick) ?? 0, m = JSON.stringify({
68
+ p: (c == null ? void 0 : c.parameters) ?? null,
69
+ d: (c == null ? void 0 : c.datasetOverride) ?? null
70
+ }), i = me(), l = typeof s.build == "function", O = J(() => {
71
+ try {
72
+ const e = l ? s.definition : s;
73
+ return JSON.stringify(e);
74
+ } catch {
75
+ return "";
76
+ }
77
+ }, [s, l]), [b, p] = D({}), R = J(() => {
78
+ const e = l ? s.definition : s, r = [];
79
+ for (const n of Object.keys(e)) {
80
+ const d = ie(e[n]);
81
+ d && d.values === "distinct" && r.push({ field: n, multiple: d.multiple });
82
+ }
83
+ return r;
84
+ }, [O, l]), x = J(() => {
85
+ var r;
86
+ const e = l ? s : H(s);
87
+ for (const n of R) {
88
+ const d = b[n.field];
89
+ d && ((r = e[n.field]) == null || r.configure({
90
+ type: "singleSelect",
91
+ valueOptions: d,
92
+ multiSelectDropdown: n.multiple
93
+ }));
94
+ }
95
+ return e;
96
+ }, [O, l, R, b]);
97
+ _(() => {
98
+ if (R.length === 0) return;
99
+ const e = c;
100
+ if (!(e != null && e.dashboardId)) return;
101
+ let r = !1;
102
+ const n = {
103
+ parameters: e.parameters ?? {},
104
+ datasetOverride: e.datasetOverride
105
+ };
106
+ for (const d of R)
107
+ o.getDistinctValues(e.dashboardId, a, d.field, n).then((f) => {
108
+ if (r || !f) return;
109
+ const L = f.values.filter((w) => w != null);
110
+ p((w) => ({ ...w, [d.field]: L }));
111
+ }).catch(() => {
112
+ });
113
+ return () => {
114
+ r = !0;
115
+ };
116
+ }, [R, m, a, o]);
117
+ const [M, j] = D(null), [k, Q] = D(!1), [S, N] = D(!1), y = E(0), g = E(null), u = E(null), P = E(c);
118
+ P.current = c;
119
+ const W = E(x);
120
+ W.current = x;
121
+ const Y = v(
122
+ async (e) => {
123
+ var T, F;
124
+ const r = P.current, n = W.current;
125
+ if (!a)
126
+ throw new Error("[QueryError:] No view id provided to useDashboardLazyData");
127
+ if (!(r != null && r.dashboardId))
128
+ throw new Error(
129
+ r ? "[QueryError:] dashboardId is empty in DashboardParametersContext." : "[QueryError:] DashboardParametersContext is undefined."
130
+ );
131
+ const d = ((T = e.paginationModel) == null ? void 0 : T.page) ?? 0, f = ((F = e.paginationModel) == null ? void 0 : F.pageSize) ?? 50, L = (e.filterModel.items ?? []).filter(X).map((t) => ({ field: t.field, op: t.operator, value: t.value })), w = {
132
+ parameters: r.parameters,
133
+ page: d,
134
+ pageSize: f,
135
+ sort: e.sortModel.map((t) => ({ field: t.field, dir: t.sort ?? "asc" })),
136
+ filter: L,
137
+ datasetOverride: r.datasetOverride
138
+ }, K = JSON.stringify(w);
139
+ if (g.current === K && u.current)
140
+ return u.current;
141
+ y.current += 1, Q(!0);
142
+ try {
143
+ let t;
144
+ try {
145
+ t = await o.getQueryPage(r.dashboardId, a, w);
146
+ } catch (z) {
147
+ throw new Error(`[QueryError:] Paged query failed. ${z instanceof Error ? z.message : String(z)}`.trim());
148
+ }
149
+ const te = n.definition, oe = t.rows.map(
150
+ (z, se) => be(t.headers, te, z, d * f + se)
151
+ );
152
+ j(null);
153
+ const ne = typeof t.rowCount == "number" ? t.rowCount : -1, G = { rows: oe, rowCount: ne };
154
+ return g.current = K, u.current = G, G;
155
+ } finally {
156
+ y.current = Math.max(0, y.current - 1), y.current === 0 && Q(!1);
157
+ }
158
+ },
159
+ [a, o]
160
+ ), Z = v((e) => {
161
+ const r = e instanceof Error ? e.message.startsWith("[QueryError:]") ? e.message : `[QueryError:] ${e.message}` : "[QueryError:] Unknown error fetching data";
162
+ j(r);
163
+ }, []), A = E(null), C = E(null);
164
+ _(() => {
165
+ const e = `${m}|${h}`;
166
+ if (A.current !== e)
167
+ return C.current && clearTimeout(C.current), C.current = setTimeout(() => {
168
+ if (C.current = null, A.current === e) return;
169
+ A.current = e, g.current = null, u.current = null;
170
+ const r = i.current;
171
+ if (!r) return;
172
+ const n = r.dataSource;
173
+ n && (n.cache && typeof n.cache.clear == "function" && n.cache.clear(), typeof n.fetchRows == "function" && n.fetchRows());
174
+ }, 50), () => {
175
+ C.current && (clearTimeout(C.current), C.current = null);
176
+ };
177
+ }, [m, h, i]);
178
+ const I = v(() => {
179
+ g.current = null, u.current = null;
180
+ const e = i.current, r = e == null ? void 0 : e.dataSource;
181
+ r && (r.cache && typeof r.cache.clear == "function" && r.cache.clear(), typeof r.fetchRows == "function" && r.fetchRows());
182
+ }, [i]), U = v(
183
+ async (e, r) => {
184
+ const n = P.current;
185
+ if (!a)
186
+ throw new Error("[QueryError:] No view id provided to useDashboardLazyData");
187
+ if (!(n != null && n.dashboardId))
188
+ throw new Error(
189
+ n ? "[QueryError:] dashboardId is empty in DashboardParametersContext." : "[QueryError:] DashboardParametersContext is undefined."
190
+ );
191
+ N(!0);
192
+ try {
193
+ const d = e.toUpperCase(), f = i.current, L = typeof (f == null ? void 0 : f.getSortModel) == "function" ? f.getSortModel() : [], w = typeof (f == null ? void 0 : f.getFilterModel) == "function" ? f.getFilterModel() : { items: [] }, K = {
194
+ parameters: n.parameters,
195
+ sort: L.map((t) => ({ field: t.field, dir: t.sort ?? "asc" })),
196
+ filter: (w.items ?? []).filter(X).map((t) => ({ field: t.field, op: t.operator, value: t.value })),
197
+ datasetOverride: n.datasetOverride
198
+ };
199
+ let T;
200
+ try {
201
+ T = await o.exportQuery(n.dashboardId, a, e, K);
202
+ } catch (t) {
203
+ throw new Error(`[QueryError:] ${d} export failed. ${t instanceof Error ? t.message : String(t)}`.trim());
204
+ }
205
+ const F = URL.createObjectURL(T);
206
+ try {
207
+ const t = document.createElement("a");
208
+ t.href = F, t.download = r ?? `${a}.${e}`, document.body.appendChild(t), t.click(), document.body.removeChild(t);
209
+ } finally {
210
+ URL.revokeObjectURL(F);
211
+ }
212
+ } finally {
213
+ N(!1);
214
+ }
215
+ },
216
+ [a, i, o]
217
+ ), ee = v(
218
+ (e) => U("csv", e),
219
+ [U]
220
+ ), re = v(
221
+ (e) => U("xlsx", e),
222
+ [U]
223
+ ), B = {
224
+ getRows: Y,
225
+ onError: Z,
226
+ apiRef: i,
227
+ columnSchema: x,
228
+ error: M,
229
+ loading: k,
230
+ refetch: I,
231
+ downloadCsv: ee,
232
+ downloadXlsx: re,
233
+ exporting: S,
234
+ // Filled in below — has to reference the surrounding object,
235
+ // so we initialize after the literal exists.
236
+ toLazyDataResult: void 0
237
+ };
238
+ return B.toLazyDataResult = () => B, B;
239
+ }
240
+ $(ge, "useDashboardLazyData");
241
+ const Oe = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
242
+ __proto__: null,
243
+ BiClientProvider: de,
244
+ DashboardParametersContext: le,
245
+ DashboardParametersProvider: ue,
246
+ createBiClient: fe,
247
+ useBiClient: V,
248
+ useBiClientOptional: ye,
249
+ useBiSessionId: he,
250
+ useDashboardData: pe,
251
+ useDashboardLazyData: ge,
252
+ useDashboardParameters: q
253
+ }, Symbol.toStringTag, { value: "Module" }));
254
+ export {
255
+ Oe as H,
256
+ ge as a,
257
+ pe as u
258
+ };
259
+ //# sourceMappingURL=index-D3OoOPjl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-D3OoOPjl.js","sources":["../src/hooks/useDashboardData.ts","../src/hooks/useDashboardLazyData.ts"],"sourcesContent":["import { useState, useEffect, useCallback, useRef } from 'react';\nimport { DataResult, defineSchema, type ColumnSchema, type FieldType, type InferModel } from '../data/dataUtils';\nimport type { QueryResult } from '../data/queryModel';\nimport { useDashboardParameters } from './DashboardParametersContext';\nimport { useBiClient, type QueryExecutionBody } from '../client';\n\nexport type { QueryResult, QueryResultRow, ResultField } from '../data/queryModel';\n\nexport type SchemaInput<S extends Record<string, FieldType>> = ColumnSchema<S> | S;\n\nexport interface UseDashboardDataResult {\n data: QueryResult | null;\n loading: boolean;\n error: string | null;\n refetch: () => void;\n toDataResult: <const S extends Record<string, FieldType>>(schema: SchemaInput<S>) => DataResult<InferModel<S>> | null;\n}\n\n/**\n * Fetches dashboard data by query hash through the injected `BiClient`\n * (`client.runQuery(dashboardId, queryHash, body)`). The hash maps to a\n * pre-registered SQL query on the server, so no raw SQL reaches the client.\n *\n * Reads all current parameters from `DashboardParametersContext`, POSTs them\n * alongside the hash and re-fetches when they change.\n */\nexport function useDashboardData(queryHash: string): UseDashboardDataResult {\n const client = useBiClient();\n const paramState = useDashboardParameters();\n const parameters: QueryExecutionBody = {\n parameters: paramState?.parameters,\n datasetOverride: paramState?.datasetOverride,\n };\n\n const [data, setData] = useState<QueryResult | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [fetchCount, setFetchCount] = useState(0);\n const prevParamsRef = useRef<string>('');\n // `null` so the very first effect run on mount is NOT a force-refresh.\n const lastRefreshTickRef = useRef<number | null>(null);\n\n const refetch = useCallback(() => setFetchCount((c) => c + 1), []);\n\n const parametersKey = JSON.stringify(parameters);\n const refreshTick = paramState?.refreshTick ?? 0;\n const dashboardId = paramState?.dashboardId;\n\n useEffect(() => {\n if (!queryHash) {\n setData(null);\n setLoading(false);\n setError('[QueryError:] No query hash provided');\n return;\n }\n\n if (!dashboardId) {\n setData(null);\n setLoading(false);\n setError(\n !paramState\n ? '[QueryError:] DashboardParametersContext is undefined. Wrap the consumer in a DashboardParametersProvider.'\n : '[QueryError:] dashboardId is empty in DashboardParametersContext.',\n );\n return;\n }\n\n const isForceRefresh = lastRefreshTickRef.current !== null && lastRefreshTickRef.current !== refreshTick;\n lastRefreshTickRef.current = refreshTick;\n\n if (!isForceRefresh && prevParamsRef.current === parametersKey && data !== null && fetchCount === 0) {\n return;\n }\n prevParamsRef.current = parametersKey;\n\n setLoading(true);\n setError(null);\n\n const controller = new AbortController();\n\n client\n .runQuery<QueryResult>(dashboardId, queryHash, parameters, { noCache: isForceRefresh, signal: controller.signal })\n .then((result) => {\n if (controller.signal.aborted) return;\n setData({ rows: result.rows, headers: result.headers });\n })\n .catch((err) => {\n if (controller.signal.aborted) return;\n if (err instanceof DOMException && err.name === 'AbortError') return;\n setError(err instanceof Error ? `[QueryError:] ${err.message}` : '[QueryError:] Unknown error fetching data');\n })\n .finally(() => {\n if (!controller.signal.aborted) setLoading(false);\n });\n\n return () => {\n // Intentionally not aborting: a card unmounting mid-flight in a\n // StrictMode double-mount would otherwise lose its first result.\n };\n }, [queryHash, fetchCount, parametersKey, refreshTick, dashboardId, client]);\n\n const toDataResult = useCallback(\n <const S extends Record<string, FieldType>>(schema: SchemaInput<S>): DataResult<InferModel<S>> | null => {\n if (!data) return null;\n const isColumnSchema = typeof (schema as ColumnSchema<S>).build === 'function';\n const colSchema = isColumnSchema ? (schema as ColumnSchema<S>) : defineSchema(schema as S);\n const result = new DataResult<InferModel<S>>(data, colSchema.definition);\n result.columnSchema = colSchema;\n return result;\n },\n [data],\n ) as UseDashboardDataResult['toDataResult'];\n\n return { data, loading, error, refetch, toDataResult };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n// Pro package: same DataGrid runtime as community, plus pinning /\n// reorder / row grouping etc. for `<DataGridPro />`. The data-source\n// API surface (`apiRef.current.dataSource.{fetchRows, cache}`) is\n// identical to the community version, so this is a drop-in.\nimport { useGridApiRef } from '@mui/x-data-grid-pro';\nimport type { GridApi, GridGetRowsParams, GridGetRowsResponse } from '@mui/x-data-grid-pro';\nimport { useBiClient } from '../client';\n\nimport {\n defineSchema,\n extractFieldDescriptor,\n type ColumnSchema,\n type FieldType,\n type InferModel,\n} from '../data/dataUtils';\nimport { useDashboardParameters } from './DashboardParametersContext';\n\nexport type LazySchemaInput<S extends Record<string, FieldType>> = ColumnSchema<S> | S;\n\n/**\n * Companion to {@link useDashboardData} for tables that page from the\n * server. Returned object is consumed by `<DataTableCard lazyData={...} />`,\n * which adapts it to MUI X DataGrid's `dataSource` prop. The card never\n * builds an in-memory `DataResult` — sort/filter/paginate are delegated\n * to the server via `client.getQueryPage(dashboardId, viewId, body)`.\n *\n * Per-page caching is intentionally not implemented here: MUI's\n * built-in `dataSourceCache` already handles short-lived per-grid\n * caching. We only invalidate via `apiRef.dataSource.fetchRows()` when\n * dashboard parameters or `refreshTick` change.\n */\nexport interface LazyDataResult<TModel extends Record<string, any> = Record<string, any>> {\n /** Direct passthrough to `<DataGrid dataSource={{ getRows }} />`. */\n getRows: (params: GridGetRowsParams) => Promise<GridGetRowsResponse>;\n /** Wired to `<DataGrid onDataSourceError={...} />` so fetch failures show the standard overlay. */\n onError: (err: unknown) => void;\n /** Owned by the hook so refetch-on-parameter-change can call `dataSource.fetchRows()`. */\n apiRef: React.MutableRefObject<GridApi>;\n /** Same column-config surface as `DataResult.columnSchema`. */\n columnSchema: ColumnSchema<any>;\n error: string | null;\n /** True while any page request is in flight. Card uses it to drive the grid's loading overlay. */\n loading: boolean;\n /** Bypasses MUI's cache for the next set of fetches. */\n refetch: () => void;\n /**\n * Streams the full server-side rowset as CSV (`client.exportQuery(..., 'csv', body)`)\n * and triggers a browser download. Honors the current sort/filter\n * state from the grid and the current dashboard parameters — so\n * the downloaded file matches what the user is looking at, not the\n * raw view body.\n *\n * The endpoint streams chunked, so even multi-million-row exports\n * don't blow client or server memory.\n */\n downloadCsv: (filename?: string) => Promise<void>;\n /**\n * Same as {@link downloadCsv}, but hits the XLSX endpoint instead.\n * The server writes the workbook to a temp file via MiniExcel and\n * streams it back; client memory is bounded by the browser's blob\n * file-store backing (large blobs page to disk automatically).\n */\n downloadXlsx: (filename?: string) => Promise<void>;\n /**\n * True from the moment {@link downloadCsv} or {@link downloadXlsx}\n * is invoked until the download has either completed or failed.\n * Toolbar uses this to show a progress indicator and disable the\n * menu items.\n */\n exporting: boolean;\n /**\n * Compatibility shim with the {@link useDashboardData} →\n * {@link toDataResult} pattern. Returns the same lazy result\n * unchanged — the schema must already have been supplied to\n * `useDashboardLazyData(viewId, schema)` (it drives dynamic\n * distinct-value fetches and column rendering that the hook\n * can't wire up after the fact).\n *\n * Exists purely so LLM-generated code that mirrors the local-\n * mode pattern\n * `const result = useDashboardLazyData('view').toLazyDataResult(schema)`\n * compiles and behaves correctly. The `schema` argument is\n * accepted and ignored; if the hook was called without a schema\n * the TS compiler already flagged that at the call site.\n */\n toLazyDataResult: (schema?: unknown) => LazyDataResult<TModel>;\n}\n\n/**\n * Predicate for \"filter item that would actually narrow the result\n * set.\" MUI's filter panel mutates the model on EVERY user action —\n * opening the panel auto-adds an empty row, picking an operator\n * mutates the row, clearing a value re-mutates it — and each mutation\n * triggers a `getRows` call in dataSource mode. Stripping these\n * placeholder items here (and deduping the resulting request on the\n * caller side) is what keeps the server from getting hammered.\n *\n * Mirrors the server-side empty-array short-circuit in\n * `BuildFilterClause`: an empty multi-select is treated as inactive.\n */\nfunction isFilterItemMeaningful(item: {\n operator?: string;\n value?: unknown;\n}): boolean {\n if (item.operator === 'isEmpty' || item.operator === 'isNotEmpty') return true;\n const v = item.value;\n if (v === undefined || v === null || v === '') return false;\n if (Array.isArray(v)) {\n return v.some((e) => e !== null && e !== undefined && e !== '');\n }\n return true;\n}\n\ninterface RawResultField {\n v?: string | null;\n vs?: string[] | null;\n}\ninterface RawRow {\n values: RawResultField[];\n}\ninterface PagedResponse {\n headers: string[];\n rows: RawRow[];\n rowCount?: number | null;\n}\n\n/**\n * Translates a single server row (positional `values[]` aligned with\n * `headers[]`) into the schema-keyed object MUI expects. Field-name\n * matching is case-insensitive to mirror the local-mode rule in\n * `dataUtils.ts` (see `headerIndex` construction there).\n */\nfunction rowToModel<TModel extends Record<string, any>>(\n headers: string[],\n schema: Record<string, FieldType>,\n row: RawRow,\n rowIndex: number,\n): TModel & { id: number } {\n const headerIndex = new Map<string, number>();\n headers.forEach((h, i) => headerIndex.set(h.toLowerCase(), i));\n\n const obj: Record<string, unknown> = { id: rowIndex };\n for (const key of Object.keys(schema)) {\n const type = schema[key];\n const isArr = typeof type === 'string' && type.endsWith('[]');\n const idx = headerIndex.get(key.toLowerCase()) ?? -1;\n const field: RawResultField | undefined = idx >= 0 ? row.values[idx] : undefined;\n if (isArr) {\n obj[key] = field?.vs ?? [];\n } else {\n obj[key] = field?.v ?? null;\n }\n }\n return obj as TModel & { id: number };\n}\n\n/**\n * Hook factory: `useDashboardLazyData('view-id', schema)` returns a\n * {@link LazyDataResult} ready to be passed to `<DataTableCard lazyData={...} />`.\n *\n * @param viewId server-side view name (same identifier as `useDashboardData`)\n * @param schemaInput a schema literal (e.g. `{ airlineIata: 'string' } as const`) or a `ColumnSchema`\n */\nexport function useDashboardLazyData<const S extends Record<string, FieldType>>(\n viewId: string,\n schemaInput: LazySchemaInput<S>,\n): LazyDataResult<InferModel<S>> {\n const client = useBiClient();\n const paramState = useDashboardParameters();\n const refreshTick = paramState?.refreshTick ?? 0;\n\n // Stringify the parameter values so the refetch effect is keyed on the\n // actual data, not on `paramState`'s reference (the Provider supplies a\n // fresh object every parent render). The dataset override participates\n // in the key for parameterized dashboards — admins switching the\n // dataset combobox must trigger a refetch, just like a filter change.\n const parametersKey = JSON.stringify({\n p: paramState?.parameters ?? null,\n d: paramState?.datasetOverride ?? null,\n });\n\n const apiRef = useGridApiRef();\n\n // LLM-generated cards call this hook with an inline `{ ... } as const`\n // schema literal that produces a fresh object every render. Keying\n // `columnSchema` on that reference would rebuild it every render and\n // cascade into a fresh `getRows`, a fresh `dataSource` object on the\n // grid, and an infinite fetch loop (MUI X docs explicitly require a\n // stable `dataSource`). Use a structural key derived from the schema\n // definition so the same shape resolves to the same memo entry.\n const isPrebuiltSchema = typeof (schemaInput as ColumnSchema<S>).build === 'function';\n const schemaKey = useMemo(() => {\n try {\n const def = isPrebuiltSchema\n ? (schemaInput as ColumnSchema<S>).definition\n : (schemaInput as S);\n return JSON.stringify(def);\n } catch {\n return '';\n }\n }, [schemaInput, isPrebuiltSchema]);\n\n // Dynamic distinct-value cache. Keyed by field name; populated by\n // the effect below when the schema declares `values: 'distinct'`\n // for any columns. Re-fetched when dashboard parameters change\n // because the view's WHERE clause is parameter-driven and distinct\n // values can shift between filters.\n const [dynamicValueOptions, setDynamicValueOptions] = useState<Record<string, string[]>>({});\n\n // Snapshot of the dynamic-distinct columns from the current schema.\n // Stable across renders that don't change the schema's structure.\n const dynamicColumns = useMemo<Array<{ field: string; multiple?: boolean }>>(() => {\n const raw = isPrebuiltSchema\n ? (schemaInput as ColumnSchema<S>).definition\n : (schemaInput as S);\n const list: Array<{ field: string; multiple?: boolean }> = [];\n for (const key of Object.keys(raw)) {\n const desc = extractFieldDescriptor((raw as Record<string, FieldType>)[key]);\n if (desc && desc.values === 'distinct') {\n list.push({ field: key, multiple: desc.multiple });\n }\n }\n return list;\n }, [schemaKey, isPrebuiltSchema]);\n\n const columnSchema = useMemo<ColumnSchema<S>>(() => {\n const base = isPrebuiltSchema\n ? (schemaInput as ColumnSchema<S>)\n : defineSchema(schemaInput as S);\n\n // Apply server-fetched distinct values via the schema's\n // `configure` chain. Static-valued columns are already wired\n // by defineSchema; this branch only handles the lazy path.\n for (const col of dynamicColumns) {\n const opts = dynamicValueOptions[col.field];\n if (!opts) continue;\n (base as any)[col.field]?.configure({\n type: 'singleSelect',\n valueOptions: opts,\n multiSelectDropdown: col.multiple,\n });\n }\n return base;\n // schemaKey is the stable identity here — schemaInput itself is unstable.\n }, [schemaKey, isPrebuiltSchema, dynamicColumns, dynamicValueOptions]);\n\n // Fetch distinct values for any `values: 'distinct'` columns when:\n // - The view's parameters change (different WHERE → potentially\n // different distinct value set)\n // - The set of dynamic columns itself changes (rare — would require\n // the LLM regenerating the card with a new schema)\n //\n // Errors are swallowed at debug level: a failed distinct fetch\n // degrades the filter UI to free-text for that column, but\n // shouldn't break the table. Server-side caching means repeated\n // mounts for the same view in the same session are cheap.\n useEffect(() => {\n if (dynamicColumns.length === 0) return;\n const ps = paramState;\n if (!ps?.dashboardId) return;\n\n let cancelled = false;\n const body = {\n parameters: ps.parameters ?? {},\n datasetOverride: ps.datasetOverride,\n };\n\n for (const col of dynamicColumns) {\n client\n .getDistinctValues(ps.dashboardId, viewId, col.field, body)\n .then((data) => {\n if (cancelled || !data) return;\n // Drop nulls — MUI X singleSelect can render them but\n // they collide with its \"(none)\" placeholder. If we\n // ever want explicit null support, we can map null\n // to a sentinel string here.\n const cleaned = data.values.filter((v): v is string => v != null);\n setDynamicValueOptions((prev) => ({ ...prev, [col.field]: cleaned }));\n })\n .catch(() => {\n // Swallow — left empty by design; see comment above.\n });\n }\n\n return () => {\n cancelled = true;\n };\n }, [dynamicColumns, parametersKey, viewId, client]);\n\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [exporting, setExporting] = useState(false);\n const inFlightRef = useRef(0);\n\n // Last-request dedupe. MUI X's built-in `dataSourceCache` keys on\n // the raw `GridGetRowsParams` (which includes EVERY filterModel\n // mutation — empty placeholder rows, operator switches, partial\n // typing), so cosmetic filter UI changes that produce the same\n // effective request still miss the cache and fire a server round-\n // trip. We cache the most-recent normalized request key + its\n // result here; consecutive identical calls return the prior\n // response without hitting `/page` again. Single-entry is enough\n // because the noise pattern we're squashing is \"user is fiddling\n // with the same filter row\" — not random navigation across many\n // distinct filter states.\n const lastRequestKeyRef = useRef<string | null>(null);\n const lastRequestResultRef = useRef<GridGetRowsResponse | null>(null);\n\n // Hold paramState in a ref so `getRows`'s identity does not depend on\n // the context value reference. The Provider for DashboardParameters\n // produces a fresh `values={{...}}` object every parent render; if\n // `getRows` rebuilt on every such change, `dataSource={{ getRows }}`\n // would also rebuild and trigger a DataGrid refetch.\n const paramStateRef = useRef(paramState);\n paramStateRef.current = paramState;\n const columnSchemaRef = useRef(columnSchema);\n columnSchemaRef.current = columnSchema;\n\n const getRows = useCallback(\n async (params: GridGetRowsParams): Promise<GridGetRowsResponse> => {\n const ps = paramStateRef.current;\n const cs = columnSchemaRef.current;\n if (!viewId) {\n throw new Error('[QueryError:] No view id provided to useDashboardLazyData');\n }\n if (!ps?.dashboardId) {\n throw new Error(\n !ps\n ? '[QueryError:] DashboardParametersContext is undefined.'\n : '[QueryError:] dashboardId is empty in DashboardParametersContext.',\n );\n }\n\n const page = params.paginationModel?.page ?? 0;\n const pageSize = params.paginationModel?.pageSize ?? 50;\n\n const sanitizedFilter = (params.filterModel.items ?? [])\n .filter(isFilterItemMeaningful)\n .map((f) => ({ field: f.field, op: f.operator, value: f.value }));\n\n const body = {\n parameters: ps.parameters,\n page,\n pageSize,\n sort: params.sortModel.map((s) => ({ field: s.field, dir: (s.sort ?? 'asc') as 'asc' | 'desc' })),\n filter: sanitizedFilter,\n datasetOverride: ps.datasetOverride,\n };\n\n // Dedupe identical consecutive requests. Even though MUI\n // re-invokes `getRows` on every filterModel tweak, after\n // sanitizing the filter most \"cosmetic\" UI changes\n // (opening the panel, picking an operator, clearing a\n // dropdown) collapse to the same effective body. Returning\n // the prior result here avoids the round-trip without\n // changing visible state.\n const requestKey = JSON.stringify(body);\n if (lastRequestKeyRef.current === requestKey && lastRequestResultRef.current) {\n return lastRequestResultRef.current;\n }\n\n inFlightRef.current += 1;\n setLoading(true);\n try {\n let json: PagedResponse;\n try {\n json = await client.getQueryPage<PagedResponse>(ps.dashboardId, viewId, body);\n } catch (err) {\n throw new Error(`[QueryError:] Paged query failed. ${err instanceof Error ? err.message : String(err)}`.trim());\n }\n const schemaDef = cs.definition as Record<string, FieldType>;\n const rows = json.rows.map((r, i) =>\n rowToModel<InferModel<S>>(json.headers, schemaDef, r, page * pageSize + i),\n );\n setError(null);\n // MUI X DataGrid forwards `rowCount` directly to\n // TablePagination's `count` prop, which is required to\n // be numeric. The /page endpoint now populates this\n // from the BigQuery job's metadata, so the grid footer\n // renders \"Page X of N\" exactly. The `-1` fallback\n // (MUI's \"unknown total\" sentinel — \"Page X of more\")\n // stays as a safety net for any /page response that\n // doesn't carry a total, but in normal operation it\n // shouldn't trigger.\n const rowCount =\n typeof json.rowCount === 'number' ? json.rowCount : -1;\n const result: GridGetRowsResponse = { rows, rowCount };\n lastRequestKeyRef.current = requestKey;\n lastRequestResultRef.current = result;\n return result;\n } finally {\n inFlightRef.current = Math.max(0, inFlightRef.current - 1);\n if (inFlightRef.current === 0) setLoading(false);\n }\n },\n [viewId, client],\n );\n\n const onError = useCallback((err: unknown) => {\n const msg =\n err instanceof Error\n ? err.message.startsWith('[QueryError:]')\n ? err.message\n : `[QueryError:] ${err.message}`\n : '[QueryError:] Unknown error fetching data';\n setError(msg);\n }, []);\n\n // Parameter / refreshTick change ⇒ invalidate the grid's cache and\n // re-fetch the current page. fetchRows() is the canonical\n // revalidation hook per MUI v8 docs.\n //\n // Crucially we must clear MUI's dataSource cache (or pass\n // skipCache: true) BEFORE fetching. The cache is keyed only on\n // GridGetRowsParams (paginationModel + sortModel + filterModel) —\n // the dashboard's external parameters (e.g. DateRange filter\n // values) live in the POST *body* and are invisible to MUI. Without\n // skipping the cache, fetchRows() short-circuits on a cache hit and\n // never re-issues the network request, even though the dashboard\n // filter changed and the resulting data should be different.\n //\n // The effect also fires once on mount, and we *want* that: empirical\n // testing shows DataGridPro does NOT auto-issue the first fetch\n // when `dataSource` is provided in this configuration. Without this\n // initial fire, the grid renders empty on first mount and stays\n // empty until a parameter change pokes it.\n //\n // Dedupe + debounce: on initial paint the effect is triggered up\n // to three times in quick succession (empty-params mount → filter\n // component pushes defaults via setParameter → StrictMode double-\n // mount in dev). Each trigger would otherwise produce its own\n // /page round-trip even though only the final params matter. We\n // track the last key we fired on, and schedule a 50ms timeout\n // that gets reset whenever the key changes again — so cascading\n // updates collapse to a single fetch with the final params.\n const lastFiredKeyRef = useRef<string | null>(null);\n const pendingFetchTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => {\n const desiredKey = `${parametersKey}|${refreshTick}`;\n if (lastFiredKeyRef.current === desiredKey) return;\n\n if (pendingFetchTimeoutRef.current) {\n clearTimeout(pendingFetchTimeoutRef.current);\n }\n\n pendingFetchTimeoutRef.current = setTimeout(() => {\n pendingFetchTimeoutRef.current = null;\n // Re-check inside the timeout: a still-newer effect run\n // may have already replaced the desired key, in which\n // case its own timeout will do the fetch — don't compete.\n if (lastFiredKeyRef.current === desiredKey) return;\n lastFiredKeyRef.current = desiredKey;\n\n // Parameter / refresh boundary: any cached effective\n // request body is now stale (dashboard filters feed into\n // the SQL params on the server side and aren't reflected\n // in MUI's params), so wipe the dedupe slot before we\n // poke MUI's own cache + refetch.\n lastRequestKeyRef.current = null;\n lastRequestResultRef.current = null;\n\n const api = apiRef.current;\n if (!api) return;\n const ds = (api as any).dataSource;\n if (!ds) return;\n if (ds.cache && typeof ds.cache.clear === 'function') {\n ds.cache.clear();\n }\n if (typeof ds.fetchRows === 'function') {\n ds.fetchRows();\n }\n }, 50);\n\n return () => {\n // Cancel an in-flight schedule if the effect re-runs (deps\n // changed before the 50ms elapsed) or the component\n // unmounts. The next effect run will schedule its own.\n if (pendingFetchTimeoutRef.current) {\n clearTimeout(pendingFetchTimeoutRef.current);\n pendingFetchTimeoutRef.current = null;\n }\n };\n }, [parametersKey, refreshTick, apiRef]);\n\n const refetch = useCallback(() => {\n // Drop our dedupe slot too — a manual refresh should always\n // hit the server, otherwise the cached body would short-\n // circuit it.\n lastRequestKeyRef.current = null;\n lastRequestResultRef.current = null;\n const api = apiRef.current;\n const ds = (api as any)?.dataSource;\n if (!ds) return;\n if (ds.cache && typeof ds.cache.clear === 'function') {\n ds.cache.clear();\n }\n if (typeof ds.fetchRows === 'function') ds.fetchRows();\n }, [apiRef]);\n\n // CSV export. Reads the grid's CURRENT sort/filter via apiRef so\n // the downloaded file reflects what the user is looking at, not\n // the raw view body. Streams chunked over the wire — we use\n // `response.blob()` rather than reading the body as text because\n // blob avoids buffering the entire CSV in a JS string (the\n // browser pages the blob through its file-store backing), and\n // because the eventual <a download> path needs a Blob URL\n // anyway.\n // Internal shared implementation. Branches only on:\n // - which endpoint path to hit (CSV vs XLSX)\n // - which default file extension to use\n // - which label to put in the error message\n // Everything else (sort/filter capture, blob handling, busy state,\n // grid-state-at-click-time semantics) is identical between formats,\n // so it lives here once.\n const downloadExport = useCallback(\n async (format: 'csv' | 'xlsx', filename?: string): Promise<void> => {\n const ps = paramStateRef.current;\n if (!viewId) {\n throw new Error('[QueryError:] No view id provided to useDashboardLazyData');\n }\n if (!ps?.dashboardId) {\n throw new Error(\n !ps\n ? '[QueryError:] DashboardParametersContext is undefined.'\n : '[QueryError:] dashboardId is empty in DashboardParametersContext.',\n );\n }\n\n setExporting(true);\n try {\n const formatLabel = format.toUpperCase();\n\n // Pull live grid state at click time so user changes\n // since the last page fetch (e.g., a sort toggle they\n // haven't released the click on yet) are reflected.\n // `getSortModel` / `getFilterModel` are stable across\n // community + Pro APIs and exposed on `apiRef.current`.\n const api: any = apiRef.current;\n const sortModel: Array<{ field: string; sort?: 'asc' | 'desc' | null }> =\n typeof api?.getSortModel === 'function' ? api.getSortModel() : [];\n const filterModel: { items: Array<{ field: string; operator: string; value: unknown }> } =\n typeof api?.getFilterModel === 'function'\n ? api.getFilterModel()\n : { items: [] };\n\n const body = {\n parameters: ps.parameters,\n sort: sortModel.map((s) => ({ field: s.field, dir: (s.sort ?? 'asc') as 'asc' | 'desc' })),\n filter: (filterModel.items ?? [])\n .filter(isFilterItemMeaningful)\n .map((f) => ({ field: f.field, op: f.operator, value: f.value })),\n datasetOverride: ps.datasetOverride,\n };\n\n let blob: Blob;\n try {\n blob = await client.exportQuery(ps.dashboardId, viewId, format, body);\n } catch (err) {\n throw new Error(`[QueryError:] ${formatLabel} export failed. ${err instanceof Error ? err.message : String(err)}`.trim());\n }\n const blobUrl = URL.createObjectURL(blob);\n try {\n const anchor = document.createElement('a');\n anchor.href = blobUrl;\n anchor.download = filename ?? `${viewId}.${format}`;\n // Anchor must be in the document for Firefox to honor\n // the download attribute reliably; we add and remove\n // synchronously so it never paints.\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n } finally {\n // Always revoke — even if the click throws — so the\n // blob can be garbage-collected.\n URL.revokeObjectURL(blobUrl);\n }\n } finally {\n // Always release the busy flag — including on errors\n // and on the early-return paths above — so the\n // toolbar spinner doesn't get stuck.\n setExporting(false);\n }\n },\n [viewId, apiRef, client],\n );\n\n // Public per-format wrappers. Kept as named callbacks so the hook\n // result type stays cleanly typed and consumers don't have to\n // import a format literal type.\n const downloadCsv = useCallback(\n (filename?: string) => downloadExport('csv', filename),\n [downloadExport],\n );\n const downloadXlsx = useCallback(\n (filename?: string) => downloadExport('xlsx', filename),\n [downloadExport],\n );\n\n const result: LazyDataResult<InferModel<S>> = {\n getRows,\n onError,\n apiRef: apiRef as unknown as React.MutableRefObject<GridApi>,\n columnSchema,\n error,\n loading,\n refetch,\n downloadCsv,\n downloadXlsx,\n exporting,\n // Filled in below — has to reference the surrounding object,\n // so we initialize after the literal exists.\n toLazyDataResult: undefined as unknown as (schema?: unknown) => LazyDataResult<InferModel<S>>,\n };\n result.toLazyDataResult = () => result;\n return result;\n}\n"],"names":["useDashboardData","queryHash","client","useBiClient","paramState","useDashboardParameters","parameters","data","setData","useState","loading","setLoading","error","setError","fetchCount","setFetchCount","prevParamsRef","useRef","lastRefreshTickRef","refetch","useCallback","c","parametersKey","refreshTick","dashboardId","useEffect","isForceRefresh","controller","result","err","toDataResult","schema","colSchema","defineSchema","DataResult","__name","isFilterItemMeaningful","item","v","e","rowToModel","headers","row","rowIndex","headerIndex","h","i","obj","key","type","isArr","idx","field","useDashboardLazyData","viewId","schemaInput","apiRef","useGridApiRef","isPrebuiltSchema","schemaKey","useMemo","def","dynamicValueOptions","setDynamicValueOptions","dynamicColumns","raw","list","desc","extractFieldDescriptor","columnSchema","base","col","opts","_a","ps","cancelled","body","cleaned","prev","exporting","setExporting","inFlightRef","lastRequestKeyRef","lastRequestResultRef","paramStateRef","columnSchemaRef","getRows","params","cs","page","pageSize","_b","sanitizedFilter","f","s","requestKey","json","schemaDef","rows","r","rowCount","onError","msg","lastFiredKeyRef","pendingFetchTimeoutRef","desiredKey","api","ds","downloadExport","format","filename","formatLabel","sortModel","filterModel","blob","blobUrl","anchor","downloadCsv","downloadXlsx"],"mappings":";;;;;;;AA0BO,SAASA,GAAiBC,GAA2C;AACxE,QAAMC,IAASC,EAAA,GACTC,IAAaC,EAAA,GACbC,IAAiC;AAAA,IACnC,YAAYF,KAAA,gBAAAA,EAAY;AAAA,IACxB,iBAAiBA,KAAA,gBAAAA,EAAY;AAAA,EAAA,GAG3B,CAACG,GAAMC,CAAO,IAAIC,EAA6B,IAAI,GACnD,CAACC,GAASC,CAAU,IAAIF,EAAS,EAAI,GACrC,CAACG,GAAOC,CAAQ,IAAIJ,EAAwB,IAAI,GAChD,CAACK,GAAYC,CAAa,IAAIN,EAAS,CAAC,GACxCO,IAAgBC,EAAe,EAAE,GAEjCC,IAAqBD,EAAsB,IAAI,GAE/CE,IAAUC,EAAY,MAAML,EAAc,CAACM,MAAMA,IAAI,CAAC,GAAG,EAAE,GAE3DC,IAAgB,KAAK,UAAUhB,CAAU,GACzCiB,KAAcnB,KAAA,gBAAAA,EAAY,gBAAe,GACzCoB,IAAcpB,KAAA,gBAAAA,EAAY;AAEhC,EAAAqB,EAAU,MAAM;AACZ,QAAI,CAACxB,GAAW;AACZ,MAAAO,EAAQ,IAAI,GACZG,EAAW,EAAK,GAChBE,EAAS,sCAAsC;AAC/C;AAAA,IACJ;AAEA,QAAI,CAACW,GAAa;AACd,MAAAhB,EAAQ,IAAI,GACZG,EAAW,EAAK,GAChBE;AAAA,QACKT,IAEK,sEADA;AAAA,MACA;AAEV;AAAA,IACJ;AAEA,UAAMsB,IAAiBR,EAAmB,YAAY,QAAQA,EAAmB,YAAYK;AAG7F,QAFAL,EAAmB,UAAUK,GAEzB,CAACG,KAAkBV,EAAc,YAAYM,KAAiBf,MAAS,QAAQO,MAAe;AAC9F;AAEJ,IAAAE,EAAc,UAAUM,GAExBX,EAAW,EAAI,GACfE,EAAS,IAAI;AAEb,UAAMc,IAAa,IAAI,gBAAA;AAEvB,WAAAzB,EACK,SAAsBsB,GAAavB,GAAWK,GAAY,EAAE,SAASoB,GAAgB,QAAQC,EAAW,OAAA,CAAQ,EAChH,KAAK,CAACC,MAAW;AACd,MAAID,EAAW,OAAO,WACtBnB,EAAQ,EAAE,MAAMoB,EAAO,MAAM,SAASA,EAAO,SAAS;AAAA,IAC1D,CAAC,EACA,MAAM,CAACC,MAAQ;AACZ,MAAIF,EAAW,OAAO,WAClBE,aAAe,gBAAgBA,EAAI,SAAS,gBAChDhB,EAASgB,aAAe,QAAQ,iBAAiBA,EAAI,OAAO,KAAK,2CAA2C;AAAA,IAChH,CAAC,EACA,QAAQ,MAAM;AACX,MAAKF,EAAW,OAAO,aAAoB,EAAK;AAAA,IACpD,CAAC,GAEE,MAAM;AAAA,IAGb;AAAA,EACJ,GAAG,CAAC1B,GAAWa,GAAYQ,GAAeC,GAAaC,GAAatB,CAAM,CAAC;AAE3E,QAAM4B,IAAeV;AAAA,IACjB,CAA4CW,MAA6D;AACrG,UAAI,CAACxB,EAAM,QAAO;AAElB,YAAMyB,IADiB,OAAQD,EAA2B,SAAU,aAChCA,IAA6BE,EAAaF,CAAW,GACnFH,IAAS,IAAIM,GAA0B3B,GAAMyB,EAAU,UAAU;AACvE,aAAAJ,EAAO,eAAeI,GACfJ;AAAA,IACX;AAAA,IACA,CAACrB,CAAI;AAAA,EAAA;AAGT,SAAO,EAAE,MAAAA,GAAM,SAAAG,GAAS,OAAAE,GAAO,SAAAO,GAAS,cAAAW,EAAA;AAC5C;AAxFgBK,EAAAnC,IAAA;AC2EhB,SAASoC,EAAuBC,GAGpB;AACR,MAAIA,EAAK,aAAa,aAAaA,EAAK,aAAa,aAAc,QAAO;AAC1E,QAAMC,IAAID,EAAK;AACf,SAAuBC,KAAM,QAAQA,MAAM,KAAW,KAClD,MAAM,QAAQA,CAAC,IACRA,EAAE,KAAK,CAACC,MAAMA,KAAM,QAA2BA,MAAM,EAAE,IAE3D;AACX;AAXSJ,EAAAC,GAAA;AAgCT,SAASI,GACLC,GACAV,GACAW,GACAC,GACuB;AACvB,QAAMC,wBAAkB,IAAA;AACxB,EAAAH,EAAQ,QAAQ,CAACI,GAAGC,MAAMF,EAAY,IAAIC,EAAE,eAAeC,CAAC,CAAC;AAE7D,QAAMC,IAA+B,EAAE,IAAIJ,EAAA;AAC3C,aAAWK,KAAO,OAAO,KAAKjB,CAAM,GAAG;AACnC,UAAMkB,IAAOlB,EAAOiB,CAAG,GACjBE,IAAQ,OAAOD,KAAS,YAAYA,EAAK,SAAS,IAAI,GACtDE,IAAMP,EAAY,IAAII,EAAI,YAAA,CAAa,KAAK,IAC5CI,IAAoCD,KAAO,IAAIT,EAAI,OAAOS,CAAG,IAAI;AACvE,IAAID,IACAH,EAAIC,CAAG,KAAII,KAAA,gBAAAA,EAAO,OAAM,CAAA,IAExBL,EAAIC,CAAG,KAAII,KAAA,gBAAAA,EAAO,MAAK;AAAA,EAE/B;AACA,SAAOL;AACX;AAtBSZ,EAAAK,IAAA;AA+BF,SAASa,GACZC,GACAC,GAC6B;AAC7B,QAAMrD,IAASC,EAAA,GACTC,IAAaC,EAAA,GACbkB,KAAcnB,KAAA,gBAAAA,EAAY,gBAAe,GAOzCkB,IAAgB,KAAK,UAAU;AAAA,IACjC,IAAGlB,KAAA,gBAAAA,EAAY,eAAc;AAAA,IAC7B,IAAGA,KAAA,gBAAAA,EAAY,oBAAmB;AAAA,EAAA,CACrC,GAEKoD,IAASC,GAAA,GASTC,IAAmB,OAAQH,EAAgC,SAAU,YACrEI,IAAYC,EAAQ,MAAM;AAC5B,QAAI;AACA,YAAMC,IAAMH,IACLH,EAAgC,aAChCA;AACP,aAAO,KAAK,UAAUM,CAAG;AAAA,IAC7B,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ,GAAG,CAACN,GAAaG,CAAgB,CAAC,GAO5B,CAACI,GAAqBC,CAAsB,IAAItD,EAAmC,CAAA,CAAE,GAIrFuD,IAAiBJ,EAAsD,MAAM;AAC/E,UAAMK,IAAMP,IACLH,EAAgC,aAChCA,GACDW,IAAqD,CAAA;AAC3D,eAAWlB,KAAO,OAAO,KAAKiB,CAAG,GAAG;AAChC,YAAME,IAAOC,GAAwBH,EAAkCjB,CAAG,CAAC;AAC3E,MAAImB,KAAQA,EAAK,WAAW,cACxBD,EAAK,KAAK,EAAE,OAAOlB,GAAK,UAAUmB,EAAK,UAAU;AAAA,IAEzD;AACA,WAAOD;AAAA,EACX,GAAG,CAACP,GAAWD,CAAgB,CAAC,GAE1BW,IAAeT,EAAyB,MAAM;;AAChD,UAAMU,IAAOZ,IACNH,IACDtB,EAAasB,CAAgB;AAKnC,eAAWgB,KAAOP,GAAgB;AAC9B,YAAMQ,IAAOV,EAAoBS,EAAI,KAAK;AAC1C,MAAKC,OACJC,IAAAH,EAAaC,EAAI,KAAK,MAAtB,QAAAE,EAAyB,UAAU;AAAA,QAChC,MAAM;AAAA,QACN,cAAcD;AAAA,QACd,qBAAqBD,EAAI;AAAA,MAAA;AAAA,IAEjC;AACA,WAAOD;AAAA,EAEX,GAAG,CAACX,GAAWD,GAAkBM,GAAgBF,CAAmB,CAAC;AAYrE,EAAArC,EAAU,MAAM;AACZ,QAAIuC,EAAe,WAAW,EAAG;AACjC,UAAMU,IAAKtE;AACX,QAAI,EAACsE,KAAA,QAAAA,EAAI,aAAa;AAEtB,QAAIC,IAAY;AAChB,UAAMC,IAAO;AAAA,MACT,YAAYF,EAAG,cAAc,CAAA;AAAA,MAC7B,iBAAiBA,EAAG;AAAA,IAAA;AAGxB,eAAWH,KAAOP;AACd,MAAA9D,EACK,kBAAkBwE,EAAG,aAAapB,GAAQiB,EAAI,OAAOK,CAAI,EACzD,KAAK,CAACrE,MAAS;AACZ,YAAIoE,KAAa,CAACpE,EAAM;AAKxB,cAAMsE,IAAUtE,EAAK,OAAO,OAAO,CAAC+B,MAAmBA,KAAK,IAAI;AAChE,QAAAyB,EAAuB,CAACe,OAAU,EAAE,GAAGA,GAAM,CAACP,EAAI,KAAK,GAAGM,EAAA,EAAU;AAAA,MACxE,CAAC,EACA,MAAM,MAAM;AAAA,MAEb,CAAC;AAGT,WAAO,MAAM;AACT,MAAAF,IAAY;AAAA,IAChB;AAAA,EACJ,GAAG,CAACX,GAAgB1C,GAAegC,GAAQpD,CAAM,CAAC;AAElD,QAAM,CAACU,GAAOC,CAAQ,IAAIJ,EAAwB,IAAI,GAChD,CAACC,GAASC,CAAU,IAAIF,EAAS,EAAK,GACtC,CAACsE,GAAWC,CAAY,IAAIvE,EAAS,EAAK,GAC1CwE,IAAchE,EAAO,CAAC,GAatBiE,IAAoBjE,EAAsB,IAAI,GAC9CkE,IAAuBlE,EAAmC,IAAI,GAO9DmE,IAAgBnE,EAAOb,CAAU;AACvC,EAAAgF,EAAc,UAAUhF;AACxB,QAAMiF,IAAkBpE,EAAOoD,CAAY;AAC3C,EAAAgB,EAAgB,UAAUhB;AAE1B,QAAMiB,IAAUlE;AAAA,IACZ,OAAOmE,MAA4D;;AAC/D,YAAMb,IAAKU,EAAc,SACnBI,IAAKH,EAAgB;AAC3B,UAAI,CAAC/B;AACD,cAAM,IAAI,MAAM,2DAA2D;AAE/E,UAAI,EAACoB,KAAA,QAAAA,EAAI;AACL,cAAM,IAAI;AAAA,UACLA,IAEK,sEADA;AAAA,QACA;AAId,YAAMe,MAAOhB,IAAAc,EAAO,oBAAP,gBAAAd,EAAwB,SAAQ,GACvCiB,MAAWC,IAAAJ,EAAO,oBAAP,gBAAAI,EAAwB,aAAY,IAE/CC,KAAmBL,EAAO,YAAY,SAAS,CAAA,GAChD,OAAOnD,CAAsB,EAC7B,IAAI,CAACyD,OAAO,EAAE,OAAOA,EAAE,OAAO,IAAIA,EAAE,UAAU,OAAOA,EAAE,MAAA,EAAQ,GAE9DjB,IAAO;AAAA,QACT,YAAYF,EAAG;AAAA,QACf,MAAAe;AAAA,QACA,UAAAC;AAAA,QACA,MAAMH,EAAO,UAAU,IAAI,CAACO,OAAO,EAAE,OAAOA,EAAE,OAAO,KAAMA,EAAE,QAAQ,QAA2B;AAAA,QAChG,QAAQF;AAAA,QACR,iBAAiBlB,EAAG;AAAA,MAAA,GAUlBqB,IAAa,KAAK,UAAUnB,CAAI;AACtC,UAAIM,EAAkB,YAAYa,KAAcZ,EAAqB;AACjE,eAAOA,EAAqB;AAGhC,MAAAF,EAAY,WAAW,GACvBtE,EAAW,EAAI;AACf,UAAI;AACA,YAAIqF;AACJ,YAAI;AACA,UAAAA,IAAO,MAAM9F,EAAO,aAA4BwE,EAAG,aAAapB,GAAQsB,CAAI;AAAA,QAChF,SAAS/C,GAAK;AACV,gBAAM,IAAI,MAAM,qCAAqCA,aAAe,QAAQA,EAAI,UAAU,OAAOA,CAAG,CAAC,GAAG,KAAA,CAAM;AAAA,QAClH;AACA,cAAMoE,KAAYT,EAAG,YACfU,KAAOF,EAAK,KAAK;AAAA,UAAI,CAACG,GAAGrD,OAC3BN,GAA0BwD,EAAK,SAASC,IAAWE,GAAGV,IAAOC,IAAW5C,EAAC;AAAA,QAAA;AAE7E,QAAAjC,EAAS,IAAI;AAUb,cAAMuF,KACF,OAAOJ,EAAK,YAAa,WAAWA,EAAK,WAAW,IAClDpE,IAA8B,EAAE,MAAAsE,IAAM,UAAAE,GAAA;AAC5C,eAAAlB,EAAkB,UAAUa,GAC5BZ,EAAqB,UAAUvD,GACxBA;AAAAA,MACX,UAAA;AACI,QAAAqD,EAAY,UAAU,KAAK,IAAI,GAAGA,EAAY,UAAU,CAAC,GACrDA,EAAY,YAAY,KAAGtE,EAAW,EAAK;AAAA,MACnD;AAAA,IACJ;AAAA,IACA,CAAC2C,GAAQpD,CAAM;AAAA,EAAA,GAGbmG,IAAUjF,EAAY,CAACS,MAAiB;AAC1C,UAAMyE,IACFzE,aAAe,QACTA,EAAI,QAAQ,WAAW,eAAe,IAClCA,EAAI,UACJ,iBAAiBA,EAAI,OAAO,KAChC;AACV,IAAAhB,EAASyF,CAAG;AAAA,EAChB,GAAG,CAAA,CAAE,GA6BCC,IAAkBtF,EAAsB,IAAI,GAC5CuF,IAAyBvF,EAA6C,IAAI;AAChF,EAAAQ,EAAU,MAAM;AACZ,UAAMgF,IAAa,GAAGnF,CAAa,IAAIC,CAAW;AAClD,QAAIgF,EAAgB,YAAYE;AAEhC,aAAID,EAAuB,WACvB,aAAaA,EAAuB,OAAO,GAG/CA,EAAuB,UAAU,WAAW,MAAM;AAK9C,YAJAA,EAAuB,UAAU,MAI7BD,EAAgB,YAAYE,EAAY;AAC5C,QAAAF,EAAgB,UAAUE,GAO1BvB,EAAkB,UAAU,MAC5BC,EAAqB,UAAU;AAE/B,cAAMuB,IAAMlD,EAAO;AACnB,YAAI,CAACkD,EAAK;AACV,cAAMC,IAAMD,EAAY;AACxB,QAAKC,MACDA,EAAG,SAAS,OAAOA,EAAG,MAAM,SAAU,cACtCA,EAAG,MAAM,MAAA,GAET,OAAOA,EAAG,aAAc,cACxBA,EAAG,UAAA;AAAA,MAEX,GAAG,EAAE,GAEE,MAAM;AAIT,QAAIH,EAAuB,YACvB,aAAaA,EAAuB,OAAO,GAC3CA,EAAuB,UAAU;AAAA,MAEzC;AAAA,EACJ,GAAG,CAAClF,GAAeC,GAAaiC,CAAM,CAAC;AAEvC,QAAMrC,IAAUC,EAAY,MAAM;AAI9B,IAAA8D,EAAkB,UAAU,MAC5BC,EAAqB,UAAU;AAC/B,UAAMuB,IAAMlD,EAAO,SACbmD,IAAMD,KAAA,gBAAAA,EAAa;AACzB,IAAKC,MACDA,EAAG,SAAS,OAAOA,EAAG,MAAM,SAAU,cACtCA,EAAG,MAAM,MAAA,GAET,OAAOA,EAAG,aAAc,gBAAe,UAAA;AAAA,EAC/C,GAAG,CAACnD,CAAM,CAAC,GAiBLoD,IAAiBxF;AAAA,IACnB,OAAOyF,GAAwBC,MAAqC;AAChE,YAAMpC,IAAKU,EAAc;AACzB,UAAI,CAAC9B;AACD,cAAM,IAAI,MAAM,2DAA2D;AAE/E,UAAI,EAACoB,KAAA,QAAAA,EAAI;AACL,cAAM,IAAI;AAAA,UACLA,IAEK,sEADA;AAAA,QACA;AAId,MAAAM,EAAa,EAAI;AACjB,UAAI;AACA,cAAM+B,IAAcF,EAAO,YAAA,GAOrBH,IAAWlD,EAAO,SAClBwD,IACF,QAAON,KAAA,gBAAAA,EAAK,iBAAiB,aAAaA,EAAI,aAAA,IAAiB,CAAA,GAC7DO,IACF,QAAOP,KAAA,gBAAAA,EAAK,mBAAmB,aACzBA,EAAI,eAAA,IACJ,EAAE,OAAO,GAAC,GAEd9B,IAAO;AAAA,UACT,YAAYF,EAAG;AAAA,UACf,MAAMsC,EAAU,IAAI,CAAClB,OAAO,EAAE,OAAOA,EAAE,OAAO,KAAMA,EAAE,QAAQ,QAA2B;AAAA,UACzF,SAASmB,EAAY,SAAS,CAAA,GACzB,OAAO7E,CAAsB,EAC7B,IAAI,CAACyD,OAAO,EAAE,OAAOA,EAAE,OAAO,IAAIA,EAAE,UAAU,OAAOA,EAAE,MAAA,EAAQ;AAAA,UACpE,iBAAiBnB,EAAG;AAAA,QAAA;AAGxB,YAAIwC;AACJ,YAAI;AACA,UAAAA,IAAO,MAAMhH,EAAO,YAAYwE,EAAG,aAAapB,GAAQuD,GAAQjC,CAAI;AAAA,QACxE,SAAS/C,GAAK;AACV,gBAAM,IAAI,MAAM,iBAAiBkF,CAAW,mBAAmBlF,aAAe,QAAQA,EAAI,UAAU,OAAOA,CAAG,CAAC,GAAG,MAAM;AAAA,QAC5H;AACA,cAAMsF,IAAU,IAAI,gBAAgBD,CAAI;AACxC,YAAI;AACA,gBAAME,IAAS,SAAS,cAAc,GAAG;AACzC,UAAAA,EAAO,OAAOD,GACdC,EAAO,WAAWN,KAAY,GAAGxD,CAAM,IAAIuD,CAAM,IAIjD,SAAS,KAAK,YAAYO,CAAM,GAChCA,EAAO,MAAA,GACP,SAAS,KAAK,YAAYA,CAAM;AAAA,QACpC,UAAA;AAGI,cAAI,gBAAgBD,CAAO;AAAA,QAC/B;AAAA,MACJ,UAAA;AAII,QAAAnC,EAAa,EAAK;AAAA,MACtB;AAAA,IACJ;AAAA,IACA,CAAC1B,GAAQE,GAAQtD,CAAM;AAAA,EAAA,GAMrBmH,KAAcjG;AAAA,IAChB,CAAC0F,MAAsBF,EAAe,OAAOE,CAAQ;AAAA,IACrD,CAACF,CAAc;AAAA,EAAA,GAEbU,KAAelG;AAAA,IACjB,CAAC0F,MAAsBF,EAAe,QAAQE,CAAQ;AAAA,IACtD,CAACF,CAAc;AAAA,EAAA,GAGbhF,IAAwC;AAAA,IAC1C,SAAA0D;AAAA,IACA,SAAAe;AAAA,IACA,QAAA7C;AAAA,IACA,cAAAa;AAAA,IACA,OAAAzD;AAAA,IACA,SAAAF;AAAA,IACA,SAAAS;AAAA,IACA,aAAAkG;AAAA,IACA,cAAAC;AAAA,IACA,WAAAvC;AAAA;AAAA;AAAA,IAGA,kBAAkB;AAAA,EAAA;AAEtB,SAAAnD,EAAO,mBAAmB,MAAMA,GACzBA;AACX;AApcgBO,EAAAkB,IAAA;;;;;;;;;;;;;;"}
@@ -0,0 +1,94 @@
1
+ var f = Object.defineProperty;
2
+ var n = (t, i) => f(t, "name", { value: i, configurable: !0 });
3
+ import { r as d, b as y, a as h, c as v, d as g, u as x, w as k } from "./createBiTheme-TyUv_UHM.js";
4
+ import { jsx as P } from "react/jsx-runtime";
5
+ import { useMemo as u, useEffect as m } from "react";
6
+ import { useTheme as p, alpha as r } from "@mui/material/styles";
7
+ function c(t) {
8
+ const i = d(t), e = t.palette, o = typeof t.shape.borderRadius == "number" ? `${t.shape.borderRadius}px` : String(t.shape.borderRadius);
9
+ return {
10
+ "--bi-bg": e.background.default,
11
+ "--bi-card-bg": e.background.paper,
12
+ "--bi-card-border": e.divider,
13
+ "--bi-card-border-strong": r(e.text.primary, 0.28),
14
+ "--bi-text-1": e.text.primary,
15
+ "--bi-text-2": e.text.secondary,
16
+ "--bi-text-disabled": e.text.disabled,
17
+ "--bi-grid-line": r(e.text.primary, 0.12),
18
+ "--bi-hover": e.action.hover,
19
+ "--bi-selected": e.action.selected,
20
+ "--bi-overlay": r(e.text.primary, 0.08),
21
+ "--bi-surface-1": r(e.text.primary, 0.03),
22
+ "--bi-surface-2": r(e.text.primary, 0.06),
23
+ "--bi-accent": e.primary.main,
24
+ "--bi-accent-soft": r(e.primary.main, 0.12),
25
+ "--bi-accent-border": r(e.primary.main, 0.3),
26
+ "--bi-positive": i.positive,
27
+ "--bi-positive-soft": r(i.positive, 0.15),
28
+ "--bi-negative": i.negative,
29
+ "--bi-negative-soft": r(i.negative, 0.15),
30
+ "--bi-neutral": i.neutral,
31
+ "--bi-neutral-soft": r(i.neutral, 0.15),
32
+ "--bi-error": e.error.main,
33
+ "--bi-error-soft": r(e.error.main, 0.08),
34
+ // ── Composer / sketch pad (`composer.css`) ──
35
+ "--bi-secondary": e.secondary.main,
36
+ "--bi-secondary-soft": r(e.secondary.main, 0.16),
37
+ "--bi-sketch-dash": r(e.text.primary, 0.35),
38
+ "--bi-sketch-dash-faint": r(e.text.primary, 0.12),
39
+ "--bi-sketch-selection": r(e.primary.main, 0.12),
40
+ "--bi-scrim": r(e.common.black, 0.4),
41
+ "--bi-highlight-outline": e.secondary.main,
42
+ "--bi-highlight-glow": r(e.secondary.main, 0.35),
43
+ "--bi-shadow": t.shadows[4],
44
+ "--bi-shadow-strong": t.shadows[8],
45
+ "--bi-radius": o,
46
+ "--bi-radius-sm": `${Math.max(2, Math.round((typeof t.shape.borderRadius == "number" ? t.shape.borderRadius : 4) / 2))}px`,
47
+ "--bi-font-family": t.typography.fontFamily ?? "inherit"
48
+ };
49
+ }
50
+ n(c, "computeBiCssVars");
51
+ const B = /* @__PURE__ */ n(({ children: t, className: i, style: e }) => {
52
+ const o = p(), a = u(() => c(o), [o]);
53
+ return m(() => {
54
+ if (t !== void 0 || typeof document > "u") return;
55
+ const s = document.documentElement;
56
+ for (const [b, l] of Object.entries(a)) s.style.setProperty(b, l);
57
+ return () => {
58
+ for (const b of Object.keys(a)) s.style.removeProperty(b);
59
+ };
60
+ }, [a, t]), t === void 0 ? null : /* @__PURE__ */ P("div", { className: i, "data-bi-theme": o.palette.mode, style: { ...a, height: "100%", ...e }, children: t });
61
+ }, "BiThemeBridge");
62
+ function j(t) {
63
+ const i = p(), e = u(() => c(i), [i]);
64
+ return m(() => {
65
+ const o = t ?? (typeof document < "u" ? document.documentElement : null);
66
+ if (o) {
67
+ for (const [a, s] of Object.entries(e)) o.style.setProperty(a, s);
68
+ return () => {
69
+ for (const a of Object.keys(e)) o.style.removeProperty(a);
70
+ };
71
+ }
72
+ }, [e, t]), e;
73
+ }
74
+ n(j, "useBiCssVars");
75
+ const S = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
76
+ __proto__: null,
77
+ BiThemeBridge: B,
78
+ biDarkPalette: y,
79
+ biLightPalette: h,
80
+ biSeriesColor: v,
81
+ computeBiCssVars: c,
82
+ createBiTheme: g,
83
+ resolveBiPalette: d,
84
+ useBiCssVars: j,
85
+ useBiPalette: x,
86
+ withBiPalette: k
87
+ }, Symbol.toStringTag, { value: "Module" }));
88
+ export {
89
+ B,
90
+ S as T,
91
+ c,
92
+ j as u
93
+ };
94
+ //# sourceMappingURL=index-D7Oo_dC-.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-D7Oo_dC-.js","sources":["../src/theme/BiThemeBridge.tsx"],"sourcesContent":["import React, { useEffect, useMemo } from 'react';\nimport { alpha, useTheme } from '@mui/material/styles';\nimport type { Theme } from '@mui/material/styles';\nimport { resolveBiPalette } from './createBiTheme';\n\n/**\n * The CSS custom properties the package's stylesheets consume\n * (`GridLayout.css`, `inline.css`, `composer.css`). Every value is derived from the MUI theme —\n * the stylesheets themselves contain no colour.\n */\nexport function computeBiCssVars(theme: Theme): Record<string, string> {\n const bi = resolveBiPalette(theme);\n const p = theme.palette;\n const radius = typeof theme.shape.borderRadius === 'number' ? `${theme.shape.borderRadius}px` : String(theme.shape.borderRadius);\n return {\n '--bi-bg': p.background.default,\n '--bi-card-bg': p.background.paper,\n '--bi-card-border': p.divider,\n '--bi-card-border-strong': alpha(p.text.primary, 0.28),\n '--bi-text-1': p.text.primary,\n '--bi-text-2': p.text.secondary,\n '--bi-text-disabled': p.text.disabled,\n '--bi-grid-line': alpha(p.text.primary, 0.12),\n '--bi-hover': p.action.hover,\n '--bi-selected': p.action.selected,\n '--bi-overlay': alpha(p.text.primary, 0.08),\n '--bi-surface-1': alpha(p.text.primary, 0.03),\n '--bi-surface-2': alpha(p.text.primary, 0.06),\n '--bi-accent': p.primary.main,\n '--bi-accent-soft': alpha(p.primary.main, 0.12),\n '--bi-accent-border': alpha(p.primary.main, 0.3),\n '--bi-positive': bi.positive,\n '--bi-positive-soft': alpha(bi.positive, 0.15),\n '--bi-negative': bi.negative,\n '--bi-negative-soft': alpha(bi.negative, 0.15),\n '--bi-neutral': bi.neutral,\n '--bi-neutral-soft': alpha(bi.neutral, 0.15),\n '--bi-error': p.error.main,\n '--bi-error-soft': alpha(p.error.main, 0.08),\n // ── Composer / sketch pad (`composer.css`) ──\n '--bi-secondary': p.secondary.main,\n '--bi-secondary-soft': alpha(p.secondary.main, 0.16),\n '--bi-sketch-dash': alpha(p.text.primary, 0.35),\n '--bi-sketch-dash-faint': alpha(p.text.primary, 0.12),\n '--bi-sketch-selection': alpha(p.primary.main, 0.12),\n '--bi-scrim': alpha(p.common.black, 0.4),\n '--bi-highlight-outline': p.secondary.main,\n '--bi-highlight-glow': alpha(p.secondary.main, 0.35),\n '--bi-shadow': theme.shadows[4],\n '--bi-shadow-strong': theme.shadows[8],\n '--bi-radius': radius,\n '--bi-radius-sm': `${Math.max(2, Math.round((typeof theme.shape.borderRadius === 'number' ? theme.shape.borderRadius : 4) / 2))}px`,\n '--bi-font-family': theme.typography.fontFamily ?? 'inherit',\n };\n}\n\nexport interface BiThemeBridgeProps {\n /**\n * With children: renders a wrapper `div` carrying the variables as inline\n * style, so the theme applies to that subtree only (several themes may\n * coexist on one page). Without children: writes the variables onto\n * `document.documentElement` on mount and updates them when the theme\n * changes.\n */\n children?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * Publishes the theme-derived CSS custom properties the package stylesheets\n * read. Mount it once inside your `<ThemeProvider>` (either around the BI\n * surface, or childless at the app root).\n */\nexport const BiThemeBridge: React.FC<BiThemeBridgeProps> = ({ children, className, style }) => {\n const theme = useTheme();\n const vars = useMemo(() => computeBiCssVars(theme), [theme]);\n\n useEffect(() => {\n if (children !== undefined) return;\n if (typeof document === 'undefined') return;\n const root = document.documentElement;\n for (const [k, v] of Object.entries(vars)) root.style.setProperty(k, v);\n return () => {\n for (const k of Object.keys(vars)) root.style.removeProperty(k);\n };\n }, [vars, children]);\n\n if (children === undefined) return null;\n return (\n <div className={className} data-bi-theme={theme.palette.mode} style={{ ...(vars as React.CSSProperties), height: '100%', ...style }}>\n {children}\n </div>\n );\n};\n\n/**\n * Hook form of the bridge: applies the variables to `target` (default:\n * `document.documentElement`) for as long as the calling component is mounted.\n */\nexport function useBiCssVars(target?: HTMLElement | null): Record<string, string> {\n const theme = useTheme();\n const vars = useMemo(() => computeBiCssVars(theme), [theme]);\n useEffect(() => {\n const el = target ?? (typeof document !== 'undefined' ? document.documentElement : null);\n if (!el) return;\n for (const [k, v] of Object.entries(vars)) el.style.setProperty(k, v);\n return () => {\n for (const k of Object.keys(vars)) el.style.removeProperty(k);\n };\n }, [vars, target]);\n return vars;\n}\n\nexport default BiThemeBridge;\n"],"names":["computeBiCssVars","theme","bi","resolveBiPalette","p","radius","alpha","__name","BiThemeBridge","children","className","style","useTheme","vars","useMemo","useEffect","root","k","v","useBiCssVars","target","el"],"mappings":"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"}