@deephaven/iris-grid 0.46.1-beta.0 → 0.46.1-beta.4
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/dist/AdvancedFilterCreator.js +122 -102
- package/dist/AdvancedFilterCreator.js.map +1 -1
- package/dist/AdvancedFilterCreatorFilterItem.js +47 -38
- package/dist/AdvancedFilterCreatorFilterItem.js.map +1 -1
- package/dist/AdvancedFilterCreatorSelectValue.js +52 -40
- package/dist/AdvancedFilterCreatorSelectValue.js.map +1 -1
- package/dist/AdvancedFilterCreatorSelectValueList.js +35 -28
- package/dist/AdvancedFilterCreatorSelectValueList.js.map +1 -1
- package/dist/ColumnStatistics.js +74 -54
- package/dist/ColumnStatistics.js.map +1 -1
- package/dist/CrossColumnSearch.js +113 -90
- package/dist/CrossColumnSearch.js.map +1 -1
- package/dist/FilterInputField.js +42 -35
- package/dist/FilterInputField.js.map +1 -1
- package/dist/GotoRow.js +226 -193
- package/dist/GotoRow.js.map +1 -1
- package/dist/IrisGrid.js +371 -344
- package/dist/IrisGrid.js.map +1 -1
- package/dist/IrisGridBottomBar.js +11 -8
- package/dist/IrisGridBottomBar.js.map +1 -1
- package/dist/IrisGridCellOverflowModal.js +56 -50
- package/dist/IrisGridCellOverflowModal.js.map +1 -1
- package/dist/IrisGridCopyHandler.js +34 -24
- package/dist/IrisGridCopyHandler.js.map +1 -1
- package/dist/IrisGridPartitionSelector.js +59 -46
- package/dist/IrisGridPartitionSelector.js.map +1 -1
- package/dist/PartitionSelectorSearch.js +43 -36
- package/dist/PartitionSelectorSearch.js.map +1 -1
- package/dist/PendingDataBottomBar.js +34 -22
- package/dist/PendingDataBottomBar.js.map +1 -1
- package/dist/ToastBottomBar.js +5 -3
- package/dist/ToastBottomBar.js.map +1 -1
- package/dist/format-context-menus/CustomFormatAction.js +34 -25
- package/dist/format-context-menus/CustomFormatAction.js.map +1 -1
- package/dist/format-context-menus/FormatContextMenuUtils.js +2 -1
- package/dist/format-context-menus/FormatContextMenuUtils.js.map +1 -1
- package/dist/mousehandlers/IrisGridContextMenuHandler.js +50 -36
- package/dist/mousehandlers/IrisGridContextMenuHandler.js.map +1 -1
- package/dist/sidebar/AdvancedSettingsMenu.js +2 -1
- package/dist/sidebar/AdvancedSettingsMenu.js.map +1 -1
- package/dist/sidebar/ChartBuilder.js +134 -107
- package/dist/sidebar/ChartBuilder.js.map +1 -1
- package/dist/sidebar/CustomColumnBuilder.js +70 -48
- package/dist/sidebar/CustomColumnBuilder.js.map +1 -1
- package/dist/sidebar/CustomColumnInput.js +66 -53
- package/dist/sidebar/CustomColumnInput.js.map +1 -1
- package/dist/sidebar/InputEditor.js +15 -11
- package/dist/sidebar/InputEditor.js.map +1 -1
- package/dist/sidebar/RollupRows.js +130 -103
- package/dist/sidebar/RollupRows.js.map +1 -1
- package/dist/sidebar/SelectDistinctBuilder.js +49 -39
- package/dist/sidebar/SelectDistinctBuilder.js.map +1 -1
- package/dist/sidebar/TableCsvExporter.js +178 -128
- package/dist/sidebar/TableCsvExporter.js.map +1 -1
- package/dist/sidebar/aggregations/AggregationEdit.js +67 -57
- package/dist/sidebar/aggregations/AggregationEdit.js.map +1 -1
- package/dist/sidebar/aggregations/Aggregations.js +86 -63
- package/dist/sidebar/aggregations/Aggregations.js.map +1 -1
- package/dist/sidebar/conditional-formatting/ColumnFormatEditor.js +30 -22
- package/dist/sidebar/conditional-formatting/ColumnFormatEditor.js.map +1 -1
- package/dist/sidebar/conditional-formatting/ConditionEditor.js +52 -47
- package/dist/sidebar/conditional-formatting/ConditionEditor.js.map +1 -1
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.js +52 -42
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.js.map +1 -1
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.js +90 -67
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.js.map +1 -1
- package/dist/sidebar/conditional-formatting/RowFormatEditor.js +30 -22
- package/dist/sidebar/conditional-formatting/RowFormatEditor.js.map +1 -1
- package/dist/sidebar/conditional-formatting/StyleEditor.js +70 -58
- package/dist/sidebar/conditional-formatting/StyleEditor.js.map +1 -1
- package/dist/sidebar/icons/BarIcon.js +21 -12
- package/dist/sidebar/icons/BarIcon.js.map +1 -1
- package/dist/sidebar/icons/FormatColumnWhereIcon.js +38 -30
- package/dist/sidebar/icons/FormatColumnWhereIcon.js.map +1 -1
- package/dist/sidebar/icons/FormatRowWhereIcon.js +32 -24
- package/dist/sidebar/icons/FormatRowWhereIcon.js.map +1 -1
- package/dist/sidebar/icons/HistogramIcon.js +21 -12
- package/dist/sidebar/icons/HistogramIcon.js.map +1 -1
- package/dist/sidebar/icons/LineIcon.js +24 -15
- package/dist/sidebar/icons/LineIcon.js.map +1 -1
- package/dist/sidebar/icons/PieIcon.js +21 -12
- package/dist/sidebar/icons/PieIcon.js.map +1 -1
- package/dist/sidebar/icons/ScatterIcon.js +71 -62
- package/dist/sidebar/icons/ScatterIcon.js.map +1 -1
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.js +129 -121
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.js.map +1 -1
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.js +121 -87
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.js.map +1 -1
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.js +40 -26
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.js.map +1 -1
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.js +17 -14
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.js.map +1 -1
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.js +34 -28
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.js.map +1 -1
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.js +2 -2
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.js.map +1 -1
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.js +8 -7
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.js.map +1 -1
- package/package.json +15 -15
|
@@ -2,28 +2,30 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
|
|
2
2
|
import { TableUtils } from '@deephaven/jsapi-utils';
|
|
3
3
|
import Log from '@deephaven/log';
|
|
4
4
|
import { StringCondition, DateCondition, getLabelForNumberCondition, getLabelForDateCondition, getLabelForStringCondition, NumberCondition, getDefaultConditionForType, getLabelForBooleanCondition, BooleanCondition, CharCondition, getLabelForCharCondition, isDateConditionValid, getDefaultValueForType } from "./ConditionalFormattingUtils.js";
|
|
5
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
6
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
5
7
|
var log = Log.module('ConditionEditor');
|
|
6
8
|
var DEFAULT_CALLBACK = () => undefined;
|
|
7
|
-
var numberConditionOptions = [NumberCondition.IS_EQUAL, NumberCondition.IS_NOT_EQUAL, NumberCondition.IS_BETWEEN, NumberCondition.GREATER_THAN, NumberCondition.GREATER_THAN_OR_EQUAL, NumberCondition.LESS_THAN, NumberCondition.LESS_THAN_OR_EQUAL, NumberCondition.IS_NULL, NumberCondition.IS_NOT_NULL].map(option => /*#__PURE__*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
},
|
|
11
|
-
var stringConditions = [StringCondition.IS_EXACTLY, StringCondition.IS_NOT_EXACTLY, StringCondition.CONTAINS, StringCondition.DOES_NOT_CONTAIN, StringCondition.STARTS_WITH, StringCondition.ENDS_WITH, StringCondition.IS_NULL, StringCondition.IS_NOT_NULL].map(option => /*#__PURE__*/
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
},
|
|
15
|
-
var dateConditions = [DateCondition.IS_EXACTLY, DateCondition.IS_NOT_EXACTLY, DateCondition.IS_BEFORE, DateCondition.IS_BEFORE_OR_EQUAL, DateCondition.IS_AFTER, DateCondition.IS_AFTER_OR_EQUAL, DateCondition.IS_NULL, DateCondition.IS_NOT_NULL].map(option => /*#__PURE__*/
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
},
|
|
19
|
-
var booleanConditions = [BooleanCondition.IS_TRUE, BooleanCondition.IS_FALSE, BooleanCondition.IS_NULL, BooleanCondition.IS_NOT_NULL].map(option => /*#__PURE__*/
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
},
|
|
23
|
-
var charConditions = [CharCondition.IS_EQUAL, CharCondition.IS_NOT_EQUAL, CharCondition.IS_NULL, CharCondition.IS_NOT_NULL].map(option => /*#__PURE__*/
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
},
|
|
9
|
+
var numberConditionOptions = [NumberCondition.IS_EQUAL, NumberCondition.IS_NOT_EQUAL, NumberCondition.IS_BETWEEN, NumberCondition.GREATER_THAN, NumberCondition.GREATER_THAN_OR_EQUAL, NumberCondition.LESS_THAN, NumberCondition.LESS_THAN_OR_EQUAL, NumberCondition.IS_NULL, NumberCondition.IS_NOT_NULL].map(option => /*#__PURE__*/_jsx("option", {
|
|
10
|
+
value: option,
|
|
11
|
+
children: getLabelForNumberCondition(option)
|
|
12
|
+
}, option));
|
|
13
|
+
var stringConditions = [StringCondition.IS_EXACTLY, StringCondition.IS_NOT_EXACTLY, StringCondition.CONTAINS, StringCondition.DOES_NOT_CONTAIN, StringCondition.STARTS_WITH, StringCondition.ENDS_WITH, StringCondition.IS_NULL, StringCondition.IS_NOT_NULL].map(option => /*#__PURE__*/_jsx("option", {
|
|
14
|
+
value: option,
|
|
15
|
+
children: getLabelForStringCondition(option)
|
|
16
|
+
}, option));
|
|
17
|
+
var dateConditions = [DateCondition.IS_EXACTLY, DateCondition.IS_NOT_EXACTLY, DateCondition.IS_BEFORE, DateCondition.IS_BEFORE_OR_EQUAL, DateCondition.IS_AFTER, DateCondition.IS_AFTER_OR_EQUAL, DateCondition.IS_NULL, DateCondition.IS_NOT_NULL].map(option => /*#__PURE__*/_jsx("option", {
|
|
18
|
+
value: option,
|
|
19
|
+
children: getLabelForDateCondition(option)
|
|
20
|
+
}, option));
|
|
21
|
+
var booleanConditions = [BooleanCondition.IS_TRUE, BooleanCondition.IS_FALSE, BooleanCondition.IS_NULL, BooleanCondition.IS_NOT_NULL].map(option => /*#__PURE__*/_jsx("option", {
|
|
22
|
+
value: option,
|
|
23
|
+
children: getLabelForBooleanCondition(option)
|
|
24
|
+
}, option));
|
|
25
|
+
var charConditions = [CharCondition.IS_EQUAL, CharCondition.IS_NOT_EQUAL, CharCondition.IS_NULL, CharCondition.IS_NOT_NULL].map(option => /*#__PURE__*/_jsx("option", {
|
|
26
|
+
value: option,
|
|
27
|
+
children: getLabelForCharCondition(option)
|
|
28
|
+
}, option));
|
|
27
29
|
function isNumberConditionValid(condition, value, startValue, endValue) {
|
|
28
30
|
if (condition === NumberCondition.IS_NULL || condition === NumberCondition.IS_NOT_NULL) {
|
|
29
31
|
return true;
|
|
@@ -44,7 +46,7 @@ function getNumberInputs(selectedCondition, handleValueChange, handleStartValueC
|
|
|
44
46
|
case NumberCondition.GREATER_THAN_OR_EQUAL:
|
|
45
47
|
case NumberCondition.LESS_THAN:
|
|
46
48
|
case NumberCondition.LESS_THAN_OR_EQUAL:
|
|
47
|
-
return /*#__PURE__*/
|
|
49
|
+
return /*#__PURE__*/_jsx("input", {
|
|
48
50
|
type: "number",
|
|
49
51
|
className: "form-control",
|
|
50
52
|
placeholder: "Enter value",
|
|
@@ -52,21 +54,22 @@ function getNumberInputs(selectedCondition, handleValueChange, handleStartValueC
|
|
|
52
54
|
onChange: handleValueChange
|
|
53
55
|
});
|
|
54
56
|
case NumberCondition.IS_BETWEEN:
|
|
55
|
-
return /*#__PURE__*/
|
|
56
|
-
className: "d-flex flex-row"
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
57
|
+
return /*#__PURE__*/_jsxs("div", {
|
|
58
|
+
className: "d-flex flex-row",
|
|
59
|
+
children: [/*#__PURE__*/_jsx("input", {
|
|
60
|
+
type: "number",
|
|
61
|
+
className: "form-control d-flex mr-2",
|
|
62
|
+
placeholder: "Start value",
|
|
63
|
+
value: startValue !== null && startValue !== void 0 ? startValue : '',
|
|
64
|
+
onChange: handleStartValueChange
|
|
65
|
+
}), /*#__PURE__*/_jsx("input", {
|
|
66
|
+
type: "number",
|
|
67
|
+
className: "form-control d-flex",
|
|
68
|
+
placeholder: "End value",
|
|
69
|
+
value: endValue !== null && endValue !== void 0 ? endValue : '',
|
|
70
|
+
onChange: handleEndValueChange
|
|
71
|
+
})]
|
|
72
|
+
});
|
|
70
73
|
case NumberCondition.IS_NULL:
|
|
71
74
|
case NumberCondition.IS_NOT_NULL:
|
|
72
75
|
return null;
|
|
@@ -78,7 +81,7 @@ function getStringInputs(selectedCondition, handleValueChange, conditionValue) {
|
|
|
78
81
|
case StringCondition.IS_NOT_NULL:
|
|
79
82
|
return null;
|
|
80
83
|
default:
|
|
81
|
-
return /*#__PURE__*/
|
|
84
|
+
return /*#__PURE__*/_jsx("input", {
|
|
82
85
|
type: "text",
|
|
83
86
|
className: "form-control",
|
|
84
87
|
placeholder: "Enter value",
|
|
@@ -93,7 +96,7 @@ function getDateInputs(selectedCondition, handleValueChange, conditionValue) {
|
|
|
93
96
|
case DateCondition.IS_NOT_NULL:
|
|
94
97
|
return null;
|
|
95
98
|
default:
|
|
96
|
-
return /*#__PURE__*/
|
|
99
|
+
return /*#__PURE__*/_jsx("input", {
|
|
97
100
|
type: "text",
|
|
98
101
|
className: "form-control",
|
|
99
102
|
placeholder: "Enter value",
|
|
@@ -111,7 +114,7 @@ function getCharInputs(selectedCondition, handleValueChange, conditionValue) {
|
|
|
111
114
|
case CharCondition.IS_NOT_NULL:
|
|
112
115
|
return null;
|
|
113
116
|
default:
|
|
114
|
-
return /*#__PURE__*/
|
|
117
|
+
return /*#__PURE__*/_jsx("input", {
|
|
115
118
|
type: "text",
|
|
116
119
|
className: "form-control",
|
|
117
120
|
maxLength: 1,
|
|
@@ -230,14 +233,16 @@ function ConditionEditor(props) {
|
|
|
230
233
|
return getBooleanInputs();
|
|
231
234
|
}
|
|
232
235
|
}, [selectedColumnType, selectedCondition, conditionValue, startValue, endValue, handleValueChange, handleStartValueChange, handleEndValueChange]);
|
|
233
|
-
return /*#__PURE__*/
|
|
234
|
-
className: "condition-editor mb-2"
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
236
|
+
return /*#__PURE__*/_jsxs("div", {
|
|
237
|
+
className: "condition-editor mb-2",
|
|
238
|
+
children: [/*#__PURE__*/_jsx("select", {
|
|
239
|
+
value: selectedCondition,
|
|
240
|
+
"data-testid": "condition-select",
|
|
241
|
+
className: "custom-select mb-2",
|
|
242
|
+
onChange: handleConditionChange,
|
|
243
|
+
children: conditions
|
|
244
|
+
}), conditionInputs]
|
|
245
|
+
});
|
|
241
246
|
}
|
|
242
247
|
export default ConditionEditor;
|
|
243
248
|
//# sourceMappingURL=ConditionEditor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConditionEditor.js","names":["React","useCallback","useEffect","useMemo","useState","TableUtils","Log","StringCondition","DateCondition","getLabelForNumberCondition","getLabelForDateCondition","getLabelForStringCondition","NumberCondition","getDefaultConditionForType","getLabelForBooleanCondition","BooleanCondition","CharCondition","getLabelForCharCondition","isDateConditionValid","getDefaultValueForType","log","module","DEFAULT_CALLBACK","undefined","numberConditionOptions","IS_EQUAL","IS_NOT_EQUAL","IS_BETWEEN","GREATER_THAN","GREATER_THAN_OR_EQUAL","LESS_THAN","LESS_THAN_OR_EQUAL","IS_NULL","IS_NOT_NULL","map","option","stringConditions","IS_EXACTLY","IS_NOT_EXACTLY","CONTAINS","DOES_NOT_CONTAIN","STARTS_WITH","ENDS_WITH","dateConditions","IS_BEFORE","IS_BEFORE_OR_EQUAL","IS_AFTER","IS_AFTER_OR_EQUAL","booleanConditions","IS_TRUE","IS_FALSE","charConditions","isNumberConditionValid","condition","value","startValue","endValue","Number","isNaN","parseFloat","getNumberInputs","selectedCondition","handleValueChange","handleStartValueChange","handleEndValueChange","conditionValue","getStringInputs","getDateInputs","getBooleanInputs","getCharInputs","ConditionEditor","props","column","config","dh","onChange","selectedColumnType","type","prevColumnType","setPrevColumnType","setCondition","setValue","setStartValue","start","setEndValue","end","conditions","isNumberType","isCharType","isStringType","isDateType","isBooleanType","handleConditionChange","e","target","debug","changeCondition","isValid","conditionInputs"],"sources":["../../../src/sidebar/conditional-formatting/ConditionEditor.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { TableUtils } from '@deephaven/jsapi-utils';\nimport type { dh as DhType } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport {\n StringCondition,\n DateCondition,\n getLabelForNumberCondition,\n getLabelForDateCondition,\n getLabelForStringCondition,\n NumberCondition,\n ModelColumn,\n ConditionConfig,\n getDefaultConditionForType,\n getLabelForBooleanCondition,\n BooleanCondition,\n CharCondition,\n getLabelForCharCondition,\n isDateConditionValid,\n getDefaultValueForType,\n} from './ConditionalFormattingUtils';\n\nconst log = Log.module('ConditionEditor');\n\nexport interface ConditionEditorProps {\n dh: DhType;\n column: ModelColumn;\n config: ConditionConfig;\n onChange?: (config: ConditionConfig, isValid: boolean) => void;\n}\n\nconst DEFAULT_CALLBACK = () => undefined;\n\nconst numberConditionOptions = [\n NumberCondition.IS_EQUAL,\n NumberCondition.IS_NOT_EQUAL,\n NumberCondition.IS_BETWEEN,\n NumberCondition.GREATER_THAN,\n NumberCondition.GREATER_THAN_OR_EQUAL,\n NumberCondition.LESS_THAN,\n NumberCondition.LESS_THAN_OR_EQUAL,\n NumberCondition.IS_NULL,\n NumberCondition.IS_NOT_NULL,\n].map(option => (\n <option key={option} value={option}>\n {getLabelForNumberCondition(option)}\n </option>\n));\n\nconst stringConditions = [\n StringCondition.IS_EXACTLY,\n StringCondition.IS_NOT_EXACTLY,\n StringCondition.CONTAINS,\n StringCondition.DOES_NOT_CONTAIN,\n StringCondition.STARTS_WITH,\n StringCondition.ENDS_WITH,\n StringCondition.IS_NULL,\n StringCondition.IS_NOT_NULL,\n].map(option => (\n <option key={option} value={option}>\n {getLabelForStringCondition(option)}\n </option>\n));\n\nconst dateConditions = [\n DateCondition.IS_EXACTLY,\n DateCondition.IS_NOT_EXACTLY,\n DateCondition.IS_BEFORE,\n DateCondition.IS_BEFORE_OR_EQUAL,\n DateCondition.IS_AFTER,\n DateCondition.IS_AFTER_OR_EQUAL,\n DateCondition.IS_NULL,\n DateCondition.IS_NOT_NULL,\n].map(option => (\n <option key={option} value={option}>\n {getLabelForDateCondition(option)}\n </option>\n));\n\nconst booleanConditions = [\n BooleanCondition.IS_TRUE,\n BooleanCondition.IS_FALSE,\n BooleanCondition.IS_NULL,\n BooleanCondition.IS_NOT_NULL,\n].map(option => (\n <option key={option} value={option}>\n {getLabelForBooleanCondition(option)}\n </option>\n));\n\nconst charConditions = [\n CharCondition.IS_EQUAL,\n CharCondition.IS_NOT_EQUAL,\n CharCondition.IS_NULL,\n CharCondition.IS_NOT_NULL,\n].map(option => (\n <option key={option} value={option}>\n {getLabelForCharCondition(option)}\n </option>\n));\n\nfunction isNumberConditionValid(\n condition: NumberCondition,\n value?: string,\n startValue?: string,\n endValue?: string\n) {\n if (\n condition === NumberCondition.IS_NULL ||\n condition === NumberCondition.IS_NOT_NULL\n ) {\n return true;\n }\n if (\n condition === NumberCondition.IS_BETWEEN &&\n startValue != null &&\n startValue !== '' &&\n !Number.isNaN(Number.parseFloat(startValue)) &&\n endValue != null &&\n endValue !== '' &&\n !Number.isNaN(Number.parseFloat(endValue))\n ) {\n return true;\n }\n if (\n condition !== NumberCondition.IS_BETWEEN &&\n value !== undefined &&\n value !== '' &&\n !Number.isNaN(Number.parseFloat(value))\n ) {\n return true;\n }\n return false;\n}\n\nfunction getNumberInputs(\n selectedCondition: NumberCondition,\n handleValueChange: (e: unknown) => void,\n handleStartValueChange: (e: unknown) => void,\n handleEndValueChange: (e: unknown) => void,\n conditionValue?: string,\n startValue?: string,\n endValue?: string\n) {\n switch (selectedCondition) {\n case NumberCondition.IS_EQUAL:\n case NumberCondition.IS_NOT_EQUAL:\n case NumberCondition.GREATER_THAN:\n case NumberCondition.GREATER_THAN_OR_EQUAL:\n case NumberCondition.LESS_THAN:\n case NumberCondition.LESS_THAN_OR_EQUAL:\n return (\n <input\n type=\"number\"\n className=\"form-control\"\n placeholder=\"Enter value\"\n value={conditionValue ?? ''}\n onChange={handleValueChange}\n />\n );\n case NumberCondition.IS_BETWEEN:\n return (\n <div className=\"d-flex flex-row\">\n <input\n type=\"number\"\n className=\"form-control d-flex mr-2\"\n placeholder=\"Start value\"\n value={startValue ?? ''}\n onChange={handleStartValueChange}\n />\n <input\n type=\"number\"\n className=\"form-control d-flex\"\n placeholder=\"End value\"\n value={endValue ?? ''}\n onChange={handleEndValueChange}\n />\n </div>\n );\n case NumberCondition.IS_NULL:\n case NumberCondition.IS_NOT_NULL:\n return null;\n }\n}\n\nfunction getStringInputs(\n selectedCondition: StringCondition,\n handleValueChange: (e: unknown) => void,\n conditionValue?: string\n) {\n switch (selectedCondition) {\n case StringCondition.IS_NULL:\n case StringCondition.IS_NOT_NULL:\n return null;\n default:\n return (\n <input\n type=\"text\"\n className=\"form-control\"\n placeholder=\"Enter value\"\n value={conditionValue ?? ''}\n onChange={handleValueChange}\n />\n );\n }\n}\n\nfunction getDateInputs(\n selectedCondition: DateCondition,\n handleValueChange: (e: unknown) => void,\n conditionValue?: string\n) {\n switch (selectedCondition) {\n case DateCondition.IS_NULL:\n case DateCondition.IS_NOT_NULL:\n return null;\n default:\n return (\n <input\n type=\"text\"\n className=\"form-control\"\n placeholder=\"Enter value\"\n value={conditionValue ?? ''}\n onChange={handleValueChange}\n />\n );\n }\n}\n\nfunction getBooleanInputs() {\n return null;\n}\n\nfunction getCharInputs(\n selectedCondition: CharCondition,\n handleValueChange: (e: unknown) => void,\n conditionValue?: string\n) {\n switch (selectedCondition) {\n case CharCondition.IS_NULL:\n case CharCondition.IS_NOT_NULL:\n return null;\n default:\n return (\n <input\n type=\"text\"\n className=\"form-control\"\n maxLength={1}\n placeholder=\"Enter value\"\n value={conditionValue ?? ''}\n onChange={handleValueChange}\n />\n );\n }\n}\n\nfunction ConditionEditor(props: ConditionEditorProps): JSX.Element {\n const { column, config, dh, onChange = DEFAULT_CALLBACK } = props;\n const selectedColumnType = column.type;\n const [prevColumnType, setPrevColumnType] = useState(selectedColumnType);\n const [selectedCondition, setCondition] = useState(config.condition);\n const [conditionValue, setValue] = useState(config.value);\n const [startValue, setStartValue] = useState(config.start);\n const [endValue, setEndValue] = useState(config.end);\n\n if (selectedColumnType !== prevColumnType) {\n // Column type changed, reset condition and value fields\n setCondition(getDefaultConditionForType(selectedColumnType));\n setValue(getDefaultValueForType(selectedColumnType));\n setStartValue(undefined);\n setEndValue(undefined);\n setPrevColumnType(selectedColumnType);\n }\n\n const conditions = useMemo(() => {\n if (selectedColumnType === undefined) {\n return [];\n }\n if (TableUtils.isNumberType(selectedColumnType)) {\n return numberConditionOptions;\n }\n if (TableUtils.isCharType(selectedColumnType)) {\n return charConditions;\n }\n if (TableUtils.isStringType(selectedColumnType)) {\n return stringConditions;\n }\n if (TableUtils.isDateType(selectedColumnType)) {\n return dateConditions;\n }\n if (TableUtils.isBooleanType(selectedColumnType)) {\n return booleanConditions;\n }\n }, [selectedColumnType]);\n\n const handleConditionChange = useCallback(e => {\n const { value } = e.target;\n log.debug('handleConditionChange', value);\n setCondition(value);\n }, []);\n\n const handleValueChange = useCallback(e => {\n const { value } = e.target;\n log.debug('handleValueChange', value);\n setValue(value);\n }, []);\n\n const handleStartValueChange = useCallback(e => {\n const { value } = e.target;\n log.debug('handleStartValueChange', value);\n setStartValue(value);\n }, []);\n\n const handleEndValueChange = useCallback(e => {\n const { value } = e.target;\n log.debug('handleEndValueChange', value);\n setEndValue(value);\n }, []);\n\n useEffect(\n function changeCondition() {\n let isValid = true;\n\n if (selectedCondition === undefined) {\n log.debug(\n 'Unable to create formatting rule. Condition is not selected.'\n );\n isValid = false;\n } else if (\n TableUtils.isNumberType(column.type) &&\n !isNumberConditionValid(\n selectedCondition as NumberCondition,\n conditionValue,\n startValue,\n endValue\n )\n ) {\n log.debug(\n 'Unable to create formatting rule. Invalid value',\n conditionValue\n );\n isValid = false;\n } else if (\n TableUtils.isDateType(column.type) &&\n !isDateConditionValid(\n dh,\n selectedCondition as DateCondition,\n conditionValue\n )\n ) {\n log.debug(\n 'Unable to create formatting rule. Invalid date condition',\n conditionValue\n );\n isValid = false;\n }\n\n onChange(\n {\n condition: selectedCondition,\n value: conditionValue,\n start: startValue,\n end: endValue,\n },\n isValid\n );\n },\n [\n onChange,\n column.type,\n dh,\n selectedCondition,\n conditionValue,\n startValue,\n endValue,\n ]\n );\n\n const conditionInputs = useMemo(() => {\n if (selectedColumnType === undefined) {\n // Column not selected\n return null;\n }\n if (TableUtils.isNumberType(selectedColumnType)) {\n return getNumberInputs(\n selectedCondition as NumberCondition,\n handleValueChange,\n handleStartValueChange,\n handleEndValueChange,\n conditionValue,\n startValue,\n endValue\n );\n }\n if (TableUtils.isCharType(selectedColumnType)) {\n return getCharInputs(\n selectedCondition as CharCondition,\n handleValueChange,\n conditionValue\n );\n }\n if (TableUtils.isStringType(selectedColumnType)) {\n return getStringInputs(\n selectedCondition as StringCondition,\n handleValueChange,\n conditionValue\n );\n }\n if (TableUtils.isDateType(selectedColumnType)) {\n return getDateInputs(\n selectedCondition as DateCondition,\n handleValueChange,\n conditionValue\n );\n }\n if (TableUtils.isBooleanType(selectedColumnType)) {\n return getBooleanInputs();\n }\n }, [\n selectedColumnType,\n selectedCondition,\n conditionValue,\n startValue,\n endValue,\n handleValueChange,\n handleStartValueChange,\n handleEndValueChange,\n ]);\n\n return (\n <div className=\"condition-editor mb-2\">\n <select\n value={selectedCondition}\n data-testid=\"condition-select\"\n className=\"custom-select mb-2\"\n onChange={handleConditionChange}\n >\n {conditions}\n </select>\n {conditionInputs}\n </div>\n );\n}\n\nexport default ConditionEditor;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AACxE,SAASC,UAAU,QAAQ,wBAAwB;AAEnD,OAAOC,GAAG,MAAM,gBAAgB;AAAC,SAE/BC,eAAe,EACfC,aAAa,EACbC,0BAA0B,EAC1BC,wBAAwB,EACxBC,0BAA0B,EAC1BC,eAAe,EAGfC,0BAA0B,EAC1BC,2BAA2B,EAC3BC,gBAAgB,EAChBC,aAAa,EACbC,wBAAwB,EACxBC,oBAAoB,EACpBC,sBAAsB;AAGxB,IAAMC,GAAG,GAAGd,GAAG,CAACe,MAAM,CAAC,iBAAiB,CAAC;AASzC,IAAMC,gBAAgB,GAAG,MAAMC,SAAS;AAExC,IAAMC,sBAAsB,GAAG,CAC7BZ,eAAe,CAACa,QAAQ,EACxBb,eAAe,CAACc,YAAY,EAC5Bd,eAAe,CAACe,UAAU,EAC1Bf,eAAe,CAACgB,YAAY,EAC5BhB,eAAe,CAACiB,qBAAqB,EACrCjB,eAAe,CAACkB,SAAS,EACzBlB,eAAe,CAACmB,kBAAkB,EAClCnB,eAAe,CAACoB,OAAO,EACvBpB,eAAe,CAACqB,WAAW,CAC5B,CAACC,GAAG,CAACC,MAAM,iBACV;EAAQ,GAAG,EAAEA,MAAO;EAAC,KAAK,EAAEA;AAAO,GAChC1B,0BAA0B,CAAC0B,MAAM,CAAC,CAEtC,CAAC;AAEF,IAAMC,gBAAgB,GAAG,CACvB7B,eAAe,CAAC8B,UAAU,EAC1B9B,eAAe,CAAC+B,cAAc,EAC9B/B,eAAe,CAACgC,QAAQ,EACxBhC,eAAe,CAACiC,gBAAgB,EAChCjC,eAAe,CAACkC,WAAW,EAC3BlC,eAAe,CAACmC,SAAS,EACzBnC,eAAe,CAACyB,OAAO,EACvBzB,eAAe,CAAC0B,WAAW,CAC5B,CAACC,GAAG,CAACC,MAAM,iBACV;EAAQ,GAAG,EAAEA,MAAO;EAAC,KAAK,EAAEA;AAAO,GAChCxB,0BAA0B,CAACwB,MAAM,CAAC,CAEtC,CAAC;AAEF,IAAMQ,cAAc,GAAG,CACrBnC,aAAa,CAAC6B,UAAU,EACxB7B,aAAa,CAAC8B,cAAc,EAC5B9B,aAAa,CAACoC,SAAS,EACvBpC,aAAa,CAACqC,kBAAkB,EAChCrC,aAAa,CAACsC,QAAQ,EACtBtC,aAAa,CAACuC,iBAAiB,EAC/BvC,aAAa,CAACwB,OAAO,EACrBxB,aAAa,CAACyB,WAAW,CAC1B,CAACC,GAAG,CAACC,MAAM,iBACV;EAAQ,GAAG,EAAEA,MAAO;EAAC,KAAK,EAAEA;AAAO,GAChCzB,wBAAwB,CAACyB,MAAM,CAAC,CAEpC,CAAC;AAEF,IAAMa,iBAAiB,GAAG,CACxBjC,gBAAgB,CAACkC,OAAO,EACxBlC,gBAAgB,CAACmC,QAAQ,EACzBnC,gBAAgB,CAACiB,OAAO,EACxBjB,gBAAgB,CAACkB,WAAW,CAC7B,CAACC,GAAG,CAACC,MAAM,iBACV;EAAQ,GAAG,EAAEA,MAAO;EAAC,KAAK,EAAEA;AAAO,GAChCrB,2BAA2B,CAACqB,MAAM,CAAC,CAEvC,CAAC;AAEF,IAAMgB,cAAc,GAAG,CACrBnC,aAAa,CAACS,QAAQ,EACtBT,aAAa,CAACU,YAAY,EAC1BV,aAAa,CAACgB,OAAO,EACrBhB,aAAa,CAACiB,WAAW,CAC1B,CAACC,GAAG,CAACC,MAAM,iBACV;EAAQ,GAAG,EAAEA,MAAO;EAAC,KAAK,EAAEA;AAAO,GAChClB,wBAAwB,CAACkB,MAAM,CAAC,CAEpC,CAAC;AAEF,SAASiB,sBAAsB,CAC7BC,SAA0B,EAC1BC,KAAc,EACdC,UAAmB,EACnBC,QAAiB,EACjB;EACA,IACEH,SAAS,KAAKzC,eAAe,CAACoB,OAAO,IACrCqB,SAAS,KAAKzC,eAAe,CAACqB,WAAW,EACzC;IACA,OAAO,IAAI;EACb;EACA,IACEoB,SAAS,KAAKzC,eAAe,CAACe,UAAU,IACxC4B,UAAU,IAAI,IAAI,IAClBA,UAAU,KAAK,EAAE,IACjB,CAACE,MAAM,CAACC,KAAK,CAACD,MAAM,CAACE,UAAU,CAACJ,UAAU,CAAC,CAAC,IAC5CC,QAAQ,IAAI,IAAI,IAChBA,QAAQ,KAAK,EAAE,IACf,CAACC,MAAM,CAACC,KAAK,CAACD,MAAM,CAACE,UAAU,CAACH,QAAQ,CAAC,CAAC,EAC1C;IACA,OAAO,IAAI;EACb;EACA,IACEH,SAAS,KAAKzC,eAAe,CAACe,UAAU,IACxC2B,KAAK,KAAK/B,SAAS,IACnB+B,KAAK,KAAK,EAAE,IACZ,CAACG,MAAM,CAACC,KAAK,CAACD,MAAM,CAACE,UAAU,CAACL,KAAK,CAAC,CAAC,EACvC;IACA,OAAO,IAAI;EACb;EACA,OAAO,KAAK;AACd;AAEA,SAASM,eAAe,CACtBC,iBAAkC,EAClCC,iBAAuC,EACvCC,sBAA4C,EAC5CC,oBAA0C,EAC1CC,cAAuB,EACvBV,UAAmB,EACnBC,QAAiB,EACjB;EACA,QAAQK,iBAAiB;IACvB,KAAKjD,eAAe,CAACa,QAAQ;IAC7B,KAAKb,eAAe,CAACc,YAAY;IACjC,KAAKd,eAAe,CAACgB,YAAY;IACjC,KAAKhB,eAAe,CAACiB,qBAAqB;IAC1C,KAAKjB,eAAe,CAACkB,SAAS;IAC9B,KAAKlB,eAAe,CAACmB,kBAAkB;MACrC,oBACE;QACE,IAAI,EAAC,QAAQ;QACb,SAAS,EAAC,cAAc;QACxB,WAAW,EAAC,aAAa;QACzB,KAAK,EAAEkC,cAAc,aAAdA,cAAc,cAAdA,cAAc,GAAI,EAAG;QAC5B,QAAQ,EAAEH;MAAkB,EAC5B;IAEN,KAAKlD,eAAe,CAACe,UAAU;MAC7B,oBACE;QAAK,SAAS,EAAC;MAAiB,gBAC9B;QACE,IAAI,EAAC,QAAQ;QACb,SAAS,EAAC,0BAA0B;QACpC,WAAW,EAAC,aAAa;QACzB,KAAK,EAAE4B,UAAU,aAAVA,UAAU,cAAVA,UAAU,GAAI,EAAG;QACxB,QAAQ,EAAEQ;MAAuB,EACjC,eACF;QACE,IAAI,EAAC,QAAQ;QACb,SAAS,EAAC,qBAAqB;QAC/B,WAAW,EAAC,WAAW;QACvB,KAAK,EAAEP,QAAQ,aAARA,QAAQ,cAARA,QAAQ,GAAI,EAAG;QACtB,QAAQ,EAAEQ;MAAqB,EAC/B,CACE;IAEV,KAAKpD,eAAe,CAACoB,OAAO;IAC5B,KAAKpB,eAAe,CAACqB,WAAW;MAC9B,OAAO,IAAI;EAAC;AAElB;AAEA,SAASiC,eAAe,CACtBL,iBAAkC,EAClCC,iBAAuC,EACvCG,cAAuB,EACvB;EACA,QAAQJ,iBAAiB;IACvB,KAAKtD,eAAe,CAACyB,OAAO;IAC5B,KAAKzB,eAAe,CAAC0B,WAAW;MAC9B,OAAO,IAAI;IACb;MACE,oBACE;QACE,IAAI,EAAC,MAAM;QACX,SAAS,EAAC,cAAc;QACxB,WAAW,EAAC,aAAa;QACzB,KAAK,EAAEgC,cAAc,aAAdA,cAAc,cAAdA,cAAc,GAAI,EAAG;QAC5B,QAAQ,EAAEH;MAAkB,EAC5B;EACF;AAER;AAEA,SAASK,aAAa,CACpBN,iBAAgC,EAChCC,iBAAuC,EACvCG,cAAuB,EACvB;EACA,QAAQJ,iBAAiB;IACvB,KAAKrD,aAAa,CAACwB,OAAO;IAC1B,KAAKxB,aAAa,CAACyB,WAAW;MAC5B,OAAO,IAAI;IACb;MACE,oBACE;QACE,IAAI,EAAC,MAAM;QACX,SAAS,EAAC,cAAc;QACxB,WAAW,EAAC,aAAa;QACzB,KAAK,EAAEgC,cAAc,aAAdA,cAAc,cAAdA,cAAc,GAAI,EAAG;QAC5B,QAAQ,EAAEH;MAAkB,EAC5B;EACF;AAER;AAEA,SAASM,gBAAgB,GAAG;EAC1B,OAAO,IAAI;AACb;AAEA,SAASC,aAAa,CACpBR,iBAAgC,EAChCC,iBAAuC,EACvCG,cAAuB,EACvB;EACA,QAAQJ,iBAAiB;IACvB,KAAK7C,aAAa,CAACgB,OAAO;IAC1B,KAAKhB,aAAa,CAACiB,WAAW;MAC5B,OAAO,IAAI;IACb;MACE,oBACE;QACE,IAAI,EAAC,MAAM;QACX,SAAS,EAAC,cAAc;QACxB,SAAS,EAAE,CAAE;QACb,WAAW,EAAC,aAAa;QACzB,KAAK,EAAEgC,cAAc,aAAdA,cAAc,cAAdA,cAAc,GAAI,EAAG;QAC5B,QAAQ,EAAEH;MAAkB,EAC5B;EACF;AAER;AAEA,SAASQ,eAAe,CAACC,KAA2B,EAAe;EACjE,IAAM;IAAEC,MAAM;IAAEC,MAAM;IAAEC,EAAE;IAAEC,QAAQ,GAAGrD;EAAiB,CAAC,GAAGiD,KAAK;EACjE,IAAMK,kBAAkB,GAAGJ,MAAM,CAACK,IAAI;EACtC,IAAM,CAACC,cAAc,EAAEC,iBAAiB,CAAC,GAAG3E,QAAQ,CAACwE,kBAAkB,CAAC;EACxE,IAAM,CAACf,iBAAiB,EAAEmB,YAAY,CAAC,GAAG5E,QAAQ,CAACqE,MAAM,CAACpB,SAAS,CAAC;EACpE,IAAM,CAACY,cAAc,EAAEgB,QAAQ,CAAC,GAAG7E,QAAQ,CAACqE,MAAM,CAACnB,KAAK,CAAC;EACzD,IAAM,CAACC,UAAU,EAAE2B,aAAa,CAAC,GAAG9E,QAAQ,CAACqE,MAAM,CAACU,KAAK,CAAC;EAC1D,IAAM,CAAC3B,QAAQ,EAAE4B,WAAW,CAAC,GAAGhF,QAAQ,CAACqE,MAAM,CAACY,GAAG,CAAC;EAEpD,IAAIT,kBAAkB,KAAKE,cAAc,EAAE;IACzC;IACAE,YAAY,CAACnE,0BAA0B,CAAC+D,kBAAkB,CAAC,CAAC;IAC5DK,QAAQ,CAAC9D,sBAAsB,CAACyD,kBAAkB,CAAC,CAAC;IACpDM,aAAa,CAAC3D,SAAS,CAAC;IACxB6D,WAAW,CAAC7D,SAAS,CAAC;IACtBwD,iBAAiB,CAACH,kBAAkB,CAAC;EACvC;EAEA,IAAMU,UAAU,GAAGnF,OAAO,CAAC,MAAM;IAC/B,IAAIyE,kBAAkB,KAAKrD,SAAS,EAAE;MACpC,OAAO,EAAE;IACX;IACA,IAAIlB,UAAU,CAACkF,YAAY,CAACX,kBAAkB,CAAC,EAAE;MAC/C,OAAOpD,sBAAsB;IAC/B;IACA,IAAInB,UAAU,CAACmF,UAAU,CAACZ,kBAAkB,CAAC,EAAE;MAC7C,OAAOzB,cAAc;IACvB;IACA,IAAI9C,UAAU,CAACoF,YAAY,CAACb,kBAAkB,CAAC,EAAE;MAC/C,OAAOxC,gBAAgB;IACzB;IACA,IAAI/B,UAAU,CAACqF,UAAU,CAACd,kBAAkB,CAAC,EAAE;MAC7C,OAAOjC,cAAc;IACvB;IACA,IAAItC,UAAU,CAACsF,aAAa,CAACf,kBAAkB,CAAC,EAAE;MAChD,OAAO5B,iBAAiB;IAC1B;EACF,CAAC,EAAE,CAAC4B,kBAAkB,CAAC,CAAC;EAExB,IAAMgB,qBAAqB,GAAG3F,WAAW,CAAC4F,CAAC,IAAI;IAC7C,IAAM;MAAEvC;IAAM,CAAC,GAAGuC,CAAC,CAACC,MAAM;IAC1B1E,GAAG,CAAC2E,KAAK,CAAC,uBAAuB,EAAEzC,KAAK,CAAC;IACzC0B,YAAY,CAAC1B,KAAK,CAAC;EACrB,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMQ,iBAAiB,GAAG7D,WAAW,CAAC4F,CAAC,IAAI;IACzC,IAAM;MAAEvC;IAAM,CAAC,GAAGuC,CAAC,CAACC,MAAM;IAC1B1E,GAAG,CAAC2E,KAAK,CAAC,mBAAmB,EAAEzC,KAAK,CAAC;IACrC2B,QAAQ,CAAC3B,KAAK,CAAC;EACjB,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMS,sBAAsB,GAAG9D,WAAW,CAAC4F,CAAC,IAAI;IAC9C,IAAM;MAAEvC;IAAM,CAAC,GAAGuC,CAAC,CAACC,MAAM;IAC1B1E,GAAG,CAAC2E,KAAK,CAAC,wBAAwB,EAAEzC,KAAK,CAAC;IAC1C4B,aAAa,CAAC5B,KAAK,CAAC;EACtB,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMU,oBAAoB,GAAG/D,WAAW,CAAC4F,CAAC,IAAI;IAC5C,IAAM;MAAEvC;IAAM,CAAC,GAAGuC,CAAC,CAACC,MAAM;IAC1B1E,GAAG,CAAC2E,KAAK,CAAC,sBAAsB,EAAEzC,KAAK,CAAC;IACxC8B,WAAW,CAAC9B,KAAK,CAAC;EACpB,CAAC,EAAE,EAAE,CAAC;EAENpD,SAAS,CACP,SAAS8F,eAAe,GAAG;IACzB,IAAIC,OAAO,GAAG,IAAI;IAElB,IAAIpC,iBAAiB,KAAKtC,SAAS,EAAE;MACnCH,GAAG,CAAC2E,KAAK,CACP,8DAA8D,CAC/D;MACDE,OAAO,GAAG,KAAK;IACjB,CAAC,MAAM,IACL5F,UAAU,CAACkF,YAAY,CAACf,MAAM,CAACK,IAAI,CAAC,IACpC,CAACzB,sBAAsB,CACrBS,iBAAiB,EACjBI,cAAc,EACdV,UAAU,EACVC,QAAQ,CACT,EACD;MACApC,GAAG,CAAC2E,KAAK,CACP,iDAAiD,EACjD9B,cAAc,CACf;MACDgC,OAAO,GAAG,KAAK;IACjB,CAAC,MAAM,IACL5F,UAAU,CAACqF,UAAU,CAAClB,MAAM,CAACK,IAAI,CAAC,IAClC,CAAC3D,oBAAoB,CACnBwD,EAAE,EACFb,iBAAiB,EACjBI,cAAc,CACf,EACD;MACA7C,GAAG,CAAC2E,KAAK,CACP,0DAA0D,EAC1D9B,cAAc,CACf;MACDgC,OAAO,GAAG,KAAK;IACjB;IAEAtB,QAAQ,CACN;MACEtB,SAAS,EAAEQ,iBAAiB;MAC5BP,KAAK,EAAEW,cAAc;MACrBkB,KAAK,EAAE5B,UAAU;MACjB8B,GAAG,EAAE7B;IACP,CAAC,EACDyC,OAAO,CACR;EACH,CAAC,EACD,CACEtB,QAAQ,EACRH,MAAM,CAACK,IAAI,EACXH,EAAE,EACFb,iBAAiB,EACjBI,cAAc,EACdV,UAAU,EACVC,QAAQ,CACT,CACF;EAED,IAAM0C,eAAe,GAAG/F,OAAO,CAAC,MAAM;IACpC,IAAIyE,kBAAkB,KAAKrD,SAAS,EAAE;MACpC;MACA,OAAO,IAAI;IACb;IACA,IAAIlB,UAAU,CAACkF,YAAY,CAACX,kBAAkB,CAAC,EAAE;MAC/C,OAAOhB,eAAe,CACpBC,iBAAiB,EACjBC,iBAAiB,EACjBC,sBAAsB,EACtBC,oBAAoB,EACpBC,cAAc,EACdV,UAAU,EACVC,QAAQ,CACT;IACH;IACA,IAAInD,UAAU,CAACmF,UAAU,CAACZ,kBAAkB,CAAC,EAAE;MAC7C,OAAOP,aAAa,CAClBR,iBAAiB,EACjBC,iBAAiB,EACjBG,cAAc,CACf;IACH;IACA,IAAI5D,UAAU,CAACoF,YAAY,CAACb,kBAAkB,CAAC,EAAE;MAC/C,OAAOV,eAAe,CACpBL,iBAAiB,EACjBC,iBAAiB,EACjBG,cAAc,CACf;IACH;IACA,IAAI5D,UAAU,CAACqF,UAAU,CAACd,kBAAkB,CAAC,EAAE;MAC7C,OAAOT,aAAa,CAClBN,iBAAiB,EACjBC,iBAAiB,EACjBG,cAAc,CACf;IACH;IACA,IAAI5D,UAAU,CAACsF,aAAa,CAACf,kBAAkB,CAAC,EAAE;MAChD,OAAOR,gBAAgB,EAAE;IAC3B;EACF,CAAC,EAAE,CACDQ,kBAAkB,EAClBf,iBAAiB,EACjBI,cAAc,EACdV,UAAU,EACVC,QAAQ,EACRM,iBAAiB,EACjBC,sBAAsB,EACtBC,oBAAoB,CACrB,CAAC;EAEF,oBACE;IAAK,SAAS,EAAC;EAAuB,gBACpC;IACE,KAAK,EAAEH,iBAAkB;IACzB,eAAY,kBAAkB;IAC9B,SAAS,EAAC,oBAAoB;IAC9B,QAAQ,EAAE+B;EAAsB,GAE/BN,UAAU,CACJ,EACRY,eAAe,CACZ;AAEV;AAEA,eAAe5B,eAAe"}
|
|
1
|
+
{"version":3,"file":"ConditionEditor.js","names":["React","useCallback","useEffect","useMemo","useState","TableUtils","Log","StringCondition","DateCondition","getLabelForNumberCondition","getLabelForDateCondition","getLabelForStringCondition","NumberCondition","getDefaultConditionForType","getLabelForBooleanCondition","BooleanCondition","CharCondition","getLabelForCharCondition","isDateConditionValid","getDefaultValueForType","log","module","DEFAULT_CALLBACK","undefined","numberConditionOptions","IS_EQUAL","IS_NOT_EQUAL","IS_BETWEEN","GREATER_THAN","GREATER_THAN_OR_EQUAL","LESS_THAN","LESS_THAN_OR_EQUAL","IS_NULL","IS_NOT_NULL","map","option","stringConditions","IS_EXACTLY","IS_NOT_EXACTLY","CONTAINS","DOES_NOT_CONTAIN","STARTS_WITH","ENDS_WITH","dateConditions","IS_BEFORE","IS_BEFORE_OR_EQUAL","IS_AFTER","IS_AFTER_OR_EQUAL","booleanConditions","IS_TRUE","IS_FALSE","charConditions","isNumberConditionValid","condition","value","startValue","endValue","Number","isNaN","parseFloat","getNumberInputs","selectedCondition","handleValueChange","handleStartValueChange","handleEndValueChange","conditionValue","getStringInputs","getDateInputs","getBooleanInputs","getCharInputs","ConditionEditor","props","column","config","dh","onChange","selectedColumnType","type","prevColumnType","setPrevColumnType","setCondition","setValue","setStartValue","start","setEndValue","end","conditions","isNumberType","isCharType","isStringType","isDateType","isBooleanType","handleConditionChange","e","target","debug","changeCondition","isValid","conditionInputs"],"sources":["../../../src/sidebar/conditional-formatting/ConditionEditor.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { TableUtils } from '@deephaven/jsapi-utils';\nimport type { dh as DhType } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport {\n StringCondition,\n DateCondition,\n getLabelForNumberCondition,\n getLabelForDateCondition,\n getLabelForStringCondition,\n NumberCondition,\n ModelColumn,\n ConditionConfig,\n getDefaultConditionForType,\n getLabelForBooleanCondition,\n BooleanCondition,\n CharCondition,\n getLabelForCharCondition,\n isDateConditionValid,\n getDefaultValueForType,\n} from './ConditionalFormattingUtils';\n\nconst log = Log.module('ConditionEditor');\n\nexport interface ConditionEditorProps {\n dh: DhType;\n column: ModelColumn;\n config: ConditionConfig;\n onChange?: (config: ConditionConfig, isValid: boolean) => void;\n}\n\nconst DEFAULT_CALLBACK = () => undefined;\n\nconst numberConditionOptions = [\n NumberCondition.IS_EQUAL,\n NumberCondition.IS_NOT_EQUAL,\n NumberCondition.IS_BETWEEN,\n NumberCondition.GREATER_THAN,\n NumberCondition.GREATER_THAN_OR_EQUAL,\n NumberCondition.LESS_THAN,\n NumberCondition.LESS_THAN_OR_EQUAL,\n NumberCondition.IS_NULL,\n NumberCondition.IS_NOT_NULL,\n].map(option => (\n <option key={option} value={option}>\n {getLabelForNumberCondition(option)}\n </option>\n));\n\nconst stringConditions = [\n StringCondition.IS_EXACTLY,\n StringCondition.IS_NOT_EXACTLY,\n StringCondition.CONTAINS,\n StringCondition.DOES_NOT_CONTAIN,\n StringCondition.STARTS_WITH,\n StringCondition.ENDS_WITH,\n StringCondition.IS_NULL,\n StringCondition.IS_NOT_NULL,\n].map(option => (\n <option key={option} value={option}>\n {getLabelForStringCondition(option)}\n </option>\n));\n\nconst dateConditions = [\n DateCondition.IS_EXACTLY,\n DateCondition.IS_NOT_EXACTLY,\n DateCondition.IS_BEFORE,\n DateCondition.IS_BEFORE_OR_EQUAL,\n DateCondition.IS_AFTER,\n DateCondition.IS_AFTER_OR_EQUAL,\n DateCondition.IS_NULL,\n DateCondition.IS_NOT_NULL,\n].map(option => (\n <option key={option} value={option}>\n {getLabelForDateCondition(option)}\n </option>\n));\n\nconst booleanConditions = [\n BooleanCondition.IS_TRUE,\n BooleanCondition.IS_FALSE,\n BooleanCondition.IS_NULL,\n BooleanCondition.IS_NOT_NULL,\n].map(option => (\n <option key={option} value={option}>\n {getLabelForBooleanCondition(option)}\n </option>\n));\n\nconst charConditions = [\n CharCondition.IS_EQUAL,\n CharCondition.IS_NOT_EQUAL,\n CharCondition.IS_NULL,\n CharCondition.IS_NOT_NULL,\n].map(option => (\n <option key={option} value={option}>\n {getLabelForCharCondition(option)}\n </option>\n));\n\nfunction isNumberConditionValid(\n condition: NumberCondition,\n value?: string,\n startValue?: string,\n endValue?: string\n) {\n if (\n condition === NumberCondition.IS_NULL ||\n condition === NumberCondition.IS_NOT_NULL\n ) {\n return true;\n }\n if (\n condition === NumberCondition.IS_BETWEEN &&\n startValue != null &&\n startValue !== '' &&\n !Number.isNaN(Number.parseFloat(startValue)) &&\n endValue != null &&\n endValue !== '' &&\n !Number.isNaN(Number.parseFloat(endValue))\n ) {\n return true;\n }\n if (\n condition !== NumberCondition.IS_BETWEEN &&\n value !== undefined &&\n value !== '' &&\n !Number.isNaN(Number.parseFloat(value))\n ) {\n return true;\n }\n return false;\n}\n\nfunction getNumberInputs(\n selectedCondition: NumberCondition,\n handleValueChange: (e: unknown) => void,\n handleStartValueChange: (e: unknown) => void,\n handleEndValueChange: (e: unknown) => void,\n conditionValue?: string,\n startValue?: string,\n endValue?: string\n) {\n switch (selectedCondition) {\n case NumberCondition.IS_EQUAL:\n case NumberCondition.IS_NOT_EQUAL:\n case NumberCondition.GREATER_THAN:\n case NumberCondition.GREATER_THAN_OR_EQUAL:\n case NumberCondition.LESS_THAN:\n case NumberCondition.LESS_THAN_OR_EQUAL:\n return (\n <input\n type=\"number\"\n className=\"form-control\"\n placeholder=\"Enter value\"\n value={conditionValue ?? ''}\n onChange={handleValueChange}\n />\n );\n case NumberCondition.IS_BETWEEN:\n return (\n <div className=\"d-flex flex-row\">\n <input\n type=\"number\"\n className=\"form-control d-flex mr-2\"\n placeholder=\"Start value\"\n value={startValue ?? ''}\n onChange={handleStartValueChange}\n />\n <input\n type=\"number\"\n className=\"form-control d-flex\"\n placeholder=\"End value\"\n value={endValue ?? ''}\n onChange={handleEndValueChange}\n />\n </div>\n );\n case NumberCondition.IS_NULL:\n case NumberCondition.IS_NOT_NULL:\n return null;\n }\n}\n\nfunction getStringInputs(\n selectedCondition: StringCondition,\n handleValueChange: (e: unknown) => void,\n conditionValue?: string\n) {\n switch (selectedCondition) {\n case StringCondition.IS_NULL:\n case StringCondition.IS_NOT_NULL:\n return null;\n default:\n return (\n <input\n type=\"text\"\n className=\"form-control\"\n placeholder=\"Enter value\"\n value={conditionValue ?? ''}\n onChange={handleValueChange}\n />\n );\n }\n}\n\nfunction getDateInputs(\n selectedCondition: DateCondition,\n handleValueChange: (e: unknown) => void,\n conditionValue?: string\n) {\n switch (selectedCondition) {\n case DateCondition.IS_NULL:\n case DateCondition.IS_NOT_NULL:\n return null;\n default:\n return (\n <input\n type=\"text\"\n className=\"form-control\"\n placeholder=\"Enter value\"\n value={conditionValue ?? ''}\n onChange={handleValueChange}\n />\n );\n }\n}\n\nfunction getBooleanInputs() {\n return null;\n}\n\nfunction getCharInputs(\n selectedCondition: CharCondition,\n handleValueChange: (e: unknown) => void,\n conditionValue?: string\n) {\n switch (selectedCondition) {\n case CharCondition.IS_NULL:\n case CharCondition.IS_NOT_NULL:\n return null;\n default:\n return (\n <input\n type=\"text\"\n className=\"form-control\"\n maxLength={1}\n placeholder=\"Enter value\"\n value={conditionValue ?? ''}\n onChange={handleValueChange}\n />\n );\n }\n}\n\nfunction ConditionEditor(props: ConditionEditorProps): JSX.Element {\n const { column, config, dh, onChange = DEFAULT_CALLBACK } = props;\n const selectedColumnType = column.type;\n const [prevColumnType, setPrevColumnType] = useState(selectedColumnType);\n const [selectedCondition, setCondition] = useState(config.condition);\n const [conditionValue, setValue] = useState(config.value);\n const [startValue, setStartValue] = useState(config.start);\n const [endValue, setEndValue] = useState(config.end);\n\n if (selectedColumnType !== prevColumnType) {\n // Column type changed, reset condition and value fields\n setCondition(getDefaultConditionForType(selectedColumnType));\n setValue(getDefaultValueForType(selectedColumnType));\n setStartValue(undefined);\n setEndValue(undefined);\n setPrevColumnType(selectedColumnType);\n }\n\n const conditions = useMemo(() => {\n if (selectedColumnType === undefined) {\n return [];\n }\n if (TableUtils.isNumberType(selectedColumnType)) {\n return numberConditionOptions;\n }\n if (TableUtils.isCharType(selectedColumnType)) {\n return charConditions;\n }\n if (TableUtils.isStringType(selectedColumnType)) {\n return stringConditions;\n }\n if (TableUtils.isDateType(selectedColumnType)) {\n return dateConditions;\n }\n if (TableUtils.isBooleanType(selectedColumnType)) {\n return booleanConditions;\n }\n }, [selectedColumnType]);\n\n const handleConditionChange = useCallback(e => {\n const { value } = e.target;\n log.debug('handleConditionChange', value);\n setCondition(value);\n }, []);\n\n const handleValueChange = useCallback(e => {\n const { value } = e.target;\n log.debug('handleValueChange', value);\n setValue(value);\n }, []);\n\n const handleStartValueChange = useCallback(e => {\n const { value } = e.target;\n log.debug('handleStartValueChange', value);\n setStartValue(value);\n }, []);\n\n const handleEndValueChange = useCallback(e => {\n const { value } = e.target;\n log.debug('handleEndValueChange', value);\n setEndValue(value);\n }, []);\n\n useEffect(\n function changeCondition() {\n let isValid = true;\n\n if (selectedCondition === undefined) {\n log.debug(\n 'Unable to create formatting rule. Condition is not selected.'\n );\n isValid = false;\n } else if (\n TableUtils.isNumberType(column.type) &&\n !isNumberConditionValid(\n selectedCondition as NumberCondition,\n conditionValue,\n startValue,\n endValue\n )\n ) {\n log.debug(\n 'Unable to create formatting rule. Invalid value',\n conditionValue\n );\n isValid = false;\n } else if (\n TableUtils.isDateType(column.type) &&\n !isDateConditionValid(\n dh,\n selectedCondition as DateCondition,\n conditionValue\n )\n ) {\n log.debug(\n 'Unable to create formatting rule. Invalid date condition',\n conditionValue\n );\n isValid = false;\n }\n\n onChange(\n {\n condition: selectedCondition,\n value: conditionValue,\n start: startValue,\n end: endValue,\n },\n isValid\n );\n },\n [\n onChange,\n column.type,\n dh,\n selectedCondition,\n conditionValue,\n startValue,\n endValue,\n ]\n );\n\n const conditionInputs = useMemo(() => {\n if (selectedColumnType === undefined) {\n // Column not selected\n return null;\n }\n if (TableUtils.isNumberType(selectedColumnType)) {\n return getNumberInputs(\n selectedCondition as NumberCondition,\n handleValueChange,\n handleStartValueChange,\n handleEndValueChange,\n conditionValue,\n startValue,\n endValue\n );\n }\n if (TableUtils.isCharType(selectedColumnType)) {\n return getCharInputs(\n selectedCondition as CharCondition,\n handleValueChange,\n conditionValue\n );\n }\n if (TableUtils.isStringType(selectedColumnType)) {\n return getStringInputs(\n selectedCondition as StringCondition,\n handleValueChange,\n conditionValue\n );\n }\n if (TableUtils.isDateType(selectedColumnType)) {\n return getDateInputs(\n selectedCondition as DateCondition,\n handleValueChange,\n conditionValue\n );\n }\n if (TableUtils.isBooleanType(selectedColumnType)) {\n return getBooleanInputs();\n }\n }, [\n selectedColumnType,\n selectedCondition,\n conditionValue,\n startValue,\n endValue,\n handleValueChange,\n handleStartValueChange,\n handleEndValueChange,\n ]);\n\n return (\n <div className=\"condition-editor mb-2\">\n <select\n value={selectedCondition}\n data-testid=\"condition-select\"\n className=\"custom-select mb-2\"\n onChange={handleConditionChange}\n >\n {conditions}\n </select>\n {conditionInputs}\n </div>\n );\n}\n\nexport default ConditionEditor;\n"],"mappings":"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"}
|
|
@@ -7,14 +7,16 @@ import ColumnFormatEditor from "./ColumnFormatEditor.js";
|
|
|
7
7
|
import RowFormatEditor from "./RowFormatEditor.js";
|
|
8
8
|
import { FormatterType, isSupportedColumn } from "./ConditionalFormattingUtils.js";
|
|
9
9
|
import "./ConditionalFormatEditor.css";
|
|
10
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
11
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
10
12
|
var log = Log.module('ConditionalFormatEditor');
|
|
11
13
|
var DEFAULT_CALLBACK = () => undefined;
|
|
12
14
|
function getFormatterTypeIcon(option) {
|
|
13
15
|
switch (option) {
|
|
14
16
|
case FormatterType.CONDITIONAL:
|
|
15
|
-
return /*#__PURE__*/
|
|
17
|
+
return /*#__PURE__*/_jsx(FormatColumnWhereIcon, {});
|
|
16
18
|
case FormatterType.ROWS:
|
|
17
|
-
return /*#__PURE__*/
|
|
19
|
+
return /*#__PURE__*/_jsx(FormatRowWhereIcon, {});
|
|
18
20
|
}
|
|
19
21
|
}
|
|
20
22
|
function getFormatterTypeLabel(option) {
|
|
@@ -64,46 +66,54 @@ function ConditionalFormatEditor(props) {
|
|
|
64
66
|
setIsValid(isRuleValid);
|
|
65
67
|
onUpdate(isRuleValid ? updatedRule : undefined);
|
|
66
68
|
}, [onUpdate, selectedFormatter]);
|
|
67
|
-
return /*#__PURE__*/
|
|
68
|
-
className: "conditional-format-editor form"
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
69
|
+
return /*#__PURE__*/_jsxs("div", {
|
|
70
|
+
className: "conditional-format-editor form",
|
|
71
|
+
children: [/*#__PURE__*/_jsxs("div", {
|
|
72
|
+
className: "mb-2",
|
|
73
|
+
children: [/*#__PURE__*/_jsx("label", {
|
|
74
|
+
className: "mb-0",
|
|
75
|
+
htmlFor: "formatter-select",
|
|
76
|
+
children: "Select Formatter"
|
|
77
|
+
}), /*#__PURE__*/_jsx("div", {
|
|
78
|
+
className: "formatter-list",
|
|
79
|
+
children: formatterTypes.map((type, index) => /*#__PURE__*/_jsx("div", {
|
|
80
|
+
className: "formatter-type",
|
|
81
|
+
children: /*#__PURE__*/_jsxs("button", {
|
|
82
|
+
type: "button",
|
|
83
|
+
className: classNames('btn', 'btn-icon', 'btn-formatter-type', {
|
|
84
|
+
active: type === selectedFormatter
|
|
85
|
+
}),
|
|
86
|
+
"data-index": index,
|
|
87
|
+
onClick: () => handleFormatterChange(type),
|
|
88
|
+
children: [getFormatterTypeIcon(type), getFormatterTypeLabel(type)]
|
|
89
|
+
})
|
|
90
|
+
}, type))
|
|
91
|
+
})]
|
|
92
|
+
}), selectedFormatter === FormatterType.CONDITIONAL && /*#__PURE__*/_jsx(ColumnFormatEditor, {
|
|
93
|
+
columns: columns,
|
|
94
|
+
dh: dh,
|
|
95
|
+
config: rule === null || rule === void 0 ? void 0 : rule.config,
|
|
96
|
+
onChange: handleRuleChange
|
|
97
|
+
}), selectedFormatter === FormatterType.ROWS && /*#__PURE__*/_jsx(RowFormatEditor, {
|
|
98
|
+
columns: columns,
|
|
99
|
+
config: rule === null || rule === void 0 ? void 0 : rule.config,
|
|
100
|
+
dh: dh,
|
|
101
|
+
onChange: handleRuleChange
|
|
102
|
+
}), /*#__PURE__*/_jsx("hr", {}), /*#__PURE__*/_jsxs("div", {
|
|
103
|
+
className: "d-flex justify-content-end my-3",
|
|
104
|
+
children: [/*#__PURE__*/_jsx(Button, {
|
|
105
|
+
kind: "secondary",
|
|
106
|
+
onClick: handleCancel,
|
|
107
|
+
className: "mr-2",
|
|
108
|
+
children: "Cancel"
|
|
109
|
+
}), /*#__PURE__*/_jsx(Button, {
|
|
110
|
+
kind: "primary",
|
|
111
|
+
onClick: handleSave,
|
|
112
|
+
disabled: rule === undefined || !isValid,
|
|
113
|
+
children: "Done"
|
|
114
|
+
})]
|
|
115
|
+
})]
|
|
116
|
+
});
|
|
107
117
|
}
|
|
108
118
|
export default ConditionalFormatEditor;
|
|
109
119
|
//# sourceMappingURL=ConditionalFormatEditor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConditionalFormatEditor.js","names":["React","useCallback","useState","classNames","Button","Log","FormatColumnWhereIcon","FormatRowWhereIcon","ColumnFormatEditor","RowFormatEditor","FormatterType","isSupportedColumn","log","module","DEFAULT_CALLBACK","undefined","getFormatterTypeIcon","option","CONDITIONAL","ROWS","getFormatterTypeLabel","formatterTypes","ConditionalFormatEditor","props","columns","originalColumns","dh","onSave","onUpdate","onCancel","rule","defaultRule","filter","selectedFormatter","setFormatter","type","setRule","isValid","setIsValid","handleCancel","handleSave","error","handleFormatterChange","value","debug","handleRuleChange","ruleConfig","isRuleValid","updatedRule","config","map","index","active"],"sources":["../../../src/sidebar/conditional-formatting/ConditionalFormatEditor.tsx"],"sourcesContent":["import React, { useCallback, useState } from 'react';\nimport classNames from 'classnames';\nimport { Button } from '@deephaven/components';\nimport type { dh as DhType } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport { FormatColumnWhereIcon, FormatRowWhereIcon } from '../icons';\nimport ColumnFormatEditor from './ColumnFormatEditor';\nimport RowFormatEditor from './RowFormatEditor';\nimport {\n BaseFormatConfig,\n FormatterType,\n FormattingRule,\n isSupportedColumn,\n ModelColumn,\n} from './ConditionalFormattingUtils';\nimport './ConditionalFormatEditor.scss';\n\nconst log = Log.module('ConditionalFormatEditor');\n\nexport type SaveCallback = (rule: FormattingRule) => void;\n\nexport type UpdateCallback = (rule?: FormattingRule) => void;\n\nexport type CancelCallback = () => void;\n\nexport interface ConditionalFormatEditorProps {\n dh: DhType;\n columns: readonly ModelColumn[];\n rule?: FormattingRule;\n onCancel?: CancelCallback;\n onSave?: SaveCallback;\n onUpdate?: UpdateCallback;\n}\n\nconst DEFAULT_CALLBACK = () => undefined;\n\nfunction getFormatterTypeIcon(option: FormatterType): JSX.Element | undefined {\n switch (option) {\n case FormatterType.CONDITIONAL:\n return <FormatColumnWhereIcon />;\n case FormatterType.ROWS:\n return <FormatRowWhereIcon />;\n }\n}\n\nfunction getFormatterTypeLabel(option: FormatterType): string {\n switch (option) {\n case FormatterType.CONDITIONAL:\n return 'Conditional';\n case FormatterType.ROWS:\n return 'Rows';\n }\n}\n\nconst formatterTypes = [FormatterType.CONDITIONAL, FormatterType.ROWS];\n\nfunction ConditionalFormatEditor(\n props: ConditionalFormatEditorProps\n): JSX.Element {\n const {\n columns: originalColumns,\n dh,\n onSave = DEFAULT_CALLBACK,\n onUpdate = DEFAULT_CALLBACK,\n onCancel = DEFAULT_CALLBACK,\n rule: defaultRule,\n } = props;\n\n const columns = originalColumns.filter(isSupportedColumn);\n\n const [selectedFormatter, setFormatter] = useState(\n defaultRule?.type ?? formatterTypes[0]\n );\n const [rule, setRule] = useState(defaultRule);\n const [isValid, setIsValid] = useState(false);\n\n const handleCancel = useCallback(() => {\n onCancel();\n }, [onCancel]);\n\n const handleSave = useCallback(() => {\n if (rule === undefined) {\n log.error('Rule is not defined.');\n return;\n }\n onSave(rule);\n }, [onSave, rule]);\n\n const handleFormatterChange = useCallback(value => {\n log.debug('handleFormatterChange', value);\n setFormatter(value);\n }, []);\n\n const handleRuleChange = useCallback(\n (ruleConfig, isRuleValid: boolean) => {\n log.debug('handleRuleChange', ruleConfig, isRuleValid, selectedFormatter);\n const updatedRule = {\n type: selectedFormatter,\n config: ruleConfig as BaseFormatConfig,\n };\n setRule(updatedRule);\n setIsValid(isRuleValid);\n onUpdate(isRuleValid ? updatedRule : undefined);\n },\n [onUpdate, selectedFormatter]\n );\n\n return (\n <div className=\"conditional-format-editor form\">\n <div className=\"mb-2\">\n <label className=\"mb-0\" htmlFor=\"formatter-select\">\n Select Formatter\n </label>\n\n <div className=\"formatter-list\">\n {formatterTypes.map((type, index) => (\n <div key={type} className=\"formatter-type\">\n <button\n type=\"button\"\n className={classNames('btn', 'btn-icon', 'btn-formatter-type', {\n active: type === selectedFormatter,\n })}\n data-index={index}\n onClick={() => handleFormatterChange(type)}\n >\n {getFormatterTypeIcon(type)}\n {getFormatterTypeLabel(type)}\n </button>\n </div>\n ))}\n </div>\n </div>\n {selectedFormatter === FormatterType.CONDITIONAL && (\n <ColumnFormatEditor\n columns={columns}\n dh={dh}\n config={rule?.config}\n onChange={handleRuleChange}\n />\n )}\n {selectedFormatter === FormatterType.ROWS && (\n <RowFormatEditor\n columns={columns}\n config={rule?.config}\n dh={dh}\n onChange={handleRuleChange}\n />\n )}\n <hr />\n <div className=\"d-flex justify-content-end my-3\">\n <Button kind=\"secondary\" onClick={handleCancel} className=\"mr-2\">\n Cancel\n </Button>\n <Button\n kind=\"primary\"\n onClick={handleSave}\n disabled={rule === undefined || !isValid}\n >\n Done\n </Button>\n </div>\n </div>\n );\n}\n\nexport default ConditionalFormatEditor;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AACpD,OAAOC,UAAU,MAAM,YAAY;AACnC,SAASC,MAAM,QAAQ,uBAAuB;AAE9C,OAAOC,GAAG,MAAM,gBAAgB;AAAC,SACxBC,qBAAqB,EAAEC,kBAAkB;AAAA,OAC3CC,kBAAkB;AAAA,OAClBC,eAAe;AAAA,SAGpBC,aAAa,EAEbC,iBAAiB;AAAA;AAKnB,IAAMC,GAAG,GAAGP,GAAG,CAACQ,MAAM,CAAC,yBAAyB,CAAC;AAiBjD,IAAMC,gBAAgB,GAAG,MAAMC,SAAS;AAExC,SAASC,oBAAoB,CAACC,MAAqB,EAA2B;EAC5E,QAAQA,MAAM;IACZ,KAAKP,aAAa,CAACQ,WAAW;MAC5B,oBAAO,
|
|
1
|
+
{"version":3,"file":"ConditionalFormatEditor.js","names":["React","useCallback","useState","classNames","Button","Log","FormatColumnWhereIcon","FormatRowWhereIcon","ColumnFormatEditor","RowFormatEditor","FormatterType","isSupportedColumn","log","module","DEFAULT_CALLBACK","undefined","getFormatterTypeIcon","option","CONDITIONAL","ROWS","getFormatterTypeLabel","formatterTypes","ConditionalFormatEditor","props","columns","originalColumns","dh","onSave","onUpdate","onCancel","rule","defaultRule","filter","selectedFormatter","setFormatter","type","setRule","isValid","setIsValid","handleCancel","handleSave","error","handleFormatterChange","value","debug","handleRuleChange","ruleConfig","isRuleValid","updatedRule","config","map","index","active"],"sources":["../../../src/sidebar/conditional-formatting/ConditionalFormatEditor.tsx"],"sourcesContent":["import React, { useCallback, useState } from 'react';\nimport classNames from 'classnames';\nimport { Button } from '@deephaven/components';\nimport type { dh as DhType } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport { FormatColumnWhereIcon, FormatRowWhereIcon } from '../icons';\nimport ColumnFormatEditor from './ColumnFormatEditor';\nimport RowFormatEditor from './RowFormatEditor';\nimport {\n BaseFormatConfig,\n FormatterType,\n FormattingRule,\n isSupportedColumn,\n ModelColumn,\n} from './ConditionalFormattingUtils';\nimport './ConditionalFormatEditor.scss';\n\nconst log = Log.module('ConditionalFormatEditor');\n\nexport type SaveCallback = (rule: FormattingRule) => void;\n\nexport type UpdateCallback = (rule?: FormattingRule) => void;\n\nexport type CancelCallback = () => void;\n\nexport interface ConditionalFormatEditorProps {\n dh: DhType;\n columns: readonly ModelColumn[];\n rule?: FormattingRule;\n onCancel?: CancelCallback;\n onSave?: SaveCallback;\n onUpdate?: UpdateCallback;\n}\n\nconst DEFAULT_CALLBACK = () => undefined;\n\nfunction getFormatterTypeIcon(option: FormatterType): JSX.Element | undefined {\n switch (option) {\n case FormatterType.CONDITIONAL:\n return <FormatColumnWhereIcon />;\n case FormatterType.ROWS:\n return <FormatRowWhereIcon />;\n }\n}\n\nfunction getFormatterTypeLabel(option: FormatterType): string {\n switch (option) {\n case FormatterType.CONDITIONAL:\n return 'Conditional';\n case FormatterType.ROWS:\n return 'Rows';\n }\n}\n\nconst formatterTypes = [FormatterType.CONDITIONAL, FormatterType.ROWS];\n\nfunction ConditionalFormatEditor(\n props: ConditionalFormatEditorProps\n): JSX.Element {\n const {\n columns: originalColumns,\n dh,\n onSave = DEFAULT_CALLBACK,\n onUpdate = DEFAULT_CALLBACK,\n onCancel = DEFAULT_CALLBACK,\n rule: defaultRule,\n } = props;\n\n const columns = originalColumns.filter(isSupportedColumn);\n\n const [selectedFormatter, setFormatter] = useState(\n defaultRule?.type ?? formatterTypes[0]\n );\n const [rule, setRule] = useState(defaultRule);\n const [isValid, setIsValid] = useState(false);\n\n const handleCancel = useCallback(() => {\n onCancel();\n }, [onCancel]);\n\n const handleSave = useCallback(() => {\n if (rule === undefined) {\n log.error('Rule is not defined.');\n return;\n }\n onSave(rule);\n }, [onSave, rule]);\n\n const handleFormatterChange = useCallback(value => {\n log.debug('handleFormatterChange', value);\n setFormatter(value);\n }, []);\n\n const handleRuleChange = useCallback(\n (ruleConfig, isRuleValid: boolean) => {\n log.debug('handleRuleChange', ruleConfig, isRuleValid, selectedFormatter);\n const updatedRule = {\n type: selectedFormatter,\n config: ruleConfig as BaseFormatConfig,\n };\n setRule(updatedRule);\n setIsValid(isRuleValid);\n onUpdate(isRuleValid ? updatedRule : undefined);\n },\n [onUpdate, selectedFormatter]\n );\n\n return (\n <div className=\"conditional-format-editor form\">\n <div className=\"mb-2\">\n <label className=\"mb-0\" htmlFor=\"formatter-select\">\n Select Formatter\n </label>\n\n <div className=\"formatter-list\">\n {formatterTypes.map((type, index) => (\n <div key={type} className=\"formatter-type\">\n <button\n type=\"button\"\n className={classNames('btn', 'btn-icon', 'btn-formatter-type', {\n active: type === selectedFormatter,\n })}\n data-index={index}\n onClick={() => handleFormatterChange(type)}\n >\n {getFormatterTypeIcon(type)}\n {getFormatterTypeLabel(type)}\n </button>\n </div>\n ))}\n </div>\n </div>\n {selectedFormatter === FormatterType.CONDITIONAL && (\n <ColumnFormatEditor\n columns={columns}\n dh={dh}\n config={rule?.config}\n onChange={handleRuleChange}\n />\n )}\n {selectedFormatter === FormatterType.ROWS && (\n <RowFormatEditor\n columns={columns}\n config={rule?.config}\n dh={dh}\n onChange={handleRuleChange}\n />\n )}\n <hr />\n <div className=\"d-flex justify-content-end my-3\">\n <Button kind=\"secondary\" onClick={handleCancel} className=\"mr-2\">\n Cancel\n </Button>\n <Button\n kind=\"primary\"\n onClick={handleSave}\n disabled={rule === undefined || !isValid}\n >\n Done\n </Button>\n </div>\n </div>\n );\n}\n\nexport default ConditionalFormatEditor;\n"],"mappings":"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"}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
function
|
|
1
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
2
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
3
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
4
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
5
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
2
6
|
import React, { useCallback } from 'react';
|
|
3
7
|
import { DragDropContext, Draggable, Droppable } from 'react-beautiful-dnd';
|
|
4
8
|
import classNames from 'classnames';
|
|
@@ -9,6 +13,8 @@ import { TableUtils } from '@deephaven/jsapi-utils';
|
|
|
9
13
|
import Log from '@deephaven/log';
|
|
10
14
|
import "./ConditionalFormattingMenu.css";
|
|
11
15
|
import { FormatterType, getBackgroundForStyleConfig, getColorForStyleConfig, getShortLabelForConditionType, NumberCondition, StringCondition, DateCondition } from "./ConditionalFormattingUtils.js";
|
|
16
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
17
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
12
18
|
var log = Log.module('ConditionalFormattingMenu');
|
|
13
19
|
var DEFAULT_CALLBACK = () => undefined;
|
|
14
20
|
function getRuleValue(config) {
|
|
@@ -79,72 +85,89 @@ function ConditionalFormattingMenu(props) {
|
|
|
79
85
|
}, [onChange, rules]);
|
|
80
86
|
|
|
81
87
|
// Display list of rules
|
|
82
|
-
return /*#__PURE__*/
|
|
83
|
-
className: "conditional-formatting-rules"
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
88
|
+
return /*#__PURE__*/_jsxs("div", {
|
|
89
|
+
className: "conditional-formatting-rules",
|
|
90
|
+
children: [/*#__PURE__*/_jsx(DragDropContext, {
|
|
91
|
+
onDragStart: DragUtils.startDragging,
|
|
92
|
+
onDragEnd: handleDragEnd,
|
|
93
|
+
children: /*#__PURE__*/_jsx(Droppable, {
|
|
94
|
+
droppableId: "droppable-custom-columns",
|
|
95
|
+
children: (provided, snapshot) => /*#__PURE__*/_jsxs("div", _objectSpread(_objectSpread({
|
|
96
|
+
ref: provided.innerRef
|
|
97
|
+
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
98
|
+
}, provided.droppableProps), {}, {
|
|
99
|
+
className: classNames('droppable-container', {
|
|
100
|
+
dragging: snapshot.draggingFromThisWith
|
|
101
|
+
}),
|
|
102
|
+
children: [rules.length === 0 && /*#__PURE__*/_jsx("div", {
|
|
103
|
+
className: "text-muted pl-2",
|
|
104
|
+
children: "No formats defined"
|
|
105
|
+
}), rules.map((rule, index) => /*#__PURE__*/_jsx(Draggable
|
|
106
|
+
// eslint-disable-next-line react/no-array-index-key
|
|
107
|
+
, {
|
|
108
|
+
draggableId: "".concat(index, "-").concat(rule.type),
|
|
109
|
+
index: index,
|
|
110
|
+
disableInteractiveElementBlocking: true,
|
|
111
|
+
children:
|
|
112
|
+
// eslint-disable-next-line @typescript-eslint/no-shadow
|
|
113
|
+
(provided, snapshot) => /*#__PURE__*/_jsx("div", _objectSpread(_objectSpread({
|
|
114
|
+
role: "menuitem",
|
|
115
|
+
tabIndex: 0,
|
|
116
|
+
onClick: e => handleRuleClick(e, rule, index),
|
|
117
|
+
className: classNames('draggable-container', {
|
|
118
|
+
dragging: snapshot.isDragging
|
|
119
|
+
}),
|
|
120
|
+
ref: provided.innerRef
|
|
121
|
+
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
122
|
+
}, provided.draggableProps), {}, {
|
|
123
|
+
children: /*#__PURE__*/_jsx("div", {
|
|
124
|
+
className: "conditional-formatting-list-item",
|
|
125
|
+
children: /*#__PURE__*/_jsxs("div", {
|
|
126
|
+
className: "formatting-item",
|
|
127
|
+
children: [/*#__PURE__*/_jsx("div", {
|
|
128
|
+
className: "rule-icon",
|
|
129
|
+
children: /*#__PURE__*/_jsx("span", {
|
|
130
|
+
className: "rule-icon-bg",
|
|
131
|
+
style: {
|
|
132
|
+
backgroundColor: getBackgroundForStyleConfig(rule.config.style),
|
|
133
|
+
color: getColorForStyleConfig(rule.config.style)
|
|
134
|
+
},
|
|
135
|
+
children: rule.type === FormatterType.ROWS ? 'row' : 'col'
|
|
136
|
+
})
|
|
137
|
+
}), /*#__PURE__*/_jsx("div", {
|
|
138
|
+
className: "rule-title",
|
|
139
|
+
children: getRuleTitle(rule.config)
|
|
140
|
+
}), /*#__PURE__*/_jsx(Button, {
|
|
141
|
+
kind: "ghost",
|
|
142
|
+
className: "ml-1 px-2",
|
|
143
|
+
onClick: e => handleDeleteClick(e, rule, index),
|
|
144
|
+
icon: vsTrash,
|
|
145
|
+
tooltip: "Delete rule"
|
|
146
|
+
}), /*#__PURE__*/_jsxs("button", _objectSpread(_objectSpread({
|
|
147
|
+
type: "button",
|
|
148
|
+
className: "btn btn-link btn-link-icon px-2 btn-drag-handle",
|
|
149
|
+
onClick: handleDragHandlerClick
|
|
150
|
+
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
151
|
+
}, provided.dragHandleProps), {}, {
|
|
152
|
+
children: [/*#__PURE__*/_jsx(Tooltip, {
|
|
153
|
+
children: "Drag to re-order"
|
|
154
|
+
}), /*#__PURE__*/_jsx(FontAwesomeIcon, {
|
|
155
|
+
icon: vsGripper
|
|
156
|
+
})]
|
|
157
|
+
}))]
|
|
158
|
+
})
|
|
159
|
+
})
|
|
160
|
+
}))
|
|
161
|
+
}, "".concat(index, "-").concat(rule.type))), provided.placeholder]
|
|
162
|
+
}))
|
|
163
|
+
})
|
|
164
|
+
}), /*#__PURE__*/_jsx("hr", {}), /*#__PURE__*/_jsx(Button, {
|
|
165
|
+
kind: "ghost",
|
|
166
|
+
onClick: onCreate,
|
|
167
|
+
icon: dhNewCircleLargeFilled,
|
|
168
|
+
children: "Add New Rule"
|
|
169
|
+
})]
|
|
170
|
+
});
|
|
148
171
|
}
|
|
149
172
|
export default ConditionalFormattingMenu;
|
|
150
173
|
//# sourceMappingURL=ConditionalFormattingMenu.js.map
|