@dlh.io/bideux 0.1.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 (90) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +90 -0
  3. package/dist/all.d.ts +14 -0
  4. package/dist/all.js +15 -0
  5. package/dist/all.js.map +1 -0
  6. package/dist/chunk-62IQGXLW.js +11470 -0
  7. package/dist/chunk-62IQGXLW.js.map +1 -0
  8. package/dist/chunk-75CRTQK7.js +315 -0
  9. package/dist/chunk-75CRTQK7.js.map +1 -0
  10. package/dist/chunk-FVO6E22Z.js +225 -0
  11. package/dist/chunk-FVO6E22Z.js.map +1 -0
  12. package/dist/chunk-GRITOB4M.js +337 -0
  13. package/dist/chunk-GRITOB4M.js.map +1 -0
  14. package/dist/chunk-HPFHIZWO.js +40 -0
  15. package/dist/chunk-HPFHIZWO.js.map +1 -0
  16. package/dist/chunk-IMNUQGHE.js +2864 -0
  17. package/dist/chunk-IMNUQGHE.js.map +1 -0
  18. package/dist/chunk-LHD445PJ.js +571 -0
  19. package/dist/chunk-LHD445PJ.js.map +1 -0
  20. package/dist/chunk-LPLBBHOW.js +386 -0
  21. package/dist/chunk-LPLBBHOW.js.map +1 -0
  22. package/dist/chunk-NGM5R3LW.js +881 -0
  23. package/dist/chunk-NGM5R3LW.js.map +1 -0
  24. package/dist/chunk-OMPR32AR.js +1320 -0
  25. package/dist/chunk-OMPR32AR.js.map +1 -0
  26. package/dist/chunk-QDQ5VVTC.js +255 -0
  27. package/dist/chunk-QDQ5VVTC.js.map +1 -0
  28. package/dist/chunk-RRWZKNDZ.js +1004 -0
  29. package/dist/chunk-RRWZKNDZ.js.map +1 -0
  30. package/dist/chunk-SRWIBMEB.js +178 -0
  31. package/dist/chunk-SRWIBMEB.js.map +1 -0
  32. package/dist/element/chunk-AOKCBPMV.js +1646 -0
  33. package/dist/element/chunk-AOKCBPMV.js.map +1 -0
  34. package/dist/element/chunk-B67SYRQP.js +281 -0
  35. package/dist/element/chunk-B67SYRQP.js.map +1 -0
  36. package/dist/element/chunk-FNRVFA2C.js +55 -0
  37. package/dist/element/chunk-FNRVFA2C.js.map +1 -0
  38. package/dist/element/chunk-G3C722QP.js +4707 -0
  39. package/dist/element/chunk-G3C722QP.js.map +1 -0
  40. package/dist/element/chunk-H5IFOSQP.js +346 -0
  41. package/dist/element/chunk-H5IFOSQP.js.map +1 -0
  42. package/dist/element/chunk-LXR3CLCN.js +30 -0
  43. package/dist/element/chunk-LXR3CLCN.js.map +1 -0
  44. package/dist/element/chunk-TFV4CJR4.js +183 -0
  45. package/dist/element/chunk-TFV4CJR4.js.map +1 -0
  46. package/dist/element/chunk-TXSK3CIN.js +859 -0
  47. package/dist/element/chunk-TXSK3CIN.js.map +1 -0
  48. package/dist/element/chunk-WDTTBY3S.js +45 -0
  49. package/dist/element/chunk-WDTTBY3S.js.map +1 -0
  50. package/dist/element/chunk-ZI3RYCAR.js +233 -0
  51. package/dist/element/chunk-ZI3RYCAR.js.map +1 -0
  52. package/dist/element/element.d.ts +3044 -0
  53. package/dist/element/element.js +146554 -0
  54. package/dist/element/element.js.map +1 -0
  55. package/dist/element/revo-grid.entry-7FHEBN3O.js +4817 -0
  56. package/dist/element/revo-grid.entry-7FHEBN3O.js.map +1 -0
  57. package/dist/element/revogr-attribution_7.entry-LSOFVZRA.js +1328 -0
  58. package/dist/element/revogr-attribution_7.entry-LSOFVZRA.js.map +1 -0
  59. package/dist/element/revogr-clipboard_3.entry-V74UIBPJ.js +494 -0
  60. package/dist/element/revogr-clipboard_3.entry-V74UIBPJ.js.map +1 -0
  61. package/dist/element/revogr-data_4.entry-2UBOKTFN.js +1041 -0
  62. package/dist/element/revogr-data_4.entry-2UBOKTFN.js.map +1 -0
  63. package/dist/element/revogr-filter-panel.entry-B24PLQU4.js +552 -0
  64. package/dist/element/revogr-filter-panel.entry-B24PLQU4.js.map +1 -0
  65. package/dist/index.d.ts +1041 -0
  66. package/dist/index.js +10 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/react.d.ts +1915 -0
  69. package/dist/react.js +14 -0
  70. package/dist/react.js.map +1 -0
  71. package/dist/renderers/echarts.d.ts +44 -0
  72. package/dist/renderers/echarts.js +6 -0
  73. package/dist/renderers/echarts.js.map +1 -0
  74. package/dist/renderers/index.d.ts +48 -0
  75. package/dist/renderers/index.js +12 -0
  76. package/dist/renderers/index.js.map +1 -0
  77. package/dist/renderers/revogrid.d.ts +76 -0
  78. package/dist/renderers/revogrid.js +6 -0
  79. package/dist/renderers/revogrid.js.map +1 -0
  80. package/dist/renderers/tabulator.d.ts +37 -0
  81. package/dist/renderers/tabulator.js +6 -0
  82. package/dist/renderers/tabulator.js.map +1 -0
  83. package/dist/result-table-CPls-277.d.ts +1885 -0
  84. package/dist/schema/dashboard.schema.json +4374 -0
  85. package/dist/schema/semantic-model.schema.json +1200 -0
  86. package/dist/schema/widget.schema.json +1793 -0
  87. package/dist/styles.css +156 -0
  88. package/dist/theme.css +1789 -0
  89. package/dist/types-CHFSsU_X.d.ts +1007 -0
  90. package/package.json +119 -0
@@ -0,0 +1,337 @@
1
+ import { observeElementResize } from './chunk-HPFHIZWO.js';
2
+ import { buildTabulatorRendererModel, formatGridCell, tableInteraction } from './chunk-QDQ5VVTC.js';
3
+ import { clearElement, createMessage, resolveRendererTheme, applyWidgetTheme, setStyles, createLabel } from './chunk-75CRTQK7.js';
4
+ import { TabulatorFull } from 'tabulator-tables';
5
+
6
+ // ../dashboard-renderer-tabulator/src/model.ts
7
+ var NAMED_SORTERS = [
8
+ "string",
9
+ "number",
10
+ "boolean",
11
+ "time",
12
+ "date",
13
+ "datetime",
14
+ "alphanum",
15
+ "exists",
16
+ "array"
17
+ ];
18
+ function namedSorter(value) {
19
+ return NAMED_SORTERS.find((sorter) => sorter === value);
20
+ }
21
+ function formatter(column) {
22
+ if (column.formatter === void 0) return void 0;
23
+ if (column.formatter.kind === "percent") {
24
+ return (cell) => formatGridCell(cell.getValue(), column.formatter);
25
+ }
26
+ return column.formatter.name;
27
+ }
28
+ function advancedColumns(model) {
29
+ return model.columns.map((column) => {
30
+ const definition = {
31
+ field: column.field,
32
+ title: column.title,
33
+ frozen: column.frozen,
34
+ headerSort: column.headerSort
35
+ };
36
+ const format = formatter(column);
37
+ if (format !== void 0) definition.formatter = format;
38
+ if (column.formatter !== void 0) {
39
+ definition.formatterParams = column.formatter.params;
40
+ }
41
+ if (column.width !== void 0) definition.width = column.width;
42
+ if (column.headerTooltip !== void 0) {
43
+ definition.headerTooltip = column.headerTooltip;
44
+ }
45
+ if (column.sorter !== void 0) {
46
+ const sorter = namedSorter(column.sorter);
47
+ if (sorter !== void 0) definition.sorter = sorter;
48
+ }
49
+ return definition;
50
+ });
51
+ }
52
+ function standardColumns(model) {
53
+ return model.columns.map((column) => ({
54
+ field: column.field,
55
+ title: column.title,
56
+ headerSort: column.sortable
57
+ }));
58
+ }
59
+ function tabulatorColumns(model) {
60
+ return model.kind === "table" ? standardColumns(model) : advancedColumns(model);
61
+ }
62
+ function tabulatorRows(model) {
63
+ return model.kind === "table" ? model.allRows : model.rows;
64
+ }
65
+ function tabulatorOptions(model) {
66
+ const options = {
67
+ data: tabulatorRows(model),
68
+ columns: tabulatorColumns(model),
69
+ height: "100%",
70
+ autoResize: false,
71
+ layout: model.kind === "table" ? "fitColumns" : model.options.layout,
72
+ pagination: model.kind === "table" ? model.totalRows > model.pageSize : model.options.pagination,
73
+ paginationSize: model.kind === "table" ? model.pageSize : model.options.pageSize,
74
+ groupBy: model.kind === "tabulator" ? model.options.groupBy : void 0,
75
+ groupStartOpen: model.kind === "tabulator" ? model.options.groupStartOpen : false,
76
+ columnDefaults: {
77
+ headerSort: model.kind === "table" ? model.columns.some((column) => column.sortable) : model.options.sortable
78
+ },
79
+ selectableRows: false,
80
+ movableColumns: false,
81
+ reactiveData: false
82
+ };
83
+ return options;
84
+ }
85
+ function tabulatorStructureKey(model) {
86
+ return JSON.stringify({
87
+ kind: model.kind,
88
+ columns: tabulatorColumns(model).map((column) => ({
89
+ field: column.field,
90
+ title: column.title,
91
+ frozen: column.frozen,
92
+ headerSort: column.headerSort,
93
+ width: column.width,
94
+ headerTooltip: column.headerTooltip,
95
+ sorter: column.sorter
96
+ })),
97
+ options: model.kind === "table" ? { pageSize: model.pageSize } : model.options,
98
+ frame: {
99
+ widgetId: model.frame.widgetId,
100
+ label: model.frame.label
101
+ },
102
+ exports: model.exports
103
+ });
104
+ }
105
+ var defaultRuntime = {
106
+ create(element, options) {
107
+ return new TabulatorFull(element, options);
108
+ }
109
+ };
110
+ function exportRequest(input, format) {
111
+ return {
112
+ widgetId: input.model.frame.widgetId,
113
+ format,
114
+ filename: input.model.exports.filename
115
+ };
116
+ }
117
+ function addToolbar(input, table, parent) {
118
+ const { exports } = input().model;
119
+ if (!exports.csv && !exports.excel) return;
120
+ const document = parent.ownerDocument;
121
+ const toolbar = document.createElement("div");
122
+ toolbar.dataset.bideuxPart = "table-actions";
123
+ setStyles(toolbar, {
124
+ display: "flex",
125
+ "justify-content": "flex-end",
126
+ gap: "6px"
127
+ });
128
+ for (const format of ["csv", "excel"]) {
129
+ if (!exports[format]) continue;
130
+ const button = document.createElement("button");
131
+ button.type = "button";
132
+ button.textContent = format === "csv" ? "CSV" : "Excel";
133
+ button.addEventListener("click", () => {
134
+ const current = input();
135
+ const request = exportRequest(current, format);
136
+ if (current.callbacks?.onExport !== void 0) {
137
+ void Promise.resolve().then(() => current.callbacks?.onExport?.(request)).catch((error) => {
138
+ input().callbacks?.onError?.(
139
+ error instanceof Error ? error : new Error("Table export failed")
140
+ );
141
+ });
142
+ } else {
143
+ table().download(
144
+ format === "csv" ? "csv" : "xlsx",
145
+ `${request.filename}.${format === "csv" ? "csv" : "xlsx"}`
146
+ );
147
+ }
148
+ });
149
+ toolbar.append(button);
150
+ }
151
+ parent.append(toolbar);
152
+ }
153
+ function tableBody(input, tokens) {
154
+ const { element, model } = input;
155
+ clearElement(element);
156
+ applyWidgetTheme(element, model.frame, tokens);
157
+ setStyles(element, {
158
+ display: "flex",
159
+ "flex-direction": "column",
160
+ gap: "8px",
161
+ overflow: "hidden"
162
+ });
163
+ element.setAttribute("aria-label", `${model.frame.widgetId} ${model.kind}`);
164
+ const document = element.ownerDocument;
165
+ if (model.frame.label?.position === "top" && model.frame.label.text !== void 0) {
166
+ element.append(createLabel(document, model.frame.label.text, tokens));
167
+ }
168
+ const mount = document.createElement("div");
169
+ mount.dataset.bideuxPart = "tabulator";
170
+ mount.setAttribute("role", "grid");
171
+ mount.setAttribute("aria-readonly", "true");
172
+ setStyles(mount, { flex: "1", "min-height": "0" });
173
+ element.append(mount);
174
+ if (model.frame.label?.position === "bottom" && model.frame.label.text !== void 0) {
175
+ element.append(createLabel(document, model.frame.label.text, tokens));
176
+ }
177
+ return { root: element, mount };
178
+ }
179
+ function mountTable(input, current, runtime) {
180
+ const tokens = resolveRendererTheme(input.theme);
181
+ const body = tableBody(input, tokens);
182
+ let tableReference = null;
183
+ addToolbar(
184
+ current,
185
+ () => {
186
+ if (tableReference === null) {
187
+ throw new Error("Tabulator is not ready");
188
+ }
189
+ return tableReference;
190
+ },
191
+ body.root
192
+ );
193
+ const table = runtime.create(
194
+ body.mount,
195
+ tabulatorOptions(input.model)
196
+ );
197
+ tableReference = table;
198
+ const mounted = {
199
+ table,
200
+ element: input.element,
201
+ structureKey: tabulatorStructureKey(input.model),
202
+ built: false,
203
+ destroyed: false,
204
+ pending: null,
205
+ observer: null,
206
+ tableBuilt: () => {
207
+ mounted.built = true;
208
+ const pending = mounted.pending;
209
+ mounted.pending = null;
210
+ if (pending !== null && !mounted.destroyed) applyData(mounted, pending);
211
+ },
212
+ rowClick: (_event, row) => {
213
+ const active = current();
214
+ if (active.widget === void 0 || active.callbacks?.onInteraction === void 0) {
215
+ return;
216
+ }
217
+ const data = row.getData();
218
+ const columns = active.model.columns.map((column) => column.field);
219
+ const projected = tableInteraction(active.widget, data, columns);
220
+ if (projected !== void 0) {
221
+ active.callbacks.onInteraction(
222
+ projected.interaction,
223
+ projected.context
224
+ );
225
+ }
226
+ }
227
+ };
228
+ table.on("tableBuilt", mounted.tableBuilt);
229
+ table.on("rowClick", mounted.rowClick);
230
+ mounted.observer = observeElementResize(input.element, () => {
231
+ if (canRedraw(mounted)) table.redraw();
232
+ });
233
+ return mounted;
234
+ }
235
+ function applyData(mounted, next) {
236
+ if (!mounted.built) {
237
+ mounted.pending = next;
238
+ return;
239
+ }
240
+ mounted.table.setColumns(tabulatorColumns(next.model));
241
+ void mounted.table.replaceData(tabulatorRows(next.model)).then(() => {
242
+ if (canRedraw(mounted)) mounted.table.redraw(true);
243
+ }).catch((error) => {
244
+ next.callbacks?.onError?.(
245
+ error instanceof Error ? error : new Error("Tabulator update failed")
246
+ );
247
+ });
248
+ }
249
+ function canRedraw(mounted) {
250
+ return mounted.built && !mounted.destroyed && mounted.element.isConnected;
251
+ }
252
+ function unmountTable(mounted) {
253
+ mounted.destroyed = true;
254
+ mounted.observer?.disconnect();
255
+ mounted.table.off("tableBuilt", mounted.tableBuilt);
256
+ mounted.table.off("rowClick", mounted.rowClick);
257
+ mounted.table.destroy();
258
+ }
259
+ function createTabulatorRenderer(input, runtime = defaultRuntime) {
260
+ let current = input;
261
+ let mounted;
262
+ try {
263
+ mounted = mountTable(input, () => current, runtime);
264
+ } catch (error) {
265
+ const normalized = error instanceof Error ? error : new Error("Tabulator rendering failed");
266
+ input.callbacks?.onError?.(normalized);
267
+ clearElement(input.element);
268
+ input.element.append(
269
+ createMessage(
270
+ input.element.ownerDocument,
271
+ normalized.message,
272
+ "error",
273
+ resolveRendererTheme(input.theme)
274
+ )
275
+ );
276
+ throw normalized;
277
+ }
278
+ return {
279
+ update(next) {
280
+ if (next.element !== current.element) {
281
+ throw new Error(
282
+ "Tabulator renderers cannot move between elements. Create a new renderer."
283
+ );
284
+ }
285
+ const nextStructure = tabulatorStructureKey(next.model);
286
+ if (nextStructure === mounted.structureKey) {
287
+ current = next;
288
+ applyWidgetTheme(
289
+ next.element,
290
+ next.model.frame,
291
+ resolveRendererTheme(next.theme)
292
+ );
293
+ applyData(mounted, next);
294
+ return;
295
+ }
296
+ unmountTable(mounted);
297
+ current = next;
298
+ mounted = mountTable(next, () => current, runtime);
299
+ },
300
+ resize() {
301
+ if (canRedraw(mounted)) mounted.table.redraw(true);
302
+ },
303
+ destroy() {
304
+ unmountTable(mounted);
305
+ clearElement(current.element);
306
+ }
307
+ };
308
+ }
309
+
310
+ // ../dashboard-renderer-tabulator/src/widget-factory.ts
311
+ function tableInput(input) {
312
+ return {
313
+ element: input.element,
314
+ model: buildTabulatorRendererModel(
315
+ input.widget,
316
+ input.result ?? {},
317
+ input.context ?? {}
318
+ ),
319
+ widget: input.widget,
320
+ ...input.callbacks === void 0 ? {} : { callbacks: input.callbacks },
321
+ ...input.theme === void 0 ? {} : { theme: input.theme }
322
+ };
323
+ }
324
+ function createTabulatorWidgetFactory(runtime) {
325
+ return (input) => {
326
+ const renderer = runtime === void 0 ? createTabulatorRenderer(tableInput(input)) : createTabulatorRenderer(tableInput(input), runtime);
327
+ return {
328
+ update: (next) => renderer.update(tableInput(next)),
329
+ resize: () => renderer.resize(),
330
+ destroy: () => renderer.destroy()
331
+ };
332
+ };
333
+ }
334
+
335
+ export { createTabulatorRenderer, createTabulatorWidgetFactory, tabulatorColumns, tabulatorOptions, tabulatorRows, tabulatorStructureKey };
336
+ //# sourceMappingURL=chunk-GRITOB4M.js.map
337
+ //# sourceMappingURL=chunk-GRITOB4M.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../dashboard-renderer-tabulator/src/model.ts","../../dashboard-renderer-tabulator/src/renderer.ts","../../dashboard-renderer-tabulator/src/widget-factory.ts"],"names":[],"mappings":"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","file":"chunk-GRITOB4M.js","sourcesContent":["import type {\n CellComponent,\n ColumnDefinition,\n Formatter,\n Options,\n} from \"tabulator-tables\";\nimport {\n formatGridCell,\n type DataRow,\n type GridColumnModel,\n type TableRendererModel,\n type TabulatorRendererModel,\n} from \"@dlh.io/bideux-dashboard-renderers\";\n\nimport type { TabulatorInputModel } from \"./types.js\";\n\nconst NAMED_SORTERS = [\n \"string\",\n \"number\",\n \"boolean\",\n \"time\",\n \"date\",\n \"datetime\",\n \"alphanum\",\n \"exists\",\n \"array\",\n] as const;\n\nfunction namedSorter(\n value: string,\n): (typeof NAMED_SORTERS)[number] | undefined {\n return NAMED_SORTERS.find((sorter) => sorter === value);\n}\n\nfunction formatter(column: GridColumnModel): Formatter | undefined {\n if (column.formatter === undefined) return undefined;\n if (column.formatter.kind === \"percent\") {\n return (cell: CellComponent) =>\n formatGridCell(cell.getValue(), column.formatter);\n }\n return column.formatter.name as Formatter;\n}\n\nfunction advancedColumns(model: TabulatorRendererModel): ColumnDefinition[] {\n return model.columns.map((column) => {\n const definition: ColumnDefinition = {\n field: column.field,\n title: column.title,\n frozen: column.frozen,\n headerSort: column.headerSort,\n };\n const format = formatter(column);\n if (format !== undefined) definition.formatter = format;\n if (column.formatter !== undefined) {\n definition.formatterParams = column.formatter.params;\n }\n if (column.width !== undefined) definition.width = column.width;\n if (column.headerTooltip !== undefined) {\n definition.headerTooltip = column.headerTooltip;\n }\n if (column.sorter !== undefined) {\n const sorter = namedSorter(column.sorter);\n if (sorter !== undefined) definition.sorter = sorter;\n }\n return definition;\n });\n}\n\nfunction standardColumns(model: TableRendererModel): ColumnDefinition[] {\n return model.columns.map((column) => ({\n field: column.field,\n title: column.title,\n headerSort: column.sortable,\n }));\n}\n\nexport function tabulatorColumns(\n model: TabulatorInputModel,\n): ColumnDefinition[] {\n return model.kind === \"table\"\n ? standardColumns(model)\n : advancedColumns(model);\n}\n\nexport function tabulatorRows(model: TabulatorInputModel): DataRow[] {\n return model.kind === \"table\" ? model.allRows : model.rows;\n}\n\nexport function tabulatorOptions(model: TabulatorInputModel): Options {\n const options: Options = {\n data: tabulatorRows(model),\n columns: tabulatorColumns(model),\n height: \"100%\",\n autoResize: false,\n layout: model.kind === \"table\" ? \"fitColumns\" : model.options.layout,\n pagination:\n model.kind === \"table\"\n ? model.totalRows > model.pageSize\n : model.options.pagination,\n paginationSize:\n model.kind === \"table\" ? model.pageSize : model.options.pageSize,\n groupBy: model.kind === \"tabulator\" ? model.options.groupBy : undefined,\n groupStartOpen:\n model.kind === \"tabulator\" ? model.options.groupStartOpen : false,\n columnDefaults: {\n headerSort:\n model.kind === \"table\"\n ? model.columns.some((column) => column.sortable)\n : model.options.sortable,\n },\n selectableRows: false,\n movableColumns: false,\n reactiveData: false,\n };\n return options;\n}\n\nexport function tabulatorStructureKey(model: TabulatorInputModel): string {\n return JSON.stringify({\n kind: model.kind,\n columns: tabulatorColumns(model).map((column) => ({\n field: column.field,\n title: column.title,\n frozen: column.frozen,\n headerSort: column.headerSort,\n width: column.width,\n headerTooltip: column.headerTooltip,\n sorter: column.sorter,\n })),\n options:\n model.kind === \"table\" ? { pageSize: model.pageSize } : model.options,\n frame: {\n widgetId: model.frame.widgetId,\n label: model.frame.label,\n },\n exports: model.exports,\n });\n}\n","import {\n TabulatorFull,\n type Options,\n type RowComponent,\n} from \"tabulator-tables\";\nimport { tableInteraction } from \"@dlh.io/bideux-dashboard-renderers\";\nimport {\n applyWidgetTheme,\n clearElement,\n createLabel,\n createMessage,\n observeElementResize,\n resolveRendererTheme,\n setStyles,\n type BrowserRenderer,\n type RendererExportRequest,\n} from \"@dlh.io/bideux-dashboard-renderer-web\";\n\nimport {\n tabulatorColumns,\n tabulatorOptions,\n tabulatorRows,\n tabulatorStructureKey,\n} from \"./model.js\";\nimport type {\n TabulatorRendererInput,\n TabulatorRuntime,\n TabulatorTable,\n} from \"./types.js\";\n\nconst defaultRuntime: TabulatorRuntime = {\n create(element, options) {\n return new TabulatorFull(element, options) as TabulatorTable;\n },\n};\n\nfunction exportRequest(\n input: TabulatorRendererInput,\n format: \"csv\" | \"excel\",\n): RendererExportRequest {\n return {\n widgetId: input.model.frame.widgetId,\n format,\n filename: input.model.exports.filename,\n };\n}\n\nfunction addToolbar(\n input: () => TabulatorRendererInput,\n table: () => TabulatorTable,\n parent: HTMLElement,\n): void {\n const { exports } = input().model;\n if (!exports.csv && !exports.excel) return;\n const document = parent.ownerDocument;\n const toolbar = document.createElement(\"div\");\n toolbar.dataset.bideuxPart = \"table-actions\";\n setStyles(toolbar, {\n display: \"flex\",\n \"justify-content\": \"flex-end\",\n gap: \"6px\",\n });\n for (const format of [\"csv\", \"excel\"] as const) {\n if (!exports[format]) continue;\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.textContent = format === \"csv\" ? \"CSV\" : \"Excel\";\n button.addEventListener(\"click\", () => {\n const current = input();\n const request = exportRequest(current, format);\n if (current.callbacks?.onExport !== undefined) {\n void Promise.resolve()\n .then(() => current.callbacks?.onExport?.(request))\n .catch((error) => {\n input().callbacks?.onError?.(\n error instanceof Error ? error : new Error(\"Table export failed\"),\n );\n });\n } else {\n table().download(\n format === \"csv\" ? \"csv\" : \"xlsx\",\n `${request.filename}.${format === \"csv\" ? \"csv\" : \"xlsx\"}`,\n );\n }\n });\n toolbar.append(button);\n }\n parent.append(toolbar);\n}\n\nfunction tableBody(\n input: TabulatorRendererInput,\n tokens: ReturnType<typeof resolveRendererTheme>,\n): { root: HTMLElement; mount: HTMLElement } {\n const { element, model } = input;\n clearElement(element);\n applyWidgetTheme(element, model.frame, tokens);\n setStyles(element, {\n display: \"flex\",\n \"flex-direction\": \"column\",\n gap: \"8px\",\n overflow: \"hidden\",\n });\n element.setAttribute(\"aria-label\", `${model.frame.widgetId} ${model.kind}`);\n const document = element.ownerDocument;\n if (\n model.frame.label?.position === \"top\" &&\n model.frame.label.text !== undefined\n ) {\n element.append(createLabel(document, model.frame.label.text, tokens));\n }\n const mount = document.createElement(\"div\");\n mount.dataset.bideuxPart = \"tabulator\";\n mount.setAttribute(\"role\", \"grid\");\n mount.setAttribute(\"aria-readonly\", \"true\");\n setStyles(mount, { flex: \"1\", \"min-height\": \"0\" });\n element.append(mount);\n if (\n model.frame.label?.position === \"bottom\" &&\n model.frame.label.text !== undefined\n ) {\n element.append(createLabel(document, model.frame.label.text, tokens));\n }\n return { root: element, mount };\n}\n\ninterface MountedTable {\n table: TabulatorTable;\n element: HTMLElement;\n structureKey: string;\n built: boolean;\n destroyed: boolean;\n pending: TabulatorRendererInput | null;\n observer: ReturnType<typeof observeElementResize>;\n tableBuilt: () => void;\n rowClick: (event: UIEvent, row: RowComponent) => void;\n}\n\nfunction mountTable(\n input: TabulatorRendererInput,\n current: () => TabulatorRendererInput,\n runtime: TabulatorRuntime,\n): MountedTable {\n const tokens = resolveRendererTheme(input.theme);\n const body = tableBody(input, tokens);\n let tableReference: TabulatorTable | null = null;\n addToolbar(\n current,\n () => {\n if (tableReference === null) {\n throw new Error(\"Tabulator is not ready\");\n }\n return tableReference;\n },\n body.root,\n );\n const table = runtime.create(\n body.mount,\n tabulatorOptions(input.model) as Options,\n );\n tableReference = table;\n const mounted: MountedTable = {\n table,\n element: input.element,\n structureKey: tabulatorStructureKey(input.model),\n built: false,\n destroyed: false,\n pending: null,\n observer: null,\n tableBuilt: () => {\n mounted.built = true;\n const pending = mounted.pending;\n mounted.pending = null;\n if (pending !== null && !mounted.destroyed) applyData(mounted, pending);\n },\n rowClick: (_event, row) => {\n const active = current();\n if (\n active.widget === undefined ||\n active.callbacks?.onInteraction === undefined\n ) {\n return;\n }\n const data = row.getData() as Record<string, unknown>;\n const columns = active.model.columns.map((column) => column.field);\n const projected = tableInteraction(active.widget, data, columns);\n if (projected !== undefined) {\n active.callbacks.onInteraction(\n projected.interaction,\n projected.context,\n );\n }\n },\n };\n table.on(\"tableBuilt\", mounted.tableBuilt);\n table.on(\"rowClick\", mounted.rowClick);\n mounted.observer = observeElementResize(input.element, () => {\n if (canRedraw(mounted)) table.redraw();\n });\n return mounted;\n}\n\nfunction applyData(mounted: MountedTable, next: TabulatorRendererInput): void {\n if (!mounted.built) {\n mounted.pending = next;\n return;\n }\n mounted.table.setColumns(tabulatorColumns(next.model));\n void mounted.table\n .replaceData(tabulatorRows(next.model))\n .then(() => {\n if (canRedraw(mounted)) mounted.table.redraw(true);\n })\n .catch((error: unknown) => {\n next.callbacks?.onError?.(\n error instanceof Error ? error : new Error(\"Tabulator update failed\"),\n );\n });\n}\n\nfunction canRedraw(mounted: MountedTable): boolean {\n return mounted.built && !mounted.destroyed && mounted.element.isConnected;\n}\n\nfunction unmountTable(mounted: MountedTable): void {\n mounted.destroyed = true;\n mounted.observer?.disconnect();\n mounted.table.off(\"tableBuilt\", mounted.tableBuilt);\n mounted.table.off(\"rowClick\", mounted.rowClick);\n mounted.table.destroy();\n}\n\nexport function createTabulatorRenderer(\n input: TabulatorRendererInput,\n runtime: TabulatorRuntime = defaultRuntime,\n): BrowserRenderer<TabulatorRendererInput> {\n let current = input;\n let mounted: MountedTable;\n try {\n mounted = mountTable(input, () => current, runtime);\n } catch (error) {\n const normalized =\n error instanceof Error ? error : new Error(\"Tabulator rendering failed\");\n input.callbacks?.onError?.(normalized);\n clearElement(input.element);\n input.element.append(\n createMessage(\n input.element.ownerDocument,\n normalized.message,\n \"error\",\n resolveRendererTheme(input.theme),\n ),\n );\n throw normalized;\n }\n\n return {\n update(next) {\n if (next.element !== current.element) {\n throw new Error(\n \"Tabulator renderers cannot move between elements. Create a new renderer.\",\n );\n }\n const nextStructure = tabulatorStructureKey(next.model);\n if (nextStructure === mounted.structureKey) {\n current = next;\n applyWidgetTheme(\n next.element,\n next.model.frame,\n resolveRendererTheme(next.theme),\n );\n applyData(mounted, next);\n return;\n }\n unmountTable(mounted);\n current = next;\n mounted = mountTable(next, () => current, runtime);\n },\n resize() {\n if (canRedraw(mounted)) mounted.table.redraw(true);\n },\n destroy() {\n unmountTable(mounted);\n clearElement(current.element);\n },\n };\n}\n","import type {\n NativeWidgetRenderInput,\n WidgetRendererFactory,\n WidgetRendererHandle,\n} from \"@dlh.io/bideux-dashboard-renderer-web\";\nimport { buildTabulatorRendererModel } from \"@dlh.io/bideux-dashboard-renderers\";\n\nimport { createTabulatorRenderer } from \"./renderer.js\";\nimport type { TabulatorRendererInput, TabulatorRuntime } from \"./types.js\";\n\nfunction tableInput(input: NativeWidgetRenderInput): TabulatorRendererInput {\n return {\n element: input.element,\n model: buildTabulatorRendererModel(\n input.widget,\n input.result ?? {},\n input.context ?? {},\n ),\n widget: input.widget,\n ...(input.callbacks === undefined ? {} : { callbacks: input.callbacks }),\n ...(input.theme === undefined ? {} : { theme: input.theme }),\n };\n}\n\n/** The grid renderer as a shell factory, modelled from the widget on update. */\nexport function createTabulatorWidgetFactory(\n runtime?: TabulatorRuntime,\n): WidgetRendererFactory {\n return (input: NativeWidgetRenderInput): WidgetRendererHandle => {\n const renderer =\n runtime === undefined\n ? createTabulatorRenderer(tableInput(input))\n : createTabulatorRenderer(tableInput(input), runtime);\n return {\n update: (next) => renderer.update(tableInput(next)),\n resize: () => renderer.resize(),\n destroy: () => renderer.destroy(),\n };\n };\n}\n"]}
@@ -0,0 +1,40 @@
1
+ // ../dashboard-renderer-web/src/resize-observer.ts
2
+ function observeElementResize(element, work) {
3
+ if (typeof ResizeObserver === "undefined") return null;
4
+ let active = true;
5
+ let frame = null;
6
+ const schedule = () => {
7
+ if (!active) return;
8
+ if (typeof requestAnimationFrame === "undefined") {
9
+ work();
10
+ return;
11
+ }
12
+ if (frame !== null) {
13
+ if (typeof cancelAnimationFrame !== "undefined") {
14
+ cancelAnimationFrame(frame);
15
+ } else {
16
+ return;
17
+ }
18
+ }
19
+ frame = requestAnimationFrame(() => {
20
+ frame = null;
21
+ if (active) work();
22
+ });
23
+ };
24
+ const observer = new ResizeObserver(schedule);
25
+ observer.observe(element);
26
+ return {
27
+ disconnect() {
28
+ active = false;
29
+ if (frame !== null && typeof cancelAnimationFrame !== "undefined") {
30
+ cancelAnimationFrame(frame);
31
+ }
32
+ frame = null;
33
+ observer.disconnect();
34
+ }
35
+ };
36
+ }
37
+
38
+ export { observeElementResize };
39
+ //# sourceMappingURL=chunk-HPFHIZWO.js.map
40
+ //# sourceMappingURL=chunk-HPFHIZWO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../dashboard-renderer-web/src/resize-observer.ts"],"names":[],"mappings":";AAIO,SAAS,oBAAA,CACd,SACA,IAAA,EACiC;AACjC,EAAA,IAAI,OAAO,cAAA,KAAmB,WAAA,EAAa,OAAO,IAAA;AAElD,EAAA,IAAI,MAAA,GAAS,IAAA;AACb,EAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,IAAI,OAAO,0BAA0B,WAAA,EAAa;AAChD,MAAA,IAAA,EAAK;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,IAAI,OAAO,yBAAyB,WAAA,EAAa;AAC/C,QAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,MAC5B,CAAA,MAAO;AACL,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,KAAA,GAAQ,sBAAsB,MAAM;AAClC,MAAA,KAAA,GAAQ,IAAA;AACR,MAAA,IAAI,QAAQ,IAAA,EAAK;AAAA,IACnB,CAAC,CAAA;AAAA,EACH,CAAA;AACA,EAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe,QAAQ,CAAA;AAC5C,EAAA,QAAA,CAAS,QAAQ,OAAO,CAAA;AACxB,EAAA,OAAO;AAAA,IACL,UAAA,GAAa;AACX,MAAA,MAAA,GAAS,KAAA;AACT,MAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,OAAO,oBAAA,KAAyB,WAAA,EAAa;AACjE,QAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,MAC5B;AACA,MAAA,KAAA,GAAQ,IAAA;AACR,MAAA,QAAA,CAAS,UAAA,EAAW;AAAA,IACtB;AAAA,GACF;AACF","file":"chunk-HPFHIZWO.js","sourcesContent":["export interface ResizeObserverAttachment {\n disconnect(): void;\n}\n\nexport function observeElementResize(\n element: HTMLElement,\n work: () => void,\n): ResizeObserverAttachment | null {\n if (typeof ResizeObserver === \"undefined\") return null;\n\n let active = true;\n let frame: number | null = null;\n const schedule = () => {\n if (!active) return;\n if (typeof requestAnimationFrame === \"undefined\") {\n work();\n return;\n }\n if (frame !== null) {\n if (typeof cancelAnimationFrame !== \"undefined\") {\n cancelAnimationFrame(frame);\n } else {\n return;\n }\n }\n frame = requestAnimationFrame(() => {\n frame = null;\n if (active) work();\n });\n };\n const observer = new ResizeObserver(schedule);\n observer.observe(element);\n return {\n disconnect() {\n active = false;\n if (frame !== null && typeof cancelAnimationFrame !== \"undefined\") {\n cancelAnimationFrame(frame);\n }\n frame = null;\n observer.disconnect();\n },\n };\n}\n"]}