diff --git a/e2e/steps/pro-project.ts b/e2e/steps/pro-project.ts index 05c95895f..438caebef 100644 --- a/e2e/steps/pro-project.ts +++ b/e2e/steps/pro-project.ts @@ -14,12 +14,15 @@ export async function enterCreditCard(page: Page) { state: 'visible' }); await page.getByPlaceholder('cardholder').fill('Test User'); - const stripe = page.frameLocator('[title="Secure payment input frame"]'); + const stripe = page.locator('[title="Secure payment input frame"]').nth(0).contentFrame(); await stripe.locator('id=Field-numberInput').fill('4242424242424242'); await stripe.locator('id=Field-expiryInput').fill('1250'); await stripe.locator('id=Field-cvcInput').fill('123'); await stripe.locator('id=Field-countryInput').selectOption('DE'); await dialog.getByRole('button', { name: 'Add', exact: true }).click(); + await page.locator('id=state-picker').click(); // open dropdown + await page.getByRole('option', { name: 'Alabama' }).click(); + await dialog.getByRole('button', { name: 'Add', exact: true }).click(); await dialog.waitFor({ state: 'hidden' }); diff --git a/package.json b/package.json index f41ea9556..77499856c 100644 --- a/package.json +++ b/package.json @@ -22,11 +22,11 @@ }, "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@2289", + "@appwrite.io/console": "^1.10.0", "@appwrite.io/pink-icons": "0.25.0", - "@appwrite.io/pink-icons-svelte": "^2.0.0-RC.1", + "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@e6b154b", "@appwrite.io/pink-legacy": "^1.0.3", - "@appwrite.io/pink-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@95bdb79", + "@appwrite.io/pink-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@e6b154b", "@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 3c18de482..7aa3f74a5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,20 +12,20 @@ importers: specifier: ^1.1.24 version: 1.1.24(svelte@5.25.3)(zod@3.24.3) '@appwrite.io/console': - specifier: https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@2289 - version: https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@2289 + specifier: ^1.10.0 + version: 1.10.0 '@appwrite.io/pink-icons': specifier: 0.25.0 version: 0.25.0 '@appwrite.io/pink-icons-svelte': - specifier: ^2.0.0-RC.1 - version: https://try-module.cloud/module/@appwrite/%40appwrite.io%2Fpink-icons-svelte@12707b9(svelte@5.25.3) + specifier: https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@e6b154b + version: https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@e6b154b(svelte@5.25.3) '@appwrite.io/pink-legacy': specifier: ^1.0.3 version: 1.0.3 '@appwrite.io/pink-svelte': - specifier: https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@95bdb79 - version: https://pkg.vc/-/@appwrite/%40appwrite.io%2Fpink-svelte@95bdb79(svelte@5.25.3) + specifier: https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@e6b154b + version: https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@e6b154b(svelte@5.25.3) '@popperjs/core': specifier: ^2.11.8 version: 2.11.8 @@ -257,17 +257,16 @@ packages: '@analytics/type-utils@0.6.2': resolution: {integrity: sha512-TD+xbmsBLyYy/IxFimW/YL/9L2IEnM7/EoV9Aeh56U64Ify8o27HJcKjo38XY9Tcn0uOq1AX3thkKgvtWvwFQg==} - '@appwrite.io/console@https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@2289': - resolution: {tarball: https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@2289} - version: 1.9.0 + '@appwrite.io/console@1.10.0': + resolution: {integrity: sha512-7ErAZgS0djmB41ZFXPTlJH5kBNvJeKv2UHOEcI6uAOyXO4UoVWlhQk0D/3oktNylwOsr/K/98EWfsUDeYbq68w==} '@appwrite.io/pink-icons-svelte@2.0.0-RC.1': resolution: {integrity: sha512-iLFlV55hj8mGuAbmxJGenxN5RaZMmVT4GJb9dv/MP1xBAtYibFq7JvBcxm18qV2KU8c31Rntf+Ub4GL7HwqTYg==} peerDependencies: svelte: ^4.0.0 - '@appwrite.io/pink-icons-svelte@https://try-module.cloud/module/@appwrite/%40appwrite.io%2Fpink-icons-svelte@12707b9': - resolution: {tarball: https://try-module.cloud/module/@appwrite/%40appwrite.io%2Fpink-icons-svelte@12707b9} + '@appwrite.io/pink-icons-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@e6b154b': + resolution: {tarball: https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@e6b154b} version: 2.0.0-RC.1 peerDependencies: svelte: ^4.0.0 @@ -281,8 +280,8 @@ packages: '@appwrite.io/pink-legacy@1.0.3': resolution: {integrity: sha512-GGde5fmPhs+s6/3aFeMPc/kKADG/gTFkYQSy6oBN8pK0y0XNCLrZZgBv+EBbdhwdtqVEWXa0X85Mv9w7jcIlwQ==} - '@appwrite.io/pink-svelte@https://pkg.vc/-/@appwrite/%40appwrite.io%2Fpink-svelte@95bdb79': - resolution: {tarball: https://pkg.vc/-/@appwrite/%40appwrite.io%2Fpink-svelte@95bdb79} + '@appwrite.io/pink-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@e6b154b': + resolution: {tarball: https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@e6b154b} version: 2.0.0-RC.2 peerDependencies: svelte: ^4.0.0 @@ -3646,13 +3645,13 @@ snapshots: '@analytics/type-utils@0.6.2': {} - '@appwrite.io/console@https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@2289': {} + '@appwrite.io/console@1.10.0': {} '@appwrite.io/pink-icons-svelte@2.0.0-RC.1(svelte@5.25.3)': dependencies: svelte: 5.25.3 - '@appwrite.io/pink-icons-svelte@https://try-module.cloud/module/@appwrite/%40appwrite.io%2Fpink-icons-svelte@12707b9(svelte@5.25.3)': + '@appwrite.io/pink-icons-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@e6b154b(svelte@5.25.3)': dependencies: svelte: 5.25.3 @@ -3665,7 +3664,7 @@ snapshots: '@appwrite.io/pink-icons': 1.0.0 the-new-css-reset: 1.11.3 - '@appwrite.io/pink-svelte@https://pkg.vc/-/@appwrite/%40appwrite.io%2Fpink-svelte@95bdb79(svelte@5.25.3)': + '@appwrite.io/pink-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@e6b154b(svelte@5.25.3)': dependencies: '@appwrite.io/pink-icons-svelte': 2.0.0-RC.1(svelte@5.25.3) '@floating-ui/dom': 1.6.13 diff --git a/src/app.html b/src/app.html index 18a92b1fa..7ca4eefe8 100644 --- a/src/app.html +++ b/src/app.html @@ -5,9 +5,9 @@ - - - + + + %sveltekit.head% @@ -40,13 +40,13 @@
Appwrite Logo (null); onMount(() => { - projects = page.data.projects?.projects || []; + projects = page.data.allProjects?.projects || []; }); let projectsToArchive = $derived( diff --git a/src/lib/components/billing/paymentBoxes.svelte b/src/lib/components/billing/paymentBoxes.svelte index be241fdf7..27719cba5 100644 --- a/src/lib/components/billing/paymentBoxes.svelte +++ b/src/lib/components/billing/paymentBoxes.svelte @@ -5,6 +5,8 @@ import { initializeStripe, unmountPaymentElement } from '$lib/stores/stripe'; import { Badge, Card, Layout } from '@appwrite.io/pink-svelte'; import type { PaymentMethodData } from '$lib/sdk/billing'; + import type { PaymentMethod } from '@stripe/stripe-js'; + import StatePicker from './statePicker.svelte'; export let methods: PaymentMethodData[]; export let group: string; @@ -14,6 +16,9 @@ export let disabledCondition: string = null; export let setAsDefault = false; export let showSetAsDefault = false; + export let showState = false; + export let paymentMethod: PaymentMethod | null = null; + export let state: string = ''; let element: HTMLDivElement; let loader: HTMLDivElement; @@ -79,25 +84,29 @@ {/each} {#if group === '$new'} - + {#if showState} + + {:else} + -
-
-
+
+
+
+
+
-
-
- {#if showSetAsDefault} - + {#if showSetAsDefault} + + {/if} {/if} {/if} diff --git a/src/lib/components/billing/paymentModal.svelte b/src/lib/components/billing/paymentModal.svelte index c79602517..72accfd10 100644 --- a/src/lib/components/billing/paymentModal.svelte +++ b/src/lib/components/billing/paymentModal.svelte @@ -2,12 +2,14 @@ import { FakeModal } from '$lib/components'; import { InputText, Button } from '$lib/elements/forms'; import { createEventDispatcher, onMount } from 'svelte'; - import { initializeStripe, submitStripeCard } from '$lib/stores/stripe'; + import { initializeStripe, setPaymentMethod, submitStripeCard } from '$lib/stores/stripe'; import { invalidate } from '$app/navigation'; import { Dependencies } from '$lib/constants'; import { addNotification } from '$lib/stores/notifications'; import { page } from '$app/state'; import { Spinner } from '@appwrite.io/pink-svelte'; + import type { PaymentMethod } from '@stripe/stripe-js'; + import StatePicker from './statePicker.svelte'; export let show = false; @@ -16,10 +18,36 @@ let name: string; let error: string; let modal: FakeModal; + let showState: boolean = false; + let state: string = ''; + let paymentMethod: PaymentMethod | null = null; async function handleSubmit() { try { + if (showState && !state) { + throw Error('Please select a state'); + } + + if (showState) { + const card = await setPaymentMethod(paymentMethod.id, name, state); + modal.closeModal(); + await invalidate(Dependencies.PAYMENT_METHODS); + dispatch('submit', card); + addNotification({ + type: 'success', + message: 'A new payment method has been added to your account' + }); + return; + } + const card = await submitStripeCard(name, page?.params?.organization ?? null); + if (card && Object.hasOwn(card, 'id')) { + if ((card as PaymentMethod).card.country === 'US') { + paymentMethod = card as PaymentMethod; + showState = true; + return; + } + } modal.closeModal(); await invalidate(Dependencies.PAYMENT_METHODS); dispatch('submit', card); @@ -73,28 +101,30 @@ bind:error onSubmit={handleSubmit}> - - -
- {#if isLoading} -
- + {#if showState} + + {:else} + +
+ {#if isLoading} +
+ +
+ {/if} +
+
- {/if} - -
-
-
+ {/if} diff --git a/src/lib/components/billing/state.ts b/src/lib/components/billing/state.ts new file mode 100644 index 000000000..d3f08a113 --- /dev/null +++ b/src/lib/components/billing/state.ts @@ -0,0 +1,238 @@ +export const states: Array<{ name: string; abbreviation: string }> = [ + { + name: 'Alabama', + abbreviation: 'AL' + }, + { + name: 'Alaska', + abbreviation: 'AK' + }, + { + name: 'American Samoa', + abbreviation: 'AS' + }, + { + name: 'Arizona', + abbreviation: 'AZ' + }, + { + name: 'Arkansas', + abbreviation: 'AR' + }, + { + name: 'California', + abbreviation: 'CA' + }, + { + name: 'Colorado', + abbreviation: 'CO' + }, + { + name: 'Connecticut', + abbreviation: 'CT' + }, + { + name: 'Delaware', + abbreviation: 'DE' + }, + { + name: 'District Of Columbia', + abbreviation: 'DC' + }, + { + name: 'Federated States Of Micronesia', + abbreviation: 'FM' + }, + { + name: 'Florida', + abbreviation: 'FL' + }, + { + name: 'Georgia', + abbreviation: 'GA' + }, + { + name: 'Guam', + abbreviation: 'GU' + }, + { + name: 'Hawaii', + abbreviation: 'HI' + }, + { + name: 'Idaho', + abbreviation: 'ID' + }, + { + name: 'Illinois', + abbreviation: 'IL' + }, + { + name: 'Indiana', + abbreviation: 'IN' + }, + { + name: 'Iowa', + abbreviation: 'IA' + }, + { + name: 'Kansas', + abbreviation: 'KS' + }, + { + name: 'Kentucky', + abbreviation: 'KY' + }, + { + name: 'Louisiana', + abbreviation: 'LA' + }, + { + name: 'Maine', + abbreviation: 'ME' + }, + { + name: 'Marshall Islands', + abbreviation: 'MH' + }, + { + name: 'Maryland', + abbreviation: 'MD' + }, + { + name: 'Massachusetts', + abbreviation: 'MA' + }, + { + name: 'Michigan', + abbreviation: 'MI' + }, + { + name: 'Minnesota', + abbreviation: 'MN' + }, + { + name: 'Mississippi', + abbreviation: 'MS' + }, + { + name: 'Missouri', + abbreviation: 'MO' + }, + { + name: 'Montana', + abbreviation: 'MT' + }, + { + name: 'Nebraska', + abbreviation: 'NE' + }, + { + name: 'Nevada', + abbreviation: 'NV' + }, + { + name: 'New Hampshire', + abbreviation: 'NH' + }, + { + name: 'New Jersey', + abbreviation: 'NJ' + }, + { + name: 'New Mexico', + abbreviation: 'NM' + }, + { + name: 'New York', + abbreviation: 'NY' + }, + { + name: 'North Carolina', + abbreviation: 'NC' + }, + { + name: 'North Dakota', + abbreviation: 'ND' + }, + { + name: 'Northern Mariana Islands', + abbreviation: 'MP' + }, + { + name: 'Ohio', + abbreviation: 'OH' + }, + { + name: 'Oklahoma', + abbreviation: 'OK' + }, + { + name: 'Oregon', + abbreviation: 'OR' + }, + { + name: 'Palau', + abbreviation: 'PW' + }, + { + name: 'Pennsylvania', + abbreviation: 'PA' + }, + { + name: 'Puerto Rico', + abbreviation: 'PR' + }, + { + name: 'Rhode Island', + abbreviation: 'RI' + }, + { + name: 'South Carolina', + abbreviation: 'SC' + }, + { + name: 'South Dakota', + abbreviation: 'SD' + }, + { + name: 'Tennessee', + abbreviation: 'TN' + }, + { + name: 'Texas', + abbreviation: 'TX' + }, + { + name: 'Utah', + abbreviation: 'UT' + }, + { + name: 'Vermont', + abbreviation: 'VT' + }, + { + name: 'Virgin Islands', + abbreviation: 'VI' + }, + { + name: 'Virginia', + abbreviation: 'VA' + }, + { + name: 'Washington', + abbreviation: 'WA' + }, + { + name: 'West Virginia', + abbreviation: 'WV' + }, + { + name: 'Wisconsin', + abbreviation: 'WI' + }, + { + name: 'Wyoming', + abbreviation: 'WY' + } +]; diff --git a/src/lib/components/billing/statePicker.svelte b/src/lib/components/billing/statePicker.svelte new file mode 100644 index 000000000..839b31dd9 --- /dev/null +++ b/src/lib/components/billing/statePicker.svelte @@ -0,0 +1,44 @@ + + + + {#if card} + + + + ending in {card.card?.last4} + + + {card.card.country} + {card.billing_details.address.postal_code} + + + {/if} + + + + To complete the billing information, select your state so we can apply the correct taxes + and meet U.S. legal requirements. + + + + ({ + label: state.name, + value: state.abbreviation, + id: state.abbreviation.toLowerCase() + }))} /> + diff --git a/src/lib/components/code.svelte b/src/lib/components/code.svelte index f08dee3da..9e4e11636 100644 --- a/src/lib/components/code.svelte +++ b/src/lib/components/code.svelte @@ -8,7 +8,8 @@
-
+ { + e.preventDefault(); + addFilterAndReset(); + }}> {:else if column.type === 'datetime'} {#key value} - + {/key} {:else} diff --git a/src/lib/components/filters/filtersModal.svelte b/src/lib/components/filters/filtersModal.svelte index 07d410ad2..e69f2af1a 100644 --- a/src/lib/components/filters/filtersModal.svelte +++ b/src/lib/components/filters/filtersModal.svelte @@ -158,7 +158,7 @@ bind:value /> {:else if column.type === 'datetime'} {#key value} - + {/key} {:else} diff --git a/src/lib/components/sidebar.svelte b/src/lib/components/sidebar.svelte index 732c43555..9c128d556 100644 --- a/src/lib/components/sidebar.svelte +++ b/src/lib/components/sidebar.svelte @@ -124,7 +124,7 @@
-
+
{#if progressCard} {projectOption.name} {/each} -
- -
-
+ {#if project} + + {/if} {:else if $isSmallViewport}
@@ -359,6 +360,29 @@ {/if} diff --git a/src/lib/helpers/regions.ts b/src/lib/helpers/regions.ts index 9f04f3fda..82010ee0a 100644 --- a/src/lib/helpers/regions.ts +++ b/src/lib/helpers/regions.ts @@ -6,6 +6,7 @@ type RegionOption = { value: string; disabled: boolean; leadingHtml: string; + badge?: string; }; export function filterRegions(regions: Models.ConsoleRegion[]): RegionOption[] { @@ -22,6 +23,7 @@ export function filterRegions(regions: Models.ConsoleRegion[]): RegionOption[] { label: region.name, value: region.$id, disabled: region.disabled || !region.available, - leadingHtml: `Region flag` + leadingHtml: `Region flag`, + badge: region.disabled || !region.available ? 'Coming soon' : undefined })); } diff --git a/src/lib/images/promos/appwrite-general-availability-dark.png b/src/lib/images/promos/appwrite-general-availability-dark.png new file mode 100644 index 000000000..bd1449856 Binary files /dev/null and b/src/lib/images/promos/appwrite-general-availability-dark.png differ diff --git a/src/lib/images/promos/appwrite-general-availability-light.png b/src/lib/images/promos/appwrite-general-availability-light.png new file mode 100644 index 000000000..ed2f582a0 Binary files /dev/null and b/src/lib/images/promos/appwrite-general-availability-light.png differ diff --git a/src/lib/images/promos/atomic-numeric-operations-dark.png b/src/lib/images/promos/atomic-numeric-operations-dark.png new file mode 100644 index 000000000..bbd15d5a6 Binary files /dev/null and b/src/lib/images/promos/atomic-numeric-operations-dark.png differ diff --git a/src/lib/images/promos/atomic-numeric-operations-light.png b/src/lib/images/promos/atomic-numeric-operations-light.png new file mode 100644 index 000000000..9eb336fe8 Binary files /dev/null and b/src/lib/images/promos/atomic-numeric-operations-light.png differ diff --git a/src/lib/images/promos/encrypted-attribute-dark.png b/src/lib/images/promos/encrypted-attribute-dark.png deleted file mode 100644 index 6e7142552..000000000 Binary files a/src/lib/images/promos/encrypted-attribute-dark.png and /dev/null differ diff --git a/src/lib/images/promos/encrypted-attribute-light.png b/src/lib/images/promos/encrypted-attribute-light.png deleted file mode 100644 index 1da958194..000000000 Binary files a/src/lib/images/promos/encrypted-attribute-light.png and /dev/null differ diff --git a/src/lib/images/promos/opt-relation-dark.png b/src/lib/images/promos/opt-relation-dark.png deleted file mode 100644 index 2c22a929b..000000000 Binary files a/src/lib/images/promos/opt-relation-dark.png and /dev/null differ diff --git a/src/lib/images/promos/opt-relation-light.png b/src/lib/images/promos/opt-relation-light.png deleted file mode 100644 index efd76f765..000000000 Binary files a/src/lib/images/promos/opt-relation-light.png and /dev/null differ diff --git a/src/lib/layout/containerHeader.svelte b/src/lib/layout/containerHeader.svelte index c33adf668..1e5a9fb95 100644 --- a/src/lib/layout/containerHeader.svelte +++ b/src/lib/layout/containerHeader.svelte @@ -1,7 +1,9 @@ diff --git a/src/routes/(console)/organization-[organization]/domains/retryDomainModal.svelte b/src/routes/(console)/organization-[organization]/domains/retryDomainModal.svelte index d2a3a1780..d1711eba6 100644 --- a/src/routes/(console)/organization-[organization]/domains/retryDomainModal.svelte +++ b/src/routes/(console)/organization-[organization]/domains/retryDomainModal.svelte @@ -28,6 +28,7 @@ async function retryDomain() { try { + error = null; const domain = await sdk.forConsole.domains.updateNameservers(selectedDomain.$id); if (domain.nameservers.toLowerCase() === 'appwrite') { show = false; diff --git a/src/routes/(console)/project-[region]-[project]/auth/(providers)/appleOAuth.svelte b/src/routes/(console)/project-[region]-[project]/auth/(providers)/appleOAuth.svelte index f953c690e..788922eb4 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/(providers)/appleOAuth.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/(providers)/appleOAuth.svelte @@ -60,10 +60,11 @@ label="Services ID" autofocus={true} placeholder="com.company.appname" - bind:value={appId} /> - - - + bind:value={appId} + required /> + + + To complete set up, add this OAuth2 redirect URI to your {provider.name} app configuration. @@ -73,10 +74,13 @@ diff --git a/src/routes/(console)/project-[region]-[project]/auth/(providers)/auth0OAuth.svelte b/src/routes/(console)/project-[region]-[project]/auth/(providers)/auth0OAuth.svelte index 510359bc3..5f97318c8 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/(providers)/auth0OAuth.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/(providers)/auth0OAuth.svelte @@ -56,18 +56,21 @@ label="Client ID" autofocus={true} placeholder="Enter ID" - bind:value={appId} /> + bind:value={appId} + required /> + bind:value={clientSecret} + required /> + placeholder="your-tenant.auth0.com" + bind:value={auth0Domain} + required /> To complete set up, add this OAuth2 redirect URI to your {provider.name} app configuration. @@ -77,10 +80,12 @@ diff --git a/src/routes/(console)/project-[region]-[project]/auth/(providers)/authentikOAuth.svelte b/src/routes/(console)/project-[region]-[project]/auth/(providers)/authentikOAuth.svelte index 0c986847f..d367dbd77 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/(providers)/authentikOAuth.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/(providers)/authentikOAuth.svelte @@ -60,18 +60,21 @@ label="Client ID" autofocus={true} placeholder="Enter ID" - bind:value={appId} /> + bind:value={appId} + required /> + bind:value={clientSecret} + required /> + bind:value={authentikDomain} + required /> To complete set up, add this OAuth2 redirect URI to your {provider.name} app configuration. @@ -81,10 +84,12 @@ diff --git a/src/routes/(console)/project-[region]-[project]/auth/(providers)/gitlabOAuth.svelte b/src/routes/(console)/project-[region]-[project]/auth/(providers)/gitlabOAuth.svelte index 5c54a1942..c434ebd5a 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/(providers)/gitlabOAuth.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/(providers)/gitlabOAuth.svelte @@ -55,18 +55,16 @@ label="App ID" autofocus={true} placeholder="Enter ID" - bind:value={appId} /> + bind:value={appId} + required /> - + bind:value={clientSecret} + required /> + To complete set up, add this OAuth2 redirect URI to your {provider.name} app configuration. @@ -76,10 +74,11 @@ diff --git a/src/routes/(console)/project-[region]-[project]/auth/(providers)/googleOAuth.svelte b/src/routes/(console)/project-[region]-[project]/auth/(providers)/googleOAuth.svelte index c56d54ff5..cf01f41a9 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/(providers)/googleOAuth.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/(providers)/googleOAuth.svelte @@ -54,13 +54,15 @@ label="App ID" autofocus={true} placeholder="Enter ID" - bind:value={appId} /> + bind:value={appId} + required /> + bind:value={secret} + required /> To complete the setup, create an OAuth2 client ID with "Web application" as the application type, then add this redirect URI to your {provider.name} configuration. @@ -74,9 +76,9 @@ diff --git a/src/routes/(console)/project-[region]-[project]/auth/(providers)/mainOAuth.svelte b/src/routes/(console)/project-[region]-[project]/auth/(providers)/mainOAuth.svelte index 85fcdb91d..8e33f1022 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/(providers)/mainOAuth.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/(providers)/mainOAuth.svelte @@ -55,13 +55,15 @@ label="App ID" autofocus={true} placeholder="Enter ID" - bind:value={appId} /> + bind:value={appId} + required /> + bind:value={secret} + required /> To complete set up, add this OAuth2 redirect URI to your {provider.name} app configuration. @@ -73,9 +75,9 @@ diff --git a/src/routes/(console)/project-[region]-[project]/auth/(providers)/microsoftOAuth.svelte b/src/routes/(console)/project-[region]-[project]/auth/(providers)/microsoftOAuth.svelte index 253c7b429..782df6879 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/(providers)/microsoftOAuth.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/(providers)/microsoftOAuth.svelte @@ -42,9 +42,8 @@ clientSecret && tenantID ? JSON.stringify({ clientSecret, tenantID }) : provider.secret; - - {provider.name} OAuth2 settings -

+ +

To use {provider.name} authentication in your application, first fill in this form. For more info you can @@ -57,13 +56,15 @@ label="Application (client) ID" autofocus={true} placeholder="Enter ID" - bind:value={appId} /> + bind:value={appId} + required /> + bind:value={clientSecret} + required /> diff --git a/src/routes/(console)/project-[region]-[project]/auth/(providers)/oidcOAuth.svelte b/src/routes/(console)/project-[region]-[project]/auth/(providers)/oidcOAuth.svelte index 90a61e14f..40637fb91 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/(providers)/oidcOAuth.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/(providers)/oidcOAuth.svelte @@ -78,33 +78,39 @@ label="Client ID" autofocus={true} placeholder="Enter ID" - bind:value={appId} /> + bind:value={appId} + required /> + bind:value={clientSecret} + required /> + bind:value={wellKnownEndpoint} + required={!authorizationEndpoint && !tokenEndpoint && !userinfoEndpoint} /> + bind:value={authorizationEndpoint} + required={!wellKnownEndpoint} /> + bind:value={tokenEndpoint} + required={!wellKnownEndpoint} /> + bind:value={userinfoEndpoint} + required={!wellKnownEndpoint} /> To complete set up, add this OAuth2 redirect URI to your {provider.name} app configuration. @@ -115,10 +121,13 @@ diff --git a/src/routes/(console)/project-[region]-[project]/auth/(providers)/oktaOAuth.svelte b/src/routes/(console)/project-[region]-[project]/auth/(providers)/oktaOAuth.svelte index f1c7a30be..65e832d3b 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/(providers)/oktaOAuth.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/(providers)/oktaOAuth.svelte @@ -47,9 +47,14 @@ : provider.secret; - - {provider.name} OAuth2 settings -

+ +

To use {provider.name} authentication in your application, first fill in this form. For more info you can + bind:value={appId} + required /> + bind:value={clientSecret} + required /> + bind:value={oktaDomain} + required /> + bind:value={authorizationServerId} + required /> To complete set up, add this OAuth2 redirect URI to your {provider.name} app configuration. @@ -88,10 +97,13 @@ diff --git a/src/routes/(console)/project-[region]-[project]/auth/user-[user]/sessions/+page.svelte b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/sessions/+page.svelte index 55116fda4..f39e39bca 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/user-[user]/sessions/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/sessions/+page.svelte @@ -1,6 +1,6 @@ {#if data.platforms.platforms.length} - + Name Platform type + Identifier Last updated {#each data.platforms.platforms as platform} @@ -137,6 +138,13 @@ {PlatformTypes[platform.type]} + + {#if platform.type.includes('web') || platform.type === 'web'} + {platform.hostname || '—'} + {:else} + {platform.key || platform.hostname || '—'} + {/if} + {#if platform.$updatedAt} diff --git a/src/routes/(console)/project-[region]-[project]/overview/platforms/createWeb.svelte b/src/routes/(console)/project-[region]-[project]/overview/platforms/createWeb.svelte index 2a75050fa..14b4a0358 100644 --- a/src/routes/(console)/project-[region]-[project]/overview/platforms/createWeb.svelte +++ b/src/routes/(console)/project-[region]-[project]/overview/platforms/createWeb.svelte @@ -45,6 +45,7 @@ JavascriptFrameworkIcon } from './components/index'; import { extendedHostnameRegex } from '$lib/helpers/string'; + import { project } from '../../store'; export let key; @@ -57,6 +58,7 @@ const projectId = page.params.project; const updateConfigCode = (prefix = '') => `${prefix}APPWRITE_PROJECT_ID = "${projectId}" +${prefix}APPWRITE_PROJECT_NAME = "${$project.name}" ${prefix}APPWRITE_ENDPOINT = "${sdk.forProject(page.params.region, page.params.project).client.config.endpoint}" `; type FrameworkType = { @@ -126,11 +128,11 @@ ${prefix}APPWRITE_ENDPOINT = "${sdk.forProject(page.params.region, page.params.p smallIcon: IconAngular, portNumber: 4200, runCommand: 'npm run start', - updateConfigCode: `appwriteEndpoint: '${sdk.forProject(page.params.region, page.params.project).client.config.endpoint}',\nappwriteProjectId:'${projectId}'` + updateConfigCode: `appwriteEndpoint: '${sdk.forProject(page.params.region, page.params.project).client.config.endpoint}',\nappwriteProjectId: '${projectId}',\nappwriteProjectName: '${$project.name}'` }, { key: 'js', - label: 'Javascript', + label: 'JavaScript', icon: JavascriptFrameworkIcon, smallIcon: IconJs, portNumber: 5173, @@ -294,11 +296,9 @@ ${prefix}APPWRITE_ENDPOINT = "${sdk.forProject(page.params.region, page.params.p to reflect the values below: {:else} 2. Add your Appwrite credentials to then rename it to if needed. + >2. Copy the file , rename it + to + and update the configuration settings. {/if} diff --git a/src/routes/(console)/project-[region]-[project]/settings/domains/add-domain/+page.svelte b/src/routes/(console)/project-[region]-[project]/settings/domains/add-domain/+page.svelte index 6f657be43..7a07027c3 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/domains/add-domain/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/domains/add-domain/+page.svelte @@ -56,9 +56,17 @@ await goto(routeBase); await invalidate(Dependencies.DOMAINS); } else { - await goto( - `${routeBase}/add-domain/verify-${domainName}?rule=${rule.$id}&domain=${domain.$id}` - ); + let redirect = `${routeBase}/add-domain/verify-${domainName}?rule=${rule.$id}`; + + if (isCloud) { + /** + * Domains are only on cloud! + * Self-hosted instances have rules. + */ + redirect += `&domain=${domain.$id}`; + } + + await goto(redirect); await invalidate(Dependencies.DOMAINS); } } catch (error) { diff --git a/src/routes/(console)/project-[region]-[project]/settings/domains/store.ts b/src/routes/(console)/project-[region]-[project]/settings/domains/store.ts deleted file mode 100644 index 8d7cb0d66..000000000 --- a/src/routes/(console)/project-[region]-[project]/settings/domains/store.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { Column } from '$lib/helpers/types'; -import { writable } from 'svelte/store'; - -export const columns = writable([ - { - id: 'domain', - title: 'Domain', - type: 'string', - format: 'string', - width: { min: 200, max: 550 } - }, - - { - id: 'redirectUrl', - title: 'Redirect to', - type: 'string', - width: { min: 120, max: 400 } - }, - { - id: 'deploymentVcsProviderBranch', - title: 'Production branch', - type: 'string', - width: { min: 90, max: 220 } - } -]); diff --git a/src/routes/(console)/project-[region]-[project]/settings/domains/table.svelte b/src/routes/(console)/project-[region]-[project]/settings/domains/table.svelte index d2de8f381..ee740c672 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/domains/table.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/domains/table.svelte @@ -15,7 +15,6 @@ } from '@appwrite.io/pink-svelte'; import DeleteDomainModal from './deleteDomainModal.svelte'; import RetryDomainModal from './retryDomainModal.svelte'; - import { columns } from './store'; import { regionalProtocol } from '../../store'; let { @@ -27,11 +26,21 @@ let showDelete = $state(false); let showRetry = $state(false); let selectedDomain: Models.ProxyRule = $state(null); + + const columns = [ + { + id: 'domain', + title: 'Domain', + type: 'string', + format: 'string', + width: { min: 200, max: 550 } + } + ]; - + - {#each $columns as { id, title }} + {#each columns as { id, title }} {title} @@ -40,7 +49,7 @@ {#each domains.rules as domain} - {#each $columns as column} + {#each columns as column} {#if column.id === 'domain'} diff --git a/src/routes/(console)/project-[region]-[project]/settings/webhooks/messageStatusPill.svelte b/src/routes/(console)/project-[region]-[project]/settings/webhooks/messageStatusPill.svelte index 75e6dd5a6..4a46d8bf3 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/webhooks/messageStatusPill.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/webhooks/messageStatusPill.svelte @@ -1,16 +1,14 @@ - - - - - {enabled ? 'enabled' : 'stopped'} - - + + + diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/retryDomainModal.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/retryDomainModal.svelte index 338c2e01f..9bd2efc5f 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/retryDomainModal.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/retryDomainModal.svelte @@ -59,6 +59,7 @@ trackEvent(Submit.DomainUpdateVerification); } catch (e) { error = + e.message ?? 'Domain verification failed. Please check your domain settings or try again later'; trackError(e, Submit.DomainUpdateVerification); } diff --git a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/+page.svelte b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/+page.svelte index 1e081fb8e..70acccf34 100644 --- a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/+page.svelte @@ -5,7 +5,7 @@ import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; import { Avatar, Empty, EmptySearch, PaginationWithLimit, SearchQuery } from '$lib/components'; import { Dependencies } from '$lib/constants'; - import { Pill } from '$lib/elements'; + import { Badge } from '@appwrite.io/pink-svelte'; import { Button } from '$lib/elements/forms'; import { calculateSize } from '$lib/helpers/sizeConvertion'; import { Container } from '$lib/layout'; @@ -129,7 +129,7 @@ {file.name}

diff --git a/src/routes/(console)/project-[region]-[project]/updateVariables.svelte b/src/routes/(console)/project-[region]-[project]/updateVariables.svelte index edbf38d87..eaf2da3cb 100644 --- a/src/routes/(console)/project-[region]-[project]/updateVariables.svelte +++ b/src/routes/(console)/project-[region]-[project]/updateVariables.svelte @@ -38,6 +38,7 @@ import { page } from '$app/state'; import UpdateVariablesModal from './updateVariablesModal.svelte'; import SecretVariableModal from './secretVariableModal.svelte'; + import { Confirm } from '$lib/components'; export let variableList: Models.VariableList; export let globalVariableList: Models.VariableList | undefined = undefined; @@ -64,6 +65,8 @@ let showEditorModal = false; let showUpdate = false; let showSecretModal = false; + let showDeleteModal = false; + let deleteError: string; let offset = 0; const limit = 10; @@ -134,9 +137,11 @@ } } - async function handleVariableDeleted(variable: Models.Variable) { + async function handleVariableDeleted() { try { - await sdkDeleteVariable(variable.$id); + await sdkDeleteVariable(selectedVar.$id); + showDeleteModal = false; + selectedVar = null; addNotification({ type: 'success', message: `${$project.name} ${ @@ -145,10 +150,7 @@ }); trackEvent(Submit.VariableDelete); } catch (error) { - addNotification({ - type: 'error', - message: error.message - }); + deleteError = error.message; trackError(error, Submit.VariableDelete); } } @@ -402,7 +404,8 @@ status="danger" trailingIcon={IconTrash} on:click={async (e) => { - handleVariableDeleted(variable); + selectedVar = variable; + showDeleteModal = true; toggle(e); }}> Delete @@ -480,3 +483,13 @@ {variableList} bind:show={showVariablesUpload} /> {/if} + +{#if showDeleteModal} + +

Are you sure you want to delete this variable? This action is irreversible.

+
+{/if} diff --git a/svelte.config.js b/svelte.config.js index 2939a3e1b..18b668790 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -26,7 +26,7 @@ const config = { precompress: true }), paths: { - base: '/console' + base: process.env.PREVIEW ? '' : '/console' } }, vitePlugin: {