compote-ui 0.79.2 → 0.81.0
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/components/data-table-v9/column-filter-editing.svelte.d.ts +41 -0
- package/dist/components/data-table-v9/column-filter-editing.svelte.js +88 -0
- package/dist/components/data-table-v9/column-filter-kind.d.ts +19 -0
- package/dist/components/data-table-v9/column-filter-kind.js +32 -0
- package/dist/components/data-table-v9/create-table.svelte.js +37 -25
- package/dist/components/data-table-v9/data-table-head.svelte +32 -3
- package/dist/components/data-table-v9/data-table-head.svelte.d.ts +2 -0
- package/dist/components/data-table-v9/data-table-utils.d.ts +7 -0
- package/dist/components/data-table-v9/data-table-utils.js +4 -0
- package/dist/components/data-table-v9/data-table.svelte +4 -1
- package/dist/components/data-table-v9/data-table.svelte.d.ts +2 -0
- package/dist/components/data-table-v9/date-cell.d.ts +13 -0
- package/dist/components/data-table-v9/date-cell.js +38 -0
- package/dist/components/data-table-v9/filter-editors/boolean-filter-editor.svelte +45 -0
- package/dist/components/data-table-v9/filter-editors/boolean-filter-editor.svelte.d.ts +7 -0
- package/dist/components/data-table-v9/filter-editors/column-filter-editor.svelte +39 -0
- package/dist/components/data-table-v9/filter-editors/column-filter-editor.svelte.d.ts +35 -0
- package/dist/components/data-table-v9/filter-editors/date-range-filter-editor.svelte +52 -0
- package/dist/components/data-table-v9/filter-editors/date-range-filter-editor.svelte.d.ts +28 -0
- package/dist/components/data-table-v9/filter-editors/range-filter-editor.svelte +51 -0
- package/dist/components/data-table-v9/filter-editors/range-filter-editor.svelte.d.ts +30 -0
- package/dist/components/data-table-v9/filter-editors/select-filter-editor.svelte +59 -0
- package/dist/components/data-table-v9/filter-editors/select-filter-editor.svelte.d.ts +28 -0
- package/dist/components/data-table-v9/filter-editors/text-filter-editor.svelte +20 -0
- package/dist/components/data-table-v9/filter-editors/text-filter-editor.svelte.d.ts +8 -0
- package/dist/components/data-table-v9/header/column-header-filter.svelte +66 -0
- package/dist/components/data-table-v9/header/column-header-filter.svelte.d.ts +30 -0
- package/dist/components/data-table-v9/index.d.ts +9 -1
- package/dist/components/data-table-v9/index.js +7 -0
- package/dist/components/data-table-v9/table-view-state.svelte.d.ts +1 -0
- package/dist/components/data-table-v9/table-view-state.svelte.js +3 -0
- package/dist/components/data-table-v9/toolbar/data-table-column-filter.svelte +13 -269
- package/dist/components/data-table-v9/toolbar/data-table-column-filter.svelte.d.ts +1 -1
- package/dist/components/data-table-v9/types.d.ts +3 -1
- package/dist/components/data-table-v9/virtual/data-table-virtualized.svelte +4 -1
- package/dist/components/data-table-v9/virtual/data-table-virtualized.svelte.d.ts +2 -0
- package/dist/components/data-table-v9/virtual/index.d.ts +2 -2
- package/dist/components/data-table-v9/virtual/index.js +1 -1
- package/dist/components/dialog/alert-dialog.svelte +2 -0
- package/dist/components/dialog/dialog-root.svelte +2 -0
- package/dist/components/drawer/drawer-content.svelte +2 -0
- package/dist/components/popover/popover-content.svelte +29 -3
- package/dist/components/popover/popover-content.svelte.d.ts +2 -1
- package/dist/components/popover/popover-description.svelte +4 -0
- package/dist/components/popover/popover-labels.svelte.d.ts +18 -0
- package/dist/components/popover/popover-labels.svelte.js +35 -0
- package/dist/components/popover/popover-root.svelte +3 -0
- package/dist/components/popover/popover-title.svelte +4 -0
- package/dist/icons/PhFunnelFill.svelte +19 -0
- package/dist/icons/PhFunnelFill.svelte.d.ts +5 -0
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.js +1 -0
- package/dist/utils/date-filter.d.ts +31 -0
- package/dist/utils/date-filter.js +58 -0
- package/dist/utils/date.d.ts +19 -1
- package/dist/utils/date.js +48 -1
- package/dist/utils/release-focus-on-exit.d.ts +22 -0
- package/dist/utils/release-focus-on-exit.js +26 -0
- package/package.json +1 -1
- package/skills/component-usage/references/overlays-and-floating-ui.md +7 -2
- package/skills/data-table/SKILL.md +80 -1
- package/skills/data-table/references/column-options.md +25 -0
- package/skills/data-table/references/table-state-and-reactivity.md +13 -8
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<script lang="ts" generics="T extends RowData">
|
|
2
|
+
import type { Column, RowData } from '@tanstack/svelte-table';
|
|
3
|
+
import DatePicker from '../../date-picker/date-picker.svelte';
|
|
4
|
+
import type { DataTableFeatures } from '../features';
|
|
5
|
+
import { getColumnMeta } from '../data-table-utils';
|
|
6
|
+
import { dateCellTimeZone } from '../date-cell';
|
|
7
|
+
import type { DateRangeFilterValue } from '../../../utils/date-filter';
|
|
8
|
+
|
|
9
|
+
type Props = {
|
|
10
|
+
column: Column<DataTableFeatures, T, unknown>;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
let { column }: Props = $props();
|
|
14
|
+
|
|
15
|
+
const meta = $derived(getColumnMeta(column.columnDef));
|
|
16
|
+
// Pick days in the zone the column is shown and filtered in, so "today" matches the cells.
|
|
17
|
+
const timeZone = $derived(
|
|
18
|
+
dateCellTimeZone(meta?.formatOptions as Intl.DateTimeFormatOptions | undefined)
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
function bound(index: 0 | 1): string | null {
|
|
22
|
+
const value = column.getFilterValue();
|
|
23
|
+
const bound = Array.isArray(value) ? value[index] : undefined;
|
|
24
|
+
return typeof bound === 'string' ? bound : null;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Each picked bound applies at once. The picker emits `YYYY-MM-DD` for a day it accepted
|
|
28
|
+
// and null when cleared; a half-typed date never reaches here.
|
|
29
|
+
function setBound(index: 0 | 1, next: unknown) {
|
|
30
|
+
const value = column.getFilterValue();
|
|
31
|
+
const range: DateRangeFilterValue = Array.isArray(value)
|
|
32
|
+
? [value[0] as string | undefined, value[1] as string | undefined]
|
|
33
|
+
: [undefined, undefined];
|
|
34
|
+
range[index] = typeof next === 'string' && next ? next : undefined;
|
|
35
|
+
column.setFilterValue(range[0] || range[1] ? range : undefined);
|
|
36
|
+
}
|
|
37
|
+
</script>
|
|
38
|
+
|
|
39
|
+
<div class="flex flex-col gap-2">
|
|
40
|
+
<DatePicker
|
|
41
|
+
label="From"
|
|
42
|
+
locale={meta?.formatLocale}
|
|
43
|
+
{timeZone}
|
|
44
|
+
bind:value={() => bound(0), (next) => setBound(0, next)}
|
|
45
|
+
/>
|
|
46
|
+
<DatePicker
|
|
47
|
+
label="To"
|
|
48
|
+
locale={meta?.formatLocale}
|
|
49
|
+
{timeZone}
|
|
50
|
+
bind:value={() => bound(1), (next) => setBound(1, next)}
|
|
51
|
+
/>
|
|
52
|
+
</div>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Column, RowData } from '@tanstack/svelte-table';
|
|
2
|
+
import type { DataTableFeatures } from '../features';
|
|
3
|
+
declare function $$render<T extends RowData>(): {
|
|
4
|
+
props: {
|
|
5
|
+
column: Column<DataTableFeatures, T, unknown>;
|
|
6
|
+
};
|
|
7
|
+
exports: {};
|
|
8
|
+
bindings: "";
|
|
9
|
+
slots: {};
|
|
10
|
+
events: {};
|
|
11
|
+
};
|
|
12
|
+
declare class __sveltets_Render<T extends RowData> {
|
|
13
|
+
props(): ReturnType<typeof $$render<T>>['props'];
|
|
14
|
+
events(): ReturnType<typeof $$render<T>>['events'];
|
|
15
|
+
slots(): ReturnType<typeof $$render<T>>['slots'];
|
|
16
|
+
bindings(): "";
|
|
17
|
+
exports(): {};
|
|
18
|
+
}
|
|
19
|
+
interface $$IsomorphicComponent {
|
|
20
|
+
new <T extends RowData>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
|
|
21
|
+
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
22
|
+
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
23
|
+
<T extends RowData>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
24
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
25
|
+
}
|
|
26
|
+
declare const DateRangeFilterEditor: $$IsomorphicComponent;
|
|
27
|
+
type DateRangeFilterEditor<T extends RowData> = InstanceType<typeof DateRangeFilterEditor<T>>;
|
|
28
|
+
export default DateRangeFilterEditor;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<script lang="ts" generics="T extends RowData">
|
|
2
|
+
import type { Column, RowData } from '@tanstack/svelte-table';
|
|
3
|
+
import NumberInput from '../../number-input/number-input.svelte';
|
|
4
|
+
import type { DataTableFeatures } from '../features';
|
|
5
|
+
import { getColumnMeta } from '../data-table-utils';
|
|
6
|
+
import type { ColumnFilterEditing } from '../column-filter-editing.svelte';
|
|
7
|
+
|
|
8
|
+
type Props = {
|
|
9
|
+
column: Column<DataTableFeatures, T, unknown>;
|
|
10
|
+
editing: ColumnFilterEditing;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
let { column, editing }: Props = $props();
|
|
14
|
+
|
|
15
|
+
const facetBounds = $derived.by((): [number | undefined, number | undefined] => {
|
|
16
|
+
const vals = column.getFacetedMinMaxValues();
|
|
17
|
+
return vals ? [vals[0] as number, vals[1] as number] : [undefined, undefined];
|
|
18
|
+
});
|
|
19
|
+
const formatOptions = $derived(
|
|
20
|
+
getColumnMeta(column.columnDef)?.formatOptions as Intl.NumberFormatOptions | undefined
|
|
21
|
+
);
|
|
22
|
+
</script>
|
|
23
|
+
|
|
24
|
+
<div class="flex flex-col gap-1.5">
|
|
25
|
+
<div class="min-w-0 flex-1">
|
|
26
|
+
<NumberInput
|
|
27
|
+
layout="horizontal"
|
|
28
|
+
label="From"
|
|
29
|
+
bind:value={
|
|
30
|
+
() => editing.rangeBound(column, 'min'),
|
|
31
|
+
(bound) => editing.editRange(column, 'min', bound ?? null)
|
|
32
|
+
}
|
|
33
|
+
min={facetBounds[0]}
|
|
34
|
+
max={facetBounds[1]}
|
|
35
|
+
{formatOptions}
|
|
36
|
+
/>
|
|
37
|
+
</div>
|
|
38
|
+
<div class="min-w-0 flex-1">
|
|
39
|
+
<NumberInput
|
|
40
|
+
layout="horizontal"
|
|
41
|
+
label="To"
|
|
42
|
+
bind:value={
|
|
43
|
+
() => editing.rangeBound(column, 'max'),
|
|
44
|
+
(bound) => editing.editRange(column, 'max', bound ?? null)
|
|
45
|
+
}
|
|
46
|
+
min={facetBounds[0]}
|
|
47
|
+
max={facetBounds[1]}
|
|
48
|
+
{formatOptions}
|
|
49
|
+
/>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Column, RowData } from '@tanstack/svelte-table';
|
|
2
|
+
import type { DataTableFeatures } from '../features';
|
|
3
|
+
import type { ColumnFilterEditing } from '../column-filter-editing.svelte';
|
|
4
|
+
declare function $$render<T extends RowData>(): {
|
|
5
|
+
props: {
|
|
6
|
+
column: Column<DataTableFeatures, T, unknown>;
|
|
7
|
+
editing: ColumnFilterEditing;
|
|
8
|
+
};
|
|
9
|
+
exports: {};
|
|
10
|
+
bindings: "";
|
|
11
|
+
slots: {};
|
|
12
|
+
events: {};
|
|
13
|
+
};
|
|
14
|
+
declare class __sveltets_Render<T extends RowData> {
|
|
15
|
+
props(): ReturnType<typeof $$render<T>>['props'];
|
|
16
|
+
events(): ReturnType<typeof $$render<T>>['events'];
|
|
17
|
+
slots(): ReturnType<typeof $$render<T>>['slots'];
|
|
18
|
+
bindings(): "";
|
|
19
|
+
exports(): {};
|
|
20
|
+
}
|
|
21
|
+
interface $$IsomorphicComponent {
|
|
22
|
+
new <T extends RowData>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
|
|
23
|
+
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
24
|
+
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
25
|
+
<T extends RowData>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
26
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
27
|
+
}
|
|
28
|
+
declare const RangeFilterEditor: $$IsomorphicComponent;
|
|
29
|
+
type RangeFilterEditor<T extends RowData> = InstanceType<typeof RangeFilterEditor<T>>;
|
|
30
|
+
export default RangeFilterEditor;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<script lang="ts" generics="T extends RowData">
|
|
2
|
+
import type { Column, RowData } from '@tanstack/svelte-table';
|
|
3
|
+
import * as Field from '../../field';
|
|
4
|
+
import * as ScrollArea from '../../scroll-area';
|
|
5
|
+
import Checkbox from '../../checkbox/checkbox.svelte';
|
|
6
|
+
import type { DataTableFeatures } from '../features';
|
|
7
|
+
import { selectFilterOptions, type SelectFilterValue } from '../../../utils/select-filter';
|
|
8
|
+
|
|
9
|
+
type Props = {
|
|
10
|
+
column: Column<DataTableFeatures, T, unknown>;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
let { column }: Props = $props();
|
|
14
|
+
|
|
15
|
+
let search = $state('');
|
|
16
|
+
|
|
17
|
+
const allOptions = $derived(selectFilterOptions(column.getFacetedUniqueValues()));
|
|
18
|
+
const options = $derived(
|
|
19
|
+
search
|
|
20
|
+
? allOptions.filter((o) => o.label.toLowerCase().includes(search.toLowerCase()))
|
|
21
|
+
: allOptions
|
|
22
|
+
);
|
|
23
|
+
const selected = $derived((column.getFilterValue() as SelectFilterValue[] | undefined) ?? []);
|
|
24
|
+
|
|
25
|
+
function toggle(value: SelectFilterValue, checked: boolean) {
|
|
26
|
+
const next = checked ? [...selected, value] : selected.filter((v) => v !== value);
|
|
27
|
+
column.setFilterValue(next.length ? next : undefined);
|
|
28
|
+
}
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<div class="flex flex-col gap-1">
|
|
32
|
+
<Field.Root hideMessageLine>
|
|
33
|
+
<Field.Input placeholder="Search..." bind:value={search} />
|
|
34
|
+
</Field.Root>
|
|
35
|
+
<ScrollArea.Root>
|
|
36
|
+
<ScrollArea.Viewport class="max-h-40">
|
|
37
|
+
<ScrollArea.Content>
|
|
38
|
+
<div class="flex flex-col gap-0.5">
|
|
39
|
+
{#each options as option (option.value)}
|
|
40
|
+
<div class="flex min-h-7 items-center gap-2 rounded-sm pr-2 hover:bg-surface-2">
|
|
41
|
+
<Checkbox
|
|
42
|
+
size="sm"
|
|
43
|
+
label={option.label}
|
|
44
|
+
class="min-h-7 flex-1 px-2"
|
|
45
|
+
checked={selected.includes(option.value)}
|
|
46
|
+
onCheckedChange={({ checked }) => toggle(option.value, checked === true)}
|
|
47
|
+
/>
|
|
48
|
+
<span class="text-xs text-ink-dim tabular-nums">{option.count}</span>
|
|
49
|
+
</div>
|
|
50
|
+
{/each}
|
|
51
|
+
</div>
|
|
52
|
+
</ScrollArea.Content>
|
|
53
|
+
</ScrollArea.Viewport>
|
|
54
|
+
<ScrollArea.Scrollbar orientation="vertical">
|
|
55
|
+
<ScrollArea.Thumb />
|
|
56
|
+
</ScrollArea.Scrollbar>
|
|
57
|
+
<ScrollArea.Corner />
|
|
58
|
+
</ScrollArea.Root>
|
|
59
|
+
</div>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Column, RowData } from '@tanstack/svelte-table';
|
|
2
|
+
import type { DataTableFeatures } from '../features';
|
|
3
|
+
declare function $$render<T extends RowData>(): {
|
|
4
|
+
props: {
|
|
5
|
+
column: Column<DataTableFeatures, T, unknown>;
|
|
6
|
+
};
|
|
7
|
+
exports: {};
|
|
8
|
+
bindings: "";
|
|
9
|
+
slots: {};
|
|
10
|
+
events: {};
|
|
11
|
+
};
|
|
12
|
+
declare class __sveltets_Render<T extends RowData> {
|
|
13
|
+
props(): ReturnType<typeof $$render<T>>['props'];
|
|
14
|
+
events(): ReturnType<typeof $$render<T>>['events'];
|
|
15
|
+
slots(): ReturnType<typeof $$render<T>>['slots'];
|
|
16
|
+
bindings(): "";
|
|
17
|
+
exports(): {};
|
|
18
|
+
}
|
|
19
|
+
interface $$IsomorphicComponent {
|
|
20
|
+
new <T extends RowData>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
|
|
21
|
+
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
22
|
+
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
23
|
+
<T extends RowData>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
24
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
25
|
+
}
|
|
26
|
+
declare const SelectFilterEditor: $$IsomorphicComponent;
|
|
27
|
+
type SelectFilterEditor<T extends RowData> = InstanceType<typeof SelectFilterEditor<T>>;
|
|
28
|
+
export default SelectFilterEditor;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import * as Field from '../../field';
|
|
3
|
+
import type { ColumnFilterEditing, FilterableColumn } from '../column-filter-editing.svelte';
|
|
4
|
+
|
|
5
|
+
type Props = {
|
|
6
|
+
column: FilterableColumn;
|
|
7
|
+
editing: ColumnFilterEditing;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
let { column, editing }: Props = $props();
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<Field.Root hideMessageLine>
|
|
14
|
+
<Field.Input
|
|
15
|
+
placeholder="Search..."
|
|
16
|
+
bind:value={
|
|
17
|
+
() => editing.textValue(column), (text) => editing.editText(column, String(text ?? ''))
|
|
18
|
+
}
|
|
19
|
+
/>
|
|
20
|
+
</Field.Root>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ColumnFilterEditing, FilterableColumn } from '../column-filter-editing.svelte';
|
|
2
|
+
type Props = {
|
|
3
|
+
column: FilterableColumn;
|
|
4
|
+
editing: ColumnFilterEditing;
|
|
5
|
+
};
|
|
6
|
+
declare const TextFilterEditor: import("svelte").Component<Props, {}, "">;
|
|
7
|
+
type TextFilterEditor = ReturnType<typeof TextFilterEditor>;
|
|
8
|
+
export default TextFilterEditor;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<script lang="ts" generics="T extends RowData">
|
|
2
|
+
import type { Column, RowData } from '@tanstack/svelte-table';
|
|
3
|
+
import * as Popover from '../../popover';
|
|
4
|
+
import { PhFunnel, PhFunnelFill } from '../../../icons';
|
|
5
|
+
import type { DataTableFeatures } from '../features';
|
|
6
|
+
import { cn } from 'tailwind-variants';
|
|
7
|
+
import { getColumnLabel, getColumnMeta, type DataTableInstance } from '../data-table-utils';
|
|
8
|
+
import { ColumnFilterEditing } from '../column-filter-editing.svelte';
|
|
9
|
+
import ColumnFilterEditor from '../filter-editors/column-filter-editor.svelte';
|
|
10
|
+
|
|
11
|
+
type Props = {
|
|
12
|
+
table: DataTableInstance<T>;
|
|
13
|
+
column: Column<DataTableFeatures, T, unknown>;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
let { table, column }: Props = $props();
|
|
17
|
+
|
|
18
|
+
// Pending edits belong to the table: shared with the other filter hosts, and they still
|
|
19
|
+
// commit after this popover closes.
|
|
20
|
+
const editing = new ColumnFilterEditing({ table: () => table });
|
|
21
|
+
|
|
22
|
+
const isFiltered = $derived(
|
|
23
|
+
table.atoms.columnFilters.get().some((filter) => filter.id === column.id)
|
|
24
|
+
);
|
|
25
|
+
const label = $derived(getColumnLabel(column));
|
|
26
|
+
const align = $derived(getColumnMeta(column.columnDef)?.align);
|
|
27
|
+
|
|
28
|
+
function clear() {
|
|
29
|
+
editing.cancel(column.id);
|
|
30
|
+
column.setFilterValue(undefined);
|
|
31
|
+
}
|
|
32
|
+
</script>
|
|
33
|
+
|
|
34
|
+
<Popover.Root positioning={{ placement: 'bottom-start' }}>
|
|
35
|
+
<Popover.Trigger
|
|
36
|
+
aria-label={`Filter ${label}`}
|
|
37
|
+
data-active={isFiltered ? '' : undefined}
|
|
38
|
+
class={cn(
|
|
39
|
+
'inline-flex size-5 shrink-0 items-center justify-center rounded-sm bg-surface-2 text-ink-dim opacity-0 outline-none group-hover/th:opacity-100 hover:bg-surface-3 hover:text-ink focus-visible:opacity-100 focus-visible:ring-2 focus-visible:ring-ring data-[state=open]:opacity-100 pointer-coarse:opacity-100',
|
|
40
|
+
// Floats over the cell's inner edge, opposite the label, so while inactive it never
|
|
41
|
+
// takes width from a narrow column; its background hides label text running under it.
|
|
42
|
+
// Once a filter is set the header cell pads that edge (see data-table-head).
|
|
43
|
+
'absolute top-1/2 -translate-y-1/2',
|
|
44
|
+
align === 'right' ? 'left-1' : 'right-1',
|
|
45
|
+
'data-active:text-primary data-active:opacity-100'
|
|
46
|
+
)}
|
|
47
|
+
>
|
|
48
|
+
{#if isFiltered}
|
|
49
|
+
<PhFunnelFill class="size-3.5" />
|
|
50
|
+
{:else}
|
|
51
|
+
<PhFunnel class="size-3.5" />
|
|
52
|
+
{/if}
|
|
53
|
+
</Popover.Trigger>
|
|
54
|
+
|
|
55
|
+
<Popover.Content class="flex w-64 flex-col gap-3 p-3" showArrow={false}>
|
|
56
|
+
<div class="flex min-h-5 items-center justify-between gap-2">
|
|
57
|
+
<Popover.Title class="truncate text-sm font-medium text-ink">{label}</Popover.Title>
|
|
58
|
+
{#if isFiltered}
|
|
59
|
+
<button type="button" onclick={clear} class="text-xs text-primary hover:underline">
|
|
60
|
+
Clear
|
|
61
|
+
</button>
|
|
62
|
+
{/if}
|
|
63
|
+
</div>
|
|
64
|
+
<ColumnFilterEditor {column} {editing} />
|
|
65
|
+
</Popover.Content>
|
|
66
|
+
</Popover.Root>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Column, RowData } from '@tanstack/svelte-table';
|
|
2
|
+
import type { DataTableFeatures } from '../features';
|
|
3
|
+
import { type DataTableInstance } from '../data-table-utils';
|
|
4
|
+
declare function $$render<T extends RowData>(): {
|
|
5
|
+
props: {
|
|
6
|
+
table: DataTableInstance<T>;
|
|
7
|
+
column: Column<DataTableFeatures, T, unknown>;
|
|
8
|
+
};
|
|
9
|
+
exports: {};
|
|
10
|
+
bindings: "";
|
|
11
|
+
slots: {};
|
|
12
|
+
events: {};
|
|
13
|
+
};
|
|
14
|
+
declare class __sveltets_Render<T extends RowData> {
|
|
15
|
+
props(): ReturnType<typeof $$render<T>>['props'];
|
|
16
|
+
events(): ReturnType<typeof $$render<T>>['events'];
|
|
17
|
+
slots(): ReturnType<typeof $$render<T>>['slots'];
|
|
18
|
+
bindings(): "";
|
|
19
|
+
exports(): {};
|
|
20
|
+
}
|
|
21
|
+
interface $$IsomorphicComponent {
|
|
22
|
+
new <T extends RowData>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
|
|
23
|
+
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
24
|
+
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
25
|
+
<T extends RowData>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
26
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
27
|
+
}
|
|
28
|
+
declare const ColumnHeaderFilter: $$IsomorphicComponent;
|
|
29
|
+
type ColumnHeaderFilter<T extends RowData> = InstanceType<typeof ColumnHeaderFilter<T>>;
|
|
30
|
+
export default ColumnHeaderFilter;
|
|
@@ -8,5 +8,13 @@ export { default as ColumnFilter } from './toolbar/data-table-column-filter.svel
|
|
|
8
8
|
export { default as ColumnVisibility } from './toolbar/data-table-column-visibility.svelte';
|
|
9
9
|
export { default as Search } from './toolbar/data-table-search.svelte';
|
|
10
10
|
export { default as Refresh } from './toolbar/data-table-refresh.svelte';
|
|
11
|
+
export { default as ColumnFilterEditor } from './filter-editors/column-filter-editor.svelte';
|
|
12
|
+
export { ColumnFilterEditing } from './column-filter-editing.svelte';
|
|
13
|
+
export { filterKindFor, getColumnFilterKind } from './column-filter-kind';
|
|
14
|
+
export { getColumnLabel } from './data-table-utils';
|
|
15
|
+
export { EMPTY_SELECT_VALUE, selectFilterOptions } from '../../utils/select-filter';
|
|
11
16
|
export type { CreateDataTableOptions, DataTableInstance } from './create-table.svelte';
|
|
12
|
-
export type {
|
|
17
|
+
export type { ColumnFilterEditingOptions, FilterableColumn } from './column-filter-editing.svelte';
|
|
18
|
+
export type { ColumnFilterKind } from './column-filter-kind';
|
|
19
|
+
export type { SelectFilterOption, SelectFilterValue } from '../../utils/select-filter';
|
|
20
|
+
export type { DataTableAlign, DataTableAccessorFnColumn, DataTableAccessorKeyColumn, DataTableColumn, DataTableColumnBase, DataTableColumnInstance, DataTableColumnOptions, DataTableColumnType, DataTableCellPropsResolver, DataTableCellRenderProps, DataTableGroupColumn, DataTableLeafColumnBase, DataTableLeafColumn } from './types';
|
|
@@ -8,3 +8,10 @@ export { default as ColumnFilter } from './toolbar/data-table-column-filter.svel
|
|
|
8
8
|
export { default as ColumnVisibility } from './toolbar/data-table-column-visibility.svelte';
|
|
9
9
|
export { default as Search } from './toolbar/data-table-search.svelte';
|
|
10
10
|
export { default as Refresh } from './toolbar/data-table-refresh.svelte';
|
|
11
|
+
// Building blocks for filter UI outside the toolbar and header popups (e.g. a facet panel):
|
|
12
|
+
// the same editors, pending-edit handling and select options the Funnel uses.
|
|
13
|
+
export { default as ColumnFilterEditor } from './filter-editors/column-filter-editor.svelte';
|
|
14
|
+
export { ColumnFilterEditing } from './column-filter-editing.svelte';
|
|
15
|
+
export { filterKindFor, getColumnFilterKind } from './column-filter-kind';
|
|
16
|
+
export { getColumnLabel } from './data-table-utils';
|
|
17
|
+
export { EMPTY_SELECT_VALUE, selectFilterOptions } from '../../utils/select-filter';
|
|
@@ -19,6 +19,7 @@ export declare function createTableViewState<T extends RowData>(getTable: () =>
|
|
|
19
19
|
readonly columnVisibility: import("@tanstack/table-core").ColumnVisibilityState;
|
|
20
20
|
readonly rowSelection: import("@tanstack/table-core").RowSelectionState;
|
|
21
21
|
readonly sorting: import("@tanstack/table-core").SortingState;
|
|
22
|
+
readonly columnFilters: import("@tanstack/table-core").ColumnFiltersState;
|
|
22
23
|
readonly rowModel: import("@tanstack/table-core").RowModel<{
|
|
23
24
|
rowSortingFeature: import("@tanstack/table-core").TableFeature;
|
|
24
25
|
rowSelectionFeature: import("@tanstack/table-core").TableFeature;
|