diff --git a/src/uix/soma/components/table/table-core.svelte.test.ts b/src/uix/soma/components/table/table-core.svelte.test.ts index 98828642a..d84569af5 100644 --- a/src/uix/soma/components/table/table-core.svelte.test.ts +++ b/src/uix/soma/components/table/table-core.svelte.test.ts @@ -123,6 +123,40 @@ describe('createTable', () => { } }); + it('resets pagination when filters are removed or cleared', () => { + const { table, cleanup } = withTable({ + data: () => people, + columns, + getRowId: (row) => row.id, + filtering: { enabled: true }, + pagination: { enabled: true, pageSize: 1 } + }); + + try { + table.setColumnFilter('status', 'active'); + flushSync(); + table.setPageIndex(1); + flushSync(); + expect(table.pagination.pageIndex).toBe(1); + + table.removeColumnFilter('status'); + flushSync(); + expect(table.pagination.pageIndex).toBe(0); + + table.setGlobalFilter('a'); + flushSync(); + table.setPageIndex(1); + flushSync(); + expect(table.pagination.pageIndex).toBe(1); + + table.clearFilters(); + flushSync(); + expect(table.pagination.pageIndex).toBe(0); + } finally { + cleanup(); + } + }); + it('paginates and clamps page navigation', () => { const { table, cleanup } = withTable({ data: () => people, @@ -209,12 +243,13 @@ describe('createTable', () => { data: () => people, columns, getRowId: (row) => row.id, - initialColumnPinning: { left: ['name'], right: ['age'] } + initialColumnPinning: { left: ['name', 'status'], right: ['age'] } }); try { expect(table.headers.map((header) => header.id)).toEqual(['name', 'status', 'score', 'age']); expect(table.getPinnedOffset('name')).toBe(0); + expect(table.getIsColumnPinned('status')).toBe(false); table.pinColumn('status', 'left'); flushSync(); diff --git a/src/uix/soma/components/table/table-core.svelte.ts b/src/uix/soma/components/table/table-core.svelte.ts index bb556f34d..7d20315cf 100644 --- a/src/uix/soma/components/table/table-core.svelte.ts +++ b/src/uix/soma/components/table/table-core.svelte.ts @@ -545,6 +545,12 @@ export function createTable(config: TableConfig): TableInstance f.id === columnId); if (existing >= 0) { @@ -553,25 +559,19 @@ export function createTable(config: TableConfig): TableInstance f.id !== columnId); config.onColumnFiltersChange?.(columnFilters); + resetPageForDataChange(); } function setGlobalFilter(value: string) { globalFilter = value; config.onGlobalFilterChange?.(value); - if (config.pagination?.enabled) { - pagination = { ...pagination, pageIndex: 0 }; - config.onPaginationChange?.(pagination); - } + resetPageForDataChange(); } function clearFilters() { @@ -579,6 +579,7 @@ export function createTable(config: TableConfig): TableInstance(config: TableConfig): TableInstance c.id === columnId)?.def.enablePinning === true; + } + function pinColumn(columnId: string, position: ColumnPinningPosition) { - const col = resolvedColumns.find((c) => c.id === columnId); - if (!col || col.def.enablePinning !== true) return; + if (!getCanPin(columnId)) return; const left = (columnPinning.left ?? []).filter((id) => id !== columnId); const right = (columnPinning.right ?? []).filter((id) => id !== columnId); if (position === 'left') { @@ -770,6 +774,7 @@ export function createTable(config: TableConfig): TableInstance(config: TableConfig): TableInstance[] { return (columnPinning.left ?? []) .map((id) => resolvedColumns.find((c) => c.id === id)) - .filter((c): c is ResolvedColumn => !!c && getIsColumnVisible(c.id)); + .filter( + (c): c is ResolvedColumn => !!c && getCanPin(c.id) && getIsColumnVisible(c.id) + ); } function getRightPinnedColumns(): ResolvedColumn[] { return (columnPinning.right ?? []) .map((id) => resolvedColumns.find((c) => c.id === id)) - .filter((c): c is ResolvedColumn => !!c && getIsColumnVisible(c.id)); + .filter( + (c): c is ResolvedColumn => !!c && getCanPin(c.id) && getIsColumnVisible(c.id) + ); } function getCenterColumns(): ResolvedColumn[] { - const pinned = new Set([...(columnPinning.left ?? []), ...(columnPinning.right ?? [])]); + const pinned = new Set( + [...(columnPinning.left ?? []), ...(columnPinning.right ?? [])].filter((id) => getCanPin(id)) + ); return getVisibleColumns().filter((c) => !pinned.has(c.id)); }