@vuu-ui/vuu-datatable 2.1.18 → 2.1.19-beta.2

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 (64) hide show
  1. package/package.json +15 -18
  2. package/src/filter-table/FilterTable.js +40 -0
  3. package/src/filter-table/index.js +2 -0
  4. package/src/filter-table/useFilterTable.js +23 -0
  5. package/src/filter-table/usePersistFilterState.js +139 -0
  6. package/src/index.js +4 -0
  7. package/src/json-table/JsonCell.css.js +21 -0
  8. package/src/json-table/JsonCell.js +40 -0
  9. package/src/json-table/JsonTable.js +38 -0
  10. package/src/json-table/index.js +1 -0
  11. package/src/linked-table-view/LinkedTableView.css.js +24 -0
  12. package/src/linked-table-view/LinkedTableView.js +186 -0
  13. package/src/linked-table-view/TableLayoutToggleButton.js +27 -0
  14. package/src/linked-table-view/useLinkedTableView.js +205 -0
  15. package/src/tree-table/TreeTable.js +42 -0
  16. package/src/tree-table/index.js +1 -0
  17. package/cjs/filter-table/FilterTable.js +0 -41
  18. package/cjs/filter-table/FilterTable.js.map +0 -1
  19. package/cjs/filter-table/useFilterTable.js +0 -33
  20. package/cjs/filter-table/useFilterTable.js.map +0 -1
  21. package/cjs/filter-table/usePersistFilterState.js +0 -156
  22. package/cjs/filter-table/usePersistFilterState.js.map +0 -1
  23. package/cjs/index.js +0 -16
  24. package/cjs/index.js.map +0 -1
  25. package/cjs/json-table/JsonCell.css.js +0 -6
  26. package/cjs/json-table/JsonCell.css.js.map +0 -1
  27. package/cjs/json-table/JsonCell.js +0 -42
  28. package/cjs/json-table/JsonCell.js.map +0 -1
  29. package/cjs/json-table/JsonTable.js +0 -52
  30. package/cjs/json-table/JsonTable.js.map +0 -1
  31. package/cjs/linked-table-view/LinkedTableView.css.js +0 -6
  32. package/cjs/linked-table-view/LinkedTableView.css.js.map +0 -1
  33. package/cjs/linked-table-view/LinkedTableView.js +0 -168
  34. package/cjs/linked-table-view/LinkedTableView.js.map +0 -1
  35. package/cjs/linked-table-view/TableLayoutToggleButton.js +0 -31
  36. package/cjs/linked-table-view/TableLayoutToggleButton.js.map +0 -1
  37. package/cjs/linked-table-view/useLinkedTableView.js +0 -210
  38. package/cjs/linked-table-view/useLinkedTableView.js.map +0 -1
  39. package/cjs/tree-table/TreeTable.js +0 -55
  40. package/cjs/tree-table/TreeTable.js.map +0 -1
  41. package/esm/filter-table/FilterTable.js +0 -39
  42. package/esm/filter-table/FilterTable.js.map +0 -1
  43. package/esm/filter-table/useFilterTable.js +0 -31
  44. package/esm/filter-table/useFilterTable.js.map +0 -1
  45. package/esm/filter-table/usePersistFilterState.js +0 -154
  46. package/esm/filter-table/usePersistFilterState.js.map +0 -1
  47. package/esm/index.js +0 -6
  48. package/esm/index.js.map +0 -1
  49. package/esm/json-table/JsonCell.css.js +0 -4
  50. package/esm/json-table/JsonCell.css.js.map +0 -1
  51. package/esm/json-table/JsonCell.js +0 -40
  52. package/esm/json-table/JsonCell.js.map +0 -1
  53. package/esm/json-table/JsonTable.js +0 -50
  54. package/esm/json-table/JsonTable.js.map +0 -1
  55. package/esm/linked-table-view/LinkedTableView.css.js +0 -4
  56. package/esm/linked-table-view/LinkedTableView.css.js.map +0 -1
  57. package/esm/linked-table-view/LinkedTableView.js +0 -166
  58. package/esm/linked-table-view/LinkedTableView.js.map +0 -1
  59. package/esm/linked-table-view/TableLayoutToggleButton.js +0 -29
  60. package/esm/linked-table-view/TableLayoutToggleButton.js.map +0 -1
  61. package/esm/linked-table-view/useLinkedTableView.js +0 -208
  62. package/esm/linked-table-view/useLinkedTableView.js.map +0 -1
  63. package/esm/tree-table/TreeTable.js +0 -53
  64. package/esm/tree-table/TreeTable.js.map +0 -1
package/package.json CHANGED
@@ -1,21 +1,22 @@
1
1
  {
2
- "version": "2.1.18",
2
+ "version": "2.1.19-beta.2",
3
3
  "author": "heswell",
4
+ "type": "module",
4
5
  "license": "Apache-2.0",
5
6
  "dependencies": {
6
7
  "@salt-ds/core": "1.54.1",
7
8
  "@salt-ds/styles": "0.2.1",
8
9
  "@salt-ds/window": "0.1.1",
9
- "@vuu-ui/vuu-data-local": "2.1.18",
10
- "@vuu-ui/vuu-table-types": "2.1.18",
11
- "@vuu-ui/vuu-filters": "2.1.18",
12
- "@vuu-ui/vuu-layout": "2.1.18",
13
- "@vuu-ui/vuu-popups": "2.1.18",
14
- "@vuu-ui/vuu-shell": "2.1.18",
15
- "@vuu-ui/vuu-table": "2.1.18",
16
- "@vuu-ui/vuu-table-extras": "2.1.18",
17
- "@vuu-ui/vuu-ui-controls": "2.1.18",
18
- "@vuu-ui/vuu-utils": "2.1.18"
10
+ "@vuu-ui/vuu-data-local": "2.1.19-beta.2",
11
+ "@vuu-ui/vuu-table-types": "2.1.19-beta.2",
12
+ "@vuu-ui/vuu-filters": "2.1.19-beta.2",
13
+ "@vuu-ui/vuu-layout": "2.1.19-beta.2",
14
+ "@vuu-ui/vuu-popups": "2.1.19-beta.2",
15
+ "@vuu-ui/vuu-shell": "2.1.19-beta.2",
16
+ "@vuu-ui/vuu-table": "2.1.19-beta.2",
17
+ "@vuu-ui/vuu-table-extras": "2.1.19-beta.2",
18
+ "@vuu-ui/vuu-ui-controls": "2.1.19-beta.2",
19
+ "@vuu-ui/vuu-utils": "2.1.19-beta.2"
19
20
  },
20
21
  "peerDependencies": {
21
22
  "clsx": "^2.0.0",
@@ -24,20 +25,16 @@
24
25
  },
25
26
  "files": [
26
27
  "README.md",
27
- "esm",
28
- "cjs",
28
+ "src",
29
29
  "/types"
30
30
  ],
31
31
  "exports": {
32
32
  ".": {
33
- "require": "./cjs/index.js",
34
- "import": "./esm/index.js",
33
+ "import": "./src/index.js",
35
34
  "types": "./types/index.d.ts"
36
35
  }
37
36
  },
38
- "main": "cjs/index.js",
39
- "module": "esm/index.js",
37
+ "module": "index.js",
40
38
  "name": "@vuu-ui/vuu-datatable",
41
- "type": "module",
42
39
  "types": "types/index.d.ts"
43
40
  }
@@ -0,0 +1,40 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { FilterBar } from "@vuu-ui/vuu-filters";
3
+ import { Table } from "@vuu-ui/vuu-table";
4
+ import { useFilterTable } from "./useFilterTable.js";
5
+ import { DataSourceProvider } from "@vuu-ui/vuu-utils";
6
+ const classBase = "vuuFilterTable";
7
+ const filterTableStyles = {
8
+ "--vuuFilterBar-flex": "0 0 auto",
9
+ "--vuuMeasuredContainer-flex": "1 1 auto",
10
+ display: "flex",
11
+ flexDirection: "column"
12
+ };
13
+ const FilterTable = ({ FilterBarProps, TableProps, style: styleProps, ...htmlAttributes })=>{
14
+ const { filterBarProps } = useFilterTable({
15
+ TableProps,
16
+ FilterBarProps
17
+ });
18
+ return /*#__PURE__*/ jsx(DataSourceProvider, {
19
+ dataSource: TableProps.dataSource,
20
+ children: /*#__PURE__*/ jsxs("div", {
21
+ ...htmlAttributes,
22
+ className: classBase,
23
+ style: {
24
+ ...styleProps,
25
+ ...filterTableStyles
26
+ },
27
+ children: [
28
+ /*#__PURE__*/ jsx(FilterBar, {
29
+ ...filterBarProps
30
+ }),
31
+ /*#__PURE__*/ jsx(Table, {
32
+ ...TableProps,
33
+ height: "auto",
34
+ width: "auto"
35
+ })
36
+ ]
37
+ })
38
+ });
39
+ };
40
+ export { FilterTable };
@@ -0,0 +1,2 @@
1
+ export * from "./FilterTable.js";
2
+ export * from "./usePersistFilterState.js";
@@ -0,0 +1,23 @@
1
+ import { useCallback } from "react";
2
+ const useFilterTable = ({ FilterBarProps, TableProps: { config: { columns }, dataSource } })=>{
3
+ const handleApplyFilter = useCallback((filter)=>{
4
+ dataSource.setFilter?.(filter);
5
+ }, [
6
+ dataSource
7
+ ]);
8
+ const handleClearFilter = useCallback(()=>{
9
+ dataSource.clearFilter?.();
10
+ }, [
11
+ dataSource
12
+ ]);
13
+ const filterBarProps = {
14
+ ...FilterBarProps,
15
+ columnDescriptors: FilterBarProps?.columnDescriptors ?? columns,
16
+ onApplyFilter: handleApplyFilter,
17
+ onClearFilter: handleClearFilter
18
+ };
19
+ return {
20
+ filterBarProps
21
+ };
22
+ };
23
+ export { useFilterTable };
@@ -0,0 +1,139 @@
1
+ import { useViewContext } from "@vuu-ui/vuu-layout";
2
+ import { useWorkspace } from "@vuu-ui/vuu-shell";
3
+ import { useCallback, useMemo, useState } from "react";
4
+ const NO_CONFIG = {};
5
+ const hasFilterWithName = (filters, name)=>-1 !== filters.findIndex((f)=>f.name === name);
6
+ const usePersistFilterState = ({ tableSchema })=>{
7
+ const { load, save } = useViewContext();
8
+ const { getApplicationSettings, saveApplicationSettings } = useWorkspace();
9
+ const { "filterbar-config": filterbarConfigFromState } = useMemo(()=>load?.() ?? NO_CONFIG, [
10
+ load
11
+ ]);
12
+ const [filterState, setFilterState] = useState({
13
+ filters: filterbarConfigFromState?.filterState?.filters ?? [],
14
+ activeIndices: filterbarConfigFromState?.filterState?.activeIndices ?? []
15
+ });
16
+ const savedFilters = useMemo(()=>{
17
+ const { table: { module, table } } = tableSchema;
18
+ const savedFilters = getApplicationSettings("filters");
19
+ const key = `${module}:${table}`;
20
+ return savedFilters?.[key] ?? [];
21
+ }, [
22
+ getApplicationSettings,
23
+ tableSchema
24
+ ]);
25
+ const removeFilterFromSettings = useCallback((filter)=>{
26
+ if (!tableSchema || !filter.name) return;
27
+ const savedFilters = getApplicationSettings("filters");
28
+ if (!savedFilters) return;
29
+ const { module, table } = tableSchema.table;
30
+ const key = `${module}:${table}`;
31
+ if (hasFilterWithName(savedFilters[key], filter.name)) {
32
+ const newSavedFilters = {
33
+ ...savedFilters,
34
+ [key]: savedFilters[key].filter((f)=>f.name !== filter.name)
35
+ };
36
+ saveApplicationSettings(newSavedFilters, "filters");
37
+ }
38
+ }, [
39
+ getApplicationSettings,
40
+ saveApplicationSettings,
41
+ tableSchema
42
+ ]);
43
+ const saveFilterToSettings = useCallback((filter, name)=>{
44
+ if (tableSchema && name) {
45
+ const savedFilters = getApplicationSettings("filters");
46
+ let newFilters = savedFilters;
47
+ const { module, table } = tableSchema.table;
48
+ const key = `${module}:${table}`;
49
+ newFilters = savedFilters ? savedFilters[key] ? hasFilterWithName(savedFilters[key], name) ? {
50
+ ...savedFilters,
51
+ [key]: savedFilters[key].map((f)=>f.name === name ? {
52
+ ...filter,
53
+ name
54
+ } : f)
55
+ } : filter?.name && filter?.name !== name && hasFilterWithName(savedFilters[key], filter.name) ? {
56
+ ...savedFilters,
57
+ [key]: savedFilters[key].map((f)=>f.name === filter.name ? {
58
+ ...filter,
59
+ name
60
+ } : f)
61
+ } : {
62
+ ...savedFilters,
63
+ [key]: savedFilters[key].concat({
64
+ ...filter,
65
+ name
66
+ })
67
+ } : {
68
+ ...savedFilters,
69
+ [key]: [
70
+ {
71
+ ...filter,
72
+ name
73
+ }
74
+ ]
75
+ } : {
76
+ [key]: [
77
+ {
78
+ ...filter,
79
+ name
80
+ }
81
+ ]
82
+ };
83
+ if (newFilters !== savedFilters) saveApplicationSettings(newFilters, "filters");
84
+ }
85
+ }, [
86
+ getApplicationSettings,
87
+ saveApplicationSettings,
88
+ tableSchema
89
+ ]);
90
+ const handleFilterStateChanged = useCallback((filterState)=>{
91
+ save?.({
92
+ filterState
93
+ }, "filterbar-config");
94
+ setFilterState(filterState);
95
+ }, [
96
+ save
97
+ ]);
98
+ const handleFilterDeleted = useCallback((filter)=>{
99
+ removeFilterFromSettings(filter);
100
+ }, [
101
+ removeFilterFromSettings
102
+ ]);
103
+ const handleFilterRenamed = useCallback((filter, name)=>{
104
+ saveFilterToSettings(filter, name);
105
+ }, [
106
+ saveFilterToSettings
107
+ ]);
108
+ const buildFilterTableMenuOptions = useCallback((location)=>{
109
+ if ("filter-bar-menu" !== location) return [];
110
+ if (savedFilters.length > 0) return savedFilters.map((filter)=>({
111
+ id: "add-filter",
112
+ label: filter.name,
113
+ options: {
114
+ filter
115
+ }
116
+ }));
117
+ return [
118
+ {
119
+ label: "You have no saved filters for this table",
120
+ id: "no-action"
121
+ }
122
+ ];
123
+ }, [
124
+ savedFilters
125
+ ]);
126
+ const handleFilterTableMenuAction = useCallback((menuItemId)=>{
127
+ if ("add-filter" === menuItemId) return true;
128
+ return false;
129
+ }, []);
130
+ return {
131
+ buildFilterTableMenuOptions,
132
+ filterState,
133
+ handleFilterTableMenuAction,
134
+ onFilterStateChanged: handleFilterStateChanged,
135
+ onFilterDeleted: handleFilterDeleted,
136
+ onFilterRenamed: handleFilterRenamed
137
+ };
138
+ };
139
+ export { usePersistFilterState };
package/src/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export * from "./filter-table/index.js";
2
+ export * from "./json-table/index.js";
3
+ export * from "./tree-table/index.js";
4
+ export * from "./linked-table-view/LinkedTableView.js";
@@ -0,0 +1,21 @@
1
+ const css = `
2
+ .vuuJsonCell {
3
+ --group-cell-spacer-width: 20px;
4
+ cursor: pointer;
5
+ height: var(--row-height);
6
+ border-right-style: solid;
7
+ border-right-width: 1px;
8
+ align-items: center;
9
+ padding-left: 20px;
10
+ line-height: 16px;
11
+ display: inline-flex;
12
+ position: relative;
13
+
14
+ & .vuuToggleIconButton {
15
+ position: absolute;
16
+ }
17
+ }
18
+
19
+
20
+ `;
21
+ export default css;
@@ -0,0 +1,40 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { useComponentCssInjection } from "@salt-ds/styles";
3
+ import { useWindow } from "@salt-ds/window";
4
+ import { ToggleIconButton } from "@vuu-ui/vuu-ui-controls";
5
+ import JsonCell from "./JsonCell.css";
6
+ const JsonCell_JsonCell = ({ column, dataRow })=>{
7
+ const targetWindow = useWindow();
8
+ useComponentCssInjection({
9
+ testId: "vuu-array-cell",
10
+ css: JsonCell,
11
+ window: targetWindow
12
+ });
13
+ const { name } = column;
14
+ let { isExpanded, isLeaf, [name]: value } = dataRow;
15
+ const getDisplayValue = ()=>{
16
+ if (isLeaf) return value;
17
+ if ("string" == typeof value && value.endsWith("{")) {
18
+ value = value.slice(0, -1);
19
+ if (!isNaN(parseInt(value))) return `${value}: {...}`;
20
+ return "value {...}";
21
+ }
22
+ if ("string" == typeof value && value.endsWith("[")) {
23
+ value = value.slice(0, -1);
24
+ return `${value} [...]`;
25
+ }
26
+ };
27
+ const displayValue = getDisplayValue();
28
+ const isEmpty = "" === displayValue || void 0 === displayValue;
29
+ return /*#__PURE__*/ jsxs(Fragment, {
30
+ children: [
31
+ isLeaf || isEmpty ? null : /*#__PURE__*/ jsx(ToggleIconButton, {
32
+ isExpanded: isExpanded
33
+ }),
34
+ /*#__PURE__*/ jsx("span", {
35
+ children: displayValue
36
+ })
37
+ ]
38
+ });
39
+ };
40
+ export { JsonCell_JsonCell as JsonCell };
@@ -0,0 +1,38 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { registerComponent } from "@vuu-ui/vuu-utils";
3
+ import { Table } from "@vuu-ui/vuu-table";
4
+ import { JsonDataSource } from "@vuu-ui/vuu-data-local";
5
+ import { useEffect, useMemo, useRef } from "react";
6
+ import { JsonCell } from "./JsonCell.js";
7
+ registerComponent("json", JsonCell, "cell-renderer");
8
+ const JsonTable = ({ config, source: sourceProp, ...tableProps })=>{
9
+ const sourceRef = useRef(sourceProp);
10
+ const dataSourceRef = useRef(void 0);
11
+ useMemo(()=>{
12
+ dataSourceRef.current = new JsonDataSource({
13
+ data: sourceRef.current
14
+ });
15
+ }, []);
16
+ const tableConfig = useMemo(()=>({
17
+ ...config,
18
+ columns: dataSourceRef.current?.columnDescriptors ?? [],
19
+ columnSeparators: true,
20
+ rowSeparators: true
21
+ }), [
22
+ config
23
+ ]);
24
+ useEffect(()=>{
25
+ if (dataSourceRef.current) dataSourceRef.current.data = sourceProp;
26
+ }, [
27
+ sourceProp
28
+ ]);
29
+ if (void 0 === dataSourceRef.current) return null;
30
+ return /*#__PURE__*/ jsx(Table, {
31
+ ...tableProps,
32
+ config: tableConfig,
33
+ dataSource: dataSourceRef.current,
34
+ showColumnHeaderMenus: false,
35
+ selectionModel: "none"
36
+ });
37
+ };
38
+ export { JsonTable };
@@ -0,0 +1 @@
1
+ export * from "./JsonTable.js";
@@ -0,0 +1,24 @@
1
+ const css = `
2
+ .vuuLinkedTableView-header {
3
+ padding-right: var(--salt-spacing-100);
4
+ flex: 0 0 28px;
5
+ align-items: center;
6
+ display: flex;
7
+
8
+ & .vuuTabstrip {
9
+ width: fit-content;
10
+ }
11
+
12
+ & .vuuLinkedTableView-toolTray {
13
+ margin-left: auto;
14
+ }
15
+ }
16
+
17
+ .vuuLinkedTableView-view {
18
+ padding: var(--salt-spacing-100);
19
+ overflow: hidden;
20
+ }
21
+
22
+
23
+ `;
24
+ export default css;
@@ -0,0 +1,186 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Flexbox, Stack, View } from "@vuu-ui/vuu-layout";
3
+ import { Table } from "@vuu-ui/vuu-table";
4
+ import { Tab, Tabstrip } from "@vuu-ui/vuu-ui-controls";
5
+ import { useComponentCssInjection } from "@salt-ds/styles";
6
+ import { useWindow } from "@salt-ds/window";
7
+ import clsx from "clsx";
8
+ import { useLinkedTableView } from "./useLinkedTableView.js";
9
+ import LinkedTableView from "./LinkedTableView.css";
10
+ import { TableLayoutToggleButton } from "./TableLayoutToggleButton.js";
11
+ const classBase = "vuuLinkedTableView";
12
+ const LinkedTables = ({ className, linkedDataSources, ...htmlAttributes })=>{
13
+ const targetWindow = useWindow();
14
+ useComponentCssInjection({
15
+ testId: "vuu-linked-table-view",
16
+ css: LinkedTableView,
17
+ window: targetWindow
18
+ });
19
+ const { tableConfig, ...config } = useLinkedTableView({
20
+ linkedDataSources
21
+ });
22
+ const getLinkedTables = (tdsConfig, { activeTab, onChangeTabbedView, onTabChange, tabbedView, ...levelConfig })=>false === Array.isArray(tdsConfig) ? /*#__PURE__*/ jsx(View, {
23
+ ...levelConfig,
24
+ header: true,
25
+ resizeable: true,
26
+ style: {
27
+ flexBasis: 0,
28
+ flexGrow: 1,
29
+ flexShrink: 1
30
+ },
31
+ title: tdsConfig.title,
32
+ children: /*#__PURE__*/ jsx(Table, {
33
+ config: tdsConfig.config,
34
+ dataSource: tdsConfig.dataSource
35
+ })
36
+ }) : 1 === tabbedView ? /*#__PURE__*/ jsxs("div", {
37
+ style: {
38
+ display: "flex",
39
+ flexDirection: "column",
40
+ flexBasis: 0,
41
+ flexGrow: 1,
42
+ flexShrink: 1
43
+ },
44
+ children: [
45
+ /*#__PURE__*/ jsxs("div", {
46
+ className: `${classBase}-header`,
47
+ children: [
48
+ /*#__PURE__*/ jsx(Tabstrip, {
49
+ activeTabIndex: activeTab,
50
+ onActiveChange: onTabChange,
51
+ children: tdsConfig.map(({ title }, i)=>/*#__PURE__*/ jsx(Tab, {
52
+ label: title
53
+ }, i))
54
+ }),
55
+ /*#__PURE__*/ jsx("div", {
56
+ className: `${classBase}-toolTray`,
57
+ children: /*#__PURE__*/ jsx(TableLayoutToggleButton, {
58
+ onChange: onChangeTabbedView,
59
+ value: tabbedView
60
+ })
61
+ })
62
+ ]
63
+ }),
64
+ /*#__PURE__*/ jsx(Stack, {
65
+ active: activeTab,
66
+ "data-resizeable": true,
67
+ showTabs: false,
68
+ style: {
69
+ flexBasis: 0,
70
+ flexGrow: 1,
71
+ flexShrink: 1
72
+ },
73
+ children: tdsConfig.map(({ config, dataSource, title }, i)=>/*#__PURE__*/ jsx("div", {
74
+ className: `${classBase}-view`,
75
+ style: {
76
+ flexBasis: 0,
77
+ flexGrow: 1,
78
+ flexShrink: 1
79
+ },
80
+ title: title,
81
+ children: /*#__PURE__*/ jsx(Table, {
82
+ config: config,
83
+ dataSource: dataSource
84
+ })
85
+ }, i))
86
+ }, levelConfig.key)
87
+ ]
88
+ }) : /*#__PURE__*/ jsxs("div", {
89
+ style: {
90
+ display: "flex",
91
+ flexDirection: "column",
92
+ flexBasis: 0,
93
+ flexGrow: 1,
94
+ flexShrink: 1
95
+ },
96
+ children: [
97
+ /*#__PURE__*/ jsxs("div", {
98
+ className: `${classBase}-header`,
99
+ children: [
100
+ /*#__PURE__*/ jsx("div", {
101
+ className: `${classBase}-flexHeaders`,
102
+ children: tdsConfig.map(({ title }, i)=>/*#__PURE__*/ jsx("span", {
103
+ children: title
104
+ }, i))
105
+ }),
106
+ /*#__PURE__*/ jsx("div", {
107
+ className: `${classBase}-toolTray`,
108
+ children: /*#__PURE__*/ jsx(TableLayoutToggleButton, {
109
+ onChange: onChangeTabbedView,
110
+ value: tabbedView
111
+ })
112
+ })
113
+ ]
114
+ }),
115
+ /*#__PURE__*/ jsx(Flexbox, {
116
+ style: {
117
+ flexDirection: "row",
118
+ flexBasis: 0,
119
+ flexGrow: 1,
120
+ flexShrink: 1
121
+ },
122
+ children: tdsConfig.map(({ config, dataSource, title }, i)=>/*#__PURE__*/ jsx("div", {
123
+ className: `${classBase}-view`,
124
+ "data-resizeable": true,
125
+ style: {
126
+ flexBasis: 0,
127
+ flexGrow: 1,
128
+ flexShrink: 1
129
+ },
130
+ title: title,
131
+ children: /*#__PURE__*/ jsx(Table, {
132
+ config: config,
133
+ dataSource: dataSource
134
+ })
135
+ }, i))
136
+ })
137
+ ]
138
+ });
139
+ const getAllLinkedTables = (level2, level3, config)=>{
140
+ const results = [
141
+ getLinkedTables(level2, config.level2)
142
+ ];
143
+ if (level3) results.push(getLinkedTables(level3, config.level3));
144
+ return results;
145
+ };
146
+ if (!tableConfig) return null;
147
+ {
148
+ const { 1: level1, 2: level2, 3: level3 } = tableConfig;
149
+ return /*#__PURE__*/ jsx("div", {
150
+ ...htmlAttributes,
151
+ className: clsx(classBase, className),
152
+ children: /*#__PURE__*/ jsxs(Flexbox, {
153
+ style: {
154
+ flexDirection: "column",
155
+ height: "100%"
156
+ },
157
+ children: [
158
+ /*#__PURE__*/ jsx(View, {
159
+ className: `${classBase}-view`,
160
+ header: true,
161
+ resizeable: true,
162
+ style: {
163
+ flexBasis: 0,
164
+ flexGrow: 1,
165
+ flexShrink: 1
166
+ },
167
+ title: level1.title,
168
+ children: /*#__PURE__*/ jsx(Table, {
169
+ config: level1.config,
170
+ dataSource: level1.dataSource
171
+ })
172
+ }),
173
+ ...getAllLinkedTables(level2, level3, config)
174
+ ]
175
+ })
176
+ });
177
+ }
178
+ };
179
+ const LinkedTableView_LinkedTableView = ({ className, linkedDataSources, ...htmlAttributes })=>/*#__PURE__*/ jsx(View, {
180
+ ...htmlAttributes,
181
+ className: className,
182
+ children: /*#__PURE__*/ jsx(LinkedTables, {
183
+ linkedDataSources: linkedDataSources
184
+ })
185
+ });
186
+ export { LinkedTableView_LinkedTableView as LinkedTableView };
@@ -0,0 +1,27 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Icon } from "@vuu-ui/vuu-ui-controls";
3
+ import { ToggleButton, ToggleButtonGroup } from "@salt-ds/core";
4
+ const TableLayoutToggleButton = (props)=>/*#__PURE__*/ jsxs(ToggleButtonGroup, {
5
+ ...props,
6
+ children: [
7
+ /*#__PURE__*/ jsx(ToggleButton, {
8
+ className: "vuuIconToggleButton",
9
+ value: 0,
10
+ "aria-label": "Tabbed View",
11
+ children: /*#__PURE__*/ jsx(Icon, {
12
+ name: "split-v",
13
+ size: 18
14
+ })
15
+ }),
16
+ /*#__PURE__*/ jsx(ToggleButton, {
17
+ className: "vuuIconToggleButton",
18
+ value: 1,
19
+ "aria-label": "Side by side view",
20
+ children: /*#__PURE__*/ jsx(Icon, {
21
+ name: "tabs",
22
+ size: 18
23
+ })
24
+ })
25
+ ]
26
+ });
27
+ export { TableLayoutToggleButton };