From 0d781ab45d6358a2beabf97dabb6d7de3da90c5e Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Tue, 1 Apr 2025 01:51:37 +0200 Subject: [PATCH 1/3] Add sticky rows and max height to Table component --- v2/pink-sb/src/lib/table/Cell.svelte | 8 +-- v2/pink-sb/src/lib/table/Root.svelte | 22 ++++-- v2/pink-sb/src/lib/table/index.ts | 3 + v2/pink-sb/src/lib/table/row/Base.svelte | 12 +++- v2/pink-sb/src/lib/table/row/index.ts | 1 + v2/pink-sb/src/stories/Table.stories.svelte | 75 +++++++++++++++++++++ 6 files changed, 110 insertions(+), 11 deletions(-) diff --git a/v2/pink-sb/src/lib/table/Cell.svelte b/v2/pink-sb/src/lib/table/Cell.svelte index 58a312df23..479541c849 100644 --- a/v2/pink-sb/src/lib/table/Cell.svelte +++ b/v2/pink-sb/src/lib/table/Cell.svelte @@ -19,6 +19,7 @@ class:vertical-end={isVerticalEnd} class:horizontal-start={isHorizontalStart} class:horizontal-end={isHorizontalEnd} + style:--cell-height={root.cellHeight} > @@ -26,13 +27,12 @@ diff --git a/v2/pink-sb/src/lib/table/row/index.ts b/v2/pink-sb/src/lib/table/row/index.ts index 82a031ce2d..ff9b584c23 100644 --- a/v2/pink-sb/src/lib/table/row/index.ts +++ b/v2/pink-sb/src/lib/table/row/index.ts @@ -5,6 +5,7 @@ import Link from './Link.svelte'; export type RowBaseProps = { id?: string; + sticky?: boolean | number; root: RootProp; }; diff --git a/v2/pink-sb/src/stories/Table.stories.svelte b/v2/pink-sb/src/stories/Table.stories.svelte index 9e0ff5d3a5..e16576ef72 100644 --- a/v2/pink-sb/src/stories/Table.stories.svelte +++ b/v2/pink-sb/src/stories/Table.stories.svelte @@ -77,6 +77,81 @@ + + + + Lorem + Ipsum + Dolor + + + Lorem + Ipsum + Dolor + + + Lorem + Ipsum + Dolor + + + Lorem + Ipsum + Dolor + + + Lorem + Ipsum + Dolor + + + Lorem + Ipsum + Dolor + + + Lorem + Ipsum + Dolor + + + Lorem + Ipsum + Dolor + + + Lorem + Ipsum + Dolor + + + Lorem + Ipsum + Dolor + + + Lorem + Ipsum + Dolor + + + Lorem + Ipsum + Dolor + + + Lorem + Ipsum + Dolor + + + Lorem + Ipsum + Dolor + + + + Date: Tue, 1 Apr 2025 01:51:45 +0200 Subject: [PATCH 2/3] Remove sticky prop from Column type definition --- v2/pink-sb/src/lib/table/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/v2/pink-sb/src/lib/table/index.ts b/v2/pink-sb/src/lib/table/index.ts index 4814fd1501..f005d86236 100644 --- a/v2/pink-sb/src/lib/table/index.ts +++ b/v2/pink-sb/src/lib/table/index.ts @@ -14,7 +14,6 @@ export type Column = { } | number; hide?: boolean; - sticky?: boolean; }; export type RootProp = { From ae61d4aa8163161f6eee9b5d4437b52aa54a225e Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Tue, 1 Apr 2025 02:13:55 +0200 Subject: [PATCH 3/3] Extract max height and position calculations into functions The changes move row position and max height calculations into separate helper functions for improved readability and maintainability. --- v2/pink-sb/src/lib/table/Root.svelte | 25 +++++++++++---------- v2/pink-sb/src/lib/table/row/Base.svelte | 12 ++++++---- v2/pink-sb/src/stories/Table.stories.svelte | 2 +- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/v2/pink-sb/src/lib/table/Root.svelte b/v2/pink-sb/src/lib/table/Root.svelte index 5777a44b00..05a971f27a 100644 --- a/v2/pink-sb/src/lib/table/Root.svelte +++ b/v2/pink-sb/src/lib/table/Root.svelte @@ -51,13 +51,6 @@ }, {}); } - $: someRowsSelected = - availableIds.size > 0 && - selectedRows.length > 0 && - selectedRows.some((row) => availableIds.has(row)); - $: allRowsSelected = - availableIds.size > 0 && [...availableIds].every((row) => selectedRows.includes(row)); - function toggleAll() { if (allRowsSelected) { selectedRows = selectedRows.filter((row) => !availableIds.has(row)); @@ -86,6 +79,18 @@ availableIds = availableIds; } + function calculateMaxHeight(maxRows: number, cellHeight: string, hasHeader: boolean) { + if (maxRows === Infinity) return undefined; + const totalRows = hasHeader ? maxRows + 1 : maxRows; + return `calc(${totalRows} * ${cellHeight})`; + } + + $: someRowsSelected = + availableIds.size > 0 && + selectedRows.length > 0 && + selectedRows.some((row) => availableIds.has(row)); + $: allRowsSelected = + availableIds.size > 0 && [...availableIds].every((row) => selectedRows.includes(row)); $: root = { allowSelection, selectedRows, @@ -100,11 +105,7 @@ cellHeight, hasHeader: $$slots.header !== undefined } as RootProp; - - $: maxHeight = - maxRows === Infinity - ? undefined - : `calc(${root.hasHeader ? maxRows + 1 : maxRows} * ${cellHeight})`; + $: maxHeight = calculateMaxHeight(maxRows, cellHeight, root.hasHeader);
diff --git a/v2/pink-sb/src/lib/table/row/Base.svelte b/v2/pink-sb/src/lib/table/row/Base.svelte index 1b200eb2ab..c4a49b1420 100644 --- a/v2/pink-sb/src/lib/table/row/Base.svelte +++ b/v2/pink-sb/src/lib/table/row/Base.svelte @@ -18,6 +18,13 @@ if (id) root.toggle(id); } + function calculateTop(sticky: $$Props['sticky'], cellHeight: $$Props['root']['cellHeight']) { + if (sticky !== false && Number.isInteger(sticky)) { + return `calc(${sticky} * ${cellHeight})`; + } + return undefined; + } + onMount(() => { if (id) root.addAvailableId(id); @@ -27,10 +34,7 @@ }); $: selected = id ? root.selectedRows.includes(id) : false; - $: top = - sticky !== false && Number.isInteger(sticky) - ? `calc(${sticky} * ${root.cellHeight})` - : undefined; + $: top = calculateTop(sticky, root.cellHeight);
diff --git a/v2/pink-sb/src/stories/Table.stories.svelte b/v2/pink-sb/src/stories/Table.stories.svelte index e16576ef72..ba7d553a9b 100644 --- a/v2/pink-sb/src/stories/Table.stories.svelte +++ b/v2/pink-sb/src/stories/Table.stories.svelte @@ -78,7 +78,7 @@ - + Lorem Ipsum