From c133493190182df8bf9880d36e7da0bb2186b71e Mon Sep 17 00:00:00 2001 From: AAMIR AKRAM <91816147+Aamir-Akram@users.noreply.github.com> Date: Mon, 20 Apr 2026 07:56:41 +0530 Subject: [PATCH 1/4] feat: added bulk delete functionality to deployments table using svelte 5 runes --- pnpm-lock.yaml | 48 +++--- pnpm-workspace.yaml | 5 + .../function-[function]/table.svelte | 156 ++++++------------ 3 files changed, 75 insertions(+), 134 deletions(-) create mode 100644 pnpm-workspace.yaml diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c40bac9d87..1b763d7771 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,8 +12,8 @@ importers: specifier: ^1.1.24 version: 1.1.24(svelte@5.55.0)(zod@3.25.76) '@appwrite.io/console': - specifier: https://pkg.vc/-/@appwrite/@appwrite.io/console@67539a6 - version: https://pkg.vc/-/@appwrite/@appwrite.io/console@67539a6 + specifier: https://pkg.vc/-/@appwrite/@appwrite.io/console@f063676 + version: https://pkg.vc/-/@appwrite/@appwrite.io/console@f063676 '@appwrite.io/pink-icons': specifier: 0.25.0 version: 0.25.0 @@ -24,8 +24,8 @@ importers: specifier: ^1.0.3 version: 1.0.3 '@appwrite.io/pink-svelte': - specifier: https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@bfe7ce3 - version: https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@bfe7ce3(svelte@5.55.0) + specifier: https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@8dcaa17 + version: https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@8dcaa17(svelte@5.55.0) '@faker-js/faker': specifier: ^9.9.0 version: 9.9.0 @@ -37,7 +37,7 @@ importers: version: 2.11.8 '@sentry/sveltekit': specifier: ^8.55.1 - version: 8.55.1(@opentelemetry/api@1.9.1)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.1))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.40.0)(@sveltejs/kit@2.55.0(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.0)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)))(svelte@5.55.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)))(svelte@5.55.0)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)) + version: 8.55.1(@opentelemetry/api@1.9.1)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.1))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.40.0)(@sveltejs/kit@2.57.1(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.0)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)))(svelte@5.55.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)))(svelte@5.55.0)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)) '@stripe/stripe-js': specifier: ^3.5.0 version: 3.5.0 @@ -110,10 +110,10 @@ importers: version: 1.58.2 '@sveltejs/adapter-static': specifier: ^3.0.10 - version: 3.0.10(@sveltejs/kit@2.55.0(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.0)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)))(svelte@5.55.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0))) + version: 3.0.10(@sveltejs/kit@2.57.1(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.0)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)))(svelte@5.55.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0))) '@sveltejs/kit': - specifier: ^2.55.0 - version: 2.55.0(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.0)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)))(svelte@5.55.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)) + specifier: ^2.57.1 + version: 2.57.1(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.0)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)))(svelte@5.55.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)) '@sveltejs/vite-plugin-svelte': specifier: ^5.1.1 version: 5.1.1(svelte@5.55.0)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)) @@ -281,9 +281,9 @@ packages: '@analytics/type-utils@0.6.4': resolution: {integrity: sha512-Ou1gQxFakOWLcPnbFVsrPb8g1wLLUZYYJXDPjHkG07+5mustGs5yqACx42UAu4A6NszNN6Z5gGxhyH45zPWRxw==} - '@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@67539a6': - resolution: {integrity: sha512-IV+eVqF6tzL/voA1vqNtn5hL9lgJL78MVZkP4ABYwyaDRaXFyLQbPiRlJJesN4m7PYlCztyfAqcOn3QdCCjwIQ==, tarball: https://pkg.vc/-/@appwrite/@appwrite.io/console@67539a6} - version: 8.2.0 + '@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@f063676': + resolution: {integrity: sha512-dT2Uri9+T8j9SzVoEHxyQ4qnvX9Qen7NANLJPNMCdBP1Sh1iOsSkSqoBX5jkMceRMPtOicrzBN2ZjOModeDxWQ==, tarball: https://pkg.vc/-/@appwrite/@appwrite.io/console@f063676} + version: 8.3.0 engines: {node: '>=18.0.0'} '@appwrite.io/pink-icons-svelte@2.0.0-RC.1': @@ -306,8 +306,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/@appwrite.io/pink-svelte@bfe7ce3': - resolution: {integrity: sha512-kOC6T1uhmggl02Wmu++WUBpVh1SqzwlRDpR4xw79Sl8Cy1RJju55IkeVl6doKcNYQyPl6kJItgxFwF1MhkB1DQ==, tarball: https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@bfe7ce3} + '@appwrite.io/pink-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@8dcaa17': + resolution: {integrity: sha512-rw3zXN7/cUciCnhj0FR8M0H5Db+LYYMaKtPxvOAIMxNTBmStzU8kTw6grqIvdtFu9vybIsjKtIwm9QLHpNDBjA==, tarball: https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@8dcaa17} version: 2.0.0-RC.2 peerDependencies: svelte: ^4.0.0 @@ -1307,15 +1307,15 @@ packages: peerDependencies: '@sveltejs/kit': ^2.0.0 - '@sveltejs/kit@2.55.0': - resolution: {integrity: sha512-MdFRjevVxmAknf2NbaUkDF16jSIzXMWd4Nfah0Qp8TtQVoSp3bV4jKt8mX7z7qTUTWvgSaxtR0EG5WJf53gcuA==} + '@sveltejs/kit@2.57.1': + resolution: {integrity: sha512-VRdSbB96cI1EnRh09CqmnQqP/YJvET5buj8S6k7CxaJqBJD4bw4fRKDjcarAj/eX9k2eHifQfDH8NtOh+ZxxPw==} engines: {node: '>=18.13'} hasBin: true peerDependencies: '@opentelemetry/api': ^1.0.0 '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0 svelte: ^4.0.0 || ^5.0.0-next.0 - typescript: ^5.3.3 + typescript: ^5.3.3 || ^6.0.0 vite: ^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0 peerDependenciesMeta: '@opentelemetry/api': @@ -3632,7 +3632,7 @@ snapshots: '@analytics/type-utils@0.6.4': {} - '@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@67539a6': + '@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@f063676': dependencies: json-bigint: 1.0.0 @@ -3653,7 +3653,7 @@ snapshots: '@appwrite.io/pink-icons': 1.0.0 the-new-css-reset: 1.11.3 - '@appwrite.io/pink-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@bfe7ce3(svelte@5.55.0)': + '@appwrite.io/pink-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@8dcaa17(svelte@5.55.0)': dependencies: '@appwrite.io/pink-icons-svelte': 2.0.0-RC.1(svelte@5.55.0) '@floating-ui/dom': 1.7.6 @@ -4586,17 +4586,17 @@ snapshots: dependencies: '@sentry/browser': 8.55.1 '@sentry/core': 8.55.1 - magic-string: 0.30.7 + magic-string: 0.30.21 svelte: 5.55.0 - '@sentry/sveltekit@8.55.1(@opentelemetry/api@1.9.1)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.1))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.40.0)(@sveltejs/kit@2.55.0(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.0)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)))(svelte@5.55.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)))(svelte@5.55.0)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0))': + '@sentry/sveltekit@8.55.1(@opentelemetry/api@1.9.1)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.1))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.40.0)(@sveltejs/kit@2.57.1(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.0)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)))(svelte@5.55.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)))(svelte@5.55.0)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0))': dependencies: '@sentry/core': 8.55.1 '@sentry/node': 8.55.1 '@sentry/opentelemetry': 8.55.1(@opentelemetry/api@1.9.1)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.1))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.40.0) '@sentry/svelte': 8.55.1(svelte@5.55.0) '@sentry/vite-plugin': 2.22.6 - '@sveltejs/kit': 2.55.0(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.0)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)))(svelte@5.55.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)) + '@sveltejs/kit': 2.57.1(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.0)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)))(svelte@5.55.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)) magic-string: 0.30.7 magicast: 0.2.8 sorcery: 1.0.0 @@ -4664,11 +4664,11 @@ snapshots: dependencies: acorn: 8.16.0 - '@sveltejs/adapter-static@3.0.10(@sveltejs/kit@2.55.0(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.0)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)))(svelte@5.55.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)))': + '@sveltejs/adapter-static@3.0.10(@sveltejs/kit@2.57.1(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.0)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)))(svelte@5.55.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)))': dependencies: - '@sveltejs/kit': 2.55.0(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.0)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)))(svelte@5.55.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)) + '@sveltejs/kit': 2.57.1(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.0)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)))(svelte@5.55.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)) - '@sveltejs/kit@2.55.0(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.0)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)))(svelte@5.55.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0))': + '@sveltejs/kit@2.57.1(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.0)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0)))(svelte@5.55.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(sass@1.98.0))': dependencies: '@standard-schema/spec': 1.1.0 '@sveltejs/acorn-typescript': 1.0.9(acorn@8.16.0) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000000..10e7712b94 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,5 @@ +allowBuilds: + '@parcel/watcher': false + '@sentry/cli': false + esbuild: false + svelte-preprocess: false diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/table.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/table.svelte index 4d891199c6..df259fac74 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/table.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/table.svelte @@ -1,17 +1,11 @@ - (selectedIds = ids)} resource="deployment" onDelete={deleteDeployments} columns={[...columns, { id: 'actions', width: 40 }]}> + {#snippet header(root)} {#each columns as { id, title }} - - {title} - + {title} {/each} {/snippet} + {#snippet children(root)} {#each data.deploymentList.deployments as deployment (deployment.$id)} - {@const effectiveStatus = getEffectiveBuildStatus( - deployment, - $regionalConsoleVariables - )} + {@const effectiveStatus = getEffectiveBuildStatus(deployment, $regionalConsoleVariables as any)} {@const displayStatus = effectiveStatus === 'finalizing' ? 'ready' : effectiveStatus} + + {#each columns as column} {#if column.id === '$id'} - {#key column.id} - {deployment.$id} - {/key} + {deployment.$id} {:else if column.id === 'status'} {#if data?.activeDeployment?.$id === deployment?.$id} {:else} - + {/if} {:else if column.id === 'type'} {:else if column.id === '$updatedAt'} {:else if column.id === 'buildDuration'} - {#if ['waiting'].includes(effectiveStatus)} - - + {#if ['waiting'].includes(effectiveStatus)} - {:else if ['processing', 'building'].includes(effectiveStatus)} {:else} @@ -131,81 +116,36 @@ {/if} {:else if column.id === 'totalSize'} {calculateSize(deployment.totalSize)} - {:else if column.id === 'sourceSize'} - {calculateSize(deployment.sourceSize)} - {:else if column.id === 'buildSize'} - {calculateSize(deployment.buildSize)} {/if} {/each} + - - -
- { - selectedDeployment = deployment; - showRedeploy = true; - toggle(); - trackEvent(Click.FunctionsRedeployClick); - }} - style="width: 100%"> - Redeploy - -
-
Source is empty
-
- {#if deployment.status === 'ready' && deployment.$id !== $func.deploymentId} - { - selectedDeployment = deployment; - showActivate = true; - toggle(); - }}> + { selectedDeployment = deployment; showRedeploy = true; toggle(); }}> + Redeploy + + {#if deployment.status === 'ready' && deployment.$id !== data.activeDeployment?.$id} + { selectedDeployment = deployment; showActivate = true; toggle(); }}> Activate {/if} - - - {#if effectiveStatus === 'processing' || effectiveStatus === 'building' || effectiveStatus === 'waiting'} - { - selectedDeployment = deployment; - toggle(); - - showCancel = true; - trackEvent(Click.FunctionsDeploymentCancelClick); - }}> - Cancel - - {/if} - {#if effectiveStatus !== 'building' && effectiveStatus !== 'processing' && effectiveStatus !== 'waiting'} - { - selectedDeployment = deployment; - toggle(); - - showDelete = true; - trackEvent(Click.FunctionsDeploymentDeleteClick); - }}> - Delete - - {/if} + { selectedDeployment = deployment; showDelete = true; toggle(); }}> + Delete +
@@ -215,13 +155,9 @@ {/snippet} {#snippet deleteContent(count)} -

- Are you sure you want to delete {count} - {count > 1 ? 'deployments' : 'deployment'} from your function - - {page.data.function.name}? -

+

Are you sure you want to delete {count} {count > 1 ? 'deployments' : 'deployment'}?

{/snippet} -
+ {#if selectedDeployment} From d43dc24e1fcfed4aefea5e6a442a9278974dc00b Mon Sep 17 00:00:00 2001 From: AAMIR AKRAM <91816147+Aamir-Akram@users.noreply.github.com> Date: Mon, 20 Apr 2026 08:45:32 +0530 Subject: [PATCH 2/4] fix: restore missing actions and column rendering pointed out by Greptile --- .../function-[function]/table.svelte | 43 ++++++++++++++----- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/table.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/table.svelte index df259fac74..900e4b4ce1 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/table.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/table.svelte @@ -13,9 +13,9 @@ import { Dependencies } from '$lib/constants'; import Cancel from './(modals)/cancelDeploymentModal.svelte'; import { base } from '$app/paths'; - import { ActionMenu, Icon, Status, Table } from '@appwrite.io/pink-svelte'; + import { ActionMenu, Icon, Status, Table, Tooltip } from '@appwrite.io/pink-svelte'; // Tooltip added import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; - import { IconDotsHorizontal, IconLightningBolt, IconRefresh, IconTrash } from '@appwrite.io/pink-icons-svelte'; + import { IconDotsHorizontal, IconLightningBolt, IconRefresh, IconTrash, IconX } from '@appwrite.io/pink-icons-svelte'; // IconX added import { Button } from '$lib/elements/forms'; import { DeploymentCreatedBy, DeploymentSource } from '$lib/components/git'; import Delete from './(modals)/deleteModal.svelte'; @@ -29,7 +29,6 @@ let { data, columns }: { data: PageData; columns: Column[] } = $props(); - // FIX: TypeScript and Svelte 5 Warning bypass const TableComponent = MultiSelectionTable as any; let showDelete = $state(false); @@ -37,7 +36,9 @@ let showActivate = $state(false); let showRedeploy = $state(false); let selectedDeployment: Models.Deployment | null = $state(null); - let selectedIds = $state([]); + + // Bot Suggestion: Changed any[] to string[] for better type safety + let selectedIds = $state([]); function handleActivate() { invalidate(Dependencies.DEPLOYMENTS); @@ -68,7 +69,7 @@ (selectedIds = ids)} + onSelectionChange={(ids: string[]) => (selectedIds = ids)} resource="deployment" onDelete={deleteDeployments} columns={[...columns, { id: 'actions', width: 40 }]}> @@ -116,6 +117,10 @@ {/if} {:else if column.id === 'totalSize'} {calculateSize(deployment.totalSize)} + {:else if column.id === 'sourceSize'} + {calculateSize(deployment.sourceSize)} + {:else if column.id === 'buildSize'} + {calculateSize(deployment.buildSize)} {/if} {/each} @@ -127,11 +132,18 @@ - { selectedDeployment = deployment; showRedeploy = true; toggle(); }}> - Redeploy - + + { selectedDeployment = deployment; showRedeploy = true; toggle(); }}> + Redeploy + + {#snippet tooltip()} + Deployment has no source + {/snippet} + + {#if deployment.status === 'ready' && deployment.$id !== data.activeDeployment?.$id} {/if} + + {#if ['waiting', 'processing', 'building'].includes(effectiveStatus)} + { selectedDeployment = deployment; showCancel = true; toggle(); }}> + Cancel + + {/if} + -{/if} +{/if} \ No newline at end of file From fb20691aaac7198f6e6a3d7fbc62251bc48049bd Mon Sep 17 00:00:00 2001 From: AAMIR AKRAM <91816147+Aamir-Akram@users.noreply.github.com> Date: Mon, 20 Apr 2026 08:57:27 +0530 Subject: [PATCH 3/4] fix: implement conditional rendering for Delete and Cancel based on deployment status --- .../function-[function]/table.svelte | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/table.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/table.svelte index 900e4b4ce1..9f347cc317 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/table.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/table.svelte @@ -13,9 +13,9 @@ import { Dependencies } from '$lib/constants'; import Cancel from './(modals)/cancelDeploymentModal.svelte'; import { base } from '$app/paths'; - import { ActionMenu, Icon, Status, Table, Tooltip } from '@appwrite.io/pink-svelte'; // Tooltip added + import { ActionMenu, Icon, Status, Table, Tooltip } from '@appwrite.io/pink-svelte'; import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; - import { IconDotsHorizontal, IconLightningBolt, IconRefresh, IconTrash, IconX } from '@appwrite.io/pink-icons-svelte'; // IconX added + import { IconDotsHorizontal, IconLightningBolt, IconRefresh, IconTrash, IconX } from '@appwrite.io/pink-icons-svelte'; import { Button } from '$lib/elements/forms'; import { DeploymentCreatedBy, DeploymentSource } from '$lib/components/git'; import Delete from './(modals)/deleteModal.svelte'; @@ -36,8 +36,6 @@ let showActivate = $state(false); let showRedeploy = $state(false); let selectedDeployment: Models.Deployment | null = $state(null); - - // Bot Suggestion: Changed any[] to string[] for better type safety let selectedIds = $state([]); function handleActivate() { @@ -158,15 +156,16 @@ on:click={() => { selectedDeployment = deployment; showCancel = true; toggle(); }}> Cancel + {:else} + { selectedDeployment = deployment; showDelete = true; toggle(); }}> + Delete + {/if} - { selectedDeployment = deployment; showDelete = true; toggle(); }}> - Delete - From 75dd39bf2ecd5537dd3f8c69fb90901008ebc518 Mon Sep 17 00:00:00 2001 From: AAMIR AKRAM <91816147+Aamir-Akram@users.noreply.github.com> Date: Mon, 20 Apr 2026 09:10:23 +0530 Subject: [PATCH 4/4] fix: move batchDelete inside try block for better error handling and UI sync --- .../function-[function]/table.svelte | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/table.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/table.svelte index 9f347cc317..5167a45903 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/table.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/table.svelte @@ -43,21 +43,26 @@ } async function deleteDeployments(batchDelete: any) { - const result = await batchDelete((deploymentId: string) => - sdk.forProject(page.params.region, page.params.project).functions.deleteDeployment({ - functionId: page.params.function, - deploymentId - }) - ); - + let result; try { + // FIX: batchDelete is now inside try block to ensure proper error tracking and UI sync + result = await batchDelete((deploymentId: string) => + sdk.forProject(page.params.region, page.params.project).functions.deleteDeployment({ + functionId: page.params.function, + deploymentId + }) + ); + if (result.error) { trackError(result.error, Submit.DeploymentDelete); } else { trackEvent(Submit.DeploymentDelete, { total: result.deleted.length }); selectedIds = []; } + } catch (e) { + trackError(e, Submit.DeploymentDelete); } finally { + // Ensures UI is refreshed even if some deletions fail await invalidate(Dependencies.DEPLOYMENTS); } return result; @@ -184,4 +189,4 @@ -{/if} \ No newline at end of file +{/if}