@progress/kendo-react-data-tools 13.3.0-develop.9 → 13.4.0-develop.1
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/clipboard/clipboard.service.d.ts +20 -0
- package/clipboard/common.d.ts +188 -0
- package/columnmenu/ColumnMenu.d.ts +90 -0
- package/columnmenu/ColumnMenuFilterForm.d.ts +25 -0
- package/columnmenu/ColumnMenuFilterLogic.d.ts +10 -0
- package/columnmenu/ColumnMenuFilterLogic.mjs +4 -4
- package/columnmenu/ColumnMenuFilters.d.ts +31 -0
- package/columnmenu/ColumnMenuItem.d.ts +39 -0
- package/columnmenu/ColumnMenuOperators.d.ts +72 -0
- package/columnmenu/index.d.ts +13 -0
- package/data-source/use-data-source.d.ts +224 -0
- package/data-source/use-odata-data-source.d.ts +41 -0
- package/data-source/use-remote-data-source.d.ts +411 -0
- package/detail-expansion/TableExpandableSettings.d.ts +12 -0
- package/detail-expansion/expandReducer.d.ts +31 -0
- package/detail-expansion/utils.d.ts +10 -0
- package/dist/cdn/js/kendo-react-datatools.js +1 -1
- package/drag/ColumnDraggable.d.ts +37 -0
- package/drag/ColumnResize.d.ts +39 -0
- package/drag/ColumnResizer.d.ts +35 -0
- package/drag/CommonDragLogic.d.ts +45 -0
- package/drag/DragClue.d.ts +29 -0
- package/drag/DropClue.d.ts +26 -0
- package/editing/TableEditableSettings.d.ts +24 -0
- package/editing/editReducer.d.ts +62 -0
- package/editing/utils.d.ts +12 -0
- package/filter/Expression.d.ts +53 -0
- package/filter/Expression.js +1 -1
- package/filter/Expression.mjs +10 -11
- package/filter/FieldSettings.d.ts +37 -0
- package/filter/Filter.d.ts +139 -0
- package/filter/Group.d.ts +64 -0
- package/filter/Group.js +1 -1
- package/filter/Group.mjs +7 -7
- package/filter/filters/BooleanFilter.d.ts +50 -0
- package/filter/filters/DateFilter.d.ts +33 -0
- package/filter/filters/EnumFilter.d.ts +50 -0
- package/filter/filters/NumericFilter.d.ts +40 -0
- package/filter/filters/TextFilter.d.ts +47 -0
- package/filter/filters/index.d.ts +12 -0
- package/filter/index.d.ts +13 -0
- package/filter/operators.d.ts +80 -0
- package/filteringCells/BooleanFilter.d.ts +15 -0
- package/filteringCells/DateFilter.d.ts +15 -0
- package/filteringCells/FilterCellProps.d.ts +42 -0
- package/filteringCells/FilterComponent.d.ts +24 -0
- package/filteringCells/FilterComponentProps.d.ts +30 -0
- package/filteringCells/FilterOperator.d.ts +20 -0
- package/filteringCells/NumericFilter.d.ts +15 -0
- package/filteringCells/TextFilter.d.ts +15 -0
- package/filteringCells/index.d.ts +15 -0
- package/group-expansion/TableGroupExpandableSettings.d.ts +12 -0
- package/group-expansion/groupExpandReducer.d.ts +46 -0
- package/header/CellProps.d.ts +83 -0
- package/header/ColumnProps.d.ts +167 -0
- package/header/FilterRow.d.ts +32 -0
- package/header/Header.d.ts +26 -0
- package/header/HeaderCell.d.ts +54 -0
- package/header/HeaderRow.d.ts +44 -0
- package/header/HeaderSelectionCell.d.ts +19 -0
- package/header/HeaderTdElement.d.ts +42 -0
- package/header/HeaderThElement.d.ts +42 -0
- package/header/SortSettings.d.ts +33 -0
- package/header/index.d.ts +18 -0
- package/header/utils/index.d.ts +90 -0
- package/index.d.mts +43 -3741
- package/index.d.ts +43 -3741
- package/messages/index.d.ts +397 -0
- package/navigation/NavigatableSettings.d.ts +25 -0
- package/navigation/TableKeyboardNavigation.d.ts +95 -0
- package/navigation/TableKeyboardNavigation.mjs +13 -13
- package/navigation/TableKeyboardNavigationContext.d.ts +13 -0
- package/navigation/TableKeyboardNavigationContextType.d.ts +14 -0
- package/navigation/TableKeyboardNavigationStateType.d.ts +17 -0
- package/navigation/constants.d.ts +61 -0
- package/navigation/hooks.d.ts +19 -0
- package/navigation/hooks.mjs +3 -3
- package/navigation/stackedKeyboardNavigation.d.ts +217 -0
- package/navigation/utils.d.ts +329 -0
- package/navigation/utils.mjs +5 -5
- package/package-metadata.d.ts +12 -0
- package/package-metadata.js +1 -1
- package/package-metadata.mjs +10 -16
- package/package.json +10 -10
- package/pager/Pager.d.ts +10 -0
- package/pager/Pager.js +1 -1
- package/pager/Pager.mjs +64 -66
- package/pager/PagerInput.d.ts +29 -0
- package/pager/PagerNumericButtons.d.ts +28 -0
- package/pager/PagerNumericButtons.js +1 -1
- package/pager/PagerNumericButtons.mjs +15 -17
- package/pager/PagerPageSizes.d.ts +36 -0
- package/pager/models/index.d.ts +178 -0
- package/pager/utils.d.ts +66 -0
- package/selection/TableSelectableSettings.d.ts +38 -0
- package/selection/TableSelection.d.ts +25 -0
- package/selection/constants.d.ts +13 -0
- package/selection/events.d.ts +101 -0
- package/selection/utils.d.ts +70 -0
- package/utils/DataItemWrapper.d.ts +17 -0
- package/utils/SearchField.d.ts +24 -0
- package/utils/data-operations.d.ts +107 -0
- package/utils/group-operations.d.ts +36 -0
- package/virtualization/columns.d.ts +24 -0
- package/virtualization/index.d.ts +8 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
*-------------------------------------------------------------------------------------------
|
|
4
|
+
* Copyright © 2026 Progress Software Corporation. All rights reserved.
|
|
5
|
+
* Licensed under commercial license. See LICENSE.md in the package root for more information
|
|
6
|
+
*-------------------------------------------------------------------------------------------
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* @hidden
|
|
10
|
+
*/
|
|
11
|
+
export declare const KEYBOARD_NAV_DATA_LEVEL = "data-keyboardnavlevel";
|
|
12
|
+
/**
|
|
13
|
+
* @hidden
|
|
14
|
+
*/
|
|
15
|
+
export declare const KEYBOARD_NAV_DATA_SCOPE = "data-keyboardnavscope";
|
|
16
|
+
/**
|
|
17
|
+
* @hidden
|
|
18
|
+
*/
|
|
19
|
+
export declare const KEYBOARD_NAV_DATA_HEADER = "data-keyboardnavheader";
|
|
20
|
+
/**
|
|
21
|
+
* @hidden
|
|
22
|
+
*/
|
|
23
|
+
export declare const KEYBOARD_NAV_DATA_BODY = "data-keyboardnavbody";
|
|
24
|
+
/**
|
|
25
|
+
* @hidden
|
|
26
|
+
*/
|
|
27
|
+
export declare const KEYBOARD_NAV_DATA_ID = "data-keyboardnavid";
|
|
28
|
+
/**
|
|
29
|
+
* @hidden
|
|
30
|
+
*/
|
|
31
|
+
export declare const KEYBOARD_NAV_DATA_ZONE = "data-keyboardnavzone";
|
|
32
|
+
/**
|
|
33
|
+
* @hidden
|
|
34
|
+
*/
|
|
35
|
+
export declare const KEYBOARD_NAV_FILTER_COL_SUFFIX = "_filter";
|
|
36
|
+
/**
|
|
37
|
+
* @hidden
|
|
38
|
+
*/
|
|
39
|
+
export declare const KEYBOARD_NAV_CANCEL_BUTTON_CLASS = "k-grid-cancel-command";
|
|
40
|
+
/**
|
|
41
|
+
* @hidden
|
|
42
|
+
*/
|
|
43
|
+
export declare const KEYBOARD_NAV_EDIT_BUTTON_CLASS = "k-grid-edit-command";
|
|
44
|
+
/**
|
|
45
|
+
* @hidden
|
|
46
|
+
*/
|
|
47
|
+
export declare const tableKeyboardNavigationScopeAttributes: {
|
|
48
|
+
"data-keyboardnavscope": boolean;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* @hidden
|
|
52
|
+
*/
|
|
53
|
+
export declare const tableKeyboardNavigationHeaderAttributes: {
|
|
54
|
+
"data-keyboardnavheader": boolean;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* @hidden
|
|
58
|
+
*/
|
|
59
|
+
export declare const tableKeyboardNavigationBodyAttributes: {
|
|
60
|
+
"data-keyboardnavbody": boolean;
|
|
61
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
*-------------------------------------------------------------------------------------------
|
|
4
|
+
* Copyright © 2026 Progress Software Corporation. All rights reserved.
|
|
5
|
+
* Licensed under commercial license. See LICENSE.md in the package root for more information
|
|
6
|
+
*-------------------------------------------------------------------------------------------
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* @hidden
|
|
10
|
+
*/
|
|
11
|
+
export declare const useTableKeyboardNavigation: (elementId: string, navigatable?: boolean) => {
|
|
12
|
+
tabIndex?: undefined;
|
|
13
|
+
"data-keyboardnavlevel"?: undefined;
|
|
14
|
+
"data-keyboardnavid"?: undefined;
|
|
15
|
+
} | {
|
|
16
|
+
tabIndex: number;
|
|
17
|
+
"data-keyboardnavlevel": number;
|
|
18
|
+
"data-keyboardnavid": string;
|
|
19
|
+
};
|
package/navigation/hooks.mjs
CHANGED
|
@@ -7,14 +7,14 @@
|
|
|
7
7
|
*/
|
|
8
8
|
"use client";
|
|
9
9
|
import * as e from "react";
|
|
10
|
-
import {
|
|
10
|
+
import { KEYBOARD_NAV_DATA_ID as r, KEYBOARD_NAV_DATA_LEVEL as i } from "./constants.mjs";
|
|
11
11
|
import { TableKeyboardNavigationContext as n } from "./TableKeyboardNavigationContext.mjs";
|
|
12
12
|
const v = (o, a) => {
|
|
13
13
|
const t = e.useContext(n);
|
|
14
14
|
return !t || !o || a === !1 ? {} : {
|
|
15
15
|
tabIndex: t && t.activeId && t.activeId === o ? 0 : -1,
|
|
16
|
-
[
|
|
17
|
-
[
|
|
16
|
+
[i]: t.level,
|
|
17
|
+
[r]: o
|
|
18
18
|
};
|
|
19
19
|
};
|
|
20
20
|
export {
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
*-------------------------------------------------------------------------------------------
|
|
4
|
+
* Copyright © 2026 Progress Software Corporation. All rights reserved.
|
|
5
|
+
* Licensed under commercial license. See LICENSE.md in the package root for more information
|
|
6
|
+
*-------------------------------------------------------------------------------------------
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Keyboard navigation utilities for stacked layout cells.
|
|
10
|
+
*
|
|
11
|
+
* Implements the navigation pattern specified in STACKED_LAYOUT_KEYBOARD_NAVIGATION.md:
|
|
12
|
+
*
|
|
13
|
+
* ## Key Behaviors
|
|
14
|
+
*
|
|
15
|
+
* 1. **Tab Navigation** - PRIMARY mechanism for navigating between stacked cells:
|
|
16
|
+
* - Tab: Move to next stacked cell in the row
|
|
17
|
+
* - Shift+Tab: Move to previous stacked cell in the row
|
|
18
|
+
* - Focus is TRAPPED within the row card (stopPropagation at boundaries)
|
|
19
|
+
*
|
|
20
|
+
* 2. **Enter/F2 Keys** - Transition from Cursor mode to Content mode:
|
|
21
|
+
* - Focuses the first focusable element within the cell
|
|
22
|
+
* - Enables interaction with cell content (inputs, buttons, etc.)
|
|
23
|
+
*
|
|
24
|
+
* 3. **Escape Key** - Exit Content mode, return to Cursor mode:
|
|
25
|
+
* - Returns focus to the row-level container
|
|
26
|
+
* - Resets cell entered state
|
|
27
|
+
*
|
|
28
|
+
* ## Navigation Modes
|
|
29
|
+
*
|
|
30
|
+
* - **Cursor Mode**: Cell wrapper is focused, user can navigate rows with arrow keys
|
|
31
|
+
* - **Content Mode**: Focusable element inside cell is focused, user can interact with content
|
|
32
|
+
*
|
|
33
|
+
* ## Critical Notes
|
|
34
|
+
*
|
|
35
|
+
* - Horizontal (Left/Right) arrow navigation is DISABLED in stacked mode
|
|
36
|
+
* - Vertical (Up/Down) arrow navigation moves between rows, not cells
|
|
37
|
+
* - Tab/Shift+Tab stops at row boundaries (prevents leaving the row)
|
|
38
|
+
* - Each row card is treated as a single navigable unit
|
|
39
|
+
*
|
|
40
|
+
* @module stackedKeyboardNavigation
|
|
41
|
+
* @see STACKED_LAYOUT_KEYBOARD_NAVIGATION.md for complete specification
|
|
42
|
+
*
|
|
43
|
+
* @hidden
|
|
44
|
+
*/
|
|
45
|
+
/**
|
|
46
|
+
* Options for handling stacked cell keyboard navigation.
|
|
47
|
+
*
|
|
48
|
+
* @hidden
|
|
49
|
+
*/
|
|
50
|
+
export interface StackedKeyboardNavigationOptions {
|
|
51
|
+
/**
|
|
52
|
+
* The keyboard event to handle.
|
|
53
|
+
*/
|
|
54
|
+
event: React.KeyboardEvent<HTMLElement>;
|
|
55
|
+
/**
|
|
56
|
+
* The cell element (the stacked cell wrapper div).
|
|
57
|
+
*/
|
|
58
|
+
cellElement: HTMLElement;
|
|
59
|
+
/**
|
|
60
|
+
* Optional callback to invoke after handling the keyboard event.
|
|
61
|
+
*/
|
|
62
|
+
onKeyDown?: (event: React.KeyboardEvent<HTMLElement>) => void;
|
|
63
|
+
/**
|
|
64
|
+
* Optional callback to invoke when Escape is pressed (to update row entered state).
|
|
65
|
+
*/
|
|
66
|
+
onEscape?: () => void;
|
|
67
|
+
/**
|
|
68
|
+
* Optional callback to invoke when exiting edit mode (e.g., on Escape in incell mode).
|
|
69
|
+
* This should trigger the Grid's onEditChange to update the edit descriptor.
|
|
70
|
+
*/
|
|
71
|
+
onExitEdit?: () => void;
|
|
72
|
+
/**
|
|
73
|
+
* Optional callback to invoke when Tab is pressed in incell edit mode.
|
|
74
|
+
* Called with the direction (1 for Tab, -1 for Shift+Tab) to move to next/previous cell.
|
|
75
|
+
* Should handle transitioning edit state from current cell to next/previous cell.
|
|
76
|
+
*/
|
|
77
|
+
onTabToNextCell?: (direction: number) => void;
|
|
78
|
+
/**
|
|
79
|
+
* Whether the cell is currently in edit mode.
|
|
80
|
+
* When true, applies edit mode keyboard navigation rules.
|
|
81
|
+
*/
|
|
82
|
+
isInEdit?: boolean;
|
|
83
|
+
/**
|
|
84
|
+
* The edit mode of the grid: 'incell', 'inline', or 'dialog'.
|
|
85
|
+
* Determines which keyboard navigation rules apply during editing.
|
|
86
|
+
*/
|
|
87
|
+
editMode?: 'incell' | 'inline' | 'dialog';
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Handles Tab key navigation within a stacked cell row.
|
|
91
|
+
* Implements focus trap pattern to keep navigation within the current row card.
|
|
92
|
+
* Tab/Shift+Tab navigates between stacked cells, stopping at row boundaries.
|
|
93
|
+
*
|
|
94
|
+
* Edit Mode Behaviors (EDIT_MODE_KEYBOARD_NAVIGATION.md):
|
|
95
|
+
* - **Incell**: Tab saves current cell and moves to next editable cell
|
|
96
|
+
* - **Inline**: Tab navigates between fields within the editing row
|
|
97
|
+
* - **Not editing**: Standard stacked cell navigation with focus trap
|
|
98
|
+
*
|
|
99
|
+
* Based on specification: "Tab is THE mechanism for navigating between stacked cells within a row"
|
|
100
|
+
* and "Trap focus within the current row card: Prevent Tab from leaving the row at boundaries"
|
|
101
|
+
*
|
|
102
|
+
* @param event - The keyboard event
|
|
103
|
+
* @param cellElement - The stacked cell wrapper element
|
|
104
|
+
* @param target - The event target element
|
|
105
|
+
* @param isInEdit - Whether the cell/row is in edit mode
|
|
106
|
+
* @param editMode - The edit mode ('incell', 'inline', or 'dialog')
|
|
107
|
+
* @returns true if the event was handled and should stop propagation
|
|
108
|
+
*
|
|
109
|
+
* @hidden
|
|
110
|
+
*/
|
|
111
|
+
export declare const handleStackedCellTabNavigation: (event: React.KeyboardEvent<HTMLElement>, cellElement: HTMLElement, target: HTMLElement, isInEdit?: boolean, editMode?: 'incell' | 'inline' | 'dialog', onTabToNextCell?: ((direction: number) => void) | undefined) => boolean;
|
|
112
|
+
/**
|
|
113
|
+
* Handles Enter key press on a stacked cell.
|
|
114
|
+
* Behavior varies based on edit mode.
|
|
115
|
+
*
|
|
116
|
+
* Edit Mode Behaviors (EDIT_MODE_KEYBOARD_NAVIGATION.md):
|
|
117
|
+
* - **Incell**: Enter confirms edit, saves changes, and closes cell
|
|
118
|
+
* - **Inline**: Enter moves to next field (does NOT save)
|
|
119
|
+
* - **Not editing**: Transitions from Cursor mode to Content mode
|
|
120
|
+
*
|
|
121
|
+
* Based on specification: "Enter or F2 while in Cursor Mode: Activates Content mode for the current cell"
|
|
122
|
+
*
|
|
123
|
+
* @param event - The keyboard event
|
|
124
|
+
* @param cellElement - The stacked cell wrapper element
|
|
125
|
+
* @param target - The event target element
|
|
126
|
+
* @param isInEdit - Whether the cell/row is in edit mode
|
|
127
|
+
* @param editMode - The edit mode ('incell', 'inline', or 'dialog')
|
|
128
|
+
* @returns true if the event was handled
|
|
129
|
+
*
|
|
130
|
+
* @hidden
|
|
131
|
+
*/
|
|
132
|
+
export declare const handleStackedCellEnterKey: (event: React.KeyboardEvent<HTMLElement>, cellElement: HTMLElement, target: HTMLElement, isInEdit?: boolean, editMode?: 'incell' | 'inline' | 'dialog') => boolean;
|
|
133
|
+
/**
|
|
134
|
+
* Handles Escape key press on a stacked cell.
|
|
135
|
+
* Behavior varies based on edit mode.
|
|
136
|
+
*
|
|
137
|
+
* Edit Mode Behaviors (EDIT_MODE_KEYBOARD_NAVIGATION.md):
|
|
138
|
+
* - **Incell**: Escape cancels edit, discards changes, and closes cell
|
|
139
|
+
* - **Inline**: Escape cancels editing, closes row, and discards changes
|
|
140
|
+
* - **Not editing**: Exits Content mode and returns to Cursor mode
|
|
141
|
+
*
|
|
142
|
+
* Based on specification: "Escape Key: Exits Content mode and returns to Cursor mode"
|
|
143
|
+
*
|
|
144
|
+
* @param event - The keyboard event
|
|
145
|
+
* @param cellElement - The stacked cell wrapper element
|
|
146
|
+
* @param onEscape - Optional callback to invoke when Escape is handled (resets cell entered state)
|
|
147
|
+
* @param isInEdit - Whether the cell/row is in edit mode
|
|
148
|
+
* @param editMode - The edit mode ('incell', 'inline', or 'dialog')
|
|
149
|
+
* @returns true if the event was handled
|
|
150
|
+
*
|
|
151
|
+
* @hidden
|
|
152
|
+
*/
|
|
153
|
+
export declare const handleStackedCellEscapeKey: (event: React.KeyboardEvent<HTMLElement>, cellElement: HTMLElement, onEscape?: () => void, onExitEdit?: () => void, isInEdit?: boolean, editMode?: 'incell' | 'inline' | 'dialog') => boolean;
|
|
154
|
+
/**
|
|
155
|
+
* Handles navigation keys (arrows, PageUp/Down, Home/End) during editing.
|
|
156
|
+
* Blocks ALL navigation keys during incell editing per specification.
|
|
157
|
+
*
|
|
158
|
+
* Edit Mode Behaviors (EDIT_MODE_KEYBOARD_NAVIGATION.md):
|
|
159
|
+
* - **Incell**: ALL navigation keys are BLOCKED
|
|
160
|
+
* - **Inline**: Arrow Up/Down are blocked (can't navigate to other rows)
|
|
161
|
+
* - **Not editing**: Navigation keys work normally
|
|
162
|
+
*
|
|
163
|
+
* Based on specification: "ALL navigation keys are blocked when cell is editing"
|
|
164
|
+
*
|
|
165
|
+
* @param event - The keyboard event
|
|
166
|
+
* @param isInEdit - Whether the cell/row is in edit mode
|
|
167
|
+
* @param editMode - The edit mode ('incell', 'inline', or 'dialog')
|
|
168
|
+
* @returns true if the event was blocked
|
|
169
|
+
*
|
|
170
|
+
* @hidden
|
|
171
|
+
*/
|
|
172
|
+
export declare const handleNavigationKeysInEditMode: (event: React.KeyboardEvent<HTMLElement>, isInEdit?: boolean, editMode?: 'incell' | 'inline' | 'dialog') => boolean;
|
|
173
|
+
/**
|
|
174
|
+
* Main handler for stacked cell keyboard navigation.
|
|
175
|
+
* Implements the navigation pattern described in the specifications:
|
|
176
|
+
*
|
|
177
|
+
* Specifications:
|
|
178
|
+
* - STACKED_LAYOUT_KEYBOARD_NAVIGATION.md: Navigation modes and focus trap
|
|
179
|
+
* - EDIT_MODE_KEYBOARD_NAVIGATION.md: Edit mode behaviors
|
|
180
|
+
*
|
|
181
|
+
* Navigation Flow:
|
|
182
|
+
* - Tab/Shift+Tab: Navigate between stacked cells within the row (focus trapped)
|
|
183
|
+
* - Enter/F2: Transition from Cursor mode to Content mode (focus first element)
|
|
184
|
+
* - Escape: Exit Content mode, return to Cursor mode (focus row container)
|
|
185
|
+
*
|
|
186
|
+
* Mode Transitions:
|
|
187
|
+
* - Cursor Mode: Cell wrapper is focused, arrow keys navigate rows
|
|
188
|
+
* - Content Mode: Focusable element inside cell is focused, Tab navigates cells
|
|
189
|
+
*
|
|
190
|
+
* Focus Trap:
|
|
191
|
+
* Tab navigation is trapped within the current row card. At boundaries:
|
|
192
|
+
* - First cell + Shift+Tab: Stay on first cell (stopPropagation)
|
|
193
|
+
* - Last cell + Tab: Stay on last cell (stopPropagation)
|
|
194
|
+
*
|
|
195
|
+
* Edit Mode Behaviors:
|
|
196
|
+
* - **Incell**: All navigation keys blocked, Tab saves and moves, Enter saves, Escape cancels
|
|
197
|
+
* - **Inline**: Up/Down blocked, Tab between fields, Enter to next field, Escape cancels
|
|
198
|
+
* - **Not editing**: Normal navigation
|
|
199
|
+
*
|
|
200
|
+
* @param options - Navigation options
|
|
201
|
+
*
|
|
202
|
+
* @hidden
|
|
203
|
+
*/
|
|
204
|
+
export declare const handleStackedKeyboardNavigation: (options: StackedKeyboardNavigationOptions) => void;
|
|
205
|
+
/**
|
|
206
|
+
* Exported stacked keyboard navigation utilities.
|
|
207
|
+
*
|
|
208
|
+
* @hidden
|
|
209
|
+
*/
|
|
210
|
+
export declare const stackedKeyboardNavigationTools: {
|
|
211
|
+
handleStackedKeyboardNavigation: (options: StackedKeyboardNavigationOptions) => void;
|
|
212
|
+
handleStackedCellTabNavigation: (event: React.KeyboardEvent<HTMLElement>, cellElement: HTMLElement, target: HTMLElement, isInEdit?: boolean, editMode?: 'incell' | 'inline' | 'dialog', onTabToNextCell?: ((direction: number) => void) | undefined) => boolean;
|
|
213
|
+
handleStackedCellEnterKey: (event: React.KeyboardEvent<HTMLElement>, cellElement: HTMLElement, target: HTMLElement, isInEdit?: boolean, editMode?: 'incell' | 'inline' | 'dialog') => boolean;
|
|
214
|
+
handleStackedCellEscapeKey: (event: React.KeyboardEvent<HTMLElement>, cellElement: HTMLElement, onEscape?: () => void, onExitEdit?: () => void, isInEdit?: boolean, editMode?: 'incell' | 'inline' | 'dialog') => boolean;
|
|
215
|
+
handleNavigationKeysInEditMode: (event: React.KeyboardEvent<HTMLElement>, isInEdit?: boolean, editMode?: 'incell' | 'inline' | 'dialog') => boolean;
|
|
216
|
+
isNavigationKey: (key: string) => boolean;
|
|
217
|
+
};
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
*-------------------------------------------------------------------------------------------
|
|
4
|
+
* Copyright © 2026 Progress Software Corporation. All rights reserved.
|
|
5
|
+
* Licensed under commercial license. See LICENSE.md in the package root for more information
|
|
6
|
+
*-------------------------------------------------------------------------------------------
|
|
7
|
+
*/
|
|
8
|
+
import { TableKeyboardNavigationContextType } from './TableKeyboardNavigationContextType.js';
|
|
9
|
+
import { TableKeyboardNavigationStateType } from './TableKeyboardNavigationStateType.js';
|
|
10
|
+
/**
|
|
11
|
+
* @hidden
|
|
12
|
+
*/
|
|
13
|
+
export declare const generateNavigatableId: (navigationId: string, idPrefix: string, type?: 'column' | 'cell' | 'group' | 'expand' | 'nodata') => string;
|
|
14
|
+
/**
|
|
15
|
+
* @hidden
|
|
16
|
+
*/
|
|
17
|
+
export declare const getNavigatableLevel: (element: Element | null) => number | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* @hidden
|
|
20
|
+
*/
|
|
21
|
+
export declare const getNavigatableId: (element: Element | null) => string | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* @hidden
|
|
24
|
+
*/
|
|
25
|
+
export declare const isNavigatable: (element: Element | null) => boolean;
|
|
26
|
+
/**
|
|
27
|
+
* @hidden
|
|
28
|
+
*/
|
|
29
|
+
export declare const getNavigatableElement: (scope: HTMLElement, options?: {
|
|
30
|
+
level: number;
|
|
31
|
+
}) => HTMLElement;
|
|
32
|
+
/**
|
|
33
|
+
* @hidden
|
|
34
|
+
*/
|
|
35
|
+
export declare const getClosestNavigatableElement: (target: HTMLElement) => Element | null;
|
|
36
|
+
/**
|
|
37
|
+
* @hidden
|
|
38
|
+
*/
|
|
39
|
+
export declare const getActiveNavDataElement: (scope: HTMLElement, activeId?: string) => HTMLElement;
|
|
40
|
+
/**
|
|
41
|
+
* @hidden
|
|
42
|
+
*/
|
|
43
|
+
export declare const getClosestScope: (target: HTMLElement) => Element | null;
|
|
44
|
+
/**
|
|
45
|
+
* @hidden
|
|
46
|
+
*/
|
|
47
|
+
export declare const getClosestCancelButton: (target: HTMLElement) => Element | null | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* @hidden
|
|
50
|
+
*/
|
|
51
|
+
export declare const getRemoveButtonByAriaRowIndex: (ariaRowIndex: number) => Element | null;
|
|
52
|
+
/**
|
|
53
|
+
* @hidden
|
|
54
|
+
*/
|
|
55
|
+
export declare const getTableCellByKeyboardNavId: (navId: string) => Element | null;
|
|
56
|
+
/**
|
|
57
|
+
* @hidden
|
|
58
|
+
*/
|
|
59
|
+
export declare const getRowAriaRowIndex: (target: HTMLElement) => undefined;
|
|
60
|
+
/**
|
|
61
|
+
* @hidden
|
|
62
|
+
*/
|
|
63
|
+
declare function waitForElementToBeVisible(selector: string, parentElement: Element | null, timeout?: number): Promise<boolean | Element>;
|
|
64
|
+
/**
|
|
65
|
+
* @hidden
|
|
66
|
+
*/
|
|
67
|
+
export declare const getClosestEditButton: (target: HTMLElement) => Promise<boolean | Element>;
|
|
68
|
+
/**
|
|
69
|
+
* @hidden
|
|
70
|
+
*/
|
|
71
|
+
export declare const getParentCell: (target: HTMLElement) => Element | null;
|
|
72
|
+
/**
|
|
73
|
+
* @hidden
|
|
74
|
+
*/
|
|
75
|
+
export declare const getHeaderElement: (scope: HTMLElement) => Element | null;
|
|
76
|
+
/**
|
|
77
|
+
* @hidden
|
|
78
|
+
*/
|
|
79
|
+
export declare const getBodyElement: (scope: HTMLElement) => Element | null;
|
|
80
|
+
/**
|
|
81
|
+
* @hidden
|
|
82
|
+
*/
|
|
83
|
+
export declare const getNoRecordsElement: (scope: HTMLElement) => Element | null;
|
|
84
|
+
/**
|
|
85
|
+
* @hidden
|
|
86
|
+
*/
|
|
87
|
+
export declare const focusFirstEditor: (newEditableRow: Element) => void;
|
|
88
|
+
/**
|
|
89
|
+
* @hidden
|
|
90
|
+
*/
|
|
91
|
+
export declare const focusFirstDataElement: (options: {
|
|
92
|
+
scope?: HTMLElement;
|
|
93
|
+
contextStateRef: {
|
|
94
|
+
current?: TableKeyboardNavigationContextType;
|
|
95
|
+
};
|
|
96
|
+
navigationStateRef: {
|
|
97
|
+
current?: TableKeyboardNavigationStateType;
|
|
98
|
+
};
|
|
99
|
+
}, event?: any) => void;
|
|
100
|
+
/**
|
|
101
|
+
* @hidden
|
|
102
|
+
*/
|
|
103
|
+
export declare const getFocusableElements: (scope: HTMLElement, options?: {
|
|
104
|
+
focusable: boolean;
|
|
105
|
+
}) => Element[];
|
|
106
|
+
/**
|
|
107
|
+
* @hidden
|
|
108
|
+
*/
|
|
109
|
+
export declare const getNavigatableElements: (scope: HTMLElement | null, options?: {
|
|
110
|
+
level: number;
|
|
111
|
+
}) => any[];
|
|
112
|
+
/**
|
|
113
|
+
* @hidden
|
|
114
|
+
*/
|
|
115
|
+
export declare const filterNavigatableElements: (options?: {
|
|
116
|
+
level: number;
|
|
117
|
+
}) => (element: HTMLElement) => boolean;
|
|
118
|
+
/**
|
|
119
|
+
* @hidden
|
|
120
|
+
*/
|
|
121
|
+
export declare const focusElement: (options: {
|
|
122
|
+
elementForFocus: HTMLElement;
|
|
123
|
+
prevElement?: HTMLElement;
|
|
124
|
+
contextStateRef: {
|
|
125
|
+
current?: TableKeyboardNavigationContextType;
|
|
126
|
+
};
|
|
127
|
+
event?: any;
|
|
128
|
+
}) => void;
|
|
129
|
+
/**
|
|
130
|
+
* @hidden
|
|
131
|
+
*/
|
|
132
|
+
export declare const getIdPrefix: (navigationStateRef: {
|
|
133
|
+
current?: TableKeyboardNavigationStateType;
|
|
134
|
+
}) => string;
|
|
135
|
+
/**
|
|
136
|
+
* @hidden
|
|
137
|
+
*/
|
|
138
|
+
export declare const findNextIdByRowIndex: (initialRowIndex: number, cellIndex: number, elementId: string | undefined, matrix: string[][], isReverse: boolean) => [
|
|
139
|
+
string,
|
|
140
|
+
[
|
|
141
|
+
number,
|
|
142
|
+
number
|
|
143
|
+
]
|
|
144
|
+
] | [
|
|
145
|
+
];
|
|
146
|
+
/**
|
|
147
|
+
* @hidden
|
|
148
|
+
*/
|
|
149
|
+
export declare const findNextIdByCellIndex: (rowIndex: number, initialCellIndex: number, elementId: string | undefined, matrix: string[][], isReverse: boolean) => [
|
|
150
|
+
string,
|
|
151
|
+
[
|
|
152
|
+
number,
|
|
153
|
+
number
|
|
154
|
+
]
|
|
155
|
+
] | [
|
|
156
|
+
];
|
|
157
|
+
/**
|
|
158
|
+
* @hidden
|
|
159
|
+
*/
|
|
160
|
+
export declare const findId: (navigationMatrix: string[][], cellId?: string) => number[] | undefined;
|
|
161
|
+
/**
|
|
162
|
+
* @hidden
|
|
163
|
+
*/
|
|
164
|
+
export declare const getPrevEditableCell: (currentIdIndexes: number[], columns: any[], elementId: string | undefined, matrix: string[][]) => {
|
|
165
|
+
prevCell: "" | Element | null | undefined;
|
|
166
|
+
elementToFocus: string | null | undefined;
|
|
167
|
+
};
|
|
168
|
+
/**
|
|
169
|
+
* @hidden
|
|
170
|
+
*/
|
|
171
|
+
export declare const getNextEditableCell: (currentIdIndexes: number[], columns: any[], elementId: string | undefined, matrix: string[][]) => {
|
|
172
|
+
nextCell: "" | Element | null | undefined;
|
|
173
|
+
elementToFocus: string | null | undefined;
|
|
174
|
+
};
|
|
175
|
+
/**
|
|
176
|
+
* @hidden
|
|
177
|
+
*/
|
|
178
|
+
export declare const getNextNavigationIndex: (navigationStateRef: {
|
|
179
|
+
current?: TableKeyboardNavigationStateType;
|
|
180
|
+
}) => number;
|
|
181
|
+
/**
|
|
182
|
+
* @hidden
|
|
183
|
+
*/
|
|
184
|
+
export declare const getFirstDataCell: (navigationMatrix: string[][]) => string | undefined;
|
|
185
|
+
/**
|
|
186
|
+
* @hidden
|
|
187
|
+
*/
|
|
188
|
+
export declare const getLastDataCell: (navigationMatrix: string[][]) => string | undefined;
|
|
189
|
+
/**
|
|
190
|
+
* @hidden
|
|
191
|
+
*/
|
|
192
|
+
export declare const getFirstRowDataCell: (navigationMatrix: string[][], rowIndex: number) => string;
|
|
193
|
+
/**
|
|
194
|
+
* @hidden
|
|
195
|
+
*/
|
|
196
|
+
export declare const getLastRowDataCell: (navigationMatrix: string[][], rowIndex: number) => string;
|
|
197
|
+
/**
|
|
198
|
+
* @hidden
|
|
199
|
+
*/
|
|
200
|
+
export declare const getFilterColumnId: (columnId: string) => string;
|
|
201
|
+
/**
|
|
202
|
+
* @hidden
|
|
203
|
+
*/
|
|
204
|
+
export declare const getCurrentIdIndexes: (navigationStateRef: {
|
|
205
|
+
current?: TableKeyboardNavigationStateType | undefined;
|
|
206
|
+
}, matrix: string[][], elementId: string | undefined) => number[] | undefined;
|
|
207
|
+
/**
|
|
208
|
+
* @hidden
|
|
209
|
+
*/
|
|
210
|
+
export declare const getClosestCellNavId: (element: HTMLElement) => string | null;
|
|
211
|
+
/**
|
|
212
|
+
* Gets the parent stacked cell wrapper element.
|
|
213
|
+
*
|
|
214
|
+
* @hidden
|
|
215
|
+
*/
|
|
216
|
+
export declare const getStackedCellWrapper: (target: HTMLElement) => HTMLElement | null;
|
|
217
|
+
/**
|
|
218
|
+
* Gets all focusable elements within a stacked cell.
|
|
219
|
+
*
|
|
220
|
+
* @hidden
|
|
221
|
+
*/
|
|
222
|
+
export declare const getStackedCellFocusableElements: (cellElement: HTMLElement) => HTMLElement[];
|
|
223
|
+
/**
|
|
224
|
+
* Finds the next stacked cell sibling in the specified direction.
|
|
225
|
+
*
|
|
226
|
+
* @hidden
|
|
227
|
+
*/
|
|
228
|
+
export declare const getNextStackedCell: (currentCell: HTMLElement, direction: 'next' | 'prev') => HTMLElement | null;
|
|
229
|
+
/**
|
|
230
|
+
* Gets the table cell (td) that contains the stacked cells.
|
|
231
|
+
*
|
|
232
|
+
* @hidden
|
|
233
|
+
*/
|
|
234
|
+
export declare const getStackedCellContainer: (stackedCell: HTMLElement) => HTMLElement | null;
|
|
235
|
+
/**
|
|
236
|
+
* Focuses an element within a stacked cell, or the cell itself if no focusable found.
|
|
237
|
+
*
|
|
238
|
+
* @hidden
|
|
239
|
+
*/
|
|
240
|
+
export declare const focusStackedCellElement: (cellElement: HTMLElement, preferredIndex?: number) => void;
|
|
241
|
+
/**
|
|
242
|
+
* @hidden
|
|
243
|
+
*/
|
|
244
|
+
export declare const tableKeyboardNavigationTools: {
|
|
245
|
+
generateNavigatableId: (navigationId: string, idPrefix: string, type?: 'column' | 'cell' | 'group' | 'expand' | 'nodata') => string;
|
|
246
|
+
getNavigatableId: (element: Element | null) => string | undefined;
|
|
247
|
+
getNavigatableLevel: (element: Element | null) => number | undefined;
|
|
248
|
+
getNavigatableElement: (scope: HTMLElement, options?: {
|
|
249
|
+
level: number;
|
|
250
|
+
}) => HTMLElement;
|
|
251
|
+
getClosestNavigatableElement: (target: HTMLElement) => Element | null;
|
|
252
|
+
getActiveNavDataElement: (scope: HTMLElement, activeId?: string) => HTMLElement;
|
|
253
|
+
getClosestScope: (target: HTMLElement) => Element | null;
|
|
254
|
+
getHeaderElement: (scope: HTMLElement) => Element | null;
|
|
255
|
+
getBodyElement: (scope: HTMLElement) => Element | null;
|
|
256
|
+
getFocusableElements: (scope: HTMLElement, options?: {
|
|
257
|
+
focusable: boolean;
|
|
258
|
+
}) => Element[];
|
|
259
|
+
getNavigatableElements: (scope: HTMLElement | null, options?: {
|
|
260
|
+
level: number;
|
|
261
|
+
}) => any[];
|
|
262
|
+
filterNavigatableElements: (options?: {
|
|
263
|
+
level: number;
|
|
264
|
+
}) => (element: HTMLElement) => boolean;
|
|
265
|
+
focusElement: (options: {
|
|
266
|
+
elementForFocus: HTMLElement;
|
|
267
|
+
prevElement?: HTMLElement;
|
|
268
|
+
contextStateRef: {
|
|
269
|
+
current?: TableKeyboardNavigationContextType;
|
|
270
|
+
};
|
|
271
|
+
event?: any;
|
|
272
|
+
}) => void;
|
|
273
|
+
getIdPrefix: (navigationStateRef: {
|
|
274
|
+
current?: TableKeyboardNavigationStateType;
|
|
275
|
+
}) => string;
|
|
276
|
+
isNavigatable: (element: Element | null) => boolean;
|
|
277
|
+
findNextIdByRowIndex: (initialRowIndex: number, cellIndex: number, elementId: string | undefined, matrix: string[][], isReverse: boolean) => [
|
|
278
|
+
string,
|
|
279
|
+
[
|
|
280
|
+
number,
|
|
281
|
+
number
|
|
282
|
+
]
|
|
283
|
+
] | [
|
|
284
|
+
];
|
|
285
|
+
findNextIdByCellIndex: (rowIndex: number, initialCellIndex: number, elementId: string | undefined, matrix: string[][], isReverse: boolean) => [
|
|
286
|
+
string,
|
|
287
|
+
[
|
|
288
|
+
number,
|
|
289
|
+
number
|
|
290
|
+
]
|
|
291
|
+
] | [
|
|
292
|
+
];
|
|
293
|
+
findId: (navigationMatrix: string[][], cellId?: string) => number[] | undefined;
|
|
294
|
+
getNextNavigationIndex: (navigationStateRef: {
|
|
295
|
+
current?: TableKeyboardNavigationStateType;
|
|
296
|
+
}) => number;
|
|
297
|
+
getFilterColumnId: (columnId: string) => string;
|
|
298
|
+
focusFirstDataElement: (options: {
|
|
299
|
+
scope?: HTMLElement;
|
|
300
|
+
contextStateRef: {
|
|
301
|
+
current?: TableKeyboardNavigationContextType;
|
|
302
|
+
};
|
|
303
|
+
navigationStateRef: {
|
|
304
|
+
current?: TableKeyboardNavigationStateType;
|
|
305
|
+
};
|
|
306
|
+
}, event?: any) => void;
|
|
307
|
+
getClosestCancelButton: (target: HTMLElement) => Element | null | undefined;
|
|
308
|
+
getClosestEditButton: (target: HTMLElement) => Promise<boolean | Element>;
|
|
309
|
+
getRowAriaRowIndex: (target: HTMLElement) => undefined;
|
|
310
|
+
getRemoveButtonByAriaRowIndex: (ariaRowIndex: number) => Element | null;
|
|
311
|
+
getTableCellByKeyboardNavId: (navId: string) => Element | null;
|
|
312
|
+
getParentCell: (target: HTMLElement) => Element | null;
|
|
313
|
+
waitForElementToBeVisible: typeof waitForElementToBeVisible;
|
|
314
|
+
getNextEditableCell: (currentIdIndexes: number[], columns: any[], elementId: string | undefined, matrix: string[][]) => {
|
|
315
|
+
nextCell: "" | Element | null | undefined;
|
|
316
|
+
elementToFocus: string | null | undefined;
|
|
317
|
+
};
|
|
318
|
+
getPrevEditableCell: (currentIdIndexes: number[], columns: any[], elementId: string | undefined, matrix: string[][]) => {
|
|
319
|
+
prevCell: "" | Element | null | undefined;
|
|
320
|
+
elementToFocus: string | null | undefined;
|
|
321
|
+
};
|
|
322
|
+
getClosestCellNavId: (element: HTMLElement) => string | null;
|
|
323
|
+
getStackedCellWrapper: (target: HTMLElement) => HTMLElement | null;
|
|
324
|
+
getStackedCellFocusableElements: (cellElement: HTMLElement) => HTMLElement[];
|
|
325
|
+
getNextStackedCell: (currentCell: HTMLElement, direction: 'next' | 'prev') => HTMLElement | null;
|
|
326
|
+
getStackedCellContainer: (stackedCell: HTMLElement) => HTMLElement | null;
|
|
327
|
+
focusStackedCellElement: (cellElement: HTMLElement, preferredIndex?: number) => void;
|
|
328
|
+
};
|
|
329
|
+
export {};
|
package/navigation/utils.mjs
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*-------------------------------------------------------------------------------------------
|
|
7
7
|
*/
|
|
8
8
|
import { FOCUSABLE_ELEMENTS as A, TABBABLE_ELEMENTS as k } from "@progress/kendo-react-common";
|
|
9
|
-
import {
|
|
9
|
+
import { KEYBOARD_NAV_EDIT_BUTTON_CLASS as D, KEYBOARD_NAV_CANCEL_BUTTON_CLASS as B, KEYBOARD_NAV_FILTER_COL_SUFFIX as w, KEYBOARD_NAV_DATA_ID as g, KEYBOARD_NAV_DATA_LEVEL as f, KEYBOARD_NAV_DATA_BODY as h, KEYBOARD_NAV_DATA_HEADER as T, KEYBOARD_NAV_DATA_SCOPE as $ } from "./constants.mjs";
|
|
10
10
|
const F = (e, t, r = "cell") => `${t}_${e}_${r}`, q = (e) => {
|
|
11
11
|
if (e)
|
|
12
12
|
return parseInt(e.getAttribute(f) || "", 10);
|
|
@@ -15,7 +15,7 @@ const F = (e, t, r = "cell") => `${t}_${e}_${r}`, q = (e) => {
|
|
|
15
15
|
return;
|
|
16
16
|
const t = e.getAttribute(g);
|
|
17
17
|
return t || void 0;
|
|
18
|
-
}, E = (e) => e ? !!e.getAttribute(g) : !1, L = (e, t = { level: 0 }) => e.querySelector(`[${f}='${t.level}']`), x = (e) => e && e.parentElement && e.parentElement.closest(`[${f}]`), I = (e, t) => e.querySelector(`[${g}='${t}']`), O = (e) => e && e.parentElement && e.parentElement.closest(`[${
|
|
18
|
+
}, E = (e) => e ? !!e.getAttribute(g) : !1, L = (e, t = { level: 0 }) => e.querySelector(`[${f}='${t.level}']`), x = (e) => e && e.parentElement && e.parentElement.closest(`[${f}]`), I = (e, t) => e.querySelector(`[${g}='${t}']`), O = (e) => e && e.parentElement && e.parentElement.closest(`[${$}]`), R = (e) => {
|
|
19
19
|
var r;
|
|
20
20
|
const t = ((r = e == null ? void 0 : e.parentElement) == null ? void 0 : r.closest(".k-grid-edit-row")) || null;
|
|
21
21
|
return t == null ? void 0 : t.querySelector("." + B);
|
|
@@ -47,8 +47,8 @@ async function p(e, t, r = 5e3) {
|
|
|
47
47
|
const Y = async (e) => {
|
|
48
48
|
var n;
|
|
49
49
|
const t = ((n = e == null ? void 0 : e.parentElement) == null ? void 0 : n.closest(".k-grid-edit-row")) || null;
|
|
50
|
-
return await p("." +
|
|
51
|
-
}, P = (e) => (e == null ? void 0 : e.closest(".k-table-td")) || null, U = (e) => e.querySelector(`[${
|
|
50
|
+
return await p("." + D, t);
|
|
51
|
+
}, P = (e) => (e == null ? void 0 : e.closest(".k-table-td")) || null, U = (e) => e.querySelector(`[${T}]`), W = (e) => e.querySelector(`[${h}]`), ue = (e) => e.querySelector(".k-grid-norecords"), ae = (e) => {
|
|
52
52
|
const t = e.querySelector(".k-grid-edit-cell"), r = t == null ? void 0 : t.querySelector("input");
|
|
53
53
|
r ? r.focus() : t && t.firstChild.focus();
|
|
54
54
|
}, j = (e, t) => {
|
|
@@ -140,7 +140,7 @@ const Y = async (e) => {
|
|
|
140
140
|
nextCell: l && l[0] && a(l[0]),
|
|
141
141
|
elementToFocus: l && l[0] && ((o = a(l[0])) == null ? void 0 : o.getAttribute("role"))
|
|
142
142
|
};
|
|
143
|
-
}, Q = (e) => e.current ? e.current.navigationMatrix.length : 0, Z = (e) => e.flat().find((t) => t.endsWith("cell")), de = (e) => e.flat().reverse().find((t) => t.endsWith("cell")), fe = (e, t) => e[t][0], Ee = (e, t) => Array.from(e[t]).reverse()[0], ee = (e) => e ? `${e}${
|
|
143
|
+
}, Q = (e) => e.current ? e.current.navigationMatrix.length : 0, Z = (e) => e.flat().find((t) => t.endsWith("cell")), de = (e) => e.flat().reverse().find((t) => t.endsWith("cell")), fe = (e, t) => e[t][0], Ee = (e, t) => Array.from(e[t]).reverse()[0], ee = (e) => e ? `${e}${w}` : "", be = (e, t, r) => {
|
|
144
144
|
var l;
|
|
145
145
|
let n;
|
|
146
146
|
if ((l = e.current) != null && l.prevNavigationIndexes) {
|