diff --git a/src/lib/helpers/regions.ts b/src/lib/helpers/regions.ts new file mode 100644 index 0000000000..9f04f3fdaa --- /dev/null +++ b/src/lib/helpers/regions.ts @@ -0,0 +1,27 @@ +import { getFlagUrl } from '$lib/helpers/flag'; +import type { Models } from '@appwrite.io/console'; + +type RegionOption = { + label: string; + value: string; + disabled: boolean; + leadingHtml: string; +}; + +export function filterRegions(regions: Models.ConsoleRegion[]): RegionOption[] { + if (!regions.length) return []; + + return regions + .filter((region) => region.$id !== 'default') + .sort((a, b) => { + if (a.disabled && !b.disabled) return 1; + if (!a.disabled && b.disabled) return -1; + return a.name.localeCompare(b.name); + }) + .map((region) => ({ + label: region.name, + value: region.$id, + disabled: region.disabled || !region.available, + leadingHtml: `Region flag` + })); +} diff --git a/src/lib/layout/createProject.svelte b/src/lib/layout/createProject.svelte index 5c206297ea..7d368dde06 100644 --- a/src/lib/layout/createProject.svelte +++ b/src/lib/layout/createProject.svelte @@ -5,6 +5,7 @@ import { getFlagUrl } from '$lib/helpers/flag'; import { isCloud } from '$lib/system.js'; import type { Models } from '@appwrite.io/console'; + import { filterRegions } from '$lib/helpers/regions'; export let projectName: string; export let id: string; @@ -13,25 +14,6 @@ export let showTitle = true; let showCustomId = false; - - function getRegions() { - return regions - .filter((region) => region.$id !== 'default') - .sort((regionA, regionB) => { - if (regionA.disabled && !regionB.disabled) { - return 1; - } - return regionA.name > regionB.name ? 1 : -1; - }) - .map((region) => { - return { - label: region.name, - value: region.$id, - leadingHtml: `Region flag`, - disabled: region.disabled || !region.available - }; - }); - } @@ -69,7 +51,7 @@ Region cannot be changed after creation diff --git a/src/routes/(console)/(migration-wizard)/index.ts b/src/routes/(console)/(migration-wizard)/index.ts index 9c065b9bf0..fcde1e141a 100644 --- a/src/routes/(console)/(migration-wizard)/index.ts +++ b/src/routes/(console)/(migration-wizard)/index.ts @@ -3,6 +3,7 @@ import { wizard } from '$lib/stores/wizard'; import { requestedMigration } from '$routes/store'; import { get, writable } from 'svelte/store'; import Wizard from './wizard.svelte'; +import { Region } from '@appwrite.io/console'; export const formData = createMigrationFormStore(); @@ -18,5 +19,6 @@ export function openMigrationWizard() { } export const selectedProject = writable(null); +export const selectedRegion = writable(Region.Fra); export const provider = createMigrationProviderStore(); diff --git a/src/routes/(console)/(migration-wizard)/resource-form.svelte b/src/routes/(console)/(migration-wizard)/resource-form.svelte index d438e4fd85..103d084b21 100644 --- a/src/routes/(console)/(migration-wizard)/resource-form.svelte +++ b/src/routes/(console)/(migration-wizard)/resource-form.svelte @@ -1,12 +1,12 @@ @@ -148,174 +133,42 @@ {/if} {#if error} - - Please check if your credentials are filled in correctly in the previous step + + {#if migrationType === 'provider'} + Please double-check your credentials from the previous step and try again. + {:else} + The API key required for the migration may no longer be valid or has expired, please + verify and start migration again. + {/if} - {/if} - - - - - - - - - - {#if resources?.includes('user')} - - - - -
- -
+ {:else} + + + + + + + - {/if} - - {#if resources?.includes('database')} - - -
+ {#each Object.entries($formData) as [groupKey, formGroup]} + {#if shouldRenderGroup(groupKey)} -
-
- {/if} - - {#if resources?.includes('function') && isVersionAtLeast(version, '1.4.0')} - - - - {#if resources?.includes('environment-variable') || resources?.includes('deployment')} -
- - {#if resources?.includes('environment-variable')} - - {/if} - - {#if resources?.includes('deployment')} - - {/if} - -
+ {error} + {formGroup} + groupKey={getAsType(groupKey)} + reportValue={report?.[getReportKey(groupKey)]} /> {/if} -
- {/if} - - {#if resources?.includes('bucket') && resources?.includes('file')} - {@const storageSize = report?.size >= 0 ? `${report?.size.toFixed(2)}MB` : undefined} - - - -
- - Import all buckets - {#if $provider.provider !== 'firebase' && report?.bucket} - {report.bucket} - {/if} - and files - {#if $provider.provider !== 'firebase' && report?.file} - {report.file} - {/if} - -
-
+ {/each} {/if}
- - - diff --git a/src/routes/(console)/(migration-wizard)/wizard.svelte b/src/routes/(console)/(migration-wizard)/wizard.svelte index e0b296759f..99c23b7d24 100644 --- a/src/routes/(console)/(migration-wizard)/wizard.svelte +++ b/src/routes/(console)/(migration-wizard)/wizard.svelte @@ -1,52 +1,388 @@ - + + + {#if !showResources} + + {#if organizations.length >= 1} +
+ ({ + label: project.name, + value: project.$id + }))} + disabled={loadingProjects} /> +
+ {/if} + +
+ {#if loadingProjects} + + + + + + + + {:else} + + + + Import data to an existing project + + + + Import data to a new project + + + + {#if projectType === 'existing'} + ({ + label: p.name, + value: p.$id + }))} /> + {:else} + + + + {#if isCloud && $regions.regions.length > 0} + + Region cannot be changed after creation + {/if} + + {/if} + + { + if (isExisting) { + showResources = true; + } else { + const project = await createNewProject(); + if (project !== null) { + projectSdkInstance = sdk.forProject( + project.region, + project.$id + ); + showResources = true; + } + } + }}> + {#if creatingProject} + + {/if} + + Next + + + + {/if} +
+
+ {:else} + + + + + + + {capitalize(getProjectName())} + + + + (showResources = !showResources)}> + Update + + + + {/if} + + {#if showResources} +
+ + + +
+ {/if} +
+ + + + + Good to know + + + + + + + + Project settings are not imported + You will need to set service and project settings manually. + + + + + + + + + + Keep your organization plan's limits in mind + Make sure to have enough storage in your organization plan when importing files. + + + + + + {@const isFirebase = $provider.provider === 'firebase'} + + + + + + {isFirebase + ? 'Possible charges by Firebase' + : 'Transfer is free of charge'} + + + {#if isFirebase} + Appwrite does not impose charges for importing data, but please note + that Firebase may have its own pricing for this service + {:else} + You won't be charged for Appwrite bandwidth usage for importing data + {/if} + + + + + + + + (showExitModal = true)}> + Cancel + + + + {#if migrationStarted} + + {/if} + Create + + +
diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte index a7c0b4cc37..e86559bae4 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte @@ -1,34 +1,112 @@ - - - - - +{#if !formGroupChildren.length} +
+ +
+{:else} + + + {#each formGroupChildren as key} +
+
- {/if} + {/each}
-
-
+ +{/if} diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/step1.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/step1.svelte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/step2.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/step2.svelte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/routes/(public)/template-[template]/+page.svelte b/src/routes/(public)/template-[template]/+page.svelte index 0ea3ff5315..33d4d6ed62 100644 --- a/src/routes/(public)/template-[template]/+page.svelte +++ b/src/routes/(public)/template-[template]/+page.svelte @@ -4,7 +4,6 @@ import CustomId from '$lib/components/customId.svelte'; import { SvgIcon } from '$lib/components/index.js'; import { Button, Form, InputSelect } from '$lib/elements/forms'; - import { getFlagUrl } from '$lib/helpers/flag.js'; import type { AllowedRegions } from '$lib/sdk/billing.js'; import { app } from '$lib/stores/app'; import { addNotification } from '$lib/stores/notifications'; @@ -23,6 +22,7 @@ Tag, Typography } from '@appwrite.io/pink-svelte'; + import { filterRegions } from '$lib/helpers/regions'; let { data } = $props(); @@ -37,25 +37,6 @@ let regions = $state>([]); let id = $state(); - function getRegions() { - return regions - .filter((region) => region.$id !== 'default') - .sort((regionA, regionB) => { - if (regionA.disabled && !regionB.disabled) { - return 1; - } - return regionA.name > regionB.name ? 1 : -1; - }) - .map((region) => { - return { - label: region.name, - value: region.$id, - leadingHtml: `Region flag`, - disabled: region.disabled - }; - }); - } - function isSiteTemplate( template: Models.TemplateFunction | Models.TemplateSite, product: 'site' | 'function' @@ -243,7 +224,7 @@ required bind:value={region} placeholder="Select a region" - options={getRegions()} + options={filterRegions(regions)} label="Region" /> Region cannot be changed after creation