@deephaven/iris-grid 0.43.0 → 0.44.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/AdvancedFilterCreator.css +106 -0
- package/dist/AdvancedFilterCreator.css.map +1 -0
- package/dist/AdvancedFilterCreator.js +541 -0
- package/dist/AdvancedFilterCreator.js.map +1 -0
- package/dist/AdvancedFilterCreatorFilterItem.css +9 -0
- package/dist/AdvancedFilterCreatorFilterItem.css.map +1 -0
- package/dist/AdvancedFilterCreatorFilterItem.js +184 -0
- package/dist/AdvancedFilterCreatorFilterItem.js.map +1 -0
- package/dist/AdvancedFilterCreatorSelectValue.css +50 -0
- package/dist/AdvancedFilterCreatorSelectValue.css.map +1 -0
- package/dist/AdvancedFilterCreatorSelectValue.js +301 -0
- package/dist/AdvancedFilterCreatorSelectValue.js.map +1 -0
- package/dist/AdvancedFilterCreatorSelectValueList.js +272 -0
- package/dist/AdvancedFilterCreatorSelectValueList.js.map +1 -0
- package/dist/ColumnHeaderGroup.js +61 -0
- package/dist/ColumnHeaderGroup.js.map +1 -0
- package/dist/ColumnStatistics.css +76 -0
- package/dist/ColumnStatistics.css.map +1 -0
- package/dist/ColumnStatistics.js +202 -0
- package/dist/ColumnStatistics.js.map +1 -0
- package/dist/CommonTypes.js +2 -0
- package/dist/CommonTypes.js.map +1 -0
- package/dist/CrossColumnSearch.css +35 -0
- package/dist/CrossColumnSearch.css.map +1 -0
- package/dist/CrossColumnSearch.js +199 -0
- package/dist/CrossColumnSearch.js.map +1 -0
- package/dist/FilterInputField.css +56 -0
- package/dist/FilterInputField.css.map +1 -0
- package/dist/FilterInputField.js +232 -0
- package/dist/FilterInputField.js.map +1 -0
- package/dist/GotoRow.css +45 -0
- package/dist/GotoRow.css.map +1 -0
- package/dist/GotoRow.js +298 -0
- package/dist/GotoRow.js.map +1 -0
- package/dist/IrisGrid.css +359 -0
- package/dist/IrisGrid.css.map +1 -0
- package/dist/IrisGrid.js +3651 -0
- package/dist/IrisGrid.js.map +1 -0
- package/dist/IrisGridBottomBar.css +85 -0
- package/dist/IrisGridBottomBar.css.map +1 -0
- package/dist/IrisGridBottomBar.js +36 -0
- package/dist/IrisGridBottomBar.js.map +1 -0
- package/dist/IrisGridCellOverflowModal.css +17 -0
- package/dist/IrisGridCellOverflowModal.css.map +1 -0
- package/dist/IrisGridCellOverflowModal.js +157 -0
- package/dist/IrisGridCellOverflowModal.js.map +1 -0
- package/dist/IrisGridCellRendererUtils.js +20 -0
- package/dist/IrisGridCellRendererUtils.js.map +1 -0
- package/dist/IrisGridCopyHandler.css +64 -0
- package/dist/IrisGridCopyHandler.css.map +1 -0
- package/dist/IrisGridCopyHandler.js +331 -0
- package/dist/IrisGridCopyHandler.js.map +1 -0
- package/dist/IrisGridDataBarCellRenderer.js +10 -0
- package/dist/IrisGridDataBarCellRenderer.js.map +1 -0
- package/dist/IrisGridIcons.js +25 -0
- package/dist/IrisGridIcons.js.map +1 -0
- package/dist/IrisGridMetricCalculator.js +33 -0
- package/dist/IrisGridMetricCalculator.js.map +1 -0
- package/dist/IrisGridModel.js +263 -0
- package/dist/IrisGridModel.js.map +1 -0
- package/dist/IrisGridModelFactory.js +27 -0
- package/dist/IrisGridModelFactory.js.map +1 -0
- package/dist/IrisGridModelUpdater.js +96 -0
- package/dist/IrisGridModelUpdater.js.map +1 -0
- package/dist/IrisGridPartitionSelector.css +48 -0
- package/dist/IrisGridPartitionSelector.css.map +1 -0
- package/dist/IrisGridPartitionSelector.js +198 -0
- package/dist/IrisGridPartitionSelector.js.map +1 -0
- package/dist/IrisGridProxyModel.js +530 -0
- package/dist/IrisGridProxyModel.js.map +1 -0
- package/dist/IrisGridRenderer.js +779 -0
- package/dist/IrisGridRenderer.js.map +1 -0
- package/dist/IrisGridShortcuts.js +59 -0
- package/dist/IrisGridShortcuts.js.map +1 -0
- package/dist/IrisGridTableModel.js +273 -0
- package/dist/IrisGridTableModel.js.map +1 -0
- package/dist/IrisGridTableModelTemplate.js +1589 -0
- package/dist/IrisGridTableModelTemplate.js.map +1 -0
- package/dist/IrisGridTestUtils.js +121 -0
- package/dist/IrisGridTestUtils.js.map +1 -0
- package/dist/IrisGridTextCellRenderer.js +139 -0
- package/dist/IrisGridTextCellRenderer.js.map +1 -0
- package/dist/IrisGridTheme.js +96 -0
- package/dist/IrisGridTheme.js.map +1 -0
- package/dist/IrisGridTheme.module.css +69 -0
- package/dist/IrisGridTheme.module.css.map +1 -0
- package/dist/IrisGridTreeTableModel.js +145 -0
- package/dist/IrisGridTreeTableModel.js.map +1 -0
- package/dist/IrisGridUtils.js +1279 -0
- package/dist/IrisGridUtils.js.map +1 -0
- package/dist/MissingKeyError.js +15 -0
- package/dist/MissingKeyError.js.map +1 -0
- package/dist/PartitionSelectorSearch.css +22 -0
- package/dist/PartitionSelectorSearch.css.map +1 -0
- package/dist/PartitionSelectorSearch.js +317 -0
- package/dist/PartitionSelectorSearch.js.map +1 -0
- package/dist/PendingDataBottomBar.css +13 -0
- package/dist/PendingDataBottomBar.css.map +1 -0
- package/dist/PendingDataBottomBar.js +98 -0
- package/dist/PendingDataBottomBar.js.map +1 -0
- package/dist/TableViewportUpdater.js +156 -0
- package/dist/TableViewportUpdater.js.map +1 -0
- package/dist/ToastBottomBar.js +42 -0
- package/dist/ToastBottomBar.js.map +1 -0
- package/dist/TreeTableViewportUpdater.js +96 -0
- package/dist/TreeTableViewportUpdater.js.map +1 -0
- package/dist/declaration.d.js +2 -0
- package/dist/declaration.d.js.map +1 -0
- package/dist/format-context-menus/CustomFormatAction.css +25 -0
- package/dist/format-context-menus/CustomFormatAction.css.map +1 -0
- package/dist/format-context-menus/CustomFormatAction.js +132 -0
- package/dist/format-context-menus/CustomFormatAction.js.map +1 -0
- package/dist/format-context-menus/DateTimeFormatContextMenu.js +53 -0
- package/dist/format-context-menus/DateTimeFormatContextMenu.js.map +1 -0
- package/dist/format-context-menus/DecimalFormatContextMenu.js +59 -0
- package/dist/format-context-menus/DecimalFormatContextMenu.js.map +1 -0
- package/dist/format-context-menus/FormatContextMenuUtils.js +63 -0
- package/dist/format-context-menus/FormatContextMenuUtils.js.map +1 -0
- package/dist/format-context-menus/IntegerFormatContextMenu.js +43 -0
- package/dist/format-context-menus/IntegerFormatContextMenu.js.map +1 -0
- package/dist/format-context-menus/index.js +4 -0
- package/dist/format-context-menus/index.js.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/key-handlers/ClearFilterKeyHandler.js +21 -0
- package/dist/key-handlers/ClearFilterKeyHandler.js.map +1 -0
- package/dist/key-handlers/CopyKeyHandler.js +31 -0
- package/dist/key-handlers/CopyKeyHandler.js.map +1 -0
- package/dist/key-handlers/ReverseKeyHandler.js +32 -0
- package/dist/key-handlers/ReverseKeyHandler.js.map +1 -0
- package/dist/key-handlers/index.js +4 -0
- package/dist/key-handlers/index.js.map +1 -0
- package/dist/mousehandlers/IrisGridCellOverflowMouseHandler.js +175 -0
- package/dist/mousehandlers/IrisGridCellOverflowMouseHandler.js.map +1 -0
- package/dist/mousehandlers/IrisGridColumnSelectMouseHandler.js +139 -0
- package/dist/mousehandlers/IrisGridColumnSelectMouseHandler.js.map +1 -0
- package/dist/mousehandlers/IrisGridColumnTooltipMouseHandler.js +83 -0
- package/dist/mousehandlers/IrisGridColumnTooltipMouseHandler.js.map +1 -0
- package/dist/mousehandlers/IrisGridContextMenuHandler.css +19 -0
- package/dist/mousehandlers/IrisGridContextMenuHandler.css.map +1 -0
- package/dist/mousehandlers/IrisGridContextMenuHandler.js +1220 -0
- package/dist/mousehandlers/IrisGridContextMenuHandler.js.map +1 -0
- package/dist/mousehandlers/IrisGridDataSelectMouseHandler.js +28 -0
- package/dist/mousehandlers/IrisGridDataSelectMouseHandler.js.map +1 -0
- package/dist/mousehandlers/IrisGridFilterMouseHandler.js +80 -0
- package/dist/mousehandlers/IrisGridFilterMouseHandler.js.map +1 -0
- package/dist/mousehandlers/IrisGridRowTreeMouseHandler.js +126 -0
- package/dist/mousehandlers/IrisGridRowTreeMouseHandler.js.map +1 -0
- package/dist/mousehandlers/IrisGridSortMouseHandler.js +46 -0
- package/dist/mousehandlers/IrisGridSortMouseHandler.js.map +1 -0
- package/dist/mousehandlers/IrisGridTokenMouseHandler.js +151 -0
- package/dist/mousehandlers/IrisGridTokenMouseHandler.js.map +1 -0
- package/dist/mousehandlers/PendingMouseHandler.js +39 -0
- package/dist/mousehandlers/PendingMouseHandler.js.map +1 -0
- package/dist/mousehandlers/index.js +11 -0
- package/dist/mousehandlers/index.js.map +1 -0
- package/dist/sidebar/AdvancedSettings.js +6 -0
- package/dist/sidebar/AdvancedSettings.js.map +1 -0
- package/dist/sidebar/AdvancedSettingsMenu.js +29 -0
- package/dist/sidebar/AdvancedSettingsMenu.js.map +1 -0
- package/dist/sidebar/AdvancedSettingsType.js +7 -0
- package/dist/sidebar/AdvancedSettingsType.js.map +1 -0
- package/dist/sidebar/ChartBuilder.css +56 -0
- package/dist/sidebar/ChartBuilder.css.map +1 -0
- package/dist/sidebar/ChartBuilder.js +443 -0
- package/dist/sidebar/ChartBuilder.js.map +1 -0
- package/dist/sidebar/CustomColumnBuilder.css +58 -0
- package/dist/sidebar/CustomColumnBuilder.css.map +1 -0
- package/dist/sidebar/CustomColumnBuilder.js +384 -0
- package/dist/sidebar/CustomColumnBuilder.js.map +1 -0
- package/dist/sidebar/CustomColumnInput.d.ts.map +1 -1
- package/dist/sidebar/CustomColumnInput.js +91 -0
- package/dist/sidebar/CustomColumnInput.js.map +1 -0
- package/dist/sidebar/InputEditor.css +35 -0
- package/dist/sidebar/InputEditor.css.map +1 -0
- package/dist/sidebar/InputEditor.d.ts +4 -2
- package/dist/sidebar/InputEditor.d.ts.map +1 -1
- package/dist/sidebar/InputEditor.js +180 -0
- package/dist/sidebar/InputEditor.js.map +1 -0
- package/dist/sidebar/OptionType.js +19 -0
- package/dist/sidebar/OptionType.js.map +1 -0
- package/dist/sidebar/RollupRows.css +120 -0
- package/dist/sidebar/RollupRows.css.map +1 -0
- package/dist/sidebar/RollupRows.js +519 -0
- package/dist/sidebar/RollupRows.js.map +1 -0
- package/dist/sidebar/SelectDistinctBuilder.css +41 -0
- package/dist/sidebar/SelectDistinctBuilder.css.map +1 -0
- package/dist/sidebar/SelectDistinctBuilder.js +155 -0
- package/dist/sidebar/SelectDistinctBuilder.js.map +1 -0
- package/dist/sidebar/TableCsvExporter.css +32 -0
- package/dist/sidebar/TableCsvExporter.css.map +1 -0
- package/dist/sidebar/TableCsvExporter.js +399 -0
- package/dist/sidebar/TableCsvExporter.js.map +1 -0
- package/dist/sidebar/TableSaver.js +487 -0
- package/dist/sidebar/TableSaver.js.map +1 -0
- package/dist/sidebar/aggregations/AggregationEdit.css +61 -0
- package/dist/sidebar/aggregations/AggregationEdit.css.map +1 -0
- package/dist/sidebar/aggregations/AggregationEdit.js +155 -0
- package/dist/sidebar/aggregations/AggregationEdit.js.map +1 -0
- package/dist/sidebar/aggregations/AggregationOperation.js +19 -0
- package/dist/sidebar/aggregations/AggregationOperation.js.map +1 -0
- package/dist/sidebar/aggregations/AggregationUtils.js +59 -0
- package/dist/sidebar/aggregations/AggregationUtils.js.map +1 -0
- package/dist/sidebar/aggregations/Aggregations.css +43 -0
- package/dist/sidebar/aggregations/Aggregations.css.map +1 -0
- package/dist/sidebar/aggregations/Aggregations.js +178 -0
- package/dist/sidebar/aggregations/Aggregations.js.map +1 -0
- package/dist/sidebar/aggregations/index.js +2 -0
- package/dist/sidebar/aggregations/index.js.map +1 -0
- package/dist/sidebar/conditional-formatting/ColumnFormatEditor.js +123 -0
- package/dist/sidebar/conditional-formatting/ColumnFormatEditor.js.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionEditor.js +243 -0
- package/dist/sidebar/conditional-formatting/ConditionEditor.js.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.css +22 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.css.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.js +109 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.js.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingAPIUtils.js +18 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingAPIUtils.js.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.css +57 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.css.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.js +150 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.js.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.js +635 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.js.map +1 -0
- package/dist/sidebar/conditional-formatting/RowFormatEditor.js +122 -0
- package/dist/sidebar/conditional-formatting/RowFormatEditor.js.map +1 -0
- package/dist/sidebar/conditional-formatting/StyleEditor.css +55 -0
- package/dist/sidebar/conditional-formatting/StyleEditor.css.map +1 -0
- package/dist/sidebar/conditional-formatting/StyleEditor.js +150 -0
- package/dist/sidebar/conditional-formatting/StyleEditor.js.map +1 -0
- package/dist/sidebar/icons/BarIcon.js +24 -0
- package/dist/sidebar/icons/BarIcon.js.map +1 -0
- package/dist/sidebar/icons/FormatColumnWhereIcon.js +42 -0
- package/dist/sidebar/icons/FormatColumnWhereIcon.js.map +1 -0
- package/dist/sidebar/icons/FormatRowWhereIcon.js +36 -0
- package/dist/sidebar/icons/FormatRowWhereIcon.js.map +1 -0
- package/dist/sidebar/icons/HistogramIcon.js +24 -0
- package/dist/sidebar/icons/HistogramIcon.js.map +1 -0
- package/dist/sidebar/icons/LineIcon.js +27 -0
- package/dist/sidebar/icons/LineIcon.js.map +1 -0
- package/dist/sidebar/icons/PieIcon.js +24 -0
- package/dist/sidebar/icons/PieIcon.js.map +1 -0
- package/dist/sidebar/icons/ScatterIcon.js +74 -0
- package/dist/sidebar/icons/ScatterIcon.js.map +1 -0
- package/dist/sidebar/icons/index.js +8 -0
- package/dist/sidebar/icons/index.js.map +1 -0
- package/dist/sidebar/index.d.ts +1 -0
- package/dist/sidebar/index.d.ts.map +1 -1
- package/dist/sidebar/index.js +19 -0
- package/dist/sidebar/index.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.css +68 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.css.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.js +964 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilderUtils.js +132 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilderUtils.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.css +29 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.css.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.js +188 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.js +81 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/PointerSensorWithInteraction.js +30 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/PointerSensorWithInteraction.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.js +158 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.js +146 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.js +59 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.css +139 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.css.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.js +44 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/keyboardCoordinates.js +129 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/keyboardCoordinates.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/types.js +4 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/types.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.js +261 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.js.map +1 -0
- package/package.json +15 -15
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
2
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
3
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
4
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
5
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
6
|
+
import React, { useCallback, useEffect, useState } from 'react';
|
|
7
|
+
import Log from '@deephaven/log';
|
|
8
|
+
import { ComboBox } from '@deephaven/components';
|
|
9
|
+
import { getDefaultConditionConfigForType, getConditionConfig, getDefaultStyleConfig, FormatStyleType } from "./ConditionalFormattingUtils.js";
|
|
10
|
+
import ConditionEditor from "./ConditionEditor.js";
|
|
11
|
+
import StyleEditor from "./StyleEditor.js";
|
|
12
|
+
var log = Log.module('ColumnFormatEditor');
|
|
13
|
+
var DEFAULT_CALLBACK = () => undefined;
|
|
14
|
+
function makeDefaultConfig(columns) {
|
|
15
|
+
var {
|
|
16
|
+
type,
|
|
17
|
+
name
|
|
18
|
+
} = columns[0];
|
|
19
|
+
var column = {
|
|
20
|
+
type,
|
|
21
|
+
name
|
|
22
|
+
};
|
|
23
|
+
var config = _objectSpread({
|
|
24
|
+
column,
|
|
25
|
+
style: getDefaultStyleConfig()
|
|
26
|
+
}, getDefaultConditionConfigForType(type));
|
|
27
|
+
return config;
|
|
28
|
+
}
|
|
29
|
+
function ColumnFormatEditor(props) {
|
|
30
|
+
var _columns$find;
|
|
31
|
+
var {
|
|
32
|
+
columns,
|
|
33
|
+
config = makeDefaultConfig(columns),
|
|
34
|
+
dh,
|
|
35
|
+
onChange = DEFAULT_CALLBACK
|
|
36
|
+
} = props;
|
|
37
|
+
var [selectedColumn, setColumn] = useState((_columns$find = columns.find(c => c.name === config.column.name && c.type === config.column.type)) !== null && _columns$find !== void 0 ? _columns$find : columns[0]);
|
|
38
|
+
var [conditionConfig, setConditionConfig] = useState(getConditionConfig(config));
|
|
39
|
+
var [conditionValid, setConditionValid] = useState(false);
|
|
40
|
+
var [selectedStyle, setStyle] = useState(config.style);
|
|
41
|
+
var handleColumnChange = useCallback(value => {
|
|
42
|
+
var newColumn = columns.find(_ref => {
|
|
43
|
+
var {
|
|
44
|
+
name
|
|
45
|
+
} = _ref;
|
|
46
|
+
return name === value;
|
|
47
|
+
});
|
|
48
|
+
if (newColumn !== undefined) {
|
|
49
|
+
setColumn(newColumn);
|
|
50
|
+
if (selectedColumn.type !== newColumn.type) {
|
|
51
|
+
setConditionConfig(getDefaultConditionConfigForType(newColumn.type));
|
|
52
|
+
setConditionValid(false);
|
|
53
|
+
}
|
|
54
|
+
} else {
|
|
55
|
+
log.error("Column ".concat(value, " not found."));
|
|
56
|
+
}
|
|
57
|
+
}, [columns, selectedColumn]);
|
|
58
|
+
var handleConditionChange = useCallback((updatedConditionConfig, isValid) => {
|
|
59
|
+
log.debug('handleConditionChange', updatedConditionConfig, isValid);
|
|
60
|
+
setConditionConfig(updatedConditionConfig);
|
|
61
|
+
setConditionValid(isValid);
|
|
62
|
+
}, []);
|
|
63
|
+
var handleStyleChange = useCallback(updatedStyleConfig => {
|
|
64
|
+
log.debug('handleStyleChange', updatedStyleConfig);
|
|
65
|
+
setStyle(updatedStyleConfig);
|
|
66
|
+
}, []);
|
|
67
|
+
useEffect(function updateColumnFormat() {
|
|
68
|
+
var isValid = conditionValid;
|
|
69
|
+
if (selectedColumn === undefined) {
|
|
70
|
+
log.debug('Column is not selected, invalidating update.');
|
|
71
|
+
isValid = false;
|
|
72
|
+
}
|
|
73
|
+
if (selectedStyle === undefined || selectedStyle.type === FormatStyleType.NO_FORMATTING) {
|
|
74
|
+
log.debug('Style is not selected, invalidating update.');
|
|
75
|
+
isValid = false;
|
|
76
|
+
}
|
|
77
|
+
var {
|
|
78
|
+
type,
|
|
79
|
+
name
|
|
80
|
+
} = selectedColumn;
|
|
81
|
+
var column = {
|
|
82
|
+
type,
|
|
83
|
+
name
|
|
84
|
+
};
|
|
85
|
+
onChange(_objectSpread({
|
|
86
|
+
column,
|
|
87
|
+
style: selectedStyle
|
|
88
|
+
}, conditionConfig), isValid);
|
|
89
|
+
}, [onChange, selectedColumn, selectedStyle, conditionConfig, conditionValid]);
|
|
90
|
+
var columnInputOptions = columns.map(_ref2 => {
|
|
91
|
+
var {
|
|
92
|
+
name
|
|
93
|
+
} = _ref2;
|
|
94
|
+
return {
|
|
95
|
+
title: name,
|
|
96
|
+
value: name
|
|
97
|
+
};
|
|
98
|
+
});
|
|
99
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
100
|
+
className: "conditional-rule-editor form"
|
|
101
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
102
|
+
className: "mb-2"
|
|
103
|
+
}, /*#__PURE__*/React.createElement("label", {
|
|
104
|
+
className: "mb-0"
|
|
105
|
+
}, "Format Cell If"), /*#__PURE__*/React.createElement(ComboBox, {
|
|
106
|
+
defaultValue: selectedColumn === null || selectedColumn === void 0 ? void 0 : selectedColumn.name,
|
|
107
|
+
options: columnInputOptions,
|
|
108
|
+
inputPlaceholder: "Select a column",
|
|
109
|
+
spellCheck: false,
|
|
110
|
+
onChange: handleColumnChange,
|
|
111
|
+
searchPlaceholder: "Filter columns"
|
|
112
|
+
})), selectedColumn !== undefined && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ConditionEditor, {
|
|
113
|
+
dh: dh,
|
|
114
|
+
column: selectedColumn,
|
|
115
|
+
config: conditionConfig,
|
|
116
|
+
onChange: handleConditionChange
|
|
117
|
+
}), /*#__PURE__*/React.createElement(StyleEditor, {
|
|
118
|
+
config: selectedStyle,
|
|
119
|
+
onChange: handleStyleChange
|
|
120
|
+
})));
|
|
121
|
+
}
|
|
122
|
+
export default ColumnFormatEditor;
|
|
123
|
+
//# sourceMappingURL=ColumnFormatEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ColumnFormatEditor.js","names":["React","useCallback","useEffect","useState","Log","ComboBox","getDefaultConditionConfigForType","getConditionConfig","getDefaultStyleConfig","FormatStyleType","ConditionEditor","StyleEditor","log","module","DEFAULT_CALLBACK","undefined","makeDefaultConfig","columns","type","name","column","config","style","ColumnFormatEditor","props","dh","onChange","selectedColumn","setColumn","find","c","conditionConfig","setConditionConfig","conditionValid","setConditionValid","selectedStyle","setStyle","handleColumnChange","value","newColumn","error","handleConditionChange","updatedConditionConfig","isValid","debug","handleStyleChange","updatedStyleConfig","updateColumnFormat","NO_FORMATTING","columnInputOptions","map","title"],"sources":["../../../src/sidebar/conditional-formatting/ColumnFormatEditor.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useState } from 'react';\nimport Log from '@deephaven/log';\nimport { ComboBox } from '@deephaven/components';\nimport type { dh as DhType } from '@deephaven/jsapi-types';\nimport {\n BaseFormatConfig,\n ChangeCallback,\n getDefaultConditionConfigForType,\n getConditionConfig,\n getDefaultStyleConfig,\n ModelColumn,\n FormatStyleType,\n} from './ConditionalFormattingUtils';\nimport ConditionEditor from './ConditionEditor';\nimport StyleEditor from './StyleEditor';\n\nconst log = Log.module('ColumnFormatEditor');\n\nexport interface ColumnFormatEditorProps {\n columns: ModelColumn[];\n config?: BaseFormatConfig;\n dh: DhType;\n onChange?: ChangeCallback;\n}\n\nconst DEFAULT_CALLBACK = () => undefined;\n\nfunction makeDefaultConfig(columns: ModelColumn[]): BaseFormatConfig {\n const { type, name } = columns[0];\n const column = { type, name };\n const config = {\n column,\n style: getDefaultStyleConfig(),\n ...getDefaultConditionConfigForType(type),\n };\n return config;\n}\n\nfunction ColumnFormatEditor(props: ColumnFormatEditorProps): JSX.Element {\n const {\n columns,\n config = makeDefaultConfig(columns),\n dh,\n onChange = DEFAULT_CALLBACK,\n } = props;\n\n const [selectedColumn, setColumn] = useState(\n columns.find(\n c => c.name === config.column.name && c.type === config.column.type\n ) ?? columns[0]\n );\n const [conditionConfig, setConditionConfig] = useState(\n getConditionConfig(config)\n );\n const [conditionValid, setConditionValid] = useState(false);\n const [selectedStyle, setStyle] = useState(config.style);\n\n const handleColumnChange = useCallback(\n value => {\n const newColumn = columns.find(({ name }) => name === value);\n if (newColumn !== undefined) {\n setColumn(newColumn);\n if (selectedColumn.type !== newColumn.type) {\n setConditionConfig(getDefaultConditionConfigForType(newColumn.type));\n setConditionValid(false);\n }\n } else {\n log.error(`Column ${value} not found.`);\n }\n },\n [columns, selectedColumn]\n );\n\n const handleConditionChange = useCallback(\n (updatedConditionConfig, isValid) => {\n log.debug('handleConditionChange', updatedConditionConfig, isValid);\n setConditionConfig(updatedConditionConfig);\n setConditionValid(isValid);\n },\n []\n );\n\n const handleStyleChange = useCallback(updatedStyleConfig => {\n log.debug('handleStyleChange', updatedStyleConfig);\n setStyle(updatedStyleConfig);\n }, []);\n\n useEffect(\n function updateColumnFormat() {\n let isValid = conditionValid;\n\n if (selectedColumn === undefined) {\n log.debug('Column is not selected, invalidating update.');\n isValid = false;\n }\n if (\n selectedStyle === undefined ||\n selectedStyle.type === FormatStyleType.NO_FORMATTING\n ) {\n log.debug('Style is not selected, invalidating update.');\n isValid = false;\n }\n\n const { type, name } = selectedColumn;\n const column = { type, name };\n onChange(\n {\n column,\n style: selectedStyle,\n ...conditionConfig,\n },\n isValid\n );\n },\n [onChange, selectedColumn, selectedStyle, conditionConfig, conditionValid]\n );\n\n const columnInputOptions = columns.map(({ name }) => ({\n title: name,\n value: name,\n }));\n\n return (\n <div className=\"conditional-rule-editor form\">\n <div className=\"mb-2\">\n <label className=\"mb-0\">Format Cell If</label>\n <ComboBox\n defaultValue={selectedColumn?.name}\n options={columnInputOptions}\n inputPlaceholder=\"Select a column\"\n spellCheck={false}\n onChange={handleColumnChange}\n searchPlaceholder=\"Filter columns\"\n />\n </div>\n\n {selectedColumn !== undefined && (\n <>\n <ConditionEditor\n dh={dh}\n column={selectedColumn}\n config={conditionConfig}\n onChange={handleConditionChange}\n />\n <StyleEditor config={selectedStyle} onChange={handleStyleChange} />\n </>\n )}\n </div>\n );\n}\n\nexport default ColumnFormatEditor;\n"],"mappings":";;;;;AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAC/D,OAAOC,GAAG,MAAM,gBAAgB;AAChC,SAASC,QAAQ,QAAQ,uBAAuB;AAAC,SAK/CC,gCAAgC,EAChCC,kBAAkB,EAClBC,qBAAqB,EAErBC,eAAe;AAAA,OAEVC,eAAe;AAAA,OACfC,WAAW;AAElB,IAAMC,GAAG,GAAGR,GAAG,CAACS,MAAM,CAAC,oBAAoB,CAAC;AAS5C,IAAMC,gBAAgB,GAAG,MAAMC,SAAS;AAExC,SAASC,iBAAiB,CAACC,OAAsB,EAAoB;EACnE,IAAM;IAAEC,IAAI;IAAEC;EAAK,CAAC,GAAGF,OAAO,CAAC,CAAC,CAAC;EACjC,IAAMG,MAAM,GAAG;IAAEF,IAAI;IAAEC;EAAK,CAAC;EAC7B,IAAME,MAAM;IACVD,MAAM;IACNE,KAAK,EAAEd,qBAAqB;EAAE,GAC3BF,gCAAgC,CAACY,IAAI,CAAC,CAC1C;EACD,OAAOG,MAAM;AACf;AAEA,SAASE,kBAAkB,CAACC,KAA8B,EAAe;EAAA;EACvE,IAAM;IACJP,OAAO;IACPI,MAAM,GAAGL,iBAAiB,CAACC,OAAO,CAAC;IACnCQ,EAAE;IACFC,QAAQ,GAAGZ;EACb,CAAC,GAAGU,KAAK;EAET,IAAM,CAACG,cAAc,EAAEC,SAAS,CAAC,GAAGzB,QAAQ,kBAC1Cc,OAAO,CAACY,IAAI,CACVC,CAAC,IAAIA,CAAC,CAACX,IAAI,KAAKE,MAAM,CAACD,MAAM,CAACD,IAAI,IAAIW,CAAC,CAACZ,IAAI,KAAKG,MAAM,CAACD,MAAM,CAACF,IAAI,CACpE,yDAAID,OAAO,CAAC,CAAC,CAAC,CAChB;EACD,IAAM,CAACc,eAAe,EAAEC,kBAAkB,CAAC,GAAG7B,QAAQ,CACpDI,kBAAkB,CAACc,MAAM,CAAC,CAC3B;EACD,IAAM,CAACY,cAAc,EAAEC,iBAAiB,CAAC,GAAG/B,QAAQ,CAAC,KAAK,CAAC;EAC3D,IAAM,CAACgC,aAAa,EAAEC,QAAQ,CAAC,GAAGjC,QAAQ,CAACkB,MAAM,CAACC,KAAK,CAAC;EAExD,IAAMe,kBAAkB,GAAGpC,WAAW,CACpCqC,KAAK,IAAI;IACP,IAAMC,SAAS,GAAGtB,OAAO,CAACY,IAAI,CAAC;MAAA,IAAC;QAAEV;MAAK,CAAC;MAAA,OAAKA,IAAI,KAAKmB,KAAK;IAAA,EAAC;IAC5D,IAAIC,SAAS,KAAKxB,SAAS,EAAE;MAC3Ba,SAAS,CAACW,SAAS,CAAC;MACpB,IAAIZ,cAAc,CAACT,IAAI,KAAKqB,SAAS,CAACrB,IAAI,EAAE;QAC1Cc,kBAAkB,CAAC1B,gCAAgC,CAACiC,SAAS,CAACrB,IAAI,CAAC,CAAC;QACpEgB,iBAAiB,CAAC,KAAK,CAAC;MAC1B;IACF,CAAC,MAAM;MACLtB,GAAG,CAAC4B,KAAK,kBAAWF,KAAK,iBAAc;IACzC;EACF,CAAC,EACD,CAACrB,OAAO,EAAEU,cAAc,CAAC,CAC1B;EAED,IAAMc,qBAAqB,GAAGxC,WAAW,CACvC,CAACyC,sBAAsB,EAAEC,OAAO,KAAK;IACnC/B,GAAG,CAACgC,KAAK,CAAC,uBAAuB,EAAEF,sBAAsB,EAAEC,OAAO,CAAC;IACnEX,kBAAkB,CAACU,sBAAsB,CAAC;IAC1CR,iBAAiB,CAACS,OAAO,CAAC;EAC5B,CAAC,EACD,EAAE,CACH;EAED,IAAME,iBAAiB,GAAG5C,WAAW,CAAC6C,kBAAkB,IAAI;IAC1DlC,GAAG,CAACgC,KAAK,CAAC,mBAAmB,EAAEE,kBAAkB,CAAC;IAClDV,QAAQ,CAACU,kBAAkB,CAAC;EAC9B,CAAC,EAAE,EAAE,CAAC;EAEN5C,SAAS,CACP,SAAS6C,kBAAkB,GAAG;IAC5B,IAAIJ,OAAO,GAAGV,cAAc;IAE5B,IAAIN,cAAc,KAAKZ,SAAS,EAAE;MAChCH,GAAG,CAACgC,KAAK,CAAC,8CAA8C,CAAC;MACzDD,OAAO,GAAG,KAAK;IACjB;IACA,IACER,aAAa,KAAKpB,SAAS,IAC3BoB,aAAa,CAACjB,IAAI,KAAKT,eAAe,CAACuC,aAAa,EACpD;MACApC,GAAG,CAACgC,KAAK,CAAC,6CAA6C,CAAC;MACxDD,OAAO,GAAG,KAAK;IACjB;IAEA,IAAM;MAAEzB,IAAI;MAAEC;IAAK,CAAC,GAAGQ,cAAc;IACrC,IAAMP,MAAM,GAAG;MAAEF,IAAI;MAAEC;IAAK,CAAC;IAC7BO,QAAQ;MAEJN,MAAM;MACNE,KAAK,EAAEa;IAAa,GACjBJ,eAAe,GAEpBY,OAAO,CACR;EACH,CAAC,EACD,CAACjB,QAAQ,EAAEC,cAAc,EAAEQ,aAAa,EAAEJ,eAAe,EAAEE,cAAc,CAAC,CAC3E;EAED,IAAMgB,kBAAkB,GAAGhC,OAAO,CAACiC,GAAG,CAAC;IAAA,IAAC;MAAE/B;IAAK,CAAC;IAAA,OAAM;MACpDgC,KAAK,EAAEhC,IAAI;MACXmB,KAAK,EAAEnB;IACT,CAAC;EAAA,CAAC,CAAC;EAEH,oBACE;IAAK,SAAS,EAAC;EAA8B,gBAC3C;IAAK,SAAS,EAAC;EAAM,gBACnB;IAAO,SAAS,EAAC;EAAM,GAAC,gBAAc,CAAQ,eAC9C,oBAAC,QAAQ;IACP,YAAY,EAAEQ,cAAc,aAAdA,cAAc,uBAAdA,cAAc,CAAER,IAAK;IACnC,OAAO,EAAE8B,kBAAmB;IAC5B,gBAAgB,EAAC,iBAAiB;IAClC,UAAU,EAAE,KAAM;IAClB,QAAQ,EAAEZ,kBAAmB;IAC7B,iBAAiB,EAAC;EAAgB,EAClC,CACE,EAELV,cAAc,KAAKZ,SAAS,iBAC3B,uDACE,oBAAC,eAAe;IACd,EAAE,EAAEU,EAAG;IACP,MAAM,EAAEE,cAAe;IACvB,MAAM,EAAEI,eAAgB;IACxB,QAAQ,EAAEU;EAAsB,EAChC,eACF,oBAAC,WAAW;IAAC,MAAM,EAAEN,aAAc;IAAC,QAAQ,EAAEU;EAAkB,EAAG,CAEtE,CACG;AAEV;AAEA,eAAetB,kBAAkB"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
|
2
|
+
import { TableUtils } from '@deephaven/jsapi-utils';
|
|
3
|
+
import Log from '@deephaven/log';
|
|
4
|
+
import { StringCondition, DateCondition, getLabelForNumberCondition, getLabelForDateCondition, getLabelForStringCondition, NumberCondition, getDefaultConditionForType, getLabelForBooleanCondition, BooleanCondition, CharCondition, getLabelForCharCondition, isDateConditionValid, getDefaultValueForType } from "./ConditionalFormattingUtils.js";
|
|
5
|
+
var log = Log.module('ConditionEditor');
|
|
6
|
+
var DEFAULT_CALLBACK = () => undefined;
|
|
7
|
+
var numberConditionOptions = [NumberCondition.IS_EQUAL, NumberCondition.IS_NOT_EQUAL, NumberCondition.IS_BETWEEN, NumberCondition.GREATER_THAN, NumberCondition.GREATER_THAN_OR_EQUAL, NumberCondition.LESS_THAN, NumberCondition.LESS_THAN_OR_EQUAL, NumberCondition.IS_NULL, NumberCondition.IS_NOT_NULL].map(option => /*#__PURE__*/React.createElement("option", {
|
|
8
|
+
key: option,
|
|
9
|
+
value: option
|
|
10
|
+
}, getLabelForNumberCondition(option)));
|
|
11
|
+
var stringConditions = [StringCondition.IS_EXACTLY, StringCondition.IS_NOT_EXACTLY, StringCondition.CONTAINS, StringCondition.DOES_NOT_CONTAIN, StringCondition.STARTS_WITH, StringCondition.ENDS_WITH, StringCondition.IS_NULL, StringCondition.IS_NOT_NULL].map(option => /*#__PURE__*/React.createElement("option", {
|
|
12
|
+
key: option,
|
|
13
|
+
value: option
|
|
14
|
+
}, getLabelForStringCondition(option)));
|
|
15
|
+
var dateConditions = [DateCondition.IS_EXACTLY, DateCondition.IS_NOT_EXACTLY, DateCondition.IS_BEFORE, DateCondition.IS_BEFORE_OR_EQUAL, DateCondition.IS_AFTER, DateCondition.IS_AFTER_OR_EQUAL, DateCondition.IS_NULL, DateCondition.IS_NOT_NULL].map(option => /*#__PURE__*/React.createElement("option", {
|
|
16
|
+
key: option,
|
|
17
|
+
value: option
|
|
18
|
+
}, getLabelForDateCondition(option)));
|
|
19
|
+
var booleanConditions = [BooleanCondition.IS_TRUE, BooleanCondition.IS_FALSE, BooleanCondition.IS_NULL, BooleanCondition.IS_NOT_NULL].map(option => /*#__PURE__*/React.createElement("option", {
|
|
20
|
+
key: option,
|
|
21
|
+
value: option
|
|
22
|
+
}, getLabelForBooleanCondition(option)));
|
|
23
|
+
var charConditions = [CharCondition.IS_EQUAL, CharCondition.IS_NOT_EQUAL, CharCondition.IS_NULL, CharCondition.IS_NOT_NULL].map(option => /*#__PURE__*/React.createElement("option", {
|
|
24
|
+
key: option,
|
|
25
|
+
value: option
|
|
26
|
+
}, getLabelForCharCondition(option)));
|
|
27
|
+
function isNumberConditionValid(condition, value, startValue, endValue) {
|
|
28
|
+
if (condition === NumberCondition.IS_NULL || condition === NumberCondition.IS_NOT_NULL) {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
if (condition === NumberCondition.IS_BETWEEN && startValue != null && startValue !== '' && !Number.isNaN(Number.parseFloat(startValue)) && endValue != null && endValue !== '' && !Number.isNaN(Number.parseFloat(endValue))) {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
if (condition !== NumberCondition.IS_BETWEEN && value !== undefined && value !== '' && !Number.isNaN(Number.parseFloat(value))) {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
function getNumberInputs(selectedCondition, handleValueChange, handleStartValueChange, handleEndValueChange, conditionValue, startValue, endValue) {
|
|
40
|
+
switch (selectedCondition) {
|
|
41
|
+
case NumberCondition.IS_EQUAL:
|
|
42
|
+
case NumberCondition.IS_NOT_EQUAL:
|
|
43
|
+
case NumberCondition.GREATER_THAN:
|
|
44
|
+
case NumberCondition.GREATER_THAN_OR_EQUAL:
|
|
45
|
+
case NumberCondition.LESS_THAN:
|
|
46
|
+
case NumberCondition.LESS_THAN_OR_EQUAL:
|
|
47
|
+
return /*#__PURE__*/React.createElement("input", {
|
|
48
|
+
type: "number",
|
|
49
|
+
className: "form-control",
|
|
50
|
+
placeholder: "Enter value",
|
|
51
|
+
value: conditionValue !== null && conditionValue !== void 0 ? conditionValue : '',
|
|
52
|
+
onChange: handleValueChange
|
|
53
|
+
});
|
|
54
|
+
case NumberCondition.IS_BETWEEN:
|
|
55
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
56
|
+
className: "d-flex flex-row"
|
|
57
|
+
}, /*#__PURE__*/React.createElement("input", {
|
|
58
|
+
type: "number",
|
|
59
|
+
className: "form-control d-flex mr-2",
|
|
60
|
+
placeholder: "Start value",
|
|
61
|
+
value: startValue !== null && startValue !== void 0 ? startValue : '',
|
|
62
|
+
onChange: handleStartValueChange
|
|
63
|
+
}), /*#__PURE__*/React.createElement("input", {
|
|
64
|
+
type: "number",
|
|
65
|
+
className: "form-control d-flex",
|
|
66
|
+
placeholder: "End value",
|
|
67
|
+
value: endValue !== null && endValue !== void 0 ? endValue : '',
|
|
68
|
+
onChange: handleEndValueChange
|
|
69
|
+
}));
|
|
70
|
+
case NumberCondition.IS_NULL:
|
|
71
|
+
case NumberCondition.IS_NOT_NULL:
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function getStringInputs(selectedCondition, handleValueChange, conditionValue) {
|
|
76
|
+
switch (selectedCondition) {
|
|
77
|
+
case StringCondition.IS_NULL:
|
|
78
|
+
case StringCondition.IS_NOT_NULL:
|
|
79
|
+
return null;
|
|
80
|
+
default:
|
|
81
|
+
return /*#__PURE__*/React.createElement("input", {
|
|
82
|
+
type: "text",
|
|
83
|
+
className: "form-control",
|
|
84
|
+
placeholder: "Enter value",
|
|
85
|
+
value: conditionValue !== null && conditionValue !== void 0 ? conditionValue : '',
|
|
86
|
+
onChange: handleValueChange
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function getDateInputs(selectedCondition, handleValueChange, conditionValue) {
|
|
91
|
+
switch (selectedCondition) {
|
|
92
|
+
case DateCondition.IS_NULL:
|
|
93
|
+
case DateCondition.IS_NOT_NULL:
|
|
94
|
+
return null;
|
|
95
|
+
default:
|
|
96
|
+
return /*#__PURE__*/React.createElement("input", {
|
|
97
|
+
type: "text",
|
|
98
|
+
className: "form-control",
|
|
99
|
+
placeholder: "Enter value",
|
|
100
|
+
value: conditionValue !== null && conditionValue !== void 0 ? conditionValue : '',
|
|
101
|
+
onChange: handleValueChange
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function getBooleanInputs() {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
function getCharInputs(selectedCondition, handleValueChange, conditionValue) {
|
|
109
|
+
switch (selectedCondition) {
|
|
110
|
+
case CharCondition.IS_NULL:
|
|
111
|
+
case CharCondition.IS_NOT_NULL:
|
|
112
|
+
return null;
|
|
113
|
+
default:
|
|
114
|
+
return /*#__PURE__*/React.createElement("input", {
|
|
115
|
+
type: "text",
|
|
116
|
+
className: "form-control",
|
|
117
|
+
maxLength: 1,
|
|
118
|
+
placeholder: "Enter value",
|
|
119
|
+
value: conditionValue !== null && conditionValue !== void 0 ? conditionValue : '',
|
|
120
|
+
onChange: handleValueChange
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function ConditionEditor(props) {
|
|
125
|
+
var {
|
|
126
|
+
column,
|
|
127
|
+
config,
|
|
128
|
+
dh,
|
|
129
|
+
onChange = DEFAULT_CALLBACK
|
|
130
|
+
} = props;
|
|
131
|
+
var selectedColumnType = column.type;
|
|
132
|
+
var [prevColumnType, setPrevColumnType] = useState(selectedColumnType);
|
|
133
|
+
var [selectedCondition, setCondition] = useState(config.condition);
|
|
134
|
+
var [conditionValue, setValue] = useState(config.value);
|
|
135
|
+
var [startValue, setStartValue] = useState(config.start);
|
|
136
|
+
var [endValue, setEndValue] = useState(config.end);
|
|
137
|
+
if (selectedColumnType !== prevColumnType) {
|
|
138
|
+
// Column type changed, reset condition and value fields
|
|
139
|
+
setCondition(getDefaultConditionForType(selectedColumnType));
|
|
140
|
+
setValue(getDefaultValueForType(selectedColumnType));
|
|
141
|
+
setStartValue(undefined);
|
|
142
|
+
setEndValue(undefined);
|
|
143
|
+
setPrevColumnType(selectedColumnType);
|
|
144
|
+
}
|
|
145
|
+
var conditions = useMemo(() => {
|
|
146
|
+
if (selectedColumnType === undefined) {
|
|
147
|
+
return [];
|
|
148
|
+
}
|
|
149
|
+
if (TableUtils.isNumberType(selectedColumnType)) {
|
|
150
|
+
return numberConditionOptions;
|
|
151
|
+
}
|
|
152
|
+
if (TableUtils.isCharType(selectedColumnType)) {
|
|
153
|
+
return charConditions;
|
|
154
|
+
}
|
|
155
|
+
if (TableUtils.isStringType(selectedColumnType)) {
|
|
156
|
+
return stringConditions;
|
|
157
|
+
}
|
|
158
|
+
if (TableUtils.isDateType(selectedColumnType)) {
|
|
159
|
+
return dateConditions;
|
|
160
|
+
}
|
|
161
|
+
if (TableUtils.isBooleanType(selectedColumnType)) {
|
|
162
|
+
return booleanConditions;
|
|
163
|
+
}
|
|
164
|
+
}, [selectedColumnType]);
|
|
165
|
+
var handleConditionChange = useCallback(e => {
|
|
166
|
+
var {
|
|
167
|
+
value
|
|
168
|
+
} = e.target;
|
|
169
|
+
log.debug('handleConditionChange', value);
|
|
170
|
+
setCondition(value);
|
|
171
|
+
}, []);
|
|
172
|
+
var handleValueChange = useCallback(e => {
|
|
173
|
+
var {
|
|
174
|
+
value
|
|
175
|
+
} = e.target;
|
|
176
|
+
log.debug('handleValueChange', value);
|
|
177
|
+
setValue(value);
|
|
178
|
+
}, []);
|
|
179
|
+
var handleStartValueChange = useCallback(e => {
|
|
180
|
+
var {
|
|
181
|
+
value
|
|
182
|
+
} = e.target;
|
|
183
|
+
log.debug('handleStartValueChange', value);
|
|
184
|
+
setStartValue(value);
|
|
185
|
+
}, []);
|
|
186
|
+
var handleEndValueChange = useCallback(e => {
|
|
187
|
+
var {
|
|
188
|
+
value
|
|
189
|
+
} = e.target;
|
|
190
|
+
log.debug('handleEndValueChange', value);
|
|
191
|
+
setEndValue(value);
|
|
192
|
+
}, []);
|
|
193
|
+
useEffect(function changeCondition() {
|
|
194
|
+
var isValid = true;
|
|
195
|
+
if (selectedCondition === undefined) {
|
|
196
|
+
log.debug('Unable to create formatting rule. Condition is not selected.');
|
|
197
|
+
isValid = false;
|
|
198
|
+
} else if (TableUtils.isNumberType(column.type) && !isNumberConditionValid(selectedCondition, conditionValue, startValue, endValue)) {
|
|
199
|
+
log.debug('Unable to create formatting rule. Invalid value', conditionValue);
|
|
200
|
+
isValid = false;
|
|
201
|
+
} else if (TableUtils.isDateType(column.type) && !isDateConditionValid(dh, selectedCondition, conditionValue)) {
|
|
202
|
+
log.debug('Unable to create formatting rule. Invalid date condition', conditionValue);
|
|
203
|
+
isValid = false;
|
|
204
|
+
}
|
|
205
|
+
onChange({
|
|
206
|
+
condition: selectedCondition,
|
|
207
|
+
value: conditionValue,
|
|
208
|
+
start: startValue,
|
|
209
|
+
end: endValue
|
|
210
|
+
}, isValid);
|
|
211
|
+
}, [onChange, column.type, dh, selectedCondition, conditionValue, startValue, endValue]);
|
|
212
|
+
var conditionInputs = useMemo(() => {
|
|
213
|
+
if (selectedColumnType === undefined) {
|
|
214
|
+
// Column not selected
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
if (TableUtils.isNumberType(selectedColumnType)) {
|
|
218
|
+
return getNumberInputs(selectedCondition, handleValueChange, handleStartValueChange, handleEndValueChange, conditionValue, startValue, endValue);
|
|
219
|
+
}
|
|
220
|
+
if (TableUtils.isCharType(selectedColumnType)) {
|
|
221
|
+
return getCharInputs(selectedCondition, handleValueChange, conditionValue);
|
|
222
|
+
}
|
|
223
|
+
if (TableUtils.isStringType(selectedColumnType)) {
|
|
224
|
+
return getStringInputs(selectedCondition, handleValueChange, conditionValue);
|
|
225
|
+
}
|
|
226
|
+
if (TableUtils.isDateType(selectedColumnType)) {
|
|
227
|
+
return getDateInputs(selectedCondition, handleValueChange, conditionValue);
|
|
228
|
+
}
|
|
229
|
+
if (TableUtils.isBooleanType(selectedColumnType)) {
|
|
230
|
+
return getBooleanInputs();
|
|
231
|
+
}
|
|
232
|
+
}, [selectedColumnType, selectedCondition, conditionValue, startValue, endValue, handleValueChange, handleStartValueChange, handleEndValueChange]);
|
|
233
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
234
|
+
className: "condition-editor mb-2"
|
|
235
|
+
}, /*#__PURE__*/React.createElement("select", {
|
|
236
|
+
value: selectedCondition,
|
|
237
|
+
"data-testid": "condition-select",
|
|
238
|
+
className: "custom-select mb-2",
|
|
239
|
+
onChange: handleConditionChange
|
|
240
|
+
}, conditions), conditionInputs);
|
|
241
|
+
}
|
|
242
|
+
export default ConditionEditor;
|
|
243
|
+
//# sourceMappingURL=ConditionEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConditionEditor.js","names":["React","useCallback","useEffect","useMemo","useState","TableUtils","Log","StringCondition","DateCondition","getLabelForNumberCondition","getLabelForDateCondition","getLabelForStringCondition","NumberCondition","getDefaultConditionForType","getLabelForBooleanCondition","BooleanCondition","CharCondition","getLabelForCharCondition","isDateConditionValid","getDefaultValueForType","log","module","DEFAULT_CALLBACK","undefined","numberConditionOptions","IS_EQUAL","IS_NOT_EQUAL","IS_BETWEEN","GREATER_THAN","GREATER_THAN_OR_EQUAL","LESS_THAN","LESS_THAN_OR_EQUAL","IS_NULL","IS_NOT_NULL","map","option","stringConditions","IS_EXACTLY","IS_NOT_EXACTLY","CONTAINS","DOES_NOT_CONTAIN","STARTS_WITH","ENDS_WITH","dateConditions","IS_BEFORE","IS_BEFORE_OR_EQUAL","IS_AFTER","IS_AFTER_OR_EQUAL","booleanConditions","IS_TRUE","IS_FALSE","charConditions","isNumberConditionValid","condition","value","startValue","endValue","Number","isNaN","parseFloat","getNumberInputs","selectedCondition","handleValueChange","handleStartValueChange","handleEndValueChange","conditionValue","getStringInputs","getDateInputs","getBooleanInputs","getCharInputs","ConditionEditor","props","column","config","dh","onChange","selectedColumnType","type","prevColumnType","setPrevColumnType","setCondition","setValue","setStartValue","start","setEndValue","end","conditions","isNumberType","isCharType","isStringType","isDateType","isBooleanType","handleConditionChange","e","target","debug","changeCondition","isValid","conditionInputs"],"sources":["../../../src/sidebar/conditional-formatting/ConditionEditor.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { TableUtils } from '@deephaven/jsapi-utils';\nimport type { dh as DhType } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport {\n StringCondition,\n DateCondition,\n getLabelForNumberCondition,\n getLabelForDateCondition,\n getLabelForStringCondition,\n NumberCondition,\n ModelColumn,\n ConditionConfig,\n getDefaultConditionForType,\n getLabelForBooleanCondition,\n BooleanCondition,\n CharCondition,\n getLabelForCharCondition,\n isDateConditionValid,\n getDefaultValueForType,\n} from './ConditionalFormattingUtils';\n\nconst log = Log.module('ConditionEditor');\n\nexport interface ConditionEditorProps {\n dh: DhType;\n column: ModelColumn;\n config: ConditionConfig;\n onChange?: (config: ConditionConfig, isValid: boolean) => void;\n}\n\nconst DEFAULT_CALLBACK = () => undefined;\n\nconst numberConditionOptions = [\n NumberCondition.IS_EQUAL,\n NumberCondition.IS_NOT_EQUAL,\n NumberCondition.IS_BETWEEN,\n NumberCondition.GREATER_THAN,\n NumberCondition.GREATER_THAN_OR_EQUAL,\n NumberCondition.LESS_THAN,\n NumberCondition.LESS_THAN_OR_EQUAL,\n NumberCondition.IS_NULL,\n NumberCondition.IS_NOT_NULL,\n].map(option => (\n <option key={option} value={option}>\n {getLabelForNumberCondition(option)}\n </option>\n));\n\nconst stringConditions = [\n StringCondition.IS_EXACTLY,\n StringCondition.IS_NOT_EXACTLY,\n StringCondition.CONTAINS,\n StringCondition.DOES_NOT_CONTAIN,\n StringCondition.STARTS_WITH,\n StringCondition.ENDS_WITH,\n StringCondition.IS_NULL,\n StringCondition.IS_NOT_NULL,\n].map(option => (\n <option key={option} value={option}>\n {getLabelForStringCondition(option)}\n </option>\n));\n\nconst dateConditions = [\n DateCondition.IS_EXACTLY,\n DateCondition.IS_NOT_EXACTLY,\n DateCondition.IS_BEFORE,\n DateCondition.IS_BEFORE_OR_EQUAL,\n DateCondition.IS_AFTER,\n DateCondition.IS_AFTER_OR_EQUAL,\n DateCondition.IS_NULL,\n DateCondition.IS_NOT_NULL,\n].map(option => (\n <option key={option} value={option}>\n {getLabelForDateCondition(option)}\n </option>\n));\n\nconst booleanConditions = [\n BooleanCondition.IS_TRUE,\n BooleanCondition.IS_FALSE,\n BooleanCondition.IS_NULL,\n BooleanCondition.IS_NOT_NULL,\n].map(option => (\n <option key={option} value={option}>\n {getLabelForBooleanCondition(option)}\n </option>\n));\n\nconst charConditions = [\n CharCondition.IS_EQUAL,\n CharCondition.IS_NOT_EQUAL,\n CharCondition.IS_NULL,\n CharCondition.IS_NOT_NULL,\n].map(option => (\n <option key={option} value={option}>\n {getLabelForCharCondition(option)}\n </option>\n));\n\nfunction isNumberConditionValid(\n condition: NumberCondition,\n value?: string,\n startValue?: string,\n endValue?: string\n) {\n if (\n condition === NumberCondition.IS_NULL ||\n condition === NumberCondition.IS_NOT_NULL\n ) {\n return true;\n }\n if (\n condition === NumberCondition.IS_BETWEEN &&\n startValue != null &&\n startValue !== '' &&\n !Number.isNaN(Number.parseFloat(startValue)) &&\n endValue != null &&\n endValue !== '' &&\n !Number.isNaN(Number.parseFloat(endValue))\n ) {\n return true;\n }\n if (\n condition !== NumberCondition.IS_BETWEEN &&\n value !== undefined &&\n value !== '' &&\n !Number.isNaN(Number.parseFloat(value))\n ) {\n return true;\n }\n return false;\n}\n\nfunction getNumberInputs(\n selectedCondition: NumberCondition,\n handleValueChange: (e: unknown) => void,\n handleStartValueChange: (e: unknown) => void,\n handleEndValueChange: (e: unknown) => void,\n conditionValue?: string,\n startValue?: string,\n endValue?: string\n) {\n switch (selectedCondition) {\n case NumberCondition.IS_EQUAL:\n case NumberCondition.IS_NOT_EQUAL:\n case NumberCondition.GREATER_THAN:\n case NumberCondition.GREATER_THAN_OR_EQUAL:\n case NumberCondition.LESS_THAN:\n case NumberCondition.LESS_THAN_OR_EQUAL:\n return (\n <input\n type=\"number\"\n className=\"form-control\"\n placeholder=\"Enter value\"\n value={conditionValue ?? ''}\n onChange={handleValueChange}\n />\n );\n case NumberCondition.IS_BETWEEN:\n return (\n <div className=\"d-flex flex-row\">\n <input\n type=\"number\"\n className=\"form-control d-flex mr-2\"\n placeholder=\"Start value\"\n value={startValue ?? ''}\n onChange={handleStartValueChange}\n />\n <input\n type=\"number\"\n className=\"form-control d-flex\"\n placeholder=\"End value\"\n value={endValue ?? ''}\n onChange={handleEndValueChange}\n />\n </div>\n );\n case NumberCondition.IS_NULL:\n case NumberCondition.IS_NOT_NULL:\n return null;\n }\n}\n\nfunction getStringInputs(\n selectedCondition: StringCondition,\n handleValueChange: (e: unknown) => void,\n conditionValue?: string\n) {\n switch (selectedCondition) {\n case StringCondition.IS_NULL:\n case StringCondition.IS_NOT_NULL:\n return null;\n default:\n return (\n <input\n type=\"text\"\n className=\"form-control\"\n placeholder=\"Enter value\"\n value={conditionValue ?? ''}\n onChange={handleValueChange}\n />\n );\n }\n}\n\nfunction getDateInputs(\n selectedCondition: DateCondition,\n handleValueChange: (e: unknown) => void,\n conditionValue?: string\n) {\n switch (selectedCondition) {\n case DateCondition.IS_NULL:\n case DateCondition.IS_NOT_NULL:\n return null;\n default:\n return (\n <input\n type=\"text\"\n className=\"form-control\"\n placeholder=\"Enter value\"\n value={conditionValue ?? ''}\n onChange={handleValueChange}\n />\n );\n }\n}\n\nfunction getBooleanInputs() {\n return null;\n}\n\nfunction getCharInputs(\n selectedCondition: CharCondition,\n handleValueChange: (e: unknown) => void,\n conditionValue?: string\n) {\n switch (selectedCondition) {\n case CharCondition.IS_NULL:\n case CharCondition.IS_NOT_NULL:\n return null;\n default:\n return (\n <input\n type=\"text\"\n className=\"form-control\"\n maxLength={1}\n placeholder=\"Enter value\"\n value={conditionValue ?? ''}\n onChange={handleValueChange}\n />\n );\n }\n}\n\nfunction ConditionEditor(props: ConditionEditorProps): JSX.Element {\n const { column, config, dh, onChange = DEFAULT_CALLBACK } = props;\n const selectedColumnType = column.type;\n const [prevColumnType, setPrevColumnType] = useState(selectedColumnType);\n const [selectedCondition, setCondition] = useState(config.condition);\n const [conditionValue, setValue] = useState(config.value);\n const [startValue, setStartValue] = useState(config.start);\n const [endValue, setEndValue] = useState(config.end);\n\n if (selectedColumnType !== prevColumnType) {\n // Column type changed, reset condition and value fields\n setCondition(getDefaultConditionForType(selectedColumnType));\n setValue(getDefaultValueForType(selectedColumnType));\n setStartValue(undefined);\n setEndValue(undefined);\n setPrevColumnType(selectedColumnType);\n }\n\n const conditions = useMemo(() => {\n if (selectedColumnType === undefined) {\n return [];\n }\n if (TableUtils.isNumberType(selectedColumnType)) {\n return numberConditionOptions;\n }\n if (TableUtils.isCharType(selectedColumnType)) {\n return charConditions;\n }\n if (TableUtils.isStringType(selectedColumnType)) {\n return stringConditions;\n }\n if (TableUtils.isDateType(selectedColumnType)) {\n return dateConditions;\n }\n if (TableUtils.isBooleanType(selectedColumnType)) {\n return booleanConditions;\n }\n }, [selectedColumnType]);\n\n const handleConditionChange = useCallback(e => {\n const { value } = e.target;\n log.debug('handleConditionChange', value);\n setCondition(value);\n }, []);\n\n const handleValueChange = useCallback(e => {\n const { value } = e.target;\n log.debug('handleValueChange', value);\n setValue(value);\n }, []);\n\n const handleStartValueChange = useCallback(e => {\n const { value } = e.target;\n log.debug('handleStartValueChange', value);\n setStartValue(value);\n }, []);\n\n const handleEndValueChange = useCallback(e => {\n const { value } = e.target;\n log.debug('handleEndValueChange', value);\n setEndValue(value);\n }, []);\n\n useEffect(\n function changeCondition() {\n let isValid = true;\n\n if (selectedCondition === undefined) {\n log.debug(\n 'Unable to create formatting rule. Condition is not selected.'\n );\n isValid = false;\n } else if (\n TableUtils.isNumberType(column.type) &&\n !isNumberConditionValid(\n selectedCondition as NumberCondition,\n conditionValue,\n startValue,\n endValue\n )\n ) {\n log.debug(\n 'Unable to create formatting rule. Invalid value',\n conditionValue\n );\n isValid = false;\n } else if (\n TableUtils.isDateType(column.type) &&\n !isDateConditionValid(\n dh,\n selectedCondition as DateCondition,\n conditionValue\n )\n ) {\n log.debug(\n 'Unable to create formatting rule. Invalid date condition',\n conditionValue\n );\n isValid = false;\n }\n\n onChange(\n {\n condition: selectedCondition,\n value: conditionValue,\n start: startValue,\n end: endValue,\n },\n isValid\n );\n },\n [\n onChange,\n column.type,\n dh,\n selectedCondition,\n conditionValue,\n startValue,\n endValue,\n ]\n );\n\n const conditionInputs = useMemo(() => {\n if (selectedColumnType === undefined) {\n // Column not selected\n return null;\n }\n if (TableUtils.isNumberType(selectedColumnType)) {\n return getNumberInputs(\n selectedCondition as NumberCondition,\n handleValueChange,\n handleStartValueChange,\n handleEndValueChange,\n conditionValue,\n startValue,\n endValue\n );\n }\n if (TableUtils.isCharType(selectedColumnType)) {\n return getCharInputs(\n selectedCondition as CharCondition,\n handleValueChange,\n conditionValue\n );\n }\n if (TableUtils.isStringType(selectedColumnType)) {\n return getStringInputs(\n selectedCondition as StringCondition,\n handleValueChange,\n conditionValue\n );\n }\n if (TableUtils.isDateType(selectedColumnType)) {\n return getDateInputs(\n selectedCondition as DateCondition,\n handleValueChange,\n conditionValue\n );\n }\n if (TableUtils.isBooleanType(selectedColumnType)) {\n return getBooleanInputs();\n }\n }, [\n selectedColumnType,\n selectedCondition,\n conditionValue,\n startValue,\n endValue,\n handleValueChange,\n handleStartValueChange,\n handleEndValueChange,\n ]);\n\n return (\n <div className=\"condition-editor mb-2\">\n <select\n value={selectedCondition}\n data-testid=\"condition-select\"\n className=\"custom-select mb-2\"\n onChange={handleConditionChange}\n >\n {conditions}\n </select>\n {conditionInputs}\n </div>\n );\n}\n\nexport default ConditionEditor;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AACxE,SAASC,UAAU,QAAQ,wBAAwB;AAEnD,OAAOC,GAAG,MAAM,gBAAgB;AAAC,SAE/BC,eAAe,EACfC,aAAa,EACbC,0BAA0B,EAC1BC,wBAAwB,EACxBC,0BAA0B,EAC1BC,eAAe,EAGfC,0BAA0B,EAC1BC,2BAA2B,EAC3BC,gBAAgB,EAChBC,aAAa,EACbC,wBAAwB,EACxBC,oBAAoB,EACpBC,sBAAsB;AAGxB,IAAMC,GAAG,GAAGd,GAAG,CAACe,MAAM,CAAC,iBAAiB,CAAC;AASzC,IAAMC,gBAAgB,GAAG,MAAMC,SAAS;AAExC,IAAMC,sBAAsB,GAAG,CAC7BZ,eAAe,CAACa,QAAQ,EACxBb,eAAe,CAACc,YAAY,EAC5Bd,eAAe,CAACe,UAAU,EAC1Bf,eAAe,CAACgB,YAAY,EAC5BhB,eAAe,CAACiB,qBAAqB,EACrCjB,eAAe,CAACkB,SAAS,EACzBlB,eAAe,CAACmB,kBAAkB,EAClCnB,eAAe,CAACoB,OAAO,EACvBpB,eAAe,CAACqB,WAAW,CAC5B,CAACC,GAAG,CAACC,MAAM,iBACV;EAAQ,GAAG,EAAEA,MAAO;EAAC,KAAK,EAAEA;AAAO,GAChC1B,0BAA0B,CAAC0B,MAAM,CAAC,CAEtC,CAAC;AAEF,IAAMC,gBAAgB,GAAG,CACvB7B,eAAe,CAAC8B,UAAU,EAC1B9B,eAAe,CAAC+B,cAAc,EAC9B/B,eAAe,CAACgC,QAAQ,EACxBhC,eAAe,CAACiC,gBAAgB,EAChCjC,eAAe,CAACkC,WAAW,EAC3BlC,eAAe,CAACmC,SAAS,EACzBnC,eAAe,CAACyB,OAAO,EACvBzB,eAAe,CAAC0B,WAAW,CAC5B,CAACC,GAAG,CAACC,MAAM,iBACV;EAAQ,GAAG,EAAEA,MAAO;EAAC,KAAK,EAAEA;AAAO,GAChCxB,0BAA0B,CAACwB,MAAM,CAAC,CAEtC,CAAC;AAEF,IAAMQ,cAAc,GAAG,CACrBnC,aAAa,CAAC6B,UAAU,EACxB7B,aAAa,CAAC8B,cAAc,EAC5B9B,aAAa,CAACoC,SAAS,EACvBpC,aAAa,CAACqC,kBAAkB,EAChCrC,aAAa,CAACsC,QAAQ,EACtBtC,aAAa,CAACuC,iBAAiB,EAC/BvC,aAAa,CAACwB,OAAO,EACrBxB,aAAa,CAACyB,WAAW,CAC1B,CAACC,GAAG,CAACC,MAAM,iBACV;EAAQ,GAAG,EAAEA,MAAO;EAAC,KAAK,EAAEA;AAAO,GAChCzB,wBAAwB,CAACyB,MAAM,CAAC,CAEpC,CAAC;AAEF,IAAMa,iBAAiB,GAAG,CACxBjC,gBAAgB,CAACkC,OAAO,EACxBlC,gBAAgB,CAACmC,QAAQ,EACzBnC,gBAAgB,CAACiB,OAAO,EACxBjB,gBAAgB,CAACkB,WAAW,CAC7B,CAACC,GAAG,CAACC,MAAM,iBACV;EAAQ,GAAG,EAAEA,MAAO;EAAC,KAAK,EAAEA;AAAO,GAChCrB,2BAA2B,CAACqB,MAAM,CAAC,CAEvC,CAAC;AAEF,IAAMgB,cAAc,GAAG,CACrBnC,aAAa,CAACS,QAAQ,EACtBT,aAAa,CAACU,YAAY,EAC1BV,aAAa,CAACgB,OAAO,EACrBhB,aAAa,CAACiB,WAAW,CAC1B,CAACC,GAAG,CAACC,MAAM,iBACV;EAAQ,GAAG,EAAEA,MAAO;EAAC,KAAK,EAAEA;AAAO,GAChClB,wBAAwB,CAACkB,MAAM,CAAC,CAEpC,CAAC;AAEF,SAASiB,sBAAsB,CAC7BC,SAA0B,EAC1BC,KAAc,EACdC,UAAmB,EACnBC,QAAiB,EACjB;EACA,IACEH,SAAS,KAAKzC,eAAe,CAACoB,OAAO,IACrCqB,SAAS,KAAKzC,eAAe,CAACqB,WAAW,EACzC;IACA,OAAO,IAAI;EACb;EACA,IACEoB,SAAS,KAAKzC,eAAe,CAACe,UAAU,IACxC4B,UAAU,IAAI,IAAI,IAClBA,UAAU,KAAK,EAAE,IACjB,CAACE,MAAM,CAACC,KAAK,CAACD,MAAM,CAACE,UAAU,CAACJ,UAAU,CAAC,CAAC,IAC5CC,QAAQ,IAAI,IAAI,IAChBA,QAAQ,KAAK,EAAE,IACf,CAACC,MAAM,CAACC,KAAK,CAACD,MAAM,CAACE,UAAU,CAACH,QAAQ,CAAC,CAAC,EAC1C;IACA,OAAO,IAAI;EACb;EACA,IACEH,SAAS,KAAKzC,eAAe,CAACe,UAAU,IACxC2B,KAAK,KAAK/B,SAAS,IACnB+B,KAAK,KAAK,EAAE,IACZ,CAACG,MAAM,CAACC,KAAK,CAACD,MAAM,CAACE,UAAU,CAACL,KAAK,CAAC,CAAC,EACvC;IACA,OAAO,IAAI;EACb;EACA,OAAO,KAAK;AACd;AAEA,SAASM,eAAe,CACtBC,iBAAkC,EAClCC,iBAAuC,EACvCC,sBAA4C,EAC5CC,oBAA0C,EAC1CC,cAAuB,EACvBV,UAAmB,EACnBC,QAAiB,EACjB;EACA,QAAQK,iBAAiB;IACvB,KAAKjD,eAAe,CAACa,QAAQ;IAC7B,KAAKb,eAAe,CAACc,YAAY;IACjC,KAAKd,eAAe,CAACgB,YAAY;IACjC,KAAKhB,eAAe,CAACiB,qBAAqB;IAC1C,KAAKjB,eAAe,CAACkB,SAAS;IAC9B,KAAKlB,eAAe,CAACmB,kBAAkB;MACrC,oBACE;QACE,IAAI,EAAC,QAAQ;QACb,SAAS,EAAC,cAAc;QACxB,WAAW,EAAC,aAAa;QACzB,KAAK,EAAEkC,cAAc,aAAdA,cAAc,cAAdA,cAAc,GAAI,EAAG;QAC5B,QAAQ,EAAEH;MAAkB,EAC5B;IAEN,KAAKlD,eAAe,CAACe,UAAU;MAC7B,oBACE;QAAK,SAAS,EAAC;MAAiB,gBAC9B;QACE,IAAI,EAAC,QAAQ;QACb,SAAS,EAAC,0BAA0B;QACpC,WAAW,EAAC,aAAa;QACzB,KAAK,EAAE4B,UAAU,aAAVA,UAAU,cAAVA,UAAU,GAAI,EAAG;QACxB,QAAQ,EAAEQ;MAAuB,EACjC,eACF;QACE,IAAI,EAAC,QAAQ;QACb,SAAS,EAAC,qBAAqB;QAC/B,WAAW,EAAC,WAAW;QACvB,KAAK,EAAEP,QAAQ,aAARA,QAAQ,cAARA,QAAQ,GAAI,EAAG;QACtB,QAAQ,EAAEQ;MAAqB,EAC/B,CACE;IAEV,KAAKpD,eAAe,CAACoB,OAAO;IAC5B,KAAKpB,eAAe,CAACqB,WAAW;MAC9B,OAAO,IAAI;EAAC;AAElB;AAEA,SAASiC,eAAe,CACtBL,iBAAkC,EAClCC,iBAAuC,EACvCG,cAAuB,EACvB;EACA,QAAQJ,iBAAiB;IACvB,KAAKtD,eAAe,CAACyB,OAAO;IAC5B,KAAKzB,eAAe,CAAC0B,WAAW;MAC9B,OAAO,IAAI;IACb;MACE,oBACE;QACE,IAAI,EAAC,MAAM;QACX,SAAS,EAAC,cAAc;QACxB,WAAW,EAAC,aAAa;QACzB,KAAK,EAAEgC,cAAc,aAAdA,cAAc,cAAdA,cAAc,GAAI,EAAG;QAC5B,QAAQ,EAAEH;MAAkB,EAC5B;EACF;AAER;AAEA,SAASK,aAAa,CACpBN,iBAAgC,EAChCC,iBAAuC,EACvCG,cAAuB,EACvB;EACA,QAAQJ,iBAAiB;IACvB,KAAKrD,aAAa,CAACwB,OAAO;IAC1B,KAAKxB,aAAa,CAACyB,WAAW;MAC5B,OAAO,IAAI;IACb;MACE,oBACE;QACE,IAAI,EAAC,MAAM;QACX,SAAS,EAAC,cAAc;QACxB,WAAW,EAAC,aAAa;QACzB,KAAK,EAAEgC,cAAc,aAAdA,cAAc,cAAdA,cAAc,GAAI,EAAG;QAC5B,QAAQ,EAAEH;MAAkB,EAC5B;EACF;AAER;AAEA,SAASM,gBAAgB,GAAG;EAC1B,OAAO,IAAI;AACb;AAEA,SAASC,aAAa,CACpBR,iBAAgC,EAChCC,iBAAuC,EACvCG,cAAuB,EACvB;EACA,QAAQJ,iBAAiB;IACvB,KAAK7C,aAAa,CAACgB,OAAO;IAC1B,KAAKhB,aAAa,CAACiB,WAAW;MAC5B,OAAO,IAAI;IACb;MACE,oBACE;QACE,IAAI,EAAC,MAAM;QACX,SAAS,EAAC,cAAc;QACxB,SAAS,EAAE,CAAE;QACb,WAAW,EAAC,aAAa;QACzB,KAAK,EAAEgC,cAAc,aAAdA,cAAc,cAAdA,cAAc,GAAI,EAAG;QAC5B,QAAQ,EAAEH;MAAkB,EAC5B;EACF;AAER;AAEA,SAASQ,eAAe,CAACC,KAA2B,EAAe;EACjE,IAAM;IAAEC,MAAM;IAAEC,MAAM;IAAEC,EAAE;IAAEC,QAAQ,GAAGrD;EAAiB,CAAC,GAAGiD,KAAK;EACjE,IAAMK,kBAAkB,GAAGJ,MAAM,CAACK,IAAI;EACtC,IAAM,CAACC,cAAc,EAAEC,iBAAiB,CAAC,GAAG3E,QAAQ,CAACwE,kBAAkB,CAAC;EACxE,IAAM,CAACf,iBAAiB,EAAEmB,YAAY,CAAC,GAAG5E,QAAQ,CAACqE,MAAM,CAACpB,SAAS,CAAC;EACpE,IAAM,CAACY,cAAc,EAAEgB,QAAQ,CAAC,GAAG7E,QAAQ,CAACqE,MAAM,CAACnB,KAAK,CAAC;EACzD,IAAM,CAACC,UAAU,EAAE2B,aAAa,CAAC,GAAG9E,QAAQ,CAACqE,MAAM,CAACU,KAAK,CAAC;EAC1D,IAAM,CAAC3B,QAAQ,EAAE4B,WAAW,CAAC,GAAGhF,QAAQ,CAACqE,MAAM,CAACY,GAAG,CAAC;EAEpD,IAAIT,kBAAkB,KAAKE,cAAc,EAAE;IACzC;IACAE,YAAY,CAACnE,0BAA0B,CAAC+D,kBAAkB,CAAC,CAAC;IAC5DK,QAAQ,CAAC9D,sBAAsB,CAACyD,kBAAkB,CAAC,CAAC;IACpDM,aAAa,CAAC3D,SAAS,CAAC;IACxB6D,WAAW,CAAC7D,SAAS,CAAC;IACtBwD,iBAAiB,CAACH,kBAAkB,CAAC;EACvC;EAEA,IAAMU,UAAU,GAAGnF,OAAO,CAAC,MAAM;IAC/B,IAAIyE,kBAAkB,KAAKrD,SAAS,EAAE;MACpC,OAAO,EAAE;IACX;IACA,IAAIlB,UAAU,CAACkF,YAAY,CAACX,kBAAkB,CAAC,EAAE;MAC/C,OAAOpD,sBAAsB;IAC/B;IACA,IAAInB,UAAU,CAACmF,UAAU,CAACZ,kBAAkB,CAAC,EAAE;MAC7C,OAAOzB,cAAc;IACvB;IACA,IAAI9C,UAAU,CAACoF,YAAY,CAACb,kBAAkB,CAAC,EAAE;MAC/C,OAAOxC,gBAAgB;IACzB;IACA,IAAI/B,UAAU,CAACqF,UAAU,CAACd,kBAAkB,CAAC,EAAE;MAC7C,OAAOjC,cAAc;IACvB;IACA,IAAItC,UAAU,CAACsF,aAAa,CAACf,kBAAkB,CAAC,EAAE;MAChD,OAAO5B,iBAAiB;IAC1B;EACF,CAAC,EAAE,CAAC4B,kBAAkB,CAAC,CAAC;EAExB,IAAMgB,qBAAqB,GAAG3F,WAAW,CAAC4F,CAAC,IAAI;IAC7C,IAAM;MAAEvC;IAAM,CAAC,GAAGuC,CAAC,CAACC,MAAM;IAC1B1E,GAAG,CAAC2E,KAAK,CAAC,uBAAuB,EAAEzC,KAAK,CAAC;IACzC0B,YAAY,CAAC1B,KAAK,CAAC;EACrB,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMQ,iBAAiB,GAAG7D,WAAW,CAAC4F,CAAC,IAAI;IACzC,IAAM;MAAEvC;IAAM,CAAC,GAAGuC,CAAC,CAACC,MAAM;IAC1B1E,GAAG,CAAC2E,KAAK,CAAC,mBAAmB,EAAEzC,KAAK,CAAC;IACrC2B,QAAQ,CAAC3B,KAAK,CAAC;EACjB,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMS,sBAAsB,GAAG9D,WAAW,CAAC4F,CAAC,IAAI;IAC9C,IAAM;MAAEvC;IAAM,CAAC,GAAGuC,CAAC,CAACC,MAAM;IAC1B1E,GAAG,CAAC2E,KAAK,CAAC,wBAAwB,EAAEzC,KAAK,CAAC;IAC1C4B,aAAa,CAAC5B,KAAK,CAAC;EACtB,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMU,oBAAoB,GAAG/D,WAAW,CAAC4F,CAAC,IAAI;IAC5C,IAAM;MAAEvC;IAAM,CAAC,GAAGuC,CAAC,CAACC,MAAM;IAC1B1E,GAAG,CAAC2E,KAAK,CAAC,sBAAsB,EAAEzC,KAAK,CAAC;IACxC8B,WAAW,CAAC9B,KAAK,CAAC;EACpB,CAAC,EAAE,EAAE,CAAC;EAENpD,SAAS,CACP,SAAS8F,eAAe,GAAG;IACzB,IAAIC,OAAO,GAAG,IAAI;IAElB,IAAIpC,iBAAiB,KAAKtC,SAAS,EAAE;MACnCH,GAAG,CAAC2E,KAAK,CACP,8DAA8D,CAC/D;MACDE,OAAO,GAAG,KAAK;IACjB,CAAC,MAAM,IACL5F,UAAU,CAACkF,YAAY,CAACf,MAAM,CAACK,IAAI,CAAC,IACpC,CAACzB,sBAAsB,CACrBS,iBAAiB,EACjBI,cAAc,EACdV,UAAU,EACVC,QAAQ,CACT,EACD;MACApC,GAAG,CAAC2E,KAAK,CACP,iDAAiD,EACjD9B,cAAc,CACf;MACDgC,OAAO,GAAG,KAAK;IACjB,CAAC,MAAM,IACL5F,UAAU,CAACqF,UAAU,CAAClB,MAAM,CAACK,IAAI,CAAC,IAClC,CAAC3D,oBAAoB,CACnBwD,EAAE,EACFb,iBAAiB,EACjBI,cAAc,CACf,EACD;MACA7C,GAAG,CAAC2E,KAAK,CACP,0DAA0D,EAC1D9B,cAAc,CACf;MACDgC,OAAO,GAAG,KAAK;IACjB;IAEAtB,QAAQ,CACN;MACEtB,SAAS,EAAEQ,iBAAiB;MAC5BP,KAAK,EAAEW,cAAc;MACrBkB,KAAK,EAAE5B,UAAU;MACjB8B,GAAG,EAAE7B;IACP,CAAC,EACDyC,OAAO,CACR;EACH,CAAC,EACD,CACEtB,QAAQ,EACRH,MAAM,CAACK,IAAI,EACXH,EAAE,EACFb,iBAAiB,EACjBI,cAAc,EACdV,UAAU,EACVC,QAAQ,CACT,CACF;EAED,IAAM0C,eAAe,GAAG/F,OAAO,CAAC,MAAM;IACpC,IAAIyE,kBAAkB,KAAKrD,SAAS,EAAE;MACpC;MACA,OAAO,IAAI;IACb;IACA,IAAIlB,UAAU,CAACkF,YAAY,CAACX,kBAAkB,CAAC,EAAE;MAC/C,OAAOhB,eAAe,CACpBC,iBAAiB,EACjBC,iBAAiB,EACjBC,sBAAsB,EACtBC,oBAAoB,EACpBC,cAAc,EACdV,UAAU,EACVC,QAAQ,CACT;IACH;IACA,IAAInD,UAAU,CAACmF,UAAU,CAACZ,kBAAkB,CAAC,EAAE;MAC7C,OAAOP,aAAa,CAClBR,iBAAiB,EACjBC,iBAAiB,EACjBG,cAAc,CACf;IACH;IACA,IAAI5D,UAAU,CAACoF,YAAY,CAACb,kBAAkB,CAAC,EAAE;MAC/C,OAAOV,eAAe,CACpBL,iBAAiB,EACjBC,iBAAiB,EACjBG,cAAc,CACf;IACH;IACA,IAAI5D,UAAU,CAACqF,UAAU,CAACd,kBAAkB,CAAC,EAAE;MAC7C,OAAOT,aAAa,CAClBN,iBAAiB,EACjBC,iBAAiB,EACjBG,cAAc,CACf;IACH;IACA,IAAI5D,UAAU,CAACsF,aAAa,CAACf,kBAAkB,CAAC,EAAE;MAChD,OAAOR,gBAAgB,EAAE;IAC3B;EACF,CAAC,EAAE,CACDQ,kBAAkB,EAClBf,iBAAiB,EACjBI,cAAc,EACdV,UAAU,EACVC,QAAQ,EACRM,iBAAiB,EACjBC,sBAAsB,EACtBC,oBAAoB,CACrB,CAAC;EAEF,oBACE;IAAK,SAAS,EAAC;EAAuB,gBACpC;IACE,KAAK,EAAEH,iBAAkB;IACzB,eAAY,kBAAkB;IAC9B,SAAS,EAAC,oBAAoB;IAC9B,QAAQ,EAAE+B;EAAsB,GAE/BN,UAAU,CACJ,EACRY,eAAe,CACZ;AAEV;AAEA,eAAe5B,eAAe"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/* stylelint-disable scss/at-import-no-partial-leading-underscore */
|
|
2
|
+
.conditional-format-editor {
|
|
3
|
+
padding: 1rem;
|
|
4
|
+
}
|
|
5
|
+
.conditional-format-editor .formatter-list {
|
|
6
|
+
display: flex;
|
|
7
|
+
justify-content: flex-start;
|
|
8
|
+
padding-top: 0.5rem;
|
|
9
|
+
}
|
|
10
|
+
.conditional-format-editor .formatter-type {
|
|
11
|
+
margin: 0 1rem 0 0;
|
|
12
|
+
display: flex;
|
|
13
|
+
}
|
|
14
|
+
.conditional-format-editor .btn-formatter-type {
|
|
15
|
+
font-size: smaller;
|
|
16
|
+
width: 100%;
|
|
17
|
+
}
|
|
18
|
+
.conditional-format-editor .color-select {
|
|
19
|
+
padding: 0 2em 0 0.25em;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/*# sourceMappingURL=ConditionalFormatEditor.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["../../../../../node_modules/@deephaven/components/scss/custom.scss","../../../src/sidebar/conditional-formatting/ConditionalFormatEditor.scss","../../../../../node_modules/@deephaven/components/scss/new_variables.scss"],"names":[],"mappings":"AAAA;ACEA;EACE,SCCS;;ADCT;EACE;EACA;EACA,aCLO;;ADQT;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE","file":"ConditionalFormatEditor.css","sourcesContent":["/* stylelint-disable scss/at-import-no-partial-leading-underscore */\n// Consumers should be able to resolve bootstrap/ to node_modules/bootstrap\n\n//Make bootstrap functions available for use in overrides\n@import 'bootstrap/scss/_functions.scss';\n@import './bootstrap_overrides.scss';\n\n//_variable imports come after bootstrap default overrides,\n// makes all other variables and mixins from bootstrap available\n/// with just importing customer.scss\n@import 'bootstrap/scss/_variables.scss';\n@import 'bootstrap/scss/_mixins.scss';\n\n//New variables come after imports\n@import './new_variables.scss';\n","@import '@deephaven/components/scss/custom.scss';\n\n.conditional-format-editor {\n padding: $spacer-3;\n\n .formatter-list {\n display: flex;\n justify-content: flex-start;\n padding-top: $spacer-2;\n }\n\n .formatter-type {\n margin: 0 $spacer-3 0 0;\n display: flex;\n }\n\n .btn-formatter-type {\n font-size: smaller;\n width: 100%;\n }\n\n .color-select {\n padding: 0 2em 0 0.25em;\n }\n}\n","//Set of spacer variables from the spacer map\n$spacer-0: map-get($spacers, 0); //0\n$spacer-1: map-get($spacers, 1);\n$spacer-2: map-get($spacers, 2);\n$spacer-3: map-get($spacers, 3);\n$spacer-4: map-get($spacers, 4);\n$spacer-5: map-get($spacers, 5);\n\n//Marching Ants for golden layout dropzone and drag and drop\n//top bottom, left right.\n//create 4 background images that are 50% color 1, 50% color 2 using graidents, two veritical, two horizontal\n//size them to ant-size and thickness\n//position those images along the egdes and make top/bottom repeat-x and left/right repeat-y\n//then offest each of those background positions by ant-size in animation to make them march.\n$ant-size: 8px;\n$ant-thickness: 1px;\n\n@mixin ants-base($color-1: black, $color-2: white) {\n background-image: linear-gradient(to right, $color-2 50%, $color-1 50%),\n linear-gradient(to right, $color-2 50%, $color-1 50%),\n linear-gradient(to bottom, $color-2 50%, $color-1 50%),\n linear-gradient(to bottom, $color-2 50%, $color-1 50%);\n background-size: $ant-size $ant-thickness, $ant-size $ant-thickness,\n $ant-thickness $ant-size, $ant-thickness $ant-size;\n background-position: 0 top, 0 bottom, left 0, right 0;\n background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;\n animation: march 0.5s;\n animation-timing-function: linear;\n animation-iteration-count: infinite;\n}\n\n@mixin drag-stack($pseudo-element) {\n &::#{$pseudo-element} {\n content: ' ';\n background: $primary;\n box-shadow: $box-shadow;\n border-radius: $border-radius;\n position: absolute;\n height: 100%;\n width: 100%;\n @content;\n }\n}\n\n$focus-bg-transparency: 0.12;\n$hover-bg-transparency: 0.14;\n$active-bg-transparency: 0.28;\n$exception-transparency: 0.13;\n"]}
|
|
@@ -0,0 +1,109 @@
|
|
|
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, isSupportedColumn } from "./ConditionalFormattingUtils.js";
|
|
9
|
+
import "./ConditionalFormatEditor.css";
|
|
10
|
+
var log = Log.module('ConditionalFormatEditor');
|
|
11
|
+
var DEFAULT_CALLBACK = () => undefined;
|
|
12
|
+
function getFormatterTypeIcon(option) {
|
|
13
|
+
switch (option) {
|
|
14
|
+
case FormatterType.CONDITIONAL:
|
|
15
|
+
return /*#__PURE__*/React.createElement(FormatColumnWhereIcon, null);
|
|
16
|
+
case FormatterType.ROWS:
|
|
17
|
+
return /*#__PURE__*/React.createElement(FormatRowWhereIcon, null);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function getFormatterTypeLabel(option) {
|
|
21
|
+
switch (option) {
|
|
22
|
+
case FormatterType.CONDITIONAL:
|
|
23
|
+
return 'Conditional';
|
|
24
|
+
case FormatterType.ROWS:
|
|
25
|
+
return 'Rows';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
var formatterTypes = [FormatterType.CONDITIONAL, FormatterType.ROWS];
|
|
29
|
+
function ConditionalFormatEditor(props) {
|
|
30
|
+
var _defaultRule$type;
|
|
31
|
+
var {
|
|
32
|
+
columns: originalColumns,
|
|
33
|
+
dh,
|
|
34
|
+
onSave = DEFAULT_CALLBACK,
|
|
35
|
+
onUpdate = DEFAULT_CALLBACK,
|
|
36
|
+
onCancel = DEFAULT_CALLBACK,
|
|
37
|
+
rule: defaultRule
|
|
38
|
+
} = props;
|
|
39
|
+
var columns = originalColumns.filter(isSupportedColumn);
|
|
40
|
+
var [selectedFormatter, setFormatter] = useState((_defaultRule$type = defaultRule === null || defaultRule === void 0 ? void 0 : defaultRule.type) !== null && _defaultRule$type !== void 0 ? _defaultRule$type : formatterTypes[0]);
|
|
41
|
+
var [rule, setRule] = useState(defaultRule);
|
|
42
|
+
var [isValid, setIsValid] = useState(false);
|
|
43
|
+
var handleCancel = useCallback(() => {
|
|
44
|
+
onCancel();
|
|
45
|
+
}, [onCancel]);
|
|
46
|
+
var handleSave = useCallback(() => {
|
|
47
|
+
if (rule === undefined) {
|
|
48
|
+
log.error('Rule is not defined.');
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
onSave(rule);
|
|
52
|
+
}, [onSave, rule]);
|
|
53
|
+
var handleFormatterChange = useCallback(value => {
|
|
54
|
+
log.debug('handleFormatterChange', value);
|
|
55
|
+
setFormatter(value);
|
|
56
|
+
}, []);
|
|
57
|
+
var handleRuleChange = useCallback((ruleConfig, isRuleValid) => {
|
|
58
|
+
log.debug('handleRuleChange', ruleConfig, isRuleValid, selectedFormatter);
|
|
59
|
+
var updatedRule = {
|
|
60
|
+
type: selectedFormatter,
|
|
61
|
+
config: ruleConfig
|
|
62
|
+
};
|
|
63
|
+
setRule(updatedRule);
|
|
64
|
+
setIsValid(isRuleValid);
|
|
65
|
+
onUpdate(isRuleValid ? updatedRule : undefined);
|
|
66
|
+
}, [onUpdate, selectedFormatter]);
|
|
67
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
68
|
+
className: "conditional-format-editor form"
|
|
69
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
70
|
+
className: "mb-2"
|
|
71
|
+
}, /*#__PURE__*/React.createElement("label", {
|
|
72
|
+
className: "mb-0",
|
|
73
|
+
htmlFor: "formatter-select"
|
|
74
|
+
}, "Select Formatter"), /*#__PURE__*/React.createElement("div", {
|
|
75
|
+
className: "formatter-list"
|
|
76
|
+
}, formatterTypes.map((type, index) => /*#__PURE__*/React.createElement("div", {
|
|
77
|
+
key: type,
|
|
78
|
+
className: "formatter-type"
|
|
79
|
+
}, /*#__PURE__*/React.createElement("button", {
|
|
80
|
+
type: "button",
|
|
81
|
+
className: classNames('btn', 'btn-icon', 'btn-formatter-type', {
|
|
82
|
+
active: type === selectedFormatter
|
|
83
|
+
}),
|
|
84
|
+
"data-index": index,
|
|
85
|
+
onClick: () => handleFormatterChange(type)
|
|
86
|
+
}, getFormatterTypeIcon(type), getFormatterTypeLabel(type)))))), selectedFormatter === FormatterType.CONDITIONAL && /*#__PURE__*/React.createElement(ColumnFormatEditor, {
|
|
87
|
+
columns: columns,
|
|
88
|
+
dh: dh,
|
|
89
|
+
config: rule === null || rule === void 0 ? void 0 : rule.config,
|
|
90
|
+
onChange: handleRuleChange
|
|
91
|
+
}), selectedFormatter === FormatterType.ROWS && /*#__PURE__*/React.createElement(RowFormatEditor, {
|
|
92
|
+
columns: columns,
|
|
93
|
+
config: rule === null || rule === void 0 ? void 0 : rule.config,
|
|
94
|
+
dh: dh,
|
|
95
|
+
onChange: handleRuleChange
|
|
96
|
+
}), /*#__PURE__*/React.createElement("hr", null), /*#__PURE__*/React.createElement("div", {
|
|
97
|
+
className: "d-flex justify-content-end my-3"
|
|
98
|
+
}, /*#__PURE__*/React.createElement(Button, {
|
|
99
|
+
kind: "secondary",
|
|
100
|
+
onClick: handleCancel,
|
|
101
|
+
className: "mr-2"
|
|
102
|
+
}, "Cancel"), /*#__PURE__*/React.createElement(Button, {
|
|
103
|
+
kind: "primary",
|
|
104
|
+
onClick: handleSave,
|
|
105
|
+
disabled: rule === undefined || !isValid
|
|
106
|
+
}, "Done")));
|
|
107
|
+
}
|
|
108
|
+
export default ConditionalFormatEditor;
|
|
109
|
+
//# sourceMappingURL=ConditionalFormatEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConditionalFormatEditor.js","names":["React","useCallback","useState","classNames","Button","Log","FormatColumnWhereIcon","FormatRowWhereIcon","ColumnFormatEditor","RowFormatEditor","FormatterType","isSupportedColumn","log","module","DEFAULT_CALLBACK","undefined","getFormatterTypeIcon","option","CONDITIONAL","ROWS","getFormatterTypeLabel","formatterTypes","ConditionalFormatEditor","props","columns","originalColumns","dh","onSave","onUpdate","onCancel","rule","defaultRule","filter","selectedFormatter","setFormatter","type","setRule","isValid","setIsValid","handleCancel","handleSave","error","handleFormatterChange","value","debug","handleRuleChange","ruleConfig","isRuleValid","updatedRule","config","map","index","active"],"sources":["../../../src/sidebar/conditional-formatting/ConditionalFormatEditor.tsx"],"sourcesContent":["import React, { useCallback, useState } from 'react';\nimport classNames from 'classnames';\nimport { Button } from '@deephaven/components';\nimport type { dh as DhType } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport { FormatColumnWhereIcon, FormatRowWhereIcon } from '../icons';\nimport ColumnFormatEditor from './ColumnFormatEditor';\nimport RowFormatEditor from './RowFormatEditor';\nimport {\n BaseFormatConfig,\n FormatterType,\n FormattingRule,\n isSupportedColumn,\n ModelColumn,\n} from './ConditionalFormattingUtils';\nimport './ConditionalFormatEditor.scss';\n\nconst log = Log.module('ConditionalFormatEditor');\n\nexport type SaveCallback = (rule: FormattingRule) => void;\n\nexport type UpdateCallback = (rule?: FormattingRule) => void;\n\nexport type CancelCallback = () => void;\n\nexport interface ConditionalFormatEditorProps {\n dh: DhType;\n columns: readonly ModelColumn[];\n rule?: FormattingRule;\n onCancel?: CancelCallback;\n onSave?: SaveCallback;\n onUpdate?: UpdateCallback;\n}\n\nconst DEFAULT_CALLBACK = () => undefined;\n\nfunction getFormatterTypeIcon(option: FormatterType): JSX.Element | undefined {\n switch (option) {\n case FormatterType.CONDITIONAL:\n return <FormatColumnWhereIcon />;\n case FormatterType.ROWS:\n return <FormatRowWhereIcon />;\n }\n}\n\nfunction getFormatterTypeLabel(option: FormatterType): string {\n switch (option) {\n case FormatterType.CONDITIONAL:\n return 'Conditional';\n case FormatterType.ROWS:\n return 'Rows';\n }\n}\n\nconst formatterTypes = [FormatterType.CONDITIONAL, FormatterType.ROWS];\n\nfunction ConditionalFormatEditor(\n props: ConditionalFormatEditorProps\n): JSX.Element {\n const {\n columns: originalColumns,\n dh,\n onSave = DEFAULT_CALLBACK,\n onUpdate = DEFAULT_CALLBACK,\n onCancel = DEFAULT_CALLBACK,\n rule: defaultRule,\n } = props;\n\n const columns = originalColumns.filter(isSupportedColumn);\n\n const [selectedFormatter, setFormatter] = useState(\n defaultRule?.type ?? formatterTypes[0]\n );\n const [rule, setRule] = useState(defaultRule);\n const [isValid, setIsValid] = useState(false);\n\n const handleCancel = useCallback(() => {\n onCancel();\n }, [onCancel]);\n\n const handleSave = useCallback(() => {\n if (rule === undefined) {\n log.error('Rule is not defined.');\n return;\n }\n onSave(rule);\n }, [onSave, rule]);\n\n const handleFormatterChange = useCallback(value => {\n log.debug('handleFormatterChange', value);\n setFormatter(value);\n }, []);\n\n const handleRuleChange = useCallback(\n (ruleConfig, isRuleValid: boolean) => {\n log.debug('handleRuleChange', ruleConfig, isRuleValid, selectedFormatter);\n const updatedRule = {\n type: selectedFormatter,\n config: ruleConfig as BaseFormatConfig,\n };\n setRule(updatedRule);\n setIsValid(isRuleValid);\n onUpdate(isRuleValid ? updatedRule : undefined);\n },\n [onUpdate, selectedFormatter]\n );\n\n return (\n <div className=\"conditional-format-editor form\">\n <div className=\"mb-2\">\n <label className=\"mb-0\" htmlFor=\"formatter-select\">\n Select Formatter\n </label>\n\n <div className=\"formatter-list\">\n {formatterTypes.map((type, index) => (\n <div key={type} className=\"formatter-type\">\n <button\n type=\"button\"\n className={classNames('btn', 'btn-icon', 'btn-formatter-type', {\n active: type === selectedFormatter,\n })}\n data-index={index}\n onClick={() => handleFormatterChange(type)}\n >\n {getFormatterTypeIcon(type)}\n {getFormatterTypeLabel(type)}\n </button>\n </div>\n ))}\n </div>\n </div>\n {selectedFormatter === FormatterType.CONDITIONAL && (\n <ColumnFormatEditor\n columns={columns}\n dh={dh}\n config={rule?.config}\n onChange={handleRuleChange}\n />\n )}\n {selectedFormatter === FormatterType.ROWS && (\n <RowFormatEditor\n columns={columns}\n config={rule?.config}\n dh={dh}\n onChange={handleRuleChange}\n />\n )}\n <hr />\n <div className=\"d-flex justify-content-end my-3\">\n <Button kind=\"secondary\" onClick={handleCancel} className=\"mr-2\">\n Cancel\n </Button>\n <Button\n kind=\"primary\"\n onClick={handleSave}\n disabled={rule === undefined || !isValid}\n >\n Done\n </Button>\n </div>\n </div>\n );\n}\n\nexport default ConditionalFormatEditor;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
+
export function makeTernaryFormatRule(config, prevRule) {
|
|
5
|
+
var styleDBString = getStyleDBString(config);
|
|
6
|
+
if (styleDBString === undefined) {
|
|
7
|
+
return undefined;
|
|
8
|
+
}
|
|
9
|
+
var conditionDBString = getConditionDBString(config);
|
|
10
|
+
return "".concat(conditionDBString, " ? ").concat(styleDBString, " : ").concat(prevRule);
|
|
11
|
+
}
|
|
12
|
+
export function makeRowFormatColumn(dh, rule) {
|
|
13
|
+
return dh.Column.formatRowColor(rule);
|
|
14
|
+
}
|
|
15
|
+
export function makeColumnFormatColumn(col, rule) {
|
|
16
|
+
return col.formatColor(rule);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=ConditionalFormattingAPIUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConditionalFormattingAPIUtils.js","names":["getConditionDBString","getStyleDBString","makeTernaryFormatRule","config","prevRule","styleDBString","undefined","conditionDBString","makeRowFormatColumn","dh","rule","Column","formatRowColor","makeColumnFormatColumn","col","formatColor"],"sources":["../../../src/sidebar/conditional-formatting/ConditionalFormattingAPIUtils.ts"],"sourcesContent":["import type {\n Column,\n dh as DhType,\n CustomColumn,\n} from '@deephaven/jsapi-types';\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(dh: DhType, 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"],"mappings":"SAOEA,oBAAoB,EACpBC,gBAAgB,2CAGlB;AACA;AACA;AAEA,OAAO,SAASC,qBAAqB,CACnCC,MAAwB,EACxBC,QAAgB,EACI;EACpB,IAAMC,aAAa,GAAGJ,gBAAgB,CAACE,MAAM,CAAC;EAC9C,IAAIE,aAAa,KAAKC,SAAS,EAAE;IAC/B,OAAOA,SAAS;EAClB;EACA,IAAMC,iBAAiB,GAAGP,oBAAoB,CAACG,MAAM,CAAC;EACtD,iBAAUI,iBAAiB,gBAAMF,aAAa,gBAAMD,QAAQ;AAC9D;AAEA,OAAO,SAASI,mBAAmB,CAACC,EAAU,EAAEC,IAAY,EAAgB;EAC1E,OAAOD,EAAE,CAACE,MAAM,CAACC,cAAc,CAACF,IAAI,CAAC;AACvC;AAEA,OAAO,SAASG,sBAAsB,CACpCC,GAAW,EACXJ,IAAY,EACE;EACd,OAAOI,GAAG,CAACC,WAAW,CAACL,IAAI,CAAC;AAC9B"}
|