@vuu-ui/vuu-datatable 0.9.3 → 0.10.1
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.
- package/cjs/linked-table-view/LinkedTableView.css.js +1 -1
- package/cjs/linked-table-view/LinkedTableView.js +98 -22
- package/cjs/linked-table-view/LinkedTableView.js.map +1 -1
- package/cjs/linked-table-view/TableLayoutToggleButton.js +31 -0
- package/cjs/linked-table-view/TableLayoutToggleButton.js.map +1 -0
- package/cjs/linked-table-view/useLinkedTableView.js +32 -6
- package/cjs/linked-table-view/useLinkedTableView.js.map +1 -1
- package/cjs/tree-table/TreeTable.js +1 -0
- package/cjs/tree-table/TreeTable.js.map +1 -1
- package/esm/linked-table-view/LinkedTableView.css.js +1 -1
- package/esm/linked-table-view/LinkedTableView.js +98 -22
- package/esm/linked-table-view/LinkedTableView.js.map +1 -1
- package/esm/linked-table-view/TableLayoutToggleButton.js +29 -0
- package/esm/linked-table-view/TableLayoutToggleButton.js.map +1 -0
- package/esm/linked-table-view/useLinkedTableView.js +32 -6
- package/esm/linked-table-view/useLinkedTableView.js.map +1 -1
- package/esm/tree-table/TreeTable.js +1 -0
- package/esm/tree-table/TreeTable.js.map +1 -1
- package/package.json +14 -13
- package/types/linked-table-view/LinkedTableView.d.ts +18 -2
- package/types/linked-table-view/TableLayoutToggleButton.d.ts +2 -0
- package/types/linked-table-view/useLinkedTableView.d.ts +11 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var css = ".vuuLinkedTableView {\n \n}\n\n.vuuLinkedTableView-view {\n padding: var(--salt-spacing-100);\n}";
|
|
3
|
+
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}";
|
|
4
4
|
|
|
5
5
|
module.exports = css;
|
|
6
6
|
//# sourceMappingURL=LinkedTableView.css.js.map
|
|
@@ -3,11 +3,13 @@
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
4
|
var vuuLayout = require('@vuu-ui/vuu-layout');
|
|
5
5
|
var vuuTable = require('@vuu-ui/vuu-table');
|
|
6
|
+
var vuuUiControls = require('@vuu-ui/vuu-ui-controls');
|
|
6
7
|
var styles = require('@salt-ds/styles');
|
|
7
8
|
var window = require('@salt-ds/window');
|
|
8
9
|
var cx = require('clsx');
|
|
9
10
|
var useLinkedTableView = require('./useLinkedTableView.js');
|
|
10
11
|
var LinkedTableView$1 = require('./LinkedTableView.css.js');
|
|
12
|
+
var TableLayoutToggleButton = require('./TableLayoutToggleButton.js');
|
|
11
13
|
|
|
12
14
|
const classBase = "vuuLinkedTableView";
|
|
13
15
|
const LinkedTables = ({
|
|
@@ -21,30 +23,16 @@ const LinkedTables = ({
|
|
|
21
23
|
css: LinkedTableView$1,
|
|
22
24
|
window: targetWindow
|
|
23
25
|
});
|
|
24
|
-
const {
|
|
26
|
+
const { tableConfig, ...config } = useLinkedTableView.useLinkedTableView({
|
|
25
27
|
linkedDataSources
|
|
26
28
|
});
|
|
27
|
-
const getLinkedTables = (tdsConfig, {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
children: tdsConfig.map(({ config: config2, dataSource, title }, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
35
|
-
vuuLayout.View,
|
|
36
|
-
{
|
|
37
|
-
className: `${classBase}-view`,
|
|
38
|
-
resizeable: true,
|
|
39
|
-
style: { flexBasis: 0, flexGrow: 1, flexShrink: 1 },
|
|
40
|
-
title,
|
|
41
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(vuuTable.Table, { config: config2, dataSource })
|
|
42
|
-
},
|
|
43
|
-
i
|
|
44
|
-
))
|
|
45
|
-
},
|
|
46
|
-
levelConfig.key
|
|
47
|
-
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
29
|
+
const getLinkedTables = (tdsConfig, {
|
|
30
|
+
activeTab,
|
|
31
|
+
onChangeTabbedView,
|
|
32
|
+
onTabChange,
|
|
33
|
+
tabbedView,
|
|
34
|
+
...levelConfig
|
|
35
|
+
}) => Array.isArray(tdsConfig) === false ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
48
36
|
vuuLayout.View,
|
|
49
37
|
{
|
|
50
38
|
...levelConfig,
|
|
@@ -54,6 +42,94 @@ const LinkedTables = ({
|
|
|
54
42
|
title: tdsConfig.title,
|
|
55
43
|
children: /* @__PURE__ */ jsxRuntime.jsx(vuuTable.Table, { config: tdsConfig.config, dataSource: tdsConfig.dataSource })
|
|
56
44
|
}
|
|
45
|
+
) : tabbedView === 1 ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
46
|
+
"div",
|
|
47
|
+
{
|
|
48
|
+
style: {
|
|
49
|
+
display: "flex",
|
|
50
|
+
flexDirection: "column",
|
|
51
|
+
flexBasis: 0,
|
|
52
|
+
flexGrow: 1,
|
|
53
|
+
flexShrink: 1
|
|
54
|
+
},
|
|
55
|
+
children: [
|
|
56
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${classBase}-header`, children: [
|
|
57
|
+
/* @__PURE__ */ jsxRuntime.jsx(vuuUiControls.Tabstrip, { activeTabIndex: activeTab, onActiveChange: onTabChange, children: tdsConfig.map(({ title }, i) => /* @__PURE__ */ jsxRuntime.jsx(vuuUiControls.Tab, { label: title }, i)) }),
|
|
58
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: `${classBase}-toolTray`, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
59
|
+
TableLayoutToggleButton.TableLayoutToggleButton,
|
|
60
|
+
{
|
|
61
|
+
onChange: onChangeTabbedView,
|
|
62
|
+
value: tabbedView
|
|
63
|
+
}
|
|
64
|
+
) })
|
|
65
|
+
] }),
|
|
66
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
67
|
+
vuuLayout.Stack,
|
|
68
|
+
{
|
|
69
|
+
active: activeTab,
|
|
70
|
+
"data-resizeable": true,
|
|
71
|
+
showTabs: false,
|
|
72
|
+
style: { flexBasis: 0, flexGrow: 1, flexShrink: 1 },
|
|
73
|
+
children: tdsConfig.map(({ config: config2, dataSource, title }, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
74
|
+
"div",
|
|
75
|
+
{
|
|
76
|
+
className: `${classBase}-view`,
|
|
77
|
+
style: { flexBasis: 0, flexGrow: 1, flexShrink: 1 },
|
|
78
|
+
title,
|
|
79
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(vuuTable.Table, { config: config2, dataSource })
|
|
80
|
+
},
|
|
81
|
+
i
|
|
82
|
+
))
|
|
83
|
+
},
|
|
84
|
+
levelConfig.key
|
|
85
|
+
)
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
) : /* @__PURE__ */ jsxRuntime.jsxs(
|
|
89
|
+
"div",
|
|
90
|
+
{
|
|
91
|
+
style: {
|
|
92
|
+
display: "flex",
|
|
93
|
+
flexDirection: "column",
|
|
94
|
+
flexBasis: 0,
|
|
95
|
+
flexGrow: 1,
|
|
96
|
+
flexShrink: 1
|
|
97
|
+
},
|
|
98
|
+
children: [
|
|
99
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${classBase}-header`, children: [
|
|
100
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: `${classBase}-flexHeaders`, children: tdsConfig.map(({ title }, i) => /* @__PURE__ */ jsxRuntime.jsx("span", { children: title }, i)) }),
|
|
101
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: `${classBase}-toolTray`, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
102
|
+
TableLayoutToggleButton.TableLayoutToggleButton,
|
|
103
|
+
{
|
|
104
|
+
onChange: onChangeTabbedView,
|
|
105
|
+
value: tabbedView
|
|
106
|
+
}
|
|
107
|
+
) })
|
|
108
|
+
] }),
|
|
109
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
110
|
+
vuuLayout.Flexbox,
|
|
111
|
+
{
|
|
112
|
+
style: {
|
|
113
|
+
flexDirection: "row",
|
|
114
|
+
flexBasis: 0,
|
|
115
|
+
flexGrow: 1,
|
|
116
|
+
flexShrink: 1
|
|
117
|
+
},
|
|
118
|
+
children: tdsConfig.map(({ config: config2, dataSource, title }, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
119
|
+
"div",
|
|
120
|
+
{
|
|
121
|
+
className: `${classBase}-view`,
|
|
122
|
+
"data-resizeable": true,
|
|
123
|
+
style: { flexBasis: 0, flexGrow: 1, flexShrink: 1 },
|
|
124
|
+
title,
|
|
125
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(vuuTable.Table, { config: config2, dataSource })
|
|
126
|
+
},
|
|
127
|
+
i
|
|
128
|
+
))
|
|
129
|
+
}
|
|
130
|
+
)
|
|
131
|
+
]
|
|
132
|
+
}
|
|
57
133
|
);
|
|
58
134
|
const getAllLinkedTables = (level2, level3, config2) => {
|
|
59
135
|
const results = [getLinkedTables(level2, config2.level2)];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinkedTableView.js","sources":["../../src/linked-table-view/LinkedTableView.tsx"],"sourcesContent":["import { DataSource, DataSourceConstructorProps } from \"@vuu-ui/vuu-data-types\";\nimport { Flexbox, Stack, View } from \"@vuu-ui/vuu-layout\";\nimport { VuuLink } from \"@vuu-ui/vuu-protocol-types\";\nimport { Table } from \"@vuu-ui/vuu-table\";\nimport { TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { HTMLAttributes } from \"react\";\nimport {\n LevelConfig,\n LevelsConfig,\n type TableDataSourceConfig,\n useLinkedTableView,\n} from \"./useLinkedTableView\";\n\nimport css from \"./LinkedTableView.css\";\n\nconst classBase = \"vuuLinkedTableView\";\n\nexport interface LinkTableConfig {\n config?: TableConfig;\n dataSource: DataSourceConstructorProps | DataSource;\n title: string;\n}\nexport interface LinkedTableConfig extends LinkTableConfig {\n /**\n * toTable will default to the table above in hierarchy. If there are multiple\n * tables in level above, toTable should be specified.\n */\n vuuLink: Pick<VuuLink, \"fromColumn\" | \"toColumn\"> & { toTable?: string };\n}\n\n/**\n * Currently supports max of three levels of hierarchical data\n * 1 = parent (required)\n * 2 = child (required)\n * 3 = grandchild (optional)\n */\nexport type LinkedDataSources = {\n \"1\": LinkTableConfig;\n \"2\": LinkedTableConfig | LinkedTableConfig[];\n \"3\"?: LinkedTableConfig | LinkedTableConfig[];\n};\n\n/**\n * Displays a vertical 'tower' of Tables with a hierarchical relationship.\n * Selection of row(s) on tables higher in the hierarchy drives the population\n * of data in tables below. (could be two-way ?)\n */\nexport interface LinkedTableViewProps extends HTMLAttributes<HTMLDivElement> {\n linkedDataSources: LinkedDataSources;\n}\nconst LinkedTables = ({\n className,\n linkedDataSources,\n ...htmlAttributes\n}: LinkedTableViewProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-linked-table-view\",\n css: css,\n window: targetWindow,\n });\n\n const { activeTabs, tableConfig, ...config } = useLinkedTableView({\n linkedDataSources,\n });\n\n const getLinkedTables = (\n tdsConfig: TableDataSourceConfig | TableDataSourceConfig[],\n { onTabChange, ...levelConfig }: LevelConfig,\n ) =>\n Array.isArray(tdsConfig) ? (\n <Stack\n active={activeTabs[1]}\n data-resizeable\n key={levelConfig.key}\n onTabSelectionChanged={onTabChange}\n style={{ flexBasis: 0, flexGrow: 1, flexShrink: 1 }}\n >\n {tdsConfig.map(({ config, dataSource, title }, i) => (\n <View\n className={`${classBase}-view`}\n key={i}\n resizeable\n style={{ flexBasis: 0, flexGrow: 1, flexShrink: 1 }}\n title={title}\n >\n <Table config={config} dataSource={dataSource} />\n </View>\n ))}\n </Stack>\n ) : (\n <View\n {...levelConfig}\n header\n resizeable\n style={{ flexBasis: 0, flexGrow: 1, flexShrink: 1 }}\n title={tdsConfig.title}\n >\n <Table config={tdsConfig.config} dataSource={tdsConfig.dataSource} />\n </View>\n );\n\n const getAllLinkedTables = (\n level2: TableDataSourceConfig | TableDataSourceConfig[],\n level3: TableDataSourceConfig | TableDataSourceConfig[] | undefined,\n config: LevelsConfig,\n ) => {\n const results = [getLinkedTables(level2, config.level2)];\n if (level3) {\n results.push(getLinkedTables(level3, config.level3));\n }\n return results;\n };\n\n if (tableConfig) {\n const { \"1\": level1, \"2\": level2, \"3\": level3 } = tableConfig;\n return (\n <div {...htmlAttributes} className={cx(classBase, className)}>\n <Flexbox style={{ flexDirection: \"column\", height: \"100%\" }}>\n <View\n className={`${classBase}-view`}\n header\n resizeable\n style={{ flexBasis: 0, flexGrow: 1, flexShrink: 1 }}\n title={level1.title}\n >\n <Table config={level1.config} dataSource={level1.dataSource} />\n </View>\n {...getAllLinkedTables(level2, level3, config)}\n </Flexbox>\n </div>\n );\n } else {\n return null;\n }\n};\n\n// Wrap the core component in View so we have access to View Context services\nexport const LinkedTableView = ({\n className,\n linkedDataSources,\n ...htmlAttributes\n}: LinkedTableViewProps) => (\n <View {...htmlAttributes} className={className}>\n <LinkedTables linkedDataSources={linkedDataSources} />\n </View>\n);\n"],"names":["useWindow","useComponentCssInjection","css","useLinkedTableView","jsx","Stack","config","View","Table","jsxs","Flexbox"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LinkedTableView.js","sources":["../../src/linked-table-view/LinkedTableView.tsx"],"sourcesContent":["import { DataSource, DataSourceConstructorProps } from \"@vuu-ui/vuu-data-types\";\nimport { Flexbox, Stack, View } from \"@vuu-ui/vuu-layout\";\nimport { VuuLink } from \"@vuu-ui/vuu-protocol-types\";\nimport { Table } from \"@vuu-ui/vuu-table\";\nimport { TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport { Tabstrip, Tab } from \"@vuu-ui/vuu-ui-controls\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { HTMLAttributes } from \"react\";\nimport {\n LevelConfig,\n LevelsConfig,\n type TableDataSourceConfig,\n useLinkedTableView,\n} from \"./useLinkedTableView\";\n\nimport css from \"./LinkedTableView.css\";\nimport { TableLayoutToggleButton } from \"./TableLayoutToggleButton\";\nimport { Filter } from \"@vuu-ui/vuu-filter-types\";\n\nconst classBase = \"vuuLinkedTableView\";\n\nexport interface LinkTableConfig {\n config?: TableConfig;\n dataSource: DataSourceConstructorProps | DataSource;\n title: string;\n}\nexport interface LinkedTableConfig extends LinkTableConfig {\n /**\n * toTable will default to the table above in hierarchy. If there are multiple\n * tables in level above, toTable should be specified.\n */\n vuuLink: Pick<VuuLink, \"fromColumn\" | \"toColumn\"> & { toTable?: string };\n}\n\n/**\n * Currently supports max of three levels of hierarchical data\n * 1 = parent (required)\n * 2 = child (required)\n * 3 = grandchild (optional)\n */\nexport type LinkedDataSources = {\n \"1\": LinkTableConfig;\n \"2\": LinkedTableConfig | LinkedTableConfig[];\n \"3\"?: LinkedTableConfig | LinkedTableConfig[];\n};\n\n/**\n * Displays a vertical 'tower' of Tables with a hierarchical relationship.\n * Currently supported levels are:\n * - tier 1 - parent table(s)\n * - tier 2 - child table(s)\n * -tier 3 (optional) - grandchild table(s)\n *\n * Selection of row(s) on tables higher in the hierarchy drives the display\n * of data in tables below. Currently this is one-way, top-down only\n */\nexport interface LinkedTableViewProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Optional filter to allow externally controlled filter to be applied. This will\n * be applied to tier 1 table(s).\n * If applicable, it will also be applied to tier2/tier3 table(s) when no selection\n * is in effect from parent table, 'If applicable' means if the filter column is\n * available on tier 2/tier 3 tables).\n * If a filter is provided and it cannot be applied - because\n * column name of filter is not available in tier 1 table, an exception will be thrown.\n */\n filter?: Filter;\n linkedDataSources: LinkedDataSources;\n}\nconst LinkedTables = ({\n className,\n linkedDataSources,\n ...htmlAttributes\n}: LinkedTableViewProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-linked-table-view\",\n css: css,\n window: targetWindow,\n });\n\n const { tableConfig, ...config } = useLinkedTableView({\n linkedDataSources,\n });\n\n const getLinkedTables = (\n tdsConfig: TableDataSourceConfig | TableDataSourceConfig[],\n {\n activeTab,\n onChangeTabbedView,\n onTabChange,\n tabbedView,\n ...levelConfig\n }: LevelConfig,\n ) =>\n Array.isArray(tdsConfig) === false ? (\n <View\n {...levelConfig}\n header\n resizeable\n style={{ flexBasis: 0, flexGrow: 1, flexShrink: 1 }}\n title={tdsConfig.title}\n >\n <Table config={tdsConfig.config} dataSource={tdsConfig.dataSource} />\n </View>\n ) : tabbedView === 1 ? (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n flexBasis: 0,\n flexGrow: 1,\n flexShrink: 1,\n }}\n >\n <div className={`${classBase}-header`}>\n <Tabstrip activeTabIndex={activeTab} onActiveChange={onTabChange}>\n {tdsConfig.map(({ title }, i) => (\n <Tab key={i} label={title} />\n ))}\n </Tabstrip>\n <div className={`${classBase}-toolTray`}>\n <TableLayoutToggleButton\n onChange={onChangeTabbedView}\n value={tabbedView}\n />\n </div>\n </div>\n <Stack\n active={activeTab}\n data-resizeable\n key={levelConfig.key}\n showTabs={false}\n style={{ flexBasis: 0, flexGrow: 1, flexShrink: 1 }}\n >\n {tdsConfig.map(({ config, dataSource, title }, i) => (\n <div\n className={`${classBase}-view`}\n key={i}\n style={{ flexBasis: 0, flexGrow: 1, flexShrink: 1 }}\n title={title}\n >\n <Table config={config} dataSource={dataSource} />\n </div>\n ))}\n </Stack>\n </div>\n ) : (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n flexBasis: 0,\n flexGrow: 1,\n flexShrink: 1,\n }}\n >\n <div className={`${classBase}-header`}>\n <div className={`${classBase}-flexHeaders`}>\n {tdsConfig.map(({ title }, i) => (\n <span key={i}>{title}</span>\n ))}\n </div>\n <div className={`${classBase}-toolTray`}>\n <TableLayoutToggleButton\n onChange={onChangeTabbedView}\n value={tabbedView}\n />\n </div>\n </div>\n <Flexbox\n style={{\n flexDirection: \"row\",\n flexBasis: 0,\n flexGrow: 1,\n flexShrink: 1,\n }}\n >\n {tdsConfig.map(({ config, dataSource, title }, i) => (\n <div\n className={`${classBase}-view`}\n data-resizeable\n key={i}\n style={{ flexBasis: 0, flexGrow: 1, flexShrink: 1 }}\n title={title}\n >\n <Table config={config} dataSource={dataSource} />\n </div>\n ))}\n </Flexbox>\n </div>\n );\n const getAllLinkedTables = (\n level2: TableDataSourceConfig | TableDataSourceConfig[],\n level3: TableDataSourceConfig | TableDataSourceConfig[] | undefined,\n config: LevelsConfig,\n ) => {\n const results = [getLinkedTables(level2, config.level2)];\n if (level3) {\n results.push(getLinkedTables(level3, config.level3));\n }\n return results;\n };\n\n if (tableConfig) {\n const { \"1\": level1, \"2\": level2, \"3\": level3 } = tableConfig;\n return (\n <div {...htmlAttributes} className={cx(classBase, className)}>\n <Flexbox style={{ flexDirection: \"column\", height: \"100%\" }}>\n <View\n className={`${classBase}-view`}\n header\n resizeable\n style={{ flexBasis: 0, flexGrow: 1, flexShrink: 1 }}\n title={level1.title}\n >\n <Table config={level1.config} dataSource={level1.dataSource} />\n </View>\n {...getAllLinkedTables(level2, level3, config)}\n </Flexbox>\n </div>\n );\n } else {\n return null;\n }\n};\n\n// Wrap the core component in View so we have access to View Context services\nexport const LinkedTableView = ({\n className,\n linkedDataSources,\n ...htmlAttributes\n}: LinkedTableViewProps) => (\n <View {...htmlAttributes} className={className}>\n <LinkedTables linkedDataSources={linkedDataSources} />\n </View>\n);\n"],"names":["useWindow","useComponentCssInjection","css","useLinkedTableView","jsx","View","Table","jsxs","Tabstrip","Tab","TableLayoutToggleButton","Stack","config","Flexbox"],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var vuuUiControls = require('@vuu-ui/vuu-ui-controls');
|
|
5
|
+
var core = require('@salt-ds/core');
|
|
6
|
+
|
|
7
|
+
const TableLayoutToggleButton = (props) => {
|
|
8
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(core.ToggleButtonGroup, { ...props, children: [
|
|
9
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10
|
+
core.ToggleButton,
|
|
11
|
+
{
|
|
12
|
+
className: "vuuIconToggleButton",
|
|
13
|
+
value: 0,
|
|
14
|
+
"aria-label": "Tabbed View",
|
|
15
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(vuuUiControls.Icon, { name: "split-v", size: 18 })
|
|
16
|
+
}
|
|
17
|
+
),
|
|
18
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
19
|
+
core.ToggleButton,
|
|
20
|
+
{
|
|
21
|
+
className: "vuuIconToggleButton",
|
|
22
|
+
value: 1,
|
|
23
|
+
"aria-label": "Side by side view",
|
|
24
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(vuuUiControls.Icon, { name: "tabs", size: 18 })
|
|
25
|
+
}
|
|
26
|
+
)
|
|
27
|
+
] });
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
exports.TableLayoutToggleButton = TableLayoutToggleButton;
|
|
31
|
+
//# sourceMappingURL=TableLayoutToggleButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableLayoutToggleButton.js","sources":["../../src/linked-table-view/TableLayoutToggleButton.tsx"],"sourcesContent":["import { Icon } from \"@vuu-ui/vuu-ui-controls\";\nimport {\n ToggleButton,\n ToggleButtonGroup,\n ToggleButtonGroupProps,\n} from \"@salt-ds/core\";\n\nexport const TableLayoutToggleButton = (props: ToggleButtonGroupProps) => {\n return (\n <ToggleButtonGroup {...props}>\n <ToggleButton\n className=\"vuuIconToggleButton\"\n value={0}\n aria-label=\"Tabbed View\"\n >\n <Icon name=\"split-v\" size={18} />\n </ToggleButton>\n <ToggleButton\n className=\"vuuIconToggleButton\"\n value={1}\n aria-label=\"Side by side view\"\n >\n <Icon name=\"tabs\" size={18} />\n </ToggleButton>\n </ToggleButtonGroup>\n );\n};\n"],"names":["jsxs","ToggleButtonGroup","jsx","ToggleButton","Icon"],"mappings":";;;;;;AAOa,MAAA,uBAAA,GAA0B,CAAC,KAAkC,KAAA;AACxE,EACE,uBAAAA,eAAA,CAACC,sBAAmB,EAAA,EAAA,GAAG,KACrB,EAAA,QAAA,EAAA;AAAA,oBAAAC,cAAA;AAAA,MAACC,iBAAA;AAAA,MAAA;AAAA,QACC,SAAU,EAAA,qBAAA;AAAA,QACV,KAAO,EAAA,CAAA;AAAA,QACP,YAAW,EAAA,aAAA;AAAA,QAEX,QAAC,kBAAAD,cAAA,CAAAE,kBAAA,EAAA,EAAK,IAAK,EAAA,SAAA,EAAU,MAAM,EAAI,EAAA;AAAA;AAAA,KACjC;AAAA,oBACAF,cAAA;AAAA,MAACC,iBAAA;AAAA,MAAA;AAAA,QACC,SAAU,EAAA,qBAAA;AAAA,QACV,KAAO,EAAA,CAAA;AAAA,QACP,YAAW,EAAA,mBAAA;AAAA,QAEX,QAAC,kBAAAD,cAAA,CAAAE,kBAAA,EAAA,EAAK,IAAK,EAAA,MAAA,EAAO,MAAM,EAAI,EAAA;AAAA;AAAA;AAC9B,GACF,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
4
4
|
var react = require('react');
|
|
5
|
-
var vuuLayout = require('@vuu-ui/vuu-layout');
|
|
6
5
|
|
|
7
6
|
const getSchema = (schemas, { module, table }) => {
|
|
8
7
|
const schema = schemas.find(
|
|
@@ -46,8 +45,6 @@ const useLinkedTableView = ({
|
|
|
46
45
|
}) => {
|
|
47
46
|
const { VuuDataSource, getServerAPI } = vuuUtils.useDataSource();
|
|
48
47
|
const [tableConfig, setTableConfig] = react.useState();
|
|
49
|
-
const { id } = vuuLayout.useViewContext();
|
|
50
|
-
console.log({ id });
|
|
51
48
|
const [activeTabs, setActiveTab] = react.useState([
|
|
52
49
|
0,
|
|
53
50
|
0,
|
|
@@ -57,6 +54,7 @@ const useLinkedTableView = ({
|
|
|
57
54
|
false,
|
|
58
55
|
false
|
|
59
56
|
]);
|
|
57
|
+
const [tabbedView, setTabbedView] = react.useState([1, 1]);
|
|
60
58
|
react.useMemo(async () => {
|
|
61
59
|
const tables = getTables(linkedDataSources);
|
|
62
60
|
const serverAPI = await getServerAPI();
|
|
@@ -156,25 +154,53 @@ const useLinkedTableView = ({
|
|
|
156
154
|
const handleExpandLevel3 = react.useCallback(() => {
|
|
157
155
|
setCollapsed(([val]) => [val, false]);
|
|
158
156
|
}, []);
|
|
157
|
+
const handleChangeTabbedView2 = react.useCallback(
|
|
158
|
+
(evt) => {
|
|
159
|
+
const target = evt.target;
|
|
160
|
+
const button = target?.closest("button");
|
|
161
|
+
if (button) {
|
|
162
|
+
const value = parseInt(button.value);
|
|
163
|
+
setTabbedView(([, val]) => [value, val]);
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
[]
|
|
167
|
+
);
|
|
168
|
+
const handleChangeTabbedView3 = react.useCallback(
|
|
169
|
+
(evt) => {
|
|
170
|
+
const target = evt.target;
|
|
171
|
+
const button = target?.closest("button");
|
|
172
|
+
if (button) {
|
|
173
|
+
const value = parseInt(button.value);
|
|
174
|
+
setTabbedView(([val]) => [val, value]);
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
[]
|
|
178
|
+
);
|
|
159
179
|
return {
|
|
160
|
-
activeTabs,
|
|
161
180
|
level1: {
|
|
181
|
+
activeTab: activeTabs[0],
|
|
162
182
|
key: "level1",
|
|
163
183
|
onTabChange: handleTabChangeLevel1
|
|
164
184
|
},
|
|
165
185
|
level2: {
|
|
186
|
+
activeTab: activeTabs[1],
|
|
166
187
|
collapsed: collapsed[0],
|
|
167
188
|
key: "level2",
|
|
189
|
+
onChangeTabbedView: handleChangeTabbedView2,
|
|
168
190
|
onCollapse: handleCollapseLevel2,
|
|
169
191
|
onExpand: handleExpandLevel2,
|
|
170
|
-
onTabChange: handleTabChangeLevel2
|
|
192
|
+
onTabChange: handleTabChangeLevel2,
|
|
193
|
+
tabbedView: tabbedView[0]
|
|
171
194
|
},
|
|
172
195
|
level3: {
|
|
196
|
+
activeTab: activeTabs[2],
|
|
173
197
|
collapsed: collapsed[1],
|
|
174
198
|
key: "level3",
|
|
199
|
+
onChangeTabbedView: handleChangeTabbedView3,
|
|
175
200
|
onCollapse: handleCollapseLevel3,
|
|
176
201
|
onExpand: handleExpandLevel3,
|
|
177
|
-
onTabChange: handleTabChangeLevel3
|
|
202
|
+
onTabChange: handleTabChangeLevel3,
|
|
203
|
+
tabbedView: tabbedView[1]
|
|
178
204
|
},
|
|
179
205
|
tableConfig
|
|
180
206
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLinkedTableView.js","sources":["../../src/linked-table-view/useLinkedTableView.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceConstructorProps,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport { useDataSource } from \"@vuu-ui/vuu-utils\";\nimport {\n LinkedDataSources,\n LinkedTableConfig,\n LinkedTableViewProps,\n LinkTableConfig,\n} from \"./LinkedTableView\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport { LinkDescriptorWithLabel, VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { useViewContext } from \"@vuu-ui/vuu-layout\";\n\nexport type TableDataSourceConfig = {\n config: TableConfig;\n dataSource: DataSource;\n title: string;\n};\n\nexport type ResolvedTableConfig = {\n \"1\": TableDataSourceConfig;\n \"2\": TableDataSourceConfig | TableDataSourceConfig[];\n \"3\"?: TableDataSourceConfig | TableDataSourceConfig[];\n};\n\nexport type LinkedTableViewHookProps = Pick<\n LinkedTableViewProps,\n \"linkedDataSources\"\n>;\n\nconst getSchema = (schemas: TableSchema[], { module, table }: VuuTable) => {\n const schema = schemas.find(\n ({ table: t }) => t.module === module && t.table === table,\n );\n if (schema) {\n return schema;\n } else {\n throw Error(`No schema for table ${module} ${table}`);\n }\n};\n\nconst getTable = (ds: DataSource | DataSourceConstructorProps): VuuTable => {\n if (ds.table) {\n return ds.table;\n } else {\n throw Error(\"No datasource table specified\");\n }\n};\n\nconst getTables = (linkedDataSources: LinkedDataSources): VuuTable[] => {\n const { \"1\": linked1, \"2\": linked2, \"3\": linked3 } = linkedDataSources;\n\n const tables: VuuTable[] = [];\n\n tables.push(getTable(linked1.dataSource));\n\n if (Array.isArray(linked2)) {\n linked2.forEach(({ dataSource }) => {\n tables.push(getTable(dataSource));\n });\n } else {\n tables.push(getTable(linked2.dataSource));\n }\n\n if (Array.isArray(linked3)) {\n linked3.forEach(({ dataSource }) => {\n tables.push(getTable(dataSource));\n });\n } else if (linked3) {\n tables.push(getTable(linked3.dataSource));\n }\n\n return tables;\n};\n\nexport const useLinkedTableView = ({\n linkedDataSources,\n}: LinkedTableViewHookProps) => {\n const { VuuDataSource, getServerAPI } = useDataSource();\n const [tableConfig, setTableConfig] = useState<\n ResolvedTableConfig | undefined\n >();\n // TBC\n const { id } = useViewContext();\n console.log({ id });\n const [activeTabs, setActiveTab] = useState<[number, number, number]>([\n 0, 0, 0,\n ]);\n const [collapsed, setCollapsed] = useState<[boolean, boolean]>([\n false,\n false,\n ]);\n\n useMemo(async () => {\n const tables = getTables(linkedDataSources);\n const serverAPI = await getServerAPI();\n const schemas = await Promise.all(tables.map(serverAPI.getTableSchema));\n\n const isDataSource = (\n ds: DataSourceConstructorProps | DataSource,\n ): ds is DataSource => typeof ds === typeof VuuDataSource;\n\n const getDataSource = (\n ds: DataSourceConstructorProps | DataSource,\n ): DataSource => {\n if (isDataSource(ds)) {\n return ds;\n } else {\n return new VuuDataSource(ds);\n }\n };\n\n const createVisualLink = (\n vuuLink: LinkedTableConfig[\"vuuLink\"],\n parentDs?: DataSource,\n ) => {\n if (parentDs && parentDs.table) {\n const parentVpId = parentDs.viewport;\n const toTable = vuuLink.toTable ?? parentDs.table?.table;\n\n return {\n link: {\n ...vuuLink,\n toTable,\n },\n parentClientVpId: parentVpId,\n parentVpId,\n } as LinkDescriptorWithLabel;\n } else {\n throw Error(\"visual link cannot be created without parent vp id\");\n }\n };\n\n const getLinkedDataSource = (\n ds: DataSourceConstructorProps | DataSource,\n vuuLink: LinkedTableConfig[\"vuuLink\"],\n parentDs?: DataSource,\n ): DataSource => {\n if (isDataSource(ds)) {\n return ds;\n } else {\n return new VuuDataSource({\n ...ds,\n visualLink: createVisualLink(vuuLink, parentDs),\n });\n }\n };\n\n const getTableConfig = (ds: DataSourceConstructorProps | DataSource) => {\n const schema = getSchema(schemas, getTable(ds));\n return {\n columns: schema.columns,\n };\n };\n\n const getRootConfig = ({\n dataSource: ds,\n title,\n }: LinkTableConfig): TableDataSourceConfig => ({\n config: getTableConfig(ds),\n dataSource: getDataSource(ds),\n title,\n });\n\n const getLinkedConfig = (\n { dataSource: ds, vuuLink, title }: LinkedTableConfig,\n parentDataSource?: DataSource,\n ): TableDataSourceConfig => ({\n config: getTableConfig(ds),\n dataSource: getLinkedDataSource(ds, vuuLink, parentDataSource),\n title,\n });\n\n const getLinkedConfigs = (\n linkedTableConfig: LinkedTableConfig | LinkedTableConfig[],\n parentDataSource?: DataSource,\n ): TableDataSourceConfig | TableDataSourceConfig[] => {\n if (Array.isArray(linkedTableConfig)) {\n return linkedTableConfig.map((config) =>\n getLinkedConfig(config, parentDataSource),\n );\n } else {\n return getLinkedConfig(linkedTableConfig, parentDataSource);\n }\n };\n\n const { \"1\": level1, \"2\": level2, \"3\": level3 } = linkedDataSources;\n\n const configLevel1 = getRootConfig(level1);\n const configLevel2 = getLinkedConfigs(level2, configLevel1.dataSource);\n const dsLevel2 = Array.isArray(configLevel2)\n ? undefined\n : configLevel2.dataSource;\n const configLevel3 = level3\n ? getLinkedConfigs(level3, dsLevel2)\n : undefined;\n\n const results: ResolvedTableConfig = {\n \"1\": configLevel1,\n \"2\": configLevel2,\n \"3\": configLevel3,\n };\n setTableConfig(results);\n }, [VuuDataSource, getServerAPI, linkedDataSources]);\n\n const handleTabChangeLevel1 = useCallback((tabIndex: number) => {\n setActiveTab(([, v2, v3]) => [tabIndex, v2, v3]);\n }, []);\n const handleTabChangeLevel2 = useCallback((tabIndex: number) => {\n setActiveTab(([v1, , v3]) => [v1, tabIndex, v3]);\n }, []);\n const handleTabChangeLevel3 = useCallback((tabIndex: number) => {\n setActiveTab(([v1, v2]) => [v1, v2, tabIndex]);\n }, []);\n\n const handleCollapseLevel2 = useCallback(() => {\n setCollapsed(([, val]) => [true, val]);\n }, []);\n const handleExpandLevel2 = useCallback(() => {\n setCollapsed(([, val]) => [false, val]);\n }, []);\n const handleCollapseLevel3 = useCallback(() => {\n setCollapsed(([val]) => [val, true]);\n }, []);\n const handleExpandLevel3 = useCallback(() => {\n setCollapsed(([val]) => [val, false]);\n }, []);\n\n return {\n activeTabs,\n level1: {\n key: \"level1\",\n onTabChange: handleTabChangeLevel1,\n },\n level2: {\n collapsed: collapsed[0],\n key: \"level2\",\n onCollapse: handleCollapseLevel2,\n onExpand: handleExpandLevel2,\n onTabChange: handleTabChangeLevel2,\n },\n level3: {\n collapsed: collapsed[1],\n key: \"level3\",\n onCollapse: handleCollapseLevel3,\n onExpand: handleExpandLevel3,\n onTabChange: handleTabChangeLevel3,\n },\n tableConfig,\n };\n};\n\nexport type LevelsConfig = {\n level1: LevelConfig;\n level2: LevelConfig;\n level3: LevelConfig;\n};\n\nexport type LevelConfig = {\n key: string;\n collapsed?: boolean;\n onCollapse?: () => void;\n onTabChange?: (tabIndex: number) => void;\n onExpand?: () => void;\n};\n"],"names":["useDataSource","useState","useViewContext","useMemo","useCallback"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useLinkedTableView.js","sources":["../../src/linked-table-view/useLinkedTableView.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceConstructorProps,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport { useDataSource } from \"@vuu-ui/vuu-utils\";\nimport {\n LinkedDataSources,\n LinkedTableConfig,\n LinkedTableViewProps,\n LinkTableConfig,\n} from \"./LinkedTableView\";\nimport { SyntheticEvent, useCallback, useMemo, useState } from \"react\";\nimport { TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport { LinkDescriptorWithLabel, VuuTable } from \"@vuu-ui/vuu-protocol-types\";\n// import { useViewContext } from \"@vuu-ui/vuu-layout\";\n\nexport type TableDataSourceConfig = {\n config: TableConfig;\n dataSource: DataSource;\n title: string;\n};\n\nexport type ResolvedTableConfig = {\n \"1\": TableDataSourceConfig;\n \"2\": TableDataSourceConfig | TableDataSourceConfig[];\n \"3\"?: TableDataSourceConfig | TableDataSourceConfig[];\n};\n\nexport type LinkedTableViewHookProps = Pick<\n LinkedTableViewProps,\n \"linkedDataSources\"\n>;\n\nconst getSchema = (schemas: TableSchema[], { module, table }: VuuTable) => {\n const schema = schemas.find(\n ({ table: t }) => t.module === module && t.table === table,\n );\n if (schema) {\n return schema;\n } else {\n throw Error(`No schema for table ${module} ${table}`);\n }\n};\n\nconst getTable = (ds: DataSource | DataSourceConstructorProps): VuuTable => {\n if (ds.table) {\n return ds.table;\n } else {\n throw Error(\"No datasource table specified\");\n }\n};\n\nconst getTables = (linkedDataSources: LinkedDataSources): VuuTable[] => {\n const { \"1\": linked1, \"2\": linked2, \"3\": linked3 } = linkedDataSources;\n\n const tables: VuuTable[] = [];\n\n tables.push(getTable(linked1.dataSource));\n\n if (Array.isArray(linked2)) {\n linked2.forEach(({ dataSource }) => {\n tables.push(getTable(dataSource));\n });\n } else {\n tables.push(getTable(linked2.dataSource));\n }\n\n if (Array.isArray(linked3)) {\n linked3.forEach(({ dataSource }) => {\n tables.push(getTable(dataSource));\n });\n } else if (linked3) {\n tables.push(getTable(linked3.dataSource));\n }\n\n return tables;\n};\n\nexport const useLinkedTableView = ({\n linkedDataSources,\n}: LinkedTableViewHookProps) => {\n const { VuuDataSource, getServerAPI } = useDataSource();\n const [tableConfig, setTableConfig] = useState<\n ResolvedTableConfig | undefined\n >();\n // const { id } = useViewContext();\n const [activeTabs, setActiveTab] = useState<[number, number, number]>([\n 0, 0, 0,\n ]);\n const [collapsed, setCollapsed] = useState<[boolean, boolean]>([\n false,\n false,\n ]);\n const [tabbedView, setTabbedView] = useState<[0 | 1, 0 | 1]>([1, 1]);\n\n useMemo(async () => {\n const tables = getTables(linkedDataSources);\n const serverAPI = await getServerAPI();\n const schemas = await Promise.all(tables.map(serverAPI.getTableSchema));\n\n const isDataSource = (\n ds: DataSourceConstructorProps | DataSource,\n ): ds is DataSource => typeof ds === typeof VuuDataSource;\n\n const getDataSource = (\n ds: DataSourceConstructorProps | DataSource,\n ): DataSource => {\n if (isDataSource(ds)) {\n return ds;\n } else {\n return new VuuDataSource(ds);\n }\n };\n\n const createVisualLink = (\n vuuLink: LinkedTableConfig[\"vuuLink\"],\n parentDs?: DataSource,\n ) => {\n if (parentDs && parentDs.table) {\n const parentVpId = parentDs.viewport;\n const toTable = vuuLink.toTable ?? parentDs.table?.table;\n\n return {\n link: {\n ...vuuLink,\n toTable,\n },\n parentClientVpId: parentVpId,\n parentVpId,\n } as LinkDescriptorWithLabel;\n } else {\n throw Error(\"visual link cannot be created without parent vp id\");\n }\n };\n\n const getLinkedDataSource = (\n ds: DataSourceConstructorProps | DataSource,\n vuuLink: LinkedTableConfig[\"vuuLink\"],\n parentDs?: DataSource,\n ): DataSource => {\n if (isDataSource(ds)) {\n return ds;\n } else {\n return new VuuDataSource({\n ...ds,\n visualLink: createVisualLink(vuuLink, parentDs),\n });\n }\n };\n\n const getTableConfig = (ds: DataSourceConstructorProps | DataSource) => {\n const schema = getSchema(schemas, getTable(ds));\n return {\n columns: schema.columns,\n };\n };\n\n const getRootConfig = ({\n dataSource: ds,\n title,\n }: LinkTableConfig): TableDataSourceConfig => ({\n config: getTableConfig(ds),\n dataSource: getDataSource(ds),\n title,\n });\n\n const getLinkedConfig = (\n { dataSource: ds, vuuLink, title }: LinkedTableConfig,\n parentDataSource?: DataSource,\n ): TableDataSourceConfig => ({\n config: getTableConfig(ds),\n dataSource: getLinkedDataSource(ds, vuuLink, parentDataSource),\n title,\n });\n\n const getLinkedConfigs = (\n linkedTableConfig: LinkedTableConfig | LinkedTableConfig[],\n parentDataSource?: DataSource,\n ): TableDataSourceConfig | TableDataSourceConfig[] => {\n if (Array.isArray(linkedTableConfig)) {\n return linkedTableConfig.map((config) =>\n getLinkedConfig(config, parentDataSource),\n );\n } else {\n return getLinkedConfig(linkedTableConfig, parentDataSource);\n }\n };\n\n const { \"1\": level1, \"2\": level2, \"3\": level3 } = linkedDataSources;\n\n const configLevel1 = getRootConfig(level1);\n const configLevel2 = getLinkedConfigs(level2, configLevel1.dataSource);\n const dsLevel2 = Array.isArray(configLevel2)\n ? undefined\n : configLevel2.dataSource;\n const configLevel3 = level3\n ? getLinkedConfigs(level3, dsLevel2)\n : undefined;\n\n const results: ResolvedTableConfig = {\n \"1\": configLevel1,\n \"2\": configLevel2,\n \"3\": configLevel3,\n };\n setTableConfig(results);\n }, [VuuDataSource, getServerAPI, linkedDataSources]);\n\n const handleTabChangeLevel1 = useCallback((tabIndex: number) => {\n setActiveTab(([, v2, v3]) => [tabIndex, v2, v3]);\n }, []);\n const handleTabChangeLevel2 = useCallback((tabIndex: number) => {\n setActiveTab(([v1, , v3]) => [v1, tabIndex, v3]);\n }, []);\n const handleTabChangeLevel3 = useCallback((tabIndex: number) => {\n setActiveTab(([v1, v2]) => [v1, v2, tabIndex]);\n }, []);\n\n const handleCollapseLevel2 = useCallback(() => {\n setCollapsed(([, val]) => [true, val]);\n }, []);\n const handleExpandLevel2 = useCallback(() => {\n setCollapsed(([, val]) => [false, val]);\n }, []);\n const handleCollapseLevel3 = useCallback(() => {\n setCollapsed(([val]) => [val, true]);\n }, []);\n const handleExpandLevel3 = useCallback(() => {\n setCollapsed(([val]) => [val, false]);\n }, []);\n\n const handleChangeTabbedView2 = useCallback(\n (evt: SyntheticEvent<HTMLElement>) => {\n const target = evt.target as HTMLElement;\n const button = target?.closest(\"button\");\n if (button) {\n const value = parseInt(button.value) as 0 | 1;\n setTabbedView(([, val]) => [value, val]);\n }\n },\n [],\n );\n const handleChangeTabbedView3 = useCallback(\n (evt: SyntheticEvent<HTMLElement>) => {\n const target = evt.target as HTMLElement;\n const button = target?.closest(\"button\");\n if (button) {\n const value = parseInt(button.value) as 0 | 1;\n setTabbedView(([val]) => [val, value]);\n }\n },\n [],\n );\n\n return {\n level1: {\n activeTab: activeTabs[0],\n key: \"level1\",\n onTabChange: handleTabChangeLevel1,\n },\n level2: {\n activeTab: activeTabs[1],\n collapsed: collapsed[0],\n key: \"level2\",\n onChangeTabbedView: handleChangeTabbedView2,\n onCollapse: handleCollapseLevel2,\n onExpand: handleExpandLevel2,\n onTabChange: handleTabChangeLevel2,\n tabbedView: tabbedView[0],\n },\n level3: {\n activeTab: activeTabs[2],\n collapsed: collapsed[1],\n key: \"level3\",\n onChangeTabbedView: handleChangeTabbedView3,\n onCollapse: handleCollapseLevel3,\n onExpand: handleExpandLevel3,\n onTabChange: handleTabChangeLevel3,\n tabbedView: tabbedView[1],\n },\n tableConfig,\n };\n};\n\nexport type LevelsConfig = {\n level1: LevelConfig;\n level2: LevelConfig;\n level3: LevelConfig;\n};\n\nexport type LevelConfig = {\n activeTab: number;\n key: string;\n collapsed?: boolean;\n onChangeTabbedView?: (evt: SyntheticEvent<HTMLElement>) => void;\n onCollapse?: () => void;\n onTabChange?: (tabIndex: number) => void;\n onExpand?: () => void;\n tabbedView?: 0 | 1;\n};\n"],"names":["useDataSource","useState","useMemo","useCallback"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeTable.js","sources":["../../src/tree-table/TreeTable.tsx"],"sourcesContent":["import { TableProps } from \"@vuu-ui/vuu-table\";\nimport { Table } from \"@vuu-ui/vuu-table\";\nimport { TreeDataSource } from \"@vuu-ui/vuu-data-local\";\nimport { useMemo, useRef } from \"react\";\nimport { TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport {\n isRowSelected,\n metadataKeys,\n type RowToObjectMapper,\n type TreeSourceNode,\n} from \"@vuu-ui/vuu-utils\";\n\nconst { DEPTH, IS_LEAF, KEY, IDX } = metadataKeys;\n\ninterface Props extends Omit<TableProps, \"config\" | \"dataSource\"> {\n config?: Pick<\n TableConfig,\n \"columnSeparators\" | \"rowSeparators\" | \"zebraStripes\"\n >;\n dataSource?: TreeDataSource;\n source?: TreeSourceNode[];\n}\n\nexport type TreeTableProps = Props &\n ({ dataSource: TreeDataSource } | { source: TreeSourceNode[] });\n\nconst rowToTreeNodeObject: RowToObjectMapper = (row, columnMap) => {\n const { [IS_LEAF]: isLeaf, [KEY]: key, [IDX]: index, [DEPTH]: depth } = row;\n const firstColIdx = columnMap.nodeData;\n const labelColIdx = firstColIdx + depth;\n\n return {\n key,\n index,\n isGroupRow: !isLeaf,\n isSelected: isRowSelected(row),\n data: {\n label: row[labelColIdx],\n nodeData: row[firstColIdx],\n },\n };\n};\n\nexport const TreeTable = ({\n config,\n dataSource,\n source,\n ...tableProps\n}: TreeTableProps) => {\n const dataSourceRef = useRef<TreeDataSource>();\n useMemo(() => {\n if (dataSource) {\n dataSourceRef.current = dataSource;\n } else if (source) {\n dataSourceRef.current = new TreeDataSource({\n data: source,\n });\n } else {\n throw Error(`TreeTable either source or dataSource must be provided`);\n }\n }, [dataSource, source]);\n\n const tableConfig = useMemo<TableConfig>(() => {\n return {\n ...config,\n columns: dataSourceRef.current?.columnDescriptors ?? [],\n columnSeparators: false,\n rowSeparators: false,\n };\n }, [config]);\n\n if (dataSourceRef.current === undefined) {\n return null;\n }\n\n return (\n <Table\n {...tableProps}\n className=\"vuuTreeTable\"\n config={tableConfig}\n dataSource={dataSourceRef.current}\n groupToggleTarget=\"toggle-icon\"\n navigationStyle=\"tree\"\n rowToObject={rowToTreeNodeObject}\n showColumnHeaderMenus={false}\n selectionModel=\"single\"\n selectionBookendWidth={0}\n />\n );\n};\n"],"names":["metadataKeys","isRowSelected","useRef","useMemo","TreeDataSource","jsx","Table"],"mappings":";;;;;;;;AAYA,MAAM,EAAE,KAAA,EAAO,OAAS,EAAA,GAAA,EAAK,KAAQ,GAAAA,qBAAA;AAcrC,MAAM,mBAAA,GAAyC,CAAC,GAAA,EAAK,SAAc,KAAA;AACjE,EAAA,MAAM,EAAE,CAAC,OAAO,GAAG,MAAA,EAAQ,CAAC,GAAG,GAAG,GAAK,EAAA,CAAC,GAAG,GAAG,KAAA,EAAO,CAAC,KAAK,GAAG,OAAU,GAAA,GAAA;AACxE,EAAA,MAAM,cAAc,SAAU,CAAA,QAAA;AAC9B,EAAA,MAAM,cAAc,WAAc,GAAA,KAAA;AAElC,EAAO,OAAA;AAAA,IACL,GAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAY,CAAC,MAAA;AAAA,IACb,UAAA,EAAYC,uBAAc,GAAG,CAAA;AAAA,IAC7B,IAAM,EAAA;AAAA,MACJ,KAAA,EAAO,IAAI,WAAW,CAAA;AAAA,MACtB,QAAA,EAAU,IAAI,WAAW;AAAA;AAC3B,GACF;AACF,CAAA;AAEO,MAAM,YAAY,CAAC;AAAA,EACxB,MAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAG;AACL,CAAsB,KAAA;AACpB,EAAA,MAAM,gBAAgBC,YAAuB,EAAA;AAC7C,EAAAC,aAAA,CAAQ,MAAM;AACZ,IAAA,IAAI,UAAY,EAAA;AACd,MAAA,aAAA,CAAc,OAAU,GAAA,UAAA;AAAA,eACf,MAAQ,EAAA;AACjB,MAAc,aAAA,CAAA,OAAA,GAAU,IAAIC,2BAAe,CAAA;AAAA,QACzC,IAAM,EAAA;AAAA,OACP,CAAA;AAAA,KACI,MAAA;AACL,MAAA,MAAM,MAAM,CAAwD,sDAAA,CAAA,CAAA;AAAA;AACtE,GACC,EAAA,CAAC,UAAY,EAAA,MAAM,CAAC,CAAA;AAEvB,EAAM,MAAA,WAAA,GAAcD,cAAqB,MAAM;AAC7C,IAAO,OAAA;AAAA,MACL,GAAG,MAAA;AAAA,MACH,OAAS,EAAA,aAAA,CAAc,OAAS,EAAA,iBAAA,IAAqB,EAAC;AAAA,MACtD,gBAAkB,EAAA,KAAA;AAAA,MAClB,aAAe,EAAA;AAAA,KACjB;AAAA,GACF,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAI,IAAA,aAAA,CAAc,YAAY,KAAW,CAAA,EAAA;AACvC,IAAO,OAAA,IAAA;AAAA;AAGT,EACE,uBAAAE,cAAA;AAAA,IAACC,cAAA;AAAA,IAAA;AAAA,MACE,GAAG,UAAA;AAAA,MACJ,SAAU,EAAA,cAAA;AAAA,MACV,MAAQ,EAAA,WAAA;AAAA,MACR,YAAY,aAAc,CAAA,OAAA;AAAA,MAC1B,iBAAkB,EAAA,aAAA;AAAA,MAClB,eAAgB,EAAA,MAAA;AAAA,MAChB,WAAa,EAAA,mBAAA;AAAA,MACb,qBAAuB,EAAA,KAAA;AAAA,MACvB,cAAe,EAAA,QAAA;AAAA,MACf,qBAAuB,EAAA;AAAA;AAAA,GACzB;AAEJ;;;;"}
|
|
1
|
+
{"version":3,"file":"TreeTable.js","sources":["../../src/tree-table/TreeTable.tsx"],"sourcesContent":["import { TableProps } from \"@vuu-ui/vuu-table\";\nimport { Table } from \"@vuu-ui/vuu-table\";\nimport { TreeDataSource } from \"@vuu-ui/vuu-data-local\";\nimport { useMemo, useRef } from \"react\";\nimport { TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport {\n isRowSelected,\n metadataKeys,\n type RowToObjectMapper,\n type TreeSourceNode,\n} from \"@vuu-ui/vuu-utils\";\n\nconst { DEPTH, IS_LEAF, KEY, IDX } = metadataKeys;\n\ninterface Props extends Omit<TableProps, \"config\" | \"dataSource\"> {\n config?: Pick<\n TableConfig,\n \"columnSeparators\" | \"rowSeparators\" | \"zebraStripes\"\n >;\n dataSource?: TreeDataSource;\n source?: TreeSourceNode[];\n}\n\nexport type TreeTableProps = Props &\n ({ dataSource: TreeDataSource } | { source: TreeSourceNode[] });\n\nconst rowToTreeNodeObject: RowToObjectMapper = (row, columnMap) => {\n const { [IS_LEAF]: isLeaf, [KEY]: key, [IDX]: index, [DEPTH]: depth } = row;\n const firstColIdx = columnMap.nodeData;\n const labelColIdx = firstColIdx + depth;\n\n return {\n key,\n index,\n isGroupRow: !isLeaf,\n isSelected: isRowSelected(row),\n data: {\n label: row[labelColIdx],\n nodeData: row[firstColIdx],\n },\n };\n};\n\nexport const TreeTable = ({\n config,\n dataSource,\n source,\n ...tableProps\n}: TreeTableProps) => {\n const dataSourceRef = useRef<TreeDataSource>();\n useMemo(() => {\n if (dataSource) {\n dataSourceRef.current = dataSource;\n } else if (source) {\n dataSourceRef.current = new TreeDataSource({\n data: source,\n });\n } else {\n throw Error(`TreeTable either source or dataSource must be provided`);\n }\n }, [dataSource, source]);\n\n const tableConfig = useMemo<TableConfig>(() => {\n return {\n ...config,\n columns: dataSourceRef.current?.columnDescriptors ?? [],\n columnSeparators: false,\n rowSeparators: false,\n };\n }, [config]);\n\n console.log({ tableConfig, dataSource: dataSourceRef.current });\n\n if (dataSourceRef.current === undefined) {\n return null;\n }\n\n return (\n <Table\n {...tableProps}\n className=\"vuuTreeTable\"\n config={tableConfig}\n dataSource={dataSourceRef.current}\n groupToggleTarget=\"toggle-icon\"\n navigationStyle=\"tree\"\n rowToObject={rowToTreeNodeObject}\n showColumnHeaderMenus={false}\n selectionModel=\"single\"\n selectionBookendWidth={0}\n />\n );\n};\n"],"names":["metadataKeys","isRowSelected","useRef","useMemo","TreeDataSource","jsx","Table"],"mappings":";;;;;;;;AAYA,MAAM,EAAE,KAAA,EAAO,OAAS,EAAA,GAAA,EAAK,KAAQ,GAAAA,qBAAA;AAcrC,MAAM,mBAAA,GAAyC,CAAC,GAAA,EAAK,SAAc,KAAA;AACjE,EAAA,MAAM,EAAE,CAAC,OAAO,GAAG,MAAA,EAAQ,CAAC,GAAG,GAAG,GAAK,EAAA,CAAC,GAAG,GAAG,KAAA,EAAO,CAAC,KAAK,GAAG,OAAU,GAAA,GAAA;AACxE,EAAA,MAAM,cAAc,SAAU,CAAA,QAAA;AAC9B,EAAA,MAAM,cAAc,WAAc,GAAA,KAAA;AAElC,EAAO,OAAA;AAAA,IACL,GAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAY,CAAC,MAAA;AAAA,IACb,UAAA,EAAYC,uBAAc,GAAG,CAAA;AAAA,IAC7B,IAAM,EAAA;AAAA,MACJ,KAAA,EAAO,IAAI,WAAW,CAAA;AAAA,MACtB,QAAA,EAAU,IAAI,WAAW;AAAA;AAC3B,GACF;AACF,CAAA;AAEO,MAAM,YAAY,CAAC;AAAA,EACxB,MAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAG;AACL,CAAsB,KAAA;AACpB,EAAA,MAAM,gBAAgBC,YAAuB,EAAA;AAC7C,EAAAC,aAAA,CAAQ,MAAM;AACZ,IAAA,IAAI,UAAY,EAAA;AACd,MAAA,aAAA,CAAc,OAAU,GAAA,UAAA;AAAA,eACf,MAAQ,EAAA;AACjB,MAAc,aAAA,CAAA,OAAA,GAAU,IAAIC,2BAAe,CAAA;AAAA,QACzC,IAAM,EAAA;AAAA,OACP,CAAA;AAAA,KACI,MAAA;AACL,MAAA,MAAM,MAAM,CAAwD,sDAAA,CAAA,CAAA;AAAA;AACtE,GACC,EAAA,CAAC,UAAY,EAAA,MAAM,CAAC,CAAA;AAEvB,EAAM,MAAA,WAAA,GAAcD,cAAqB,MAAM;AAC7C,IAAO,OAAA;AAAA,MACL,GAAG,MAAA;AAAA,MACH,OAAS,EAAA,aAAA,CAAc,OAAS,EAAA,iBAAA,IAAqB,EAAC;AAAA,MACtD,gBAAkB,EAAA,KAAA;AAAA,MAClB,aAAe,EAAA;AAAA,KACjB;AAAA,GACF,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,OAAA,CAAQ,IAAI,EAAE,WAAA,EAAa,UAAY,EAAA,aAAA,CAAc,SAAS,CAAA;AAE9D,EAAI,IAAA,aAAA,CAAc,YAAY,KAAW,CAAA,EAAA;AACvC,IAAO,OAAA,IAAA;AAAA;AAGT,EACE,uBAAAE,cAAA;AAAA,IAACC,cAAA;AAAA,IAAA;AAAA,MACE,GAAG,UAAA;AAAA,MACJ,SAAU,EAAA,cAAA;AAAA,MACV,MAAQ,EAAA,WAAA;AAAA,MACR,YAAY,aAAc,CAAA,OAAA;AAAA,MAC1B,iBAAkB,EAAA,aAAA;AAAA,MAClB,eAAgB,EAAA,MAAA;AAAA,MAChB,WAAa,EAAA,mBAAA;AAAA,MACb,qBAAuB,EAAA,KAAA;AAAA,MACvB,cAAe,EAAA,QAAA;AAAA,MACf,qBAAuB,EAAA;AAAA;AAAA,GACzB;AAEJ;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var css = ".vuuLinkedTableView {\n \n}\n\n.vuuLinkedTableView-view {\n padding: var(--salt-spacing-100);\n}";
|
|
1
|
+
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}";
|
|
2
2
|
|
|
3
3
|
export { css as default };
|
|
4
4
|
//# sourceMappingURL=LinkedTableView.css.js.map
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import { View, Flexbox, Stack } from '@vuu-ui/vuu-layout';
|
|
3
3
|
import { Table } from '@vuu-ui/vuu-table';
|
|
4
|
+
import { Tabstrip, Tab } from '@vuu-ui/vuu-ui-controls';
|
|
4
5
|
import { useComponentCssInjection } from '@salt-ds/styles';
|
|
5
6
|
import { useWindow } from '@salt-ds/window';
|
|
6
7
|
import cx from 'clsx';
|
|
7
8
|
import { useLinkedTableView } from './useLinkedTableView.js';
|
|
8
9
|
import css from './LinkedTableView.css.js';
|
|
10
|
+
import { TableLayoutToggleButton } from './TableLayoutToggleButton.js';
|
|
9
11
|
|
|
10
12
|
const classBase = "vuuLinkedTableView";
|
|
11
13
|
const LinkedTables = ({
|
|
@@ -19,30 +21,16 @@ const LinkedTables = ({
|
|
|
19
21
|
css,
|
|
20
22
|
window: targetWindow
|
|
21
23
|
});
|
|
22
|
-
const {
|
|
24
|
+
const { tableConfig, ...config } = useLinkedTableView({
|
|
23
25
|
linkedDataSources
|
|
24
26
|
});
|
|
25
|
-
const getLinkedTables = (tdsConfig, {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
children: tdsConfig.map(({ config: config2, dataSource, title }, i) => /* @__PURE__ */ jsx(
|
|
33
|
-
View,
|
|
34
|
-
{
|
|
35
|
-
className: `${classBase}-view`,
|
|
36
|
-
resizeable: true,
|
|
37
|
-
style: { flexBasis: 0, flexGrow: 1, flexShrink: 1 },
|
|
38
|
-
title,
|
|
39
|
-
children: /* @__PURE__ */ jsx(Table, { config: config2, dataSource })
|
|
40
|
-
},
|
|
41
|
-
i
|
|
42
|
-
))
|
|
43
|
-
},
|
|
44
|
-
levelConfig.key
|
|
45
|
-
) : /* @__PURE__ */ jsx(
|
|
27
|
+
const getLinkedTables = (tdsConfig, {
|
|
28
|
+
activeTab,
|
|
29
|
+
onChangeTabbedView,
|
|
30
|
+
onTabChange,
|
|
31
|
+
tabbedView,
|
|
32
|
+
...levelConfig
|
|
33
|
+
}) => Array.isArray(tdsConfig) === false ? /* @__PURE__ */ jsx(
|
|
46
34
|
View,
|
|
47
35
|
{
|
|
48
36
|
...levelConfig,
|
|
@@ -52,6 +40,94 @@ const LinkedTables = ({
|
|
|
52
40
|
title: tdsConfig.title,
|
|
53
41
|
children: /* @__PURE__ */ jsx(Table, { config: tdsConfig.config, dataSource: tdsConfig.dataSource })
|
|
54
42
|
}
|
|
43
|
+
) : tabbedView === 1 ? /* @__PURE__ */ jsxs(
|
|
44
|
+
"div",
|
|
45
|
+
{
|
|
46
|
+
style: {
|
|
47
|
+
display: "flex",
|
|
48
|
+
flexDirection: "column",
|
|
49
|
+
flexBasis: 0,
|
|
50
|
+
flexGrow: 1,
|
|
51
|
+
flexShrink: 1
|
|
52
|
+
},
|
|
53
|
+
children: [
|
|
54
|
+
/* @__PURE__ */ jsxs("div", { className: `${classBase}-header`, children: [
|
|
55
|
+
/* @__PURE__ */ jsx(Tabstrip, { activeTabIndex: activeTab, onActiveChange: onTabChange, children: tdsConfig.map(({ title }, i) => /* @__PURE__ */ jsx(Tab, { label: title }, i)) }),
|
|
56
|
+
/* @__PURE__ */ jsx("div", { className: `${classBase}-toolTray`, children: /* @__PURE__ */ jsx(
|
|
57
|
+
TableLayoutToggleButton,
|
|
58
|
+
{
|
|
59
|
+
onChange: onChangeTabbedView,
|
|
60
|
+
value: tabbedView
|
|
61
|
+
}
|
|
62
|
+
) })
|
|
63
|
+
] }),
|
|
64
|
+
/* @__PURE__ */ jsx(
|
|
65
|
+
Stack,
|
|
66
|
+
{
|
|
67
|
+
active: activeTab,
|
|
68
|
+
"data-resizeable": true,
|
|
69
|
+
showTabs: false,
|
|
70
|
+
style: { flexBasis: 0, flexGrow: 1, flexShrink: 1 },
|
|
71
|
+
children: tdsConfig.map(({ config: config2, dataSource, title }, i) => /* @__PURE__ */ jsx(
|
|
72
|
+
"div",
|
|
73
|
+
{
|
|
74
|
+
className: `${classBase}-view`,
|
|
75
|
+
style: { flexBasis: 0, flexGrow: 1, flexShrink: 1 },
|
|
76
|
+
title,
|
|
77
|
+
children: /* @__PURE__ */ jsx(Table, { config: config2, dataSource })
|
|
78
|
+
},
|
|
79
|
+
i
|
|
80
|
+
))
|
|
81
|
+
},
|
|
82
|
+
levelConfig.key
|
|
83
|
+
)
|
|
84
|
+
]
|
|
85
|
+
}
|
|
86
|
+
) : /* @__PURE__ */ jsxs(
|
|
87
|
+
"div",
|
|
88
|
+
{
|
|
89
|
+
style: {
|
|
90
|
+
display: "flex",
|
|
91
|
+
flexDirection: "column",
|
|
92
|
+
flexBasis: 0,
|
|
93
|
+
flexGrow: 1,
|
|
94
|
+
flexShrink: 1
|
|
95
|
+
},
|
|
96
|
+
children: [
|
|
97
|
+
/* @__PURE__ */ jsxs("div", { className: `${classBase}-header`, children: [
|
|
98
|
+
/* @__PURE__ */ jsx("div", { className: `${classBase}-flexHeaders`, children: tdsConfig.map(({ title }, i) => /* @__PURE__ */ jsx("span", { children: title }, i)) }),
|
|
99
|
+
/* @__PURE__ */ jsx("div", { className: `${classBase}-toolTray`, children: /* @__PURE__ */ jsx(
|
|
100
|
+
TableLayoutToggleButton,
|
|
101
|
+
{
|
|
102
|
+
onChange: onChangeTabbedView,
|
|
103
|
+
value: tabbedView
|
|
104
|
+
}
|
|
105
|
+
) })
|
|
106
|
+
] }),
|
|
107
|
+
/* @__PURE__ */ jsx(
|
|
108
|
+
Flexbox,
|
|
109
|
+
{
|
|
110
|
+
style: {
|
|
111
|
+
flexDirection: "row",
|
|
112
|
+
flexBasis: 0,
|
|
113
|
+
flexGrow: 1,
|
|
114
|
+
flexShrink: 1
|
|
115
|
+
},
|
|
116
|
+
children: tdsConfig.map(({ config: config2, dataSource, title }, i) => /* @__PURE__ */ jsx(
|
|
117
|
+
"div",
|
|
118
|
+
{
|
|
119
|
+
className: `${classBase}-view`,
|
|
120
|
+
"data-resizeable": true,
|
|
121
|
+
style: { flexBasis: 0, flexGrow: 1, flexShrink: 1 },
|
|
122
|
+
title,
|
|
123
|
+
children: /* @__PURE__ */ jsx(Table, { config: config2, dataSource })
|
|
124
|
+
},
|
|
125
|
+
i
|
|
126
|
+
))
|
|
127
|
+
}
|
|
128
|
+
)
|
|
129
|
+
]
|
|
130
|
+
}
|
|
55
131
|
);
|
|
56
132
|
const getAllLinkedTables = (level2, level3, config2) => {
|
|
57
133
|
const results = [getLinkedTables(level2, config2.level2)];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinkedTableView.js","sources":["../../src/linked-table-view/LinkedTableView.tsx"],"sourcesContent":["import { DataSource, DataSourceConstructorProps } from \"@vuu-ui/vuu-data-types\";\nimport { Flexbox, Stack, View } from \"@vuu-ui/vuu-layout\";\nimport { VuuLink } from \"@vuu-ui/vuu-protocol-types\";\nimport { Table } from \"@vuu-ui/vuu-table\";\nimport { TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { HTMLAttributes } from \"react\";\nimport {\n LevelConfig,\n LevelsConfig,\n type TableDataSourceConfig,\n useLinkedTableView,\n} from \"./useLinkedTableView\";\n\nimport css from \"./LinkedTableView.css\";\n\nconst classBase = \"vuuLinkedTableView\";\n\nexport interface LinkTableConfig {\n config?: TableConfig;\n dataSource: DataSourceConstructorProps | DataSource;\n title: string;\n}\nexport interface LinkedTableConfig extends LinkTableConfig {\n /**\n * toTable will default to the table above in hierarchy. If there are multiple\n * tables in level above, toTable should be specified.\n */\n vuuLink: Pick<VuuLink, \"fromColumn\" | \"toColumn\"> & { toTable?: string };\n}\n\n/**\n * Currently supports max of three levels of hierarchical data\n * 1 = parent (required)\n * 2 = child (required)\n * 3 = grandchild (optional)\n */\nexport type LinkedDataSources = {\n \"1\": LinkTableConfig;\n \"2\": LinkedTableConfig | LinkedTableConfig[];\n \"3\"?: LinkedTableConfig | LinkedTableConfig[];\n};\n\n/**\n * Displays a vertical 'tower' of Tables with a hierarchical relationship.\n * Selection of row(s) on tables higher in the hierarchy drives the population\n * of data in tables below. (could be two-way ?)\n */\nexport interface LinkedTableViewProps extends HTMLAttributes<HTMLDivElement> {\n linkedDataSources: LinkedDataSources;\n}\nconst LinkedTables = ({\n className,\n linkedDataSources,\n ...htmlAttributes\n}: LinkedTableViewProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-linked-table-view\",\n css: css,\n window: targetWindow,\n });\n\n const { activeTabs, tableConfig, ...config } = useLinkedTableView({\n linkedDataSources,\n });\n\n const getLinkedTables = (\n tdsConfig: TableDataSourceConfig | TableDataSourceConfig[],\n { onTabChange, ...levelConfig }: LevelConfig,\n ) =>\n Array.isArray(tdsConfig) ? (\n <Stack\n active={activeTabs[1]}\n data-resizeable\n key={levelConfig.key}\n onTabSelectionChanged={onTabChange}\n style={{ flexBasis: 0, flexGrow: 1, flexShrink: 1 }}\n >\n {tdsConfig.map(({ config, dataSource, title }, i) => (\n <View\n className={`${classBase}-view`}\n key={i}\n resizeable\n style={{ flexBasis: 0, flexGrow: 1, flexShrink: 1 }}\n title={title}\n >\n <Table config={config} dataSource={dataSource} />\n </View>\n ))}\n </Stack>\n ) : (\n <View\n {...levelConfig}\n header\n resizeable\n style={{ flexBasis: 0, flexGrow: 1, flexShrink: 1 }}\n title={tdsConfig.title}\n >\n <Table config={tdsConfig.config} dataSource={tdsConfig.dataSource} />\n </View>\n );\n\n const getAllLinkedTables = (\n level2: TableDataSourceConfig | TableDataSourceConfig[],\n level3: TableDataSourceConfig | TableDataSourceConfig[] | undefined,\n config: LevelsConfig,\n ) => {\n const results = [getLinkedTables(level2, config.level2)];\n if (level3) {\n results.push(getLinkedTables(level3, config.level3));\n }\n return results;\n };\n\n if (tableConfig) {\n const { \"1\": level1, \"2\": level2, \"3\": level3 } = tableConfig;\n return (\n <div {...htmlAttributes} className={cx(classBase, className)}>\n <Flexbox style={{ flexDirection: \"column\", height: \"100%\" }}>\n <View\n className={`${classBase}-view`}\n header\n resizeable\n style={{ flexBasis: 0, flexGrow: 1, flexShrink: 1 }}\n title={level1.title}\n >\n <Table config={level1.config} dataSource={level1.dataSource} />\n </View>\n {...getAllLinkedTables(level2, level3, config)}\n </Flexbox>\n </div>\n );\n } else {\n return null;\n }\n};\n\n// Wrap the core component in View so we have access to View Context services\nexport const LinkedTableView = ({\n className,\n linkedDataSources,\n ...htmlAttributes\n}: LinkedTableViewProps) => (\n <View {...htmlAttributes} className={className}>\n <LinkedTables linkedDataSources={linkedDataSources} />\n </View>\n);\n"],"names":["config"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LinkedTableView.js","sources":["../../src/linked-table-view/LinkedTableView.tsx"],"sourcesContent":["import { DataSource, DataSourceConstructorProps } from \"@vuu-ui/vuu-data-types\";\nimport { Flexbox, Stack, View } from \"@vuu-ui/vuu-layout\";\nimport { VuuLink } from \"@vuu-ui/vuu-protocol-types\";\nimport { Table } from \"@vuu-ui/vuu-table\";\nimport { TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport { Tabstrip, Tab } from \"@vuu-ui/vuu-ui-controls\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { HTMLAttributes } from \"react\";\nimport {\n LevelConfig,\n LevelsConfig,\n type TableDataSourceConfig,\n useLinkedTableView,\n} from \"./useLinkedTableView\";\n\nimport css from \"./LinkedTableView.css\";\nimport { TableLayoutToggleButton } from \"./TableLayoutToggleButton\";\nimport { Filter } from \"@vuu-ui/vuu-filter-types\";\n\nconst classBase = \"vuuLinkedTableView\";\n\nexport interface LinkTableConfig {\n config?: TableConfig;\n dataSource: DataSourceConstructorProps | DataSource;\n title: string;\n}\nexport interface LinkedTableConfig extends LinkTableConfig {\n /**\n * toTable will default to the table above in hierarchy. If there are multiple\n * tables in level above, toTable should be specified.\n */\n vuuLink: Pick<VuuLink, \"fromColumn\" | \"toColumn\"> & { toTable?: string };\n}\n\n/**\n * Currently supports max of three levels of hierarchical data\n * 1 = parent (required)\n * 2 = child (required)\n * 3 = grandchild (optional)\n */\nexport type LinkedDataSources = {\n \"1\": LinkTableConfig;\n \"2\": LinkedTableConfig | LinkedTableConfig[];\n \"3\"?: LinkedTableConfig | LinkedTableConfig[];\n};\n\n/**\n * Displays a vertical 'tower' of Tables with a hierarchical relationship.\n * Currently supported levels are:\n * - tier 1 - parent table(s)\n * - tier 2 - child table(s)\n * -tier 3 (optional) - grandchild table(s)\n *\n * Selection of row(s) on tables higher in the hierarchy drives the display\n * of data in tables below. Currently this is one-way, top-down only\n */\nexport interface LinkedTableViewProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Optional filter to allow externally controlled filter to be applied. This will\n * be applied to tier 1 table(s).\n * If applicable, it will also be applied to tier2/tier3 table(s) when no selection\n * is in effect from parent table, 'If applicable' means if the filter column is\n * available on tier 2/tier 3 tables).\n * If a filter is provided and it cannot be applied - because\n * column name of filter is not available in tier 1 table, an exception will be thrown.\n */\n filter?: Filter;\n linkedDataSources: LinkedDataSources;\n}\nconst LinkedTables = ({\n className,\n linkedDataSources,\n ...htmlAttributes\n}: LinkedTableViewProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-linked-table-view\",\n css: css,\n window: targetWindow,\n });\n\n const { tableConfig, ...config } = useLinkedTableView({\n linkedDataSources,\n });\n\n const getLinkedTables = (\n tdsConfig: TableDataSourceConfig | TableDataSourceConfig[],\n {\n activeTab,\n onChangeTabbedView,\n onTabChange,\n tabbedView,\n ...levelConfig\n }: LevelConfig,\n ) =>\n Array.isArray(tdsConfig) === false ? (\n <View\n {...levelConfig}\n header\n resizeable\n style={{ flexBasis: 0, flexGrow: 1, flexShrink: 1 }}\n title={tdsConfig.title}\n >\n <Table config={tdsConfig.config} dataSource={tdsConfig.dataSource} />\n </View>\n ) : tabbedView === 1 ? (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n flexBasis: 0,\n flexGrow: 1,\n flexShrink: 1,\n }}\n >\n <div className={`${classBase}-header`}>\n <Tabstrip activeTabIndex={activeTab} onActiveChange={onTabChange}>\n {tdsConfig.map(({ title }, i) => (\n <Tab key={i} label={title} />\n ))}\n </Tabstrip>\n <div className={`${classBase}-toolTray`}>\n <TableLayoutToggleButton\n onChange={onChangeTabbedView}\n value={tabbedView}\n />\n </div>\n </div>\n <Stack\n active={activeTab}\n data-resizeable\n key={levelConfig.key}\n showTabs={false}\n style={{ flexBasis: 0, flexGrow: 1, flexShrink: 1 }}\n >\n {tdsConfig.map(({ config, dataSource, title }, i) => (\n <div\n className={`${classBase}-view`}\n key={i}\n style={{ flexBasis: 0, flexGrow: 1, flexShrink: 1 }}\n title={title}\n >\n <Table config={config} dataSource={dataSource} />\n </div>\n ))}\n </Stack>\n </div>\n ) : (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n flexBasis: 0,\n flexGrow: 1,\n flexShrink: 1,\n }}\n >\n <div className={`${classBase}-header`}>\n <div className={`${classBase}-flexHeaders`}>\n {tdsConfig.map(({ title }, i) => (\n <span key={i}>{title}</span>\n ))}\n </div>\n <div className={`${classBase}-toolTray`}>\n <TableLayoutToggleButton\n onChange={onChangeTabbedView}\n value={tabbedView}\n />\n </div>\n </div>\n <Flexbox\n style={{\n flexDirection: \"row\",\n flexBasis: 0,\n flexGrow: 1,\n flexShrink: 1,\n }}\n >\n {tdsConfig.map(({ config, dataSource, title }, i) => (\n <div\n className={`${classBase}-view`}\n data-resizeable\n key={i}\n style={{ flexBasis: 0, flexGrow: 1, flexShrink: 1 }}\n title={title}\n >\n <Table config={config} dataSource={dataSource} />\n </div>\n ))}\n </Flexbox>\n </div>\n );\n const getAllLinkedTables = (\n level2: TableDataSourceConfig | TableDataSourceConfig[],\n level3: TableDataSourceConfig | TableDataSourceConfig[] | undefined,\n config: LevelsConfig,\n ) => {\n const results = [getLinkedTables(level2, config.level2)];\n if (level3) {\n results.push(getLinkedTables(level3, config.level3));\n }\n return results;\n };\n\n if (tableConfig) {\n const { \"1\": level1, \"2\": level2, \"3\": level3 } = tableConfig;\n return (\n <div {...htmlAttributes} className={cx(classBase, className)}>\n <Flexbox style={{ flexDirection: \"column\", height: \"100%\" }}>\n <View\n className={`${classBase}-view`}\n header\n resizeable\n style={{ flexBasis: 0, flexGrow: 1, flexShrink: 1 }}\n title={level1.title}\n >\n <Table config={level1.config} dataSource={level1.dataSource} />\n </View>\n {...getAllLinkedTables(level2, level3, config)}\n </Flexbox>\n </div>\n );\n } else {\n return null;\n }\n};\n\n// Wrap the core component in View so we have access to View Context services\nexport const LinkedTableView = ({\n className,\n linkedDataSources,\n ...htmlAttributes\n}: LinkedTableViewProps) => (\n <View {...htmlAttributes} className={className}>\n <LinkedTables linkedDataSources={linkedDataSources} />\n </View>\n);\n"],"names":["config"],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { Icon } from '@vuu-ui/vuu-ui-controls';
|
|
3
|
+
import { ToggleButtonGroup, ToggleButton } from '@salt-ds/core';
|
|
4
|
+
|
|
5
|
+
const TableLayoutToggleButton = (props) => {
|
|
6
|
+
return /* @__PURE__ */ jsxs(ToggleButtonGroup, { ...props, children: [
|
|
7
|
+
/* @__PURE__ */ jsx(
|
|
8
|
+
ToggleButton,
|
|
9
|
+
{
|
|
10
|
+
className: "vuuIconToggleButton",
|
|
11
|
+
value: 0,
|
|
12
|
+
"aria-label": "Tabbed View",
|
|
13
|
+
children: /* @__PURE__ */ jsx(Icon, { name: "split-v", size: 18 })
|
|
14
|
+
}
|
|
15
|
+
),
|
|
16
|
+
/* @__PURE__ */ jsx(
|
|
17
|
+
ToggleButton,
|
|
18
|
+
{
|
|
19
|
+
className: "vuuIconToggleButton",
|
|
20
|
+
value: 1,
|
|
21
|
+
"aria-label": "Side by side view",
|
|
22
|
+
children: /* @__PURE__ */ jsx(Icon, { name: "tabs", size: 18 })
|
|
23
|
+
}
|
|
24
|
+
)
|
|
25
|
+
] });
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export { TableLayoutToggleButton };
|
|
29
|
+
//# sourceMappingURL=TableLayoutToggleButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableLayoutToggleButton.js","sources":["../../src/linked-table-view/TableLayoutToggleButton.tsx"],"sourcesContent":["import { Icon } from \"@vuu-ui/vuu-ui-controls\";\nimport {\n ToggleButton,\n ToggleButtonGroup,\n ToggleButtonGroupProps,\n} from \"@salt-ds/core\";\n\nexport const TableLayoutToggleButton = (props: ToggleButtonGroupProps) => {\n return (\n <ToggleButtonGroup {...props}>\n <ToggleButton\n className=\"vuuIconToggleButton\"\n value={0}\n aria-label=\"Tabbed View\"\n >\n <Icon name=\"split-v\" size={18} />\n </ToggleButton>\n <ToggleButton\n className=\"vuuIconToggleButton\"\n value={1}\n aria-label=\"Side by side view\"\n >\n <Icon name=\"tabs\" size={18} />\n </ToggleButton>\n </ToggleButtonGroup>\n );\n};\n"],"names":[],"mappings":";;;;AAOa,MAAA,uBAAA,GAA0B,CAAC,KAAkC,KAAA;AACxE,EACE,uBAAA,IAAA,CAAC,iBAAmB,EAAA,EAAA,GAAG,KACrB,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,SAAU,EAAA,qBAAA;AAAA,QACV,KAAO,EAAA,CAAA;AAAA,QACP,YAAW,EAAA,aAAA;AAAA,QAEX,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAK,IAAK,EAAA,SAAA,EAAU,MAAM,EAAI,EAAA;AAAA;AAAA,KACjC;AAAA,oBACA,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,SAAU,EAAA,qBAAA;AAAA,QACV,KAAO,EAAA,CAAA;AAAA,QACP,YAAW,EAAA,mBAAA;AAAA,QAEX,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAK,IAAK,EAAA,MAAA,EAAO,MAAM,EAAI,EAAA;AAAA;AAAA;AAC9B,GACF,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { useDataSource } from '@vuu-ui/vuu-utils';
|
|
2
2
|
import { useState, useMemo, useCallback } from 'react';
|
|
3
|
-
import { useViewContext } from '@vuu-ui/vuu-layout';
|
|
4
3
|
|
|
5
4
|
const getSchema = (schemas, { module, table }) => {
|
|
6
5
|
const schema = schemas.find(
|
|
@@ -44,8 +43,6 @@ const useLinkedTableView = ({
|
|
|
44
43
|
}) => {
|
|
45
44
|
const { VuuDataSource, getServerAPI } = useDataSource();
|
|
46
45
|
const [tableConfig, setTableConfig] = useState();
|
|
47
|
-
const { id } = useViewContext();
|
|
48
|
-
console.log({ id });
|
|
49
46
|
const [activeTabs, setActiveTab] = useState([
|
|
50
47
|
0,
|
|
51
48
|
0,
|
|
@@ -55,6 +52,7 @@ const useLinkedTableView = ({
|
|
|
55
52
|
false,
|
|
56
53
|
false
|
|
57
54
|
]);
|
|
55
|
+
const [tabbedView, setTabbedView] = useState([1, 1]);
|
|
58
56
|
useMemo(async () => {
|
|
59
57
|
const tables = getTables(linkedDataSources);
|
|
60
58
|
const serverAPI = await getServerAPI();
|
|
@@ -154,25 +152,53 @@ const useLinkedTableView = ({
|
|
|
154
152
|
const handleExpandLevel3 = useCallback(() => {
|
|
155
153
|
setCollapsed(([val]) => [val, false]);
|
|
156
154
|
}, []);
|
|
155
|
+
const handleChangeTabbedView2 = useCallback(
|
|
156
|
+
(evt) => {
|
|
157
|
+
const target = evt.target;
|
|
158
|
+
const button = target?.closest("button");
|
|
159
|
+
if (button) {
|
|
160
|
+
const value = parseInt(button.value);
|
|
161
|
+
setTabbedView(([, val]) => [value, val]);
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
[]
|
|
165
|
+
);
|
|
166
|
+
const handleChangeTabbedView3 = useCallback(
|
|
167
|
+
(evt) => {
|
|
168
|
+
const target = evt.target;
|
|
169
|
+
const button = target?.closest("button");
|
|
170
|
+
if (button) {
|
|
171
|
+
const value = parseInt(button.value);
|
|
172
|
+
setTabbedView(([val]) => [val, value]);
|
|
173
|
+
}
|
|
174
|
+
},
|
|
175
|
+
[]
|
|
176
|
+
);
|
|
157
177
|
return {
|
|
158
|
-
activeTabs,
|
|
159
178
|
level1: {
|
|
179
|
+
activeTab: activeTabs[0],
|
|
160
180
|
key: "level1",
|
|
161
181
|
onTabChange: handleTabChangeLevel1
|
|
162
182
|
},
|
|
163
183
|
level2: {
|
|
184
|
+
activeTab: activeTabs[1],
|
|
164
185
|
collapsed: collapsed[0],
|
|
165
186
|
key: "level2",
|
|
187
|
+
onChangeTabbedView: handleChangeTabbedView2,
|
|
166
188
|
onCollapse: handleCollapseLevel2,
|
|
167
189
|
onExpand: handleExpandLevel2,
|
|
168
|
-
onTabChange: handleTabChangeLevel2
|
|
190
|
+
onTabChange: handleTabChangeLevel2,
|
|
191
|
+
tabbedView: tabbedView[0]
|
|
169
192
|
},
|
|
170
193
|
level3: {
|
|
194
|
+
activeTab: activeTabs[2],
|
|
171
195
|
collapsed: collapsed[1],
|
|
172
196
|
key: "level3",
|
|
197
|
+
onChangeTabbedView: handleChangeTabbedView3,
|
|
173
198
|
onCollapse: handleCollapseLevel3,
|
|
174
199
|
onExpand: handleExpandLevel3,
|
|
175
|
-
onTabChange: handleTabChangeLevel3
|
|
200
|
+
onTabChange: handleTabChangeLevel3,
|
|
201
|
+
tabbedView: tabbedView[1]
|
|
176
202
|
},
|
|
177
203
|
tableConfig
|
|
178
204
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLinkedTableView.js","sources":["../../src/linked-table-view/useLinkedTableView.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceConstructorProps,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport { useDataSource } from \"@vuu-ui/vuu-utils\";\nimport {\n LinkedDataSources,\n LinkedTableConfig,\n LinkedTableViewProps,\n LinkTableConfig,\n} from \"./LinkedTableView\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport { LinkDescriptorWithLabel, VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { useViewContext } from \"@vuu-ui/vuu-layout\";\n\nexport type TableDataSourceConfig = {\n config: TableConfig;\n dataSource: DataSource;\n title: string;\n};\n\nexport type ResolvedTableConfig = {\n \"1\": TableDataSourceConfig;\n \"2\": TableDataSourceConfig | TableDataSourceConfig[];\n \"3\"?: TableDataSourceConfig | TableDataSourceConfig[];\n};\n\nexport type LinkedTableViewHookProps = Pick<\n LinkedTableViewProps,\n \"linkedDataSources\"\n>;\n\nconst getSchema = (schemas: TableSchema[], { module, table }: VuuTable) => {\n const schema = schemas.find(\n ({ table: t }) => t.module === module && t.table === table,\n );\n if (schema) {\n return schema;\n } else {\n throw Error(`No schema for table ${module} ${table}`);\n }\n};\n\nconst getTable = (ds: DataSource | DataSourceConstructorProps): VuuTable => {\n if (ds.table) {\n return ds.table;\n } else {\n throw Error(\"No datasource table specified\");\n }\n};\n\nconst getTables = (linkedDataSources: LinkedDataSources): VuuTable[] => {\n const { \"1\": linked1, \"2\": linked2, \"3\": linked3 } = linkedDataSources;\n\n const tables: VuuTable[] = [];\n\n tables.push(getTable(linked1.dataSource));\n\n if (Array.isArray(linked2)) {\n linked2.forEach(({ dataSource }) => {\n tables.push(getTable(dataSource));\n });\n } else {\n tables.push(getTable(linked2.dataSource));\n }\n\n if (Array.isArray(linked3)) {\n linked3.forEach(({ dataSource }) => {\n tables.push(getTable(dataSource));\n });\n } else if (linked3) {\n tables.push(getTable(linked3.dataSource));\n }\n\n return tables;\n};\n\nexport const useLinkedTableView = ({\n linkedDataSources,\n}: LinkedTableViewHookProps) => {\n const { VuuDataSource, getServerAPI } = useDataSource();\n const [tableConfig, setTableConfig] = useState<\n ResolvedTableConfig | undefined\n >();\n // TBC\n const { id } = useViewContext();\n console.log({ id });\n const [activeTabs, setActiveTab] = useState<[number, number, number]>([\n 0, 0, 0,\n ]);\n const [collapsed, setCollapsed] = useState<[boolean, boolean]>([\n false,\n false,\n ]);\n\n useMemo(async () => {\n const tables = getTables(linkedDataSources);\n const serverAPI = await getServerAPI();\n const schemas = await Promise.all(tables.map(serverAPI.getTableSchema));\n\n const isDataSource = (\n ds: DataSourceConstructorProps | DataSource,\n ): ds is DataSource => typeof ds === typeof VuuDataSource;\n\n const getDataSource = (\n ds: DataSourceConstructorProps | DataSource,\n ): DataSource => {\n if (isDataSource(ds)) {\n return ds;\n } else {\n return new VuuDataSource(ds);\n }\n };\n\n const createVisualLink = (\n vuuLink: LinkedTableConfig[\"vuuLink\"],\n parentDs?: DataSource,\n ) => {\n if (parentDs && parentDs.table) {\n const parentVpId = parentDs.viewport;\n const toTable = vuuLink.toTable ?? parentDs.table?.table;\n\n return {\n link: {\n ...vuuLink,\n toTable,\n },\n parentClientVpId: parentVpId,\n parentVpId,\n } as LinkDescriptorWithLabel;\n } else {\n throw Error(\"visual link cannot be created without parent vp id\");\n }\n };\n\n const getLinkedDataSource = (\n ds: DataSourceConstructorProps | DataSource,\n vuuLink: LinkedTableConfig[\"vuuLink\"],\n parentDs?: DataSource,\n ): DataSource => {\n if (isDataSource(ds)) {\n return ds;\n } else {\n return new VuuDataSource({\n ...ds,\n visualLink: createVisualLink(vuuLink, parentDs),\n });\n }\n };\n\n const getTableConfig = (ds: DataSourceConstructorProps | DataSource) => {\n const schema = getSchema(schemas, getTable(ds));\n return {\n columns: schema.columns,\n };\n };\n\n const getRootConfig = ({\n dataSource: ds,\n title,\n }: LinkTableConfig): TableDataSourceConfig => ({\n config: getTableConfig(ds),\n dataSource: getDataSource(ds),\n title,\n });\n\n const getLinkedConfig = (\n { dataSource: ds, vuuLink, title }: LinkedTableConfig,\n parentDataSource?: DataSource,\n ): TableDataSourceConfig => ({\n config: getTableConfig(ds),\n dataSource: getLinkedDataSource(ds, vuuLink, parentDataSource),\n title,\n });\n\n const getLinkedConfigs = (\n linkedTableConfig: LinkedTableConfig | LinkedTableConfig[],\n parentDataSource?: DataSource,\n ): TableDataSourceConfig | TableDataSourceConfig[] => {\n if (Array.isArray(linkedTableConfig)) {\n return linkedTableConfig.map((config) =>\n getLinkedConfig(config, parentDataSource),\n );\n } else {\n return getLinkedConfig(linkedTableConfig, parentDataSource);\n }\n };\n\n const { \"1\": level1, \"2\": level2, \"3\": level3 } = linkedDataSources;\n\n const configLevel1 = getRootConfig(level1);\n const configLevel2 = getLinkedConfigs(level2, configLevel1.dataSource);\n const dsLevel2 = Array.isArray(configLevel2)\n ? undefined\n : configLevel2.dataSource;\n const configLevel3 = level3\n ? getLinkedConfigs(level3, dsLevel2)\n : undefined;\n\n const results: ResolvedTableConfig = {\n \"1\": configLevel1,\n \"2\": configLevel2,\n \"3\": configLevel3,\n };\n setTableConfig(results);\n }, [VuuDataSource, getServerAPI, linkedDataSources]);\n\n const handleTabChangeLevel1 = useCallback((tabIndex: number) => {\n setActiveTab(([, v2, v3]) => [tabIndex, v2, v3]);\n }, []);\n const handleTabChangeLevel2 = useCallback((tabIndex: number) => {\n setActiveTab(([v1, , v3]) => [v1, tabIndex, v3]);\n }, []);\n const handleTabChangeLevel3 = useCallback((tabIndex: number) => {\n setActiveTab(([v1, v2]) => [v1, v2, tabIndex]);\n }, []);\n\n const handleCollapseLevel2 = useCallback(() => {\n setCollapsed(([, val]) => [true, val]);\n }, []);\n const handleExpandLevel2 = useCallback(() => {\n setCollapsed(([, val]) => [false, val]);\n }, []);\n const handleCollapseLevel3 = useCallback(() => {\n setCollapsed(([val]) => [val, true]);\n }, []);\n const handleExpandLevel3 = useCallback(() => {\n setCollapsed(([val]) => [val, false]);\n }, []);\n\n return {\n activeTabs,\n level1: {\n key: \"level1\",\n onTabChange: handleTabChangeLevel1,\n },\n level2: {\n collapsed: collapsed[0],\n key: \"level2\",\n onCollapse: handleCollapseLevel2,\n onExpand: handleExpandLevel2,\n onTabChange: handleTabChangeLevel2,\n },\n level3: {\n collapsed: collapsed[1],\n key: \"level3\",\n onCollapse: handleCollapseLevel3,\n onExpand: handleExpandLevel3,\n onTabChange: handleTabChangeLevel3,\n },\n tableConfig,\n };\n};\n\nexport type LevelsConfig = {\n level1: LevelConfig;\n level2: LevelConfig;\n level3: LevelConfig;\n};\n\nexport type LevelConfig = {\n key: string;\n collapsed?: boolean;\n onCollapse?: () => void;\n onTabChange?: (tabIndex: number) => void;\n onExpand?: () => void;\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useLinkedTableView.js","sources":["../../src/linked-table-view/useLinkedTableView.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceConstructorProps,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport { useDataSource } from \"@vuu-ui/vuu-utils\";\nimport {\n LinkedDataSources,\n LinkedTableConfig,\n LinkedTableViewProps,\n LinkTableConfig,\n} from \"./LinkedTableView\";\nimport { SyntheticEvent, useCallback, useMemo, useState } from \"react\";\nimport { TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport { LinkDescriptorWithLabel, VuuTable } from \"@vuu-ui/vuu-protocol-types\";\n// import { useViewContext } from \"@vuu-ui/vuu-layout\";\n\nexport type TableDataSourceConfig = {\n config: TableConfig;\n dataSource: DataSource;\n title: string;\n};\n\nexport type ResolvedTableConfig = {\n \"1\": TableDataSourceConfig;\n \"2\": TableDataSourceConfig | TableDataSourceConfig[];\n \"3\"?: TableDataSourceConfig | TableDataSourceConfig[];\n};\n\nexport type LinkedTableViewHookProps = Pick<\n LinkedTableViewProps,\n \"linkedDataSources\"\n>;\n\nconst getSchema = (schemas: TableSchema[], { module, table }: VuuTable) => {\n const schema = schemas.find(\n ({ table: t }) => t.module === module && t.table === table,\n );\n if (schema) {\n return schema;\n } else {\n throw Error(`No schema for table ${module} ${table}`);\n }\n};\n\nconst getTable = (ds: DataSource | DataSourceConstructorProps): VuuTable => {\n if (ds.table) {\n return ds.table;\n } else {\n throw Error(\"No datasource table specified\");\n }\n};\n\nconst getTables = (linkedDataSources: LinkedDataSources): VuuTable[] => {\n const { \"1\": linked1, \"2\": linked2, \"3\": linked3 } = linkedDataSources;\n\n const tables: VuuTable[] = [];\n\n tables.push(getTable(linked1.dataSource));\n\n if (Array.isArray(linked2)) {\n linked2.forEach(({ dataSource }) => {\n tables.push(getTable(dataSource));\n });\n } else {\n tables.push(getTable(linked2.dataSource));\n }\n\n if (Array.isArray(linked3)) {\n linked3.forEach(({ dataSource }) => {\n tables.push(getTable(dataSource));\n });\n } else if (linked3) {\n tables.push(getTable(linked3.dataSource));\n }\n\n return tables;\n};\n\nexport const useLinkedTableView = ({\n linkedDataSources,\n}: LinkedTableViewHookProps) => {\n const { VuuDataSource, getServerAPI } = useDataSource();\n const [tableConfig, setTableConfig] = useState<\n ResolvedTableConfig | undefined\n >();\n // const { id } = useViewContext();\n const [activeTabs, setActiveTab] = useState<[number, number, number]>([\n 0, 0, 0,\n ]);\n const [collapsed, setCollapsed] = useState<[boolean, boolean]>([\n false,\n false,\n ]);\n const [tabbedView, setTabbedView] = useState<[0 | 1, 0 | 1]>([1, 1]);\n\n useMemo(async () => {\n const tables = getTables(linkedDataSources);\n const serverAPI = await getServerAPI();\n const schemas = await Promise.all(tables.map(serverAPI.getTableSchema));\n\n const isDataSource = (\n ds: DataSourceConstructorProps | DataSource,\n ): ds is DataSource => typeof ds === typeof VuuDataSource;\n\n const getDataSource = (\n ds: DataSourceConstructorProps | DataSource,\n ): DataSource => {\n if (isDataSource(ds)) {\n return ds;\n } else {\n return new VuuDataSource(ds);\n }\n };\n\n const createVisualLink = (\n vuuLink: LinkedTableConfig[\"vuuLink\"],\n parentDs?: DataSource,\n ) => {\n if (parentDs && parentDs.table) {\n const parentVpId = parentDs.viewport;\n const toTable = vuuLink.toTable ?? parentDs.table?.table;\n\n return {\n link: {\n ...vuuLink,\n toTable,\n },\n parentClientVpId: parentVpId,\n parentVpId,\n } as LinkDescriptorWithLabel;\n } else {\n throw Error(\"visual link cannot be created without parent vp id\");\n }\n };\n\n const getLinkedDataSource = (\n ds: DataSourceConstructorProps | DataSource,\n vuuLink: LinkedTableConfig[\"vuuLink\"],\n parentDs?: DataSource,\n ): DataSource => {\n if (isDataSource(ds)) {\n return ds;\n } else {\n return new VuuDataSource({\n ...ds,\n visualLink: createVisualLink(vuuLink, parentDs),\n });\n }\n };\n\n const getTableConfig = (ds: DataSourceConstructorProps | DataSource) => {\n const schema = getSchema(schemas, getTable(ds));\n return {\n columns: schema.columns,\n };\n };\n\n const getRootConfig = ({\n dataSource: ds,\n title,\n }: LinkTableConfig): TableDataSourceConfig => ({\n config: getTableConfig(ds),\n dataSource: getDataSource(ds),\n title,\n });\n\n const getLinkedConfig = (\n { dataSource: ds, vuuLink, title }: LinkedTableConfig,\n parentDataSource?: DataSource,\n ): TableDataSourceConfig => ({\n config: getTableConfig(ds),\n dataSource: getLinkedDataSource(ds, vuuLink, parentDataSource),\n title,\n });\n\n const getLinkedConfigs = (\n linkedTableConfig: LinkedTableConfig | LinkedTableConfig[],\n parentDataSource?: DataSource,\n ): TableDataSourceConfig | TableDataSourceConfig[] => {\n if (Array.isArray(linkedTableConfig)) {\n return linkedTableConfig.map((config) =>\n getLinkedConfig(config, parentDataSource),\n );\n } else {\n return getLinkedConfig(linkedTableConfig, parentDataSource);\n }\n };\n\n const { \"1\": level1, \"2\": level2, \"3\": level3 } = linkedDataSources;\n\n const configLevel1 = getRootConfig(level1);\n const configLevel2 = getLinkedConfigs(level2, configLevel1.dataSource);\n const dsLevel2 = Array.isArray(configLevel2)\n ? undefined\n : configLevel2.dataSource;\n const configLevel3 = level3\n ? getLinkedConfigs(level3, dsLevel2)\n : undefined;\n\n const results: ResolvedTableConfig = {\n \"1\": configLevel1,\n \"2\": configLevel2,\n \"3\": configLevel3,\n };\n setTableConfig(results);\n }, [VuuDataSource, getServerAPI, linkedDataSources]);\n\n const handleTabChangeLevel1 = useCallback((tabIndex: number) => {\n setActiveTab(([, v2, v3]) => [tabIndex, v2, v3]);\n }, []);\n const handleTabChangeLevel2 = useCallback((tabIndex: number) => {\n setActiveTab(([v1, , v3]) => [v1, tabIndex, v3]);\n }, []);\n const handleTabChangeLevel3 = useCallback((tabIndex: number) => {\n setActiveTab(([v1, v2]) => [v1, v2, tabIndex]);\n }, []);\n\n const handleCollapseLevel2 = useCallback(() => {\n setCollapsed(([, val]) => [true, val]);\n }, []);\n const handleExpandLevel2 = useCallback(() => {\n setCollapsed(([, val]) => [false, val]);\n }, []);\n const handleCollapseLevel3 = useCallback(() => {\n setCollapsed(([val]) => [val, true]);\n }, []);\n const handleExpandLevel3 = useCallback(() => {\n setCollapsed(([val]) => [val, false]);\n }, []);\n\n const handleChangeTabbedView2 = useCallback(\n (evt: SyntheticEvent<HTMLElement>) => {\n const target = evt.target as HTMLElement;\n const button = target?.closest(\"button\");\n if (button) {\n const value = parseInt(button.value) as 0 | 1;\n setTabbedView(([, val]) => [value, val]);\n }\n },\n [],\n );\n const handleChangeTabbedView3 = useCallback(\n (evt: SyntheticEvent<HTMLElement>) => {\n const target = evt.target as HTMLElement;\n const button = target?.closest(\"button\");\n if (button) {\n const value = parseInt(button.value) as 0 | 1;\n setTabbedView(([val]) => [val, value]);\n }\n },\n [],\n );\n\n return {\n level1: {\n activeTab: activeTabs[0],\n key: \"level1\",\n onTabChange: handleTabChangeLevel1,\n },\n level2: {\n activeTab: activeTabs[1],\n collapsed: collapsed[0],\n key: \"level2\",\n onChangeTabbedView: handleChangeTabbedView2,\n onCollapse: handleCollapseLevel2,\n onExpand: handleExpandLevel2,\n onTabChange: handleTabChangeLevel2,\n tabbedView: tabbedView[0],\n },\n level3: {\n activeTab: activeTabs[2],\n collapsed: collapsed[1],\n key: \"level3\",\n onChangeTabbedView: handleChangeTabbedView3,\n onCollapse: handleCollapseLevel3,\n onExpand: handleExpandLevel3,\n onTabChange: handleTabChangeLevel3,\n tabbedView: tabbedView[1],\n },\n tableConfig,\n };\n};\n\nexport type LevelsConfig = {\n level1: LevelConfig;\n level2: LevelConfig;\n level3: LevelConfig;\n};\n\nexport type LevelConfig = {\n activeTab: number;\n key: string;\n collapsed?: boolean;\n onChangeTabbedView?: (evt: SyntheticEvent<HTMLElement>) => void;\n onCollapse?: () => void;\n onTabChange?: (tabIndex: number) => void;\n onExpand?: () => void;\n tabbedView?: 0 | 1;\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeTable.js","sources":["../../src/tree-table/TreeTable.tsx"],"sourcesContent":["import { TableProps } from \"@vuu-ui/vuu-table\";\nimport { Table } from \"@vuu-ui/vuu-table\";\nimport { TreeDataSource } from \"@vuu-ui/vuu-data-local\";\nimport { useMemo, useRef } from \"react\";\nimport { TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport {\n isRowSelected,\n metadataKeys,\n type RowToObjectMapper,\n type TreeSourceNode,\n} from \"@vuu-ui/vuu-utils\";\n\nconst { DEPTH, IS_LEAF, KEY, IDX } = metadataKeys;\n\ninterface Props extends Omit<TableProps, \"config\" | \"dataSource\"> {\n config?: Pick<\n TableConfig,\n \"columnSeparators\" | \"rowSeparators\" | \"zebraStripes\"\n >;\n dataSource?: TreeDataSource;\n source?: TreeSourceNode[];\n}\n\nexport type TreeTableProps = Props &\n ({ dataSource: TreeDataSource } | { source: TreeSourceNode[] });\n\nconst rowToTreeNodeObject: RowToObjectMapper = (row, columnMap) => {\n const { [IS_LEAF]: isLeaf, [KEY]: key, [IDX]: index, [DEPTH]: depth } = row;\n const firstColIdx = columnMap.nodeData;\n const labelColIdx = firstColIdx + depth;\n\n return {\n key,\n index,\n isGroupRow: !isLeaf,\n isSelected: isRowSelected(row),\n data: {\n label: row[labelColIdx],\n nodeData: row[firstColIdx],\n },\n };\n};\n\nexport const TreeTable = ({\n config,\n dataSource,\n source,\n ...tableProps\n}: TreeTableProps) => {\n const dataSourceRef = useRef<TreeDataSource>();\n useMemo(() => {\n if (dataSource) {\n dataSourceRef.current = dataSource;\n } else if (source) {\n dataSourceRef.current = new TreeDataSource({\n data: source,\n });\n } else {\n throw Error(`TreeTable either source or dataSource must be provided`);\n }\n }, [dataSource, source]);\n\n const tableConfig = useMemo<TableConfig>(() => {\n return {\n ...config,\n columns: dataSourceRef.current?.columnDescriptors ?? [],\n columnSeparators: false,\n rowSeparators: false,\n };\n }, [config]);\n\n if (dataSourceRef.current === undefined) {\n return null;\n }\n\n return (\n <Table\n {...tableProps}\n className=\"vuuTreeTable\"\n config={tableConfig}\n dataSource={dataSourceRef.current}\n groupToggleTarget=\"toggle-icon\"\n navigationStyle=\"tree\"\n rowToObject={rowToTreeNodeObject}\n showColumnHeaderMenus={false}\n selectionModel=\"single\"\n selectionBookendWidth={0}\n />\n );\n};\n"],"names":[],"mappings":";;;;;;AAYA,MAAM,EAAE,KAAA,EAAO,OAAS,EAAA,GAAA,EAAK,KAAQ,GAAA,YAAA;AAcrC,MAAM,mBAAA,GAAyC,CAAC,GAAA,EAAK,SAAc,KAAA;AACjE,EAAA,MAAM,EAAE,CAAC,OAAO,GAAG,MAAA,EAAQ,CAAC,GAAG,GAAG,GAAK,EAAA,CAAC,GAAG,GAAG,KAAA,EAAO,CAAC,KAAK,GAAG,OAAU,GAAA,GAAA;AACxE,EAAA,MAAM,cAAc,SAAU,CAAA,QAAA;AAC9B,EAAA,MAAM,cAAc,WAAc,GAAA,KAAA;AAElC,EAAO,OAAA;AAAA,IACL,GAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAY,CAAC,MAAA;AAAA,IACb,UAAA,EAAY,cAAc,GAAG,CAAA;AAAA,IAC7B,IAAM,EAAA;AAAA,MACJ,KAAA,EAAO,IAAI,WAAW,CAAA;AAAA,MACtB,QAAA,EAAU,IAAI,WAAW;AAAA;AAC3B,GACF;AACF,CAAA;AAEO,MAAM,YAAY,CAAC;AAAA,EACxB,MAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAG;AACL,CAAsB,KAAA;AACpB,EAAA,MAAM,gBAAgB,MAAuB,EAAA;AAC7C,EAAA,OAAA,CAAQ,MAAM;AACZ,IAAA,IAAI,UAAY,EAAA;AACd,MAAA,aAAA,CAAc,OAAU,GAAA,UAAA;AAAA,eACf,MAAQ,EAAA;AACjB,MAAc,aAAA,CAAA,OAAA,GAAU,IAAI,cAAe,CAAA;AAAA,QACzC,IAAM,EAAA;AAAA,OACP,CAAA;AAAA,KACI,MAAA;AACL,MAAA,MAAM,MAAM,CAAwD,sDAAA,CAAA,CAAA;AAAA;AACtE,GACC,EAAA,CAAC,UAAY,EAAA,MAAM,CAAC,CAAA;AAEvB,EAAM,MAAA,WAAA,GAAc,QAAqB,MAAM;AAC7C,IAAO,OAAA;AAAA,MACL,GAAG,MAAA;AAAA,MACH,OAAS,EAAA,aAAA,CAAc,OAAS,EAAA,iBAAA,IAAqB,EAAC;AAAA,MACtD,gBAAkB,EAAA,KAAA;AAAA,MAClB,aAAe,EAAA;AAAA,KACjB;AAAA,GACF,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAI,IAAA,aAAA,CAAc,YAAY,KAAW,CAAA,EAAA;AACvC,IAAO,OAAA,IAAA;AAAA;AAGT,EACE,uBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,UAAA;AAAA,MACJ,SAAU,EAAA,cAAA;AAAA,MACV,MAAQ,EAAA,WAAA;AAAA,MACR,YAAY,aAAc,CAAA,OAAA;AAAA,MAC1B,iBAAkB,EAAA,aAAA;AAAA,MAClB,eAAgB,EAAA,MAAA;AAAA,MAChB,WAAa,EAAA,mBAAA;AAAA,MACb,qBAAuB,EAAA,KAAA;AAAA,MACvB,cAAe,EAAA,QAAA;AAAA,MACf,qBAAuB,EAAA;AAAA;AAAA,GACzB;AAEJ;;;;"}
|
|
1
|
+
{"version":3,"file":"TreeTable.js","sources":["../../src/tree-table/TreeTable.tsx"],"sourcesContent":["import { TableProps } from \"@vuu-ui/vuu-table\";\nimport { Table } from \"@vuu-ui/vuu-table\";\nimport { TreeDataSource } from \"@vuu-ui/vuu-data-local\";\nimport { useMemo, useRef } from \"react\";\nimport { TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport {\n isRowSelected,\n metadataKeys,\n type RowToObjectMapper,\n type TreeSourceNode,\n} from \"@vuu-ui/vuu-utils\";\n\nconst { DEPTH, IS_LEAF, KEY, IDX } = metadataKeys;\n\ninterface Props extends Omit<TableProps, \"config\" | \"dataSource\"> {\n config?: Pick<\n TableConfig,\n \"columnSeparators\" | \"rowSeparators\" | \"zebraStripes\"\n >;\n dataSource?: TreeDataSource;\n source?: TreeSourceNode[];\n}\n\nexport type TreeTableProps = Props &\n ({ dataSource: TreeDataSource } | { source: TreeSourceNode[] });\n\nconst rowToTreeNodeObject: RowToObjectMapper = (row, columnMap) => {\n const { [IS_LEAF]: isLeaf, [KEY]: key, [IDX]: index, [DEPTH]: depth } = row;\n const firstColIdx = columnMap.nodeData;\n const labelColIdx = firstColIdx + depth;\n\n return {\n key,\n index,\n isGroupRow: !isLeaf,\n isSelected: isRowSelected(row),\n data: {\n label: row[labelColIdx],\n nodeData: row[firstColIdx],\n },\n };\n};\n\nexport const TreeTable = ({\n config,\n dataSource,\n source,\n ...tableProps\n}: TreeTableProps) => {\n const dataSourceRef = useRef<TreeDataSource>();\n useMemo(() => {\n if (dataSource) {\n dataSourceRef.current = dataSource;\n } else if (source) {\n dataSourceRef.current = new TreeDataSource({\n data: source,\n });\n } else {\n throw Error(`TreeTable either source or dataSource must be provided`);\n }\n }, [dataSource, source]);\n\n const tableConfig = useMemo<TableConfig>(() => {\n return {\n ...config,\n columns: dataSourceRef.current?.columnDescriptors ?? [],\n columnSeparators: false,\n rowSeparators: false,\n };\n }, [config]);\n\n console.log({ tableConfig, dataSource: dataSourceRef.current });\n\n if (dataSourceRef.current === undefined) {\n return null;\n }\n\n return (\n <Table\n {...tableProps}\n className=\"vuuTreeTable\"\n config={tableConfig}\n dataSource={dataSourceRef.current}\n groupToggleTarget=\"toggle-icon\"\n navigationStyle=\"tree\"\n rowToObject={rowToTreeNodeObject}\n showColumnHeaderMenus={false}\n selectionModel=\"single\"\n selectionBookendWidth={0}\n />\n );\n};\n"],"names":[],"mappings":";;;;;;AAYA,MAAM,EAAE,KAAA,EAAO,OAAS,EAAA,GAAA,EAAK,KAAQ,GAAA,YAAA;AAcrC,MAAM,mBAAA,GAAyC,CAAC,GAAA,EAAK,SAAc,KAAA;AACjE,EAAA,MAAM,EAAE,CAAC,OAAO,GAAG,MAAA,EAAQ,CAAC,GAAG,GAAG,GAAK,EAAA,CAAC,GAAG,GAAG,KAAA,EAAO,CAAC,KAAK,GAAG,OAAU,GAAA,GAAA;AACxE,EAAA,MAAM,cAAc,SAAU,CAAA,QAAA;AAC9B,EAAA,MAAM,cAAc,WAAc,GAAA,KAAA;AAElC,EAAO,OAAA;AAAA,IACL,GAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAY,CAAC,MAAA;AAAA,IACb,UAAA,EAAY,cAAc,GAAG,CAAA;AAAA,IAC7B,IAAM,EAAA;AAAA,MACJ,KAAA,EAAO,IAAI,WAAW,CAAA;AAAA,MACtB,QAAA,EAAU,IAAI,WAAW;AAAA;AAC3B,GACF;AACF,CAAA;AAEO,MAAM,YAAY,CAAC;AAAA,EACxB,MAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAG;AACL,CAAsB,KAAA;AACpB,EAAA,MAAM,gBAAgB,MAAuB,EAAA;AAC7C,EAAA,OAAA,CAAQ,MAAM;AACZ,IAAA,IAAI,UAAY,EAAA;AACd,MAAA,aAAA,CAAc,OAAU,GAAA,UAAA;AAAA,eACf,MAAQ,EAAA;AACjB,MAAc,aAAA,CAAA,OAAA,GAAU,IAAI,cAAe,CAAA;AAAA,QACzC,IAAM,EAAA;AAAA,OACP,CAAA;AAAA,KACI,MAAA;AACL,MAAA,MAAM,MAAM,CAAwD,sDAAA,CAAA,CAAA;AAAA;AACtE,GACC,EAAA,CAAC,UAAY,EAAA,MAAM,CAAC,CAAA;AAEvB,EAAM,MAAA,WAAA,GAAc,QAAqB,MAAM;AAC7C,IAAO,OAAA;AAAA,MACL,GAAG,MAAA;AAAA,MACH,OAAS,EAAA,aAAA,CAAc,OAAS,EAAA,iBAAA,IAAqB,EAAC;AAAA,MACtD,gBAAkB,EAAA,KAAA;AAAA,MAClB,aAAe,EAAA;AAAA,KACjB;AAAA,GACF,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,OAAA,CAAQ,IAAI,EAAE,WAAA,EAAa,UAAY,EAAA,aAAA,CAAc,SAAS,CAAA;AAE9D,EAAI,IAAA,aAAA,CAAc,YAAY,KAAW,CAAA,EAAA;AACvC,IAAO,OAAA,IAAA;AAAA;AAGT,EACE,uBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,UAAA;AAAA,MACJ,SAAU,EAAA,cAAA;AAAA,MACV,MAAQ,EAAA,WAAA;AAAA,MACR,YAAY,aAAc,CAAA,OAAA;AAAA,MAC1B,iBAAkB,EAAA,aAAA;AAAA,MAClB,eAAgB,EAAA,MAAA;AAAA,MAChB,WAAa,EAAA,mBAAA;AAAA,MACb,qBAAuB,EAAA,KAAA;AAAA,MACvB,cAAe,EAAA,QAAA;AAAA,MACf,qBAAuB,EAAA;AAAA;AAAA,GACzB;AAEJ;;;;"}
|
package/package.json
CHANGED
|
@@ -1,25 +1,26 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.
|
|
2
|
+
"version": "0.10.1",
|
|
3
3
|
"author": "heswell",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"dependencies": {
|
|
6
|
+
"@salt-ds/core": "1.43.0",
|
|
6
7
|
"@salt-ds/styles": "0.2.1",
|
|
7
8
|
"@salt-ds/window": "0.1.1",
|
|
8
|
-
"@vuu-ui/vuu-data-local": "0.
|
|
9
|
-
"@vuu-ui/vuu-table-types": "0.
|
|
10
|
-
"@vuu-ui/vuu-filters": "0.
|
|
11
|
-
"@vuu-ui/vuu-layout": "0.
|
|
12
|
-
"@vuu-ui/vuu-popups": "0.
|
|
13
|
-
"@vuu-ui/vuu-shell": "0.
|
|
14
|
-
"@vuu-ui/vuu-table": "0.
|
|
15
|
-
"@vuu-ui/vuu-table-extras": "0.
|
|
16
|
-
"@vuu-ui/vuu-ui-controls": "0.
|
|
17
|
-
"@vuu-ui/vuu-utils": "0.
|
|
9
|
+
"@vuu-ui/vuu-data-local": "0.10.1",
|
|
10
|
+
"@vuu-ui/vuu-table-types": "0.10.1",
|
|
11
|
+
"@vuu-ui/vuu-filters": "0.10.1",
|
|
12
|
+
"@vuu-ui/vuu-layout": "0.10.1",
|
|
13
|
+
"@vuu-ui/vuu-popups": "0.10.1",
|
|
14
|
+
"@vuu-ui/vuu-shell": "0.10.1",
|
|
15
|
+
"@vuu-ui/vuu-table": "0.10.1",
|
|
16
|
+
"@vuu-ui/vuu-table-extras": "0.10.1",
|
|
17
|
+
"@vuu-ui/vuu-ui-controls": "0.10.1",
|
|
18
|
+
"@vuu-ui/vuu-utils": "0.10.1"
|
|
18
19
|
},
|
|
19
20
|
"peerDependencies": {
|
|
20
21
|
"clsx": "^2.0.0",
|
|
21
|
-
"react": "
|
|
22
|
-
"react-dom": "
|
|
22
|
+
"react": "^18.3.1",
|
|
23
|
+
"react-dom": "^18.3.1"
|
|
23
24
|
},
|
|
24
25
|
"files": [
|
|
25
26
|
"README.md",
|
|
@@ -2,6 +2,7 @@ import { DataSource, DataSourceConstructorProps } from "@vuu-ui/vuu-data-types";
|
|
|
2
2
|
import { VuuLink } from "@vuu-ui/vuu-protocol-types";
|
|
3
3
|
import { TableConfig } from "@vuu-ui/vuu-table-types";
|
|
4
4
|
import { HTMLAttributes } from "react";
|
|
5
|
+
import { Filter } from "@vuu-ui/vuu-filter-types";
|
|
5
6
|
export interface LinkTableConfig {
|
|
6
7
|
config?: TableConfig;
|
|
7
8
|
dataSource: DataSourceConstructorProps | DataSource;
|
|
@@ -29,10 +30,25 @@ export type LinkedDataSources = {
|
|
|
29
30
|
};
|
|
30
31
|
/**
|
|
31
32
|
* Displays a vertical 'tower' of Tables with a hierarchical relationship.
|
|
32
|
-
*
|
|
33
|
-
*
|
|
33
|
+
* Currently supported levels are:
|
|
34
|
+
* - tier 1 - parent table(s)
|
|
35
|
+
* - tier 2 - child table(s)
|
|
36
|
+
* -tier 3 (optional) - grandchild table(s)
|
|
37
|
+
*
|
|
38
|
+
* Selection of row(s) on tables higher in the hierarchy drives the display
|
|
39
|
+
* of data in tables below. Currently this is one-way, top-down only
|
|
34
40
|
*/
|
|
35
41
|
export interface LinkedTableViewProps extends HTMLAttributes<HTMLDivElement> {
|
|
42
|
+
/**
|
|
43
|
+
* Optional filter to allow externally controlled filter to be applied. This will
|
|
44
|
+
* be applied to tier 1 table(s).
|
|
45
|
+
* If applicable, it will also be applied to tier2/tier3 table(s) when no selection
|
|
46
|
+
* is in effect from parent table, 'If applicable' means if the filter column is
|
|
47
|
+
* available on tier 2/tier 3 tables).
|
|
48
|
+
* If a filter is provided and it cannot be applied - because
|
|
49
|
+
* column name of filter is not available in tier 1 table, an exception will be thrown.
|
|
50
|
+
*/
|
|
51
|
+
filter?: Filter;
|
|
36
52
|
linkedDataSources: LinkedDataSources;
|
|
37
53
|
}
|
|
38
54
|
export declare const LinkedTableView: ({ className, linkedDataSources, ...htmlAttributes }: LinkedTableViewProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { DataSource } from "@vuu-ui/vuu-data-types";
|
|
2
2
|
import { LinkedTableViewProps } from "./LinkedTableView";
|
|
3
|
+
import { SyntheticEvent } from "react";
|
|
3
4
|
import { TableConfig } from "@vuu-ui/vuu-table-types";
|
|
4
5
|
export type TableDataSourceConfig = {
|
|
5
6
|
config: TableConfig;
|
|
@@ -13,24 +14,30 @@ export type ResolvedTableConfig = {
|
|
|
13
14
|
};
|
|
14
15
|
export type LinkedTableViewHookProps = Pick<LinkedTableViewProps, "linkedDataSources">;
|
|
15
16
|
export declare const useLinkedTableView: ({ linkedDataSources, }: LinkedTableViewHookProps) => {
|
|
16
|
-
activeTabs: [number, number, number];
|
|
17
17
|
level1: {
|
|
18
|
+
activeTab: number;
|
|
18
19
|
key: string;
|
|
19
20
|
onTabChange: (tabIndex: number) => void;
|
|
20
21
|
};
|
|
21
22
|
level2: {
|
|
23
|
+
activeTab: number;
|
|
22
24
|
collapsed: boolean;
|
|
23
25
|
key: string;
|
|
26
|
+
onChangeTabbedView: (evt: SyntheticEvent<HTMLElement>) => void;
|
|
24
27
|
onCollapse: () => void;
|
|
25
28
|
onExpand: () => void;
|
|
26
29
|
onTabChange: (tabIndex: number) => void;
|
|
30
|
+
tabbedView: 0 | 1;
|
|
27
31
|
};
|
|
28
32
|
level3: {
|
|
33
|
+
activeTab: number;
|
|
29
34
|
collapsed: boolean;
|
|
30
35
|
key: string;
|
|
36
|
+
onChangeTabbedView: (evt: SyntheticEvent<HTMLElement>) => void;
|
|
31
37
|
onCollapse: () => void;
|
|
32
38
|
onExpand: () => void;
|
|
33
39
|
onTabChange: (tabIndex: number) => void;
|
|
40
|
+
tabbedView: 0 | 1;
|
|
34
41
|
};
|
|
35
42
|
tableConfig: ResolvedTableConfig | undefined;
|
|
36
43
|
};
|
|
@@ -40,9 +47,12 @@ export type LevelsConfig = {
|
|
|
40
47
|
level3: LevelConfig;
|
|
41
48
|
};
|
|
42
49
|
export type LevelConfig = {
|
|
50
|
+
activeTab: number;
|
|
43
51
|
key: string;
|
|
44
52
|
collapsed?: boolean;
|
|
53
|
+
onChangeTabbedView?: (evt: SyntheticEvent<HTMLElement>) => void;
|
|
45
54
|
onCollapse?: () => void;
|
|
46
55
|
onTabChange?: (tabIndex: number) => void;
|
|
47
56
|
onExpand?: () => void;
|
|
57
|
+
tabbedView?: 0 | 1;
|
|
48
58
|
};
|