@vuu-ui/vuu-table-extras 4.0.0-alpha.2 → 4.0.0-alpha.20
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 +15 -13
- package/src/calculated-column/CalculatedColumnPanel.js +2 -2
- package/src/calculated-column/useEditCalculatedColumn.js +1 -1
- package/src/column-expression-input/useColumnExpressionSuggestionProvider.js +2 -2
- package/src/column-formatting-settings/ColumnFormattingPanel.js +12 -9
- package/src/column-formatting-settings/DateTimeFormattingSettings.js +107 -3
- package/src/column-formatting-settings/LongTypeFormattingSettings.js +8 -3
- package/src/column-picker/ColumnModel.js +14 -25
- package/src/column-picker/ColumnPicker.css.js +0 -86
- package/src/column-picker/ColumnPicker.js +12 -180
- package/src/column-picker/useColumnPicker.js +28 -22
- package/src/csv-export/export-utils.js +66 -19
- package/src/csv-export/index.js +1 -1
- package/src/csv-export/useCsvExport.js +9 -1
- package/src/csv-upload/CsvUpload.css.js +34 -0
- package/src/csv-upload/CsvUpload.js +107 -63
- package/src/csv-upload/parse/csv-errors.js +1 -1
- package/src/csv-upload/parse/csv-parse.js +1 -1
- package/src/csv-upload/parse/csv-schema-validation.js +46 -7
- package/src/csv-upload/useCsvUpload.js +12 -14
- package/src/tabbed-table-config-panel/TabbedTableConfigPanel.js +17 -8
- package/src/tabbed-table-config-panel/useTabbedTableConfigPanel.js +1 -1
- package/src/table-footer/TableFooter.js +3 -3
- package/types/calculated-column/CalculatedColumnPanel.d.ts +2 -2
- package/types/column-formatting-settings/DateTimeFormattingSettings.d.ts +1 -1
- package/types/column-picker/ColumnModel.d.ts +4 -3
- package/types/column-picker/ColumnPicker.d.ts +4 -6
- package/types/column-picker/useColumnPicker.d.ts +7 -10
- package/types/column-settings-panel/useColumnSettings.d.ts +3 -3
- package/types/csv-export/export-utils.d.ts +22 -9
- package/types/csv-export/index.d.ts +1 -1
- package/types/csv-export/useCsvExport.d.ts +5 -2
- package/types/csv-upload/CsvUpload.d.ts +1 -5
- package/types/csv-upload/parse/csv-errors.d.ts +1 -1
- package/types/csv-upload/parse/csv-schema-validation.d.ts +8 -2
- package/types/csv-upload/useCsvUpload.d.ts +2 -2
- package/types/index.d.ts +0 -1
- package/types/inline-add-row/useInlineAddRow.d.ts +2 -1
- package/types/tabbed-table-config-panel/useTabbedTableConfigPanel.d.ts +4 -3
- package/types/table-footer/TableFooter.d.ts +2 -2
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "4.0.0-alpha.
|
|
2
|
+
"version": "4.0.0-alpha.20",
|
|
3
3
|
"author": "heswell",
|
|
4
4
|
"main": "./src/index.js",
|
|
5
5
|
"license": "Apache-2.0",
|
|
@@ -12,19 +12,20 @@
|
|
|
12
12
|
"lezer-generate:column": "lezer-generator --output ./src/column-expression-input/column-language-parser/generated/column-parser.ts ./src/column-expression-input/column-language-parser/grammar/column.grammar"
|
|
13
13
|
},
|
|
14
14
|
"devDependencies": {
|
|
15
|
-
"@vuu-ui/vuu-filter-types": "4.0.0-alpha.
|
|
16
|
-
"@vuu-ui/vuu-protocol-types": "4.0.0-alpha.
|
|
15
|
+
"@vuu-ui/vuu-filter-types": "4.0.0-alpha.20",
|
|
16
|
+
"@vuu-ui/vuu-protocol-types": "4.0.0-alpha.20"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@vuu-ui/
|
|
20
|
-
"@vuu-ui/vuu-
|
|
21
|
-
"@vuu-ui/vuu-data-
|
|
22
|
-
"@vuu-ui/vuu-data-
|
|
23
|
-
"@vuu-ui/vuu-
|
|
24
|
-
"@vuu-ui/vuu-
|
|
25
|
-
"@vuu-ui/vuu-
|
|
26
|
-
"@vuu-ui/vuu-
|
|
27
|
-
"@vuu-ui/vuu-
|
|
19
|
+
"@vuu-ui/core": "4.0.0-alpha.20",
|
|
20
|
+
"@vuu-ui/vuu-codemirror": "4.0.0-alpha.20",
|
|
21
|
+
"@vuu-ui/vuu-data-editing": "4.0.0-alpha.20",
|
|
22
|
+
"@vuu-ui/vuu-data-react": "4.0.0-alpha.20",
|
|
23
|
+
"@vuu-ui/vuu-data-types": "4.0.0-alpha.20",
|
|
24
|
+
"@vuu-ui/vuu-table-types": "4.0.0-alpha.20",
|
|
25
|
+
"@vuu-ui/vuu-popups": "4.0.0-alpha.20",
|
|
26
|
+
"@vuu-ui/vuu-table": "4.0.0-alpha.20",
|
|
27
|
+
"@vuu-ui/vuu-utils": "4.0.0-alpha.20",
|
|
28
|
+
"@vuu-ui/vuu-ui-controls": "4.0.0-alpha.20",
|
|
28
29
|
"@lezer/lr": "1.4.2",
|
|
29
30
|
"@salt-ds/core": "1.67.0",
|
|
30
31
|
"@salt-ds/lab": "1.0.0-alpha.99",
|
|
@@ -45,8 +46,9 @@
|
|
|
45
46
|
],
|
|
46
47
|
"exports": {
|
|
47
48
|
".": {
|
|
49
|
+
"types": "./types/index.d.ts",
|
|
48
50
|
"import": "./src/index.js",
|
|
49
|
-
"
|
|
51
|
+
"default": "./src/index.js"
|
|
50
52
|
}
|
|
51
53
|
},
|
|
52
54
|
"module": "./src/index.js",
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Dropdown, FormField, FormFieldLabel, Input, Option } from "@salt-ds/core";
|
|
3
|
-
import { useCalculatedColumnPanel } from "./useCalculatedColumnPanel.js";
|
|
4
|
-
import { useCallback, useRef } from "react";
|
|
5
3
|
import { getCalculatedColumnDetails } from "@vuu-ui/vuu-utils";
|
|
4
|
+
import { useCallback, useRef } from "react";
|
|
6
5
|
import { ColumnExpressionInput, useColumnExpressionSuggestionProvider } from "../column-expression-input/index.js";
|
|
6
|
+
import { useCalculatedColumnPanel } from "./useCalculatedColumnPanel.js";
|
|
7
7
|
const classBase = "vuuCalculatedColumnPanel";
|
|
8
8
|
const CalculatedColumnPanel = ({ column: columnProp, columnModel, onChangeColumn, onChangeServerDataType: onChangeServerDataTypeProp, vuuTable })=>{
|
|
9
9
|
const typeRef = useRef(null);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
|
-
import { useModal } from "@vuu-ui/
|
|
2
|
+
import { useModal } from "@vuu-ui/core";
|
|
3
3
|
import { useCallback, useRef } from "react";
|
|
4
4
|
import { CalculatedColumnPanel } from "./CalculatedColumnPanel.js";
|
|
5
5
|
const useEditCalculatedColumn = ({ calculatedColumn, columnModel, onSaveColumn, vuuTable })=>{
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AnnotationType, getRelationalOperators, numericOperators, stringOperators, toSuggestions } from "@vuu-ui/vuu-codemirror";
|
|
2
2
|
import { getTypeaheadParams, useTypeaheadSuggestions } from "@vuu-ui/vuu-data-react";
|
|
3
|
-
import { isNumericColumn, isTextColumn } from "@vuu-ui/vuu-utils";
|
|
3
|
+
import { isNumericColumn, isTemporalColumn, isTextColumn } from "@vuu-ui/vuu-utils";
|
|
4
4
|
import { useCallback, useRef } from "react";
|
|
5
5
|
import { columnFunctionDescriptors } from "./column-function-descriptors.js";
|
|
6
6
|
import { functionDocInfo } from "./functionDocInfo.js";
|
|
@@ -64,7 +64,7 @@ const arithmeticOperators = [
|
|
|
64
64
|
}
|
|
65
65
|
];
|
|
66
66
|
const getOperators = (column)=>{
|
|
67
|
-
if (void 0 === column || isNumericColumn(column)) return arithmeticOperators;
|
|
67
|
+
if (void 0 === column || isNumericColumn(column) || isTemporalColumn(column)) return arithmeticOperators;
|
|
68
68
|
return NO_OPERATORS;
|
|
69
69
|
};
|
|
70
70
|
const getConditionOperators = (column)=>{
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { getCellRendererOptions, getConfigurationEditor, isColumnTypeRenderer, isTypeDescriptor } from "@vuu-ui/vuu-utils";
|
|
2
|
+
import { getCellRendererOptions, getConfigurationEditor, isColumnTypeRenderer, isTemporalColumn, isTypeDescriptor } from "@vuu-ui/vuu-utils";
|
|
3
3
|
import { Dropdown, FormField, FormFieldLabel, Option } from "@salt-ds/core";
|
|
4
4
|
import clsx from "clsx";
|
|
5
5
|
import { useCallback, useMemo } from "react";
|
|
@@ -88,21 +88,24 @@ const ColumnFormattingPanel = ({ availableRenderers, className, column, onChange
|
|
|
88
88
|
function getFormattingSettingsComponent(props) {
|
|
89
89
|
const { column } = props;
|
|
90
90
|
switch(column.serverDataType){
|
|
91
|
+
case "long":
|
|
92
|
+
return /*#__PURE__*/ jsx(LongTypeFormattingSettings, {
|
|
93
|
+
...props
|
|
94
|
+
});
|
|
95
|
+
case "epochtimestamp":
|
|
96
|
+
case "epochtimestampnano":
|
|
97
|
+
return /*#__PURE__*/ jsx(DateTimeFormattingSettings, {
|
|
98
|
+
...props
|
|
99
|
+
});
|
|
91
100
|
case "double":
|
|
92
101
|
case "scaleddecimal2":
|
|
93
102
|
case "scaleddecimal4":
|
|
94
103
|
case "scaleddecimal6":
|
|
95
104
|
case "scaleddecimal8":
|
|
96
105
|
case "int":
|
|
97
|
-
return /*#__PURE__*/ jsx(
|
|
106
|
+
return isTemporalColumn(column) ? /*#__PURE__*/ jsx(DateTimeFormattingSettings, {
|
|
98
107
|
...props
|
|
99
|
-
})
|
|
100
|
-
case "long":
|
|
101
|
-
return /*#__PURE__*/ jsx(LongTypeFormattingSettings, {
|
|
102
|
-
...props
|
|
103
|
-
});
|
|
104
|
-
case "epochtimestamp":
|
|
105
|
-
return /*#__PURE__*/ jsx(DateTimeFormattingSettings, {
|
|
108
|
+
}) : /*#__PURE__*/ jsx(BaseNumericFormattingSettings, {
|
|
106
109
|
...props
|
|
107
110
|
});
|
|
108
111
|
default:
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { dateTimeLabelByType, defaultPatternsByType, fallbackDateTimePattern, getTypeFormattingFromColumn, isDatePattern, isTimePattern, supportedDateTimePatterns } from "@vuu-ui/vuu-utils";
|
|
2
|
+
import { dateTimeLabelByType, dateTimePattern, defaultPatternsByType, fallbackDateTimePattern, getTemporalInfo, getTypeFormattingFromColumn, isDatePattern, isTimePattern, supportedDateTimePatterns } from "@vuu-ui/vuu-utils";
|
|
3
3
|
import { Dropdown, FormField, FormFieldLabel, Option, ToggleButton, ToggleButtonGroup } from "@salt-ds/core";
|
|
4
4
|
import { useCallback, useMemo, useState } from "react";
|
|
5
5
|
const toggleValues = [
|
|
@@ -7,6 +7,32 @@ const toggleValues = [
|
|
|
7
7
|
"time",
|
|
8
8
|
"both"
|
|
9
9
|
];
|
|
10
|
+
const DEFAULT = "default";
|
|
11
|
+
const fractionalSecondDigitOptions = [
|
|
12
|
+
DEFAULT,
|
|
13
|
+
"0",
|
|
14
|
+
"3",
|
|
15
|
+
"6",
|
|
16
|
+
"9"
|
|
17
|
+
];
|
|
18
|
+
const timeZoneOptions = [
|
|
19
|
+
DEFAULT,
|
|
20
|
+
"local",
|
|
21
|
+
"UTC",
|
|
22
|
+
"Europe/London",
|
|
23
|
+
"Europe/Paris",
|
|
24
|
+
"America/New_York",
|
|
25
|
+
"Asia/Tokyo",
|
|
26
|
+
"Asia/Hong_Kong"
|
|
27
|
+
];
|
|
28
|
+
const localeOptions = [
|
|
29
|
+
DEFAULT,
|
|
30
|
+
"en-GB",
|
|
31
|
+
"en-US",
|
|
32
|
+
"de-DE",
|
|
33
|
+
"fr-FR",
|
|
34
|
+
"ja-JP"
|
|
35
|
+
];
|
|
10
36
|
function getToggleValue(pattern) {
|
|
11
37
|
return pattern.time ? pattern.date ? "both" : "time" : "date";
|
|
12
38
|
}
|
|
@@ -20,7 +46,8 @@ const getSelectedPattern = (pattern)=>{
|
|
|
20
46
|
};
|
|
21
47
|
const DateTimeFormattingSettings = ({ column, onChangeFormatting: onChange })=>{
|
|
22
48
|
const formatting = getTypeFormattingFromColumn(column);
|
|
23
|
-
const
|
|
49
|
+
const temporalInfo = getTemporalInfo(column);
|
|
50
|
+
const { pattern = temporalInfo ? dateTimePattern(column.type, temporalInfo.kind) : fallbackDateTimePattern } = formatting;
|
|
24
51
|
const toggleValue = useMemo(()=>getToggleValue(pattern), [
|
|
25
52
|
pattern
|
|
26
53
|
]);
|
|
@@ -28,6 +55,26 @@ const DateTimeFormattingSettings = ({ column, onChangeFormatting: onChange })=>{
|
|
|
28
55
|
time: pattern.time ?? defaultPatternsByType.time,
|
|
29
56
|
date: pattern.date ?? defaultPatternsByType.date
|
|
30
57
|
});
|
|
58
|
+
const onFractionalSecondDigitsChange = useCallback((_, [value])=>{
|
|
59
|
+
const { fractionalSecondDigits, ...rest } = formatting;
|
|
60
|
+
onChange(value === DEFAULT ? rest : {
|
|
61
|
+
...rest,
|
|
62
|
+
fractionalSecondDigits: parseInt(value, 10)
|
|
63
|
+
});
|
|
64
|
+
}, [
|
|
65
|
+
formatting,
|
|
66
|
+
onChange
|
|
67
|
+
]);
|
|
68
|
+
const onFormattingOptionChange = useCallback((key)=>(_, [value])=>{
|
|
69
|
+
const { [key]: _previous, ...rest } = formatting;
|
|
70
|
+
onChange(value === DEFAULT ? rest : {
|
|
71
|
+
...rest,
|
|
72
|
+
[key]: value
|
|
73
|
+
});
|
|
74
|
+
}, [
|
|
75
|
+
formatting,
|
|
76
|
+
onChange
|
|
77
|
+
]);
|
|
31
78
|
const onPatternChange = useCallback((pattern)=>onChange({
|
|
32
79
|
...formatting,
|
|
33
80
|
pattern
|
|
@@ -109,7 +156,64 @@ const DateTimeFormattingSettings = ({ column, onChangeFormatting: onChange })=>{
|
|
|
109
156
|
}, i))
|
|
110
157
|
})
|
|
111
158
|
]
|
|
112
|
-
}, v))
|
|
159
|
+
}, v)),
|
|
160
|
+
pattern.time ? /*#__PURE__*/ jsxs(FormField, {
|
|
161
|
+
labelPlacement: "top",
|
|
162
|
+
children: [
|
|
163
|
+
/*#__PURE__*/ jsx(FormFieldLabel, {
|
|
164
|
+
children: "Fractional second digits"
|
|
165
|
+
}),
|
|
166
|
+
/*#__PURE__*/ jsx(Dropdown, {
|
|
167
|
+
onSelectionChange: onFractionalSecondDigitsChange,
|
|
168
|
+
selected: [
|
|
169
|
+
`${formatting.fractionalSecondDigits ?? DEFAULT}`
|
|
170
|
+
],
|
|
171
|
+
value: `${formatting.fractionalSecondDigits ?? DEFAULT}`,
|
|
172
|
+
children: fractionalSecondDigitOptions.filter((digits)=>temporalInfo?.precision === "ns" || "6" !== digits && "9" !== digits).map((digits)=>/*#__PURE__*/ jsx(Option, {
|
|
173
|
+
value: digits,
|
|
174
|
+
children: digits
|
|
175
|
+
}, digits))
|
|
176
|
+
})
|
|
177
|
+
]
|
|
178
|
+
}) : null,
|
|
179
|
+
/*#__PURE__*/ jsxs(FormField, {
|
|
180
|
+
labelPlacement: "top",
|
|
181
|
+
children: [
|
|
182
|
+
/*#__PURE__*/ jsx(FormFieldLabel, {
|
|
183
|
+
children: "Time zone"
|
|
184
|
+
}),
|
|
185
|
+
/*#__PURE__*/ jsx(Dropdown, {
|
|
186
|
+
onSelectionChange: onFormattingOptionChange("timeZone"),
|
|
187
|
+
selected: [
|
|
188
|
+
formatting.timeZone ?? DEFAULT
|
|
189
|
+
],
|
|
190
|
+
value: formatting.timeZone ?? DEFAULT,
|
|
191
|
+
children: timeZoneOptions.map((timeZone)=>/*#__PURE__*/ jsx(Option, {
|
|
192
|
+
value: timeZone,
|
|
193
|
+
children: timeZone
|
|
194
|
+
}, timeZone))
|
|
195
|
+
})
|
|
196
|
+
]
|
|
197
|
+
}),
|
|
198
|
+
/*#__PURE__*/ jsxs(FormField, {
|
|
199
|
+
labelPlacement: "top",
|
|
200
|
+
children: [
|
|
201
|
+
/*#__PURE__*/ jsx(FormFieldLabel, {
|
|
202
|
+
children: "Locale"
|
|
203
|
+
}),
|
|
204
|
+
/*#__PURE__*/ jsx(Dropdown, {
|
|
205
|
+
onSelectionChange: onFormattingOptionChange("locale"),
|
|
206
|
+
selected: [
|
|
207
|
+
formatting.locale ?? DEFAULT
|
|
208
|
+
],
|
|
209
|
+
value: formatting.locale ?? DEFAULT,
|
|
210
|
+
children: localeOptions.map((locale)=>/*#__PURE__*/ jsx(Option, {
|
|
211
|
+
value: locale,
|
|
212
|
+
children: locale
|
|
213
|
+
}, locale))
|
|
214
|
+
})
|
|
215
|
+
]
|
|
216
|
+
})
|
|
113
217
|
]
|
|
114
218
|
});
|
|
115
219
|
};
|
|
@@ -5,7 +5,8 @@ import { useWindow } from "@salt-ds/window";
|
|
|
5
5
|
import { useCallback } from "react";
|
|
6
6
|
import { BaseNumericFormattingSettings } from "./BaseNumericFormattingSettings.js";
|
|
7
7
|
import LongTypeFormattingSettings from "./LongTypeFormattingSettings.css";
|
|
8
|
-
import { isTypeDescriptor } from "@vuu-ui/vuu-utils";
|
|
8
|
+
import { isTemporalColumn, isTypeDescriptor } from "@vuu-ui/vuu-utils";
|
|
9
|
+
import { DateTimeFormattingSettings } from "./DateTimeFormattingSettings.js";
|
|
9
10
|
const classBase = "vuuLongColumnFormattingSettings";
|
|
10
11
|
const LongTypeFormattingSettings_LongTypeFormattingSettings = (props)=>{
|
|
11
12
|
const targetWindow = useWindow();
|
|
@@ -41,7 +42,9 @@ const LongTypeFormattingSettings_LongTypeFormattingSettings = (props)=>{
|
|
|
41
42
|
})
|
|
42
43
|
]
|
|
43
44
|
}),
|
|
44
|
-
/*#__PURE__*/ jsx(
|
|
45
|
+
isTemporalColumn(column) ? /*#__PURE__*/ jsx(DateTimeFormattingSettings, {
|
|
46
|
+
...props
|
|
47
|
+
}) : /*#__PURE__*/ jsx(BaseNumericFormattingSettings, {
|
|
45
48
|
...props
|
|
46
49
|
})
|
|
47
50
|
]
|
|
@@ -49,6 +52,8 @@ const LongTypeFormattingSettings_LongTypeFormattingSettings = (props)=>{
|
|
|
49
52
|
};
|
|
50
53
|
const toggleValues = [
|
|
51
54
|
"number",
|
|
52
|
-
"date/time"
|
|
55
|
+
"date/time",
|
|
56
|
+
"date",
|
|
57
|
+
"time"
|
|
53
58
|
];
|
|
54
59
|
export { LongTypeFormattingSettings_LongTypeFormattingSettings as LongTypeFormattingSettings };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EventEmitter, reorderItems } from "@vuu-ui/vuu-utils";
|
|
1
|
+
import { EventEmitter, getAddedItems, getRemovedItems, itemsOrOrderChanged, reorderItems } from "@vuu-ui/vuu-utils";
|
|
2
2
|
const ColumnChangeSource = {
|
|
3
3
|
ColumnPicker: "column-picker",
|
|
4
4
|
ColumnSettings: "column-settings",
|
|
@@ -15,37 +15,16 @@ const isColumnAdded = (change)=>change?.type === SelectedColumnChangeType.Column
|
|
|
15
15
|
const isColumnRemoved = (change)=>change?.type === SelectedColumnChangeType.ColumnRemoved;
|
|
16
16
|
const isColumnUpdated = (change)=>change?.type === SelectedColumnChangeType.ColumnUpdated;
|
|
17
17
|
const isColumnsReordered = (change)=>change?.type === SelectedColumnChangeType.ColumnsReordered;
|
|
18
|
-
const
|
|
19
|
-
const filterColumns = (columns, pattern)=>{
|
|
20
|
-
if (!pattern) return columns;
|
|
21
|
-
{
|
|
22
|
-
const lowerCasePattern = pattern.toLowerCase();
|
|
23
|
-
return columns.filter(({ name, label = name })=>-1 !== label.toLowerCase().indexOf(lowerCasePattern));
|
|
24
|
-
}
|
|
25
|
-
};
|
|
18
|
+
const columnDescriptorComparator = (col1, col2)=>col1.name === col2.name;
|
|
26
19
|
class ColumnModel extends EventEmitter {
|
|
27
20
|
allColumns;
|
|
28
|
-
#searchPattern = "";
|
|
29
21
|
#selectedColumns;
|
|
30
22
|
constructor(allColumns, selectedColumns){
|
|
31
23
|
super(), this.allColumns = allColumns;
|
|
32
24
|
this.#selectedColumns = selectedColumns;
|
|
33
25
|
}
|
|
34
|
-
get availableColumns() {
|
|
35
|
-
return filterColumns(this.allColumns, this.#searchPattern).filter(({ name })=>-1 === this.#selectedColumns.findIndex((c)=>c.name === name)).toSorted(byColumnName);
|
|
36
|
-
}
|
|
37
|
-
set searchPattern(pattern) {
|
|
38
|
-
const searchPattern = pattern;
|
|
39
|
-
if (searchPattern !== this.#searchPattern) {
|
|
40
|
-
this.#searchPattern = searchPattern;
|
|
41
|
-
this.emit("render", {});
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
get searchPattern() {
|
|
45
|
-
return this.#searchPattern ?? "";
|
|
46
|
-
}
|
|
47
26
|
get selectedColumns() {
|
|
48
|
-
return
|
|
27
|
+
return this.#selectedColumns;
|
|
49
28
|
}
|
|
50
29
|
setSelectedColumns(selectedColumns, source, changeDescriptor) {
|
|
51
30
|
this.#selectedColumns = selectedColumns;
|
|
@@ -56,6 +35,16 @@ class ColumnModel extends EventEmitter {
|
|
|
56
35
|
if (col) return col;
|
|
57
36
|
throw Error(`[ColumnModel] columns does not contain column ${name}`);
|
|
58
37
|
}
|
|
38
|
+
addRemoveOrReorderSelectedColumns(newSelectedColumns, source) {
|
|
39
|
+
if (!itemsOrOrderChanged(this.#selectedColumns, newSelectedColumns)) throw Error("[ColumnModel] addRemoveOrReorderSelectedColumns no change detected between current and new selected columns");
|
|
40
|
+
const addedColumns = getAddedItems(this.#selectedColumns, newSelectedColumns, columnDescriptorComparator);
|
|
41
|
+
if (addedColumns.length > 0) if (1 == addedColumns.length) return void this.addItemToSelectedColumns(addedColumns[0].name, source);
|
|
42
|
+
else throw Error("[ColumnModel] addRemoveOrReorderSelectedColumns attempt to add multiple selected columns in a single call");
|
|
43
|
+
const removedColumns = getRemovedItems(this.#selectedColumns, newSelectedColumns, columnDescriptorComparator);
|
|
44
|
+
if (removedColumns.length > 0) if (1 == removedColumns.length) return void this.removeItemFromSelectedColumns(removedColumns[0].name, source);
|
|
45
|
+
else throw Error("[ColumnModel] addRemoveOrReorderSelectedColumns attempt to remove multiple selected columns in a single call");
|
|
46
|
+
this.reorderSelectedColumns(newSelectedColumns.map(({ name })=>name), source);
|
|
47
|
+
}
|
|
59
48
|
addItemToSelectedColumns(name, source) {
|
|
60
49
|
const column = this.allColumns.find((col)=>col.name === name);
|
|
61
50
|
if (column) {
|
|
@@ -97,7 +86,7 @@ class ColumnModel extends EventEmitter {
|
|
|
97
86
|
}
|
|
98
87
|
addColumn(column, addToSelectedColumns = false) {
|
|
99
88
|
console.log(`[ColumnModel] add column ${JSON.stringify(column)}`);
|
|
100
|
-
if (addToSelectedColumns) console.log("add it to selected
|
|
89
|
+
if (addToSelectedColumns) console.log("add it to selected columns");
|
|
101
90
|
this.allColumns = this.allColumns.concat(column);
|
|
102
91
|
this.#selectedColumns = this.#selectedColumns.concat(column);
|
|
103
92
|
this.notifyListeners(this.#selectedColumns, "column-picker", {
|
|
@@ -1,94 +1,8 @@
|
|
|
1
1
|
const css = `
|
|
2
2
|
.vuuColumnPicker {
|
|
3
|
-
--label-margin-left: 0px;
|
|
4
|
-
--columnpicker-background: var(--vuuColumnPicker-background, var(--salt-container-primary-background));
|
|
5
|
-
background: var(--columnpicker-background);
|
|
6
|
-
gap: var(--salt-spacing-300);
|
|
7
|
-
height: var(--vuuColumnPicker-height, 100%);
|
|
8
|
-
padding: var(--salt-spacing-300) 0;
|
|
9
|
-
flex-direction: column;
|
|
10
|
-
display: flex;
|
|
11
|
-
overflow: hidden;
|
|
12
|
-
container-type: inline-size;
|
|
13
|
-
|
|
14
3
|
&.vuuColumnPicker-withCalculated {
|
|
15
4
|
--label-margin-left: 8px;
|
|
16
5
|
}
|
|
17
|
-
|
|
18
|
-
& .saltListBox {
|
|
19
|
-
background-color: inherit;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
& .saltOption {
|
|
23
|
-
background-color: inherit;
|
|
24
|
-
border-bottom: var(--vuuColumnListItem-border, solid) 1px
|
|
25
|
-
var(--salt-separable-tertiary-borderColor);
|
|
26
|
-
align-items: center;
|
|
27
|
-
gap: var(--salt-spacing-200);
|
|
28
|
-
height: calc(var(--salt-size-base) + var(--salt-spacing-200));
|
|
29
|
-
|
|
30
|
-
& .vuuIcon {
|
|
31
|
-
--vuu-icon-color: var(--salt-content-secondary-foreground);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
& .vuuCalculatedColumnIcon {
|
|
35
|
-
--vuu-icon-color: var(--salt-content-secondary-foreground);
|
|
36
|
-
position: absolute;
|
|
37
|
-
top: 8px;
|
|
38
|
-
left: 32px;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
& .vuuHighlight {
|
|
42
|
-
color: var(--vuu-color-blue-40);
|
|
43
|
-
text-decoration: underline;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
& .vuuColumnPicker-text {
|
|
47
|
-
margin-left: var(--label-margin-left);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
& .vuuColumnPickerListItem-action {
|
|
52
|
-
visibility: hidden;
|
|
53
|
-
margin-left: auto;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
& .saltOption:hover {
|
|
57
|
-
& .vuuColumnPickerListItem-action {
|
|
58
|
-
visibility: visible;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
& .vuuColumnPicker-search {
|
|
63
|
-
--saltInput-paddingLeft: var(--salt-spacing-300);
|
|
64
|
-
padding: var(--salt-spacing-200) var(--salt-spacing-300) 0 var(--salt-spacing-300);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
& .vuuColumnPicker-scrollContainer {
|
|
68
|
-
flex: 1 1 0;
|
|
69
|
-
overflow: auto;
|
|
70
|
-
|
|
71
|
-
& .vuuColumnPicker-sectionHeader {
|
|
72
|
-
background: var(--columnpicker-background);
|
|
73
|
-
height: 32px;
|
|
74
|
-
padding: 0 var(--salt-spacing-300);
|
|
75
|
-
z-index: 1;
|
|
76
|
-
align-items: center;
|
|
77
|
-
display: flex;
|
|
78
|
-
position: sticky;
|
|
79
|
-
top: 0;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
& .vuuColumnPicker-availableHeader {
|
|
83
|
-
top: 32px;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
& .vuuColumnPicker-availableList {
|
|
87
|
-
& .saltOption {
|
|
88
|
-
padding-left: var(--salt-spacing-300);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
6
|
}
|
|
93
7
|
|
|
94
8
|
|