diff --git a/package.json b/package.json index 2671ca225..48ecacba4 100644 --- a/package.json +++ b/package.json @@ -21,18 +21,18 @@ "e2e:ui": "playwright test --ui" }, "dependencies": { - "@appwrite.io/console": "https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@e2f082e", + "@ai-sdk/svelte": "^1.1.22", + "@appwrite.io/console": "https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@f76aff1", "@appwrite.io/pink": "0.25.0", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f", "@appwrite.io/pink-legacy": "^1.0.3", - "@appwrite.io/pink-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@cbf05a1", + "@appwrite.io/pink-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@de27ca4", "@popperjs/core": "^2.11.8", "@sentry/sveltekit": "^8.38.0", "@stripe/stripe-js": "^3.5.0", "ai": "^2.2.37", "analytics": "^0.8.16", - "@ai-sdk/svelte": "^1.1.22", "cron-parser": "^4.9.0", "dayjs": "^1.11.13", "deep-equal": "^2.2.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 814508c4d..7307f4b8c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,8 +12,8 @@ importers: specifier: ^1.1.22 version: 1.1.24(svelte@5.25.3)(zod@3.24.3) '@appwrite.io/console': - specifier: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@e2f082e - version: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@e2f082e + specifier: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@f76aff1 + version: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@f76aff1 '@appwrite.io/pink': specifier: 0.25.0 version: 0.25.0 @@ -27,8 +27,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@cbf05a1 - version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@cbf05a1(react-dom@18.3.1(react@18.3.1))(svelte@5.25.3) + specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@de27ca4 + version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@de27ca4(react-dom@18.3.1(react@18.3.1))(svelte@5.25.3) '@popperjs/core': specifier: ^2.11.8 version: 2.11.8 @@ -272,8 +272,8 @@ packages: '@analytics/type-utils@0.6.2': resolution: {integrity: sha512-TD+xbmsBLyYy/IxFimW/YL/9L2IEnM7/EoV9Aeh56U64Ify8o27HJcKjo38XY9Tcn0uOq1AX3thkKgvtWvwFQg==} - '@appwrite.io/console@https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@e2f082e': - resolution: {tarball: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@e2f082e} + '@appwrite.io/console@https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@f76aff1': + resolution: {tarball: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@f76aff1} version: 1.2.1 '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f': @@ -282,8 +282,8 @@ packages: peerDependencies: svelte: ^4.0.0 - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@cbf05a106412315e451530f8384924da515b10c8': - resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@cbf05a106412315e451530f8384924da515b10c8} + '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@de27ca407599e51b378814b421fb63625cb98c10': + resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@de27ca407599e51b378814b421fb63625cb98c10} version: 1.0.0-next.7 peerDependencies: svelte: ^4.0.0 @@ -297,8 +297,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@cbf05a1': - resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@cbf05a1} + '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@de27ca4': + resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@de27ca4} version: 1.0.0-next.85 peerDependencies: react-dom: ^18.0.0 @@ -3830,13 +3830,13 @@ snapshots: '@analytics/type-utils@0.6.2': {} - '@appwrite.io/console@https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@e2f082e': {} + '@appwrite.io/console@https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@f76aff1': {} '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f(svelte@5.25.3)': dependencies: svelte: 5.25.3 - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@cbf05a106412315e451530f8384924da515b10c8(svelte@5.25.3)': + '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@de27ca407599e51b378814b421fb63625cb98c10(svelte@5.25.3)': dependencies: svelte: 5.25.3 @@ -3849,9 +3849,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@cbf05a1(react-dom@18.3.1(react@18.3.1))(svelte@5.25.3)': + '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@de27ca4(react-dom@18.3.1(react@18.3.1))(svelte@5.25.3)': dependencies: - '@appwrite.io/pink-icons-svelte': https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@cbf05a106412315e451530f8384924da515b10c8(svelte@5.25.3) + '@appwrite.io/pink-icons-svelte': https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@de27ca407599e51b378814b421fb63625cb98c10(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/actions/analytics.ts b/src/lib/actions/analytics.ts index 78e7551b7..1655166df 100644 --- a/src/lib/actions/analytics.ts +++ b/src/lib/actions/analytics.ts @@ -346,6 +346,9 @@ export enum Submit { FileCreate = 'submit_file_create', FileDelete = 'submit_file_delete', FileUpdatePermissions = 'submit_file_update_permissions', + FileTokenCreate = 'submit_file_token', + FileTokenDelete = 'submit_file_delete', + FileTokenUpdate = 'submit_file_update_expiry', BudgetCapUpdate = 'submit_budget_cap_update', BudgetAlertsUpdate = 'submit_budget_alert_conditions_update', CreditRedeem = 'submit_credit_redeem', diff --git a/src/routes/(console)/project-[project]/overview/keys/expirationInput.svelte b/src/lib/components/expirationInput.svelte similarity index 77% rename from src/routes/(console)/project-[project]/overview/keys/expirationInput.svelte rename to src/lib/components/expirationInput.svelte index cafc292c6..3e8286e04 100644 --- a/src/routes/(console)/project-[project]/overview/keys/expirationInput.svelte +++ b/src/lib/components/expirationInput.svelte @@ -1,5 +1,5 @@ - - - {#if expirationSelect !== 'custom' && expirationSelect !== null} - Your key will expire in {toLocaleDate(value)} - {/if} - + {#if expirationSelect === 'custom'} - + {/if} diff --git a/src/lib/components/filters/customFilters.svelte b/src/lib/components/filters/customFilters.svelte index 09ff475fb..8fd765f27 100644 --- a/src/lib/components/filters/customFilters.svelte +++ b/src/lib/components/filters/customFilters.svelte @@ -12,7 +12,9 @@ { show = true; - }}>Custom filters + }}> + Custom filters + {#if show} diff --git a/src/lib/components/filters/filtersModal.svelte b/src/lib/components/filters/filtersModal.svelte index aebb86f76..a192a60ea 100644 --- a/src/lib/components/filters/filtersModal.svelte +++ b/src/lib/components/filters/filtersModal.svelte @@ -11,11 +11,19 @@ } from '$lib/elements/forms'; import type { Writable } from 'svelte/store'; import Modal from '../modal.svelte'; - import { addFilter, generateTag, operators, queries, type TagValue } from './store'; + import { + addFilter, + generateTag, + operators, + queries, + ValidOperators, + type TagValue + } from './store'; import type { Column } from '$lib/helpers/types'; import { TagList } from '.'; import { Icon, Layout } from '@appwrite.io/pink-svelte'; import { IconPlus } from '@appwrite.io/pink-icons-svelte'; + import { addFilterAndApply } from './quickFilters'; export let show = false; export let columns: Writable; @@ -35,9 +43,17 @@ function apply() { localQueries.forEach((query) => { - addFilter($columns, query.id, query.operator, query.value, query.arrayValues); + addFilterAndApply( + query.id, + $columns.find((c) => c.id === query.id).title, + query.operator as ValidOperators, + query.value, + query.arrayValues, + $columns, + analyticsSource + ); }); - queries.apply(); + localTags = []; localQueries = []; trackEvent(Submit.FilterApply, { @@ -48,7 +64,7 @@ } function addCondition() { - const newTag = generateTag(selectedColumn, operatorKey, value, arrayValues); + const newTag = generateTag(selectedColumn, operatorKey, value || arrayValues); if (localTags.some((t) => t.tag === newTag.tag && t.value === newTag.value)) { return; } else { diff --git a/src/lib/components/filters/quickFilters.svelte b/src/lib/components/filters/quickFilters.svelte index 143fe5c73..c00316154 100644 --- a/src/lib/components/filters/quickFilters.svelte +++ b/src/lib/components/filters/quickFilters.svelte @@ -1,107 +1,70 @@ -{#if $isSmallViewport} - {#if $parsedTags?.length} - - {:else} - - {/if} -{:else} - - {#if $parsedTags?.length} - - {:else} - - {/if} - - {#each filterCols as filter (filter.title + filter.id)} - {#if filter.options} - { - addFilterAndApply( - filter.id, - filter.title, - filter.operator, - e.detail.value, - filter?.array - ? (filter.options - .filter((opt) => opt.checked) - .map((opt) => opt.value) ?? []) - : [], - $columns, - analyticsSource - ); - }} - on:clear={() => { - addFilterAndApply( - filter.id, - filter.title, - filter.operator, - null, - [], - $columns, - analyticsSource - ); - }} /> - {/if} - {/each} - + + + + {#each filterCols.filter((f) => f?.options) as filter (filter.title + filter.id)} + {#if filter.options} + { + addFilterAndApply( + filter.id, + filter.title, + filter.operator, + e.detail.value, + filter?.array + ? (filter.options + .filter((opt) => opt.checked) + .map((opt) => opt.value) ?? []) + : [], + $columns, + analyticsSource + ); + }} + on:clear={() => { + addFilterAndApply( + filter.id, + filter.title, + filter.operator, + null, + [], + $columns, + analyticsSource + ); + }} /> + {/if} + {/each} + - - - - -{/if} - -{#if $isSmallViewport && openBottomSheet} - -{/if} + + + + diff --git a/src/lib/components/filters/quickfiltersSubMenu.svelte b/src/lib/components/filters/quickfiltersSubMenu.svelte index b49bef07e..9b4c3275c 100644 --- a/src/lib/components/filters/quickfiltersSubMenu.svelte +++ b/src/lib/components/filters/quickfiltersSubMenu.svelte @@ -34,9 +34,10 @@
- - {filter.title} + + + {filter.title} +
diff --git a/src/lib/components/filters/setFilters.ts b/src/lib/components/filters/setFilters.ts index 7c8d858d2..c59a2408c 100644 --- a/src/lib/components/filters/setFilters.ts +++ b/src/lib/components/filters/setFilters.ts @@ -9,17 +9,18 @@ export function setFilters(localTags: TagValue[], filterCols: FilterData[], $col if (!localTags?.length) { filterCols.forEach((filter) => { resetOptions(filter); - cleanOldTags(filter.title); + cleanOldTags(filter?.title); }); } else { filterCols.forEach((filter) => { - if (filter.id.toLowerCase().includes('duration')) { + const id = filter?.id?.toLowerCase(); + if (id?.includes('duration')) { setTimeFilter(filter, $columns); - } else if (filter.id.toLocaleLowerCase().includes('size')) { + } else if (id?.includes('size')) { setSizeFilter(filter, $columns); - } else if (filter.id.toLocaleLowerCase().includes('statuscode')) { + } else if (id?.includes('statuscode')) { setStatusCodeFilter(filter, $columns); - } else if (filter.id === '$createdAt' || filter.id === '$updatedAt') { + } else if (id === '$createdat' || id === '$updatedat') { setDateFilter(filter, $columns); } else { setFilterData(filter); @@ -40,7 +41,7 @@ export function setFilterData(filter: FilterData) { option.checked = values.includes(option.value); }); } - cleanOldTags(filter.title); + cleanOldTags(filter?.title); const newTag = { tag: tagData.tag.replace(',', ' or '), value: tagData.value @@ -52,7 +53,7 @@ export function setFilterData(filter: FilterData) { }); } else { resetOptions(filter); - cleanOldTags(filter.title); + cleanOldTags(filter?.title); } } @@ -76,7 +77,7 @@ export function setTimeFilter(filter: FilterData, columns: Column[]) { value: timeTag.value }; - cleanOldTags(filter.title); + cleanOldTags(filter?.title); parsedTags.update((tags) => { tags.push(newTag); @@ -84,7 +85,7 @@ export function setTimeFilter(filter: FilterData, columns: Column[]) { }); } } else { - cleanOldTags(filter.title); + cleanOldTags(filter?.title); } } @@ -102,7 +103,7 @@ export function setSizeFilter(filter: FilterData, columns: Column[]) { return prev; }); if (sizeRange) { - cleanOldTags(filter.title); + cleanOldTags(filter?.title); const newTag = { tag: `**${filter.title}** is **${sizeRange.label}**`, @@ -114,7 +115,7 @@ export function setSizeFilter(filter: FilterData, columns: Column[]) { }); } } else { - cleanOldTags(filter.title); + cleanOldTags(filter?.title); } } @@ -127,7 +128,7 @@ export function setStatusCodeFilter(filter: FilterData, columns: Column[]) { const codeRange = ranges.find((c) => c?.value && c.value === statusCodeTag.value); if (codeRange) { - cleanOldTags(filter.title); + cleanOldTags(filter?.title); const newTag = { tag: `**${filter.title}** is **${codeRange.label}**`, value: statusCodeTag.value @@ -139,7 +140,7 @@ export function setStatusCodeFilter(filter: FilterData, columns: Column[]) { }); } } else { - cleanOldTags(filter.title); + cleanOldTags(filter?.title); } } @@ -158,7 +159,7 @@ export function setDateFilter(filter: FilterData, columns: Column[]) { return prev; }); if (dateRange) { - cleanOldTags(filter.title); + cleanOldTags(filter?.title); const newTag = { tag: `**${filter.title}** is **${dateRange.label}**`, value: dateTag.value @@ -169,11 +170,12 @@ export function setDateFilter(filter: FilterData, columns: Column[]) { }); } } else { - cleanOldTags(filter.title); + cleanOldTags(filter?.title); } } function cleanOldTags(title: string) { + if (!title) return; parsedTags.update((tags) => { tags = tags.filter((tag) => !tag.tag.includes(`**${title}**`)); return tags; @@ -181,6 +183,7 @@ function cleanOldTags(title: string) { } export function resetOptions(filter: FilterData) { + if (!filter?.options) return; filter.options.forEach((option) => { option.checked = false; }); diff --git a/src/lib/components/git/deploymentDomains.svelte b/src/lib/components/git/deploymentDomains.svelte index bb6ed3942..f588cc57c 100644 --- a/src/lib/components/git/deploymentDomains.svelte +++ b/src/lib/components/git/deploymentDomains.svelte @@ -42,12 +42,12 @@ {#if sortedDomains.length > 1} - + +{sortedDomains.length - 1} - + {#each sortedDomains as rule, i} {#if i !== 0} - import { EmptySearch, Paginator } from '$lib/components'; + import { Empty, EmptySearch, Paginator } from '$lib/components'; import { Button, InputSearch, InputSelect } from '$lib/elements/forms'; import { timeFromNow } from '$lib/helpers/date'; import { sdk } from '$lib/stores/sdk'; @@ -20,6 +20,7 @@ import { VCSDetectionType, type Models } from '@appwrite.io/console'; import { getFrameworkIcon } from '$lib/stores/sites'; import { connectGitHub } from '$lib/stores/git'; + import Card from '../card.svelte'; let { action = $bindable('select'), @@ -147,7 +148,10 @@ ); }} bind:value={selectedInstallation} /> - + {/await} @@ -259,7 +263,7 @@ {/snippet} - {:else} + {:else if search} {#if search} @@ -269,6 +273,14 @@ {/if} + {:else} + + + + No repositories available + + + {/if} {/await} {/if} diff --git a/src/lib/components/index.ts b/src/lib/components/index.ts index 0e077aedb..16855e8bc 100644 --- a/src/lib/components/index.ts +++ b/src/lib/components/index.ts @@ -83,3 +83,4 @@ export { default as Confirm } from './confirm.svelte'; export { default as UsageCard } from './usageCard.svelte'; export { default as ViewToggle } from './viewToggle.svelte'; export { default as Terminal } from './studio/terminal.svelte'; +export { default as ExpirationInput } from './expirationInput.svelte'; diff --git a/src/lib/components/labelCard.svelte b/src/lib/components/labelCard.svelte index 052e2ddd3..ffcd8474c 100644 --- a/src/lib/components/labelCard.svelte +++ b/src/lib/components/labelCard.svelte @@ -1,5 +1,5 @@ @@ -195,6 +196,7 @@ bind:showTeam bind:showUser {groups} + {hideOnClick} on:create={create} let:toggle> - - - +{#if loading} +
+
+

Loading template...

- +{/if} +
+
+ + + + + {#if $$slots.default} +

+ Click to copy variables for the fields below. Learn more here. +

+ + + + {/if} + + + + + + + Set up an SMTP server to edit the message body + + + +
+
+
+ + +
+
+
diff --git a/src/routes/(console)/project-[project]/auth/templates/emailVerificationTemplate.svelte b/src/routes/(console)/project-[project]/auth/templates/emailVerificationTemplate.svelte index 357e87bbb..0bc34c9b6 100644 --- a/src/routes/(console)/project-[project]/auth/templates/emailVerificationTemplate.svelte +++ b/src/routes/(console)/project-[project]/auth/templates/emailVerificationTemplate.svelte @@ -7,7 +7,7 @@ import { Id } from '$lib/components'; import { addNotification } from '$lib/stores/notifications'; import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; - import { Layout } from '@appwrite.io/pink-svelte'; + import { Layout, Card } from '@appwrite.io/pink-svelte'; const projectId = page.params.project; @@ -36,11 +36,13 @@ } - - - - {'{{user}}'} - {'{{project}}'} - {'{{redirect}}'} - - + + + + + {'{{user}}'} + {'{{project}}'} + {'{{redirect}}'} + + + diff --git a/src/routes/(console)/project-[project]/auth/templates/localeOptions.svelte b/src/routes/(console)/project-[project]/auth/templates/localeOptions.svelte index 403eb3b89..4c4c334ca 100644 --- a/src/routes/(console)/project-[project]/auth/templates/localeOptions.svelte +++ b/src/routes/(console)/project-[project]/auth/templates/localeOptions.svelte @@ -1,5 +1,5 @@ - - - + diff --git a/src/routes/(console)/project-[project]/auth/templates/resetEmail.svelte b/src/routes/(console)/project-[project]/auth/templates/resetEmail.svelte index d13aee6f8..ebf009cf4 100644 --- a/src/routes/(console)/project-[project]/auth/templates/resetEmail.svelte +++ b/src/routes/(console)/project-[project]/auth/templates/resetEmail.svelte @@ -8,6 +8,7 @@ import { project } from '../../store'; import { loadEmailTemplate } from './+page.svelte'; import { baseEmailTemplate, emailTemplate } from './store'; + import { Dialog, Layout, Alert } from '@appwrite.io/pink-svelte'; export let show = false; @@ -44,15 +45,24 @@ } - + Reset email template? -

- Are you sure you want to reset the email template? - Default values will be set in all inputs. -

+ + +

+ Are you sure you want to reset the email template? + Default values will be set in all inputs. +

+ + {#if error} + {error} + {/if} +
- - + + + + -
+ diff --git a/src/routes/(console)/project-[project]/databases/database-[database]/backups/createPolicy.svelte b/src/routes/(console)/project-[project]/databases/database-[database]/backups/createPolicy.svelte index 3e664bf31..b1c812919 100644 --- a/src/routes/(console)/project-[project]/databases/database-[database]/backups/createPolicy.svelte +++ b/src/routes/(console)/project-[project]/databases/database-[database]/backups/createPolicy.svelte @@ -324,7 +324,7 @@ variant="secondary" padding="s" --input-background-color="var(--bgcolor-neutral-primary)"> -