Implement column sorting

This commit is contained in:
Laurent Nguyen 2024-07-11 14:33:55 +02:00
parent 9efbe7d056
commit 4e71e340e3

View File

@ -12,6 +12,7 @@ import {
TableCell, TableCell,
TableCellLayout, TableCellLayout,
TableColumnDefinition, TableColumnDefinition,
TableColumnId,
TableColumnSizingOptions, TableColumnSizingOptions,
TableHeader, TableHeader,
TableHeaderCell, TableHeaderCell,
@ -22,13 +23,17 @@ import {
useTableColumnSizing_unstable, useTableColumnSizing_unstable,
useTableFeatures, useTableFeatures,
useTableSelection, useTableSelection,
useTableSort
} from "@fluentui/react-components"; } from "@fluentui/react-components";
import { import {
ArrowClockwise16Regular, ArrowClockwise16Regular,
ArrowResetRegular,
DeleteRegular, DeleteRegular,
EditRegular, EditRegular,
MoreHorizontalRegular, MoreHorizontalRegular,
TableResizeColumnRegular, TableResizeColumnRegular,
TextSortAscendingRegular,
TextSortDescendingRegular,
} from "@fluentui/react-icons"; } from "@fluentui/react-icons";
import { NormalizedEventKey } from "Common/Constants"; import { NormalizedEventKey } from "Common/Constants";
import { TableColumnSelectionPane } from "Explorer/Panes/TableColumnSelectionPane/TableColumnSelectionPane"; import { TableColumnSelectionPane } from "Explorer/Panes/TableColumnSelectionPane/TableColumnSelectionPane";
@ -99,11 +104,13 @@ export const DocumentsTableComponent: React.FC<IDocumentsTableComponentProps> =
}); });
const [columnSizingOptions, setColumnSizingOptions] = React.useState<TableColumnSizingOptions>(initialSizingOptions); const [columnSizingOptions, setColumnSizingOptions] = React.useState<TableColumnSizingOptions>(initialSizingOptions);
const [sortState, setSortState] = React.useState<{
// This is for the menu to select columns sortDirection: "ascending" | "descending";
// const [columnSearchText, setColumnSearchText] = useState<string>(""); sortColumn: TableColumnId | undefined;
}>({
// const restoreFocusTargetAttribute = useRestoreFocusTarget(); sortDirection: undefined,
sortColumn: undefined,
});
const onColumnResize = React.useCallback( const onColumnResize = React.useCallback(
(_, { columnId, width }) => { (_, { columnId, width }) => {
@ -119,6 +126,8 @@ export const DocumentsTableComponent: React.FC<IDocumentsTableComponentProps> =
[_onColumnResize], [_onColumnResize],
); );
// const restoreFocusTargetAttribute = useRestoreFocusTarget();
// Columns must be a static object and cannot change on re-renders otherwise React will complain about too many refreshes // Columns must be a static object and cannot change on re-renders otherwise React will complain about too many refreshes
const columns: TableColumnDefinition<DocumentsTableComponentItem>[] = useMemo( const columns: TableColumnDefinition<DocumentsTableComponentItem>[] = useMemo(
() => () =>
@ -155,6 +164,9 @@ export const DocumentsTableComponent: React.FC<IDocumentsTableComponentProps> =
<MenuItem key="refresh" icon={<ArrowClockwise16Regular />} onClick={onRefreshTable}> <MenuItem key="refresh" icon={<ArrowClockwise16Regular />} onClick={onRefreshTable}>
Refresh Refresh
</MenuItem> </MenuItem>
<MenuItem icon={<TextSortAscendingRegular />} onClick={(e) => setColumnSort(e, column.id, "ascending")}>Sort ascending</MenuItem>
<MenuItem icon={<TextSortDescendingRegular />} onClick={(e) => setColumnSort(e, column.id, "descending")}>Sort descending</MenuItem>
<MenuItem icon={<ArrowResetRegular />} onClick={(e) => setColumnSort(e, undefined, undefined)}>Reset sorting</MenuItem>
<MenuItem key="editcolumns" icon={<EditRegular />} onClick={openColumnSelectionPane}> <MenuItem key="editcolumns" icon={<EditRegular />} onClick={openColumnSelectionPane}>
Edit columns Edit columns
</MenuItem> </MenuItem>
@ -278,6 +290,7 @@ export const DocumentsTableComponent: React.FC<IDocumentsTableComponentProps> =
columnSizing_unstable: columnSizing, columnSizing_unstable: columnSizing,
tableRef, tableRef,
selection: { allRowsSelected, someRowsSelected, toggleAllRows, toggleRow, isRowSelected }, selection: { allRowsSelected, someRowsSelected, toggleAllRows, toggleRow, isRowSelected },
sort: { getSortDirection, setColumnSort, sort },
} = useTableFeatures( } = useTableFeatures(
{ {
columns, columns,
@ -291,10 +304,19 @@ export const DocumentsTableComponent: React.FC<IDocumentsTableComponentProps> =
// eslint-disable-next-line react/prop-types // eslint-disable-next-line react/prop-types
onSelectionChange: (e, data) => onSelectedRowsChange(data.selectedItems), onSelectionChange: (e, data) => onSelectedRowsChange(data.selectedItems),
}), }),
useTableSort({
sortState,
onSortChange: (e, nextSortState) => setSortState(nextSortState),
}),
], ],
); );
const rows: TableRowData[] = getRows((row) => { const headerSortProps = (columnId: TableColumnId) => ({
// onClick: (e: React.MouseEvent) => toggleColumnSort(e, columnId),
sortDirection: getSortDirection(columnId),
});
const rows: TableRowData[] = sort(getRows((row) => {
const selected = isRowSelected(row.rowId); const selected = isRowSelected(row.rowId);
return { return {
...row, ...row,
@ -308,7 +330,7 @@ export const DocumentsTableComponent: React.FC<IDocumentsTableComponentProps> =
selected, selected,
appearance: selected ? ("brand" as const) : ("none" as const), appearance: selected ? ("brand" as const) : ("none" as const),
}; };
}); }));
const toggleAllKeydown = React.useCallback( const toggleAllKeydown = React.useCallback(
(e: React.KeyboardEvent<HTMLDivElement>) => { (e: React.KeyboardEvent<HTMLDivElement>) => {
@ -357,7 +379,7 @@ export const DocumentsTableComponent: React.FC<IDocumentsTableComponentProps> =
}; };
return ( return (
<Table className="documentsTable" noNativeElements {...tableProps}> <Table className="documentsTable" noNativeElements sortable {...tableProps}>
<TableHeader className="documentsTableHeader"> <TableHeader className="documentsTableHeader">
<TableRow style={{ width: size ? size.width - 15 : "100%" }}> <TableRow style={{ width: size ? size.width - 15 : "100%" }}>
{!isSelectionDisabled && ( {!isSelectionDisabled && (
@ -374,6 +396,7 @@ export const DocumentsTableComponent: React.FC<IDocumentsTableComponentProps> =
className="documentsTableCell" className="documentsTableCell"
key={column.columnId} key={column.columnId}
{...columnSizing.getTableHeaderCellProps(column.columnId)} {...columnSizing.getTableHeaderCellProps(column.columnId)}
{...headerSortProps(column.columnId)}
> >
{column.renderHeaderCell()} {column.renderHeaderCell()}
</TableHeaderCell> </TableHeaderCell>