@deephaven/iris-grid 0.10.0 → 0.10.1-beta.0
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/IrisGrid.d.ts +22 -2
- package/dist/IrisGrid.d.ts.map +1 -1
- package/dist/IrisGrid.js +143 -4
- package/dist/IrisGrid.js.map +1 -1
- package/dist/IrisGridModel.d.ts +14 -2
- package/dist/IrisGridModel.d.ts.map +1 -1
- package/dist/IrisGridModel.js +8 -0
- package/dist/IrisGridModel.js.map +1 -1
- package/dist/IrisGridModelUpdater.d.ts +3 -2
- package/dist/IrisGridModelUpdater.d.ts.map +1 -1
- package/dist/IrisGridModelUpdater.js +7 -1
- package/dist/IrisGridModelUpdater.js.map +1 -1
- package/dist/IrisGridProxyModel.d.ts.map +1 -1
- package/dist/IrisGridProxyModel.js +12 -0
- package/dist/IrisGridProxyModel.js.map +1 -1
- package/dist/IrisGridTableModel.d.ts +2 -0
- package/dist/IrisGridTableModel.d.ts.map +1 -1
- package/dist/IrisGridTableModel.js +47 -5
- package/dist/IrisGridTableModel.js.map +1 -1
- package/dist/IrisGridUtils.d.ts +2 -0
- package/dist/IrisGridUtils.d.ts.map +1 -1
- package/dist/IrisGridUtils.js +4 -0
- package/dist/IrisGridUtils.js.map +1 -1
- package/dist/sidebar/OptionType.d.ts +3 -1
- package/dist/sidebar/OptionType.d.ts.map +1 -1
- package/dist/sidebar/OptionType.js +2 -0
- package/dist/sidebar/OptionType.js.map +1 -1
- package/dist/sidebar/conditional-formatting/ColumnFormatEditor.d.ts +9 -0
- package/dist/sidebar/conditional-formatting/ColumnFormatEditor.d.ts.map +1 -0
- package/dist/sidebar/conditional-formatting/ColumnFormatEditor.js +132 -0
- package/dist/sidebar/conditional-formatting/ColumnFormatEditor.js.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionEditor.d.ts +9 -0
- package/dist/sidebar/conditional-formatting/ConditionEditor.d.ts.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionEditor.js +273 -0
- package/dist/sidebar/conditional-formatting/ConditionEditor.js.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.css +21 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.css.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.d.ts +15 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.d.ts.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.js +115 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.js.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingAPIUtils.d.ts +6 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingAPIUtils.d.ts.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingAPIUtils.js +21 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingAPIUtils.js.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.css +56 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.css.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.d.ts +15 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.d.ts.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.js +160 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.js.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.d.ts +119 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.d.ts.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.js +748 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.js.map +1 -0
- package/dist/sidebar/conditional-formatting/RowFormatEditor.d.ts +9 -0
- package/dist/sidebar/conditional-formatting/RowFormatEditor.d.ts.map +1 -0
- package/dist/sidebar/conditional-formatting/RowFormatEditor.js +132 -0
- package/dist/sidebar/conditional-formatting/RowFormatEditor.js.map +1 -0
- package/dist/sidebar/conditional-formatting/StyleEditor.css +54 -0
- package/dist/sidebar/conditional-formatting/StyleEditor.css.map +1 -0
- package/dist/sidebar/conditional-formatting/StyleEditor.d.ts +9 -0
- package/dist/sidebar/conditional-formatting/StyleEditor.d.ts.map +1 -0
- package/dist/sidebar/conditional-formatting/StyleEditor.js +160 -0
- package/dist/sidebar/conditional-formatting/StyleEditor.js.map +1 -0
- package/dist/sidebar/icons/FormatColumnWhereIcon.d.ts +4 -0
- package/dist/sidebar/icons/FormatColumnWhereIcon.d.ts.map +1 -0
- package/dist/sidebar/icons/FormatColumnWhereIcon.js +45 -0
- package/dist/sidebar/icons/FormatColumnWhereIcon.js.map +1 -0
- package/dist/sidebar/icons/FormatRowWhereIcon.d.ts +4 -0
- package/dist/sidebar/icons/FormatRowWhereIcon.d.ts.map +1 -0
- package/dist/sidebar/icons/FormatRowWhereIcon.js +39 -0
- package/dist/sidebar/icons/FormatRowWhereIcon.js.map +1 -0
- package/dist/sidebar/icons/index.d.ts +2 -0
- package/dist/sidebar/icons/index.js +2 -0
- package/dist/sidebar/icons/index.js.map +1 -1
- package/package.json +11 -11
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
|
2
|
+
import Log from '@deephaven/log';
|
|
3
|
+
import TableUtils from "../../TableUtils.js";
|
|
4
|
+
import { StringCondition, DateCondition, getLabelForNumberCondition, getLabelForDateCondition, getLabelForStringCondition, NumberCondition, getDefaultConditionForType, getLabelForBooleanCondition, BooleanCondition, CharCondition, getLabelForCharCondition } from "./ConditionalFormattingUtils.js";
|
|
5
|
+
var log = Log.module('ConditionEditor');
|
|
6
|
+
|
|
7
|
+
var DEFAULT_CALLBACK = () => undefined;
|
|
8
|
+
|
|
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__*/React.createElement("option", {
|
|
10
|
+
key: option,
|
|
11
|
+
value: option
|
|
12
|
+
}, getLabelForNumberCondition(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__*/React.createElement("option", {
|
|
14
|
+
key: option,
|
|
15
|
+
value: option
|
|
16
|
+
}, getLabelForStringCondition(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__*/React.createElement("option", {
|
|
18
|
+
key: option,
|
|
19
|
+
value: option
|
|
20
|
+
}, getLabelForDateCondition(option)));
|
|
21
|
+
var booleanConditions = [BooleanCondition.IS_TRUE, BooleanCondition.IS_FALSE, BooleanCondition.IS_NULL, BooleanCondition.IS_NOT_NULL].map(option => /*#__PURE__*/React.createElement("option", {
|
|
22
|
+
key: option,
|
|
23
|
+
value: option
|
|
24
|
+
}, getLabelForBooleanCondition(option)));
|
|
25
|
+
var charConditions = [CharCondition.IS_EQUAL, CharCondition.IS_NOT_EQUAL, CharCondition.IS_NULL, CharCondition.IS_NOT_NULL].map(option => /*#__PURE__*/React.createElement("option", {
|
|
26
|
+
key: option,
|
|
27
|
+
value: option
|
|
28
|
+
}, getLabelForCharCondition(option)));
|
|
29
|
+
|
|
30
|
+
function isNumberConditionValid(condition, value, startValue, endValue) {
|
|
31
|
+
if (condition === NumberCondition.IS_NULL || condition === NumberCondition.IS_NOT_NULL) {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (condition === NumberCondition.IS_BETWEEN && startValue && !Number.isNaN(Number.parseFloat(startValue)) && endValue && !Number.isNaN(Number.parseFloat(endValue))) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (condition !== NumberCondition.IS_BETWEEN && value && !Number.isNaN(Number.parseFloat(value))) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function getNumberInputs(selectedCondition, handleValueChange, handleStartValueChange, handleEndValueChange, conditionValue, startValue, endValue) {
|
|
47
|
+
switch (selectedCondition) {
|
|
48
|
+
case NumberCondition.IS_EQUAL:
|
|
49
|
+
case NumberCondition.IS_NOT_EQUAL:
|
|
50
|
+
case NumberCondition.GREATER_THAN:
|
|
51
|
+
case NumberCondition.GREATER_THAN_OR_EQUAL:
|
|
52
|
+
case NumberCondition.LESS_THAN:
|
|
53
|
+
case NumberCondition.LESS_THAN_OR_EQUAL:
|
|
54
|
+
return /*#__PURE__*/React.createElement("input", {
|
|
55
|
+
type: "number",
|
|
56
|
+
className: "form-control",
|
|
57
|
+
placeholder: "Enter value",
|
|
58
|
+
value: conditionValue !== null && conditionValue !== void 0 ? conditionValue : '',
|
|
59
|
+
onChange: handleValueChange
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
case NumberCondition.IS_BETWEEN:
|
|
63
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
64
|
+
className: "d-flex flex-row"
|
|
65
|
+
}, /*#__PURE__*/React.createElement("input", {
|
|
66
|
+
type: "number",
|
|
67
|
+
className: "form-control d-flex mr-2",
|
|
68
|
+
placeholder: "Start value",
|
|
69
|
+
value: startValue !== null && startValue !== void 0 ? startValue : '',
|
|
70
|
+
onChange: handleStartValueChange
|
|
71
|
+
}), /*#__PURE__*/React.createElement("input", {
|
|
72
|
+
type: "number",
|
|
73
|
+
className: "form-control d-flex",
|
|
74
|
+
placeholder: "End value",
|
|
75
|
+
value: endValue !== null && endValue !== void 0 ? endValue : '',
|
|
76
|
+
onChange: handleEndValueChange
|
|
77
|
+
}));
|
|
78
|
+
|
|
79
|
+
case NumberCondition.IS_NULL:
|
|
80
|
+
case NumberCondition.IS_NOT_NULL:
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function getStringInputs(selectedCondition, handleValueChange, conditionValue) {
|
|
86
|
+
switch (selectedCondition) {
|
|
87
|
+
case StringCondition.IS_NULL:
|
|
88
|
+
case StringCondition.IS_NOT_NULL:
|
|
89
|
+
return null;
|
|
90
|
+
|
|
91
|
+
default:
|
|
92
|
+
return /*#__PURE__*/React.createElement("input", {
|
|
93
|
+
type: "text",
|
|
94
|
+
className: "form-control",
|
|
95
|
+
placeholder: "Enter value",
|
|
96
|
+
value: conditionValue !== null && conditionValue !== void 0 ? conditionValue : '',
|
|
97
|
+
onChange: handleValueChange
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function getDateInputs(selectedCondition, handleValueChange, conditionValue) {
|
|
103
|
+
switch (selectedCondition) {
|
|
104
|
+
case DateCondition.IS_NULL:
|
|
105
|
+
case DateCondition.IS_NOT_NULL:
|
|
106
|
+
return null;
|
|
107
|
+
|
|
108
|
+
default:
|
|
109
|
+
return /*#__PURE__*/React.createElement("input", {
|
|
110
|
+
type: "text",
|
|
111
|
+
className: "form-control",
|
|
112
|
+
placeholder: "Enter value",
|
|
113
|
+
value: conditionValue !== null && conditionValue !== void 0 ? conditionValue : '',
|
|
114
|
+
onChange: handleValueChange
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function getBooleanInputs() {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function getCharInputs(selectedCondition, handleValueChange, conditionValue) {
|
|
124
|
+
switch (selectedCondition) {
|
|
125
|
+
case CharCondition.IS_NULL:
|
|
126
|
+
case CharCondition.IS_NOT_NULL:
|
|
127
|
+
return null;
|
|
128
|
+
|
|
129
|
+
default:
|
|
130
|
+
return /*#__PURE__*/React.createElement("input", {
|
|
131
|
+
type: "text",
|
|
132
|
+
className: "form-control",
|
|
133
|
+
maxLength: 1,
|
|
134
|
+
placeholder: "Enter value",
|
|
135
|
+
value: conditionValue !== null && conditionValue !== void 0 ? conditionValue : '',
|
|
136
|
+
onChange: handleValueChange
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
var ConditionEditor = props => {
|
|
142
|
+
var {
|
|
143
|
+
column,
|
|
144
|
+
config,
|
|
145
|
+
onChange = DEFAULT_CALLBACK
|
|
146
|
+
} = props;
|
|
147
|
+
var selectedColumnType = column.type;
|
|
148
|
+
var [prevColumnType, setPrevColumnType] = useState(selectedColumnType);
|
|
149
|
+
var [selectedCondition, setCondition] = useState(config.condition);
|
|
150
|
+
var [conditionValue, setValue] = useState(config.value);
|
|
151
|
+
var [startValue, setStartValue] = useState(config.start);
|
|
152
|
+
var [endValue, setEndValue] = useState(config.end);
|
|
153
|
+
|
|
154
|
+
if (selectedColumnType !== prevColumnType) {
|
|
155
|
+
// Column type changed, reset condition and value fields
|
|
156
|
+
setCondition(getDefaultConditionForType(selectedColumnType));
|
|
157
|
+
setValue(undefined);
|
|
158
|
+
setStartValue(undefined);
|
|
159
|
+
setEndValue(undefined);
|
|
160
|
+
setPrevColumnType(selectedColumnType);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
var conditions = useMemo(() => {
|
|
164
|
+
if (selectedColumnType === undefined) {
|
|
165
|
+
return [];
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (TableUtils.isNumberType(selectedColumnType)) {
|
|
169
|
+
return numberConditionOptions;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (TableUtils.isCharType(selectedColumnType)) {
|
|
173
|
+
return charConditions;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if (TableUtils.isTextType(selectedColumnType)) {
|
|
177
|
+
return stringConditions;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
if (TableUtils.isDateType(selectedColumnType)) {
|
|
181
|
+
return dateConditions;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
if (TableUtils.isBooleanType(selectedColumnType)) {
|
|
185
|
+
return booleanConditions;
|
|
186
|
+
}
|
|
187
|
+
}, [selectedColumnType]);
|
|
188
|
+
var handleConditionChange = useCallback(e => {
|
|
189
|
+
var {
|
|
190
|
+
value
|
|
191
|
+
} = e.target;
|
|
192
|
+
log.debug('handleConditionChange', value);
|
|
193
|
+
setCondition(value);
|
|
194
|
+
}, []);
|
|
195
|
+
var handleValueChange = useCallback(e => {
|
|
196
|
+
var {
|
|
197
|
+
value
|
|
198
|
+
} = e.target;
|
|
199
|
+
log.debug('handleValueChange', value);
|
|
200
|
+
setValue(value);
|
|
201
|
+
}, []);
|
|
202
|
+
var handleStartValueChange = useCallback(e => {
|
|
203
|
+
var {
|
|
204
|
+
value
|
|
205
|
+
} = e.target;
|
|
206
|
+
log.debug('handleStartValueChange', value);
|
|
207
|
+
setStartValue(value);
|
|
208
|
+
}, []);
|
|
209
|
+
var handleEndValueChange = useCallback(e => {
|
|
210
|
+
var {
|
|
211
|
+
value
|
|
212
|
+
} = e.target;
|
|
213
|
+
log.debug('handleEndValueChange', value);
|
|
214
|
+
setEndValue(value);
|
|
215
|
+
}, []);
|
|
216
|
+
useEffect(() => {
|
|
217
|
+
var isValid = true;
|
|
218
|
+
|
|
219
|
+
if (selectedCondition === undefined) {
|
|
220
|
+
log.debug('Unable to create formatting rule. Condition is not selected.');
|
|
221
|
+
isValid = false;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
if (TableUtils.isNumberType(column.type) && !isNumberConditionValid(selectedCondition, conditionValue, startValue, endValue)) {
|
|
225
|
+
log.debug('Unable to create formatting rule. Invalid value', conditionValue);
|
|
226
|
+
isValid = false;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
onChange({
|
|
230
|
+
condition: selectedCondition,
|
|
231
|
+
value: conditionValue,
|
|
232
|
+
start: startValue,
|
|
233
|
+
end: endValue
|
|
234
|
+
}, isValid);
|
|
235
|
+
}, [onChange, column.type, selectedCondition, conditionValue, startValue, endValue]);
|
|
236
|
+
var conditionInputs = useMemo(() => {
|
|
237
|
+
if (selectedColumnType === undefined) {
|
|
238
|
+
// Column not selected
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (TableUtils.isNumberType(selectedColumnType)) {
|
|
243
|
+
return getNumberInputs(selectedCondition, handleValueChange, handleStartValueChange, handleEndValueChange, conditionValue, startValue, endValue);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
if (TableUtils.isCharType(selectedColumnType)) {
|
|
247
|
+
return getCharInputs(selectedCondition, handleValueChange, conditionValue);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
if (TableUtils.isTextType(selectedColumnType)) {
|
|
251
|
+
return getStringInputs(selectedCondition, handleValueChange, conditionValue);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
if (TableUtils.isDateType(selectedColumnType)) {
|
|
255
|
+
return getDateInputs(selectedCondition, handleValueChange, conditionValue);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
if (TableUtils.isBooleanType(selectedColumnType)) {
|
|
259
|
+
return getBooleanInputs();
|
|
260
|
+
}
|
|
261
|
+
}, [selectedColumnType, selectedCondition, conditionValue, startValue, endValue, handleValueChange, handleStartValueChange, handleEndValueChange]);
|
|
262
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
263
|
+
className: "condition-editor mb-2"
|
|
264
|
+
}, /*#__PURE__*/React.createElement("select", {
|
|
265
|
+
value: selectedCondition,
|
|
266
|
+
id: "condition-select",
|
|
267
|
+
className: "custom-select mb-2",
|
|
268
|
+
onChange: handleConditionChange
|
|
269
|
+
}, conditions), conditionInputs);
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
export default ConditionEditor;
|
|
273
|
+
//# sourceMappingURL=ConditionEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/sidebar/conditional-formatting/ConditionEditor.tsx"],"names":["React","useCallback","useEffect","useMemo","useState","Log","TableUtils","StringCondition","DateCondition","getLabelForNumberCondition","getLabelForDateCondition","getLabelForStringCondition","NumberCondition","getDefaultConditionForType","getLabelForBooleanCondition","BooleanCondition","CharCondition","getLabelForCharCondition","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","onChange","selectedColumnType","type","prevColumnType","setPrevColumnType","setCondition","setValue","setStartValue","start","setEndValue","end","conditions","isNumberType","isCharType","isTextType","isDateType","isBooleanType","handleConditionChange","e","target","debug","isValid","conditionInputs"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,WAAhB,EAA6BC,SAA7B,EAAwCC,OAAxC,EAAiDC,QAAjD,QAAiE,OAAjE;AACA,OAAOC,GAAP,MAAgB,gBAAhB;OACOC,U;SAELC,e,EACAC,a,EACAC,0B,EACAC,wB,EACAC,0B,EACAC,e,EAGAC,0B,EACAC,2B,EACAC,gB,EACAC,a,EACAC,wB;AAGF,IAAMC,GAAG,GAAGb,GAAG,CAACc,MAAJ,CAAW,iBAAX,CAAZ;;AAQA,IAAMC,gBAAgB,GAAG,MAAMC,SAA/B;;AAEA,IAAMC,sBAAsB,GAAG,CAC7BV,eAAe,CAACW,QADa,EAE7BX,eAAe,CAACY,YAFa,EAG7BZ,eAAe,CAACa,UAHa,EAI7Bb,eAAe,CAACc,YAJa,EAK7Bd,eAAe,CAACe,qBALa,EAM7Bf,eAAe,CAACgB,SANa,EAO7BhB,eAAe,CAACiB,kBAPa,EAQ7BjB,eAAe,CAACkB,OARa,EAS7BlB,eAAe,CAACmB,WATa,EAU7BC,GAV6B,CAUzBC,MAAM,iBACV;AAAQ,EAAA,GAAG,EAAEA,MAAb;AAAqB,EAAA,KAAK,EAAEA;AAA5B,GACGxB,0BAA0B,CAACwB,MAAD,CAD7B,CAX6B,CAA/B;AAgBA,IAAMC,gBAAgB,GAAG,CACvB3B,eAAe,CAAC4B,UADO,EAEvB5B,eAAe,CAAC6B,cAFO,EAGvB7B,eAAe,CAAC8B,QAHO,EAIvB9B,eAAe,CAAC+B,gBAJO,EAKvB/B,eAAe,CAACgC,WALO,EAMvBhC,eAAe,CAACiC,SANO,EAOvBjC,eAAe,CAACuB,OAPO,EAQvBvB,eAAe,CAACwB,WARO,EASvBC,GATuB,CASnBC,MAAM,iBACV;AAAQ,EAAA,GAAG,EAAEA,MAAb;AAAqB,EAAA,KAAK,EAAEA;AAA5B,GACGtB,0BAA0B,CAACsB,MAAD,CAD7B,CAVuB,CAAzB;AAeA,IAAMQ,cAAc,GAAG,CACrBjC,aAAa,CAAC2B,UADO,EAErB3B,aAAa,CAAC4B,cAFO,EAGrB5B,aAAa,CAACkC,SAHO,EAIrBlC,aAAa,CAACmC,kBAJO,EAKrBnC,aAAa,CAACoC,QALO,EAMrBpC,aAAa,CAACqC,iBANO,EAOrBrC,aAAa,CAACsB,OAPO,EAQrBtB,aAAa,CAACuB,WARO,EASrBC,GATqB,CASjBC,MAAM,iBACV;AAAQ,EAAA,GAAG,EAAEA,MAAb;AAAqB,EAAA,KAAK,EAAEA;AAA5B,GACGvB,wBAAwB,CAACuB,MAAD,CAD3B,CAVqB,CAAvB;AAeA,IAAMa,iBAAiB,GAAG,CACxB/B,gBAAgB,CAACgC,OADO,EAExBhC,gBAAgB,CAACiC,QAFO,EAGxBjC,gBAAgB,CAACe,OAHO,EAIxBf,gBAAgB,CAACgB,WAJO,EAKxBC,GALwB,CAKpBC,MAAM,iBACV;AAAQ,EAAA,GAAG,EAAEA,MAAb;AAAqB,EAAA,KAAK,EAAEA;AAA5B,GACGnB,2BAA2B,CAACmB,MAAD,CAD9B,CANwB,CAA1B;AAWA,IAAMgB,cAAc,GAAG,CACrBjC,aAAa,CAACO,QADO,EAErBP,aAAa,CAACQ,YAFO,EAGrBR,aAAa,CAACc,OAHO,EAIrBd,aAAa,CAACe,WAJO,EAKrBC,GALqB,CAKjBC,MAAM,iBACV;AAAQ,EAAA,GAAG,EAAEA,MAAb;AAAqB,EAAA,KAAK,EAAEA;AAA5B,GACGhB,wBAAwB,CAACgB,MAAD,CAD3B,CANqB,CAAvB;;AAWA,SAASiB,sBAAT,CACEC,SADF,EAEEC,KAFF,EAGEC,UAHF,EAIEC,QAJF,EAKE;AACA,MACEH,SAAS,KAAKvC,eAAe,CAACkB,OAA9B,IACAqB,SAAS,KAAKvC,eAAe,CAACmB,WAFhC,EAGE;AACA,WAAO,IAAP;AACD;;AACD,MACEoB,SAAS,KAAKvC,eAAe,CAACa,UAA9B,IACA4B,UADA,IAEA,CAACE,MAAM,CAACC,KAAP,CAAaD,MAAM,CAACE,UAAP,CAAkBJ,UAAlB,CAAb,CAFD,IAGAC,QAHA,IAIA,CAACC,MAAM,CAACC,KAAP,CAAaD,MAAM,CAACE,UAAP,CAAkBH,QAAlB,CAAb,CALH,EAME;AACA,WAAO,IAAP;AACD;;AACD,MACEH,SAAS,KAAKvC,eAAe,CAACa,UAA9B,IACA2B,KADA,IAEA,CAACG,MAAM,CAACC,KAAP,CAAaD,MAAM,CAACE,UAAP,CAAkBL,KAAlB,CAAb,CAHH,EAIE;AACA,WAAO,IAAP;AACD;;AACD,SAAO,KAAP;AACD;;AAED,SAASM,eAAT,CACEC,iBADF,EAEEC,iBAFF,EAGEC,sBAHF,EAIEC,oBAJF,EAKEC,cALF,EAMEV,UANF,EAOEC,QAPF,EAQE;AACA,UAAQK,iBAAR;AACE,SAAK/C,eAAe,CAACW,QAArB;AACA,SAAKX,eAAe,CAACY,YAArB;AACA,SAAKZ,eAAe,CAACc,YAArB;AACA,SAAKd,eAAe,CAACe,qBAArB;AACA,SAAKf,eAAe,CAACgB,SAArB;AACA,SAAKhB,eAAe,CAACiB,kBAArB;AACE,0BACE;AACE,QAAA,IAAI,EAAC,QADP;AAEE,QAAA,SAAS,EAAC,cAFZ;AAGE,QAAA,WAAW,EAAC,aAHd;AAIE,QAAA,KAAK,EAAEkC,cAAF,aAAEA,cAAF,cAAEA,cAAF,GAAoB,EAJ3B;AAKE,QAAA,QAAQ,EAAEH;AALZ,QADF;;AASF,SAAKhD,eAAe,CAACa,UAArB;AACE,0BACE;AAAK,QAAA,SAAS,EAAC;AAAf,sBACE;AACE,QAAA,IAAI,EAAC,QADP;AAEE,QAAA,SAAS,EAAC,0BAFZ;AAGE,QAAA,WAAW,EAAC,aAHd;AAIE,QAAA,KAAK,EAAE4B,UAAF,aAAEA,UAAF,cAAEA,UAAF,GAAgB,EAJvB;AAKE,QAAA,QAAQ,EAAEQ;AALZ,QADF,eAQE;AACE,QAAA,IAAI,EAAC,QADP;AAEE,QAAA,SAAS,EAAC,qBAFZ;AAGE,QAAA,WAAW,EAAC,WAHd;AAIE,QAAA,KAAK,EAAEP,QAAF,aAAEA,QAAF,cAAEA,QAAF,GAAc,EAJrB;AAKE,QAAA,QAAQ,EAAEQ;AALZ,QARF,CADF;;AAkBF,SAAKlD,eAAe,CAACkB,OAArB;AACA,SAAKlB,eAAe,CAACmB,WAArB;AACE,aAAO,IAAP;AArCJ;AAuCD;;AAED,SAASiC,eAAT,CACEL,iBADF,EAEEC,iBAFF,EAGEG,cAHF,EAIE;AACA,UAAQJ,iBAAR;AACE,SAAKpD,eAAe,CAACuB,OAArB;AACA,SAAKvB,eAAe,CAACwB,WAArB;AACE,aAAO,IAAP;;AACF;AACE,0BACE;AACE,QAAA,IAAI,EAAC,MADP;AAEE,QAAA,SAAS,EAAC,cAFZ;AAGE,QAAA,WAAW,EAAC,aAHd;AAIE,QAAA,KAAK,EAAEgC,cAAF,aAAEA,cAAF,cAAEA,cAAF,GAAoB,EAJ3B;AAKE,QAAA,QAAQ,EAAEH;AALZ,QADF;AALJ;AAeD;;AAED,SAASK,aAAT,CACEN,iBADF,EAEEC,iBAFF,EAGEG,cAHF,EAIE;AACA,UAAQJ,iBAAR;AACE,SAAKnD,aAAa,CAACsB,OAAnB;AACA,SAAKtB,aAAa,CAACuB,WAAnB;AACE,aAAO,IAAP;;AACF;AACE,0BACE;AACE,QAAA,IAAI,EAAC,MADP;AAEE,QAAA,SAAS,EAAC,cAFZ;AAGE,QAAA,WAAW,EAAC,aAHd;AAIE,QAAA,KAAK,EAAEgC,cAAF,aAAEA,cAAF,cAAEA,cAAF,GAAoB,EAJ3B;AAKE,QAAA,QAAQ,EAAEH;AALZ,QADF;AALJ;AAeD;;AAED,SAASM,gBAAT,GAA4B;AAC1B,SAAO,IAAP;AACD;;AAED,SAASC,aAAT,CACER,iBADF,EAEEC,iBAFF,EAGEG,cAHF,EAIE;AACA,UAAQJ,iBAAR;AACE,SAAK3C,aAAa,CAACc,OAAnB;AACA,SAAKd,aAAa,CAACe,WAAnB;AACE,aAAO,IAAP;;AACF;AACE,0BACE;AACE,QAAA,IAAI,EAAC,MADP;AAEE,QAAA,SAAS,EAAC,cAFZ;AAGE,QAAA,SAAS,EAAE,CAHb;AAIE,QAAA,WAAW,EAAC,aAJd;AAKE,QAAA,KAAK,EAAEgC,cAAF,aAAEA,cAAF,cAAEA,cAAF,GAAoB,EAL3B;AAME,QAAA,QAAQ,EAAEH;AANZ,QADF;AALJ;AAgBD;;AAED,IAAMQ,eAAe,GAAIC,KAAD,IAA8C;AACpE,MAAM;AAAEC,IAAAA,MAAF;AAAUC,IAAAA,MAAV;AAAkBC,IAAAA,QAAQ,GAAGpD;AAA7B,MAAkDiD,KAAxD;AACA,MAAMI,kBAAkB,GAAGH,MAAM,CAACI,IAAlC;AACA,MAAM,CAACC,cAAD,EAAiBC,iBAAjB,IAAsCxE,QAAQ,CAACqE,kBAAD,CAApD;AACA,MAAM,CAACd,iBAAD,EAAoBkB,YAApB,IAAoCzE,QAAQ,CAACmE,MAAM,CAACpB,SAAR,CAAlD;AACA,MAAM,CAACY,cAAD,EAAiBe,QAAjB,IAA6B1E,QAAQ,CAACmE,MAAM,CAACnB,KAAR,CAA3C;AACA,MAAM,CAACC,UAAD,EAAa0B,aAAb,IAA8B3E,QAAQ,CAACmE,MAAM,CAACS,KAAR,CAA5C;AACA,MAAM,CAAC1B,QAAD,EAAW2B,WAAX,IAA0B7E,QAAQ,CAACmE,MAAM,CAACW,GAAR,CAAxC;;AAEA,MAAIT,kBAAkB,KAAKE,cAA3B,EAA2C;AACzC;AACAE,IAAAA,YAAY,CAAChE,0BAA0B,CAAC4D,kBAAD,CAA3B,CAAZ;AACAK,IAAAA,QAAQ,CAACzD,SAAD,CAAR;AACA0D,IAAAA,aAAa,CAAC1D,SAAD,CAAb;AACA4D,IAAAA,WAAW,CAAC5D,SAAD,CAAX;AACAuD,IAAAA,iBAAiB,CAACH,kBAAD,CAAjB;AACD;;AAED,MAAMU,UAAU,GAAGhF,OAAO,CAAC,MAAM;AAC/B,QAAIsE,kBAAkB,KAAKpD,SAA3B,EAAsC;AACpC,aAAO,EAAP;AACD;;AACD,QAAIf,UAAU,CAAC8E,YAAX,CAAwBX,kBAAxB,CAAJ,EAAiD;AAC/C,aAAOnD,sBAAP;AACD;;AACD,QAAIhB,UAAU,CAAC+E,UAAX,CAAsBZ,kBAAtB,CAAJ,EAA+C;AAC7C,aAAOxB,cAAP;AACD;;AACD,QAAI3C,UAAU,CAACgF,UAAX,CAAsBb,kBAAtB,CAAJ,EAA+C;AAC7C,aAAOvC,gBAAP;AACD;;AACD,QAAI5B,UAAU,CAACiF,UAAX,CAAsBd,kBAAtB,CAAJ,EAA+C;AAC7C,aAAOhC,cAAP;AACD;;AACD,QAAInC,UAAU,CAACkF,aAAX,CAAyBf,kBAAzB,CAAJ,EAAkD;AAChD,aAAO3B,iBAAP;AACD;AACF,GAnByB,EAmBvB,CAAC2B,kBAAD,CAnBuB,CAA1B;AAqBA,MAAMgB,qBAAqB,GAAGxF,WAAW,CAACyF,CAAC,IAAI;AAC7C,QAAM;AAAEtC,MAAAA;AAAF,QAAYsC,CAAC,CAACC,MAApB;AACAzE,IAAAA,GAAG,CAAC0E,KAAJ,CAAU,uBAAV,EAAmCxC,KAAnC;AACAyB,IAAAA,YAAY,CAACzB,KAAD,CAAZ;AACD,GAJwC,EAItC,EAJsC,CAAzC;AAMA,MAAMQ,iBAAiB,GAAG3D,WAAW,CAACyF,CAAC,IAAI;AACzC,QAAM;AAAEtC,MAAAA;AAAF,QAAYsC,CAAC,CAACC,MAApB;AACAzE,IAAAA,GAAG,CAAC0E,KAAJ,CAAU,mBAAV,EAA+BxC,KAA/B;AACA0B,IAAAA,QAAQ,CAAC1B,KAAD,CAAR;AACD,GAJoC,EAIlC,EAJkC,CAArC;AAMA,MAAMS,sBAAsB,GAAG5D,WAAW,CAACyF,CAAC,IAAI;AAC9C,QAAM;AAAEtC,MAAAA;AAAF,QAAYsC,CAAC,CAACC,MAApB;AACAzE,IAAAA,GAAG,CAAC0E,KAAJ,CAAU,wBAAV,EAAoCxC,KAApC;AACA2B,IAAAA,aAAa,CAAC3B,KAAD,CAAb;AACD,GAJyC,EAIvC,EAJuC,CAA1C;AAMA,MAAMU,oBAAoB,GAAG7D,WAAW,CAACyF,CAAC,IAAI;AAC5C,QAAM;AAAEtC,MAAAA;AAAF,QAAYsC,CAAC,CAACC,MAApB;AACAzE,IAAAA,GAAG,CAAC0E,KAAJ,CAAU,sBAAV,EAAkCxC,KAAlC;AACA6B,IAAAA,WAAW,CAAC7B,KAAD,CAAX;AACD,GAJuC,EAIrC,EAJqC,CAAxC;AAMAlD,EAAAA,SAAS,CAAC,MAAM;AACd,QAAI2F,OAAO,GAAG,IAAd;;AAEA,QAAIlC,iBAAiB,KAAKtC,SAA1B,EAAqC;AACnCH,MAAAA,GAAG,CAAC0E,KAAJ,CAAU,8DAAV;AACAC,MAAAA,OAAO,GAAG,KAAV;AACD;;AAED,QACEvF,UAAU,CAAC8E,YAAX,CAAwBd,MAAM,CAACI,IAA/B,KACA,CAACxB,sBAAsB,CACrBS,iBADqB,EAErBI,cAFqB,EAGrBV,UAHqB,EAIrBC,QAJqB,CAFzB,EAQE;AACApC,MAAAA,GAAG,CAAC0E,KAAJ,CACE,iDADF,EAEE7B,cAFF;AAIA8B,MAAAA,OAAO,GAAG,KAAV;AACD;;AACDrB,IAAAA,QAAQ,CACN;AACErB,MAAAA,SAAS,EAAEQ,iBADb;AAEEP,MAAAA,KAAK,EAAEW,cAFT;AAGEiB,MAAAA,KAAK,EAAE3B,UAHT;AAIE6B,MAAAA,GAAG,EAAE5B;AAJP,KADM,EAONuC,OAPM,CAAR;AASD,GAhCQ,EAgCN,CACDrB,QADC,EAEDF,MAAM,CAACI,IAFN,EAGDf,iBAHC,EAIDI,cAJC,EAKDV,UALC,EAMDC,QANC,CAhCM,CAAT;AAyCA,MAAMwC,eAAe,GAAG3F,OAAO,CAAC,MAAM;AACpC,QAAIsE,kBAAkB,KAAKpD,SAA3B,EAAsC;AACpC;AACA,aAAO,IAAP;AACD;;AACD,QAAIf,UAAU,CAAC8E,YAAX,CAAwBX,kBAAxB,CAAJ,EAAiD;AAC/C,aAAOf,eAAe,CACpBC,iBADoB,EAEpBC,iBAFoB,EAGpBC,sBAHoB,EAIpBC,oBAJoB,EAKpBC,cALoB,EAMpBV,UANoB,EAOpBC,QAPoB,CAAtB;AASD;;AACD,QAAIhD,UAAU,CAAC+E,UAAX,CAAsBZ,kBAAtB,CAAJ,EAA+C;AAC7C,aAAON,aAAa,CAClBR,iBADkB,EAElBC,iBAFkB,EAGlBG,cAHkB,CAApB;AAKD;;AACD,QAAIzD,UAAU,CAACgF,UAAX,CAAsBb,kBAAtB,CAAJ,EAA+C;AAC7C,aAAOT,eAAe,CACpBL,iBADoB,EAEpBC,iBAFoB,EAGpBG,cAHoB,CAAtB;AAKD;;AACD,QAAIzD,UAAU,CAACiF,UAAX,CAAsBd,kBAAtB,CAAJ,EAA+C;AAC7C,aAAOR,aAAa,CAClBN,iBADkB,EAElBC,iBAFkB,EAGlBG,cAHkB,CAApB;AAKD;;AACD,QAAIzD,UAAU,CAACkF,aAAX,CAAyBf,kBAAzB,CAAJ,EAAkD;AAChD,aAAOP,gBAAgB,EAAvB;AACD;AACF,GAxC8B,EAwC5B,CACDO,kBADC,EAEDd,iBAFC,EAGDI,cAHC,EAIDV,UAJC,EAKDC,QALC,EAMDM,iBANC,EAODC,sBAPC,EAQDC,oBARC,CAxC4B,CAA/B;AAmDA,sBACE;AAAK,IAAA,SAAS,EAAC;AAAf,kBACE;AACE,IAAA,KAAK,EAAEH,iBADT;AAEE,IAAA,EAAE,EAAC,kBAFL;AAGE,IAAA,SAAS,EAAC,oBAHZ;AAIE,IAAA,QAAQ,EAAE8B;AAJZ,KAMGN,UANH,CADF,EASGW,eATH,CADF;AAaD,CAxKD;;AA0KA,eAAe1B,eAAf","sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport Log from '@deephaven/log';\nimport TableUtils from '../../TableUtils';\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} from './ConditionalFormattingUtils';\n\nconst log = Log.module('ConditionEditor');\n\nexport interface ConditionEditorProps {\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 &&\n !Number.isNaN(Number.parseFloat(startValue)) &&\n endValue &&\n !Number.isNaN(Number.parseFloat(endValue))\n ) {\n return true;\n }\n if (\n condition !== NumberCondition.IS_BETWEEN &&\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\nconst ConditionEditor = (props: ConditionEditorProps): JSX.Element => {\n const { column, config, 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(undefined);\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.isTextType(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 let isValid = true;\n\n if (selectedCondition === undefined) {\n log.debug('Unable to create formatting rule. Condition is not selected.');\n isValid = false;\n }\n\n 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 }\n onChange(\n {\n condition: selectedCondition,\n value: conditionValue,\n start: startValue,\n end: endValue,\n },\n isValid\n );\n }, [\n onChange,\n column.type,\n selectedCondition,\n conditionValue,\n startValue,\n endValue,\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.isTextType(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 id=\"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"],"file":"ConditionEditor.js"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
.conditional-format-editor {
|
|
2
|
+
padding: 1rem;
|
|
3
|
+
}
|
|
4
|
+
.conditional-format-editor .formatter-list {
|
|
5
|
+
display: flex;
|
|
6
|
+
justify-content: flex-start;
|
|
7
|
+
padding-top: 0.5rem;
|
|
8
|
+
}
|
|
9
|
+
.conditional-format-editor .formatter-type {
|
|
10
|
+
margin: 0 1rem 0 0;
|
|
11
|
+
display: flex;
|
|
12
|
+
}
|
|
13
|
+
.conditional-format-editor .btn-formatter-type {
|
|
14
|
+
font-size: smaller;
|
|
15
|
+
width: 100%;
|
|
16
|
+
}
|
|
17
|
+
.conditional-format-editor .color-select {
|
|
18
|
+
padding: 0 2em 0 0.25em;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/*# sourceMappingURL=ConditionalFormatEditor.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["../../../src/sidebar/conditional-formatting/ConditionalFormatEditor.scss","../../../../components/scss/new_variables.scss"],"names":[],"mappings":"AAEA;EACE,SCCS;;ADCT;EACE;EACA;EACA,aCLO;;ADQT;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE","file":"ConditionalFormatEditor.css"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { FormattingRule, ModelColumn } from './ConditionalFormattingUtils';
|
|
2
|
+
import './ConditionalFormatEditor.scss';
|
|
3
|
+
export declare type SaveCallback = (rule: FormattingRule) => void;
|
|
4
|
+
export declare type UpdateCallback = (rule?: FormattingRule) => void;
|
|
5
|
+
export declare type CancelCallback = () => void;
|
|
6
|
+
export interface ConditionalFormatEditorProps {
|
|
7
|
+
columns: ModelColumn[];
|
|
8
|
+
rule?: FormattingRule;
|
|
9
|
+
onCancel?: CancelCallback;
|
|
10
|
+
onSave?: SaveCallback;
|
|
11
|
+
onUpdate?: UpdateCallback;
|
|
12
|
+
}
|
|
13
|
+
declare const ConditionalFormatEditor: (props: ConditionalFormatEditorProps) => JSX.Element;
|
|
14
|
+
export default ConditionalFormatEditor;
|
|
15
|
+
//# sourceMappingURL=ConditionalFormatEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConditionalFormatEditor.d.ts","sourceRoot":"","sources":["../../../src/sidebar/conditional-formatting/ConditionalFormatEditor.tsx"],"names":[],"mappings":"AAOA,OAAO,EAGL,cAAc,EACd,WAAW,EACZ,MAAM,8BAA8B,CAAC;AACtC,OAAO,gCAAgC,CAAC;AAIxC,oBAAY,YAAY,GAAG,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;AAE1D,oBAAY,cAAc,GAAG,CAAC,IAAI,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;AAE7D,oBAAY,cAAc,GAAG,MAAM,IAAI,CAAC;AAExC,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAwBD,QAAA,MAAM,uBAAuB,UACpB,4BAA4B,KAClC,WAoGF,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import React, { useCallback, useState } from 'react';
|
|
2
|
+
import classNames from 'classnames';
|
|
3
|
+
import { Button } from '@deephaven/components';
|
|
4
|
+
import Log from '@deephaven/log';
|
|
5
|
+
import { FormatColumnWhereIcon, FormatRowWhereIcon } from "../icons/index.js";
|
|
6
|
+
import ColumnFormatEditor from "./ColumnFormatEditor.js";
|
|
7
|
+
import RowFormatEditor from "./RowFormatEditor.js";
|
|
8
|
+
import { FormatterType } from "./ConditionalFormattingUtils.js";
|
|
9
|
+
import "./ConditionalFormatEditor.css";
|
|
10
|
+
var log = Log.module('ConditionalFormatEditor');
|
|
11
|
+
|
|
12
|
+
var DEFAULT_CALLBACK = () => undefined;
|
|
13
|
+
|
|
14
|
+
function getFormatterTypeIcon(option) {
|
|
15
|
+
switch (option) {
|
|
16
|
+
case FormatterType.CONDITIONAL:
|
|
17
|
+
return /*#__PURE__*/React.createElement(FormatColumnWhereIcon, null);
|
|
18
|
+
|
|
19
|
+
case FormatterType.ROWS:
|
|
20
|
+
return /*#__PURE__*/React.createElement(FormatRowWhereIcon, null);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function getFormatterTypeLabel(option) {
|
|
25
|
+
switch (option) {
|
|
26
|
+
case FormatterType.CONDITIONAL:
|
|
27
|
+
return 'Conditional';
|
|
28
|
+
|
|
29
|
+
case FormatterType.ROWS:
|
|
30
|
+
return 'Rows';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
var formatterTypes = [FormatterType.CONDITIONAL, FormatterType.ROWS];
|
|
35
|
+
|
|
36
|
+
var ConditionalFormatEditor = props => {
|
|
37
|
+
var _defaultRule$type;
|
|
38
|
+
|
|
39
|
+
var {
|
|
40
|
+
columns,
|
|
41
|
+
onSave = DEFAULT_CALLBACK,
|
|
42
|
+
onUpdate = DEFAULT_CALLBACK,
|
|
43
|
+
onCancel = DEFAULT_CALLBACK,
|
|
44
|
+
rule: defaultRule
|
|
45
|
+
} = props;
|
|
46
|
+
var [selectedFormatter, setFormatter] = useState((_defaultRule$type = defaultRule === null || defaultRule === void 0 ? void 0 : defaultRule.type) !== null && _defaultRule$type !== void 0 ? _defaultRule$type : formatterTypes[0]);
|
|
47
|
+
var [rule, setRule] = useState(defaultRule);
|
|
48
|
+
var [isValid, setIsValid] = useState(false);
|
|
49
|
+
var handleCancel = useCallback(() => {
|
|
50
|
+
onCancel();
|
|
51
|
+
}, [onCancel]);
|
|
52
|
+
var handleSave = useCallback(() => {
|
|
53
|
+
if (rule === undefined) {
|
|
54
|
+
log.error('Rule is not defined.');
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
onSave(rule);
|
|
59
|
+
}, [onSave, rule]);
|
|
60
|
+
var handleFormatterChange = useCallback(value => {
|
|
61
|
+
log.debug('handleFormatterChange', value);
|
|
62
|
+
setFormatter(value);
|
|
63
|
+
}, []);
|
|
64
|
+
var handleRuleChange = useCallback((ruleConfig, isRuleValid) => {
|
|
65
|
+
log.debug('handleRuleChange', ruleConfig, isRuleValid, selectedFormatter);
|
|
66
|
+
var updatedRule = {
|
|
67
|
+
type: selectedFormatter,
|
|
68
|
+
config: ruleConfig
|
|
69
|
+
};
|
|
70
|
+
setRule(updatedRule);
|
|
71
|
+
setIsValid(isRuleValid);
|
|
72
|
+
onUpdate(isRuleValid ? updatedRule : undefined);
|
|
73
|
+
}, [onUpdate, selectedFormatter]);
|
|
74
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
75
|
+
className: "conditional-format-editor form"
|
|
76
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
77
|
+
className: "mb-2"
|
|
78
|
+
}, /*#__PURE__*/React.createElement("label", {
|
|
79
|
+
className: "mb-0",
|
|
80
|
+
htmlFor: "formatter-select"
|
|
81
|
+
}, "Select Formatter"), /*#__PURE__*/React.createElement("div", {
|
|
82
|
+
className: "formatter-list"
|
|
83
|
+
}, formatterTypes.map((type, index) => /*#__PURE__*/React.createElement("div", {
|
|
84
|
+
key: type,
|
|
85
|
+
className: "formatter-type"
|
|
86
|
+
}, /*#__PURE__*/React.createElement("button", {
|
|
87
|
+
type: "button",
|
|
88
|
+
className: classNames('btn', 'btn-icon', 'btn-formatter-type', {
|
|
89
|
+
active: type === selectedFormatter
|
|
90
|
+
}),
|
|
91
|
+
"data-index": index,
|
|
92
|
+
onClick: () => handleFormatterChange(type)
|
|
93
|
+
}, getFormatterTypeIcon(type), getFormatterTypeLabel(type)))))), selectedFormatter === FormatterType.CONDITIONAL && /*#__PURE__*/React.createElement(ColumnFormatEditor, {
|
|
94
|
+
columns: columns,
|
|
95
|
+
config: rule === null || rule === void 0 ? void 0 : rule.config,
|
|
96
|
+
onChange: handleRuleChange
|
|
97
|
+
}), selectedFormatter === FormatterType.ROWS && /*#__PURE__*/React.createElement(RowFormatEditor, {
|
|
98
|
+
columns: columns,
|
|
99
|
+
config: rule === null || rule === void 0 ? void 0 : rule.config,
|
|
100
|
+
onChange: handleRuleChange
|
|
101
|
+
}), /*#__PURE__*/React.createElement("hr", null), /*#__PURE__*/React.createElement("div", {
|
|
102
|
+
className: "d-flex justify-content-end my-3"
|
|
103
|
+
}, /*#__PURE__*/React.createElement(Button, {
|
|
104
|
+
kind: "secondary",
|
|
105
|
+
onClick: handleCancel,
|
|
106
|
+
className: "mr-2"
|
|
107
|
+
}, "Cancel"), /*#__PURE__*/React.createElement(Button, {
|
|
108
|
+
kind: "primary",
|
|
109
|
+
onClick: handleSave,
|
|
110
|
+
disabled: rule === undefined || !isValid
|
|
111
|
+
}, "Done")));
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
export default ConditionalFormatEditor;
|
|
115
|
+
//# sourceMappingURL=ConditionalFormatEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/sidebar/conditional-formatting/ConditionalFormatEditor.tsx"],"names":["React","useCallback","useState","classNames","Button","Log","FormatColumnWhereIcon","FormatRowWhereIcon","ColumnFormatEditor","RowFormatEditor","FormatterType","log","module","DEFAULT_CALLBACK","undefined","getFormatterTypeIcon","option","CONDITIONAL","ROWS","getFormatterTypeLabel","formatterTypes","ConditionalFormatEditor","props","columns","onSave","onUpdate","onCancel","rule","defaultRule","selectedFormatter","setFormatter","type","setRule","isValid","setIsValid","handleCancel","handleSave","error","handleFormatterChange","value","debug","handleRuleChange","ruleConfig","isRuleValid","updatedRule","config","map","index","active"],"mappings":"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","sourcesContent":["import React, { useCallback, useState } from 'react';\nimport classNames from 'classnames';\nimport { Button } from '@deephaven/components';\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 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 columns: 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\nconst ConditionalFormatEditor = (\n props: ConditionalFormatEditorProps\n): JSX.Element => {\n const {\n columns,\n onSave = DEFAULT_CALLBACK,\n onUpdate = DEFAULT_CALLBACK,\n onCancel = DEFAULT_CALLBACK,\n rule: defaultRule,\n } = props;\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) => {\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 config={rule?.config}\n onChange={handleRuleChange}\n />\n )}\n {selectedFormatter === FormatterType.ROWS && (\n <RowFormatEditor\n columns={columns}\n config={rule?.config}\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"],"file":"ConditionalFormatEditor.js"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Column, CustomColumn } from '@deephaven/jsapi-shim';
|
|
2
|
+
import { BaseFormatConfig } from './ConditionalFormattingUtils';
|
|
3
|
+
export declare function makeTernaryFormatRule(config: BaseFormatConfig, prevRule: string): string | undefined;
|
|
4
|
+
export declare function makeRowFormatColumn(rule: string): CustomColumn;
|
|
5
|
+
export declare function makeColumnFormatColumn(col: Column, rule: string): CustomColumn;
|
|
6
|
+
//# sourceMappingURL=ConditionalFormattingAPIUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConditionalFormattingAPIUtils.d.ts","sourceRoot":"","sources":["../../../src/sidebar/conditional-formatting/ConditionalFormattingAPIUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EACL,gBAAgB,EAGjB,MAAM,8BAA8B,CAAC;AAMtC,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,SAAS,CAOpB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAE9D;AAED,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,YAAY,CAEd"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { getConditionDBString, getStyleDBString } from "./ConditionalFormattingUtils.js"; // Conditional formatting API utils in a separate file
|
|
2
|
+
// to make ConditionalFormattingUtils.ts easier to test.
|
|
3
|
+
// https://github.com/facebook/jest/issues/936#issuecomment-545080082
|
|
4
|
+
|
|
5
|
+
export function makeTernaryFormatRule(config, prevRule) {
|
|
6
|
+
var styleDBString = getStyleDBString(config);
|
|
7
|
+
|
|
8
|
+
if (styleDBString === undefined) {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
var conditionDBString = getConditionDBString(config);
|
|
13
|
+
return "".concat(conditionDBString, " ? ").concat(styleDBString, " : ").concat(prevRule);
|
|
14
|
+
}
|
|
15
|
+
export function makeRowFormatColumn(rule) {
|
|
16
|
+
return dh.Column.formatRowColor(rule);
|
|
17
|
+
}
|
|
18
|
+
export function makeColumnFormatColumn(col, rule) {
|
|
19
|
+
return col.formatColor(rule);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=ConditionalFormattingAPIUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/sidebar/conditional-formatting/ConditionalFormattingAPIUtils.ts"],"names":["getConditionDBString","getStyleDBString","makeTernaryFormatRule","config","prevRule","styleDBString","undefined","conditionDBString","makeRowFormatColumn","rule","dh","Column","formatRowColor","makeColumnFormatColumn","col","formatColor"],"mappings":"SAGEA,oB,EACAC,gB,2CAGF;AACA;AACA;;AAEA,OAAO,SAASC,qBAAT,CACLC,MADK,EAELC,QAFK,EAGe;AACpB,MAAMC,aAAa,GAAGJ,gBAAgB,CAACE,MAAD,CAAtC;;AACA,MAAIE,aAAa,KAAKC,SAAtB,EAAiC;AAC/B,WAAOA,SAAP;AACD;;AACD,MAAMC,iBAAiB,GAAGP,oBAAoB,CAACG,MAAD,CAA9C;AACA,mBAAUI,iBAAV,gBAAiCF,aAAjC,gBAAoDD,QAApD;AACD;AAED,OAAO,SAASI,mBAAT,CAA6BC,IAA7B,EAAyD;AAC9D,SAAOC,EAAE,CAACC,MAAH,CAAUC,cAAV,CAAyBH,IAAzB,CAAP;AACD;AAED,OAAO,SAASI,sBAAT,CACLC,GADK,EAELL,IAFK,EAGS;AACd,SAAOK,GAAG,CAACC,WAAJ,CAAgBN,IAAhB,CAAP;AACD","sourcesContent":["import { Column, CustomColumn } from '@deephaven/jsapi-shim';\nimport {\n BaseFormatConfig,\n getConditionDBString,\n getStyleDBString,\n} from './ConditionalFormattingUtils';\n\n// Conditional formatting API utils in a separate file\n// to make ConditionalFormattingUtils.ts easier to test.\n// https://github.com/facebook/jest/issues/936#issuecomment-545080082\n\nexport function makeTernaryFormatRule(\n config: BaseFormatConfig,\n prevRule: string\n): string | undefined {\n const styleDBString = getStyleDBString(config);\n if (styleDBString === undefined) {\n return undefined;\n }\n const conditionDBString = getConditionDBString(config);\n return `${conditionDBString} ? ${styleDBString} : ${prevRule}`;\n}\n\nexport function makeRowFormatColumn(rule: string): CustomColumn {\n return dh.Column.formatRowColor(rule);\n}\n\nexport function makeColumnFormatColumn(\n col: Column,\n rule: string\n): CustomColumn {\n return col.formatColor(rule);\n}\n"],"file":"ConditionalFormattingAPIUtils.js"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
.conditional-formatting-rules {
|
|
2
|
+
padding: 0.25rem;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
.conditional-formatting-list-item {
|
|
6
|
+
display: flex;
|
|
7
|
+
flex-direction: row;
|
|
8
|
+
margin-bottom: 2px;
|
|
9
|
+
padding: 0 0.25rem;
|
|
10
|
+
}
|
|
11
|
+
.conditional-formatting-list-item:first-child {
|
|
12
|
+
padding-top: 0.25rem;
|
|
13
|
+
}
|
|
14
|
+
.conditional-formatting-list-item .formatting-item {
|
|
15
|
+
border-radius: 4px;
|
|
16
|
+
display: flex;
|
|
17
|
+
padding: 0.25rem;
|
|
18
|
+
flex-grow: 1;
|
|
19
|
+
align-items: center;
|
|
20
|
+
user-select: none;
|
|
21
|
+
transition: color 0.12s ease-in-out, background-color 0.12s ease-in-out, border-color 0.12s ease-in-out, box-shadow 0.12s ease-in-out;
|
|
22
|
+
border: 1px solid transparent;
|
|
23
|
+
line-height: 1.5;
|
|
24
|
+
cursor: pointer;
|
|
25
|
+
}
|
|
26
|
+
.conditional-formatting-list-item .formatting-item .btn-drag-handle {
|
|
27
|
+
cursor: grab;
|
|
28
|
+
}
|
|
29
|
+
.conditional-formatting-list-item .formatting-item .rule-icon {
|
|
30
|
+
padding-right: 0.5rem;
|
|
31
|
+
}
|
|
32
|
+
.conditional-formatting-list-item .formatting-item .rule-icon-bg {
|
|
33
|
+
min-width: 2rem;
|
|
34
|
+
height: 2rem;
|
|
35
|
+
display: flex;
|
|
36
|
+
font-size: x-small;
|
|
37
|
+
justify-content: center;
|
|
38
|
+
align-items: center;
|
|
39
|
+
}
|
|
40
|
+
.conditional-formatting-list-item .formatting-item .rule-title {
|
|
41
|
+
overflow-x: hidden;
|
|
42
|
+
text-overflow: ellipsis;
|
|
43
|
+
padding-right: 2px;
|
|
44
|
+
display: flex;
|
|
45
|
+
flex-grow: 1;
|
|
46
|
+
}
|
|
47
|
+
.conditional-formatting-list-item .formatting-item:focus {
|
|
48
|
+
outline: 0;
|
|
49
|
+
border: 1px solid rgba(72, 120, 234, 0.85);
|
|
50
|
+
box-shadow: 0 0 0 0.2rem rgba(72, 120, 234, 0.35);
|
|
51
|
+
}
|
|
52
|
+
.conditional-formatting-list-item .formatting-item:hover {
|
|
53
|
+
background: #5b5a5c;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/*# sourceMappingURL=ConditionalFormattingMenu.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["../../../src/sidebar/conditional-formatting/ConditionalFormattingMenu.scss","../../../../components/scss/new_variables.scss","../../../../components/scss/bootstrap_overrides.scss","../../../../../node_modules/bootstrap/scss/_variables.scss"],"names":[],"mappings":"AAEA;EACE,SCDS;;;ADIX;EACE;EACA;EACA;EACA;;AAEA;EACE,aCXO;;ADcT;EACE,eEwGY;EFvGZ;EACA,SCjBO;EDkBP;EACA;EACA;EACA,YEyGa;EFxGb;EACA,aG+Q0B;EH9Q1B;;AAEA;EACE;;AAGF;EACE,eC9BK;;ADiCP;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA,YEsFuB;;AFnFzB;EACE,YEtCK","file":"ConditionalFormattingMenu.css"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import './ConditionalFormattingMenu.scss';
|
|
2
|
+
import { FormattingRule } from './ConditionalFormattingUtils';
|
|
3
|
+
export declare type ChangeCallback = (rules: FormattingRule[]) => void;
|
|
4
|
+
export declare type SelectCallback = (index: number) => void;
|
|
5
|
+
export declare type CreateCallback = () => void;
|
|
6
|
+
export declare type ConditionalFormattingMenuProps = {
|
|
7
|
+
rules: FormattingRule[];
|
|
8
|
+
selectedColumn?: string;
|
|
9
|
+
onChange?: ChangeCallback;
|
|
10
|
+
onCreate?: CreateCallback;
|
|
11
|
+
onSelect?: SelectCallback;
|
|
12
|
+
};
|
|
13
|
+
declare const ConditionalFormattingMenu: (props: ConditionalFormattingMenuProps) => JSX.Element;
|
|
14
|
+
export default ConditionalFormattingMenu;
|
|
15
|
+
//# sourceMappingURL=ConditionalFormattingMenu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConditionalFormattingMenu.d.ts","sourceRoot":"","sources":["../../../src/sidebar/conditional-formatting/ConditionalFormattingMenu.tsx"],"names":[],"mappings":"AAQA,OAAO,kCAAkC,CAAC;AAC1C,OAAO,EAEL,cAAc,EAQf,MAAM,8BAA8B,CAAC;AAKtC,oBAAY,cAAc,GAAG,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;AAE/D,oBAAY,cAAc,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;AAErD,oBAAY,cAAc,GAAG,MAAM,IAAI,CAAC;AAExC,oBAAY,8BAA8B,GAAG;IAC3C,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B,CAAC;AAoDF,QAAA,MAAM,yBAAyB,UACtB,8BAA8B,KACpC,WA0JF,CAAC;AAEF,eAAe,yBAAyB,CAAC"}
|