diff --git a/package.json b/package.json index e6f05186b..2b5aa11bf 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "^2.0.0-RC.1", "@appwrite.io/pink-legacy": "^1.0.3", - "@appwrite.io/pink-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@7f8f433", + "@appwrite.io/pink-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@8057bf6", "@popperjs/core": "^2.11.8", "@sentry/sveltekit": "^8.38.0", "@stripe/stripe-js": "^3.5.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6c63a03db..8702ae4c0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,8 +24,8 @@ importers: specifier: ^1.0.3 version: 1.0.3 '@appwrite.io/pink-svelte': - specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@7f8f433 - version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@7f8f433(svelte@5.25.3) + specifier: https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@8057bf6 + version: https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@8057bf6(svelte@5.25.3) '@popperjs/core': specifier: ^2.11.8 version: 2.11.8 @@ -261,9 +261,8 @@ packages: resolution: {tarball: https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@8836b0c} version: 1.9.0 - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@7f8f43343777058cd7f5801b32e05a6917918d44': - resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@7f8f43343777058cd7f5801b32e05a6917918d44} - version: 2.0.0-RC.1 + '@appwrite.io/pink-icons-svelte@2.0.0-RC.1': + resolution: {integrity: sha512-iLFlV55hj8mGuAbmxJGenxN5RaZMmVT4GJb9dv/MP1xBAtYibFq7JvBcxm18qV2KU8c31Rntf+Ub4GL7HwqTYg==} peerDependencies: svelte: ^4.0.0 @@ -282,8 +281,8 @@ packages: '@appwrite.io/pink-legacy@1.0.3': resolution: {integrity: sha512-GGde5fmPhs+s6/3aFeMPc/kKADG/gTFkYQSy6oBN8pK0y0XNCLrZZgBv+EBbdhwdtqVEWXa0X85Mv9w7jcIlwQ==} - '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@7f8f433': - resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@7f8f433} + '@appwrite.io/pink-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@8057bf6': + resolution: {tarball: https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@8057bf6} version: 2.0.0-RC.2 peerDependencies: svelte: ^4.0.0 @@ -3663,7 +3662,7 @@ snapshots: '@appwrite.io/console@https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@8836b0c': {} - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@7f8f43343777058cd7f5801b32e05a6917918d44(svelte@5.25.3)': + '@appwrite.io/pink-icons-svelte@2.0.0-RC.1(svelte@5.25.3)': dependencies: svelte: 5.25.3 @@ -3680,9 +3679,9 @@ snapshots: '@appwrite.io/pink-icons': 1.0.0 the-new-css-reset: 1.11.3 - '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@7f8f433(svelte@5.25.3)': + '@appwrite.io/pink-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@8057bf6(svelte@5.25.3)': dependencies: - '@appwrite.io/pink-icons-svelte': https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@7f8f43343777058cd7f5801b32e05a6917918d44(svelte@5.25.3) + '@appwrite.io/pink-icons-svelte': 2.0.0-RC.1(svelte@5.25.3) '@floating-ui/dom': 1.6.13 '@melt-ui/pp': 0.3.2(@melt-ui/svelte@0.86.6(svelte@5.25.3))(svelte@5.25.3) '@melt-ui/svelte': 0.86.6(svelte@5.25.3) diff --git a/src/lib/components/columnSelector.svelte b/src/lib/components/columnSelector.svelte index a899fe9e4..ca95b5875 100644 --- a/src/lib/components/columnSelector.svelte +++ b/src/lib/components/columnSelector.svelte @@ -4,23 +4,39 @@ import { preferences } from '$lib/stores/preferences'; import { onMount, type Snippet } from 'svelte'; import type { Column } from '$lib/helpers/types'; - import { ActionMenu, Layout, Popover, Selector } from '@appwrite.io/pink-svelte'; + import { ActionMenu, Divider, Layout, Popover, Selector } from '@appwrite.io/pink-svelte'; + import { Button } from '$lib/elements/forms'; let { columns, isCustomCollection = false, + ui = 'legacy', allowNoColumns = false, children }: { columns: Writable; isCustomCollection?: boolean; allowNoColumns?: boolean; + ui?: 'legacy' | 'new'; children: Snippet<[toggle: () => void, selectedColumnsNumber: number]>; } = $props(); + let search = $state(''); + let filteredColumns = $derived( + $columns + .filter((column) => !column.isAction) + .filter( + (col) => + !col.exclude && + (col.title?.toLowerCase().includes(search.toLowerCase()) || + col.id?.toLowerCase().includes(search.toLowerCase())) + ) + ); + let maxHeight = $state('none'); let containerRef = $state(null); const collectionId = $derived(page.params.collection); + const isNewStyle = ui === 'new'; const calcMaxHeight = () => { if (containerRef) { @@ -78,38 +94,122 @@ function toggleColumn(column: Column) { columns.update((cols) => - cols.map((col) => { - if (col.id === column.id) { - column.hide = !column.hide; - } - return col; - }) + cols.map((col) => (col.id === column.id ? { ...col, hide: !col.hide } : col)) ); - saveColumnPreferences(); } + + function selectAll() { + columns.update((cols) => + cols.map((col) => + col.exclude + ? col + : filteredColumns.some((fc) => fc.id === col.id) + ? { ...col, hide: false } + : col + ) + ); + saveColumnPreferences(); + } + + function deselectAll() { + columns.update((cols) => { + const realColumns = cols.filter((col) => !col.exclude && !col.isAction); + const filtered = filteredColumns.filter((col) => !col.exclude && !col.isAction); + + if (filtered.length === 0) return cols; + + const visibleRealColumns = realColumns.filter((col) => !col.hide); + + if (!allowNoColumns && visibleRealColumns.length <= 1) { + return cols; + } + + const willHideCount = filtered.filter((col) => !col.hide).length; + + if (!allowNoColumns && visibleRealColumns.length - willHideCount < 1) { + const [keep] = filtered; + return cols.map((col) => { + if (col.exclude || col.isAction) return col; + if (!filtered.some((fc) => fc.id === col.id)) return col; + + if (col.id === keep.id) { + const stillVisible = cols + .filter((c) => !c.exclude && !c.isAction) + .filter((c) => + c.id === keep.id + ? true + : filtered.some((fc) => fc.id === c.id) + ? false + : !c.hide + ); + if (stillVisible.length === 1 && typeof col.width === 'number') { + return { ...col, hide: false, width: { min: col.width } }; + } + return { ...col, hide: false }; + } + + return { ...col, hide: true }; + }); + } + + return cols.map((col) => + col.exclude || col.isAction + ? col + : filtered.some((fc) => fc.id === col.id) + ? { ...col, hide: true } + : col + ); + }); + saveColumnPreferences(); + } + + let visibleRealColumns = $derived( + $columns.filter((col) => !col.exclude && !col.isAction && !col.hide) + ); {#if $columns?.length} - + {@const placement = isNewStyle ? undefined : 'bottom-end'} + {@render children(toggle, selectedColumnsNumber)}
- {#each $columns as column} + {#if isNewStyle} + + + + + + +
+ +
+ + +
+
+ {/if} + + {#each filteredColumns as column} {#if !column?.exclude} toggleColumn(column)} disabled={allowNoColumns ? false - : selectedColumnsNumber <= 1 && column.hide !== true}> + : visibleRealColumns.length <= 1 && !column.hide}> - toggleColumn(column)} /> + {column.title} diff --git a/src/lib/components/csvImportBox.svelte b/src/lib/components/csvImportBox.svelte index 60f93abf6..26a70c4c8 100644 --- a/src/lib/components/csvImportBox.svelte +++ b/src/lib/components/csvImportBox.svelte @@ -221,8 +221,7 @@ } .upload-box-content { - min-width: 400px; - max-width: 100vw; + width: 304px; } .upload-box-button { diff --git a/src/lib/components/filters/filters.svelte b/src/lib/components/filters/filters.svelte index f8c9a3e6e..e3ab83871 100644 --- a/src/lib/components/filters/filters.svelte +++ b/src/lib/components/filters/filters.svelte @@ -19,6 +19,7 @@ import { Click, Submit, trackEvent } from '$lib/actions/analytics'; export let query = '[]'; + export let onlyIcon = false; export let columns: Writable; export let disabled = false; export let fullWidthMobile = false; @@ -124,62 +125,73 @@ - -
- - {#if displayQuickFilters} - - {:else} -

Apply filter rules to refine the table view

- (applied = 0)} /> - {/if} -
- {#if quickFilters} - + + + {#if showing} +
+ + {#if displayQuickFilters} + + {:else} +

Apply filter rules to refine the table view

+ + (applied = 0)} /> {/if} -
- {#if singleCondition} - - {:else} - {/if} - +
+ {#if singleCondition} + + {:else} + + {/if} + +
-
- -
+
+
+ {/if}
diff --git a/src/lib/components/sortButton.svelte b/src/lib/components/sortButton.svelte index 11ee9d17d..0b3046561 100644 --- a/src/lib/components/sortButton.svelte +++ b/src/lib/components/sortButton.svelte @@ -12,11 +12,13 @@ let { column, state, - onSort = () => {} + onSort = () => {}, + disabled = false }: { column: string; - onSort: (query: string[]) => void | Promise; - state: Writable<{ column: string | null; direction: SortDirection }>; + disabled?: boolean; + onSort?: (query: string[]) => void | Promise; + state?: Writable<{ column: string | null; direction: SortDirection }>; } = $props(); function sort() { @@ -29,27 +31,27 @@ ? 'default' : 'asc'; - state.set({ + state?.set({ direction: nextDir, column: nextDir === 'default' ? null : column }); if (nextDir === 'default') { - onSort([]); + onSort?.([]); } else if (nextDir === 'asc') { - onSort([Query.orderAsc(column)]); + onSort?.([Query.orderAsc(column)]); } else { - onSort([Query.orderDesc(column)]); + onSort?.([Query.orderDesc(column)]); } } -