@invopop/popui 0.1.4-beta.44 → 0.1.4-beta.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/data-table/column-definitions.js +3 -3
- package/dist/data-table/data-table-toolbar.svelte +1 -1
- package/dist/data-table/data-table-types.d.ts +2 -0
- package/dist/data-table/data-table.svelte +15 -5
- package/dist/table/table-head.svelte +1 -1
- package/dist/table/table-header.svelte +1 -1
- package/package.json +1 -1
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
let { table, filters, frozenColumns, onFreezeColumn, disabled = false }: { table: Table<TData>; filters?: Snippet; frozenColumns: Set<string>; onFreezeColumn: (columnId: string) => void; disabled?: boolean } = $props()
|
|
8
8
|
</script>
|
|
9
9
|
|
|
10
|
-
<div class={clsx('flex items-center justify-between px-4 py-
|
|
10
|
+
<div class={clsx('flex items-center justify-between px-4 py-2.5', {
|
|
11
11
|
'pointer-events-none opacity-30': disabled
|
|
12
12
|
})}>
|
|
13
13
|
{#if filters}
|
|
@@ -78,6 +78,7 @@ export interface DataTableProps<TData> {
|
|
|
78
78
|
initialSortDirection?: TableSortBy;
|
|
79
79
|
initialFrozenColumns?: string[];
|
|
80
80
|
initialColumnOrder?: string[];
|
|
81
|
+
initialColumnVisibility?: Record<string, boolean>;
|
|
81
82
|
pageSizeOptions?: number[];
|
|
82
83
|
emptyState?: Omit<EmptyStateProps, 'children' | 'check'>;
|
|
83
84
|
onRowClick?: (row: TData) => void;
|
|
@@ -96,6 +97,7 @@ export interface DataTableProps<TData> {
|
|
|
96
97
|
onFreezeChange?: (columnId: string) => void;
|
|
97
98
|
onColumnResize?: (columnSizes: Record<string, number>) => void;
|
|
98
99
|
onColumnOrderChange?: (columnOrder: string[]) => void;
|
|
100
|
+
onColumnVisibilityChange?: (visibility: Record<string, boolean>) => void;
|
|
99
101
|
getRowClassName?: (row: TData) => string;
|
|
100
102
|
getRowState?: (row: TData) => {
|
|
101
103
|
isSuccess?: boolean;
|
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
initialSortDirection,
|
|
46
46
|
initialFrozenColumns = [],
|
|
47
47
|
initialColumnOrder = [],
|
|
48
|
+
initialColumnVisibility = {},
|
|
48
49
|
emptyState = {
|
|
49
50
|
iconSource: Search,
|
|
50
51
|
title: 'No results',
|
|
@@ -65,6 +66,7 @@
|
|
|
65
66
|
onFreezeChange,
|
|
66
67
|
onColumnResize,
|
|
67
68
|
onColumnOrderChange,
|
|
69
|
+
onColumnVisibilityChange,
|
|
68
70
|
getRowClassName,
|
|
69
71
|
getRowState,
|
|
70
72
|
children
|
|
@@ -74,7 +76,7 @@
|
|
|
74
76
|
const enablePagination = !disablePagination
|
|
75
77
|
|
|
76
78
|
let rowSelection = $state<RowSelectionState>({})
|
|
77
|
-
let columnVisibility = $state<VisibilityState>(
|
|
79
|
+
let columnVisibility = $state<VisibilityState>(initialColumnVisibility)
|
|
78
80
|
let sorting = $state<SortingState>(
|
|
79
81
|
initialSortColumn && initialSortDirection
|
|
80
82
|
? [{ id: initialSortColumn, desc: initialSortDirection === 'desc' }]
|
|
@@ -151,6 +153,13 @@
|
|
|
151
153
|
}
|
|
152
154
|
})
|
|
153
155
|
|
|
156
|
+
// Track column visibility changes
|
|
157
|
+
$effect(() => {
|
|
158
|
+
if (onColumnVisibilityChange && Object.keys(columnVisibility).length > 0) {
|
|
159
|
+
onColumnVisibilityChange(columnVisibility)
|
|
160
|
+
}
|
|
161
|
+
})
|
|
162
|
+
|
|
154
163
|
const table = setupTable({
|
|
155
164
|
getData: () => data,
|
|
156
165
|
getColumns: () => columns,
|
|
@@ -393,7 +402,7 @@
|
|
|
393
402
|
})}
|
|
394
403
|
<div
|
|
395
404
|
class={cn(
|
|
396
|
-
'absolute inset-0 flex items-center bg-background group-hover/row:bg-background-default-secondary group-data-[state=selected]/row:bg-background-selected group-data-[state=selected]/row:group-hover/row:bg-background-selected group-data-[state=error]/row:bg-background-critical group-data-[state=error]/row:group-hover/row:bg-background-critical group-data-[state=success]/row:bg-background-selected group-data-[state=success]/row:group-hover/row:bg-background-selected group-data-[focused=true]/row:bg-background-default-secondary px-3',
|
|
405
|
+
'absolute inset-0 flex items-center bg-background group-hover/row:bg-background-default-secondary group-data-[state=selected]/row:bg-background-selected group-data-[state=selected]/row:group-hover/row:bg-background-selected group-data-[state=error]/row:bg-background-critical group-data-[state=error]/row:group-hover/row:bg-background-critical group-data-[state=success]/row:bg-background-selected group-data-[state=success]/row:group-hover/row:bg-background-selected group-data-[focused=true]/row:bg-background-default-secondary px-3 shadow-[inset_0_-1px_0_0_var(--color-border)]',
|
|
397
406
|
align === 'right' ? 'justify-end' : '',
|
|
398
407
|
{ 'pl-4': isFirst, 'pr-4': isLast, 'border-r border-border': isFrozen && isLastFrozen }
|
|
399
408
|
)}
|
|
@@ -600,13 +609,14 @@
|
|
|
600
609
|
data-state={dataState}
|
|
601
610
|
data-row-index={rowIndex}
|
|
602
611
|
data-focused={focusedRowIndex === rowIndex ? 'true' : undefined}
|
|
603
|
-
class={cn(clsx('
|
|
612
|
+
class={cn(clsx('shadow-[inset_0_-1px_0_0_var(--color-border)]', {
|
|
604
613
|
'cursor-pointer': onRowClick
|
|
605
614
|
}), getRowClassName?.(row.original as TData))}
|
|
606
615
|
onclick={() => onRowClick?.(row.original as TData)}
|
|
607
616
|
>
|
|
608
617
|
{#each row.getVisibleCells() as cell, index (cell.id)}
|
|
609
618
|
{@const visibleCells = row.getVisibleCells()}
|
|
619
|
+
{@const allCells = row.getAllCells()}
|
|
610
620
|
{@const isLastScrollable = index === visibleCells.length - 2}
|
|
611
621
|
{@const firstDataColumnIndex = visibleCells.findIndex(
|
|
612
622
|
(c) => c.column.id !== 'select' && c.column.id !== 'actions'
|
|
@@ -615,9 +625,9 @@
|
|
|
615
625
|
{@const isFirstCell = index === 0}
|
|
616
626
|
{@const isLastCell = index === visibleCells.length - 1}
|
|
617
627
|
{@const isFrozen = frozenColumns.has(cell.column.id)}
|
|
618
|
-
{@const lastFrozenColumnId =
|
|
628
|
+
{@const lastFrozenColumnId = allCells.map(c => c.column).reverse().find(col => frozenColumns.has(col.id))?.id}
|
|
619
629
|
{@const isLastFrozen = isFrozen && cell.column.id === lastFrozenColumnId}
|
|
620
|
-
{@const frozenOffset = isFrozen ? calculateFrozenOffset(cell.column.id,
|
|
630
|
+
{@const frozenOffset = isFrozen ? calculateFrozenOffset(cell.column.id, allCells.map(c => c.column)) : 0}
|
|
621
631
|
<Table.Cell
|
|
622
632
|
style={getCellStyle(cell, isLastScrollable, isFrozen, frozenOffset)}
|
|
623
633
|
class={getCellClasses(
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
bind:this={ref}
|
|
14
14
|
data-slot="table-head"
|
|
15
15
|
class={cn(
|
|
16
|
-
'text-foreground-default-secondary text-base font-normal text-left align-middle [&:has([role=checkbox])]:p-0 [&:has(button)]:p-0 px-3 bg-background',
|
|
16
|
+
'text-foreground-default-secondary text-base font-normal text-left align-middle [&:has([role=checkbox])]:p-0 [&:has(button)]:p-0 px-3 bg-background shadow-[inset_0_-1px_0_0_var(--color-border)]',
|
|
17
17
|
className
|
|
18
18
|
)}
|
|
19
19
|
{...restProps}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
<thead
|
|
16
16
|
bind:this={ref}
|
|
17
17
|
data-slot="table-header"
|
|
18
|
-
class={cn('sticky top-0 z-20
|
|
18
|
+
class={cn('sticky top-0 z-20 bg-background', className)}
|
|
19
19
|
onclick={bubble('click')}
|
|
20
20
|
onkeydown={bubble('keydown')}
|
|
21
21
|
>
|