@vuu-ui/vuu-datatable 0.13.7 → 0.13.9

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 (53) hide show
  1. package/cjs/index.js +741 -10
  2. package/cjs/index.js.map +1 -1
  3. package/esm/index.js +740 -5
  4. package/esm/index.js.map +1 -1
  5. package/package.json +11 -11
  6. package/cjs/filter-table/FilterTable.css.js +0 -6
  7. package/cjs/filter-table/FilterTable.css.js.map +0 -1
  8. package/cjs/filter-table/FilterTable.js +0 -44
  9. package/cjs/filter-table/FilterTable.js.map +0 -1
  10. package/cjs/filter-table/useFilterTable.js +0 -29
  11. package/cjs/filter-table/useFilterTable.js.map +0 -1
  12. package/cjs/filter-table/usePersistFilterState.js +0 -156
  13. package/cjs/filter-table/usePersistFilterState.js.map +0 -1
  14. package/cjs/json-table/JsonCell.css.js +0 -6
  15. package/cjs/json-table/JsonCell.css.js.map +0 -1
  16. package/cjs/json-table/JsonCell.js +0 -45
  17. package/cjs/json-table/JsonCell.js.map +0 -1
  18. package/cjs/json-table/JsonTable.js +0 -52
  19. package/cjs/json-table/JsonTable.js.map +0 -1
  20. package/cjs/linked-table-view/LinkedTableView.css.js +0 -6
  21. package/cjs/linked-table-view/LinkedTableView.css.js.map +0 -1
  22. package/cjs/linked-table-view/LinkedTableView.js +0 -168
  23. package/cjs/linked-table-view/LinkedTableView.js.map +0 -1
  24. package/cjs/linked-table-view/TableLayoutToggleButton.js +0 -31
  25. package/cjs/linked-table-view/TableLayoutToggleButton.js.map +0 -1
  26. package/cjs/linked-table-view/useLinkedTableView.js +0 -210
  27. package/cjs/linked-table-view/useLinkedTableView.js.map +0 -1
  28. package/cjs/tree-table/TreeTable.js +0 -73
  29. package/cjs/tree-table/TreeTable.js.map +0 -1
  30. package/esm/filter-table/FilterTable.css.js +0 -4
  31. package/esm/filter-table/FilterTable.css.js.map +0 -1
  32. package/esm/filter-table/FilterTable.js +0 -42
  33. package/esm/filter-table/FilterTable.js.map +0 -1
  34. package/esm/filter-table/useFilterTable.js +0 -27
  35. package/esm/filter-table/useFilterTable.js.map +0 -1
  36. package/esm/filter-table/usePersistFilterState.js +0 -154
  37. package/esm/filter-table/usePersistFilterState.js.map +0 -1
  38. package/esm/json-table/JsonCell.css.js +0 -4
  39. package/esm/json-table/JsonCell.css.js.map +0 -1
  40. package/esm/json-table/JsonCell.js +0 -43
  41. package/esm/json-table/JsonCell.js.map +0 -1
  42. package/esm/json-table/JsonTable.js +0 -50
  43. package/esm/json-table/JsonTable.js.map +0 -1
  44. package/esm/linked-table-view/LinkedTableView.css.js +0 -4
  45. package/esm/linked-table-view/LinkedTableView.css.js.map +0 -1
  46. package/esm/linked-table-view/LinkedTableView.js +0 -166
  47. package/esm/linked-table-view/LinkedTableView.js.map +0 -1
  48. package/esm/linked-table-view/TableLayoutToggleButton.js +0 -29
  49. package/esm/linked-table-view/TableLayoutToggleButton.js.map +0 -1
  50. package/esm/linked-table-view/useLinkedTableView.js +0 -208
  51. package/esm/linked-table-view/useLinkedTableView.js.map +0 -1
  52. package/esm/tree-table/TreeTable.js +0 -71
  53. package/esm/tree-table/TreeTable.js.map +0 -1
package/cjs/index.js CHANGED
@@ -1,16 +1,747 @@
1
1
  'use strict';
2
2
 
3
- var FilterTable = require('./filter-table/FilterTable.js');
4
- var usePersistFilterState = require('./filter-table/usePersistFilterState.js');
5
- var JsonTable = require('./json-table/JsonTable.js');
6
- var TreeTable = require('./tree-table/TreeTable.js');
7
- var LinkedTableView = require('./linked-table-view/LinkedTableView.js');
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var vuuFilters = require('@vuu-ui/vuu-filters');
5
+ var vuuTable = require('@vuu-ui/vuu-table');
6
+ var styles = require('@salt-ds/styles');
7
+ var window = require('@salt-ds/window');
8
+ var cx = require('clsx');
9
+ var react = require('react');
10
+ var vuuLayout = require('@vuu-ui/vuu-layout');
11
+ var vuuShell = require('@vuu-ui/vuu-shell');
12
+ var vuuUtils = require('@vuu-ui/vuu-utils');
13
+ var vuuDataLocal = require('@vuu-ui/vuu-data-local');
14
+ var vuuUiControls = require('@vuu-ui/vuu-ui-controls');
15
+ var core = require('@salt-ds/core');
8
16
 
17
+ const useFilterTable = ({
18
+ FilterBarProps: FilterBarProps2,
19
+ TableProps: {
20
+ config: { columns },
21
+ dataSource
22
+ }
23
+ }) => {
24
+ const handleApplyFilter = react.useCallback(
25
+ (filter) => {
26
+ dataSource.filter = filter;
27
+ },
28
+ [dataSource]
29
+ );
30
+ const filterBarProps = {
31
+ ...FilterBarProps2,
32
+ columnDescriptors: FilterBarProps2?.columnDescriptors ?? columns,
33
+ onApplyFilter: handleApplyFilter
34
+ };
35
+ return {
36
+ filterBarProps
37
+ };
38
+ };
9
39
 
40
+ var filterTableCss = ".vuuFilterTable {\n --vuuMeasuredContainer-flex: 1 1 auto;\n --vuuMeasuredContainer-height: auto;\n display: flex;\n flex-direction: column;\n\n .vuuFilterBar {\n flex: 0 0 auto;\n }\n}\n";
10
41
 
11
- exports.FilterTable = FilterTable.FilterTable;
12
- exports.usePersistFilterState = usePersistFilterState.usePersistFilterState;
13
- exports.JsonTable = JsonTable.JsonTable;
14
- exports.TreeTable = TreeTable.TreeTable;
15
- exports.LinkedTableView = LinkedTableView.LinkedTableView;
42
+ const classBase$1 = "vuuFilterTable";
43
+ const FilterTable = ({
44
+ FilterBarProps: FilterBarProps2,
45
+ TableProps: TableProps2,
46
+ style: styleProps,
47
+ ...htmlAttributes
48
+ }) => {
49
+ const targetWindow = window.useWindow();
50
+ styles.useComponentCssInjection({
51
+ testId: "vuu-filter-table",
52
+ css: filterTableCss,
53
+ window: targetWindow
54
+ });
55
+ const { filterBarProps } = useFilterTable({
56
+ TableProps: TableProps2,
57
+ FilterBarProps: FilterBarProps2
58
+ });
59
+ return /* @__PURE__ */ jsxRuntime.jsxs(
60
+ "div",
61
+ {
62
+ ...htmlAttributes,
63
+ className: cx(classBase$1),
64
+ style: { ...styleProps },
65
+ children: [
66
+ /* @__PURE__ */ jsxRuntime.jsx(vuuFilters.FilterBar, { ...filterBarProps }),
67
+ /* @__PURE__ */ jsxRuntime.jsx(vuuTable.Table, { ...TableProps2, height: "auto", width: "auto" })
68
+ ]
69
+ }
70
+ );
71
+ };
72
+
73
+ const NO_CONFIG = {};
74
+ const hasFilterWithName = (filters, name) => filters.findIndex((f) => f.name === name) !== -1;
75
+ const usePersistFilterState = ({
76
+ tableSchema
77
+ }) => {
78
+ const { load, save } = vuuLayout.useViewContext();
79
+ const { getApplicationSettings, saveApplicationSettings } = vuuShell.useWorkspace();
80
+ const { "filterbar-config": filterbarConfigFromState } = react.useMemo(() => load?.() ?? NO_CONFIG, [load]);
81
+ const [filterState, setFilterState] = react.useState({
82
+ filters: filterbarConfigFromState?.filterState?.filters ?? [],
83
+ activeIndices: filterbarConfigFromState?.filterState?.activeIndices ?? []
84
+ });
85
+ const savedFilters = react.useMemo(() => {
86
+ const {
87
+ table: { module, table }
88
+ } = tableSchema;
89
+ const savedFilters2 = getApplicationSettings("filters");
90
+ const key = `${module}:${table}`;
91
+ return savedFilters2?.[key] ?? [];
92
+ }, [getApplicationSettings, tableSchema]);
93
+ const removeFilterFromSettings = react.useCallback(
94
+ (filter) => {
95
+ if (!tableSchema || !filter.name) return;
96
+ const savedFilters2 = getApplicationSettings("filters");
97
+ if (!savedFilters2) return;
98
+ const { module, table } = tableSchema.table;
99
+ const key = `${module}:${table}`;
100
+ if (hasFilterWithName(savedFilters2[key], filter.name)) {
101
+ const newSavedFilters = {
102
+ ...savedFilters2,
103
+ [key]: savedFilters2[key].filter((f) => f.name !== filter.name)
104
+ };
105
+ saveApplicationSettings(newSavedFilters, "filters");
106
+ }
107
+ },
108
+ [getApplicationSettings, saveApplicationSettings, tableSchema]
109
+ );
110
+ const saveFilterToSettings = react.useCallback(
111
+ (filter, name) => {
112
+ if (tableSchema && name) {
113
+ const savedFilters2 = getApplicationSettings(
114
+ "filters"
115
+ );
116
+ let newFilters = savedFilters2;
117
+ const { module, table } = tableSchema.table;
118
+ const key = `${module}:${table}`;
119
+ if (savedFilters2) {
120
+ if (savedFilters2[key]) {
121
+ if (hasFilterWithName(savedFilters2[key], name)) {
122
+ newFilters = {
123
+ ...savedFilters2,
124
+ [key]: savedFilters2[key].map(
125
+ (f) => f.name === name ? { ...filter, name } : f
126
+ )
127
+ };
128
+ } else if (filter?.name && filter?.name !== name && hasFilterWithName(savedFilters2[key], filter.name)) {
129
+ newFilters = {
130
+ ...savedFilters2,
131
+ [key]: savedFilters2[key].map(
132
+ (f) => f.name === filter.name ? { ...filter, name } : f
133
+ )
134
+ };
135
+ } else {
136
+ newFilters = {
137
+ ...savedFilters2,
138
+ [key]: savedFilters2[key].concat({ ...filter, name })
139
+ };
140
+ }
141
+ } else {
142
+ newFilters = {
143
+ ...savedFilters2,
144
+ [key]: [{ ...filter, name }]
145
+ };
146
+ }
147
+ } else {
148
+ newFilters = {
149
+ [key]: [{ ...filter, name }]
150
+ };
151
+ }
152
+ if (newFilters !== savedFilters2) {
153
+ saveApplicationSettings(newFilters, "filters");
154
+ }
155
+ }
156
+ },
157
+ [getApplicationSettings, saveApplicationSettings, tableSchema]
158
+ );
159
+ const handleFilterStateChanged = react.useCallback(
160
+ (filterState2) => {
161
+ save?.({ filterState: filterState2 }, "filterbar-config");
162
+ setFilterState(filterState2);
163
+ },
164
+ [save]
165
+ );
166
+ const handleFilterDeleted = react.useCallback(
167
+ (filter) => {
168
+ removeFilterFromSettings(filter);
169
+ },
170
+ [removeFilterFromSettings]
171
+ );
172
+ const handleFilterRenamed = react.useCallback(
173
+ (filter, name) => {
174
+ saveFilterToSettings(filter, name);
175
+ },
176
+ [saveFilterToSettings]
177
+ );
178
+ const buildFilterTableMenuOptions = react.useCallback(
179
+ (location) => {
180
+ if (location === "filter-bar-menu") {
181
+ if (savedFilters.length > 0) {
182
+ return savedFilters.map((filter) => ({
183
+ id: "add-filter",
184
+ label: filter.name,
185
+ options: { filter }
186
+ }));
187
+ } else {
188
+ return [
189
+ {
190
+ label: `You have no saved filters for this table`,
191
+ id: `no-action`
192
+ }
193
+ ];
194
+ }
195
+ } else {
196
+ return [];
197
+ }
198
+ },
199
+ [savedFilters]
200
+ );
201
+ const handleFilterTableMenuAction = react.useCallback(
202
+ (menuItemId) => {
203
+ if (menuItemId === "add-filter") {
204
+ return true;
205
+ } else {
206
+ return false;
207
+ }
208
+ },
209
+ []
210
+ );
211
+ return {
212
+ buildFilterTableMenuOptions,
213
+ filterState,
214
+ handleFilterTableMenuAction,
215
+ onFilterStateChanged: handleFilterStateChanged,
216
+ onFilterDeleted: handleFilterDeleted,
217
+ onFilterRenamed: handleFilterRenamed
218
+ };
219
+ };
220
+
221
+ var arrayCellCss = ".vuuJsonCell {\n --group-cell-spacer-width: 20px;\n align-items: center;\n border-right-style: solid;\n border-right-width: 1px;\n cursor: pointer;\n display: inline-flex;\n height: var(--row-height);\n padding-left: 20px;\n line-height: 16px;\n position: relative;\n\n .vuuToggleIconButton {\n position: absolute;\n }\n}\n";
222
+
223
+ const { IS_EXPANDED, IS_LEAF: IS_LEAF$1 } = vuuUtils.metadataKeys;
224
+ const JsonCell = ({ column, columnMap, row }) => {
225
+ const targetWindow = window.useWindow();
226
+ styles.useComponentCssInjection({
227
+ testId: "vuu-array-cell",
228
+ css: arrayCellCss,
229
+ window: targetWindow
230
+ });
231
+ const { name } = column;
232
+ const dataIdx = columnMap[name];
233
+ let { [IS_EXPANDED]: isExpanded, [IS_LEAF$1]: isLeaf, [dataIdx]: value } = row;
234
+ const getDisplayValue = () => {
235
+ if (isLeaf) {
236
+ return value;
237
+ } else if (typeof value === "string" && value.endsWith("{")) {
238
+ value = value.slice(0, -1);
239
+ if (!isNaN(parseInt(value))) {
240
+ return `${value}: {...}`;
241
+ } else {
242
+ return `value {...}`;
243
+ }
244
+ } else if (typeof value === "string" && value.endsWith("[")) {
245
+ value = value.slice(0, -1);
246
+ return `${value} [...]`;
247
+ }
248
+ };
249
+ const displayValue = getDisplayValue();
250
+ const isEmpty = displayValue === "" || displayValue === void 0;
251
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
252
+ isLeaf || isEmpty ? null : /* @__PURE__ */ jsxRuntime.jsx(vuuUiControls.ToggleIconButton, { isExpanded }),
253
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: displayValue })
254
+ ] });
255
+ };
256
+
257
+ vuuUtils.registerComponent("json", JsonCell, "cell-renderer");
258
+ const JsonTable = ({
259
+ config,
260
+ source: sourceProp,
261
+ ...tableProps
262
+ }) => {
263
+ const sourceRef = react.useRef(sourceProp);
264
+ const dataSourceRef = react.useRef(void 0);
265
+ react.useMemo(() => {
266
+ dataSourceRef.current = new vuuDataLocal.JsonDataSource({
267
+ data: sourceRef.current
268
+ });
269
+ }, []);
270
+ const tableConfig = react.useMemo(() => {
271
+ return {
272
+ ...config,
273
+ columns: dataSourceRef.current?.columnDescriptors ?? [],
274
+ columnSeparators: true,
275
+ rowSeparators: true
276
+ };
277
+ }, [config]);
278
+ react.useEffect(() => {
279
+ if (dataSourceRef.current) {
280
+ dataSourceRef.current.data = sourceProp;
281
+ }
282
+ }, [sourceProp]);
283
+ if (dataSourceRef.current === void 0) {
284
+ return null;
285
+ }
286
+ return /* @__PURE__ */ jsxRuntime.jsx(
287
+ vuuTable.Table,
288
+ {
289
+ ...tableProps,
290
+ config: tableConfig,
291
+ dataSource: dataSourceRef.current,
292
+ showColumnHeaderMenus: false,
293
+ selectionModel: "none"
294
+ }
295
+ );
296
+ };
297
+
298
+ const { DEPTH, IS_LEAF, KEY, IDX } = vuuUtils.metadataKeys;
299
+ const rowToTreeNodeObject = (row, columnMap) => {
300
+ const { [IS_LEAF]: isLeaf, [KEY]: key, [IDX]: index, [DEPTH]: depth } = row;
301
+ const firstColIdx = columnMap.nodeData;
302
+ const labelColIdx = firstColIdx + depth;
303
+ return {
304
+ key,
305
+ index,
306
+ isGroupRow: !isLeaf,
307
+ isSelected: vuuUtils.isRowSelected(row),
308
+ data: {
309
+ label: row[labelColIdx],
310
+ nodeData: row[firstColIdx]
311
+ }
312
+ };
313
+ };
314
+ const TreeTable = ({
315
+ config,
316
+ dataSource,
317
+ source,
318
+ ...tableProps
319
+ }) => {
320
+ const dataSourceRef = react.useRef(void 0);
321
+ react.useMemo(() => {
322
+ if (dataSource) {
323
+ dataSourceRef.current = dataSource;
324
+ } else if (source) {
325
+ dataSourceRef.current = new vuuDataLocal.TreeDataSource({
326
+ data: source
327
+ });
328
+ } else {
329
+ throw Error(`TreeTable either source or dataSource must be provided`);
330
+ }
331
+ }, [dataSource, source]);
332
+ const tableConfig = react.useMemo(() => {
333
+ return {
334
+ ...config,
335
+ columns: dataSourceRef.current?.columnDescriptors ?? [],
336
+ columnSeparators: false,
337
+ rowSeparators: false
338
+ };
339
+ }, [config]);
340
+ console.log({ tableConfig, dataSource: dataSourceRef.current });
341
+ if (dataSourceRef.current === void 0) {
342
+ return null;
343
+ }
344
+ return /* @__PURE__ */ jsxRuntime.jsx(
345
+ vuuTable.Table,
346
+ {
347
+ ...tableProps,
348
+ className: "vuuTreeTable",
349
+ config: tableConfig,
350
+ dataSource: dataSourceRef.current,
351
+ groupToggleTarget: "toggle-icon",
352
+ navigationStyle: "tree",
353
+ rowToObject: rowToTreeNodeObject,
354
+ showColumnHeaderMenus: false,
355
+ selectionModel: "single",
356
+ selectionBookendWidth: 0
357
+ }
358
+ );
359
+ };
360
+
361
+ const getSchema = (schemas, { module, table }) => {
362
+ const schema = schemas.find(
363
+ ({ table: t }) => t.module === module && t.table === table
364
+ );
365
+ if (schema) {
366
+ return schema;
367
+ } else {
368
+ throw Error(`No schema for table ${module} ${table}`);
369
+ }
370
+ };
371
+ const getTable = (ds) => {
372
+ if (ds.table) {
373
+ return ds.table;
374
+ } else {
375
+ throw Error("No datasource table specified");
376
+ }
377
+ };
378
+ const getTables = (linkedDataSources) => {
379
+ const { "1": linked1, "2": linked2, "3": linked3 } = linkedDataSources;
380
+ const tables = [];
381
+ tables.push(getTable(linked1.dataSource));
382
+ if (Array.isArray(linked2)) {
383
+ linked2.forEach(({ dataSource }) => {
384
+ tables.push(getTable(dataSource));
385
+ });
386
+ } else {
387
+ tables.push(getTable(linked2.dataSource));
388
+ }
389
+ if (Array.isArray(linked3)) {
390
+ linked3.forEach(({ dataSource }) => {
391
+ tables.push(getTable(dataSource));
392
+ });
393
+ } else if (linked3) {
394
+ tables.push(getTable(linked3.dataSource));
395
+ }
396
+ return tables;
397
+ };
398
+ const useLinkedTableView = ({
399
+ linkedDataSources
400
+ }) => {
401
+ const { VuuDataSource, getServerAPI } = vuuUtils.useData();
402
+ const [tableConfig, setTableConfig] = react.useState();
403
+ const [activeTabs, setActiveTab] = react.useState([
404
+ 0,
405
+ 0,
406
+ 0
407
+ ]);
408
+ const [collapsed, setCollapsed] = react.useState([
409
+ false,
410
+ false
411
+ ]);
412
+ const [tabbedView, setTabbedView] = react.useState([1, 1]);
413
+ react.useMemo(async () => {
414
+ const tables = getTables(linkedDataSources);
415
+ const serverAPI = await getServerAPI();
416
+ const schemas = await Promise.all(tables.map(serverAPI.getTableSchema));
417
+ const isDataSource = (ds) => typeof ds === typeof VuuDataSource;
418
+ const getDataSource = (ds) => {
419
+ if (isDataSource(ds)) {
420
+ return ds;
421
+ } else {
422
+ return new VuuDataSource(ds);
423
+ }
424
+ };
425
+ const createVisualLink = (vuuLink, parentDs) => {
426
+ if (parentDs && parentDs.table) {
427
+ const parentVpId = parentDs.viewport;
428
+ const toTable = vuuLink.toTable ?? parentDs.table?.table;
429
+ return {
430
+ link: {
431
+ ...vuuLink,
432
+ toTable
433
+ },
434
+ parentClientVpId: parentVpId,
435
+ parentVpId
436
+ };
437
+ } else {
438
+ throw Error("visual link cannot be created without parent vp id");
439
+ }
440
+ };
441
+ const getLinkedDataSource = (ds, vuuLink, parentDs) => {
442
+ if (isDataSource(ds)) {
443
+ return ds;
444
+ } else {
445
+ return new VuuDataSource({
446
+ ...ds,
447
+ visualLink: createVisualLink(vuuLink, parentDs)
448
+ });
449
+ }
450
+ };
451
+ const getTableConfig = (ds) => {
452
+ const schema = getSchema(schemas, getTable(ds));
453
+ return {
454
+ columns: schema.columns
455
+ };
456
+ };
457
+ const getRootConfig = ({
458
+ dataSource: ds,
459
+ title
460
+ }) => ({
461
+ config: getTableConfig(ds),
462
+ dataSource: getDataSource(ds),
463
+ title
464
+ });
465
+ const getLinkedConfig = ({ dataSource: ds, vuuLink, title }, parentDataSource) => ({
466
+ config: getTableConfig(ds),
467
+ dataSource: getLinkedDataSource(ds, vuuLink, parentDataSource),
468
+ title
469
+ });
470
+ const getLinkedConfigs = (linkedTableConfig, parentDataSource) => {
471
+ if (Array.isArray(linkedTableConfig)) {
472
+ return linkedTableConfig.map(
473
+ (config) => getLinkedConfig(config, parentDataSource)
474
+ );
475
+ } else {
476
+ return getLinkedConfig(linkedTableConfig, parentDataSource);
477
+ }
478
+ };
479
+ const { "1": level1, "2": level2, "3": level3 } = linkedDataSources;
480
+ const configLevel1 = getRootConfig(level1);
481
+ const configLevel2 = getLinkedConfigs(level2, configLevel1.dataSource);
482
+ const dsLevel2 = Array.isArray(configLevel2) ? void 0 : configLevel2.dataSource;
483
+ const configLevel3 = level3 ? getLinkedConfigs(level3, dsLevel2) : void 0;
484
+ const results = {
485
+ "1": configLevel1,
486
+ "2": configLevel2,
487
+ "3": configLevel3
488
+ };
489
+ setTableConfig(results);
490
+ }, [VuuDataSource, getServerAPI, linkedDataSources]);
491
+ const handleTabChangeLevel1 = react.useCallback((tabIndex) => {
492
+ setActiveTab(([, v2, v3]) => [tabIndex, v2, v3]);
493
+ }, []);
494
+ const handleTabChangeLevel2 = react.useCallback((tabIndex) => {
495
+ setActiveTab(([v1, , v3]) => [v1, tabIndex, v3]);
496
+ }, []);
497
+ const handleTabChangeLevel3 = react.useCallback((tabIndex) => {
498
+ setActiveTab(([v1, v2]) => [v1, v2, tabIndex]);
499
+ }, []);
500
+ const handleCollapseLevel2 = react.useCallback(() => {
501
+ setCollapsed(([, val]) => [true, val]);
502
+ }, []);
503
+ const handleExpandLevel2 = react.useCallback(() => {
504
+ setCollapsed(([, val]) => [false, val]);
505
+ }, []);
506
+ const handleCollapseLevel3 = react.useCallback(() => {
507
+ setCollapsed(([val]) => [val, true]);
508
+ }, []);
509
+ const handleExpandLevel3 = react.useCallback(() => {
510
+ setCollapsed(([val]) => [val, false]);
511
+ }, []);
512
+ const handleChangeTabbedView2 = react.useCallback(
513
+ (evt) => {
514
+ const target = evt.target;
515
+ const button = target?.closest("button");
516
+ if (button) {
517
+ const value = parseInt(button.value);
518
+ setTabbedView(([, val]) => [value, val]);
519
+ }
520
+ },
521
+ []
522
+ );
523
+ const handleChangeTabbedView3 = react.useCallback(
524
+ (evt) => {
525
+ const target = evt.target;
526
+ const button = target?.closest("button");
527
+ if (button) {
528
+ const value = parseInt(button.value);
529
+ setTabbedView(([val]) => [val, value]);
530
+ }
531
+ },
532
+ []
533
+ );
534
+ return {
535
+ level1: {
536
+ activeTab: activeTabs[0],
537
+ key: "level1",
538
+ onTabChange: handleTabChangeLevel1
539
+ },
540
+ level2: {
541
+ activeTab: activeTabs[1],
542
+ collapsed: collapsed[0],
543
+ key: "level2",
544
+ onChangeTabbedView: handleChangeTabbedView2,
545
+ onCollapse: handleCollapseLevel2,
546
+ onExpand: handleExpandLevel2,
547
+ onTabChange: handleTabChangeLevel2,
548
+ tabbedView: tabbedView[0]
549
+ },
550
+ level3: {
551
+ activeTab: activeTabs[2],
552
+ collapsed: collapsed[1],
553
+ key: "level3",
554
+ onChangeTabbedView: handleChangeTabbedView3,
555
+ onCollapse: handleCollapseLevel3,
556
+ onExpand: handleExpandLevel3,
557
+ onTabChange: handleTabChangeLevel3,
558
+ tabbedView: tabbedView[1]
559
+ },
560
+ tableConfig
561
+ };
562
+ };
563
+
564
+ var css = ".vuuLinkedTableView {\n \n}\n\n.vuuLinkedTableView-header {\n align-items: center;\n \n display: flex;\n flex-basis: 28px;\n flex-grow: 0;\n flex-shrink: 0;\n padding-right: var(--salt-spacing-100);\n\n .vuuTabstrip {\n width: fit-content;\n }\n\n .vuuLinkedTableView-toolTray {\n margin-left: auto;\n }\n\n}\n\n.vuuLinkedTableView-view {\n overflow: hidden;\n padding: var(--salt-spacing-100);\n}";
565
+
566
+ const TableLayoutToggleButton = (props) => {
567
+ return /* @__PURE__ */ jsxRuntime.jsxs(core.ToggleButtonGroup, { ...props, children: [
568
+ /* @__PURE__ */ jsxRuntime.jsx(
569
+ core.ToggleButton,
570
+ {
571
+ className: "vuuIconToggleButton",
572
+ value: 0,
573
+ "aria-label": "Tabbed View",
574
+ children: /* @__PURE__ */ jsxRuntime.jsx(vuuUiControls.Icon, { name: "split-v", size: 18 })
575
+ }
576
+ ),
577
+ /* @__PURE__ */ jsxRuntime.jsx(
578
+ core.ToggleButton,
579
+ {
580
+ className: "vuuIconToggleButton",
581
+ value: 1,
582
+ "aria-label": "Side by side view",
583
+ children: /* @__PURE__ */ jsxRuntime.jsx(vuuUiControls.Icon, { name: "tabs", size: 18 })
584
+ }
585
+ )
586
+ ] });
587
+ };
588
+
589
+ const classBase = "vuuLinkedTableView";
590
+ const LinkedTables = ({
591
+ className,
592
+ linkedDataSources,
593
+ ...htmlAttributes
594
+ }) => {
595
+ const targetWindow = window.useWindow();
596
+ styles.useComponentCssInjection({
597
+ testId: "vuu-linked-table-view",
598
+ css,
599
+ window: targetWindow
600
+ });
601
+ const { tableConfig, ...config } = useLinkedTableView({
602
+ linkedDataSources
603
+ });
604
+ const getLinkedTables = (tdsConfig, {
605
+ activeTab,
606
+ onChangeTabbedView,
607
+ onTabChange,
608
+ tabbedView,
609
+ ...levelConfig
610
+ }) => Array.isArray(tdsConfig) === false ? /* @__PURE__ */ jsxRuntime.jsx(
611
+ vuuLayout.View,
612
+ {
613
+ ...levelConfig,
614
+ header: true,
615
+ resizeable: true,
616
+ style: { flexBasis: 0, flexGrow: 1, flexShrink: 1 },
617
+ title: tdsConfig.title,
618
+ children: /* @__PURE__ */ jsxRuntime.jsx(vuuTable.Table, { config: tdsConfig.config, dataSource: tdsConfig.dataSource })
619
+ }
620
+ ) : tabbedView === 1 ? /* @__PURE__ */ jsxRuntime.jsxs(
621
+ "div",
622
+ {
623
+ style: {
624
+ display: "flex",
625
+ flexDirection: "column",
626
+ flexBasis: 0,
627
+ flexGrow: 1,
628
+ flexShrink: 1
629
+ },
630
+ children: [
631
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${classBase}-header`, children: [
632
+ /* @__PURE__ */ jsxRuntime.jsx(vuuUiControls.Tabstrip, { activeTabIndex: activeTab, onActiveChange: onTabChange, children: tdsConfig.map(({ title }, i) => /* @__PURE__ */ jsxRuntime.jsx(vuuUiControls.Tab, { label: title }, i)) }),
633
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${classBase}-toolTray`, children: /* @__PURE__ */ jsxRuntime.jsx(
634
+ TableLayoutToggleButton,
635
+ {
636
+ onChange: onChangeTabbedView,
637
+ value: tabbedView
638
+ }
639
+ ) })
640
+ ] }),
641
+ /* @__PURE__ */ jsxRuntime.jsx(
642
+ vuuLayout.Stack,
643
+ {
644
+ active: activeTab,
645
+ "data-resizeable": true,
646
+ showTabs: false,
647
+ style: { flexBasis: 0, flexGrow: 1, flexShrink: 1 },
648
+ children: tdsConfig.map(({ config: config2, dataSource, title }, i) => /* @__PURE__ */ jsxRuntime.jsx(
649
+ "div",
650
+ {
651
+ className: `${classBase}-view`,
652
+ style: { flexBasis: 0, flexGrow: 1, flexShrink: 1 },
653
+ title,
654
+ children: /* @__PURE__ */ jsxRuntime.jsx(vuuTable.Table, { config: config2, dataSource })
655
+ },
656
+ i
657
+ ))
658
+ },
659
+ levelConfig.key
660
+ )
661
+ ]
662
+ }
663
+ ) : /* @__PURE__ */ jsxRuntime.jsxs(
664
+ "div",
665
+ {
666
+ style: {
667
+ display: "flex",
668
+ flexDirection: "column",
669
+ flexBasis: 0,
670
+ flexGrow: 1,
671
+ flexShrink: 1
672
+ },
673
+ children: [
674
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${classBase}-header`, children: [
675
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${classBase}-flexHeaders`, children: tdsConfig.map(({ title }, i) => /* @__PURE__ */ jsxRuntime.jsx("span", { children: title }, i)) }),
676
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${classBase}-toolTray`, children: /* @__PURE__ */ jsxRuntime.jsx(
677
+ TableLayoutToggleButton,
678
+ {
679
+ onChange: onChangeTabbedView,
680
+ value: tabbedView
681
+ }
682
+ ) })
683
+ ] }),
684
+ /* @__PURE__ */ jsxRuntime.jsx(
685
+ vuuLayout.Flexbox,
686
+ {
687
+ style: {
688
+ flexDirection: "row",
689
+ flexBasis: 0,
690
+ flexGrow: 1,
691
+ flexShrink: 1
692
+ },
693
+ children: tdsConfig.map(({ config: config2, dataSource, title }, i) => /* @__PURE__ */ jsxRuntime.jsx(
694
+ "div",
695
+ {
696
+ className: `${classBase}-view`,
697
+ "data-resizeable": true,
698
+ style: { flexBasis: 0, flexGrow: 1, flexShrink: 1 },
699
+ title,
700
+ children: /* @__PURE__ */ jsxRuntime.jsx(vuuTable.Table, { config: config2, dataSource })
701
+ },
702
+ i
703
+ ))
704
+ }
705
+ )
706
+ ]
707
+ }
708
+ );
709
+ const getAllLinkedTables = (level2, level3, config2) => {
710
+ const results = [getLinkedTables(level2, config2.level2)];
711
+ if (level3) {
712
+ results.push(getLinkedTables(level3, config2.level3));
713
+ }
714
+ return results;
715
+ };
716
+ if (tableConfig) {
717
+ const { "1": level1, "2": level2, "3": level3 } = tableConfig;
718
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ...htmlAttributes, className: cx(classBase, className), children: /* @__PURE__ */ jsxRuntime.jsxs(vuuLayout.Flexbox, { style: { flexDirection: "column", height: "100%" }, children: [
719
+ /* @__PURE__ */ jsxRuntime.jsx(
720
+ vuuLayout.View,
721
+ {
722
+ className: `${classBase}-view`,
723
+ header: true,
724
+ resizeable: true,
725
+ style: { flexBasis: 0, flexGrow: 1, flexShrink: 1 },
726
+ title: level1.title,
727
+ children: /* @__PURE__ */ jsxRuntime.jsx(vuuTable.Table, { config: level1.config, dataSource: level1.dataSource })
728
+ }
729
+ ),
730
+ ...getAllLinkedTables(level2, level3, config)
731
+ ] }) });
732
+ } else {
733
+ return null;
734
+ }
735
+ };
736
+ const LinkedTableView = ({
737
+ className,
738
+ linkedDataSources,
739
+ ...htmlAttributes
740
+ }) => /* @__PURE__ */ jsxRuntime.jsx(vuuLayout.View, { ...htmlAttributes, className, children: /* @__PURE__ */ jsxRuntime.jsx(LinkedTables, { linkedDataSources }) });
741
+
742
+ exports.FilterTable = FilterTable;
743
+ exports.JsonTable = JsonTable;
744
+ exports.LinkedTableView = LinkedTableView;
745
+ exports.TreeTable = TreeTable;
746
+ exports.usePersistFilterState = usePersistFilterState;
16
747
  //# sourceMappingURL=index.js.map