From 0d3a795346302ac2b08c1d9f94e06975f2ee321e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A8=D0=B0=D0=B2=D1=80=D0=B8=D0=BD=20=D0=90=D0=BB=D0=B5?= =?UTF-8?q?=D0=BA=D1=81=D0=B5=D0=B9?= Date: Mon, 18 May 2026 15:27:22 +0300 Subject: [PATCH 1/3] fix(Table): do not show parents of pinned columns as not pinned --- src/components/Table/helpers.ts | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/components/Table/helpers.ts b/src/components/Table/helpers.ts index f0547c4..cc9fa31 100644 --- a/src/components/Table/helpers.ts +++ b/src/components/Table/helpers.ts @@ -178,7 +178,6 @@ const transformPinnedColumns = (columns: TableColumn[]) => { const pinnedLeftColumns: TableColumnWidthKey[] = []; const pinnedRightColumns: TableColumnWidthKey[] = []; const otherColumns: TableColumnWidthKey[] = []; - const notPinnedColumns: TableColumnWidthKey[] = []; mapColumns>(columns, (item, index) => { if (!item.columns?.length && item.pinned === 'left') { @@ -189,18 +188,12 @@ const transformPinnedColumns = (columns: TableColumn[]) => { pushByIndex(index, columns, pinnedRightColumns, 'right'); return; } - if (item.columns?.length || item.isSeparator || item.accessor) { + if (!item.columns?.length) { pushByIndex(index, columns, otherColumns); + return; } }); - - mapColumns>(otherColumns, (item) => { - if (item.columns?.length || item.isSeparator || item.accessor) { - pushByKey(item, notPinnedColumns); - } - }); - - return [...pinnedLeftColumns, ...notPinnedColumns, ...pinnedRightColumns]; + return [...pinnedLeftColumns, ...otherColumns, ...pinnedRightColumns]; }; export const transformColumns = ( @@ -415,15 +408,19 @@ export const useHeaderData = ( const flattenedHeadersAtom = useCreateAtom((ctx) => { const headers = ctx.spy(headersAtom); - return headers.flat().map((column, index, array) => ({ + const res = headers.flat().map((column, index, array) => ({ ...column, position: { ...column.position, isFirst: getIsFirst(array, column), width: column.width || 'auto', }, + })) as Header[]; + console.warn("flatten ", res); + return res }); + const flattenedHeadersLengthAtom = useCreateAtom( (ctx) => ctx.spy(flattenedHeadersAtom).length, From 626e1252b412c9c27c80212dffc9a96a07bf7e79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A8=D0=B0=D0=B2=D1=80=D0=B8=D0=BD=20=D0=90=D0=BB=D0=B5?= =?UTF-8?q?=D0=BA=D1=81=D0=B5=D0=B9?= Date: Mon, 18 May 2026 17:46:35 +0300 Subject: [PATCH 2/3] fix(Table): show border between child columns for first left pinned column --- src/components/Table/helpers.ts | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/src/components/Table/helpers.ts b/src/components/Table/helpers.ts index cc9fa31..c942f73 100644 --- a/src/components/Table/helpers.ts +++ b/src/components/Table/helpers.ts @@ -228,6 +228,7 @@ export const transformColumns = ( topHeaderGridIndex, gridIndex, level, + isFirst: gridIndex === 0, }, }; @@ -280,19 +281,6 @@ export const getMaxLevel = (columns: TableColumn[]) => { return count; }; -const getIsFirst = (columns: Header[], column: Header): boolean => { - // TODO: нужно проверить с renderCell - const { colId, parentId, position, accessor } = column; - if (position.level === 0) { - return colId === 0; - } - const parent = columns.find((el) => el.colId === parentId); - return !!( - parent?.columns?.[0]?.accessor === accessor && - (parent ? getIsFirst(columns, parent) : false) - ); -}; - export type HeaderData = { headersAtom: AtomMut[][]>; flattenedHeadersAtom: AtomMut[]>; @@ -412,7 +400,6 @@ export const useHeaderData = ( ...column, position: { ...column.position, - isFirst: getIsFirst(array, column), width: column.width || 'auto', }, From 245818bca843db1949d47d164486ffe21c426431 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A8=D0=B0=D0=B2=D1=80=D0=B8=D0=BD=20=D0=90=D0=BB=D0=B5?= =?UTF-8?q?=D0=BA=D1=81=D0=B5=D0=B9?= Date: Wed, 20 May 2026 09:29:03 +0300 Subject: [PATCH 3/3] fix(Table): right border --- src/components/Table/helpers.ts | 23 +++++++++++++++-------- src/components/Table/types.ts | 1 + 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/components/Table/helpers.ts b/src/components/Table/helpers.ts index c942f73..69a1c67 100644 --- a/src/components/Table/helpers.ts +++ b/src/components/Table/helpers.ts @@ -200,7 +200,7 @@ export const transformColumns = ( columns: TableColumn[], maxLevel: number, ): Array>[] => { - const stack = [{ columns, index: 0 }]; + const stack = [{ columns, index: 0, parentIsFirst: true, parentIsLastPinnedLeft: false}]; const headersArr: Array>[] = []; let col = 0; @@ -208,7 +208,6 @@ export const transformColumns = ( const level = stack.length - 1; const node = stack[level]; const item = node.columns[node.index] as Header; - if (item) { if (!headersArr[level]) headersArr[level] = []; const topHeaderGridIndex = stack[0].index; @@ -217,7 +216,15 @@ export const transformColumns = ( ? prevItem.position.gridIndex + (prevItem.position.colSpan || 1) : 0; const mainId = level === 0 ? col++ : item.colId ?? 0; - + const isFirst = gridIndex === 0 && node.parentIsFirst; + let isLastPinnedLeft = false; + if (level === 0) { + const nextItem = node.columns[node.index + 1]; + isLastPinnedLeft = item.pinned === 'left' && nextItem && nextItem.pinned !== 'left'; + } else { + const isLastChild = node.index === node.columns.length - 1; + isLastPinnedLeft = node.parentIsLastPinnedLeft && isLastChild; + } const handledItem: Header & { position: Position; colId?: number; @@ -228,7 +235,8 @@ export const transformColumns = ( topHeaderGridIndex, gridIndex, level, - isFirst: gridIndex === 0, + isFirst, + isLastPinnedLeft, }, }; @@ -253,6 +261,8 @@ export const transformColumns = ( parentId: mainId, })), index: 0, + parentIsFirst: isFirst, + parentIsLastPinnedLeft: isLastPinnedLeft, }); } } else { @@ -404,7 +414,6 @@ export const useHeaderData = ( }, })) as Header[]; - console.warn("flatten ", res); return res }); @@ -523,15 +532,13 @@ export const useHeaderData = ( ); const lowIndex = lowHeaders.findIndex((col) => col.key === prevLowKey); - return [ !flattenedHeadersColumn.position.isFirst && !( flattenedHeadersColumn.pinned !== 'left' && lowHeaders[lowIndex - 1]?.pinned === 'left' ), - flattenedHeadersColumn.pinned === 'left' && - flattenedHeaders[index + 1]?.pinned !== 'left', + flattenedHeadersColumn.position.isLastPinnedLeft, flattenedHeadersColumn.position.level !== 0, ]; }) as [boolean, boolean, boolean][]; diff --git a/src/components/Table/types.ts b/src/components/Table/types.ts index 5b82bc2..d7523c3 100644 --- a/src/components/Table/types.ts +++ b/src/components/Table/types.ts @@ -62,6 +62,7 @@ export type Position = { level: number; gridIndex: number; isFirst?: boolean; + isLastPinnedLeft?: boolean; topHeaderGridIndex: number; smallTextSize?: boolean; height?: number;