From e9a6ec12e0df86169270c2087b19eded8e0fcb51 Mon Sep 17 00:00:00 2001 From: TaPo4eK111291 <71665983+TaPo4eK111291@users.noreply.github.com> Date: Wed, 2 Oct 2024 15:24:18 +0300 Subject: [PATCH] fix(TableSettings): group ordering state initializing (#63) --- .../TableSettings/TableSettings.tsx | 45 +++++++++++++------ .../TableSettings/TableSettings.utils.ts | 27 ++++++++++- 2 files changed, 56 insertions(+), 16 deletions(-) diff --git a/src/components/TableSettings/TableSettings.tsx b/src/components/TableSettings/TableSettings.tsx index 6dbc378..7a4bdfb 100644 --- a/src/components/TableSettings/TableSettings.tsx +++ b/src/components/TableSettings/TableSettings.tsx @@ -64,18 +64,9 @@ export const TableSettings = ({ const [visibilityState, setVisibilityState] = React.useState( () => table.getState().columnVisibility, ); - const [orderState, setOrderState] = React.useState(() => getInitialOrderItems(filteredColumns)); - - const applyNewSettings = () => { - const columnOrder = orderStateToColumnOrder(orderState); - - if (onSettingsApply) onSettingsApply({visibilityState, columnOrder}); - - if (filterable) table.setColumnVisibility(visibilityState); - if (sortable) table.setColumnOrder(columnOrder); - - setOpen(false); - }; + const [orderState, setOrderState] = React.useState(() => + getInitialOrderItems(filteredColumns, table.getState().columnOrder), + ); const sensors = useSensors(useSensor(MouseSensor), useSensor(TouchSensor)); @@ -104,11 +95,37 @@ export const TableSettings = ({ }); }; + const resetSettings = () => { + setVisibilityState(table.getState().columnVisibility); + setOrderState(getInitialOrderItems(filteredColumns, table.getState().columnOrder)); + }; + + const cancelEditing = () => { + setOpen(false); + resetSettings(); + }; + + const togglePopup = () => { + if (open) cancelEditing(); + else setOpen(true); + }; + + const applyNewSettings = () => { + const columnOrder = orderStateToColumnOrder(orderState); + + if (onSettingsApply) onSettingsApply({visibilityState, columnOrder}); + + if (filterable) table.setColumnVisibility(visibilityState); + if (sortable) table.setColumnOrder(columnOrder); + + setOpen(false); + }; + return ( setOpen(false)} + onClose={cancelEditing} anchorRef={anchorRef} placement={POPUP_PLACEMENT} contentClassName={b()} @@ -135,7 +152,7 @@ export const TableSettings = ({ - diff --git a/src/components/TableSettings/TableSettings.utils.ts b/src/components/TableSettings/TableSettings.utils.ts index b842753..f46e319 100644 --- a/src/components/TableSettings/TableSettings.utils.ts +++ b/src/components/TableSettings/TableSettings.utils.ts @@ -98,16 +98,39 @@ export const orderStateToColumnOrder = (state: Record) => { return result; }; -export const getInitialOrderItems = (treeItems: Column[]) => { +export const getInitialOrderItems = ( + treeItems: Column[], + initialOrder: string[], +) => { + const orderMap = initialOrder.reduce>( + (acc, id, index) => ({...acc, [id]: index}), + {}, + ); + const stack = [...treeItems]; const result: Record = {root: treeItems.map(({id}) => id)}; + const parentNodes: string[] = []; while (stack.length) { const item = stack.shift(); if (!item) continue; result[item.id] = item?.columns?.map(({id}) => id) ?? []; - if (item.columns) stack.push(...item.columns); + if (item.columns.length) { + stack.push(...item.columns); + parentNodes.push(item.id); + } } + parentNodes.reverse().forEach((parent) => { + const childs = result[parent]; + const childsOrders = childs.map((id) => orderMap[id] ?? -1); + const minIndex = Math.min(...childsOrders); + orderMap[parent] = minIndex; + }); + + Object.keys(result).forEach((key) => { + result[key] = result[key].sort((a, b) => orderMap[a] - orderMap[b]); + }); + return result; };