diff --git a/src/lib/helpers/clearSearch.ts b/src/lib/helpers/clearSearch.ts new file mode 100644 index 0000000000..3408bff7af --- /dev/null +++ b/src/lib/helpers/clearSearch.ts @@ -0,0 +1,17 @@ +/** + * Creates a clear search function for SearchQuery components + * @param searchQuery + * @returns A function that clears the search input + */ +export function createClearSearch(searchQuery: { clearInput?: () => void } | undefined) { + return () => { + searchQuery?.clearInput?.(); + }; +} + +/** + * @param searchQuery + */ +export function clearSearchInput(searchQuery: { clearInput?: () => void } | undefined) { + searchQuery?.clearInput?.(); +} diff --git a/src/lib/layout/responsiveContainerHeader.svelte b/src/lib/layout/responsiveContainerHeader.svelte index 0f5358a029..18d42cfcce 100644 --- a/src/lib/layout/responsiveContainerHeader.svelte +++ b/src/lib/layout/responsiveContainerHeader.svelte @@ -24,7 +24,8 @@ searchPlaceholder = 'Search by ID', hasFilters = false, analyticsSource = '', - children + children, + searchQuery = $bindable() }: { columns?: Writable; view?: View; @@ -35,8 +36,14 @@ hasFilters?: boolean; analyticsSource?: string; children?: Snippet; + searchQuery?: SearchQuery; } = $props(); + // Ensure searchQuery is considered used by TypeScript + $effect(() => { + searchQuery; + }); + let hasDisplaySettings = $derived(!hideView || (!hideColumns && $columns?.length)); let numberOfOptions = $derived( [hasSearch, hasFilters && $columns?.length, hasDisplaySettings].filter(Boolean).length @@ -97,14 +104,14 @@ {/if} {#if showSearch && hasSearch} - + {/if} {:else} {#if hasSearch} - + {/if} {#if hasFilters && $columns?.length} diff --git a/src/routes/(console)/organization-[organization]/domains/+page.svelte b/src/routes/(console)/organization-[organization]/domains/+page.svelte index 4e98e3d80d..5e51fde9ec 100644 --- a/src/routes/(console)/organization-[organization]/domains/+page.svelte +++ b/src/routes/(console)/organization-[organization]/domains/+page.svelte @@ -2,6 +2,7 @@ import { base } from '$app/paths'; import { page } from '$app/state'; import { EmptySearch, PaginationWithLimit, ViewSelector } from '$lib/components/index.js'; + import { clearSearchInput } from '$lib/helpers/clearSearch'; import { Button } from '$lib/elements/forms'; import Link from '$lib/elements/link.svelte'; import { toLocaleDateTime } from '$lib/helpers/date'; @@ -39,6 +40,8 @@ let showDelete = false; let showRetry = false; let selectedDomain: Models.Domain = null; + let searchQuery; + const clearSearch = () => clearSearchInput(searchQuery); const isDomainVerified = (domain: Models.Domain) => { return domain.nameservers.toLowerCase() === 'appwrite'; @@ -47,7 +50,7 @@ - + + {:else} diff --git a/src/routes/(console)/organization-[organization]/domains/domain-[domain]/(certificates)/disabledPage.svelte b/src/routes/(console)/organization-[organization]/domains/domain-[domain]/(certificates)/disabledPage.svelte index 06b7fe9b1b..40b2d2340f 100644 --- a/src/routes/(console)/organization-[organization]/domains/domain-[domain]/(certificates)/disabledPage.svelte +++ b/src/routes/(console)/organization-[organization]/domains/domain-[domain]/(certificates)/disabledPage.svelte @@ -16,8 +16,6 @@ Tooltip } from '@appwrite.io/pink-svelte'; import SearchQuery from '$lib/components/searchQuery.svelte'; - import { base } from '$app/paths'; - import { page } from '$app/state'; import CertificateInfoModal from './certificateInfoModal.svelte'; import DeleteCertificateModal from './deleteCertificateModal.svelte'; @@ -26,13 +24,18 @@ let showDelete = false; let showAdvancedInfo = false; let selectedCertificate = null; //TODO: add type + let searchQuery; + + function clearSearch() { + searchQuery?.clearInput(); + } const now = new Date(); - + {#if data.certificates.total} @@ -138,13 +141,9 @@ offset={data.offset} total={data.certificates.total} /> {:else if data?.search} - + - + {:else} diff --git a/src/routes/(console)/project-[region]-[project]/auth/+page.svelte b/src/routes/(console)/project-[region]-[project]/auth/+page.svelte index 2bc7fb4fa8..a2c0ee3831 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/+page.svelte @@ -14,6 +14,7 @@ PaginationWithLimit, SearchQuery } from '$lib/components'; + import { clearSearchInput } from '$lib/helpers/clearSearch'; import { Button } from '$lib/elements/forms'; import { toLocaleDate, toLocaleDateTime } from '$lib/helpers/date'; import { Container } from '$lib/layout'; @@ -43,6 +44,9 @@ export let data; + let searchQuery; + const clearSearch = () => clearSearchInput(searchQuery); + const columns = writable([ { id: '$id', title: 'User ID', type: 'string', width: 200 }, { id: 'name', title: 'Name', type: 'string', width: { min: 260 } }, @@ -104,7 +108,9 @@ - + @@ -215,10 +221,7 @@ total={data.users.total} /> {:else if data.search} - + {:else} clearSearchInput(searchQuery); let selectedTeams: string[] = []; let showDelete = false; @@ -90,7 +93,7 @@ - + + {:else} void } | undefined; + const clearSearch = () => clearSearchInput(searchQuery); async function handleCreate(event: CustomEvent) { showCreate = false; @@ -50,7 +53,8 @@ hasSearch {columns} bind:view={data.view} - searchPlaceholder="Search by name or ID"> + searchPlaceholder="Search by name or ID" + bind:searchQuery> {#if $canWriteDatabases} + {:else} import { EmptySearch, PaginationWithLimit, SearchQuery, ViewSelector } from '$lib/components'; + import { clearSearchInput } from '$lib/helpers/clearSearch'; import { Button } from '$lib/elements/forms'; import { Container } from '$lib/layout'; import { showCreateTable, tableViewColumns } from './store'; @@ -11,17 +12,17 @@ import { app } from '$lib/stores/app'; import { canWriteTables } from '$lib/stores/roles'; import { IconPlus } from '@appwrite.io/pink-icons-svelte'; - import { page } from '$app/state'; export let data: PageData; - const databaseId = page.params.database; + let searchQuery; + const clearSearch = () => clearSearchInput(searchQuery); - + @@ -55,11 +56,7 @@ total={data.tables.total} /> {:else if data.search} - + {:else} diff --git a/src/routes/(console)/project-[region]-[project]/functions/+page.svelte b/src/routes/(console)/project-[region]-[project]/functions/+page.svelte index 0bc701817e..981bc76242 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/+page.svelte @@ -31,6 +31,11 @@ export let data; let offset = 0; + let searchQuery; + + function clearSearch() { + searchQuery?.clearInput(); + } const project = page.params.project; @@ -80,7 +85,7 @@ - + + {:else} void } | undefined; + + function clearSearch() { + clearSearchInput(searchQuery); + } - + - + + {:else} diff --git a/src/routes/(console)/project-[region]-[project]/functions/templates/+page.svelte b/src/routes/(console)/project-[region]-[project]/functions/templates/+page.svelte index de53032daf..2fd7160a79 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/templates/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/templates/+page.svelte @@ -28,6 +28,7 @@ export let data; let offset = 0; + let searchQuery; function applyFilter(filter: string, value: string, event: CustomEvent) { const target = new URL(page.url); @@ -54,6 +55,7 @@ } function clearSearch() { + searchQuery?.clearInput(); const target = new URL(page.url); target.search = ''; goto(target.toString(), { @@ -89,7 +91,7 @@ - + diff --git a/src/routes/(console)/project-[region]-[project]/messaging/+page.svelte b/src/routes/(console)/project-[region]-[project]/messaging/+page.svelte index fcc7325938..d761e52583 100644 --- a/src/routes/(console)/project-[region]-[project]/messaging/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/messaging/+page.svelte @@ -38,6 +38,11 @@ let deleting = false; let showFailed = false; let errors: string[] = []; + let searchQuery; + + function clearSearch() { + searchQuery?.clearInput(); + } const columns = writable([ { id: '$id', title: 'Message ID', type: 'string', width: 200 }, @@ -152,7 +157,8 @@ hasFilters hasSearch analyticsSource="messaging_messages" - searchPlaceholder="Search by description, type, status, or ID"> + searchPlaceholder="Search by description, type, status, or ID" + bind:searchQuery> {#if $canWriteMessages} {/if} @@ -243,19 +249,11 @@ {:else if $hasPageQueries} {:else if data.search} - -
- Sorry, we couldn't find '{data.search}' -

There are no messages that match your search.

-
-
- - -
+ + + {:else} ($showCreate = true)}> diff --git a/src/routes/(console)/project-[region]-[project]/messaging/providers/+page.svelte b/src/routes/(console)/project-[region]-[project]/messaging/providers/+page.svelte index 85b132238d..d5dd3b31f1 100644 --- a/src/routes/(console)/project-[region]-[project]/messaging/providers/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/messaging/providers/+page.svelte @@ -1,5 +1,4 @@ - + @@ -52,16 +54,8 @@ {:else if $hasPageQueries} {:else if data.search && data.search !== 'empty'} - -
- Sorry, we couldn't find '{data.search}' -

There are no providers that match your search.

-
- + + {:else} diff --git a/src/routes/(console)/project-[region]-[project]/messaging/topics/+page.svelte b/src/routes/(console)/project-[region]-[project]/messaging/topics/+page.svelte index 2833293ac4..881f57c29e 100644 --- a/src/routes/(console)/project-[region]-[project]/messaging/topics/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/messaging/topics/+page.svelte @@ -21,6 +21,12 @@ export let data: PageData; + let searchQuery; + + function clearSearch() { + searchQuery?.clearInput(); + } + const region = page.params.region; const project = page.params.project; const columns = writable([ @@ -72,7 +78,8 @@ hasFilters hasSearch analyticsSource="messaging_topics_filter" - searchPlaceholder="Search by name or ID"> + searchPlaceholder="Search by name or ID" + bind:searchQuery> {#if $canWriteTopics} + + {:else} clearSearchInput(searchQuery); let subscribersByTargetId: Record = {}; const columns = writable([ { id: '$id', title: 'Subscriber ID', type: 'string', width: 200 }, @@ -89,7 +91,7 @@ - + @@ -121,10 +123,7 @@ Sorry, we couldn't find '{data.search}'

There are no subscribers that match your search.

- +
{:else} void } | undefined>(); + + function clearSearch() { + searchQuery?.clearInput(); + } @@ -19,7 +25,8 @@ hasSearch hideView searchPlaceholder="Search by domain" - analyticsSource="settings_domain_overview"> + analyticsSource="settings_domain_overview" + bind:searchQuery> +
{:else} diff --git a/src/routes/(console)/project-[region]-[project]/sites/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/+page.svelte index 17022e7d74..d06a3b265d 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/+page.svelte @@ -19,6 +19,7 @@ import EmptyDark from './(images)/empty-sites-dark.svg'; import Grid from './grid.svelte'; import { IconPlus } from '@appwrite.io/pink-icons-svelte'; + import { clearSearchInput } from '$lib/helpers/clearSearch'; import { columns } from './store'; import { View } from '$lib/helpers/load'; import Table from './table.svelte'; @@ -30,6 +31,8 @@ export let data; let show = false; + let searchQuery; + const clearSearch = () => clearSearchInput(searchQuery); $: $registerCommands([ { @@ -60,7 +63,7 @@ - + {:else if data.search} - + + + {:else} void } | undefined; + + function clearSearch() { + clearSearchInput(searchQuery); + } - + + + {:else} diff --git a/src/routes/(console)/project-[region]-[project]/storage/+page.svelte b/src/routes/(console)/project-[region]-[project]/storage/+page.svelte index b9c29bc764..0d2a350411 100644 --- a/src/routes/(console)/project-[region]-[project]/storage/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/storage/+page.svelte @@ -4,7 +4,7 @@