@deephaven/iris-grid 1.8.1-beta.8 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/IrisGrid.d.ts +19 -0
- package/dist/IrisGrid.d.ts.map +1 -1
- package/dist/IrisGrid.js +17 -9
- package/dist/IrisGrid.js.map +1 -1
- package/dist/IrisGridMetricCalculator.d.ts +34 -1
- package/dist/IrisGridMetricCalculator.d.ts.map +1 -1
- package/dist/IrisGridMetricCalculator.js +136 -1
- package/dist/IrisGridMetricCalculator.js.map +1 -1
- package/dist/LazyIrisGrid.d.ts +1 -0
- package/dist/LazyIrisGrid.d.ts.map +1 -1
- package/dist/TreeRebalanceUtil.d.ts +50 -0
- package/dist/TreeRebalanceUtil.d.ts.map +1 -0
- package/dist/TreeRebalanceUtil.js +105 -0
- package/dist/TreeRebalanceUtil.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/SearchItem.d.ts +12 -0
- package/dist/sidebar/visibility-ordering-builder/SearchItem.d.ts.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/SearchItem.js +55 -0
- package/dist/sidebar/visibility-ordering-builder/SearchItem.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/SearchWithModal.css +408 -0
- package/dist/sidebar/visibility-ordering-builder/SearchWithModal.css.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/SearchWithModal.d.ts +14 -0
- package/dist/sidebar/visibility-ordering-builder/SearchWithModal.d.ts.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/SearchWithModal.js +235 -0
- package/dist/sidebar/visibility-ordering-builder/SearchWithModal.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.d.ts +43 -43
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.d.ts.map +1 -1
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.js +427 -466
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.js.map +1 -1
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.d.ts +7 -2
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.d.ts.map +1 -1
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.js +7 -4
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.js.map +1 -1
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.d.ts +7 -15
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.d.ts.map +1 -1
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.js +53 -137
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.js.map +1 -1
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeDndContext.d.ts +14 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeDndContext.d.ts.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeDndContext.js +245 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeDndContext.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.d.ts +4 -3
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.d.ts.map +1 -1
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.js +2 -1
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.js.map +1 -1
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.css +45 -22
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.css.map +1 -1
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.d.ts +13 -14
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.d.ts.map +1 -1
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.js +9 -7
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.js.map +1 -1
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/keyboardCoordinates.d.ts +1 -1
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/keyboardCoordinates.d.ts.map +1 -1
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/keyboardCoordinates.js +8 -7
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/keyboardCoordinates.js.map +1 -1
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.d.ts +4 -4
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.d.ts.map +1 -1
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.js +5 -1
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.js.map +1 -1
- package/package.json +20 -19
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.d.ts +0 -21
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.d.ts.map +0 -1
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.js +0 -149
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.js.map +0 -1
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import React, { useCallback, useMemo, useRef, useState } from 'react';
|
|
2
|
+
import { useDndMonitor } from '@dnd-kit/core';
|
|
3
|
+
import { GridUtils } from '@deephaven/grid';
|
|
4
|
+
import { ActionButton, Popper, SearchField } from '@deephaven/components';
|
|
5
|
+
import { useResizeObserver } from '@deephaven/react-hooks';
|
|
6
|
+
import SortableTree from "./sortable-tree/SortableTree.js";
|
|
7
|
+
import "./SearchWithModal.css";
|
|
8
|
+
import MemoizedSearchItem from "./SearchItem.js";
|
|
9
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
10
|
+
export function SearchWithModal(_ref) {
|
|
11
|
+
var _searchRef$current3, _searchRef$current4;
|
|
12
|
+
var {
|
|
13
|
+
items,
|
|
14
|
+
onModalOpenChange,
|
|
15
|
+
onClick,
|
|
16
|
+
onDragStart,
|
|
17
|
+
setSelection
|
|
18
|
+
} = _ref;
|
|
19
|
+
var [searchValue, setSearchValue] = useState('');
|
|
20
|
+
var [isModalOpen, setIsModalOpen] = useState(false);
|
|
21
|
+
var searchRef = useRef(null);
|
|
22
|
+
var popperRef = useRef(null);
|
|
23
|
+
var handleModalOpen = useCallback(() => {
|
|
24
|
+
if (isModalOpen) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
setIsModalOpen(true);
|
|
28
|
+
onModalOpenChange(true);
|
|
29
|
+
}, [onModalOpenChange, isModalOpen]);
|
|
30
|
+
var handleModalClose = useCallback(() => {
|
|
31
|
+
if (!isModalOpen) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
setIsModalOpen(false);
|
|
35
|
+
onModalOpenChange(false);
|
|
36
|
+
}, [onModalOpenChange, isModalOpen]);
|
|
37
|
+
var handleInputChange = useCallback(value => {
|
|
38
|
+
// Open in case the user hit escape to close the modal then started typing
|
|
39
|
+
// without blurring the input
|
|
40
|
+
handleModalOpen();
|
|
41
|
+
setSearchValue(value);
|
|
42
|
+
}, [handleModalOpen]);
|
|
43
|
+
var handleInputBlur = useCallback(e => {
|
|
44
|
+
if (!popperRef.current || !popperRef.current.element.contains(e.relatedTarget)) {
|
|
45
|
+
handleModalClose();
|
|
46
|
+
}
|
|
47
|
+
}, [handleModalClose]);
|
|
48
|
+
var handleModalBlur = useCallback(e => {
|
|
49
|
+
var _searchRef$current;
|
|
50
|
+
var searchElement = (_searchRef$current = searchRef.current) === null || _searchRef$current === void 0 ? void 0 : _searchRef$current.getInputElement();
|
|
51
|
+
if (!searchElement || !searchElement.contains(e.relatedTarget)) {
|
|
52
|
+
handleModalClose();
|
|
53
|
+
}
|
|
54
|
+
}, [handleModalClose]);
|
|
55
|
+
var handleDragStart = useCallback(event => {
|
|
56
|
+
onDragStart === null || onDragStart === void 0 || onDragStart(event);
|
|
57
|
+
handleModalClose();
|
|
58
|
+
}, [onDragStart, handleModalClose]);
|
|
59
|
+
useDndMonitor({
|
|
60
|
+
onDragStart: isModalOpen ? handleDragStart : undefined
|
|
61
|
+
});
|
|
62
|
+
var handleClick = useCallback((name, event) => {
|
|
63
|
+
onClick(name, event);
|
|
64
|
+
if (!event.shiftKey && !GridUtils.isModifierKeyDown(event)) {
|
|
65
|
+
handleModalClose();
|
|
66
|
+
}
|
|
67
|
+
}, [onClick, handleModalClose]);
|
|
68
|
+
var handleItemKeyDown = useCallback((name, event) => {
|
|
69
|
+
var {
|
|
70
|
+
key
|
|
71
|
+
} = event;
|
|
72
|
+
if (key === 'Enter') {
|
|
73
|
+
// Select item and close modal
|
|
74
|
+
event.preventDefault();
|
|
75
|
+
event.stopPropagation();
|
|
76
|
+
setSelection([name]);
|
|
77
|
+
handleModalClose();
|
|
78
|
+
} else if (key === 'ArrowDown') {
|
|
79
|
+
var _event$currentTarget$;
|
|
80
|
+
// Move focus to the next item
|
|
81
|
+
event.preventDefault();
|
|
82
|
+
event.stopPropagation();
|
|
83
|
+
var nextElement = (_event$currentTarget$ = event.currentTarget.parentElement) === null || _event$currentTarget$ === void 0 || (_event$currentTarget$ = _event$currentTarget$.nextElementSibling // The parent item-wrapper elements are siblings, not the tree-items
|
|
84
|
+
) === null || _event$currentTarget$ === void 0 ? void 0 : _event$currentTarget$.querySelector('.tree-item[tabindex="0"]');
|
|
85
|
+
nextElement === null || nextElement === void 0 || nextElement.scrollIntoView({
|
|
86
|
+
block: 'nearest'
|
|
87
|
+
});
|
|
88
|
+
nextElement === null || nextElement === void 0 || nextElement.focus();
|
|
89
|
+
} else if (key === 'ArrowUp') {
|
|
90
|
+
var _event$currentTarget$2;
|
|
91
|
+
// Move focus to the previous item
|
|
92
|
+
event.preventDefault();
|
|
93
|
+
event.stopPropagation();
|
|
94
|
+
var prevElement = (_event$currentTarget$2 = event.currentTarget.parentElement) === null || _event$currentTarget$2 === void 0 || (_event$currentTarget$2 = _event$currentTarget$2.previousElementSibling // The parent item-wrapper elements are siblings, not the tree-items
|
|
95
|
+
) === null || _event$currentTarget$2 === void 0 ? void 0 : _event$currentTarget$2.querySelector('.tree-item[tabindex="0"]');
|
|
96
|
+
if (prevElement) {
|
|
97
|
+
prevElement.scrollIntoView({
|
|
98
|
+
block: 'nearest'
|
|
99
|
+
});
|
|
100
|
+
prevElement.focus();
|
|
101
|
+
} else {
|
|
102
|
+
var _searchRef$current2;
|
|
103
|
+
(_searchRef$current2 = searchRef.current) === null || _searchRef$current2 === void 0 || (_searchRef$current2 = _searchRef$current2.getInputElement()) === null || _searchRef$current2 === void 0 || _searchRef$current2.focus();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}, [setSelection, handleModalClose]);
|
|
107
|
+
var renderItem = useCallback(_ref2 => {
|
|
108
|
+
var {
|
|
109
|
+
value,
|
|
110
|
+
item,
|
|
111
|
+
ref,
|
|
112
|
+
handleProps
|
|
113
|
+
} = _ref2;
|
|
114
|
+
return /*#__PURE__*/_jsx(MemoizedSearchItem, {
|
|
115
|
+
ref: ref,
|
|
116
|
+
value: value,
|
|
117
|
+
item: item,
|
|
118
|
+
onClick: handleClick,
|
|
119
|
+
onKeyDown: handleItemKeyDown,
|
|
120
|
+
handleProps: handleProps
|
|
121
|
+
}, item.id);
|
|
122
|
+
}, [handleClick, handleItemKeyDown]);
|
|
123
|
+
|
|
124
|
+
// Detect if the user resizes the panel height while the popper is open
|
|
125
|
+
useResizeObserver((_searchRef$current3 = searchRef.current) === null || _searchRef$current3 === void 0 || (_searchRef$current3 = _searchRef$current3.getInputElement()) === null || _searchRef$current3 === void 0 ? void 0 : _searchRef$current3.closest('.visibility-ordering-builder'), () => {
|
|
126
|
+
var _popperRef$current;
|
|
127
|
+
(_popperRef$current = popperRef.current) === null || _popperRef$current === void 0 || _popperRef$current.scheduleUpdate();
|
|
128
|
+
});
|
|
129
|
+
var filteredItems = useMemo(() => {
|
|
130
|
+
if (searchValue === '') {
|
|
131
|
+
return items;
|
|
132
|
+
}
|
|
133
|
+
var lowerSearch = searchValue.toLowerCase();
|
|
134
|
+
return items.filter(item => item.id.toLowerCase().includes(lowerSearch));
|
|
135
|
+
}, [items, searchValue]);
|
|
136
|
+
var handleSearchKeyDown = useCallback(
|
|
137
|
+
// Close on escape with empty search.
|
|
138
|
+
// If there is a search value, let the input handle the escape to clear the search.
|
|
139
|
+
e => {
|
|
140
|
+
if (e.key === 'Escape' && searchValue === '') {
|
|
141
|
+
handleModalClose();
|
|
142
|
+
}
|
|
143
|
+
if (e.key === 'Enter' && filteredItems.length > 0) {
|
|
144
|
+
e.preventDefault();
|
|
145
|
+
// Select the first item in the list
|
|
146
|
+
var firstItem = filteredItems[0];
|
|
147
|
+
setSelection([firstItem.id]);
|
|
148
|
+
handleModalClose();
|
|
149
|
+
}
|
|
150
|
+
if (e.key === 'ArrowDown' && filteredItems.length > 0) {
|
|
151
|
+
var _popperRef$current2;
|
|
152
|
+
e.preventDefault();
|
|
153
|
+
// Focus the first item in the list
|
|
154
|
+
var item = (_popperRef$current2 = popperRef.current) === null || _popperRef$current2 === void 0 ? void 0 : _popperRef$current2.element.querySelector('.tree-item[tabindex="0"]');
|
|
155
|
+
item === null || item === void 0 || item.focus();
|
|
156
|
+
}
|
|
157
|
+
}, [setSelection, filteredItems, handleModalClose, searchValue]);
|
|
158
|
+
var handleSelectMatching = useCallback(() => {
|
|
159
|
+
var matchingNames = filteredItems.map(item => item.id);
|
|
160
|
+
setSelection(matchingNames);
|
|
161
|
+
handleModalClose();
|
|
162
|
+
}, [filteredItems, setSelection, handleModalClose]);
|
|
163
|
+
var hasMultipleSelection = useMemo(() => {
|
|
164
|
+
var foundOne = false;
|
|
165
|
+
return filteredItems.some(item => {
|
|
166
|
+
if (item.selected) {
|
|
167
|
+
if (foundOne) {
|
|
168
|
+
return true;
|
|
169
|
+
}
|
|
170
|
+
foundOne = true;
|
|
171
|
+
}
|
|
172
|
+
return false;
|
|
173
|
+
});
|
|
174
|
+
}, [filteredItems]);
|
|
175
|
+
var hasMultipleMatches = searchValue !== '' && filteredItems.length > 1;
|
|
176
|
+
var showFooterButtons = hasMultipleSelection || hasMultipleMatches;
|
|
177
|
+
return /*#__PURE__*/_jsxs(_Fragment, {
|
|
178
|
+
children: [/*#__PURE__*/_jsx(SearchField, {
|
|
179
|
+
"aria-label": "Search columns",
|
|
180
|
+
ref: searchRef,
|
|
181
|
+
value: searchValue,
|
|
182
|
+
onChange: handleInputChange,
|
|
183
|
+
onFocus: handleModalOpen,
|
|
184
|
+
onBlur: handleInputBlur,
|
|
185
|
+
onKeyDown: handleSearchKeyDown
|
|
186
|
+
}), /*#__PURE__*/_jsx(Popper, {
|
|
187
|
+
ref: popperRef,
|
|
188
|
+
isShown: isModalOpen,
|
|
189
|
+
interactive: true,
|
|
190
|
+
keepInParent: true,
|
|
191
|
+
onBlur: handleModalBlur,
|
|
192
|
+
onExited: handleModalClose // May exit due to escape which does not trigger blur
|
|
193
|
+
,
|
|
194
|
+
options: {
|
|
195
|
+
placement: 'bottom-end',
|
|
196
|
+
modifiers: {
|
|
197
|
+
preventOverflow: {
|
|
198
|
+
priority: ['top']
|
|
199
|
+
},
|
|
200
|
+
flip: {
|
|
201
|
+
enabled: false
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
},
|
|
205
|
+
referenceObject: (_searchRef$current4 = searchRef.current) === null || _searchRef$current4 === void 0 ? void 0 : _searchRef$current4.getInputElement(),
|
|
206
|
+
className: "visibility-search-list",
|
|
207
|
+
children: /*#__PURE__*/_jsx("div", {
|
|
208
|
+
className: "visibility-search-list-inner",
|
|
209
|
+
children: filteredItems.length === 0 ? /*#__PURE__*/_jsx("div", {
|
|
210
|
+
className: "no-results",
|
|
211
|
+
children: "No matching columns"
|
|
212
|
+
}) : /*#__PURE__*/_jsxs(_Fragment, {
|
|
213
|
+
children: [/*#__PURE__*/_jsx(SortableTree, {
|
|
214
|
+
items: filteredItems,
|
|
215
|
+
withDepthMarkers: false,
|
|
216
|
+
renderItem: renderItem
|
|
217
|
+
}), showFooterButtons && /*#__PURE__*/_jsxs("div", {
|
|
218
|
+
className: "footer-buttons",
|
|
219
|
+
children: [hasMultipleSelection && /*#__PURE__*/_jsx(ActionButton, {
|
|
220
|
+
isQuiet: true,
|
|
221
|
+
onPress: handleModalClose,
|
|
222
|
+
children: "Select Group"
|
|
223
|
+
}), hasMultipleMatches && /*#__PURE__*/_jsx(ActionButton, {
|
|
224
|
+
isQuiet: true,
|
|
225
|
+
onPress: handleSelectMatching,
|
|
226
|
+
children: "Select Matching"
|
|
227
|
+
})]
|
|
228
|
+
})]
|
|
229
|
+
})
|
|
230
|
+
})
|
|
231
|
+
})]
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
export default SearchWithModal;
|
|
235
|
+
//# sourceMappingURL=SearchWithModal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchWithModal.js","names":["React","useCallback","useMemo","useRef","useState","useDndMonitor","GridUtils","ActionButton","Popper","SearchField","useResizeObserver","SortableTree","MemoizedSearchItem","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","SearchWithModal","_ref","_searchRef$current3","_searchRef$current4","items","onModalOpenChange","onClick","onDragStart","setSelection","searchValue","setSearchValue","isModalOpen","setIsModalOpen","searchRef","popperRef","handleModalOpen","handleModalClose","handleInputChange","value","handleInputBlur","e","current","element","contains","relatedTarget","handleModalBlur","_searchRef$current","searchElement","getInputElement","handleDragStart","event","undefined","handleClick","name","shiftKey","isModifierKeyDown","handleItemKeyDown","key","preventDefault","stopPropagation","_event$currentTarget$","nextElement","currentTarget","parentElement","nextElementSibling","querySelector","scrollIntoView","block","focus","_event$currentTarget$2","prevElement","previousElementSibling","_searchRef$current2","renderItem","_ref2","item","ref","handleProps","onKeyDown","id","closest","_popperRef$current","scheduleUpdate","filteredItems","lowerSearch","toLowerCase","filter","includes","handleSearchKeyDown","length","firstItem","_popperRef$current2","handleSelectMatching","matchingNames","map","hasMultipleSelection","foundOne","some","selected","hasMultipleMatches","showFooterButtons","children","onChange","onFocus","onBlur","isShown","interactive","keepInParent","onExited","options","placement","modifiers","preventOverflow","priority","flip","enabled","referenceObject","className","withDepthMarkers","isQuiet","onPress"],"sources":["../../../src/sidebar/visibility-ordering-builder/SearchWithModal.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useRef, useState } from 'react';\nimport { type DragStartEvent, useDndMonitor } from '@dnd-kit/core';\nimport type { TextFieldRef } from '@react-types/textfield';\nimport { GridUtils } from '@deephaven/grid';\nimport { ActionButton, Popper, SearchField } from '@deephaven/components';\nimport { useResizeObserver } from '@deephaven/react-hooks';\nimport SortableTree from './sortable-tree/SortableTree';\nimport { type TreeItemRenderFnProps } from './sortable-tree/TreeItem';\nimport type {\n IrisGridTreeItemData,\n FlattenedIrisGridTreeItem,\n} from './sortable-tree/utilities';\nimport './SearchWithModal.scss';\nimport MemoizedSearchItem from './SearchItem';\n\ninterface SearchWithModalProps {\n items: FlattenedIrisGridTreeItem[];\n onModalOpenChange: (isOpen: boolean) => void;\n onClick: (name: string, event: React.MouseEvent<HTMLElement>) => void;\n onDragStart?: (event: DragStartEvent) => void;\n setSelection: (columnNames: string[]) => void;\n}\n\nexport function SearchWithModal({\n items,\n onModalOpenChange,\n onClick,\n onDragStart,\n setSelection,\n}: SearchWithModalProps): JSX.Element {\n const [searchValue, setSearchValue] = useState('');\n const [isModalOpen, setIsModalOpen] = useState(false);\n const searchRef = useRef<TextFieldRef>(null);\n const popperRef = useRef<Popper>(null);\n\n const handleModalOpen = useCallback(() => {\n if (isModalOpen) {\n return;\n }\n setIsModalOpen(true);\n onModalOpenChange(true);\n }, [onModalOpenChange, isModalOpen]);\n\n const handleModalClose = useCallback(() => {\n if (!isModalOpen) {\n return;\n }\n setIsModalOpen(false);\n onModalOpenChange(false);\n }, [onModalOpenChange, isModalOpen]);\n\n const handleInputChange = useCallback(\n (value: string) => {\n // Open in case the user hit escape to close the modal then started typing\n // without blurring the input\n handleModalOpen();\n setSearchValue(value);\n },\n [handleModalOpen]\n );\n\n const handleInputBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n if (\n !popperRef.current ||\n !popperRef.current.element.contains(e.relatedTarget as Node)\n ) {\n handleModalClose();\n }\n },\n [handleModalClose]\n );\n\n const handleModalBlur = useCallback(\n (e: React.FocusEvent) => {\n const searchElement = searchRef.current?.getInputElement();\n if (!searchElement || !searchElement.contains(e.relatedTarget as Node)) {\n handleModalClose();\n }\n },\n [handleModalClose]\n );\n\n const handleDragStart = useCallback(\n (event: DragStartEvent) => {\n onDragStart?.(event);\n handleModalClose();\n },\n [onDragStart, handleModalClose]\n );\n\n useDndMonitor({\n onDragStart: isModalOpen ? handleDragStart : undefined,\n });\n\n const handleClick = useCallback(\n (name: string, event: React.MouseEvent<HTMLElement>) => {\n onClick(name, event);\n if (!event.shiftKey && !GridUtils.isModifierKeyDown(event)) {\n handleModalClose();\n }\n },\n [onClick, handleModalClose]\n );\n\n const handleItemKeyDown = useCallback(\n (name: string, event: React.KeyboardEvent<HTMLElement>) => {\n const { key } = event;\n if (key === 'Enter') {\n // Select item and close modal\n event.preventDefault();\n event.stopPropagation();\n setSelection([name]);\n handleModalClose();\n } else if (key === 'ArrowDown') {\n // Move focus to the next item\n event.preventDefault();\n event.stopPropagation();\n const nextElement = (\n event.currentTarget.parentElement as HTMLElement | null\n )?.nextElementSibling // The parent item-wrapper elements are siblings, not the tree-items\n ?.querySelector('.tree-item[tabindex=\"0\"]') as HTMLElement | null;\n nextElement?.scrollIntoView({ block: 'nearest' });\n nextElement?.focus();\n } else if (key === 'ArrowUp') {\n // Move focus to the previous item\n event.preventDefault();\n event.stopPropagation();\n const prevElement = (\n event.currentTarget.parentElement as HTMLElement | null\n )?.previousElementSibling // The parent item-wrapper elements are siblings, not the tree-items\n ?.querySelector('.tree-item[tabindex=\"0\"]') as HTMLElement | null;\n if (prevElement) {\n prevElement.scrollIntoView({ block: 'nearest' });\n prevElement.focus();\n } else {\n searchRef.current?.getInputElement()?.focus();\n }\n }\n },\n [setSelection, handleModalClose]\n );\n\n const renderItem = useCallback(\n ({\n value,\n item,\n ref,\n handleProps,\n }: TreeItemRenderFnProps<IrisGridTreeItemData>): JSX.Element => (\n <MemoizedSearchItem\n key={item.id}\n ref={ref}\n value={value}\n item={item}\n onClick={handleClick}\n onKeyDown={handleItemKeyDown}\n handleProps={handleProps}\n />\n ),\n [handleClick, handleItemKeyDown]\n );\n\n // Detect if the user resizes the panel height while the popper is open\n useResizeObserver(\n searchRef.current\n ?.getInputElement()\n ?.closest('.visibility-ordering-builder'),\n () => {\n popperRef.current?.scheduleUpdate();\n }\n );\n\n const filteredItems = useMemo(() => {\n if (searchValue === '') {\n return items;\n }\n const lowerSearch = searchValue.toLowerCase();\n return items.filter(item => item.id.toLowerCase().includes(lowerSearch));\n }, [items, searchValue]);\n\n const handleSearchKeyDown = useCallback(\n // Close on escape with empty search.\n // If there is a search value, let the input handle the escape to clear the search.\n (e: React.KeyboardEvent) => {\n if (e.key === 'Escape' && searchValue === '') {\n handleModalClose();\n }\n\n if (e.key === 'Enter' && filteredItems.length > 0) {\n e.preventDefault();\n // Select the first item in the list\n const firstItem = filteredItems[0];\n setSelection([firstItem.id]);\n handleModalClose();\n }\n\n if (e.key === 'ArrowDown' && filteredItems.length > 0) {\n e.preventDefault();\n // Focus the first item in the list\n const item = popperRef.current?.element.querySelector(\n '.tree-item[tabindex=\"0\"]'\n ) as HTMLElement | null;\n item?.focus();\n }\n },\n [setSelection, filteredItems, handleModalClose, searchValue]\n );\n\n const handleSelectMatching = useCallback(() => {\n const matchingNames = filteredItems.map(item => item.id);\n setSelection(matchingNames);\n handleModalClose();\n }, [filteredItems, setSelection, handleModalClose]);\n\n const hasMultipleSelection = useMemo(() => {\n let foundOne = false;\n return filteredItems.some(item => {\n if (item.selected) {\n if (foundOne) {\n return true;\n }\n foundOne = true;\n }\n return false;\n });\n }, [filteredItems]);\n\n const hasMultipleMatches = searchValue !== '' && filteredItems.length > 1;\n const showFooterButtons = hasMultipleSelection || hasMultipleMatches;\n\n return (\n <>\n <SearchField\n aria-label=\"Search columns\"\n ref={searchRef}\n value={searchValue}\n onChange={handleInputChange}\n onFocus={handleModalOpen}\n onBlur={handleInputBlur}\n onKeyDown={handleSearchKeyDown}\n />\n <Popper\n ref={popperRef}\n isShown={isModalOpen}\n interactive\n keepInParent\n onBlur={handleModalBlur}\n onExited={handleModalClose} // May exit due to escape which does not trigger blur\n options={{\n placement: 'bottom-end',\n modifiers: {\n preventOverflow: {\n priority: ['top'],\n },\n flip: {\n enabled: false,\n },\n },\n }}\n referenceObject={searchRef.current?.getInputElement()}\n className=\"visibility-search-list\"\n >\n <div className=\"visibility-search-list-inner\">\n {filteredItems.length === 0 ? (\n <div className=\"no-results\">No matching columns</div>\n ) : (\n <>\n <SortableTree\n items={filteredItems}\n withDepthMarkers={false}\n renderItem={renderItem}\n />\n {showFooterButtons && (\n <div className=\"footer-buttons\">\n {hasMultipleSelection && (\n <ActionButton isQuiet onPress={handleModalClose}>\n Select Group\n </ActionButton>\n )}\n {hasMultipleMatches && (\n <ActionButton isQuiet onPress={handleSelectMatching}>\n Select Matching\n </ActionButton>\n )}\n </div>\n )}\n </>\n )}\n </div>\n </Popper>\n </>\n );\n}\n\nexport default SearchWithModal;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,25 +1,22 @@
|
|
|
1
|
-
import React, {
|
|
2
|
-
import { type ModelIndex, type MoveOperation
|
|
1
|
+
import React, { PureComponent, type ReactElement } from 'react';
|
|
2
|
+
import { type ModelIndex, type MoveOperation } from '@deephaven/grid';
|
|
3
3
|
import type { dh } from '@deephaven/jsapi-types';
|
|
4
4
|
import memoize from 'memoizee';
|
|
5
|
+
import { type DragStartEvent } from '@dnd-kit/core';
|
|
5
6
|
import type { Key } from '@react-types/shared';
|
|
6
7
|
import './VisibilityOrderingBuilder.scss';
|
|
7
8
|
import { type DisplayColumn } from '../../IrisGridModel';
|
|
8
9
|
import type IrisGridModel from '../../IrisGridModel';
|
|
9
10
|
import { type ColumnName } from '../../CommonTypes';
|
|
10
11
|
import ColumnHeaderGroup from '../../ColumnHeaderGroup';
|
|
11
|
-
import { type FlattenedIrisGridTreeItem, type IrisGridTreeItem } from './sortable-tree/utilities';
|
|
12
|
-
import { type
|
|
13
|
-
interface IndexRange {
|
|
14
|
-
prevIndex: number;
|
|
15
|
-
nextIndex: number;
|
|
16
|
-
}
|
|
12
|
+
import { type FlattenedIrisGridTreeItem, type IrisGridTreeItem, type IrisGridTreeItemData } from './sortable-tree/utilities';
|
|
13
|
+
import { type TreeItemRenderFnProps } from './sortable-tree/TreeItem';
|
|
17
14
|
export interface VisibilityOrderingBuilderProps {
|
|
18
15
|
model: IrisGridModel;
|
|
19
16
|
movedColumns: readonly MoveOperation[];
|
|
20
17
|
hiddenColumns: readonly ModelIndex[];
|
|
21
18
|
columnHeaderGroups: readonly ColumnHeaderGroup[];
|
|
22
|
-
onColumnVisibilityChanged: (columns: readonly
|
|
19
|
+
onColumnVisibilityChanged: (columns: readonly ModelIndex[], isVisible: boolean) => void;
|
|
23
20
|
onReset: () => void;
|
|
24
21
|
onMovedColumnsChanged: (operations: readonly MoveOperation[], cb?: () => void) => void;
|
|
25
22
|
onColumnHeaderGroupChanged: (groups: readonly ColumnHeaderGroup[]) => void;
|
|
@@ -36,12 +33,16 @@ interface VisibilityOrderingBuilderInnerProps extends Omit<VisibilityOrderingBui
|
|
|
36
33
|
}
|
|
37
34
|
interface VisibilityOrderingBuilderInnerState {
|
|
38
35
|
selectedColumns: Set<string>;
|
|
39
|
-
queriedColumnIndex: number | undefined;
|
|
40
|
-
queriedColumnRange: IndexRange | undefined;
|
|
41
|
-
prevQueriedColumns: Record<number, string> | undefined;
|
|
42
36
|
lastSelectedColumn: string;
|
|
43
|
-
|
|
37
|
+
isSearchModalOpen: boolean;
|
|
44
38
|
showHiddenColumns: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* This is used only for drag end. In React 18, it seems our rendering is causing
|
|
41
|
+
* 1 render with just the children of this component, then updating to render with the
|
|
42
|
+
* updated movedColumns prop. That is causing the drop animation to animate back to
|
|
43
|
+
* the original position of the element.
|
|
44
|
+
*/
|
|
45
|
+
movedColumns: readonly MoveOperation[];
|
|
45
46
|
}
|
|
46
47
|
declare class VisibilityOrderingBuilderInner extends PureComponent<VisibilityOrderingBuilderInnerProps, VisibilityOrderingBuilderInnerState> {
|
|
47
48
|
static SORTING_OPTIONS: {
|
|
@@ -60,35 +61,19 @@ declare class VisibilityOrderingBuilderInner extends PureComponent<VisibilityOrd
|
|
|
60
61
|
componentDidUpdate(prevProps: VisibilityOrderingBuilderInnerProps): void;
|
|
61
62
|
componentWillUnmount(): void;
|
|
62
63
|
wrapperRef: React.RefObject<HTMLDivElement>;
|
|
63
|
-
lastFocusedItemIndex: number | null;
|
|
64
|
-
list: HTMLDivElement | null;
|
|
65
|
-
debouncedSearchColumns: import("lodash").DebouncedFunc<(searchFilter: string, updateQuery?: boolean) => void>;
|
|
66
|
-
resetVisibilityOrdering(): void;
|
|
67
|
-
resetSelection(): void;
|
|
68
|
-
handleSearchInputChange(event: ChangeEvent<HTMLInputElement>): void;
|
|
69
|
-
searchColumns(searchFilter: string, updateQuery?: boolean): void;
|
|
70
64
|
/**
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* queriedColumnRange stores the closes options in the case that the user clicks on an option that didn't fulfill the search criteria.
|
|
74
|
-
* On click of the forward/back button, queriedColumnIndex is updated to either the upper or lower index in queriedColumnRange
|
|
75
|
-
*
|
|
76
|
-
* queriedColumnIndex is the current index within prevQueriedColumns. Not their actual index in the tree.
|
|
77
|
-
*
|
|
78
|
-
* @param direction The direction to move the selection
|
|
65
|
+
* Used to track the last focused item index to maintain focus on updates.
|
|
66
|
+
* Cannot use name because it may change or be deleted when undoing or redoing.
|
|
79
67
|
*/
|
|
80
|
-
|
|
68
|
+
lastFocusedItemIndex: number | null;
|
|
69
|
+
list: HTMLDivElement | null;
|
|
81
70
|
/**
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
* If the option clicked matches the search criteria the index is updated immediately.
|
|
85
|
-
*
|
|
86
|
-
* If the option clicked doesn't meet the search criteria, the two closest options that fulfill the criteria are stored.
|
|
87
|
-
* On click of the forward/back button the selection will change to one of those options. (Think of VS Code search functionality)
|
|
88
|
-
*
|
|
89
|
-
* @param name the name of the clicked column
|
|
71
|
+
* This is set by the search modal handlers since a column could be hidden
|
|
72
|
+
* and not displayed in the list. We need to wait until the update to scroll to it.
|
|
90
73
|
*/
|
|
91
|
-
|
|
74
|
+
scrollAndFocusColumnOnUpdate: string | null;
|
|
75
|
+
resetVisibilityOrdering(): void;
|
|
76
|
+
resetSelection(): void;
|
|
92
77
|
/**
|
|
93
78
|
* Moves the currently selected columns in the direction specified.
|
|
94
79
|
* Does not commit any changes to any state, just gets the required modifications.
|
|
@@ -139,7 +124,19 @@ declare class VisibilityOrderingBuilderInner extends PureComponent<VisibilityOrd
|
|
|
139
124
|
*/
|
|
140
125
|
getSortMoves(itemsParam: readonly IrisGridTreeItem[], option: keyof typeof VisibilityOrderingBuilderInner.SORTING_OPTIONS, movedColumns: readonly MoveOperation[]): MoveOperation[];
|
|
141
126
|
handleSortColumns(option: keyof typeof VisibilityOrderingBuilderInner.SORTING_OPTIONS): void;
|
|
142
|
-
|
|
127
|
+
/**
|
|
128
|
+
* Handles clicking on an item in the visibility ordering list.
|
|
129
|
+
* Adds and removes to selection as necessary based on modifier and shift keys.
|
|
130
|
+
* Returns the columns to be added to the selection, if any.
|
|
131
|
+
*
|
|
132
|
+
* @param name The name of the column clicked
|
|
133
|
+
* @param event The click event
|
|
134
|
+
* @param showHiddenColumns If hidden columns should be included in the selection
|
|
135
|
+
* @returns The columns to be added to the selection, if any`
|
|
136
|
+
*/
|
|
137
|
+
handleItemClick(name: string, event: React.MouseEvent<HTMLElement, MouseEvent>, showHiddenColumns?: boolean): string[];
|
|
138
|
+
handleSearchItemClicked(name: string, event: React.MouseEvent<HTMLElement>): void;
|
|
139
|
+
handleSearchSelect(names: string[]): void;
|
|
143
140
|
/**
|
|
144
141
|
* Adds columns or groups to the selected column set
|
|
145
142
|
* Groups being added will add all of their children to the selection as well
|
|
@@ -159,7 +156,7 @@ declare class VisibilityOrderingBuilderInner extends PureComponent<VisibilityOrd
|
|
|
159
156
|
* @param name Name of the column to remove
|
|
160
157
|
*/
|
|
161
158
|
removeColumnFromSelected(name: string): void;
|
|
162
|
-
handleDragStart(id: string): void;
|
|
159
|
+
handleDragStart(id: string, event: DragStartEvent): void;
|
|
163
160
|
handleDragEnd(from: FlattenedIrisGridTreeItem, to: FlattenedIrisGridTreeItem): void;
|
|
164
161
|
handleGroupNameChange(group: ColumnHeaderGroup, newName: string): void;
|
|
165
162
|
handleGroupColorChange: import("lodash").DebouncedFuncLeading<(group: ColumnHeaderGroup, color: string | undefined) => void>;
|
|
@@ -171,7 +168,7 @@ declare class VisibilityOrderingBuilderInner extends PureComponent<VisibilityOrd
|
|
|
171
168
|
* @returns Error message if invalid
|
|
172
169
|
*/
|
|
173
170
|
validateGroupName(groupName: string): string;
|
|
174
|
-
renderItem:
|
|
171
|
+
renderItem({ value, clone, item, ref, handleProps, }: TreeItemRenderFnProps<IrisGridTreeItemData>): JSX.Element;
|
|
175
172
|
getMemoizedFirstMovableIndex: ((model: IrisGridModel, columns: readonly dh.Column[], movedColumns: readonly MoveOperation[]) => number | null) & memoize.Memoized<(model: IrisGridModel, columns: readonly dh.Column[], movedColumns: readonly MoveOperation[]) => number | null>;
|
|
176
173
|
/**
|
|
177
174
|
* Gets the first movable visible index
|
|
@@ -186,9 +183,11 @@ declare class VisibilityOrderingBuilderInner extends PureComponent<VisibilityOrd
|
|
|
186
183
|
/**
|
|
187
184
|
* Gets the tree of movable items in order. Memoized for efficiency
|
|
188
185
|
* Use flattenItems(this.getTreeItems()) if a flat list is needed
|
|
186
|
+
* @param showHiddenColumns Whether to show hidden columns in the tree. Defaults to the current state value.
|
|
189
187
|
* @returns The movable tree items in order
|
|
190
188
|
*/
|
|
191
|
-
getTreeItems(): readonly IrisGridTreeItem[];
|
|
189
|
+
getTreeItems(showHiddenColumns?: boolean): readonly IrisGridTreeItem[];
|
|
190
|
+
getSelectedItemModelIndexes(columnNames: Set<string>): ModelIndex[];
|
|
192
191
|
/**
|
|
193
192
|
* Gets the selected items that are movable.
|
|
194
193
|
* This is any item whose parent is not also selected.
|
|
@@ -196,10 +195,11 @@ declare class VisibilityOrderingBuilderInner extends PureComponent<VisibilityOrd
|
|
|
196
195
|
* @returns The array of items whose parents are not selected
|
|
197
196
|
*/
|
|
198
197
|
getSelectedParentItems(): FlattenedIrisGridTreeItem[];
|
|
199
|
-
makeVisibilityOrderingList: ((columns: readonly DisplayColumn[], treeItems: readonly IrisGridTreeItem[], showHiddenColumns: boolean) => import("react/jsx-runtime").JSX.Element[]) & memoize.Memoized<(columns: readonly DisplayColumn[], treeItems: readonly IrisGridTreeItem[], showHiddenColumns: boolean) => import("react/jsx-runtime").JSX.Element[]>;
|
|
198
|
+
makeVisibilityOrderingList: ((columns: readonly DisplayColumn[], treeItems: readonly IrisGridTreeItem[], showHiddenColumns: boolean, isDraggable: boolean) => import("react/jsx-runtime").JSX.Element[]) & memoize.Memoized<(columns: readonly DisplayColumn[], treeItems: readonly IrisGridTreeItem[], showHiddenColumns: boolean, isDraggable: boolean) => import("react/jsx-runtime").JSX.Element[]>;
|
|
200
199
|
renderImmovableItem: ((columnName: ColumnName) => ReactElement) & memoize.Memoized<(columnName: ColumnName) => ReactElement>;
|
|
201
200
|
handleOverflowAction(key: Key): void;
|
|
202
201
|
handleKeyboardShortcut(event: React.KeyboardEvent): void;
|
|
202
|
+
handleSearchModalOpenChange(isOpen: boolean): void;
|
|
203
203
|
render(): ReactElement;
|
|
204
204
|
}
|
|
205
205
|
declare const VisibilityOrderingBuilder: React.MemoExoticComponent<(props: VisibilityOrderingBuilderProps) => import("react/jsx-runtime").JSX.Element>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VisibilityOrderingBuilder.d.ts","sourceRoot":"","sources":["../../../src/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAEZ,
|
|
1
|
+
{"version":3,"file":"VisibilityOrderingBuilder.d.ts","sourceRoot":"","sources":["../../../src/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.tsx"],"names":[],"mappings":"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"}
|