From 263e328fe84577344e0d7fbcb9dcb40878619069 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Thu, 27 Jul 2023 15:36:57 +0100 Subject: [PATCH 1/7] basic db selection --- src/lib/elements/forms/inputCheckbox.svelte | 15 +++++--- src/lib/helpers/array.ts | 8 +++++ src/lib/helpers/types.ts | 8 +++++ .../project-[project]/databases/table.svelte | 36 +++++++++++++++++++ .../project-[project]/databases/test.svelte | 5 +++ 5 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 src/routes/console/project-[project]/databases/test.svelte diff --git a/src/lib/elements/forms/inputCheckbox.svelte b/src/lib/elements/forms/inputCheckbox.svelte index b8c601635b..601607e594 100644 --- a/src/lib/elements/forms/inputCheckbox.svelte +++ b/src/lib/elements/forms/inputCheckbox.svelte @@ -1,11 +1,12 @@ - + {#if label} + + {/if}
+ on:invalid={handleInvalid} + on:click />
{#if error} {error} diff --git a/src/lib/helpers/array.ts b/src/lib/helpers/array.ts index a325e33f5c..6690dd1dfc 100644 --- a/src/lib/helpers/array.ts +++ b/src/lib/helpers/array.ts @@ -88,3 +88,11 @@ export function excludeArray( export function includesAll(arr1: T[], arr2: T[]): boolean { return arr2.every((elem) => arr1.includes(elem)); } + +export function toggle(arr: T[], elem: T): T[] { + if (arr.includes(elem)) { + return arr.filter((e) => e !== elem); + } + arr.push(elem); + return arr; +} diff --git a/src/lib/helpers/types.ts b/src/lib/helpers/types.ts index 344bc6af50..322fc6cb3e 100644 --- a/src/lib/helpers/types.ts +++ b/src/lib/helpers/types.ts @@ -4,3 +4,11 @@ export type DeepKeys> = { [K in keyof T]: T[K] extends Record ? `${K}.${DeepKeys}` : K; }[keyof T]; export type WritableValue = T extends Writable ? U : never; + +export function isHTMLElement(el: unknown): el is HTMLElement { + return el instanceof HTMLElement; +} + +export function isHTMLInputElement(el: unknown): el is HTMLInputElement { + return el instanceof HTMLInputElement; +} diff --git a/src/routes/console/project-[project]/databases/table.svelte b/src/routes/console/project-[project]/databases/table.svelte index ac63aa1848..911de6182e 100644 --- a/src/routes/console/project-[project]/databases/table.svelte +++ b/src/routes/console/project-[project]/databases/table.svelte @@ -2,6 +2,7 @@ import { base } from '$app/paths'; import { page } from '$app/stores'; import { Id } from '$lib/components'; + import InputCheckbox from '$lib/elements/forms/inputCheckbox.svelte'; import { TableBody, TableCell, @@ -11,16 +12,32 @@ TableRowLink, TableScroll } from '$lib/elements/table'; + import { toggle } from '$lib/helpers/array'; import { toLocaleDateTime } from '$lib/helpers/date'; + import { isHTMLInputElement } from '$lib/helpers/types'; import type { PageData } from './$types'; import { columns } from './store'; export let data: PageData; const projectId = $page.params.project; + + let selected: string[] = []; + + 0 && selected.length < data.databases.total} + value={selected.length === data.databases.total} + on:click={(e) => { + if (!isHTMLInputElement(e.target)) return; + selected = e.target.checked + ? data.databases.databases.map((database) => database.$id) + : []; + }} /> + {#each $columns as column} {#if column.show} {column.title} @@ -31,6 +48,25 @@ {#each data.databases.databases as database} + + { + // Prevent the link from being followed + e.preventDefault(); + const el = e.currentTarget; + if (!isHTMLInputElement(el)) return; + + selected = toggle(selected, database.$id); + + // Hack to make sure the checkbox is checked, independent of the + // preventDefault() call above + window.setTimeout(() => { + el.checked = selected.includes(database.$id); + }); + }} /> + {#each $columns as column} {#if column.show} {#if column.id === '$id'} diff --git a/src/routes/console/project-[project]/databases/test.svelte b/src/routes/console/project-[project]/databases/test.svelte new file mode 100644 index 0000000000..b0cf3e6c35 --- /dev/null +++ b/src/routes/console/project-[project]/databases/test.svelte @@ -0,0 +1,5 @@ + + + From 92af191e5a3570dfc69ed87b9c0181108c72eade Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Thu, 27 Jul 2023 16:34:25 +0100 Subject: [PATCH 2/7] bulk db deletion --- src/lib/components/floatingActionBar.svelte | 37 ++++++++ src/lib/components/index.ts | 2 +- src/lib/helpers/types.ts | 2 + .../project-[project]/databases/+page.ts | 5 +- .../project-[project]/databases/table.svelte | 84 ++++++++++++++++++- 5 files changed, 126 insertions(+), 4 deletions(-) create mode 100644 src/lib/components/floatingActionBar.svelte diff --git a/src/lib/components/floatingActionBar.svelte b/src/lib/components/floatingActionBar.svelte new file mode 100644 index 0000000000..50ddb0fd8a --- /dev/null +++ b/src/lib/components/floatingActionBar.svelte @@ -0,0 +1,37 @@ + + +{#if show} +
+ +
+{/if} + + diff --git a/src/lib/components/index.ts b/src/lib/components/index.ts index a2ba5ea688..3f59e53a14 100644 --- a/src/lib/components/index.ts +++ b/src/lib/components/index.ts @@ -57,5 +57,5 @@ export { default as ClickableListItem } from './clickableListItem.svelte'; export { default as Id } from './id.svelte'; export { default as EyebrowHeading } from './eyebrowHeading.svelte'; export { default as SvgIcon } from './svgIcon.svelte'; - export { default as MigrationBox } from './migrationBox.svelte'; +export { default as FloatingActionBar } from './floatingActionBar.svelte'; diff --git a/src/lib/helpers/types.ts b/src/lib/helpers/types.ts index 322fc6cb3e..5c5ffec06d 100644 --- a/src/lib/helpers/types.ts +++ b/src/lib/helpers/types.ts @@ -1,6 +1,8 @@ import type { Writable } from 'svelte/store'; +// eslint-disable-next-line @typescript-eslint/no-explicit-any export type DeepKeys> = { + // eslint-disable-next-line @typescript-eslint/no-explicit-any [K in keyof T]: T[K] extends Record ? `${K}.${DeepKeys}` : K; }[keyof T]; export type WritableValue = T extends Writable ? U : never; diff --git a/src/routes/console/project-[project]/databases/+page.ts b/src/routes/console/project-[project]/databases/+page.ts index 2a9e3446a2..477e86419c 100644 --- a/src/routes/console/project-[project]/databases/+page.ts +++ b/src/routes/console/project-[project]/databases/+page.ts @@ -1,10 +1,11 @@ -import { CARD_LIMIT } from '$lib/constants'; +import { CARD_LIMIT, Dependencies } from '$lib/constants'; import { getLimit, getPage, getView, pageToOffset, View } from '$lib/helpers/load'; import { sdk } from '$lib/stores/sdk'; import { Query } from '@appwrite.io/console'; import type { PageLoad } from './$types'; -export const load: PageLoad = async ({ url, route }) => { +export const load: PageLoad = async ({ url, route, depends }) => { + depends(Dependencies.DATABASES); const page = getPage(url); const limit = getLimit(url, route, CARD_LIMIT); const view = getView(url, route, View.Grid); diff --git a/src/routes/console/project-[project]/databases/table.svelte b/src/routes/console/project-[project]/databases/table.svelte index 911de6182e..76bde33b11 100644 --- a/src/routes/console/project-[project]/databases/table.svelte +++ b/src/routes/console/project-[project]/databases/table.svelte @@ -1,7 +1,12 @@ @@ -92,3 +125,52 @@ {/each} + + 0}> +
+
+ {selected.length} + + {selected.length > 1 ? 'databases' : 'database'} selected + +
+ +
+ + +
+
+
+ + + Delete Database +

+ Are you sure you want to delete {selected.length} + {selected.length > 1 ? 'databases' : 'database'}? +

+ + + + +
+ + From 382b473ceb43d3d2b9f57cfbd6d8c90397e41cba Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Thu, 27 Jul 2023 17:06:06 +0100 Subject: [PATCH 3/7] collection deletion --- src/lib/components/floatingActionBar.svelte | 2 +- src/lib/constants.ts | 3 +- .../databases/database-[database]/+page.ts | 5 +- .../database-[database]/table.svelte | 122 +++++++++++++++++- 4 files changed, 127 insertions(+), 5 deletions(-) diff --git a/src/lib/components/floatingActionBar.svelte b/src/lib/components/floatingActionBar.svelte index 50ddb0fd8a..5f25bad40a 100644 --- a/src/lib/components/floatingActionBar.svelte +++ b/src/lib/components/floatingActionBar.svelte @@ -6,7 +6,7 @@ {#if show} -
+
{/if} diff --git a/src/lib/constants.ts b/src/lib/constants.ts index ccdf6c6a09..e2bb2fb6f9 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -34,7 +34,8 @@ export enum Dependencies { DOMAINS = 'dependency:domains', WEBHOOK = 'dependency:webhook', WEBHOOKS = 'dependency:webhooks', - MIGRATIONS = 'dependency:migrations' + MIGRATIONS = 'dependency:migrations', + COLLECTIONS = 'dependency:collections' } export const scopes: { diff --git a/src/routes/console/project-[project]/databases/database-[database]/+page.ts b/src/routes/console/project-[project]/databases/database-[database]/+page.ts index 1a2e91a3b1..dff27da836 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/+page.ts +++ b/src/routes/console/project-[project]/databases/database-[database]/+page.ts @@ -2,9 +2,10 @@ import { Query } from '@appwrite.io/console'; import { sdk } from '$lib/stores/sdk'; import { getLimit, getPage, getView, pageToOffset, View } from '$lib/helpers/load'; import type { PageLoad } from './$types'; -import { CARD_LIMIT } from '$lib/constants'; +import { CARD_LIMIT, Dependencies } from '$lib/constants'; -export const load: PageLoad = async ({ params, url, route }) => { +export const load: PageLoad = async ({ params, url, route, depends }) => { + depends(Dependencies.COLLECTIONS); const page = getPage(url); const limit = getLimit(url, route, CARD_LIMIT); const view = getView(url, route, View.Grid); diff --git a/src/routes/console/project-[project]/databases/database-[database]/table.svelte b/src/routes/console/project-[project]/databases/database-[database]/table.svelte index 458baaa62b..f453cd26ef 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/table.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/table.svelte @@ -1,7 +1,13 @@ + + 0 && selected.length < data.collections.total} + value={selected.length === data.collections.total} + on:click={(e) => { + if (!isHTMLInputElement(e.target)) return; + selected = e.target.checked + ? data.collections.collections.map((database) => database.$id) + : []; + }} /> + {#each $columns as column} {#if column.show} {column.title} @@ -32,6 +84,25 @@ {#each data.collections.collections as collection} + + { + // Prevent the link from being followed + e.preventDefault(); + const el = e.currentTarget; + if (!isHTMLInputElement(el)) return; + + selected = toggle(selected, collection.$id); + + // Hack to make sure the checkbox is checked, independent of the + // preventDefault() call above + window.setTimeout(() => { + el.checked = selected.includes(collection.$id); + }); + }} /> + {#each $columns as column} {#if column.show} {#if column.id === '$id'} @@ -55,3 +126,52 @@ {/each} + + 0}> +
+
+ {selected.length} + + {selected.length > 1 ? 'collections' : 'collection'} selected + +
+ +
+ + +
+
+
+ + + Delete Collections +

+ Are you sure you want to delete {selected.length} + {selected.length > 1 ? 'collections' : 'collection'}? +

+ + + + +
+ + From 8d8d690fe1bd1dac00c6dff53fce8adf18dcc6d9 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Fri, 28 Jul 2023 21:35:59 +0100 Subject: [PATCH 4/7] feat: document bulk deletion --- src/lib/elements/table/tableScroll.svelte | 3 +- .../collection-[collection]/table.svelte | 186 +++++++++++++++++- 2 files changed, 187 insertions(+), 2 deletions(-) diff --git a/src/lib/elements/table/tableScroll.svelte b/src/lib/elements/table/tableScroll.svelte index 814fe00e51..7a4017c0a6 100644 --- a/src/lib/elements/table/tableScroll.svelte +++ b/src/lib/elements/table/tableScroll.svelte @@ -2,6 +2,7 @@ import type { Action } from 'svelte/action'; export let isSticky = false; + export let noMargin = false; const hasOverflow: Action void> = (node, callback) => { const observer = new ResizeObserver((entries) => { @@ -22,7 +23,7 @@ let isOverflowing = false; -
+
(isOverflowing = v)}> diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/table.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/table.svelte index 727be175c9..0ab5070f99 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/table.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/table.svelte @@ -1,5 +1,5 @@ + + 0 && selectedDb.length < data.documents.total} + value={selectedDb.length === data.documents.total} + on:click={(e) => { + if (!isHTMLInputElement(e.target)) return; + selectedDb = e.target.checked + ? data.documents.documents.map((database) => database.$id) + : []; + }} /> + Document ID {#each $columns.filter((n) => n.show) as column} {#if column.show} @@ -96,6 +165,26 @@ {#each data.documents.documents as document} + + { + // Prevent the link from being followed + e.preventDefault(); + const el = e.currentTarget; + if (!isHTMLInputElement(el)) return; + + selectedDb = toggle(selectedDb, document.$id); + + // Hack to make sure the checkbox is checked, independent of the + // preventDefault() call above + window.setTimeout(() => { + el.checked = selectedDb.includes(document.$id); + }); + }} /> + + {document.$id} @@ -165,3 +254,98 @@ + + 0}> +
+
+ {selectedDb.length} + + {selected.length > 1 ? 'documents' : 'document'} selected + +
+ +
+ + +
+
+
+ + + Delete Documents + +
+

+ Are you sure you want to delete {selectedDb.length} + {selectedDb.length > 1 ? 'documents' : 'document'}? +

+ + {#if relAttributes?.length} + + + Relation + Setting + + + + {#each relAttributes as attr} + + + + {#if attr.twoWay} + + {:else} + + {/if} + {attr.key} + + + + {attr.onDelete} + + + {Deletion[attr.onDelete]} + + + {/each} + + +
+ To change the selection edit the relationship settings. + + + Delete document from {$collection.name} + +
+ {:else} +

This action is irreversible.

+ {/if} +
+ + + + + +
+ + From d5e26ca1832f4a06e8609ccf3a781abc0e7bc788 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Mon, 7 Aug 2023 18:24:21 +0100 Subject: [PATCH 5/7] fix multiple selection checkbox --- .../collection-[collection]/table.svelte | 41 ++++++++++++------- .../project-[project]/databases/test.svelte | 5 --- 2 files changed, 26 insertions(+), 20 deletions(-) delete mode 100644 src/routes/console/project-[project]/databases/test.svelte diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/table.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/table.svelte index 0ab5070f99..0af982e7d8 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/table.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/table.svelte @@ -88,14 +88,16 @@ $: selected = preferences.getCustomCollectionColumns($page.params.collection); - $: columns.set( - $collection.attributes.map((attribute) => ({ - id: attribute.key, - title: attribute.key, - type: attribute.type, - show: selected?.includes(attribute.key) ?? true - })) - ); + $: { + columns.set( + $collection.attributes.map((attribute) => ({ + id: attribute.key, + title: attribute.key, + type: attribute.type, + show: selected?.includes(attribute.key) ?? true + })) + ); + } let selectedDb: string[] = []; let showDelete = false; @@ -112,7 +114,7 @@ trackEvent(Submit.DocumentDelete); addNotification({ type: 'success', - message: `${selected.length} document${selected.length > 1 ? 's' : ''} deleted` + message: `${selectedDb.length} document${selectedDb.length > 1 ? 's' : ''} deleted` }); invalidate(Dependencies.DOCUMENTS); } catch (error) { @@ -122,7 +124,7 @@ }); trackError(error, Submit.DocumentDelete); } finally { - selected = []; + selectedDb = []; showDelete = false; } } @@ -138,6 +140,9 @@ ) as Models.AttributeRelationship[]; let checked = false; + + $: someSelectedDb = data.documents.documents.some((doc) => selectedDb.includes(doc.$id)); + $: allSelectedDb = data.documents.documents.every((doc) => selectedDb.includes(doc.$id)); @@ -145,13 +150,19 @@ 0 && selectedDb.length < data.documents.total} - value={selectedDb.length === data.documents.total} + indeterminate={someSelectedDb && !allSelectedDb} + value={allSelectedDb} on:click={(e) => { if (!isHTMLInputElement(e.target)) return; - selectedDb = e.target.checked - ? data.documents.documents.map((database) => database.$id) - : []; + if (e.target.checked) { + const set = new Set(selectedDb); + data.documents.documents.forEach((doc) => set.add(doc.$id)); + selectedDb = Array.from(set); + } else { + selectedDb = selectedDb.filter((id) => { + return !data.documents.documents.map((doc) => doc.$id).includes(id); + }); + } }} /> Document ID diff --git a/src/routes/console/project-[project]/databases/test.svelte b/src/routes/console/project-[project]/databases/test.svelte deleted file mode 100644 index b0cf3e6c35..0000000000 --- a/src/routes/console/project-[project]/databases/test.svelte +++ /dev/null @@ -1,5 +0,0 @@ - - - From c8b60487d74003fd273ef03164ed4e2543267fd7 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Mon, 7 Aug 2023 18:42:34 +0100 Subject: [PATCH 6/7] tableCellHeadCheck cmp --- src/lib/elements/table/cellHeadCheck.svelte | 33 +++++++++++++++++++ src/lib/elements/table/index.ts | 1 + .../collection-[collection]/table.svelte | 25 +++----------- .../database-[database]/table.svelte | 16 +++------ .../project-[project]/databases/table.svelte | 16 +++------ 5 files changed, 46 insertions(+), 45 deletions(-) create mode 100644 src/lib/elements/table/cellHeadCheck.svelte diff --git a/src/lib/elements/table/cellHeadCheck.svelte b/src/lib/elements/table/cellHeadCheck.svelte new file mode 100644 index 0000000000..9ef8a22d70 --- /dev/null +++ b/src/lib/elements/table/cellHeadCheck.svelte @@ -0,0 +1,33 @@ + + + + + diff --git a/src/lib/elements/table/index.ts b/src/lib/elements/table/index.ts index c702ca6450..90c7b65e24 100644 --- a/src/lib/elements/table/index.ts +++ b/src/lib/elements/table/index.ts @@ -9,6 +9,7 @@ export { default as TableRowLink } from './rowLink.svelte'; export { default as TableRowButton } from './rowButton.svelte'; export { default as TableCell } from './cell.svelte'; export { default as TableCellHead } from './cellHead.svelte'; +export { default as TableCellHeadCheck } from './cellHeadCheck.svelte'; export { default as TableCellLink } from './cellLink.svelte'; export { default as TableCellAvatar } from './cellAvatar.svelte'; export { default as TableCellText } from './cellText.svelte'; diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/table.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/table.svelte index 0af982e7d8..38dcee9af7 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/table.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/table.svelte @@ -8,6 +8,7 @@ TableBody, TableCell, TableCellHead, + TableCellHeadCheck, TableCellText, TableHeader, TableRow, @@ -140,31 +141,13 @@ ) as Models.AttributeRelationship[]; let checked = false; - - $: someSelectedDb = data.documents.documents.some((doc) => selectedDb.includes(doc.$id)); - $: allSelectedDb = data.documents.documents.every((doc) => selectedDb.includes(doc.$id)); - - { - if (!isHTMLInputElement(e.target)) return; - if (e.target.checked) { - const set = new Set(selectedDb); - data.documents.documents.forEach((doc) => set.add(doc.$id)); - selectedDb = Array.from(set); - } else { - selectedDb = selectedDb.filter((id) => { - return !data.documents.documents.map((doc) => doc.$id).includes(id); - }); - } - }} /> - + d.$id)} /> Document ID {#each $columns.filter((n) => n.show) as column} {#if column.show} diff --git a/src/routes/console/project-[project]/databases/database-[database]/table.svelte b/src/routes/console/project-[project]/databases/database-[database]/table.svelte index f453cd26ef..e045bdbcb5 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/table.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/table.svelte @@ -12,6 +12,7 @@ TableBody, TableCell, TableCellHead, + TableCellHeadCheck, TableCellText, TableHeader, TableRowLink, @@ -62,18 +63,9 @@ - - 0 && selected.length < data.collections.total} - value={selected.length === data.collections.total} - on:click={(e) => { - if (!isHTMLInputElement(e.target)) return; - selected = e.target.checked - ? data.collections.collections.map((database) => database.$id) - : []; - }} /> - + c.$id)} /> {#each $columns as column} {#if column.show} {column.title} diff --git a/src/routes/console/project-[project]/databases/table.svelte b/src/routes/console/project-[project]/databases/table.svelte index 76bde33b11..7b636eb689 100644 --- a/src/routes/console/project-[project]/databases/table.svelte +++ b/src/routes/console/project-[project]/databases/table.svelte @@ -12,6 +12,7 @@ TableBody, TableCell, TableCellHead, + TableCellHeadCheck, TableCellText, TableHeader, TableRowLink, @@ -59,18 +60,9 @@ - - 0 && selected.length < data.databases.total} - value={selected.length === data.databases.total} - on:click={(e) => { - if (!isHTMLInputElement(e.target)) return; - selected = e.target.checked - ? data.databases.databases.map((database) => database.$id) - : []; - }} /> - + c.$id)} /> {#each $columns as column} {#if column.show} {column.title} From 87a4ef3758f4454b3403d4b82f19e6f6957daf0e Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Tue, 8 Aug 2023 13:25:18 +0100 Subject: [PATCH 7/7] refactor: pr changes --- src/lib/elements/table/cellCheck.svelte | 29 ++++++++++++++ src/lib/elements/table/index.ts | 1 + .../collection-[collection]/table.svelte | 40 ++++--------------- .../database-[database]/table.svelte | 24 +---------- .../project-[project]/databases/table.svelte | 28 ++----------- 5 files changed, 44 insertions(+), 78 deletions(-) create mode 100644 src/lib/elements/table/cellCheck.svelte diff --git a/src/lib/elements/table/cellCheck.svelte b/src/lib/elements/table/cellCheck.svelte new file mode 100644 index 0000000000..3c55aa395e --- /dev/null +++ b/src/lib/elements/table/cellCheck.svelte @@ -0,0 +1,29 @@ + + + + { + // Prevent the link from being followed + e.preventDefault(); + const el = e.currentTarget; + if (!isHTMLInputElement(el)) return; + + selectedIds = toggle(selectedIds, id); + + // Hack to make sure the checkbox is checked, independent of the + // preventDefault() call above + window.setTimeout(() => { + el.checked = selectedIds.includes(id); + }); + }} /> + diff --git a/src/lib/elements/table/index.ts b/src/lib/elements/table/index.ts index 90c7b65e24..ca4752e8af 100644 --- a/src/lib/elements/table/index.ts +++ b/src/lib/elements/table/index.ts @@ -13,3 +13,4 @@ export { default as TableCellHeadCheck } from './cellHeadCheck.svelte'; export { default as TableCellLink } from './cellLink.svelte'; export { default as TableCellAvatar } from './cellAvatar.svelte'; export { default as TableCellText } from './cellText.svelte'; +export { default as TableCellCheck } from './cellCheck.svelte'; diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/table.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/table.svelte index 38dcee9af7..953a3d3924 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/table.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/table.svelte @@ -2,11 +2,15 @@ import { goto, invalidate } from '$app/navigation'; import { base } from '$app/paths'; import { page } from '$app/stores'; + import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; import { tooltip } from '$lib/actions/tooltip'; - import { Id } from '$lib/components'; + import { Alert, FloatingActionBar, Id, Modal } from '$lib/components'; + import { Dependencies } from '$lib/constants'; + import { Button, InputChoice } from '$lib/elements/forms'; import { TableBody, TableCell, + TableCellCheck, TableCellHead, TableCellHeadCheck, TableCellText, @@ -15,25 +19,15 @@ TableRowLink, TableScroll } from '$lib/elements/table'; + import { addNotification } from '$lib/stores/notifications'; import { preferences } from '$lib/stores/preferences'; + import { sdk } from '$lib/stores/sdk'; import type { Models } from '@appwrite.io/console'; import { onMount } from 'svelte'; import type { PageData } from './$types'; import { isRelationship, isRelationshipToMany } from './document-[document]/attributes/store'; import RelationshipsModal from './relationshipsModal.svelte'; import { attributes, collection, columns } from './store'; - import InputCheckbox from '$lib/elements/forms/inputCheckbox.svelte'; - import { isHTMLInputElement } from '$lib/helpers/types'; - import { toggle } from '$lib/helpers/array'; - import { sdk } from '$lib/stores/sdk'; - import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; - import { addNotification } from '$lib/stores/notifications'; - import { Dependencies } from '$lib/constants'; - import FloatingActionBar from '$lib/components/floatingActionBar.svelte'; - import Button from '$lib/elements/forms/button.svelte'; - import Modal from '$lib/components/modal.svelte'; - import Alert from '$lib/components/alert.svelte'; - import InputChoice from '$lib/elements/forms/inputChoice.svelte'; export let data: PageData; @@ -159,25 +153,7 @@ {#each data.documents.documents as document} - - { - // Prevent the link from being followed - e.preventDefault(); - const el = e.currentTarget; - if (!isHTMLInputElement(el)) return; - - selectedDb = toggle(selectedDb, document.$id); - - // Hack to make sure the checkbox is checked, independent of the - // preventDefault() call above - window.setTimeout(() => { - el.checked = selectedDb.includes(document.$id); - }); - }} /> - + diff --git a/src/routes/console/project-[project]/databases/database-[database]/table.svelte b/src/routes/console/project-[project]/databases/database-[database]/table.svelte index e045bdbcb5..22305fee2b 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/table.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/table.svelte @@ -7,10 +7,10 @@ import FloatingActionBar from '$lib/components/floatingActionBar.svelte'; import { Dependencies } from '$lib/constants'; import { Button } from '$lib/elements/forms'; - import InputCheckbox from '$lib/elements/forms/inputCheckbox.svelte'; import { TableBody, TableCell, + TableCellCheck, TableCellHead, TableCellHeadCheck, TableCellText, @@ -18,9 +18,7 @@ TableRowLink, TableScroll } from '$lib/elements/table'; - import { toggle } from '$lib/helpers/array'; import { toLocaleDateTime } from '$lib/helpers/date'; - import { isHTMLInputElement } from '$lib/helpers/types'; import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; import type { PageData } from './$types'; @@ -76,25 +74,7 @@ {#each data.collections.collections as collection} - - { - // Prevent the link from being followed - e.preventDefault(); - const el = e.currentTarget; - if (!isHTMLInputElement(el)) return; - - selected = toggle(selected, collection.$id); - - // Hack to make sure the checkbox is checked, independent of the - // preventDefault() call above - window.setTimeout(() => { - el.checked = selected.includes(collection.$id); - }); - }} /> - + {#each $columns as column} {#if column.show} {#if column.id === '$id'} diff --git a/src/routes/console/project-[project]/databases/table.svelte b/src/routes/console/project-[project]/databases/table.svelte index 7b636eb689..0477187a4f 100644 --- a/src/routes/console/project-[project]/databases/table.svelte +++ b/src/routes/console/project-[project]/databases/table.svelte @@ -6,8 +6,7 @@ import { Id, Modal } from '$lib/components'; import FloatingActionBar from '$lib/components/floatingActionBar.svelte'; import { Dependencies } from '$lib/constants'; - import Button from '$lib/elements/forms/button.svelte'; - import InputCheckbox from '$lib/elements/forms/inputCheckbox.svelte'; + import { Button } from '$lib/elements/forms'; import { TableBody, TableCell, @@ -16,11 +15,10 @@ TableCellText, TableHeader, TableRowLink, - TableScroll + TableScroll, + TableCellCheck } from '$lib/elements/table'; - import { toggle } from '$lib/helpers/array'; import { toLocaleDateTime } from '$lib/helpers/date'; - import { isHTMLInputElement } from '$lib/helpers/types'; import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; import type { PageData } from './$types'; @@ -73,25 +71,7 @@ {#each data.databases.databases as database} - - { - // Prevent the link from being followed - e.preventDefault(); - const el = e.currentTarget; - if (!isHTMLInputElement(el)) return; - - selected = toggle(selected, database.$id); - - // Hack to make sure the checkbox is checked, independent of the - // preventDefault() call above - window.setTimeout(() => { - el.checked = selected.includes(database.$id); - }); - }} /> - + {#each $columns as column} {#if column.show} {#if column.id === '$id'}