Skip to content

Commit c0f5b62

Browse files
committed
remove: platforms dependency.
add: multi select table on platforms for batch delete.
1 parent b178461 commit c0f5b62

10 files changed

Lines changed: 110 additions & 81 deletions

File tree

src/lib/constants.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ export enum Dependencies {
6363
DEPLOYMENTS = 'dependency:deployments',
6464
EXECUTIONS = 'dependency:executions',
6565
PLATFORM = 'dependency:platform',
66-
PLATFORMS = 'dependency:platforms',
6766
KEY = 'dependency:key',
6867
KEYS = 'dependency:keys',
6968
DEV_KEY = 'dependency:dev_key',

src/routes/(console)/organization-[organization]/+page.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { CARD_LIMIT, Dependencies } from '$lib/constants';
55
import type { PageLoad } from './$types';
66
import { redirect } from '@sveltejs/kit';
77
import { base } from '$app/paths';
8+
import { isCloud } from '$lib/system';
89

910
export const load: PageLoad = async ({ params, url, route, depends, parent }) => {
1011
const { scopes } = await parent();
@@ -25,7 +26,7 @@ export const load: PageLoad = async ({ params, url, route, depends, parent }) =>
2526
Query.equal('teamId', params.organization),
2627
Query.limit(limit),
2728
Query.orderDesc(''),
28-
Query.select(['$id', 'name', 'region', 'status']) /* NOTE: @itznotabug - status is cloud only */
29+
Query.select(['$id', 'name', 'platforms', 'region', ...(isCloud ? ['status'] : [])])
2930
],
3031
search: search || undefined
3132
});

src/routes/(console)/project-[region]-[project]/overview/platforms/+page.svelte

Lines changed: 96 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<script lang="ts" context="module">
1+
<script lang="ts" module>
22
import { columns } from './store';
33
import { wizard } from '$lib/stores/wizard';
44
import CreateAndroid from './createAndroid.svelte';
@@ -59,8 +59,7 @@
5959
</script>
6060

6161
<script lang="ts">
62-
import { base } from '$app/paths';
63-
import { page } from '$app/state';
62+
import { resolve } from '$app/paths';
6463
import { Button } from '$lib/elements/forms';
6564
import { canWritePlatforms } from '$lib/stores/roles';
6665
import { setOverviewAction } from '../context';
@@ -84,25 +83,33 @@
8483
import type { ComponentType } from 'svelte';
8584
import DualTimeView from '$lib/components/dualTimeView.svelte';
8685
87-
export let data;
86+
import { page } from '$app/state';
87+
import type { PageProps } from './$types';
88+
import type { Models } from '@appwrite.io/console';
89+
import { type DeleteOperationState, MultiSelectionTable } from '$lib/components';
90+
import { sdk } from '$lib/stores/sdk';
91+
import { Submit, trackError } from '$lib/actions/analytics';
92+
import { invalidate } from '$app/navigation';
93+
import { Dependencies } from '$lib/constants';
94+
95+
const { data }: PageProps = $props();
8896
89-
enum PlatformTypes {
90-
'apple-ios' = 'iOS',
91-
'apple-macos' = 'macOS',
92-
'apple-watchos' = 'watchOS',
93-
'apple-tvos' = 'tvOS',
94-
'android' = 'Android',
95-
'flutter-android' = 'Android',
96-
'flutter-ios' = 'iOS',
97-
'flutter-linux' = 'Linux',
98-
'flutter-macos' = 'macOS',
99-
'flutter-windows' = 'Windows',
100-
'flutter-web' = 'Web',
101-
'react-native-android' = 'Android',
102-
'react-native-ios' = 'iOS',
103-
'web' = 'Web'
104-
}
105-
const path = `${base}/project-${page.params.region}-${page.params.project}/overview/platforms`;
97+
const PlatformTypes = {
98+
'apple-ios': 'iOS',
99+
'apple-macos': 'macOS',
100+
'apple-watchos': 'watchOS',
101+
'apple-tvos': 'tvOS',
102+
android: 'Android',
103+
'flutter-android': 'Android',
104+
'flutter-ios': 'iOS',
105+
'flutter-linux': 'Linux',
106+
'flutter-macos': 'macOS',
107+
'flutter-windows': 'Windows',
108+
'flutter-web': 'Web',
109+
'react-native-android': 'Android',
110+
'react-native-ios': 'iOS',
111+
web: 'Web'
112+
} as const;
106113
107114
function getPlatformInfo(platform: string): ComponentType {
108115
if (platform.includes('flutter')) {
@@ -118,46 +125,82 @@
118125
}
119126
}
120127
128+
function getPlatformPath(platform: Models.Platform) {
129+
return resolve('/(console)/project-[region]-[project]/overview/platforms/[platform]', {
130+
region: page.params.region,
131+
project: page.params.project,
132+
platform: platform.$id
133+
});
134+
}
135+
136+
async function handlePlatformDelete(
137+
selectedPlatforms: string[]
138+
): Promise<DeleteOperationState> {
139+
const promises = selectedPlatforms.map((platformId) => {
140+
return sdk.forConsole.projects.deletePlatform({
141+
projectId: page.params.project,
142+
platformId
143+
});
144+
});
145+
146+
try {
147+
await Promise.all(promises);
148+
trackEvent(Submit.PlatformDelete, { total: selectedPlatforms.length });
149+
} catch (error) {
150+
trackError(error, Submit.PlatformDelete);
151+
return error;
152+
} finally {
153+
await invalidate(Dependencies.PROJECT);
154+
}
155+
}
156+
121157
setOverviewAction(Action);
122158
</script>
123159

124-
{#if data.platforms.platforms.length}
125-
<Table.Root columns={$columns} let:root>
126-
<svelte:fragment slot="header" let:root>
160+
{#if data.platforms.total}
161+
<MultiSelectionTable
162+
resource="platform"
163+
columns={$columns}
164+
onDelete={handlePlatformDelete}
165+
allowSelection={false /*$canWritePlatforms*/}>
166+
{#snippet header(root)}
127167
{#each $columns as column}
128168
<Table.Header.Cell {root} column={column.id}>
129169
{column.title}
130170
</Table.Header.Cell>
131171
{/each}
132-
</svelte:fragment>
133-
{#each data.platforms.platforms as platform}
134-
<Table.Row.Link href={`${path}/${platform.$id}`} {root}>
135-
<Table.Cell {root}>
136-
{platform.name}
137-
</Table.Cell>
138-
<Table.Cell {root}>
139-
<Layout.Stack direction="row" gap="s" alignItems="center">
140-
<Icon icon={getPlatformInfo(platform.type)} />
141-
{PlatformTypes[platform.type]}
142-
</Layout.Stack>
143-
</Table.Cell>
144-
<Table.Cell {root}>
145-
{#if platform.type.includes('web') || platform.type === 'web'}
146-
{platform.hostname || ''}
147-
{:else}
148-
{platform.key || platform.hostname || ''}
149-
{/if}
150-
</Table.Cell>
151-
<Table.Cell {root}>
152-
{#if platform.$updatedAt}
153-
<DualTimeView time={platform.$updatedAt} />
154-
{:else}
155-
never
156-
{/if}
157-
</Table.Cell>
158-
</Table.Row.Link>
159-
{/each}
160-
</Table.Root>
172+
{/snippet}
173+
174+
{#snippet children(root)}
175+
{#each data.platforms.platforms as platform}
176+
<Table.Row.Link href={getPlatformPath(platform)} {root} id={platform.$id}>
177+
<Table.Cell {root}>
178+
{platform.name}
179+
</Table.Cell>
180+
<Table.Cell {root}>
181+
<Layout.Stack direction="row" gap="s" alignItems="center">
182+
<Icon icon={getPlatformInfo(platform.type)} />
183+
{PlatformTypes[platform.type]}
184+
</Layout.Stack>
185+
</Table.Cell>
186+
<Table.Cell {root}>
187+
{#if platform.type.includes('web') || platform.type === 'web'}
188+
{platform.hostname || ''}
189+
{:else}
190+
{platform.key || platform.hostname || ''}
191+
{/if}
192+
</Table.Cell>
193+
<Table.Cell {root}>
194+
{#if platform.$updatedAt}
195+
<DualTimeView time={platform.$updatedAt} />
196+
{:else}
197+
never
198+
{/if}
199+
</Table.Cell>
200+
</Table.Row.Link>
201+
{/each}
202+
{/snippet}
203+
</MultiSelectionTable>
161204
{:else}
162205
<Card.Base padding="none">
163206
<Empty
Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import { sdk } from '$lib/stores/sdk';
21
import type { PageLoad } from './$types';
3-
import { Dependencies } from '$lib/constants';
42

5-
export const load: PageLoad = async ({ params, depends }) => {
6-
depends(Dependencies.PLATFORMS);
3+
export const load: PageLoad = async ({ parent }) => {
4+
const { project } = await parent();
75
return {
8-
platforms: await sdk.forConsole.projects.listPlatforms({ projectId: params.project })
6+
platforms: {
7+
platforms: project.platforms,
8+
total: project.platforms.length
9+
}
910
};
1011
};

src/routes/(console)/project-[region]-[project]/overview/platforms/[platform]/delete.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
projectId: $project.$id,
1818
platformId: $platform.$id
1919
});
20-
await invalidate(Dependencies.PLATFORMS);
20+
await invalidate(Dependencies.PROJECT);
2121
showDelete = false;
2222
addNotification({
2323
type: 'success',

src/routes/(console)/project-[region]-[project]/overview/platforms/createAndroid.svelte

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,10 +134,7 @@ const val APPWRITE_PUBLIC_ENDPOINT = "${sdk.forProject(page.params.region, page.
134134
message: 'Platform created.'
135135
});
136136
137-
await Promise.all([
138-
invalidate(Dependencies.PROJECT),
139-
invalidate(Dependencies.PLATFORMS)
140-
]);
137+
await invalidate(Dependencies.PROJECT);
141138
} catch (error) {
142139
trackError(error, Submit.PlatformCreate);
143140
addNotification({

src/routes/(console)/project-[region]-[project]/overview/platforms/createApple.svelte

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,7 @@ APPWRITE_PUBLIC_ENDPOINT: "${sdk.forProject(page.params.region, page.params.proj
9797
message: 'Platform created.'
9898
});
9999
100-
await Promise.all([
101-
invalidate(Dependencies.PROJECT),
102-
invalidate(Dependencies.PLATFORMS)
103-
]);
100+
await invalidate(Dependencies.PROJECT);
104101
} catch (error) {
105102
trackError(error, Submit.PlatformCreate);
106103
addNotification({

src/routes/(console)/project-[region]-[project]/overview/platforms/createFlutter.svelte

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -187,10 +187,7 @@ client.ping();
187187
message: 'Platform created.'
188188
});
189189
190-
await Promise.all([
191-
invalidate(Dependencies.PROJECT),
192-
invalidate(Dependencies.PLATFORMS)
193-
]);
190+
await invalidate(Dependencies.PROJECT);
194191
} catch (error) {
195192
trackError(error, Submit.PlatformCreate);
196193
addNotification({

src/routes/(console)/project-[region]-[project]/overview/platforms/createReactNative.svelte

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,10 +128,7 @@ EXPO_PUBLIC_APPWRITE_ENDPOINT=${sdk.forProject(page.params.region, page.params.p
128128
message: 'Platform created.'
129129
});
130130
131-
await Promise.all([
132-
invalidate(Dependencies.PROJECT),
133-
invalidate(Dependencies.PLATFORMS)
134-
]);
131+
await invalidate(Dependencies.PROJECT);
135132
} catch (error) {
136133
trackError(error, Submit.PlatformCreate);
137134
addNotification({

src/routes/(console)/project-[region]-[project]/overview/platforms/createWeb.svelte

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -243,10 +243,7 @@ APPWRITE_ENDPOINT = "${sdk.forProject(page.params.region, page.params.project).c
243243
message: 'Platform created.'
244244
});
245245
246-
await Promise.all([
247-
invalidate(Dependencies.PROJECT),
248-
invalidate(Dependencies.PLATFORMS)
249-
]);
246+
await invalidate(Dependencies.PROJECT);
250247
} catch (error) {
251248
trackError(error, Submit.PlatformCreate);
252249
addNotification({

0 commit comments

Comments
 (0)