From b15669f93411937ee4b9246ab29ec20ccc42461f Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Wed, 28 Sep 2022 18:35:24 +0200 Subject: [PATCH 01/10] feat: new permissions --- src/lib/components/permissions/custom.svelte | 20 ++ .../components/permissions/permissions.svelte | 209 ++++++++++++++++++ src/lib/components/permissions/team.svelte | 72 ++++++ src/lib/components/permissions/user.svelte | 72 ++++++ src/lib/elements/forms/button.svelte | 3 + .../[collection]/settings/+page.svelte | 26 +-- 6 files changed, 388 insertions(+), 14 deletions(-) create mode 100644 src/lib/components/permissions/custom.svelte create mode 100644 src/lib/components/permissions/permissions.svelte create mode 100644 src/lib/components/permissions/team.svelte create mode 100644 src/lib/components/permissions/user.svelte diff --git a/src/lib/components/permissions/custom.svelte b/src/lib/components/permissions/custom.svelte new file mode 100644 index 000000000..58454dc2c --- /dev/null +++ b/src/lib/components/permissions/custom.svelte @@ -0,0 +1,20 @@ + + +
+
+ {#if role === 'users'} +
Users
+ {:else if role === 'guests'} +
Guests
+ {:else if role === 'any'} +
Any
+ {:else} +
{role}
+ {/if} +
+
diff --git a/src/lib/components/permissions/permissions.svelte b/src/lib/components/permissions/permissions.svelte new file mode 100644 index 000000000..bdcd68941 --- /dev/null +++ b/src/lib/components/permissions/permissions.svelte @@ -0,0 +1,209 @@ + + + + +
+
+ + + + + {#if withCreate} + + {/if} + + + + + + + {#each [...$groups] as [role, permission]} + + + {#if withCreate} + + {/if} + + + + + + {/each} + +
+ Role + + Create + + Read + + Update + + Delete + +
+ + + togglePermission(role, 'create')} /> + + togglePermission(role, 'read')} /> + + togglePermission(role, 'update')} /> + + togglePermission(role, 'delete')} /> + +
+ +
+
+
+
+ + + + (showUser = true)}>Select users + (showTeam = true)}>Select teams + + + + + diff --git a/src/lib/components/permissions/team.svelte b/src/lib/components/permissions/team.svelte new file mode 100644 index 000000000..8b3c6f5c0 --- /dev/null +++ b/src/lib/components/permissions/team.svelte @@ -0,0 +1,72 @@ + + +
+ + Select team + +
+ + + {#each results as team (team.$id)} + {@const role = `team:${team.$id}`} + + + + + {/each} + +
+ selected.add(role)} /> + +
+
+ +
+
+
{team.name}
+
{team.$id}
+
+
+
+
+ + + +
+
diff --git a/src/lib/components/permissions/user.svelte b/src/lib/components/permissions/user.svelte new file mode 100644 index 000000000..ead290e07 --- /dev/null +++ b/src/lib/components/permissions/user.svelte @@ -0,0 +1,72 @@ + + +
+ + Select team + +
+ + + {#each results as user (user.$id)} + {@const role = `user:${user.$id}`} + + + + + {/each} + +
+ selected.add(role)} /> + +
+
+ +
+
+
{user.name}
+
{user.$id}
+
+
+
+
+ + + +
+
diff --git a/src/lib/elements/forms/button.svelte b/src/lib/elements/forms/button.svelte index c89eb1148..1dd056919 100644 --- a/src/lib/elements/forms/button.svelte +++ b/src/lib/elements/forms/button.svelte @@ -9,6 +9,7 @@ export let href: string = null; export let fullWidth = false; export let ariaLabel: string = null; + export let noMargin = false; //TODO: add option to add aria-label to buttons that are only icons @@ -24,6 +25,7 @@ class:is-text={text} class:is-danger={danger} class:is-full-width={fullWidth} + class:u-padding-inline-0={noMargin} aria-label={ariaLabel}> @@ -37,6 +39,7 @@ class:is-danger={danger} class:is-text={text} class:is-full-width={fullWidth} + class:u-padding-inline-0={noMargin} type={submit ? 'submit' : 'button'} aria-label={ariaLabel}> diff --git a/src/routes/console/project-[project]/databases/database/[database]/collection/[collection]/settings/+page.svelte b/src/routes/console/project-[project]/databases/database/[database]/collection/[collection]/settings/+page.svelte index f1b507d8f..ce5bedff3 100644 --- a/src/routes/console/project-[project]/databases/database/[database]/collection/[collection]/settings/+page.svelte +++ b/src/routes/console/project-[project]/databases/database/[database]/collection/[collection]/settings/+page.svelte @@ -1,7 +1,7 @@
  • - + + + diff --git a/src/lib/components/permissions/permissions.svelte b/src/lib/components/permissions/permissions.svelte index bdcd68941..13f71dffa 100644 --- a/src/lib/components/permissions/permissions.svelte +++ b/src/lib/components/permissions/permissions.svelte @@ -16,6 +16,7 @@ import { writable } from 'svelte/store'; import { DropList, DropListItem } from '..'; import Custom from './custom.svelte'; + import Row from './row.svelte'; import Team from './team.svelte'; import User from './user.svelte'; @@ -24,6 +25,7 @@ let showUser = false; let showTeam = false; + let showCustom = false; let showDropdown = false; const groups = writable>(new Map()); @@ -39,24 +41,28 @@ }); function create(event: CustomEvent) { - groups.update((n) => { - for (const role of event.detail) { - if (n.has(role)) { - return n; - } + for (const role of event.detail) { + addRole(role); + } - n.set(role, { - create: false, - read: false, - update: false, - delete: false - }); - } + showTeam = showUser = false; + } + + function addRole(role: string) { + if ($groups.has(role)) { + return; + } + + groups.update((n) => { + n.set(role, { + create: false, + read: false, + update: false, + delete: false + }); return n; }); - - showTeam = showUser = false; } function fromPermissionString(permission: string): void { @@ -136,7 +142,7 @@ {#each [...$groups] as [role, permission]} - + {#if withCreate} @@ -200,10 +206,21 @@ Add role + addRole('any')}> + Any + + addRole('guests')}> + All guests + + addRole('users')}> + All users + (showUser = true)}>Select users (showTeam = true)}>Select teams + (showCustom = true)}>Custom permission + diff --git a/src/lib/components/permissions/row.svelte b/src/lib/components/permissions/row.svelte new file mode 100644 index 000000000..58454dc2c --- /dev/null +++ b/src/lib/components/permissions/row.svelte @@ -0,0 +1,20 @@ + + +
    +
    + {#if role === 'users'} +
    Users
    + {:else if role === 'guests'} +
    Guests
    + {:else if role === 'any'} +
    Any
    + {:else} +
    {role}
    + {/if} +
    +
    diff --git a/src/lib/components/permissions/team.svelte b/src/lib/components/permissions/team.svelte index 8b3c6f5c0..b9bf837b0 100644 --- a/src/lib/components/permissions/team.svelte +++ b/src/lib/components/permissions/team.svelte @@ -1,11 +1,11 @@
    - - Select team + + Select teams -
    - - - {#each results as team (team.$id)} - {@const role = `team:${team.$id}`} - - - - - {/each} - -
    - selected.add(role)} /> - -
    -
    - -
    -
    -
    {team.name}
    -
    {team.$id}
    -
    -
    -
    + {#if results?.teams} +
    + + + {#each results.teams as team (team.$id)} + {@const role = `team:${team.$id}`} + {@const exists = $groups.has(role)} + + + + + {/each} + +
    + onSelection(event, role)} /> + + +
    +
    + {/if} +
    +

    Total results: {results?.total}

    +
    - + diff --git a/src/lib/components/permissions/user.svelte b/src/lib/components/permissions/user.svelte index ead290e07..806760bea 100644 --- a/src/lib/components/permissions/user.svelte +++ b/src/lib/components/permissions/user.svelte @@ -1,11 +1,11 @@
    - - Select team + + Select users -
    - - - {#each results as user (user.$id)} - {@const role = `user:${user.$id}`} - - - - - {/each} - -
    - selected.add(role)} /> - -
    -
    - -
    -
    -
    {user.name}
    -
    {user.$id}
    -
    -
    -
    + {#if results?.users} +
    + + + {#each results.users as user (user.$id)} + {@const role = `user:${user.$id}`} + {@const exists = $groups.has(role)} + + + + + {/each} + +
    + onSelection(event, role)} /> + + +
    +
    + {/if} +
    +

    Total results: {results?.total}

    +
    - + diff --git a/src/lib/elements/forms/inputSearch.svelte b/src/lib/elements/forms/inputSearch.svelte index e1806d3d7..8149a5652 100644 --- a/src/lib/elements/forms/inputSearch.svelte +++ b/src/lib/elements/forms/inputSearch.svelte @@ -1,5 +1,6 @@
    - + Select teams {#if results?.teams} diff --git a/src/lib/components/permissions/user.svelte b/src/lib/components/permissions/user.svelte index 806760bea..584b5f647 100644 --- a/src/lib/components/permissions/user.svelte +++ b/src/lib/components/permissions/user.svelte @@ -59,7 +59,7 @@ - + Select users {#if results?.users} From e6acaca22f31836a71db19876bd305a052205938 Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Tue, 4 Oct 2022 12:46:45 +0200 Subject: [PATCH 04/10] fix: custom permissions --- src/lib/components/permissions/custom.svelte | 7 +++-- .../components/permissions/permissions.svelte | 27 ++++++++++++++++--- .../[collection]/settings/+page.svelte | 6 ++--- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/lib/components/permissions/custom.svelte b/src/lib/components/permissions/custom.svelte index 680c1018b..ea8c6b76d 100644 --- a/src/lib/components/permissions/custom.svelte +++ b/src/lib/components/permissions/custom.svelte @@ -15,12 +15,15 @@ function reset() { value = ''; + show = false; } function create() { dispatch('create', [value]); reset(); } + + $: disabled = !value || $groups.has(value); @@ -33,14 +36,14 @@ id="custom-permission" label="Custom permission" placeholder="user:[USER_ID] or team:[TEAM_ID]/[ROLE]" - {value} /> + bind:value /> A permission should be formatted as: user:[USER_ID] or team:[TEAM_ID]/[ROLE]¸ - + diff --git a/src/lib/components/permissions/permissions.svelte b/src/lib/components/permissions/permissions.svelte index 13f71dffa..714561ae2 100644 --- a/src/lib/components/permissions/permissions.svelte +++ b/src/lib/components/permissions/permissions.svelte @@ -33,9 +33,12 @@ onMount(() => { permissions.forEach(fromPermissionString); groups.subscribe(() => { - const a = exportRoles(); - if (difference(a, permissions).length || difference(permissions, a).length) { - permissions = a; + const current = exportRoles(); + if ( + difference(current, permissions).length || + difference(permissions, current).length + ) { + permissions = current; } }); }); @@ -63,6 +66,8 @@ return n; }); + + showDropdown = false; } function fromPermissionString(permission: string): void { @@ -111,6 +116,20 @@ return prev; }, []); } + + function sortRoles([a]: [string, Permission], [b]: [string, Permission]) { + if ((a === 'any') !== (b === 'any')) { + return a === 'any' ? -1 : 1; + } + if ((a === 'users') !== (b === 'users')) { + return a === 'users' ? -1 : 1; + } + if ((a === 'guests') !== (b === 'guests')) { + return a === 'guests' ? -1 : 1; + } + + return a.localeCompare(b); + }
    @@ -139,7 +158,7 @@ - {#each [...$groups] as [role, permission]} + {#each [...$groups].sort(sortRoles) as [role, permission]} diff --git a/src/routes/console/project-[project]/databases/database/[database]/collection/[collection]/settings/+page.svelte b/src/routes/console/project-[project]/databases/database/[database]/collection/[collection]/settings/+page.svelte index ce5bedff3..4c10657c8 100644 --- a/src/routes/console/project-[project]/databases/database/[database]/collection/[collection]/settings/+page.svelte +++ b/src/routes/console/project-[project]/databases/database/[database]/collection/[collection]/settings/+page.svelte @@ -93,7 +93,7 @@ databaseId, $collection.$id, $collection.name, - collectionDocumentSecurity ? collectionPermissions : $collection.$permissions + collectionDocumentSecurity ? $collection.$permissions : collectionPermissions ); $collection.$permissions = collectionPermissions; $collection.documentSecurity = collectionDocumentSecurity; @@ -208,8 +208,8 @@ documentation for more on Permissions

    - {#if collectionPermissions} - + {#if collectionPermissions !== null} + {/if} {/if} From e058211c0fd4d4a3959e562f6727b8ad2d0f3415 Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Tue, 4 Oct 2022 13:22:32 +0200 Subject: [PATCH 05/10] fix: permissions --- src/lib/components/permissions/permissions.svelte | 13 ++++++++++--- .../collection/[collection]/settings/+page.svelte | 13 ++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/lib/components/permissions/permissions.svelte b/src/lib/components/permissions/permissions.svelte index 714561ae2..47f5f9f3c 100644 --- a/src/lib/components/permissions/permissions.svelte +++ b/src/lib/components/permissions/permissions.svelte @@ -12,8 +12,8 @@ -
    + Custom permission diff --git a/src/lib/components/permissions/index.ts b/src/lib/components/permissions/index.ts new file mode 100644 index 000000000..865f2d75c --- /dev/null +++ b/src/lib/components/permissions/index.ts @@ -0,0 +1 @@ +export { default as Permissions } from './permissions.svelte'; diff --git a/src/lib/components/permissions/row.svelte b/src/lib/components/permissions/row.svelte index 58454dc2c..2f23de52b 100644 --- a/src/lib/components/permissions/row.svelte +++ b/src/lib/components/permissions/row.svelte @@ -1,8 +1,5 @@
    diff --git a/src/lib/components/permissions/team.svelte b/src/lib/components/permissions/team.svelte index 732877aab..7aa0ca1ad 100644 --- a/src/lib/components/permissions/team.svelte +++ b/src/lib/components/permissions/team.svelte @@ -58,7 +58,7 @@ } - + Select teams diff --git a/src/lib/components/permissions/user.svelte b/src/lib/components/permissions/user.svelte index 584b5f647..20741b686 100644 --- a/src/lib/components/permissions/user.svelte +++ b/src/lib/components/permissions/user.svelte @@ -58,7 +58,7 @@ } - + Select users diff --git a/src/lib/elements/forms/form.svelte b/src/lib/elements/forms/form.svelte index dcc806372..ce34663f5 100644 --- a/src/lib/elements/forms/form.svelte +++ b/src/lib/elements/forms/form.svelte @@ -1,4 +1,8 @@ + + - + diff --git a/src/routes/console/project-[project]/databases/database/[database]/collection/[collection]/document/[document]/+page.svelte b/src/routes/console/project-[project]/databases/database/[database]/collection/[collection]/document/[document]/+page.svelte index 3006a378d..d6021ba89 100644 --- a/src/routes/console/project-[project]/databases/database/[database]/collection/[collection]/document/[document]/+page.svelte +++ b/src/routes/console/project-[project]/databases/database/[database]/collection/[collection]/document/[document]/+page.svelte @@ -1,7 +1,7 @@ @@ -12,21 +11,7 @@ Document Level. If collection Level permissions are assigned, permissions applied to individual documents are ignored. - - - You have Collection Level permissions enabled - -

    - If you want to assign permissions specific to this document, you will need to update - your Collection Settings to enable Document Level permissions. -

    -
    - -
      - -
    +
    + +
    diff --git a/src/routes/console/project-[project]/storage/bucket/[bucket]/_create.svelte b/src/routes/console/project-[project]/storage/bucket/[bucket]/_create.svelte index fe94f6e7f..fc6c21eb5 100644 --- a/src/routes/console/project-[project]/storage/bucket/[bucket]/_create.svelte +++ b/src/routes/console/project-[project]/storage/bucket/[bucket]/_create.svelte @@ -1,13 +1,14 @@