@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.
Files changed (77) hide show
  1. package/dist/IrisGrid.d.ts +22 -2
  2. package/dist/IrisGrid.d.ts.map +1 -1
  3. package/dist/IrisGrid.js +143 -4
  4. package/dist/IrisGrid.js.map +1 -1
  5. package/dist/IrisGridModel.d.ts +14 -2
  6. package/dist/IrisGridModel.d.ts.map +1 -1
  7. package/dist/IrisGridModel.js +8 -0
  8. package/dist/IrisGridModel.js.map +1 -1
  9. package/dist/IrisGridModelUpdater.d.ts +3 -2
  10. package/dist/IrisGridModelUpdater.d.ts.map +1 -1
  11. package/dist/IrisGridModelUpdater.js +7 -1
  12. package/dist/IrisGridModelUpdater.js.map +1 -1
  13. package/dist/IrisGridProxyModel.d.ts.map +1 -1
  14. package/dist/IrisGridProxyModel.js +12 -0
  15. package/dist/IrisGridProxyModel.js.map +1 -1
  16. package/dist/IrisGridTableModel.d.ts +2 -0
  17. package/dist/IrisGridTableModel.d.ts.map +1 -1
  18. package/dist/IrisGridTableModel.js +47 -5
  19. package/dist/IrisGridTableModel.js.map +1 -1
  20. package/dist/IrisGridUtils.d.ts +2 -0
  21. package/dist/IrisGridUtils.d.ts.map +1 -1
  22. package/dist/IrisGridUtils.js +4 -0
  23. package/dist/IrisGridUtils.js.map +1 -1
  24. package/dist/sidebar/OptionType.d.ts +3 -1
  25. package/dist/sidebar/OptionType.d.ts.map +1 -1
  26. package/dist/sidebar/OptionType.js +2 -0
  27. package/dist/sidebar/OptionType.js.map +1 -1
  28. package/dist/sidebar/conditional-formatting/ColumnFormatEditor.d.ts +9 -0
  29. package/dist/sidebar/conditional-formatting/ColumnFormatEditor.d.ts.map +1 -0
  30. package/dist/sidebar/conditional-formatting/ColumnFormatEditor.js +132 -0
  31. package/dist/sidebar/conditional-formatting/ColumnFormatEditor.js.map +1 -0
  32. package/dist/sidebar/conditional-formatting/ConditionEditor.d.ts +9 -0
  33. package/dist/sidebar/conditional-formatting/ConditionEditor.d.ts.map +1 -0
  34. package/dist/sidebar/conditional-formatting/ConditionEditor.js +273 -0
  35. package/dist/sidebar/conditional-formatting/ConditionEditor.js.map +1 -0
  36. package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.css +21 -0
  37. package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.css.map +1 -0
  38. package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.d.ts +15 -0
  39. package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.d.ts.map +1 -0
  40. package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.js +115 -0
  41. package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.js.map +1 -0
  42. package/dist/sidebar/conditional-formatting/ConditionalFormattingAPIUtils.d.ts +6 -0
  43. package/dist/sidebar/conditional-formatting/ConditionalFormattingAPIUtils.d.ts.map +1 -0
  44. package/dist/sidebar/conditional-formatting/ConditionalFormattingAPIUtils.js +21 -0
  45. package/dist/sidebar/conditional-formatting/ConditionalFormattingAPIUtils.js.map +1 -0
  46. package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.css +56 -0
  47. package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.css.map +1 -0
  48. package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.d.ts +15 -0
  49. package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.d.ts.map +1 -0
  50. package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.js +160 -0
  51. package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.js.map +1 -0
  52. package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.d.ts +119 -0
  53. package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.d.ts.map +1 -0
  54. package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.js +748 -0
  55. package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.js.map +1 -0
  56. package/dist/sidebar/conditional-formatting/RowFormatEditor.d.ts +9 -0
  57. package/dist/sidebar/conditional-formatting/RowFormatEditor.d.ts.map +1 -0
  58. package/dist/sidebar/conditional-formatting/RowFormatEditor.js +132 -0
  59. package/dist/sidebar/conditional-formatting/RowFormatEditor.js.map +1 -0
  60. package/dist/sidebar/conditional-formatting/StyleEditor.css +54 -0
  61. package/dist/sidebar/conditional-formatting/StyleEditor.css.map +1 -0
  62. package/dist/sidebar/conditional-formatting/StyleEditor.d.ts +9 -0
  63. package/dist/sidebar/conditional-formatting/StyleEditor.d.ts.map +1 -0
  64. package/dist/sidebar/conditional-formatting/StyleEditor.js +160 -0
  65. package/dist/sidebar/conditional-formatting/StyleEditor.js.map +1 -0
  66. package/dist/sidebar/icons/FormatColumnWhereIcon.d.ts +4 -0
  67. package/dist/sidebar/icons/FormatColumnWhereIcon.d.ts.map +1 -0
  68. package/dist/sidebar/icons/FormatColumnWhereIcon.js +45 -0
  69. package/dist/sidebar/icons/FormatColumnWhereIcon.js.map +1 -0
  70. package/dist/sidebar/icons/FormatRowWhereIcon.d.ts +4 -0
  71. package/dist/sidebar/icons/FormatRowWhereIcon.d.ts.map +1 -0
  72. package/dist/sidebar/icons/FormatRowWhereIcon.js +39 -0
  73. package/dist/sidebar/icons/FormatRowWhereIcon.js.map +1 -0
  74. package/dist/sidebar/icons/index.d.ts +2 -0
  75. package/dist/sidebar/icons/index.js +2 -0
  76. package/dist/sidebar/icons/index.js.map +1 -1
  77. 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":"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","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":"AAAA,OAAOA,KAAP,IAAgBC,WAAhB,EAA6BC,QAA7B,QAA6C,OAA7C;AACA,OAAOC,UAAP,MAAuB,YAAvB;AACA,SAASC,MAAT,QAAuB,uBAAvB;AACA,OAAOC,GAAP,MAAgB,gBAAhB;SACSC,qB,EAAuBC,kB;OACzBC,kB;OACAC,e;SAGLC,a;;AAMF,IAAMC,GAAG,GAAGN,GAAG,CAACO,MAAJ,CAAW,yBAAX,CAAZ;;AAgBA,IAAMC,gBAAgB,GAAG,MAAMC,SAA/B;;AAEA,SAASC,oBAAT,CAA8BC,MAA9B,EAA8E;AAC5E,UAAQA,MAAR;AACE,SAAKN,aAAa,CAACO,WAAnB;AACE,0BAAO,oBAAC,qBAAD,OAAP;;AACF,SAAKP,aAAa,CAACQ,IAAnB;AACE,0BAAO,oBAAC,kBAAD,OAAP;AAJJ;AAMD;;AAED,SAASC,qBAAT,CAA+BH,MAA/B,EAA8D;AAC5D,UAAQA,MAAR;AACE,SAAKN,aAAa,CAACO,WAAnB;AACE,aAAO,aAAP;;AACF,SAAKP,aAAa,CAACQ,IAAnB;AACE,aAAO,MAAP;AAJJ;AAMD;;AAED,IAAME,cAAc,GAAG,CAACV,aAAa,CAACO,WAAf,EAA4BP,aAAa,CAACQ,IAA1C,CAAvB;;AAEA,IAAMG,uBAAuB,GAC3BC,KAD8B,IAEd;AAAA;;AAChB,MAAM;AACJC,IAAAA,OADI;AAEJC,IAAAA,MAAM,GAAGX,gBAFL;AAGJY,IAAAA,QAAQ,GAAGZ,gBAHP;AAIJa,IAAAA,QAAQ,GAAGb,gBAJP;AAKJc,IAAAA,IAAI,EAAEC;AALF,MAMFN,KANJ;AAQA,MAAM,CAACO,iBAAD,EAAoBC,YAApB,IAAoC5B,QAAQ,sBAChD0B,WADgD,aAChDA,WADgD,uBAChDA,WAAW,CAAEG,IADmC,iEAC3BX,cAAc,CAAC,CAAD,CADa,CAAlD;AAGA,MAAM,CAACO,IAAD,EAAOK,OAAP,IAAkB9B,QAAQ,CAAC0B,WAAD,CAAhC;AACA,MAAM,CAACK,OAAD,EAAUC,UAAV,IAAwBhC,QAAQ,CAAC,KAAD,CAAtC;AAEA,MAAMiC,YAAY,GAAGlC,WAAW,CAAC,MAAM;AACrCyB,IAAAA,QAAQ;AACT,GAF+B,EAE7B,CAACA,QAAD,CAF6B,CAAhC;AAIA,MAAMU,UAAU,GAAGnC,WAAW,CAAC,MAAM;AACnC,QAAI0B,IAAI,KAAKb,SAAb,EAAwB;AACtBH,MAAAA,GAAG,CAAC0B,KAAJ,CAAU,sBAAV;AACA;AACD;;AACDb,IAAAA,MAAM,CAACG,IAAD,CAAN;AACD,GAN6B,EAM3B,CAACH,MAAD,EAASG,IAAT,CAN2B,CAA9B;AAQA,MAAMW,qBAAqB,GAAGrC,WAAW,CAACsC,KAAK,IAAI;AACjD5B,IAAAA,GAAG,CAAC6B,KAAJ,CAAU,uBAAV,EAAmCD,KAAnC;AACAT,IAAAA,YAAY,CAACS,KAAD,CAAZ;AACD,GAHwC,EAGtC,EAHsC,CAAzC;AAKA,MAAME,gBAAgB,GAAGxC,WAAW,CAClC,CAACyC,UAAD,EAAaC,WAAb,KAA6B;AAC3BhC,IAAAA,GAAG,CAAC6B,KAAJ,CAAU,kBAAV,EAA8BE,UAA9B,EAA0CC,WAA1C,EAAuDd,iBAAvD;AACA,QAAMe,WAAW,GAAG;AAClBb,MAAAA,IAAI,EAAEF,iBADY;AAElBgB,MAAAA,MAAM,EAAEH;AAFU,KAApB;AAIAV,IAAAA,OAAO,CAACY,WAAD,CAAP;AACAV,IAAAA,UAAU,CAACS,WAAD,CAAV;AACAlB,IAAAA,QAAQ,CAACkB,WAAW,GAAGC,WAAH,GAAiB9B,SAA7B,CAAR;AACD,GAViC,EAWlC,CAACW,QAAD,EAAWI,iBAAX,CAXkC,CAApC;AAcA,sBACE;AAAK,IAAA,SAAS,EAAC;AAAf,kBACE;AAAK,IAAA,SAAS,EAAC;AAAf,kBACE;AAAO,IAAA,SAAS,EAAC,MAAjB;AAAwB,IAAA,OAAO,EAAC;AAAhC,wBADF,eAKE;AAAK,IAAA,SAAS,EAAC;AAAf,KACGT,cAAc,CAAC0B,GAAf,CAAmB,CAACf,IAAD,EAAOgB,KAAP,kBAClB;AAAK,IAAA,GAAG,EAAEhB,IAAV;AAAgB,IAAA,SAAS,EAAC;AAA1B,kBACE;AACE,IAAA,IAAI,EAAC,QADP;AAEE,IAAA,SAAS,EAAE5B,UAAU,CAAC,KAAD,EAAQ,UAAR,EAAoB,oBAApB,EAA0C;AAC7D6C,MAAAA,MAAM,EAAEjB,IAAI,KAAKF;AAD4C,KAA1C,CAFvB;AAKE,kBAAYkB,KALd;AAME,IAAA,OAAO,EAAE,MAAMT,qBAAqB,CAACP,IAAD;AANtC,KAQGhB,oBAAoB,CAACgB,IAAD,CARvB,EASGZ,qBAAqB,CAACY,IAAD,CATxB,CADF,CADD,CADH,CALF,CADF,EAwBGF,iBAAiB,KAAKnB,aAAa,CAACO,WAApC,iBACC,oBAAC,kBAAD;AACE,IAAA,OAAO,EAAEM,OADX;AAEE,IAAA,MAAM,EAAEI,IAAF,aAAEA,IAAF,uBAAEA,IAAI,CAAEkB,MAFhB;AAGE,IAAA,QAAQ,EAAEJ;AAHZ,IAzBJ,EA+BGZ,iBAAiB,KAAKnB,aAAa,CAACQ,IAApC,iBACC,oBAAC,eAAD;AACE,IAAA,OAAO,EAAEK,OADX;AAEE,IAAA,MAAM,EAAEI,IAAF,aAAEA,IAAF,uBAAEA,IAAI,CAAEkB,MAFhB;AAGE,IAAA,QAAQ,EAAEJ;AAHZ,IAhCJ,eAsCE,+BAtCF,eAuCE;AAAK,IAAA,SAAS,EAAC;AAAf,kBACE,oBAAC,MAAD;AAAQ,IAAA,IAAI,EAAC,WAAb;AAAyB,IAAA,OAAO,EAAEN,YAAlC;AAAgD,IAAA,SAAS,EAAC;AAA1D,cADF,eAIE,oBAAC,MAAD;AACE,IAAA,IAAI,EAAC,SADP;AAEE,IAAA,OAAO,EAAEC,UAFX;AAGE,IAAA,QAAQ,EAAET,IAAI,KAAKb,SAAT,IAAsB,CAACmB;AAHnC,YAJF,CAvCF,CADF;AAsDD,CAtGD;;AAwGA,eAAeZ,uBAAf","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"}