update: layout, copies,

This commit is contained in:
Darshan
2025-03-06 13:07:55 +05:30
parent e1e8890625
commit 125fb5e730
7 changed files with 144 additions and 143 deletions
+2 -2
View File
@@ -21,9 +21,9 @@
"dependencies": {
"@appwrite.io/console": "https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@ac51fcb",
"@appwrite.io/pink-icons": "0.25.0",
"@appwrite.io/pink-icons-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@f57e0157 ",
"@appwrite.io/pink-icons-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@291 ",
"@appwrite.io/pink-legacy": "^1.0.2",
"@appwrite.io/pink-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@f57e0157",
"@appwrite.io/pink-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@291",
"@popperjs/core": "^2.11.8",
"@sentry/sveltekit": "^8.38.0",
"@stripe/stripe-js": "^3.5.0",
+16 -16
View File
@@ -15,14 +15,14 @@ importers:
specifier: 0.25.0
version: 0.25.0
'@appwrite.io/pink-icons-svelte':
specifier: 'https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@f57e0157 '
version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@f57e0157(svelte@4.2.19)
specifier: 'https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@291 '
version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@291 (svelte@4.2.19)
'@appwrite.io/pink-legacy':
specifier: ^1.0.2
version: 1.0.2
'@appwrite.io/pink-svelte':
specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@f57e0157
version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@f57e0157(react-dom@18.3.1(react@18.3.1))(svelte@4.2.19)
specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@291
version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@291(react-dom@18.3.1(react@18.3.1))(svelte@4.2.19)
'@popperjs/core':
specifier: ^2.11.8
version: 2.11.8
@@ -107,7 +107,7 @@ importers:
version: 6.6.3
'@testing-library/svelte':
specifier: ^5.2.4
version: 5.2.7(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.5)(sass@1.85.1))(vitest@1.6.1)
version: 5.2.7(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.5)(sass@1.85.1))(vitest@1.6.1(@types/node@22.13.5)(@vitest/ui@1.6.1)(jsdom@22.1.0)(sass@1.85.1))
'@testing-library/user-event':
specifier: ^14.5.2
version: 14.6.1(@testing-library/dom@10.4.0)
@@ -215,14 +215,14 @@ packages:
resolution: {tarball: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@ac51fcb}
version: 1.2.1
'@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@f57e0157':
resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@f57e0157}
'@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@291 ':
resolution: {tarball: 'https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@291 '}
version: 1.0.0-next.7
peerDependencies:
svelte: ^4.0.0
'@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@f57e0157006c846dc899e7bcdb83e5c0fb3c3149':
resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@f57e0157006c846dc899e7bcdb83e5c0fb3c3149}
'@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@aedaf83a0e105ca863a264ac2c1bffa001ddc8cf':
resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@aedaf83a0e105ca863a264ac2c1bffa001ddc8cf}
version: 1.0.0-next.7
peerDependencies:
svelte: ^4.0.0
@@ -236,8 +236,8 @@ packages:
'@appwrite.io/pink-legacy@1.0.2':
resolution: {integrity: sha512-1AYNcfbV+x0Tyj56CoieSq5g7+u+7F5/LDVN/z+Hx1kp9gj7xc1eT39Dy832xxfihImF6ksjp0FXEMVSBR8cew==}
'@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@f57e0157':
resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@f57e0157}
'@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@291':
resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@291}
version: 1.0.0-next.85
peerDependencies:
react-dom: ^18.0.0
@@ -4099,11 +4099,11 @@ snapshots:
'@appwrite.io/console@https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@ac51fcb': {}
'@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@f57e0157(svelte@4.2.19)':
'@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@291 (svelte@4.2.19)':
dependencies:
svelte: 4.2.19
'@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@f57e0157006c846dc899e7bcdb83e5c0fb3c3149(svelte@4.2.19)':
'@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@aedaf83a0e105ca863a264ac2c1bffa001ddc8cf(svelte@4.2.19)':
dependencies:
svelte: 4.2.19
@@ -4116,9 +4116,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@f57e0157(react-dom@18.3.1(react@18.3.1))(svelte@4.2.19)':
'@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@291(react-dom@18.3.1(react@18.3.1))(svelte@4.2.19)':
dependencies:
'@appwrite.io/pink-icons-svelte': https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@f57e0157006c846dc899e7bcdb83e5c0fb3c3149(svelte@4.2.19)
'@appwrite.io/pink-icons-svelte': https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@aedaf83a0e105ca863a264ac2c1bffa001ddc8cf(svelte@4.2.19)
'@floating-ui/dom': 1.6.13
'@melt-ui/pp': 0.3.2(@melt-ui/svelte@0.86.3(svelte@4.2.19))(svelte@4.2.19)
'@melt-ui/svelte': 0.86.3(svelte@4.2.19)
@@ -5375,7 +5375,7 @@ snapshots:
lodash: 4.17.21
redent: 3.0.0
'@testing-library/svelte@5.2.7(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.5)(sass@1.85.1))(vitest@1.6.1)':
'@testing-library/svelte@5.2.7(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.5)(sass@1.85.1))(vitest@1.6.1(@types/node@22.13.5)(@vitest/ui@1.6.1)(jsdom@22.1.0)(sass@1.85.1))':
dependencies:
'@testing-library/dom': 10.4.0
svelte: 4.2.19
@@ -15,13 +15,14 @@
import type { Models } from '@appwrite.io/console';
import ImportReport from '$routes/(console)/project-[project]/settings/migrations/(import)/importReport.svelte';
export let errorInResources: boolean;
export let formData: ReturnType<typeof createMigrationFormStore>;
export let provider: ReturnType<typeof createMigrationProviderStore>;
export let projectSdk: ReturnType<typeof getSdkForProject>;
type ValueOf<T> = T[keyof T];
type FormData = WritableValue<typeof formData>;
// TL;DR of this type: It gets a object with two levels (in this case FormData)
// TL;DR of this type: It gets an object with two levels (in this case FormData)
// And returns a join of the keys with a dot between them.
// e.g. If FormData was { users: { root: boolean, teams: boolean } }
// The type would be 'users.root' | 'users.teams'
@@ -131,12 +132,9 @@
isOpen = false;
});
$: resources = providerResources[$provider.provider];
$: errorInResources = error;
$: wizard.setNextDisabled(!report);
$: {
console.log(JSON.stringify(report, null, 2));
}
$: resources = providerResources[$provider.provider];
</script>
<Layout.Stack gap="l">
@@ -157,10 +155,20 @@
<!--TODO: FIX UI -->
<Layout.Stack gap="l">
<Layout.Stack direction="row">
<Button.Button variant="text" role="button" on:click={deselectAll}
>Deselect all</Button.Button>
<Button.Button variant="text" role="button" on:click={selectAll}
>Select all</Button.Button>
<Button.Button
variant="text"
role="button"
on:click={(event) => {
event.preventDefault();
deselectAll();
}}>Deselect all</Button.Button>
<Button.Button
variant="text"
role="button"
on:click={(event) => {
event.preventDefault();
selectAll();
}}>Select all</Button.Button>
</Layout.Stack>
<Divider />
</Layout.Stack>
@@ -173,7 +181,6 @@
handleChange={handleInputChange('users.root')}
description="Import all users"
reportValue={report?.user}
showReport={$provider.provider !== 'firebase'}
isLoading={!error} />
<!-- TODO: no padding, change a component instead -->
@@ -195,7 +202,6 @@
handleChange={handleInputChange('databases.root')}
description="Import all databases, including collections, indexes and attributes"
reportValue={report?.database}
showReport={$provider.provider !== 'firebase'}
isLoading={!error} />
<div style:padding-left="2rem">
@@ -205,7 +211,6 @@
handleChange={handleInputChange('databases.documents')}
description="Import all functions and their active deployment"
reportValue={report?.document}
showReport={$provider.provider !== 'firebase'}
isLoading={!error} />
</div>
</Layout.Stack>
@@ -219,7 +224,6 @@
handleChange={handleInputChange('functions.root')}
description="Import all functions and their active deployment"
reportValue={report?.function}
showReport={$provider.provider !== 'firebase'}
isLoading={!error} />
{#if resources?.includes('environment-variable') || resources?.includes('deployment')}
@@ -254,7 +258,6 @@
checked={$formData.storage.root}
handleChange={handleInputChange('storage.root')}
reportValue={storageSize}
showReport={$provider.provider !== 'firebase'}
isLoading={!error} />
<div style:padding-left="2rem">
@@ -8,7 +8,6 @@
InputTextarea
} from '$lib/elements/forms';
import { provider } from '.';
import { onMount } from 'svelte';
export let formSubmitted = false;
@@ -71,10 +70,10 @@
<FormList>
<InputTextarea
id="credentials"
label="Account credentials"
label="Service Account JSON credentials"
required
bind:value={$provider.serviceAccount}
placeholder="Enter account credentials" />
placeholder="Enter Service Account JSON credentials" />
</FormList>
{:else if $provider.provider === 'supabase'}
<FormList>
@@ -3,7 +3,6 @@
export let label: string;
export let checked: boolean;
export let showReport: boolean = true;
export let isLoading: boolean = false;
export let handleChange: (event: Event) => void;
export let description: string | undefined = undefined;
@@ -16,12 +15,10 @@
<Layout.Stack direction="row" gap="xs" alignItems="flex-start">
<Selector.Checkbox {label} bind:checked on:change={handleChange} />
{#if showReport}
{#if reportValue !== undefined}
<Tag size="xs" selected>{reportValue}</Tag>
{:else if isLoading}
<Spinner size="s" />
{/if}
{#if reportValue !== undefined}
<Tag size="xs" selected>{reportValue}</Tag>
{:else if isLoading}
<Spinner size="s" />
{/if}
</Layout.Stack>
@@ -1,22 +0,0 @@
<script lang="ts">
import { WizardStep } from '$lib/layout';
import { sdk } from '$lib/stores/sdk';
import ResourceForm from '$routes/(console)/(migration-wizard)/resource-form.svelte';
import { formData, provider } from '.';
</script>
<WizardStep>
<svelte:fragment slot="title">Resources</svelte:fragment>
<svelte:fragment slot="subtitle">
Select the resources you need to migrate to Appwrite. Some resources can be migrated, but
with limitations. <a
class="link"
href="https://appwrite.io/docs/advanced/migrations"
target="_blank"
rel="noopener noreferrer">
Learn about which resources are supported</a
>.
</svelte:fragment>
<ResourceForm {formData} {provider} projectSdk={sdk.forProject} />
</WizardStep>
@@ -10,12 +10,19 @@
import { started } from '../stores';
import { showMigrationBox } from '$lib/components/migrationBox.svelte';
import { addNotification } from '$lib/stores/notifications';
import { Button, Card, Fieldset, Layout, Typography } from '@appwrite.io/pink-svelte';
import { Button, Card, Fieldset, Icon, Layout, Typography } from '@appwrite.io/pink-svelte';
import { Link } from '$lib/elements';
import { Form } from '$lib/elements/forms';
import { Box, EyebrowHeading } from '$lib/components';
import { FormList } from '$lib/elements/forms';
import { EyebrowHeading } from '$lib/components';
import Credentials from './credentials.svelte';
import ResourceForm from '$routes/(console)/(migration-wizard)/resource-form.svelte';
import {
IconCog,
IconCurrencyDollar,
IconExclamation,
IconTrendingUp
} from '@appwrite.io/pink-icons-svelte';
import { capitalize } from '$lib/helpers/string';
const onExit = () => {
resetImportStores();
@@ -98,16 +105,18 @@
};
let showResources = false;
let showExitModal = false;
let errorInResources = false;
$: isFinalsButtonEnabled =
!errorInResources &&
showResources &&
Object.values($formData).some((category) =>
Object.values(category).some((value) => value === true)
);
</script>
<Wizard
title="Create Migration"
bind:showExitModal
confirmExit
{onExit}>
<Form onSubmit={onFinish}>
<Wizard title="Create migration" bind:showExitModal confirmExit {onExit}>
<FormList>
<Layout.Stack gap="xxl">
<Fieldset legend="Source">
<Layout.Stack gap="xl">
@@ -126,7 +135,8 @@
id={key}
value={key}
title={platform}
imageRadius="s" />
imageRadius="s"
disabled={showResources} />
{/each}
</div>
</Layout.Stack>
@@ -141,17 +151,16 @@
justifyContent="space-between"
alignItems="center"
gap="xs">
<Layout.Stack
direction="row"
justifyContent="space-between"
alignItems="center">
<Typography.Text variant="m-500">Credentials set</Typography.Text>
</Layout.Stack>
<Typography.Text variant="m-500">
{capitalize($provider.provider)} credentials set successfully
</Typography.Text>
<Button.Button
variant="secondary"
size="s"
on:click={() => (showResources = !showResources)}>Update</Button.Button>
variant="secondary"
on:click={() => (showResources = !showResources)}>
Update
</Button.Button>
</Layout.Stack>
{/if}
</Fieldset>
@@ -159,67 +168,73 @@
{#if showResources}
<Fieldset legend="Resources">
<Layout.Stack gap="xl">
<ResourceForm {formData} {provider} projectSdk={sdk.forProject} />
<ResourceForm
{formData}
{provider}
bind:errorInResources
projectSdk={sdk.forProject} />
</Layout.Stack>
</Fieldset>
{/if}
</Layout.Stack>
</Form>
</FormList>
<!-- <svelte:fragment slot="aside">-->
<!-- <Box radius="s">-->
<!-- <div class="u-flex u-flex-vertical u-gap-16">-->
<!-- <EyebrowHeading class="eyebrow" tag="h3" size={3}>Good to know</EyebrowHeading>-->
<!-- <div class="u-flex u-gap-16">-->
<!-- <div class="circled">-->
<!-- <i class="icon-cog" />-->
<!-- </div>-->
<!-- <div>-->
<!-- <p class="u-bold">Project settings are not imported</p>-->
<!-- <p>You will need to set service and project settings manually</p>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class="u-flex u-gap-16">-->
<!-- <div class="circled">-->
<!-- <i class="icon-trending-up" />-->
<!-- </div>-->
<!-- <div>-->
<!-- <p class="u-bold">Keep your organization plan's limits in mind</p>-->
<!-- <p>-->
<!-- Make sure to have enough storage in your organization plan when-->
<!-- importing files.-->
<!-- </p>-->
<!-- </div>-->
<!-- </div>-->
<!-- {#if $provider.provider === 'firebase'}-->
<!-- <div class="u-flex u-gap-16">-->
<!-- <div class="circled">-->
<!-- <i class="icon-exclamation u-color-text-warning" />-->
<!-- </div>-->
<!-- <div>-->
<!-- <p class="u-bold">Possible charges by Firebase</p>-->
<!-- <p>-->
<!-- Appwrite does not impose charges for importing data, but please note-->
<!-- that Firebase may have its own pricing for this service-->
<!-- </p>-->
<!-- </div>-->
<!-- </div>-->
<!-- {:else}-->
<!-- <div class="u-flex u-gap-16">-->
<!-- <div class="circled">-->
<!-- <i class="icon-currency-dollar" />-->
<!-- </div>-->
<!-- <div>-->
<!-- <p class="u-bold">Transfer is free of charge</p>-->
<!-- <p>-->
<!-- You won't be charged for Appwrite bandwidth usage for importing data-->
<!-- </p>-->
<!-- </div>-->
<!-- </div>-->
<!-- {/if}-->
<!-- </div>-->
<!-- </Box>-->
<!-- </svelte:fragment>-->
<svelte:fragment slot="aside">
<Card.Base variant="primary" radius="s" padding="m">
<Layout.Stack gap="l">
<EyebrowHeading class="eyebrow" tag="h3" size={3}>Good to know</EyebrowHeading>
<!-- tip 1 -->
<Layout.Stack gap="l" direction="row" wrap="normal">
<span class="icon-wrapper">
<Icon icon={IconCog} size="s" />
</span>
<Layout.Stack gap="none">
<Typography.Text variant="m-600"
>Project settings are not imported</Typography.Text>
You will need to set service and project settings manually.
</Layout.Stack>
</Layout.Stack>
<!-- tip 2 -->
<Layout.Stack gap="l" direction="row" wrap="normal">
<span class="icon-wrapper">
<Icon icon={IconTrendingUp} size="s" />
</span>
<Layout.Stack gap="none">
<Typography.Text variant="m-600"
>Keep your organization plan's limits in mind</Typography.Text>
Make sure to have enough storage in your organization plan when importing files.
</Layout.Stack>
</Layout.Stack>
<!-- tip 3 -->
<Layout.Stack gap="l" direction="row" wrap="normal">
{@const isFirebase = $provider.provider === 'firebase'}
<span class="icon-wrapper" style:padding-block="3px">
<Icon
icon={isFirebase ? IconExclamation : IconCurrencyDollar}
size="s"
color={isFirebase ? '--fgcolor-warning' : undefined} />
</span>
<Layout.Stack gap="none">
<Typography.Text variant="m-600">
{isFirebase
? 'Possible charges by Firebase'
: 'Transfer is free of charge'}
</Typography.Text>
{#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}
</Layout.Stack>
</Layout.Stack>
</Layout.Stack>
</Card.Base>
</svelte:fragment>
<svelte:fragment slot="footer">
<Button.Button
@@ -228,8 +243,8 @@
showExitModal = true;
}}>Cancel</Button.Button>
<!-- todo: @itznotabug, correct disabled state -->
<Button.Button variant="primary" disabled>Create</Button.Button>
<Button.Button variant="primary" disabled={!isFinalsButtonEnabled} on:click={onFinish}
>Create</Button.Button>
</svelte:fragment>
</Wizard>
@@ -237,6 +252,15 @@
.providers {
display: grid;
gap: var(--gap-l, 16px);
grid-template-columns: repeat(3, 1fr);
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
@media (max-width: 768px) {
display: flex;
flex-direction: column;
}
}
.icon-wrapper {
padding-block: 2px;
}
</style>