From 7cf85e0c56140ba650336580a288e52aeb74d702 Mon Sep 17 00:00:00 2001 From: Arman Date: Fri, 24 Jan 2025 14:49:27 +0100 Subject: [PATCH 1/8] feat: template filtering and accordion design --- src/lib/components/labelCard.svelte | 4 + .../sites/create-site/templates/+page.svelte | 126 +++++++----------- .../sites/create-site/templates/+page.ts | 14 +- 3 files changed, 58 insertions(+), 86 deletions(-) diff --git a/src/lib/components/labelCard.svelte b/src/lib/components/labelCard.svelte index 0ace79cd5..8c5ab9bc8 100644 --- a/src/lib/components/labelCard.svelte +++ b/src/lib/components/labelCard.svelte @@ -18,6 +18,8 @@ //temporarily unefined export let title: Props['title'] = undefined; export let disabled = false; + export let src: string = null; + export let alt: string = null; // TODO: remove after label card migration let slotTitle: HTMLSpanElement; @@ -26,6 +28,8 @@
import { base } from '$app/paths'; - import { Collapsible, CollapsibleItem, EmptySearch, SvgIcon } from '$lib/components'; + import { EmptySearch } from '$lib/components'; import { Button, InputSearch } from '$lib/elements/forms'; import { page } from '$app/stores'; import Wizard from '$lib/layout/wizard.svelte'; import { goto } from '$app/navigation'; import { debounce } from '$lib/helpers/debounce.js'; - import { Card, Layout } from '@appwrite.io/pink-svelte'; + import { Card, Layout, Accordion, Selector } from '@appwrite.io/pink-svelte'; import { templatesList } from '$lib/stores/templates.js'; export let data; - function applyFilter(filter: string, value: string, event: Event) { - const add = (event.target as EventTarget & HTMLInputElement).checked; + function applyFilter(filter: string, value: string, event: CustomEvent) { const target = new URL($page.url); - if (add) { - target.searchParams.append(filter, value); + if (event?.detail) { + if ( + !target.searchParams + .getAll(filter) + .some((n) => n.toLowerCase() === value.toLowerCase()) + ) { + target.searchParams.append(filter, value); + } } else { const previous = target.searchParams .getAll(filter) @@ -42,27 +47,6 @@ }, 250)(); } - function getIconFromFramework(framework: string) { - switch (true) { - case framework.includes('node'): - return 'node'; - case framework.includes('php'): - return 'php'; - case framework.includes('ruby'): - return 'ruby'; - case framework.includes('python'): - return 'python'; - case framework.includes('dart'): - return 'dart'; - case framework.includes('bun'): - return 'bun'; - case framework.includes('go'): - return 'go'; - default: - return undefined; - } - } - function clearSearch() { const target = new URL($page.url); target.search = ''; @@ -101,52 +85,41 @@ value={$page.url.searchParams.get('search')} on:clear={clearSearch} on:change={applySearch} /> - - - Use case -
    + + + + {#each [...data.useCases] as useCase} -
  • - -
  • + + { + applyFilter('useCase', useCase, e); + }} /> + {/each} -
-
- - Framework -
    + + + + {#each [...data.frameworks] as framework} - {@const icon = getIconFromFramework(framework)} -
  • - -
  • + + applyFilter('framework', framework, e)} /> + {/each} -
-
-
+ + + @@ -170,16 +143,11 @@ {/each} {:else} - -
-
- {getErrorMessage()} -

There are no templates that match your search.

-
-
- -
-
+ + {/if} + + POWERED BY + + {#if $app.themeInUse === 'dark'} + Appwrite Logo + {:else} + Appwrite Logo + {/if} + +
+ + diff --git a/src/routes/(public)/auth/preview/+page.svelte b/src/routes/(public)/auth/preview/+page.svelte index d65c1672f..9f82172eb 100644 --- a/src/routes/(public)/auth/preview/+page.svelte +++ b/src/routes/(public)/auth/preview/+page.svelte @@ -1,227 +1,28 @@ - -
- - {#if state === 'login'} - - - - {#if isCloud} - or - - {/if} - - {:else if state === 'register'} - - - - - By registering, you agree that you have read, understand, and acknowledge our - Privacy Policy - and accept our - General Terms of Use. - - {#if isCloud} - or - - {/if} - - {:else if state === 'authenticated'} - - -

- You're signed in as {data.account.email} -

- { - logout(); - state = 'login'; - }}>Swith account -
-
- {/if} -
-
+ + Preview - Appwrite + - - - -
+ + + + Authenticating... + + Please wait while we authenticate you + diff --git a/src/routes/(public)/auth/preview/+page.ts b/src/routes/(public)/auth/preview/+page.ts index 87603f585..c13cb1228 100644 --- a/src/routes/(public)/auth/preview/+page.ts +++ b/src/routes/(public)/auth/preview/+page.ts @@ -1,7 +1,14 @@ +import { base } from '$app/paths'; +import { redirect } from '@sveltejs/kit'; + export const load = async ({ parent }) => { const { account } = await parent(); - return { - account - }; + if (!account) { + redirect(303, `${base}/auth/preview/access`); + } else { + return { + account + }; + } }; diff --git a/src/routes/(public)/auth/preview/access/+page.svelte b/src/routes/(public)/auth/preview/access/+page.svelte new file mode 100644 index 000000000..b64444ed5 --- /dev/null +++ b/src/routes/(public)/auth/preview/access/+page.svelte @@ -0,0 +1,245 @@ + + +{#if $app.themeInUse === 'dark'} + +{:else} + +{/if} + + + Preview access - Appwrite + + + +
+ + {#if state === 'login'} + + + + {#if isCloud} + or + + {/if} + + {:else if state === 'register'} + + + + + By registering, you agree that you have read, understand, and acknowledge our + Privacy Policy + and accept our + General Terms of Use. + + {#if isCloud} + or + + {/if} + + {:else if state === 'authenticated'} + + +

+ You're signed in as {data.account.email} +

+ { + logout(); + state = 'login'; + }}>Swith account +
+
+ {/if} +
+
+ + + + +
+ + diff --git a/src/routes/(public)/auth/preview/access/+page.ts b/src/routes/(public)/auth/preview/access/+page.ts new file mode 100644 index 000000000..87603f585 --- /dev/null +++ b/src/routes/(public)/auth/preview/access/+page.ts @@ -0,0 +1,7 @@ +export const load = async ({ parent }) => { + const { account } = await parent(); + + return { + account + }; +}; diff --git a/src/routes/(public)/auth/preview/access/bg_dark.jpg b/src/routes/(public)/auth/preview/access/bg_dark.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1fbbdc128d033a2cd3b34fd02cfcd4d990a1e52b GIT binary patch literal 10859 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 literal 0 HcmV?d00001 diff --git a/src/routes/(public)/auth/preview/access/bg_light.jpg b/src/routes/(public)/auth/preview/access/bg_light.jpg new file mode 100644 index 0000000000000000000000000000000000000000..febb1bab81e6f7b6bb417a7c706c6da48375d11a GIT binary patch literal 10964 zcmeI2c~DbH9>@C;P7QC@O*F(p|*^M;X*8is%3W zNhu&lMpRI;NCbCgN>)Koj^VIG@mxg~L=>l#;DHz0FYuUD%~p-c`!`K0-K6{X?O%Vo z`U9xo;%x#!{;zrJbyR-d~d%6er(r(r2#%m=lc42qaw&uB9UZDqLIlo@0qNb z-WsQ|D}ZdQ4-8}kgbeh^2!V`@H3BMhRh7VG(nARP21c;X`VUnA(Svnk_W+TA06lYp zIW+ntz1sJ{{Z>|nNdU^{LRI$o_%XrxXjMs=oUuWRZ2pv#nw3&7oRK@^lR7`pqQCmcKAMpckAKshm`~G zBe-3MnkfnX7E@zwM$5h#@!Swfbd%&5PV;TPaTrwjwsrk@vou)KP5`BLb?;!pe_HdY zkpM)xH8w0=0~(f~MF6-|Q;qcqnw$Kg4@2tY0zlo+GS&SqVkp*91JuQHDSUJFf z0?^tSL&6e|T+smC%9uTrj7}1l;G?Zek#N?<%EAn`Imvg316As@MvjQPh(H2>l~4wN zA(#ZFscXbZz_>*601GZ~G3*@?Q#JJgYfnH<7S~m5m6-0Ez$s3*#Mkq$GMbb6G(8a$I}$VK`fGWErnvZ_I*Q6 z8g0u`Znp5|2)ZDN00t%P62+9;n{cqOFOqvD>tNM0D1vJhq!9vH06Ara>S*T>v@+Ba zPuLQOT&+h|2frarS#X!2xDl4tI^Zu>z5@m{zp3mizKa*!OhU!FCpVwQgA5fKfrLK3 zG{L>C{Cwx;2LR|xd^A?U3_^uzAdpT8Je`*WzW{J4Er*(1sz`=Y209errdr`Z4}M>2 zn`W{l>2AX|t#fITa#X_t-80%HM7Xffw=BEYtf}gmD(dE{-n9~&a+q6Z!fgm=0?BVR?tgai$C}&*j2(E8ozehn}Yt7rma&(k|T3;*y zgGH1`{oI881O<9AfNzMSLOs_}QKx~GbyP4C>bZ`JIt{F>qk@r8&vjJPX<%g?6^w*>uA`z(11syOU?kLY z9TjyNSXoB}BcYz_sHoGx$~r0-3H4k@MV$s#)=|MosOLH=>NK!2B0NpNo(JH$b-K6l z$#&0zaaCM5^J&q0pUyWJ7s7Ry+HGGjd*VqIo|~`!;)zEbh7^nw#_r2=L?N4KjHICt zhqOz!@ca+M9O%JBK#u{9s~}`Of@PwG570N~(#2NrAdoSvLi7O5a_*v+B`FB?ULl0CGF*F`j!d&74L{#hGH+jUd5V{{ ze~9!&dqD*~$@hZ`i^1ZYGe3K_$35Uf<04AbHM`HEsAa{1ogT`8w&0Kwdv@!JqI~7R z^nnhSvv-ODylm|$*M#S*!#E6iIP8Hc-Q~kv%L!LRT}}5{FZ`!bcgqvU&SF7I;|1=! z6ltkbYglaiac=FpHC3L{6t5uHj8f0c@K@9W;S~p>Ls>sZL+3btV7>6JW*F3%ZK{8p zEotTqbe4FfG+wqWGitH!u$0Pc)_tWM7y~EQx>P<5UO~#W*l)*P9fpK4!}zzee!lgt zi0}0(;PwyGn1Qm8^l!-TX7J}42}ts3agq|p_pma!C1|!(Ud_KW-EZBQuGGF-X|%O} zYbL*>$Y~tED({doqsYPfw-U!Z*!yVeD69!+O)NYWb7E+;Q(+rb!Bl+|WS&tP zvqM2W6*23C>&K2l+a2kp#2xMad0mv31 zGl#KaJfKX(Bm|HX&FOk#J0A;f_VtNqLhuF(nk(tL*O^joK*!(jdPe`!bTy0jXh!-c z{rHl!Jr4eRW_iuGKHeH<$#eQz+TmEubRAC`T6dL$j?2< zu!R?^*m|%i95&)PR5BP0Qn+!Jac0EG&i0~JZEbA@HR(O+KhUaRQ&rp1>a&*|Vq;_D zJgcG@3}!}h-NFr4#k{z1-s}wwPIB88|8s%Qiz1+$+!)#^a>&$w)2s(Pe}N{viZlj; zvq$cp#gjkiINwS6Oxy!$S&=7V?qvM#Q329J5O3gy9^ItDW1Ix|Qfmi~XOg*z<`$OY zZDHj01}|kPO|)HKmq*rAD!K&puCiGs VT)4)kY+ucGQ>Ccnn9bPT{{gG;Qw{(C literal 0 HcmV?d00001 From 13e8f74bbd4ce0218050698a12479ca111e93ea2 Mon Sep 17 00:00:00 2001 From: Arman Date: Mon, 27 Jan 2025 15:09:25 +0100 Subject: [PATCH 4/8] feat: overview screen --- .../sites/(components)/siteCard.svelte | 164 ++++++++++-------- .../sites/site-[site]/+page.svelte | 25 ++- .../sites/site-[site]/+page.ts | 12 +- .../sites/site-[site]/domainsOverview.svelte | 16 +- 4 files changed, 124 insertions(+), 93 deletions(-) diff --git a/src/routes/(console)/project-[project]/sites/(components)/siteCard.svelte b/src/routes/(console)/project-[project]/sites/(components)/siteCard.svelte index bc2766aa8..08cb03460 100644 --- a/src/routes/(console)/project-[project]/sites/(components)/siteCard.svelte +++ b/src/routes/(console)/project-[project]/sites/(components)/siteCard.svelte @@ -4,7 +4,7 @@ import { humanFileSize } from '$lib/helpers/sizeConvertion'; import { calculateTime } from '$lib/helpers/timeConversion'; import type { Models } from '@appwrite.io/console'; - import { Icon, Image, Layout, Status, Typography } from '@appwrite.io/pink-svelte'; + import { Divider, Icon, Image, Layout, Status, Typography } from '@appwrite.io/pink-svelte'; import DeploymentSource from './deploymentSource.svelte'; import DeploymentCreatedBy from './deploymentCreatedBy.svelte'; import { Button } from '$lib/elements/forms'; @@ -24,92 +24,106 @@ - - Screenshot - - - - {#if deployment.status === 'failed'} - - - Status - - - - - - {:else} - - - Deployed - - - + + + Screenshot + + + + {#if deployment.status === 'failed'} + + + Status + + + + + + {:else} + + + Deployed + + + + {/if} + + {#if siteUrl} + {/if} - {#if siteUrl} - - {/if} - - {#if proxyRuleList?.total} - - - Domains - - - - {:else if deployment.domain} - - - Domains - - - - - {deployment.domain} - - - - - - {/if} - - {#if deployment?.buildTime} - + {#if proxyRuleList?.total} + - Build time + Domains - - {calculateTime(deployment.buildTime)} + + + {:else if deployment.domain} + + + Domains + + + + {deployment.domain} + + + + {/if} - + + {#if deployment?.buildTime} + + + Build time + + + {calculateTime(deployment.buildTime)} + + + {/if} + + + Total size + + + {totalSize.value}{totalSize.unit} + + + + - Total size - - - {totalSize.value}{totalSize.unit} + Source + - - - Source - - - + + {#if $$slots.footer} + + + + + + + {/if} diff --git a/src/routes/(console)/project-[project]/sites/site-[site]/+page.svelte b/src/routes/(console)/project-[project]/sites/site-[site]/+page.svelte index e67679fc4..28fd6fc74 100644 --- a/src/routes/(console)/project-[project]/sites/site-[site]/+page.svelte +++ b/src/routes/(console)/project-[project]/sites/site-[site]/+page.svelte @@ -4,24 +4,37 @@ import SiteCard from '../(components)/siteCard.svelte'; import DomainsOverview from './domainsOverview.svelte'; import DeploymentsOverview from './deploymentsOverview.svelte'; + import { Button } from '$lib/elements/forms'; + import { protocol } from '$routes/(console)/store'; export let data; $: console.log(data.site); $: console.log(data.deployment); + $: console.log(data.deploymentList); $: console.log(data.proxyRuleList); - + + + + + + - - - + + +
+ +
+
+ +
diff --git a/src/routes/(console)/project-[project]/sites/site-[site]/+page.ts b/src/routes/(console)/project-[project]/sites/site-[site]/+page.ts index 3c0a99096..88918bc2f 100644 --- a/src/routes/(console)/project-[project]/sites/site-[site]/+page.ts +++ b/src/routes/(console)/project-[project]/sites/site-[site]/+page.ts @@ -7,14 +7,20 @@ export const load = async ({ params, depends, parent }) => { depends(Dependencies.SITES_DOMAINS); const { site, proxyRuleList } = await parent(); - const [deployment, deploymentList] = await Promise.all([ + const [deployment, deploymentList, prodReadyDeployments] = await Promise.all([ sdk.forProject.sites.getDeployment(params.site, site.deploymentId), - sdk.forProject.sites.listDeployments(params.site, [Query.limit(5), Query.orderDesc('')]) + sdk.forProject.sites.listDeployments(params.site, [Query.limit(5), Query.orderDesc('')]), + sdk.forProject.sites.listDeployments(params.site, [ + Query.limit(1) + // Query.equal('status', 'ready') + // Query.equal('live', true) + ]) ]); return { site, deployment, deploymentList, - proxyRuleList + proxyRuleList, + hasProdReadyDeployments: prodReadyDeployments?.deployments?.length > 0 }; }; diff --git a/src/routes/(console)/project-[project]/sites/site-[site]/domainsOverview.svelte b/src/routes/(console)/project-[project]/sites/site-[site]/domainsOverview.svelte index a14eb52b0..f60a44970 100644 --- a/src/routes/(console)/project-[project]/sites/site-[site]/domainsOverview.svelte +++ b/src/routes/(console)/project-[project]/sites/site-[site]/domainsOverview.svelte @@ -9,7 +9,7 @@ import { type Models } from '@appwrite.io/console'; import { Link } from '$lib/elements'; import { Button } from '$lib/elements/forms'; - import { Card } from '$lib/components'; + import { Card, Trim } from '$lib/components'; export let proxyRuleList: Models.ProxyRuleList; @@ -33,17 +33,15 @@ {#each proxyRuleList?.rules?.slice(0, 3) as rule, i} - - + + - {rule.domain} + + {rule.domain} + - + Added {timeFromNow(rule.$createdAt)} From 4469a7d8463b2f297b6ad7085e1829e9b991473c Mon Sep 17 00:00:00 2001 From: Arman Date: Mon, 27 Jan 2025 16:44:21 +0100 Subject: [PATCH 5/8] feat: instant rollback --- package.json | 2 +- pnpm-lock.yaml | 43 +++-- .../(components)/deploymentDomains.svelte | 8 +- .../sites/site-[site]/+page.svelte | 12 +- .../deployments/cancelDeploymentModal.svelte | 4 +- .../site-[site]/instantRollbackDomain.svelte | 159 ++++++++++++++++++ 6 files changed, 210 insertions(+), 18 deletions(-) create mode 100644 src/routes/(console)/project-[project]/sites/site-[site]/instantRollbackDomain.svelte diff --git a/package.json b/package.json index 99425220a..992e4df86 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "@appwrite.io/pink": "0.25.0", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "1.0.0-next.7", - "@appwrite.io/pink-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@9bf8175", + "@appwrite.io/pink-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@4a73ad4", "@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 55532d290..715a01002 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: specifier: 1.0.0-next.7 version: 1.0.0-next.7(svelte@4.2.19) '@appwrite.io/pink-svelte': - specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@9bf8175 - version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@9bf8175(react-dom@18.3.1(react@18.3.1))(svelte@4.2.19) + specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@4a73ad4 + version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@4a73ad4(react-dom@18.3.1(react@18.3.1))(svelte@4.2.19) '@popperjs/core': specifier: ^2.11.8 version: 2.11.8 @@ -223,8 +223,8 @@ packages: peerDependencies: svelte: ^4.0.0 - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@9bf8175bdcd6ed9f4614a76521d80963e75171cb': - resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@9bf8175bdcd6ed9f4614a76521d80963e75171cb} + '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@4a73ad48c64ce1078565d893a9c91d887d05d90a': + resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@4a73ad48c64ce1078565d893a9c91d887d05d90a} version: 1.0.0-next.7 peerDependencies: svelte: ^4.0.0 @@ -232,8 +232,8 @@ packages: '@appwrite.io/pink-icons@0.25.0': resolution: {integrity: sha512-0O3i2oEuh5mWvjO80i+X6rbzrWLJ1m5wmv2/M3a1p2PyBJsFxN8xQMTEmTn3Wl/D26SsM7SpzbdW6gmfgoVU9Q==} - '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@9bf8175': - resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@9bf8175} + '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@4a73ad4': + resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@4a73ad4} version: 1.0.0-next.85 peerDependencies: react-dom: ^18.0.0 @@ -691,6 +691,11 @@ packages: peerDependencies: svelte: ^3.0.0 || ^4.0.0 || ^5.0.0-next.118 + '@melt-ui/svelte@0.86.2': + resolution: {integrity: sha512-wRVN603oIt1aXvx2QRmKqVDJgTScSvr/WJLLokkD8c4QzHgn6pfpPtUKmhV6Dvkk+OY89OG/1Irkd6ouA50Ztw==} + peerDependencies: + svelte: ^3.0.0 || ^4.0.0 || ^5.0.0-next.118 + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -4087,17 +4092,18 @@ snapshots: dependencies: svelte: 4.2.19 - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@9bf8175bdcd6ed9f4614a76521d80963e75171cb(svelte@4.2.19)': + '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@4a73ad48c64ce1078565d893a9c91d887d05d90a(svelte@4.2.19)': dependencies: svelte: 4.2.19 '@appwrite.io/pink-icons@0.25.0': {} - '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@9bf8175(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@4a73ad4(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@9bf8175bdcd6ed9f4614a76521d80963e75171cb(svelte@4.2.19) + '@appwrite.io/pink-icons-svelte': https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@4a73ad48c64ce1078565d893a9c91d887d05d90a(svelte@4.2.19) '@floating-ui/dom': 1.6.13 - '@melt-ui/svelte': 0.83.0(svelte@4.2.19) + '@melt-ui/pp': 0.3.2(@melt-ui/svelte@0.86.2(svelte@4.2.19))(svelte@4.2.19) + '@melt-ui/svelte': 0.86.2(svelte@4.2.19) pretty-bytes: 6.1.1 react-dom: 18.3.1(react@18.3.1) shiki: 1.27.2 @@ -4617,6 +4623,13 @@ snapshots: magic-string: 0.30.17 svelte: 4.2.19 + '@melt-ui/pp@0.3.2(@melt-ui/svelte@0.86.2(svelte@4.2.19))(svelte@4.2.19)': + dependencies: + '@melt-ui/svelte': 0.86.2(svelte@4.2.19) + estree-walker: 3.0.3 + magic-string: 0.30.17 + svelte: 4.2.19 + '@melt-ui/svelte@0.83.0(svelte@4.2.19)': dependencies: '@floating-ui/core': 1.6.9 @@ -4627,6 +4640,16 @@ snapshots: nanoid: 5.0.9 svelte: 4.2.19 + '@melt-ui/svelte@0.86.2(svelte@4.2.19)': + dependencies: + '@floating-ui/core': 1.6.9 + '@floating-ui/dom': 1.6.13 + '@internationalized/date': 3.6.0 + dequal: 2.0.3 + focus-trap: 7.6.4 + nanoid: 5.0.9 + svelte: 4.2.19 + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 diff --git a/src/routes/(console)/project-[project]/sites/(components)/deploymentDomains.svelte b/src/routes/(console)/project-[project]/sites/(components)/deploymentDomains.svelte index 34054242c..a43d4890b 100644 --- a/src/routes/(console)/project-[project]/sites/(components)/deploymentDomains.svelte +++ b/src/routes/(console)/project-[project]/sites/(components)/deploymentDomains.svelte @@ -1,10 +1,10 @@ @@ -20,9 +20,9 @@ {#if domains.rules.length > 1} - + +{domains.rules.length - 1} - + {#each domains.rules as rule, i} diff --git a/src/routes/(console)/project-[project]/sites/site-[site]/+page.svelte b/src/routes/(console)/project-[project]/sites/site-[site]/+page.svelte index 28fd6fc74..9d7e71712 100644 --- a/src/routes/(console)/project-[project]/sites/site-[site]/+page.svelte +++ b/src/routes/(console)/project-[project]/sites/site-[site]/+page.svelte @@ -6,8 +6,10 @@ import DeploymentsOverview from './deploymentsOverview.svelte'; import { Button } from '$lib/elements/forms'; import { protocol } from '$routes/(console)/store'; + import InstantRollbackDomain from './instantRollbackDomain.svelte'; export let data; + let showRollback = false; $: console.log(data.site); $: console.log(data.deployment); @@ -20,7 +22,8 @@ - + + @@ -38,3 +41,10 @@ + +{#if showRollback} + +{/if} diff --git a/src/routes/(console)/project-[project]/sites/site-[site]/deployments/cancelDeploymentModal.svelte b/src/routes/(console)/project-[project]/sites/site-[site]/deployments/cancelDeploymentModal.svelte index c0db6a671..d57eb6f77 100644 --- a/src/routes/(console)/project-[project]/sites/site-[site]/deployments/cancelDeploymentModal.svelte +++ b/src/routes/(console)/project-[project]/sites/site-[site]/deployments/cancelDeploymentModal.svelte @@ -13,11 +13,11 @@ async function handleSubmit() { try { - await sdk.forProject.functions.updateDeploymentBuild( + await sdk.forProject.sites.updateDeploymentBuild( selectedDeployment.resourceId, selectedDeployment.$id ); - await invalidate(Dependencies.FUNCTION); + await invalidate(Dependencies.SITE); showCancel = false; addNotification({ type: 'success', diff --git a/src/routes/(console)/project-[project]/sites/site-[site]/instantRollbackDomain.svelte b/src/routes/(console)/project-[project]/sites/site-[site]/instantRollbackDomain.svelte new file mode 100644 index 000000000..5f43ed02c --- /dev/null +++ b/src/routes/(console)/project-[project]/sites/site-[site]/instantRollbackDomain.svelte @@ -0,0 +1,159 @@ + + + + + Rollback is only available for deployments that are ready and previously active. Learn more. + + + + + Rollback + + + + + + {toLocaleDateTime(deployment.$createdAt)} + + + + + + {capitalize(deployment.status)} + + + + + + {calculateSize(deployment.size)} + + + + + + Created {timeFromNow(deployment.$createdAt)} + {#if deployment?.providerCommitAuthorUrl && deployment?.providerCommitAuthor} + by {deployment.providerCommitAuthor} + {/if} + + + + + + + To the following deployment: + {#if prodDeployments?.deployments?.length} + {#each prodDeployments.deployments as prodDeployment} + + + + Created {timeFromNow(prodDeployment.$createdAt)} + {#if prodDeployment?.providerCommitAuthorUrl && prodDeployment?.providerCommitAuthor} + by {prodDeployment.providerCommitAuthor} + {/if} + + + + {/each} + {/if} + + {#if selectedDeployment?.$id} + + {/if} + + + + + + + From 67ca09f8b6cfaed0fb4746af0490276bf4206389 Mon Sep 17 00:00:00 2001 From: Arman Date: Mon, 27 Jan 2025 17:03:20 +0100 Subject: [PATCH 6/8] feat: create modal --- .../sites/createSiteModal.svelte | 79 +++++++++---------- 1 file changed, 39 insertions(+), 40 deletions(-) diff --git a/src/routes/(console)/project-[project]/sites/createSiteModal.svelte b/src/routes/(console)/project-[project]/sites/createSiteModal.svelte index 437ab13f9..f05f0e911 100644 --- a/src/routes/(console)/project-[project]/sites/createSiteModal.svelte +++ b/src/routes/(console)/project-[project]/sites/createSiteModal.svelte @@ -1,7 +1,7 @@ - +
- - - Connect to one of your existing Git repositories - - + + repositories + + Clone a template + Clone a pre-built template to quickly set up your site + +
- - - Clone a pre-built template to quickly set up your site - - + + repositories + + + Connect a repository + Connect to one of your existing Git repositories + +
- - - - + + Or simply drag and drop your files to create a site + manually. +
From e2e11e3d39f08076a19fc4618f566d17f716240f Mon Sep 17 00:00:00 2001 From: Arman Date: Mon, 27 Jan 2025 17:26:34 +0100 Subject: [PATCH 7/8] feat: manual flow, fixes to repository flow --- src/lib/helpers/files.ts | 186 +++++++++++++++ .../importSiteVariablesModal.svelte | 0 .../sites/create-site/manual/+page.svelte | 181 ++++++++++++++ .../sites/create-site/manual/+page.ts | 7 + .../sites/create-site/manual/aside.svelte | 7 + .../create-site/manual/configuration.svelte | 224 ++++++++++++++++++ .../configuration.svelte | 27 +-- .../secretVariableModal.svelte | 2 +- .../sites/createSiteModal.svelte | 12 +- .../createManualDeploymentModal.svelte | 45 +--- .../sites/site-[site]/deployments/store.ts | 143 ----------- 11 files changed, 622 insertions(+), 212 deletions(-) create mode 100644 src/lib/helpers/files.ts rename src/routes/(console)/project-[project]/sites/create-site/{repositories/repository-[repository] => }/importSiteVariablesModal.svelte (100%) create mode 100644 src/routes/(console)/project-[project]/sites/create-site/manual/+page.svelte create mode 100644 src/routes/(console)/project-[project]/sites/create-site/manual/+page.ts create mode 100644 src/routes/(console)/project-[project]/sites/create-site/manual/aside.svelte create mode 100644 src/routes/(console)/project-[project]/sites/create-site/manual/configuration.svelte rename src/routes/(console)/project-[project]/sites/create-site/{repositories/repository-[repository] => }/secretVariableModal.svelte (93%) diff --git a/src/lib/helpers/files.ts b/src/lib/helpers/files.ts new file mode 100644 index 000000000..97a3b8939 --- /dev/null +++ b/src/lib/helpers/files.ts @@ -0,0 +1,186 @@ +import ignore from 'ignore'; + +export interface FileData { + path: string; + buffer: ArrayBuffer; +} + +export async function processFileList(files: FileList): Promise { + const fileArray = Array.from(files); + const ignorer = ignore(); + + // Check for .gitignore file + const gitignoreFile = fileArray.find( + (file) => file.webkitRelativePath.endsWith('.gitignore') || file.name === '.gitignore' + ); + + if (gitignoreFile) { + const gitignoreContent = await gitignoreFile.text(); + ignorer.add(gitignoreContent); + } else { + ignorer.add(defaultIgnore); + } + + // Filter files using ignorer + const filteredFiles = fileArray.filter((file) => { + const path = file.webkitRelativePath || file.name; + return !ignorer.ignores(path); + }); + const filePromises = filteredFiles.map(async (file) => { + try { + const buffer = await file.arrayBuffer(); + return { + path: file?.webkitRelativePath || file.name, + buffer: buffer + }; + } catch (e) { + // console.log(file); + return null; + } + }); + + return Promise.all(filePromises); +} + +export const defaultIgnore = ` +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Node Patch ### +# Serverless Webpack directories +.webpack/ + +# Optional stylelint cache + +# SvelteKit build / generate output +.svelte-kit + +`; diff --git a/src/routes/(console)/project-[project]/sites/create-site/repositories/repository-[repository]/importSiteVariablesModal.svelte b/src/routes/(console)/project-[project]/sites/create-site/importSiteVariablesModal.svelte similarity index 100% rename from src/routes/(console)/project-[project]/sites/create-site/repositories/repository-[repository]/importSiteVariablesModal.svelte rename to src/routes/(console)/project-[project]/sites/create-site/importSiteVariablesModal.svelte diff --git a/src/routes/(console)/project-[project]/sites/create-site/manual/+page.svelte b/src/routes/(console)/project-[project]/sites/create-site/manual/+page.svelte new file mode 100644 index 000000000..19fbd8ca6 --- /dev/null +++ b/src/routes/(console)/project-[project]/sites/create-site/manual/+page.svelte @@ -0,0 +1,181 @@ + + + + Create site - Appwrite + + + +
+ + + + + + Drag and drop files here or click to upload + + + + + Only PNG, JPEG, PDF files allowed + + + + Max file size: 10MB + + +
+ + + + + + + +