@vuu-ui/vuu-table-extras 2.1.19-beta.1 → 2.1.19-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +13 -14
- package/src/calculated-column/CalculatedColumnPanel.js +95 -0
- package/src/calculated-column/useCalculatedColumnPanel.js +60 -0
- package/src/calculated-column/useEditCalculatedColumn.js +104 -0
- package/src/cell-edit-validators/CaseValidator.js +21 -0
- package/src/cell-edit-validators/PatternValidator.js +23 -0
- package/src/cell-edit-validators/index.js +2 -0
- package/src/cell-renderers/background-cell/BackgroundCell.css.js +103 -0
- package/src/cell-renderers/background-cell/BackgroundCell.js +76 -0
- package/src/cell-renderers/background-cell/BackgroundCellConfigurationEditor.css.js +9 -0
- package/src/cell-renderers/background-cell/BackgroundCellConfigurationEditor.js +71 -0
- package/src/cell-renderers/background-cell/BackgroundKeyframes.css.js +187 -0
- package/src/cell-renderers/background-cell/index.js +2 -0
- package/src/cell-renderers/background-cell/useDirection.js +25 -0
- package/src/cell-renderers/button-cell/IconButtonCell.css.js +23 -0
- package/src/cell-renderers/button-cell/IconButtonCell.js +33 -0
- package/src/cell-renderers/dropdown-cell/DropdownCell.css.js +36 -0
- package/src/cell-renderers/dropdown-cell/DropdownCell.js +84 -0
- package/src/cell-renderers/dropdown-cell/index.js +1 -0
- package/src/cell-renderers/index.js +6 -0
- package/src/cell-renderers/lookup-cell/LookupCell.js +15 -0
- package/src/cell-renderers/lookup-cell/index.js +1 -0
- package/src/cell-renderers/pct-progress-cell/PctProgressCell.css.js +31 -0
- package/src/cell-renderers/pct-progress-cell/PctProgressCell.js +49 -0
- package/src/cell-renderers/pct-progress-cell/index.js +1 -0
- package/src/cell-renderers/progress-cell/ProgressCell.css.js +43 -0
- package/src/cell-renderers/progress-cell/ProgressCell.js +74 -0
- package/src/cell-renderers/progress-cell/index.js +1 -0
- package/src/column-expression-input/ColumnExpressionInput.css.js +94 -0
- package/src/column-expression-input/ColumnExpressionInput.js +28 -0
- package/src/column-expression-input/column-function-descriptors.js +281 -0
- package/src/column-expression-input/column-language-parser/ColumnExpressionLanguage.js +18 -0
- package/src/column-expression-input/column-language-parser/ColumnExpressionTreeWalker.js +381 -0
- package/src/column-expression-input/column-language-parser/column-expression-parse-utils.js +56 -0
- package/src/column-expression-input/column-language-parser/index.js +3 -0
- package/src/column-expression-input/functionDocInfo.js +24 -0
- package/src/column-expression-input/highlighting.js +18 -0
- package/src/column-expression-input/index.js +4 -0
- package/src/column-expression-input/theme.js +57 -0
- package/src/column-expression-input/useColumnAutoComplete.js +307 -0
- package/src/column-expression-input/useColumnExpressionEditor.js +133 -0
- package/src/column-expression-input/useColumnExpressionSuggestionProvider.js +211 -0
- package/src/column-formatting-settings/BaseNumericFormattingSettings.js +96 -0
- package/src/column-formatting-settings/ColumnFormattingPanel.js +112 -0
- package/src/column-formatting-settings/DateTimeFormattingSettings.js +116 -0
- package/src/column-formatting-settings/LongTypeFormattingSettings.css.js +11 -0
- package/src/column-formatting-settings/LongTypeFormattingSettings.js +54 -0
- package/src/column-formatting-settings/index.js +3 -0
- package/src/column-menu/ColumnMenu.css.js +25 -0
- package/src/column-menu/ColumnMenu.js +69 -0
- package/src/column-menu/column-action-types.js +0 -0
- package/src/column-menu/column-menu-utils.js +318 -0
- package/src/column-menu/useColumnActions.js +77 -0
- package/src/column-picker/ColumnModel.js +113 -0
- package/src/column-picker/ColumnPicker.css.js +96 -0
- package/src/column-picker/ColumnPicker.js +204 -0
- package/src/column-picker/ColumnPickerAction.js +24 -0
- package/src/column-picker/useColumnPicker.js +42 -0
- package/src/column-picker/useTableColumnPicker.js +27 -0
- package/src/column-picker/useTableColumnPickerDeprecated.js +87 -0
- package/src/column-settings-panel/ColumnNameLabel.css.js +18 -0
- package/src/column-settings-panel/ColumnNameLabel.js +54 -0
- package/src/column-settings-panel/ColumnSettingsPanel.css.js +70 -0
- package/src/column-settings-panel/ColumnSettingsPanel.js +173 -0
- package/src/column-settings-panel/useColumnSettings.js +205 -0
- package/src/csv-upload/CsvUpload.css.js +28 -0
- package/src/csv-upload/CsvUpload.js +95 -0
- package/src/csv-upload/index.js +7 -0
- package/src/csv-upload/parse/csv-constants.js +3 -0
- package/src/csv-upload/parse/csv-errors.js +54 -0
- package/src/csv-upload/parse/csv-parse.js +79 -0
- package/src/csv-upload/parse/csv-schema-validation.js +45 -0
- package/src/csv-upload/parse/csv-upload-utils.js +59 -0
- package/src/csv-upload/parse/index.js +5 -0
- package/src/csv-upload/useCsvUpload.js +260 -0
- package/src/csv-upload/useCsvUploadSessionPreview.js +70 -0
- package/src/datasource-stats/DatasourceStats.css.js +56 -0
- package/src/datasource-stats/DatasourceStats.js +89 -0
- package/src/datasource-stats/useDatasourceStats.js +48 -0
- package/src/freeze-control/FreezeControl.css.js +108 -0
- package/src/freeze-control/FreezeControl.js +96 -0
- package/src/freeze-control/FrozenBanner.css.js +16 -0
- package/src/freeze-control/FrozenBanner.js +48 -0
- package/src/freeze-control/freezeControlBadge.js +9 -0
- package/src/freeze-control/useFreezeControl.js +68 -0
- package/src/index.js +22 -0
- package/src/tabbed-table-config-panel/TabbedTableConfigPanel.css.js +23 -0
- package/src/tabbed-table-config-panel/TabbedTableConfigPanel.js +99 -0
- package/src/tabbed-table-config-panel/TabbedTableSettingsAction.js +28 -0
- package/src/tabbed-table-config-panel/useTabbedTableConfigPanel.js +29 -0
- package/src/table-footer/TableFooter.css.js +22 -0
- package/src/table-footer/TableFooter.js +30 -0
- package/src/table-provider/TableProvider.js +33 -0
- package/src/table-settings-panel/TableSettingsPanel.css.js +70 -0
- package/src/table-settings-panel/TableSettingsPanel.js +128 -0
- package/src/table-settings-panel/useTableSettings.js +50 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useComponentCssInjection } from "@salt-ds/styles";
|
|
3
|
+
import { useWindow } from "@salt-ds/window";
|
|
4
|
+
import { DragDropProvider, getColumnLabel, isCalculatedColumn, useSortable } from "@vuu-ui/vuu-utils";
|
|
5
|
+
import clsx from "clsx";
|
|
6
|
+
import { forwardRef, useCallback, useMemo, useRef } from "react";
|
|
7
|
+
import { Button, Input, ListBox, Option } from "@salt-ds/core";
|
|
8
|
+
import { applyHighlighting } from "@vuu-ui/vuu-table";
|
|
9
|
+
import { Icon, IconButton } from "@vuu-ui/vuu-ui-controls";
|
|
10
|
+
import { ColumnChangeSource } from "./ColumnModel.js";
|
|
11
|
+
import { useColumnPicker } from "./useColumnPicker.js";
|
|
12
|
+
import ColumnPicker_0 from "./ColumnPicker.css";
|
|
13
|
+
const classBase = "vuuColumnPicker";
|
|
14
|
+
const classBaseListItem = "vuuColumnPickerListItem";
|
|
15
|
+
const searchIcon = /*#__PURE__*/ jsx("span", {
|
|
16
|
+
"data-icon": "search"
|
|
17
|
+
});
|
|
18
|
+
const NO_SELECTION = [];
|
|
19
|
+
const useSorting = (id, index)=>{
|
|
20
|
+
const { handleRef: sortableHandleRef, ref: sortableRef } = useSortable({
|
|
21
|
+
id,
|
|
22
|
+
index
|
|
23
|
+
});
|
|
24
|
+
const [handleRef, ref] = useMemo(()=>[
|
|
25
|
+
sortableHandleRef,
|
|
26
|
+
sortableRef
|
|
27
|
+
], [
|
|
28
|
+
sortableHandleRef,
|
|
29
|
+
sortableRef
|
|
30
|
+
]);
|
|
31
|
+
return {
|
|
32
|
+
handleRef,
|
|
33
|
+
ref
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
const SelectedColumnListItem = ({ className: classNameProp, index, column, onRemove, searchPattern = "", ...optionProps })=>{
|
|
37
|
+
const { handleRef, ref } = useSorting(column.name, index);
|
|
38
|
+
const value = getColumnLabel(column);
|
|
39
|
+
const valueWithHighlighting = applyHighlighting(value, searchPattern);
|
|
40
|
+
const handleRemoveButtonClick = useCallback((e)=>{
|
|
41
|
+
e.stopPropagation();
|
|
42
|
+
onRemove?.(e);
|
|
43
|
+
}, [
|
|
44
|
+
onRemove
|
|
45
|
+
]);
|
|
46
|
+
return /*#__PURE__*/ jsxs(Option, {
|
|
47
|
+
...optionProps,
|
|
48
|
+
className: clsx(classNameProp, classBaseListItem),
|
|
49
|
+
"data-name": column.name,
|
|
50
|
+
ref: ref,
|
|
51
|
+
children: [
|
|
52
|
+
/*#__PURE__*/ jsx(IconButton, {
|
|
53
|
+
"data-embedded": true,
|
|
54
|
+
appearance: "transparent",
|
|
55
|
+
icon: "draggable",
|
|
56
|
+
ref: handleRef,
|
|
57
|
+
size: 16
|
|
58
|
+
}),
|
|
59
|
+
isCalculatedColumn(column.name) ? /*#__PURE__*/ jsx(Icon, {
|
|
60
|
+
className: "vuuCalculatedColumnIcon",
|
|
61
|
+
name: "function"
|
|
62
|
+
}) : null,
|
|
63
|
+
/*#__PURE__*/ jsx("span", {
|
|
64
|
+
className: `${classBase}-text`,
|
|
65
|
+
children: valueWithHighlighting
|
|
66
|
+
}),
|
|
67
|
+
/*#__PURE__*/ jsx(IconButton, {
|
|
68
|
+
className: `${classBaseListItem}-action`,
|
|
69
|
+
"data-embedded": true,
|
|
70
|
+
appearance: "transparent",
|
|
71
|
+
icon: "cross",
|
|
72
|
+
onClick: handleRemoveButtonClick,
|
|
73
|
+
size: 16
|
|
74
|
+
})
|
|
75
|
+
]
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
const AvailableColumnListItem = ({ className: classNameProp, index, column: item, onAdd, searchPattern = "", ...optionProps })=>{
|
|
79
|
+
const value = getColumnLabel(item);
|
|
80
|
+
const valueWithHighlighting = applyHighlighting(value, searchPattern);
|
|
81
|
+
return /*#__PURE__*/ jsxs(Option, {
|
|
82
|
+
...optionProps,
|
|
83
|
+
className: clsx(classNameProp, classBaseListItem),
|
|
84
|
+
"data-name": item.name,
|
|
85
|
+
children: [
|
|
86
|
+
/*#__PURE__*/ jsx("span", {
|
|
87
|
+
className: `${classBase}-text`,
|
|
88
|
+
children: valueWithHighlighting
|
|
89
|
+
}),
|
|
90
|
+
/*#__PURE__*/ jsx(IconButton, {
|
|
91
|
+
className: `${classBaseListItem}-action`,
|
|
92
|
+
"data-embedded": true,
|
|
93
|
+
appearance: "transparent",
|
|
94
|
+
icon: "plus",
|
|
95
|
+
onClick: onAdd,
|
|
96
|
+
size: 16
|
|
97
|
+
})
|
|
98
|
+
]
|
|
99
|
+
});
|
|
100
|
+
};
|
|
101
|
+
const ColumnPicker_ColumnPicker = /*#__PURE__*/ forwardRef(function({ allowCreateCalculatedColumn, columnModel, className, onClickCreateCalculatedColumn, onSelectionChange, selected = NO_SELECTION, ...htmlAttributes }, forwardedRef) {
|
|
102
|
+
const targetWindow = useWindow();
|
|
103
|
+
useComponentCssInjection({
|
|
104
|
+
testId: "vuu-column-picker",
|
|
105
|
+
css: ColumnPicker_0,
|
|
106
|
+
window: targetWindow
|
|
107
|
+
});
|
|
108
|
+
const searchCallbackRef = useCallback((el)=>{
|
|
109
|
+
setTimeout(()=>{
|
|
110
|
+
el?.querySelector("input")?.focus();
|
|
111
|
+
}, 100);
|
|
112
|
+
}, []);
|
|
113
|
+
const { availableColumns, onAddItemToSelectedList, onChangeSearchInput, onRemoveItemFromSelectedList, searchText, selectedColumns } = useColumnPicker({
|
|
114
|
+
columnModel: columnModel
|
|
115
|
+
});
|
|
116
|
+
const listRef = useRef(null);
|
|
117
|
+
const getOptionName = (option)=>{
|
|
118
|
+
if (option) {
|
|
119
|
+
const { name } = option.dataset;
|
|
120
|
+
if (name) return name;
|
|
121
|
+
}
|
|
122
|
+
throw Error("[ColumnPicker] list option has no data-name");
|
|
123
|
+
};
|
|
124
|
+
const handleDragEnd = useCallback(()=>{
|
|
125
|
+
setTimeout(()=>{
|
|
126
|
+
const listItems = listRef.current?.querySelectorAll(".saltOption");
|
|
127
|
+
if (listItems) {
|
|
128
|
+
const orderedColumnNames = Array.from(listItems).map(getOptionName);
|
|
129
|
+
columnModel.reorderSelectedColumns(orderedColumnNames, ColumnChangeSource.ColumnPicker);
|
|
130
|
+
}
|
|
131
|
+
}, 300);
|
|
132
|
+
}, [
|
|
133
|
+
columnModel
|
|
134
|
+
]);
|
|
135
|
+
const oneOrMoreColumnsIsCalculated = selectedColumns.some((column)=>isCalculatedColumn(column.name));
|
|
136
|
+
return /*#__PURE__*/ jsxs("div", {
|
|
137
|
+
...htmlAttributes,
|
|
138
|
+
className: clsx(classBase, className, {
|
|
139
|
+
[`${classBase}-withCalculated`]: oneOrMoreColumnsIsCalculated
|
|
140
|
+
}),
|
|
141
|
+
ref: forwardedRef,
|
|
142
|
+
children: [
|
|
143
|
+
/*#__PURE__*/ jsx("form", {
|
|
144
|
+
className: `${classBase}-search`,
|
|
145
|
+
role: "search",
|
|
146
|
+
children: /*#__PURE__*/ jsx(Input, {
|
|
147
|
+
startAdornment: searchIcon,
|
|
148
|
+
placeholder: "Find column",
|
|
149
|
+
ref: searchCallbackRef,
|
|
150
|
+
value: searchText,
|
|
151
|
+
onChange: onChangeSearchInput
|
|
152
|
+
})
|
|
153
|
+
}),
|
|
154
|
+
/*#__PURE__*/ jsxs("div", {
|
|
155
|
+
className: `${classBase}-scrollContainer vuuScrollable`,
|
|
156
|
+
children: [
|
|
157
|
+
/*#__PURE__*/ jsx("div", {
|
|
158
|
+
className: `${classBase}-sectionHeader`,
|
|
159
|
+
children: "Columns in view"
|
|
160
|
+
}),
|
|
161
|
+
/*#__PURE__*/ jsx(DragDropProvider, {
|
|
162
|
+
onDragEnd: handleDragEnd,
|
|
163
|
+
children: /*#__PURE__*/ jsx(ListBox, {
|
|
164
|
+
className: `${classBase}-selectedList`,
|
|
165
|
+
onSelectionChange: onSelectionChange,
|
|
166
|
+
ref: listRef,
|
|
167
|
+
selected: selected,
|
|
168
|
+
children: selectedColumns.map((column, index)=>/*#__PURE__*/ jsx(SelectedColumnListItem, {
|
|
169
|
+
column: column,
|
|
170
|
+
index: index,
|
|
171
|
+
onRemove: onRemoveItemFromSelectedList,
|
|
172
|
+
searchPattern: searchText.toLowerCase(),
|
|
173
|
+
value: column
|
|
174
|
+
}, column.name))
|
|
175
|
+
})
|
|
176
|
+
}),
|
|
177
|
+
/*#__PURE__*/ jsx("div", {
|
|
178
|
+
className: clsx(`${classBase}-sectionHeader`, `${classBase}-availableHeader`),
|
|
179
|
+
children: "Available columns"
|
|
180
|
+
}),
|
|
181
|
+
/*#__PURE__*/ jsx(ListBox, {
|
|
182
|
+
className: `${classBase}-availableList`,
|
|
183
|
+
selected: NO_SELECTION,
|
|
184
|
+
children: availableColumns.map((column, index)=>/*#__PURE__*/ jsx(AvailableColumnListItem, {
|
|
185
|
+
column: column,
|
|
186
|
+
index: index,
|
|
187
|
+
onAdd: onAddItemToSelectedList,
|
|
188
|
+
searchPattern: searchText.toLowerCase(),
|
|
189
|
+
value: column
|
|
190
|
+
}, column.name))
|
|
191
|
+
})
|
|
192
|
+
]
|
|
193
|
+
}),
|
|
194
|
+
allowCreateCalculatedColumn ? /*#__PURE__*/ jsx("div", {
|
|
195
|
+
className: `${classBase}-column-buttons`,
|
|
196
|
+
children: /*#__PURE__*/ jsx(Button, {
|
|
197
|
+
onClick: onClickCreateCalculatedColumn,
|
|
198
|
+
children: "Create calculated column"
|
|
199
|
+
})
|
|
200
|
+
}) : null
|
|
201
|
+
]
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
export { ColumnPicker_ColumnPicker as ColumnPicker, classBaseListItem };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { IconButton } from "@vuu-ui/vuu-ui-controls";
|
|
3
|
+
import { useCallback } from "react";
|
|
4
|
+
import { useTableColumnPicker } from "./useTableColumnPicker.js";
|
|
5
|
+
const ColumnPickerAction = ({ appearance = "transparent", columnModel, icon = "settings", sentiment = "neutral", ...IconButtonProps })=>{
|
|
6
|
+
const { showColumnPicker } = useTableColumnPicker({
|
|
7
|
+
columnModel
|
|
8
|
+
});
|
|
9
|
+
const handleClick = useCallback(()=>{
|
|
10
|
+
showColumnPicker();
|
|
11
|
+
}, [
|
|
12
|
+
showColumnPicker
|
|
13
|
+
]);
|
|
14
|
+
return /*#__PURE__*/ jsx(IconButton, {
|
|
15
|
+
...IconButtonProps,
|
|
16
|
+
appearance: appearance,
|
|
17
|
+
"data-action": "table-settings",
|
|
18
|
+
icon: icon,
|
|
19
|
+
onClick: handleClick,
|
|
20
|
+
sentiment: sentiment,
|
|
21
|
+
size: 20
|
|
22
|
+
});
|
|
23
|
+
};
|
|
24
|
+
export { ColumnPickerAction };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { queryClosest } from "@vuu-ui/vuu-utils";
|
|
2
|
+
import { useCallback, useEffect, useState } from "react";
|
|
3
|
+
import { ColumnChangeSource } from "./ColumnModel.js";
|
|
4
|
+
const SOURCE = ColumnChangeSource.ColumnPicker;
|
|
5
|
+
const columnName = (target)=>{
|
|
6
|
+
const listItem = queryClosest(target, ".saltOption", true);
|
|
7
|
+
const { name } = listItem.dataset;
|
|
8
|
+
if (name) return name;
|
|
9
|
+
throw Error("[useColumnPicker] column name could not be identified, data-name attribute not found");
|
|
10
|
+
};
|
|
11
|
+
const useColumnPicker = ({ columnModel: model })=>{
|
|
12
|
+
const [, forceRender] = useState({});
|
|
13
|
+
useEffect(()=>{
|
|
14
|
+
model.on("render", forceRender);
|
|
15
|
+
return ()=>{
|
|
16
|
+
model.removeListener("render", forceRender);
|
|
17
|
+
};
|
|
18
|
+
}, [
|
|
19
|
+
model
|
|
20
|
+
]);
|
|
21
|
+
const handleChangeSearchInput = useCallback((evt)=>{
|
|
22
|
+
const { value } = evt.target;
|
|
23
|
+
model.searchPattern = value;
|
|
24
|
+
}, [
|
|
25
|
+
model
|
|
26
|
+
]);
|
|
27
|
+
const handleAddItemToSelectedList = useCallback((e)=>model.addItemToSelectedColumns(columnName(e.target), SOURCE), [
|
|
28
|
+
model
|
|
29
|
+
]);
|
|
30
|
+
const handleRemoveItemFromSelectedList = useCallback((e)=>model.removeItemFromSelectedColumns(columnName(e.target), SOURCE), [
|
|
31
|
+
model
|
|
32
|
+
]);
|
|
33
|
+
return {
|
|
34
|
+
availableColumns: model.availableColumns,
|
|
35
|
+
onAddItemToSelectedList: handleAddItemToSelectedList,
|
|
36
|
+
onRemoveItemFromSelectedList: handleRemoveItemFromSelectedList,
|
|
37
|
+
onChangeSearchInput: handleChangeSearchInput,
|
|
38
|
+
searchText: model.searchPattern,
|
|
39
|
+
selectedColumns: model.selectedColumns
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
export { useColumnPicker };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useContextPanel, useHideContextPanel } from "@vuu-ui/vuu-ui-controls";
|
|
3
|
+
import { useCallback, useEffect, useRef } from "react";
|
|
4
|
+
import { ColumnPicker } from "./ColumnPicker.js";
|
|
5
|
+
const useTableColumnPicker = ({ columnModel })=>{
|
|
6
|
+
const showContextPanel = useContextPanel();
|
|
7
|
+
const hideContextPanel = useHideContextPanel();
|
|
8
|
+
const contextPanelShowing = useRef(false);
|
|
9
|
+
const showColumnPicker = useCallback((title = "Column Picker")=>{
|
|
10
|
+
contextPanelShowing.current = true;
|
|
11
|
+
showContextPanel(/*#__PURE__*/ jsx(ColumnPicker, {
|
|
12
|
+
columnModel: columnModel
|
|
13
|
+
}), title);
|
|
14
|
+
}, [
|
|
15
|
+
columnModel,
|
|
16
|
+
showContextPanel
|
|
17
|
+
]);
|
|
18
|
+
useEffect(()=>()=>{
|
|
19
|
+
if (contextPanelShowing.current) hideContextPanel?.();
|
|
20
|
+
}, [
|
|
21
|
+
hideContextPanel
|
|
22
|
+
]);
|
|
23
|
+
return {
|
|
24
|
+
showColumnPicker
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
export { useTableColumnPicker };
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { ColumnChangeSource, ColumnModel, ColumnPicker, isColumnAdded, isColumnRemoved, isColumnsReordered } from "../index.js";
|
|
3
|
+
import { useContextPanel, useHideContextPanel } from "@vuu-ui/vuu-ui-controls";
|
|
4
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
5
|
+
const useTableColumnPickerDeprecated = ({ availableColumns, dataSource, onTableColumnChange, selectedColumns: initialSelectedColumns })=>{
|
|
6
|
+
const showContextPanel = useContextPanel();
|
|
7
|
+
const hideContextPanel = useHideContextPanel();
|
|
8
|
+
const contextPanelShowing = useRef(false);
|
|
9
|
+
const [selectedColumns, setSelectedColumns] = useState(initialSelectedColumns);
|
|
10
|
+
const columnModel = useMemo(()=>{
|
|
11
|
+
const available = availableColumns;
|
|
12
|
+
const selected = initialSelectedColumns;
|
|
13
|
+
return new ColumnModel(available, selected);
|
|
14
|
+
}, [
|
|
15
|
+
initialSelectedColumns,
|
|
16
|
+
availableColumns
|
|
17
|
+
]);
|
|
18
|
+
const handleTableConfigChange = useCallback((_config, configChangeType)=>{
|
|
19
|
+
if (configChangeType?.type === "column-removed") {
|
|
20
|
+
columnModel.removeItemFromSelectedColumns(configChangeType.column.name, ColumnChangeSource.Table);
|
|
21
|
+
const idx = dataSource.columns.findIndex((col)=>col === configChangeType?.column.name);
|
|
22
|
+
if (idx >= 0) dataSource.columns = dataSource.columns.toSpliced(idx, 1);
|
|
23
|
+
setSelectedColumns((columns)=>columns.filter((col)=>col.name !== configChangeType.column.name));
|
|
24
|
+
}
|
|
25
|
+
}, [
|
|
26
|
+
columnModel,
|
|
27
|
+
dataSource
|
|
28
|
+
]);
|
|
29
|
+
const handleChangeTableColumns = useCallback((columns, changeSource, changeDescriptor)=>{
|
|
30
|
+
if (changeSource === ColumnChangeSource.ColumnPicker) {
|
|
31
|
+
if (isColumnAdded(changeDescriptor)) dataSource.columns = dataSource.columns.concat(changeDescriptor.column.name);
|
|
32
|
+
if (isColumnRemoved(changeDescriptor)) {
|
|
33
|
+
const idx = dataSource.columns.findIndex((col)=>col === changeDescriptor?.column.name);
|
|
34
|
+
if (idx >= 0) dataSource.columns = dataSource.columns.toSpliced(idx, 1);
|
|
35
|
+
}
|
|
36
|
+
setSelectedColumns((columns)=>{
|
|
37
|
+
const getNewColumns = ()=>{
|
|
38
|
+
if (isColumnAdded(changeDescriptor)) return columns.concat(changeDescriptor.column);
|
|
39
|
+
if (isColumnRemoved(changeDescriptor)) return columns.filter((col)=>col.name !== changeDescriptor.column.name);
|
|
40
|
+
if (isColumnsReordered(changeDescriptor)) {
|
|
41
|
+
const unMatched = columns.filter((configColumn)=>!columns.some((col)=>col.name === configColumn.name));
|
|
42
|
+
return [
|
|
43
|
+
...columns,
|
|
44
|
+
...unMatched
|
|
45
|
+
];
|
|
46
|
+
}
|
|
47
|
+
return columns;
|
|
48
|
+
};
|
|
49
|
+
const newColumns = getNewColumns();
|
|
50
|
+
onTableColumnChange?.(newColumns, changeDescriptor);
|
|
51
|
+
return newColumns;
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}, [
|
|
55
|
+
dataSource,
|
|
56
|
+
onTableColumnChange
|
|
57
|
+
]);
|
|
58
|
+
useEffect(()=>{
|
|
59
|
+
columnModel.on("change", handleChangeTableColumns);
|
|
60
|
+
return ()=>{
|
|
61
|
+
columnModel.removeListener("change", handleChangeTableColumns);
|
|
62
|
+
};
|
|
63
|
+
}, [
|
|
64
|
+
columnModel,
|
|
65
|
+
handleChangeTableColumns
|
|
66
|
+
]);
|
|
67
|
+
const showColumnPicker = useCallback((title = "Column Picker")=>{
|
|
68
|
+
contextPanelShowing.current = true;
|
|
69
|
+
showContextPanel(/*#__PURE__*/ jsx(ColumnPicker, {
|
|
70
|
+
columnModel: columnModel
|
|
71
|
+
}), title);
|
|
72
|
+
}, [
|
|
73
|
+
columnModel,
|
|
74
|
+
showContextPanel
|
|
75
|
+
]);
|
|
76
|
+
useEffect(()=>()=>{
|
|
77
|
+
if (contextPanelShowing.current) hideContextPanel?.();
|
|
78
|
+
}, [
|
|
79
|
+
hideContextPanel
|
|
80
|
+
]);
|
|
81
|
+
return {
|
|
82
|
+
onTableConfigChange: handleTableConfigChange,
|
|
83
|
+
showColumnPicker,
|
|
84
|
+
selectedColumns
|
|
85
|
+
};
|
|
86
|
+
};
|
|
87
|
+
export { useTableColumnPickerDeprecated };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const css = `
|
|
2
|
+
.vuuColumnNameLabel-calculated {
|
|
3
|
+
cursor: pointer;
|
|
4
|
+
gap: 2px;
|
|
5
|
+
display: flex;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.vuuColumnNameLabel-edit {
|
|
9
|
+
margin-left: auto;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.vuuColumnNameLabel-placeholder {
|
|
13
|
+
color: var(--vuu-color-gray-35);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
`;
|
|
18
|
+
export default css;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import clsx from "clsx";
|
|
3
|
+
import { useComponentCssInjection } from "@salt-ds/styles";
|
|
4
|
+
import { useWindow } from "@salt-ds/window";
|
|
5
|
+
import { getCalculatedColumnDetails, isCalculatedColumn } from "@vuu-ui/vuu-utils";
|
|
6
|
+
import ColumnNameLabel from "./ColumnNameLabel.css";
|
|
7
|
+
const classBase = "vuuColumnNameLabel";
|
|
8
|
+
const ColumnNameLabel_ColumnNameLabel = ({ column, onClick })=>{
|
|
9
|
+
const targetWindow = useWindow();
|
|
10
|
+
useComponentCssInjection({
|
|
11
|
+
testId: "vuu-column-label",
|
|
12
|
+
css: ColumnNameLabel,
|
|
13
|
+
window: targetWindow
|
|
14
|
+
});
|
|
15
|
+
if (!isCalculatedColumn(column.name)) return /*#__PURE__*/ jsx("div", {
|
|
16
|
+
className: classBase,
|
|
17
|
+
children: column.name
|
|
18
|
+
});
|
|
19
|
+
{
|
|
20
|
+
const { name, serverDataType, expression } = getCalculatedColumnDetails(column);
|
|
21
|
+
const displayName = name || "name";
|
|
22
|
+
const displayExpression = "=expression";
|
|
23
|
+
const nameClass = "name" === displayName ? `${classBase}-placeholder` : void 0;
|
|
24
|
+
const expressionClass = "" === expression ? `${classBase}-placeholder` : void 0;
|
|
25
|
+
return /*#__PURE__*/ jsxs("div", {
|
|
26
|
+
className: clsx(classBase, `${classBase}-calculated`),
|
|
27
|
+
onClick: onClick,
|
|
28
|
+
children: [
|
|
29
|
+
/*#__PURE__*/ jsx("span", {
|
|
30
|
+
className: nameClass,
|
|
31
|
+
children: displayName
|
|
32
|
+
}),
|
|
33
|
+
/*#__PURE__*/ jsx("span", {
|
|
34
|
+
children: ":"
|
|
35
|
+
}),
|
|
36
|
+
/*#__PURE__*/ jsx("span", {
|
|
37
|
+
children: serverDataType || "string"
|
|
38
|
+
}),
|
|
39
|
+
/*#__PURE__*/ jsx("span", {
|
|
40
|
+
children: ":"
|
|
41
|
+
}),
|
|
42
|
+
/*#__PURE__*/ jsx("span", {
|
|
43
|
+
className: expressionClass,
|
|
44
|
+
children: displayExpression
|
|
45
|
+
}),
|
|
46
|
+
/*#__PURE__*/ jsx("span", {
|
|
47
|
+
className: `${classBase}-edit`,
|
|
48
|
+
"data-icon": "edit"
|
|
49
|
+
})
|
|
50
|
+
]
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
export { ColumnNameLabel_ColumnNameLabel as ColumnNameLabel };
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
const css = `
|
|
2
|
+
.vuuColumnSettingsPanel {
|
|
3
|
+
--vuu-svg-align-left: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"><path d=\"M9.33333 10H2.66667C2.3 10 2 10.3 2 10.6667C2 11.0333 2.3 11.3333 2.66667 11.3333H9.33333C9.7 11.3333 10 11.0333 10 10.6667C10 10.3 9.7 10 9.33333 10ZM9.33333 4.66667H2.66667C2.3 4.66667 2 4.96667 2 5.33333C2 5.7 2.3 6 2.66667 6H9.33333C9.7 6 10 5.7 10 5.33333C10 4.96667 9.7 4.66667 9.33333 4.66667ZM2.66667 8.66667H13.3333C13.7 8.66667 14 8.36667 14 8C14 7.63333 13.7 7.33333 13.3333 7.33333H2.66667C2.3 7.33333 2 7.63333 2 8C2 8.36667 2.3 8.66667 2.66667 8.66667ZM2.66667 14H13.3333C13.7 14 14 13.7 14 13.3333C14 12.9667 13.7 12.6667 13.3333 12.6667H2.66667C2.3 12.6667 2 12.9667 2 13.3333C2 13.7 2.3 14 2.66667 14ZM2 2.66667C2 3.03333 2.3 3.33333 2.66667 3.33333H13.3333C13.7 3.33333 14 3.03333 14 2.66667C14 2.3 13.7 2 13.3333 2H2.66667C2.3 2 2 2.3 2 2.66667Z\" /></svg>");
|
|
4
|
+
--vuu-svg-align-right: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"><path d=\"M2.66667 14H13.3333C13.7 14 14 13.7 14 13.3333C14 12.9667 13.7 12.6667 13.3333 12.6667H2.66667C2.3 12.6667 2 12.9667 2 13.3333C2 13.7 2.3 14 2.66667 14ZM6.66667 11.3333H13.3333C13.7 11.3333 14 11.0333 14 10.6667C14 10.3 13.7 10 13.3333 10H6.66667C6.3 10 6 10.3 6 10.6667C6 11.0333 6.3 11.3333 6.66667 11.3333ZM2.66667 8.66667H13.3333C13.7 8.66667 14 8.36667 14 8C14 7.63333 13.7 7.33333 13.3333 7.33333H2.66667C2.3 7.33333 2 7.63333 2 8C2 8.36667 2.3 8.66667 2.66667 8.66667ZM6.66667 6H13.3333C13.7 6 14 5.7 14 5.33333C14 4.96667 13.7 4.66667 13.3333 4.66667H6.66667C6.3 4.66667 6 4.96667 6 5.33333C6 5.7 6.3 6 6.66667 6ZM2 2.66667C2 3.03333 2.3 3.33333 2.66667 3.33333H13.3333C13.7 3.33333 14 3.03333 14 2.66667C14 2.3 13.7 2 13.3333 2H2.66667C2.3 2 2 2.3 2 2.66667Z\" /></svg>");
|
|
5
|
+
--vuu-svg-pin-left: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"><path d=\"M7.33333 9.86V8.66666H13.3333C13.7 8.66666 14 8.36666 14 8C14 7.63333 13.7 7.33333 13.3333 7.33333L7.33333 7.33333V6.14C7.33333 5.84 6.97333 5.69333 6.76667 5.90666L4.90667 7.76666C4.77333 7.89999 4.77333 8.10666 4.90667 8.24L6.76667 10.1C6.97333 10.3067 7.33333 10.16 7.33333 9.86ZM2.66667 13.3333C3.03333 13.3333 3.33333 13.0333 3.33333 12.6667L3.33333 3.33333C3.33333 2.96666 3.03333 2.66666 2.66667 2.66666C2.3 2.66666 2 2.96666 2 3.33333L2 12.6667C2 13.0333 2.3 13.3333 2.66667 13.3333Z\" /></svg>");
|
|
6
|
+
--vuu-svg-pin-float: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"><path d=\"M6 4.66667H4.66667V6H6V4.66667ZM6 7.33333H4.66667V8.66667H6V7.33333ZM6 2C5.26 2 4.66667 2.6 4.66667 3.33333H6V2ZM8.66667 10H7.33333V11.3333H8.66667V10ZM12.6667 2V3.33333H14C14 2.6 13.4 2 12.6667 2ZM8.66667 2H7.33333V3.33333H8.66667V2ZM6 11.3333V10H4.66667C4.66667 10.7333 5.26 11.3333 6 11.3333ZM12.6667 8.66667H14V7.33333H12.6667V8.66667ZM12.6667 6H14V4.66667H12.6667V6ZM12.6667 11.3333C13.4 11.3333 14 10.7333 14 10H12.6667V11.3333ZM2.66667 4.66667C2.3 4.66667 2 4.96667 2 5.33333V12.6667C2 13.4 2.6 14 3.33333 14H10.6667C11.0333 14 11.3333 13.7 11.3333 13.3333C11.3333 12.9667 11.0333 12.6667 10.6667 12.6667H4C3.63333 12.6667 3.33333 12.3667 3.33333 12V5.33333C3.33333 4.96667 3.03333 4.66667 2.66667 4.66667ZM10 3.33333H11.3333V2H10V3.33333ZM10 11.3333H11.3333V10H10V11.3333Z\" /></svg>");
|
|
7
|
+
--vuu-svg-pin-right: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"><path d=\"M8.66667 6.14V7.33333H2.66667C2.3 7.33333 2 7.63333 2 8C2 8.36666 2.3 8.66666 2.66667 8.66666H8.66667V9.86C8.66667 10.16 9.02667 10.3067 9.23333 10.0933L11.0933 8.23333C11.2267 8.1 11.2267 7.89333 11.0933 7.76L9.23333 5.9C9.02667 5.69333 8.66667 5.84 8.66667 6.14ZM13.3333 13.3333C13.7 13.3333 14 13.0333 14 12.6667V3.33333C14 2.96666 13.7 2.66666 13.3333 2.66666C12.9667 2.66666 12.6667 2.96666 12.6667 3.33333V12.6667C12.6667 13.0333 12.9667 13.3333 13.3333 13.3333Z\"/></svg>");
|
|
8
|
+
--vuuDropdown-height: 24px;
|
|
9
|
+
--vuuDropdown-width: 100%;
|
|
10
|
+
flex-direction: column;
|
|
11
|
+
gap: 24px;
|
|
12
|
+
height: 100%;
|
|
13
|
+
display: flex;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.vuuColumnSettingsPanel-header {
|
|
17
|
+
padding: 24px 2px 0;
|
|
18
|
+
font-size: 14px;
|
|
19
|
+
font-weight: 600;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.vuuColumnSettingsPanel-buttonBar {
|
|
23
|
+
justify-content: space-between;
|
|
24
|
+
align-items: center;
|
|
25
|
+
margin-top: auto;
|
|
26
|
+
display: flex;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.vuuColumnSettingsPanel-buttonBar[data-align="right"] {
|
|
30
|
+
justify-content: flex-end;
|
|
31
|
+
gap: 6px;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.vuuColumnSettingsPanel-buttonNavPrev {
|
|
35
|
+
--vuu-icon-left: 6px;
|
|
36
|
+
padding-left: 24px;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.vuuColumnSettingsPanel-buttonNavNext {
|
|
40
|
+
--vuu-icon-left: calc(100% - 18px);
|
|
41
|
+
padding-right: 24px;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
[data-icon="align-left"] {
|
|
45
|
+
--vuu-icon-svg: var(--vuu-svg-align-left);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
[data-icon="align-right"] {
|
|
49
|
+
--vuu-icon-svg: var(--vuu-svg-align-right);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
[data-icon="pin-left"] {
|
|
53
|
+
--vuu-icon-svg: var(--vuu-svg-pin-left);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
[data-icon="pin-float"] {
|
|
57
|
+
--vuu-icon-svg: var(--vuu-svg-pin-float);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
[data-icon="pin-right"] {
|
|
61
|
+
--vuu-icon-svg: var(--vuu-svg-pin-right);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.vuuColumnSettingsPanel-editing .vuuColumnNameLabel-edit {
|
|
65
|
+
display: none;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
`;
|
|
70
|
+
export default css;
|