diff --git a/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/updatePrefs.svelte b/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/updatePrefs.svelte index 8c33d02303..79e2bbe7c4 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/updatePrefs.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/updatePrefs.svelte @@ -12,31 +12,45 @@ import { IconPlus } from '@appwrite.io/pink-icons-svelte'; import { page } from '$app/state'; + type PrefRow = { id: string; key: string; value: string }; + $: if (prefs) { - if (JSON.stringify(prefs) !== JSON.stringify(Object.entries($team.prefs))) { - if (!!prefs[prefs.length - 1][0] && !!prefs[prefs.length - 1][1]) { - arePrefsDisabled = false; - } else { - arePrefsDisabled = true; - } - } else { - arePrefsDisabled = true; - } + const normalize = (entries: [string, string][] | PrefRow[]) => + entries + .map(item => Array.isArray(item) ? item : [item.key, item.value]) + .filter(([k, v]: [string, string]) => k.trim() && v.trim()) + .sort(([a]: [string, string], [b]: [string, string]) => a.localeCompare(b)); + + const currentNormalized = normalize(prefs); + const originalNormalized = normalize(Object.entries($team.prefs as Record)); + + arePrefsDisabled = JSON.stringify(currentNormalized) === JSON.stringify(originalNormalized); } - let prefs: [string, string][] = null; + let prefs: PrefRow[] = null; let arePrefsDisabled = true; + let nextId = 0; + + function createPrefRow(key = '', value = ''): PrefRow { + return { id: `pref-${nextId++}`, key, value }; + } onMount(async () => { - prefs = Object.entries($team.prefs as Record); - if (!prefs?.length) { - prefs.push(['', '']); - } + const entries = Object.entries($team.prefs as Record); + prefs = entries.length > 0 + ? entries.map(([key, value]) => createPrefRow(key, value)) + : [createPrefRow()]; }); async function updatePrefs() { try { - let updatedPrefs = Object.fromEntries(prefs); + const sanitizedPrefs = prefs.filter( + pref => pref.key.trim() !== '' && pref.value.trim() !== '' + ); + + const updatedPrefs = sanitizedPrefs.length === 0 + ? {} + : Object.fromEntries(sanitizedPrefs.map(pref => [pref.key, pref.value])); await sdk .forProject(page.params.region, page.params.project) @@ -66,32 +80,36 @@ they can easily be shared across members. {#if prefs} - {#each prefs as [key, value], index} + {#each prefs as pref, index (pref.id)} { + prefs[index].key = e.target.value; + prefs = [...prefs]; + }} placeholder="Enter key" label={index === 0 ? 'Key' : undefined} required /> { + prefs[index].value = e.target.value; + prefs = [...prefs]; + }} placeholder="Enter value" label={index === 0 ? 'Value' : undefined} required /> @@ -103,14 +121,13 @@ @@ -98,14 +120,13 @@