Skip to content

Commit 9c5c0c2

Browse files
authored
Merge pull request #208 from axonivy/improve-table-keyboard-support
Improve useTableKeyHandler-Hook
2 parents de6a6f4 + 4cad7de commit 9c5c0c2

File tree

4 files changed

+22
-10
lines changed

4 files changed

+22
-10
lines changed

packages/components/src/components/common/table/hooks/hooks.tsx

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ interface KeyHandlerOptions<TData> {
124124
multiSelect?: boolean;
125125
reorder?: { updateOrder?: (moveIndexes: number[], toIndex: number) => void; getRowId?: (row: TData) => string };
126126
lazyLoadChildren?: (row: Row<TData>) => void;
127+
resetSelectionOnTab?: boolean;
127128
}
128129

129130
interface TableKeyboardHandlerProps<TData> {
@@ -141,16 +142,17 @@ export const useTableKeyHandler = <TData,>({ table, data, options }: TableKeyboa
141142
const actions: Record<string, () => void> = {
142143
ArrowUp: () => handleArrowKeyUpDown(event, -1),
143144
ArrowDown: () => handleArrowKeyUpDown(event, 1),
144-
ArrowLeft: () => toggleExpand(table.getSelectedRowModel().flatRows[0], true, options?.lazyLoadChildren),
145-
ArrowRight: () => toggleExpand(table.getSelectedRowModel().flatRows[0], false, options?.lazyLoadChildren),
146-
Tab: () => table.resetRowSelection(),
145+
ArrowLeft: () => toggleExpand(false, table.getSelectedRowModel().flatRows[0], options?.lazyLoadChildren),
146+
ArrowRight: () => toggleExpand(true, table.getSelectedRowModel().flatRows[0], options?.lazyLoadChildren),
147+
Tab: () => options?.resetSelectionOnTab && table.resetRowSelection(),
147148
Enter: () => onEnterAction?.(table.getSelectedRowModel().flatRows[0])
148149
};
149150

150151
actions[event.key]?.();
151152
};
152153

153154
const handleArrowKeyUpDown = (event: React.KeyboardEvent<HTMLTableElement>, direction: -1 | 1) => {
155+
event.preventDefault();
154156
const { multiSelect = false, reorder } = options || {};
155157
const allRows = table.getRowModel().rows;
156158
const selectedRows = table.getSelectedRowModel().flatRows;
@@ -175,6 +177,7 @@ export const useTableKeyHandler = <TData,>({ table, data, options }: TableKeyboa
175177
table.resetRowSelection();
176178
allRows[newReorderIndex].toggleSelected();
177179
setRootIndex(newReorderIndex);
180+
event.currentTarget.rows[newReorderIndex].scrollIntoView({ block: 'center' });
178181
}
179182
};
180183

@@ -208,7 +211,10 @@ export const useTableKeyHandler = <TData,>({ table, data, options }: TableKeyboa
208211
return { handleKeyDown };
209212
};
210213

211-
const toggleExpand = <TData,>(row: Row<TData>, expand: boolean, loadChildren?: (row: Row<TData>) => void) => {
214+
const toggleExpand = <TData,>(expand: boolean, row?: Row<TData>, loadChildren?: (row: Row<TData>) => void) => {
215+
if (row === undefined || !row.getCanExpand()) {
216+
return;
217+
}
212218
if (expand && !row.getIsExpanded()) {
213219
loadChildren?.(row);
214220
row.toggleExpanded();

packages/components/src/components/common/table/row/row.stories.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,8 @@ export const MultiSelectWithReorder: Story = {
258258
data,
259259
options: {
260260
multiSelect: true,
261-
reorder: { updateOrder: updateDataArray, getRowId: row => row.id }
261+
reorder: { updateOrder: updateDataArray, getRowId: row => row.id },
262+
resetSelectionOnTab: true
262263
}
263264
});
264265

packages/components/src/components/common/table/table.css.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,9 @@ export const table = style({
1717
tableLayout: 'fixed',
1818
borderCollapse: 'collapse',
1919
fontSize: '12px',
20-
selectors: {
21-
'&:focus-visible': {
22-
border: vars.border.active
23-
}
20+
':focus-visible': {
21+
outline: 'none',
22+
border: vars.border.active
2423
}
2524
});
2625

packages/components/src/components/editor/browser/data.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,13 @@ export const cmsData: Array<CmsBrowserNode> = [
138138
icon: IvyIcons.FolderOpen,
139139
children: [
140140
{ value: 'accepted', info: 'STRING', icon: IvyIcons.ChangeType, children: [], cmsValues: { de: 'akzeptiert', en: 'accepted' } },
141-
{ value: 'deslined', info: 'STRING', icon: IvyIcons.ChangeType, children: [], cmsValues: { de: 'abgelehnt', en: 'deslined' } }
141+
{ value: 'declined', info: 'STRING', icon: IvyIcons.ChangeType, children: [], cmsValues: { de: 'abgelehnt', en: 'declined' } },
142+
{ value: 'pending', info: 'STRING', icon: IvyIcons.ChangeType, children: [], cmsValues: { de: 'ausstehend', en: 'pending' } },
143+
{ value: 'processed', info: 'STRING', icon: IvyIcons.ChangeType, children: [], cmsValues: { de: 'bearbeitet', en: 'processed' } },
144+
{ value: 'rejected', info: 'STRING', icon: IvyIcons.ChangeType, children: [], cmsValues: { de: 'zurück', en: 'rejected' } },
145+
{ value: 'confirmed', info: 'STRING', icon: IvyIcons.ChangeType, children: [], cmsValues: { de: 'bestätigt', en: 'confirmed' } },
146+
{ value: 'archived', info: 'STRING', icon: IvyIcons.ChangeType, children: [], cmsValues: { de: 'archiviert', en: 'archived' } },
147+
{ value: 'draft', info: 'STRING', icon: IvyIcons.ChangeType, children: [], cmsValues: { de: 'Entwurf', en: 'draft' } }
142148
],
143149
cmsValues: {}
144150
},

0 commit comments

Comments
 (0)