@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.
Files changed (96) hide show
  1. package/package.json +13 -14
  2. package/src/calculated-column/CalculatedColumnPanel.js +95 -0
  3. package/src/calculated-column/useCalculatedColumnPanel.js +60 -0
  4. package/src/calculated-column/useEditCalculatedColumn.js +104 -0
  5. package/src/cell-edit-validators/CaseValidator.js +21 -0
  6. package/src/cell-edit-validators/PatternValidator.js +23 -0
  7. package/src/cell-edit-validators/index.js +2 -0
  8. package/src/cell-renderers/background-cell/BackgroundCell.css.js +103 -0
  9. package/src/cell-renderers/background-cell/BackgroundCell.js +76 -0
  10. package/src/cell-renderers/background-cell/BackgroundCellConfigurationEditor.css.js +9 -0
  11. package/src/cell-renderers/background-cell/BackgroundCellConfigurationEditor.js +71 -0
  12. package/src/cell-renderers/background-cell/BackgroundKeyframes.css.js +187 -0
  13. package/src/cell-renderers/background-cell/index.js +2 -0
  14. package/src/cell-renderers/background-cell/useDirection.js +25 -0
  15. package/src/cell-renderers/button-cell/IconButtonCell.css.js +23 -0
  16. package/src/cell-renderers/button-cell/IconButtonCell.js +33 -0
  17. package/src/cell-renderers/dropdown-cell/DropdownCell.css.js +36 -0
  18. package/src/cell-renderers/dropdown-cell/DropdownCell.js +84 -0
  19. package/src/cell-renderers/dropdown-cell/index.js +1 -0
  20. package/src/cell-renderers/index.js +6 -0
  21. package/src/cell-renderers/lookup-cell/LookupCell.js +15 -0
  22. package/src/cell-renderers/lookup-cell/index.js +1 -0
  23. package/src/cell-renderers/pct-progress-cell/PctProgressCell.css.js +31 -0
  24. package/src/cell-renderers/pct-progress-cell/PctProgressCell.js +49 -0
  25. package/src/cell-renderers/pct-progress-cell/index.js +1 -0
  26. package/src/cell-renderers/progress-cell/ProgressCell.css.js +43 -0
  27. package/src/cell-renderers/progress-cell/ProgressCell.js +74 -0
  28. package/src/cell-renderers/progress-cell/index.js +1 -0
  29. package/src/column-expression-input/ColumnExpressionInput.css.js +94 -0
  30. package/src/column-expression-input/ColumnExpressionInput.js +28 -0
  31. package/src/column-expression-input/column-function-descriptors.js +281 -0
  32. package/src/column-expression-input/column-language-parser/ColumnExpressionLanguage.js +18 -0
  33. package/src/column-expression-input/column-language-parser/ColumnExpressionTreeWalker.js +381 -0
  34. package/src/column-expression-input/column-language-parser/column-expression-parse-utils.js +56 -0
  35. package/src/column-expression-input/column-language-parser/index.js +3 -0
  36. package/src/column-expression-input/functionDocInfo.js +24 -0
  37. package/src/column-expression-input/highlighting.js +18 -0
  38. package/src/column-expression-input/index.js +4 -0
  39. package/src/column-expression-input/theme.js +57 -0
  40. package/src/column-expression-input/useColumnAutoComplete.js +307 -0
  41. package/src/column-expression-input/useColumnExpressionEditor.js +133 -0
  42. package/src/column-expression-input/useColumnExpressionSuggestionProvider.js +211 -0
  43. package/src/column-formatting-settings/BaseNumericFormattingSettings.js +96 -0
  44. package/src/column-formatting-settings/ColumnFormattingPanel.js +112 -0
  45. package/src/column-formatting-settings/DateTimeFormattingSettings.js +116 -0
  46. package/src/column-formatting-settings/LongTypeFormattingSettings.css.js +11 -0
  47. package/src/column-formatting-settings/LongTypeFormattingSettings.js +54 -0
  48. package/src/column-formatting-settings/index.js +3 -0
  49. package/src/column-menu/ColumnMenu.css.js +25 -0
  50. package/src/column-menu/ColumnMenu.js +69 -0
  51. package/src/column-menu/column-action-types.js +0 -0
  52. package/src/column-menu/column-menu-utils.js +318 -0
  53. package/src/column-menu/useColumnActions.js +77 -0
  54. package/src/column-picker/ColumnModel.js +113 -0
  55. package/src/column-picker/ColumnPicker.css.js +96 -0
  56. package/src/column-picker/ColumnPicker.js +204 -0
  57. package/src/column-picker/ColumnPickerAction.js +24 -0
  58. package/src/column-picker/useColumnPicker.js +42 -0
  59. package/src/column-picker/useTableColumnPicker.js +27 -0
  60. package/src/column-picker/useTableColumnPickerDeprecated.js +87 -0
  61. package/src/column-settings-panel/ColumnNameLabel.css.js +18 -0
  62. package/src/column-settings-panel/ColumnNameLabel.js +54 -0
  63. package/src/column-settings-panel/ColumnSettingsPanel.css.js +70 -0
  64. package/src/column-settings-panel/ColumnSettingsPanel.js +173 -0
  65. package/src/column-settings-panel/useColumnSettings.js +205 -0
  66. package/src/csv-upload/CsvUpload.css.js +28 -0
  67. package/src/csv-upload/CsvUpload.js +95 -0
  68. package/src/csv-upload/index.js +7 -0
  69. package/src/csv-upload/parse/csv-constants.js +3 -0
  70. package/src/csv-upload/parse/csv-errors.js +54 -0
  71. package/src/csv-upload/parse/csv-parse.js +79 -0
  72. package/src/csv-upload/parse/csv-schema-validation.js +45 -0
  73. package/src/csv-upload/parse/csv-upload-utils.js +59 -0
  74. package/src/csv-upload/parse/index.js +5 -0
  75. package/src/csv-upload/useCsvUpload.js +260 -0
  76. package/src/csv-upload/useCsvUploadSessionPreview.js +70 -0
  77. package/src/datasource-stats/DatasourceStats.css.js +56 -0
  78. package/src/datasource-stats/DatasourceStats.js +89 -0
  79. package/src/datasource-stats/useDatasourceStats.js +48 -0
  80. package/src/freeze-control/FreezeControl.css.js +108 -0
  81. package/src/freeze-control/FreezeControl.js +96 -0
  82. package/src/freeze-control/FrozenBanner.css.js +16 -0
  83. package/src/freeze-control/FrozenBanner.js +48 -0
  84. package/src/freeze-control/freezeControlBadge.js +9 -0
  85. package/src/freeze-control/useFreezeControl.js +68 -0
  86. package/src/index.js +22 -0
  87. package/src/tabbed-table-config-panel/TabbedTableConfigPanel.css.js +23 -0
  88. package/src/tabbed-table-config-panel/TabbedTableConfigPanel.js +99 -0
  89. package/src/tabbed-table-config-panel/TabbedTableSettingsAction.js +28 -0
  90. package/src/tabbed-table-config-panel/useTabbedTableConfigPanel.js +29 -0
  91. package/src/table-footer/TableFooter.css.js +22 -0
  92. package/src/table-footer/TableFooter.js +30 -0
  93. package/src/table-provider/TableProvider.js +33 -0
  94. package/src/table-settings-panel/TableSettingsPanel.css.js +70 -0
  95. package/src/table-settings-panel/TableSettingsPanel.js +128 -0
  96. package/src/table-settings-panel/useTableSettings.js +50 -0
@@ -0,0 +1,96 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { FormField, FormFieldLabel, Input, Switch } from "@salt-ds/core";
3
+ import { getTypeFormattingFromColumn } from "@vuu-ui/vuu-utils";
4
+ import { useCallback, useState } from "react";
5
+ const classBase = "vuuFormattingSettings";
6
+ const BaseNumericFormattingSettings = ({ column, onChangeFormatting: onChange })=>{
7
+ const [formattingSettings, setFormattingSettings] = useState(getTypeFormattingFromColumn(column));
8
+ const handleInputKeyDown = useCallback((evt)=>{
9
+ if ("Enter" === evt.key || "Tab" === evt.key) onChange(formattingSettings);
10
+ }, [
11
+ formattingSettings,
12
+ onChange
13
+ ]);
14
+ const handleChangeDecimals = useCallback((evt)=>{
15
+ const { value } = evt.target;
16
+ const numericValue = "" === value ? void 0 : isNaN(parseInt(value)) ? void 0 : parseInt(value);
17
+ const newFormattingSettings = {
18
+ ...formattingSettings,
19
+ decimals: numericValue
20
+ };
21
+ setFormattingSettings(newFormattingSettings);
22
+ }, [
23
+ formattingSettings
24
+ ]);
25
+ const handleChangeAlignDecimals = useCallback((evt)=>{
26
+ const { checked } = evt.target;
27
+ const newFormattingSettings = {
28
+ ...formattingSettings,
29
+ alignOnDecimals: checked
30
+ };
31
+ setFormattingSettings(newFormattingSettings);
32
+ onChange(newFormattingSettings);
33
+ }, [
34
+ formattingSettings,
35
+ onChange
36
+ ]);
37
+ const handleChangeZeroPad = useCallback((evt)=>{
38
+ const { checked } = evt.target;
39
+ const newFormattingSettings = {
40
+ ...formattingSettings,
41
+ zeroPad: checked
42
+ };
43
+ setFormattingSettings(newFormattingSettings);
44
+ onChange(newFormattingSettings);
45
+ }, [
46
+ formattingSettings,
47
+ onChange
48
+ ]);
49
+ return /*#__PURE__*/ jsxs("div", {
50
+ className: classBase,
51
+ children: [
52
+ /*#__PURE__*/ jsxs(FormField, {
53
+ "data-field": "decimals",
54
+ children: [
55
+ /*#__PURE__*/ jsx(FormFieldLabel, {
56
+ children: "Number of decimals"
57
+ }),
58
+ /*#__PURE__*/ jsx(Input, {
59
+ bordered: true,
60
+ className: "vuuInput",
61
+ onChange: handleChangeDecimals,
62
+ onKeyDown: handleInputKeyDown,
63
+ value: formattingSettings.decimals ?? ""
64
+ })
65
+ ]
66
+ }),
67
+ /*#__PURE__*/ jsxs(FormField, {
68
+ labelPlacement: "left",
69
+ children: [
70
+ /*#__PURE__*/ jsx(FormFieldLabel, {
71
+ children: "Align on decimals"
72
+ }),
73
+ /*#__PURE__*/ jsx(Switch, {
74
+ checked: formattingSettings.alignOnDecimals ?? false,
75
+ onChange: handleChangeAlignDecimals,
76
+ value: "align-decimals"
77
+ })
78
+ ]
79
+ }),
80
+ /*#__PURE__*/ jsxs(FormField, {
81
+ labelPlacement: "left",
82
+ children: [
83
+ /*#__PURE__*/ jsx(FormFieldLabel, {
84
+ children: "Zero pad decimals"
85
+ }),
86
+ /*#__PURE__*/ jsx(Switch, {
87
+ checked: formattingSettings.zeroPad ?? false,
88
+ onChange: handleChangeZeroPad,
89
+ value: "zero-pad"
90
+ })
91
+ ]
92
+ })
93
+ ]
94
+ });
95
+ };
96
+ export { BaseNumericFormattingSettings };
@@ -0,0 +1,112 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { getCellRendererOptions, getConfigurationEditor, isColumnTypeRenderer, isTypeDescriptor } from "@vuu-ui/vuu-utils";
3
+ import { Dropdown, FormField, FormFieldLabel, Option } from "@salt-ds/core";
4
+ import clsx from "clsx";
5
+ import { useCallback, useMemo } from "react";
6
+ import { BaseNumericFormattingSettings } from "./BaseNumericFormattingSettings.js";
7
+ import { LongTypeFormattingSettings } from "./LongTypeFormattingSettings.js";
8
+ import { DateTimeFormattingSettings } from "./DateTimeFormattingSettings.js";
9
+ const classBase = "vuuColumnFormattingPanel";
10
+ const ColumnFormattingPanel = ({ availableRenderers, className, column, onChangeFormatting, onChangeColumnType, onChangeRendering, ...htmlAttributes })=>{
11
+ const formattingSettingsComponent = useMemo(()=>getFormattingSettingsComponent({
12
+ column,
13
+ onChangeFormatting,
14
+ onChangeColumnType
15
+ }), [
16
+ column,
17
+ onChangeColumnType,
18
+ onChangeFormatting
19
+ ]);
20
+ const ConfigEditor = useMemo(()=>{
21
+ const { type } = column;
22
+ if (isTypeDescriptor(type) && isColumnTypeRenderer(type.renderer)) {
23
+ const cellRendererOptions = getCellRendererOptions(type.renderer.name);
24
+ return getConfigurationEditor(cellRendererOptions?.configEditor);
25
+ }
26
+ }, [
27
+ column
28
+ ]);
29
+ const selectedCellRenderer = useMemo(()=>{
30
+ const { type } = column;
31
+ const [defaultRenderer] = availableRenderers;
32
+ const rendererName = isTypeDescriptor(type) && isColumnTypeRenderer(type.renderer) ? type.renderer.name : void 0;
33
+ const configuredRenderer = availableRenderers.find((renderer)=>renderer.name === rendererName);
34
+ return configuredRenderer ?? defaultRenderer;
35
+ }, [
36
+ availableRenderers,
37
+ column
38
+ ]);
39
+ const handleChangeRenderer = useCallback((_e, [cellRendererDescriptor])=>{
40
+ const renderProps = {
41
+ name: cellRendererDescriptor.name
42
+ };
43
+ onChangeRendering?.(renderProps);
44
+ }, [
45
+ onChangeRendering
46
+ ]);
47
+ const { serverDataType = "string" } = column;
48
+ return /*#__PURE__*/ jsxs("div", {
49
+ ...htmlAttributes,
50
+ className: "vuuColumnSettingsPanel-header",
51
+ children: [
52
+ /*#__PURE__*/ jsx("div", {
53
+ children: "Formatting"
54
+ }),
55
+ /*#__PURE__*/ jsxs(FormField, {
56
+ children: [
57
+ /*#__PURE__*/ jsx(FormFieldLabel, {
58
+ children: `Renderer (data type ${column.serverDataType})`
59
+ }),
60
+ /*#__PURE__*/ jsx(Dropdown, {
61
+ bordered: true,
62
+ className: clsx(`${classBase}-renderer`),
63
+ onSelectionChange: handleChangeRenderer,
64
+ selected: selectedCellRenderer ? [
65
+ selectedCellRenderer
66
+ ] : [],
67
+ value: selectedCellRenderer?.label ?? selectedCellRenderer?.name,
68
+ children: availableRenderers.map((cellRenderer, i)=>/*#__PURE__*/ jsx(Option, {
69
+ value: cellRenderer,
70
+ children: cellRenderer.label ?? cellRenderer.name
71
+ }, i))
72
+ })
73
+ ]
74
+ }),
75
+ /*#__PURE__*/ jsxs("div", {
76
+ className: clsx(classBase, className, `${classBase}-${serverDataType}`),
77
+ children: [
78
+ formattingSettingsComponent,
79
+ ConfigEditor ? /*#__PURE__*/ jsx(ConfigEditor, {
80
+ column: column,
81
+ onChangeRendering: onChangeRendering
82
+ }) : null
83
+ ]
84
+ })
85
+ ]
86
+ });
87
+ };
88
+ function getFormattingSettingsComponent(props) {
89
+ const { column } = props;
90
+ switch(column.serverDataType){
91
+ case "double":
92
+ case "scaleddecimal2":
93
+ case "scaleddecimal4":
94
+ case "scaleddecimal6":
95
+ case "scaleddecimal8":
96
+ case "int":
97
+ return /*#__PURE__*/ jsx(BaseNumericFormattingSettings, {
98
+ ...props
99
+ });
100
+ case "long":
101
+ return /*#__PURE__*/ jsx(LongTypeFormattingSettings, {
102
+ ...props
103
+ });
104
+ case "epochtimestamp":
105
+ return /*#__PURE__*/ jsx(DateTimeFormattingSettings, {
106
+ ...props
107
+ });
108
+ default:
109
+ return null;
110
+ }
111
+ }
112
+ export { ColumnFormattingPanel };
@@ -0,0 +1,116 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { dateTimeLabelByType, defaultPatternsByType, fallbackDateTimePattern, getTypeFormattingFromColumn, isDatePattern, isTimePattern, supportedDateTimePatterns } from "@vuu-ui/vuu-utils";
3
+ import { Dropdown, FormField, FormFieldLabel, Option, ToggleButton, ToggleButtonGroup } from "@salt-ds/core";
4
+ import { useCallback, useMemo, useState } from "react";
5
+ const toggleValues = [
6
+ "date",
7
+ "time",
8
+ "both"
9
+ ];
10
+ function getToggleValue(pattern) {
11
+ return pattern.time ? pattern.date ? "both" : "time" : "date";
12
+ }
13
+ const getSelectedPattern = (pattern)=>{
14
+ if (isDatePattern(pattern)) return [
15
+ pattern
16
+ ];
17
+ if (isTimePattern(pattern)) return [
18
+ pattern
19
+ ];
20
+ };
21
+ const DateTimeFormattingSettings = ({ column, onChangeFormatting: onChange })=>{
22
+ const formatting = getTypeFormattingFromColumn(column);
23
+ const { pattern = fallbackDateTimePattern } = formatting;
24
+ const toggleValue = useMemo(()=>getToggleValue(pattern), [
25
+ pattern
26
+ ]);
27
+ const [fallbackState, setFallbackState] = useState({
28
+ time: pattern.time ?? defaultPatternsByType.time,
29
+ date: pattern.date ?? defaultPatternsByType.date
30
+ });
31
+ const onPatternChange = useCallback((pattern)=>onChange({
32
+ ...formatting,
33
+ pattern
34
+ }), [
35
+ onChange,
36
+ formatting
37
+ ]);
38
+ const onDropdownChange = useCallback((dateTime)=>(_, [selectedPattern])=>{
39
+ const updatedPattern = {
40
+ ...pattern ?? {},
41
+ [dateTime]: selectedPattern
42
+ };
43
+ setFallbackState((s)=>({
44
+ time: updatedPattern.time ?? s.time,
45
+ date: updatedPattern.date ?? s.date
46
+ }));
47
+ onPatternChange(updatedPattern);
48
+ }, [
49
+ onPatternChange,
50
+ pattern
51
+ ]);
52
+ const onToggleChange = useCallback((evnt)=>{
53
+ const value = evnt.currentTarget.value;
54
+ switch(value){
55
+ case "time":
56
+ return onPatternChange({
57
+ [value]: pattern[value] ?? fallbackState[value]
58
+ });
59
+ case "date":
60
+ return onPatternChange({
61
+ [value]: pattern[value] ?? fallbackState[value]
62
+ });
63
+ case "both":
64
+ return onPatternChange({
65
+ time: pattern.time ?? fallbackState.time,
66
+ date: pattern.date ?? fallbackState.date
67
+ });
68
+ }
69
+ }, [
70
+ onPatternChange,
71
+ pattern,
72
+ fallbackState
73
+ ]);
74
+ return /*#__PURE__*/ jsxs(Fragment, {
75
+ children: [
76
+ /*#__PURE__*/ jsxs(FormField, {
77
+ labelPlacement: "top",
78
+ children: [
79
+ /*#__PURE__*/ jsx(FormFieldLabel, {
80
+ children: "Display"
81
+ }),
82
+ /*#__PURE__*/ jsx(ToggleButtonGroup, {
83
+ className: "vuuToggleButtonGroup",
84
+ onChange: onToggleChange,
85
+ value: toggleValue,
86
+ "data-variant": "primary",
87
+ children: toggleValues.map((v)=>/*#__PURE__*/ jsx(ToggleButton, {
88
+ value: v,
89
+ children: v.toUpperCase()
90
+ }, v))
91
+ })
92
+ ]
93
+ }),
94
+ [
95
+ "date",
96
+ "time"
97
+ ].filter((v)=>!!pattern[v]).map((v)=>/*#__PURE__*/ jsxs(FormField, {
98
+ labelPlacement: "top",
99
+ children: [
100
+ /*#__PURE__*/ jsx(FormFieldLabel, {
101
+ children: `${dateTimeLabelByType[v]} pattern`
102
+ }),
103
+ /*#__PURE__*/ jsx(Dropdown, {
104
+ onSelectionChange: onDropdownChange(v),
105
+ selected: getSelectedPattern(pattern[v]),
106
+ children: supportedDateTimePatterns[v].map((pattern, i)=>/*#__PURE__*/ jsx(Option, {
107
+ value: pattern,
108
+ children: pattern
109
+ }, i))
110
+ })
111
+ ]
112
+ }, v))
113
+ ]
114
+ });
115
+ };
116
+ export { DateTimeFormattingSettings };
@@ -0,0 +1,11 @@
1
+ const css = `
2
+ .vuuLongColumnFormattingSettings {
3
+ gap: var(--salt-spacing-200);
4
+ flex-direction: column;
5
+ padding-top: 6px;
6
+ display: flex;
7
+ }
8
+
9
+
10
+ `;
11
+ export default css;
@@ -0,0 +1,54 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { FormField, FormFieldLabel, ToggleButton, ToggleButtonGroup } from "@salt-ds/core";
3
+ import { useComponentCssInjection } from "@salt-ds/styles";
4
+ import { useWindow } from "@salt-ds/window";
5
+ import { useCallback } from "react";
6
+ import { BaseNumericFormattingSettings } from "./BaseNumericFormattingSettings.js";
7
+ import LongTypeFormattingSettings from "./LongTypeFormattingSettings.css";
8
+ import { isTypeDescriptor } from "@vuu-ui/vuu-utils";
9
+ const classBase = "vuuLongColumnFormattingSettings";
10
+ const LongTypeFormattingSettings_LongTypeFormattingSettings = (props)=>{
11
+ const targetWindow = useWindow();
12
+ useComponentCssInjection({
13
+ testId: "vuu-long-formatting-settings",
14
+ css: LongTypeFormattingSettings,
15
+ window: targetWindow
16
+ });
17
+ const { column, onChangeColumnType: onChangeType } = props;
18
+ const type = isTypeDescriptor(column.type) ? column.type.name : column.type;
19
+ const handleToggleChange = useCallback((event)=>{
20
+ const value = event.currentTarget.value;
21
+ onChangeType(value);
22
+ }, [
23
+ onChangeType
24
+ ]);
25
+ return /*#__PURE__*/ jsxs("div", {
26
+ className: classBase,
27
+ children: [
28
+ /*#__PURE__*/ jsxs(FormField, {
29
+ children: [
30
+ /*#__PURE__*/ jsx(FormFieldLabel, {
31
+ children: "Type inferred as"
32
+ }),
33
+ /*#__PURE__*/ jsx(ToggleButtonGroup, {
34
+ className: "vuuToggleButtonGroup",
35
+ onChange: handleToggleChange,
36
+ value: type ?? "number",
37
+ children: toggleValues.map((v)=>/*#__PURE__*/ jsx(ToggleButton, {
38
+ value: v,
39
+ children: v.toUpperCase()
40
+ }, v))
41
+ })
42
+ ]
43
+ }),
44
+ /*#__PURE__*/ jsx(BaseNumericFormattingSettings, {
45
+ ...props
46
+ })
47
+ ]
48
+ });
49
+ };
50
+ const toggleValues = [
51
+ "number",
52
+ "date/time"
53
+ ];
54
+ export { LongTypeFormattingSettings_LongTypeFormattingSettings as LongTypeFormattingSettings };
@@ -0,0 +1,3 @@
1
+ export * from "./ColumnFormattingPanel.js";
2
+ export * from "./BaseNumericFormattingSettings.js";
3
+ export * from "./DateTimeFormattingSettings.js";
@@ -0,0 +1,25 @@
1
+ const css = `
2
+ .vuuMenuItem {
3
+ --vuu-svg-cog: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"><path d=\"M12.9533 8.65331C12.98 8.43998 13 8.22665 13 7.99998C13 7.77331 12.98 7.55998 12.9533 7.34665L14.36 6.24665C14.4867 6.14665 14.52 5.96665 14.44 5.81998L13.1067 3.51331C13.0267 3.36665 12.8467 3.31331 12.7 3.36665L11.04 4.03331C10.6933 3.76665 10.32 3.54665 9.91333 3.37998L9.66 1.61331C9.64 1.45331 9.5 1.33331 9.33333 1.33331H6.66667C6.5 1.33331 6.36 1.45331 6.34 1.61331L6.08667 3.37998C5.68 3.54665 5.30667 3.77331 4.96 4.03331L3.3 3.36665C3.14667 3.30665 2.97333 3.36665 2.89333 3.51331L1.56 5.81998C1.47333 5.96665 1.51333 6.14665 1.64 6.24665L3.04667 7.34665C3.02 7.55998 3 7.77998 3 7.99998C3 8.21998 3.02 8.43998 3.04667 8.65331L1.64 9.75331C1.51333 9.85331 1.48 10.0333 1.56 10.18L2.89333 12.4866C2.97333 12.6333 3.15333 12.6866 3.3 12.6333L4.96 11.9666C5.30667 12.2333 5.68 12.4533 6.08667 12.62L6.34 14.3866C6.36 14.5466 6.5 14.6666 6.66667 14.6666H9.33333C9.5 14.6666 9.64 14.5466 9.66 14.3866L9.91333 12.62C10.32 12.4533 10.6933 12.2266 11.04 11.9666L12.7 12.6333C12.8533 12.6933 13.0267 12.6333 13.1067 12.4866L14.44 10.18C14.52 10.0333 14.4867 9.85331 14.36 9.75331L12.9533 8.65331V8.65331ZM8 10.3333C6.71333 10.3333 5.66667 9.28665 5.66667 7.99998C5.66667 6.71331 6.71333 5.66665 8 5.66665C9.28667 5.66665 10.3333 6.71331 10.3333 7.99998C10.3333 9.28665 9.28667 10.3333 8 10.3333Z\"/></svg>");
4
+ }
5
+
6
+ .vuuColumnMenu {
7
+ --menu-button-size: calc(var(--salt-size-base) - var(--salt-spacing-100));
8
+ --saltButton-borderRadius: 3px;
9
+ --saltButton-padding: var(--salt-spacing-50);
10
+ --saltButton-minWidth: var(--menu-button-size);
11
+ --saltButton-height: var(--vuuColumnMenu-height, var(--menu-button-size));
12
+ --saltButton-width: var(--vuuColumnMenu-width, var(--menu-button-size));
13
+ --vuu-icon-height: var(--menu-button-size);
14
+ --vuu-icon-left: 0px;
15
+ --vuu-icon-top: 0px;
16
+ --vuu-icon-width: var(--menu-button-size);
17
+ flex: 0 0 var(--menu-button-size);
18
+ margin: var(--vuuTable-columnMenu-margin, 0);
19
+ border: none;
20
+ padding: 0;
21
+ }
22
+
23
+
24
+ `;
25
+ export default css;
@@ -0,0 +1,69 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Menu, MenuPanel, MenuTrigger } from "@salt-ds/core";
3
+ import { useComponentCssInjection } from "@salt-ds/styles";
4
+ import { useWindow } from "@salt-ds/window";
5
+ import { IconButton } from "@vuu-ui/vuu-ui-controls";
6
+ import clsx from "clsx";
7
+ import { useCallback } from "react";
8
+ import { useTableContext } from "../table-provider/TableProvider.js";
9
+ import { buildAggregationMenuItems, buildGroupMenu, buildPinMenuItems, buildSortMenu, buildVisibilityMenuItems, getColumnMenuActionType } from "./column-menu-utils.js";
10
+ import ColumnMenu from "./ColumnMenu.css";
11
+ const classBase = "vuuColumnMenu";
12
+ const defaultColumnMenuPermissions = {
13
+ allowSort: true,
14
+ allowGroup: true,
15
+ allowAggregation: true,
16
+ allowHide: true,
17
+ allowRemove: true,
18
+ allowPin: true
19
+ };
20
+ const ColumnMenu_ColumnMenu = ({ className, column, menuActionHandler: menuActionHandlerProp, menuPermissions: { allowSort, allowGroup, allowAggregation, allowHide, allowRemove, allowPin } = defaultColumnMenuPermissions })=>{
21
+ const targetWindow = useWindow();
22
+ useComponentCssInjection({
23
+ testId: "vuu-column-menu",
24
+ css: ColumnMenu,
25
+ window: targetWindow
26
+ });
27
+ const { dataSource, menuActionHandler } = useTableContext(true);
28
+ const menuActionClickHandler = useCallback((evt)=>{
29
+ const columnMenuActionType = getColumnMenuActionType(evt.target);
30
+ if (menuActionHandlerProp?.(columnMenuActionType, column) !== true) return menuActionHandler(columnMenuActionType, column);
31
+ }, [
32
+ column,
33
+ menuActionHandler,
34
+ menuActionHandlerProp
35
+ ]);
36
+ const sortMenu = buildSortMenu(column, dataSource, menuActionClickHandler, allowSort);
37
+ const groupMenu = buildGroupMenu(column, dataSource, menuActionClickHandler, allowGroup);
38
+ const aggregationMenu = buildAggregationMenuItems(column, dataSource, menuActionClickHandler, allowAggregation);
39
+ const visibilityMenuItems = buildVisibilityMenuItems(column, menuActionClickHandler, allowHide, allowRemove);
40
+ const pinMenu = buildPinMenuItems(column, menuActionClickHandler, allowPin);
41
+ const handleClick = useCallback((evt)=>{
42
+ evt.stopPropagation();
43
+ }, []);
44
+ return /*#__PURE__*/ jsxs(Menu, {
45
+ children: [
46
+ /*#__PURE__*/ jsx(MenuTrigger, {
47
+ children: /*#__PURE__*/ jsx(IconButton, {
48
+ appearance: "transparent",
49
+ className: clsx(classBase, className),
50
+ "data-embedded": true,
51
+ icon: "more-vert",
52
+ sentiment: "neutral",
53
+ "aria-label": "Open Column Menu",
54
+ onClick: handleClick
55
+ })
56
+ }),
57
+ /*#__PURE__*/ jsxs(MenuPanel, {
58
+ children: [
59
+ sortMenu,
60
+ groupMenu,
61
+ aggregationMenu,
62
+ visibilityMenuItems,
63
+ pinMenu
64
+ ]
65
+ })
66
+ ]
67
+ });
68
+ };
69
+ export { ColumnMenu_ColumnMenu as ColumnMenu };
File without changes