From 42d4711503f41f1bdf200f6a290eb7e218f2e69e Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sun, 18 Dec 2022 05:55:29 +0100 Subject: [PATCH] path improvements v1 --- backend/windmill-api/openapi.yaml | 5 + backend/windmill-api/src/groups.rs | 24 +- backend/windmill-api/src/users.rs | 2 +- .../src/lib/components/GroupEditor.svelte | 88 +++---- frontend/src/lib/components/Path.svelte | 133 ++++++----- .../src/lib/components/ScriptBuilder.svelte | 222 +++++++++--------- .../components/common/drawer/Drawer.svelte | 2 +- .../common/toggleButton/ToggleButton.svelte | 2 +- 8 files changed, 258 insertions(+), 220 deletions(-) diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 1601e01c1f..1bcd30534d 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -3460,6 +3460,11 @@ paths: - group parameters: - $ref: "#/components/parameters/WorkspaceId" + - name: only_member_of + in: query + description: only list the groups the user is member of (default false) + schema: + type: boolean responses: "200": description: group list diff --git a/backend/windmill-api/src/groups.rs b/backend/windmill-api/src/groups.rs index 0b0f4ecaef..aa9b680f2c 100644 --- a/backend/windmill-api/src/groups.rs +++ b/backend/windmill-api/src/groups.rs @@ -8,7 +8,7 @@ use crate::{ db::{UserDB, DB}, - users::Authed, + users::{get_groups_for_user, Authed}, }; use axum::{ extract::{Extension, Path, Query}, @@ -91,16 +91,26 @@ async fn list_groups( Ok(Json(rows)) } +#[derive(Deserialize)] +struct QueryListGroup { + pub only_member_of: Option, +} async fn list_group_names( + Authed { username, .. }: Authed, Extension(db): Extension, + Query(QueryListGroup { only_member_of }): Query, Path(w_id): Path, ) -> JsonResult> { - let rows = sqlx::query_scalar!( - "SELECT name FROM group_ WHERE workspace_id = $1 ORDER BY name desc", - w_id - ) - .fetch_all(&db) - .await?; + let rows = if !only_member_of.unwrap_or(false) { + sqlx::query_scalar!( + "SELECT name FROM group_ WHERE workspace_id = $1 ORDER BY name desc", + w_id + ) + .fetch_all(&db) + .await? + } else { + get_groups_for_user(&w_id, &username, &db).await? + }; Ok(Json(rows)) } diff --git a/backend/windmill-api/src/users.rs b/backend/windmill-api/src/users.rs index 65a1e086b8..4641462ce7 100644 --- a/backend/windmill-api/src/users.rs +++ b/backend/windmill-api/src/users.rs @@ -771,7 +771,7 @@ async fn get_user(w_id: &str, username: &str, db: &DB) -> Result Result> { +pub async fn get_groups_for_user(w_id: &str, username: &str, db: &DB) -> Result> { let groups = sqlx::query_scalar!( "SELECT group_ FROM usr_to_group where usr = $1 AND workspace_id = $2", username, diff --git a/frontend/src/lib/components/GroupEditor.svelte b/frontend/src/lib/components/GroupEditor.svelte index ee6712dde7..98509db13d 100644 --- a/frontend/src/lib/components/GroupEditor.svelte +++ b/frontend/src/lib/components/GroupEditor.svelte @@ -230,47 +230,53 @@ >Groups managing this group Any member of those groups can manage this group -
- - -
- - - group - - - - {#each managing_groups as managing_group} - {managing_group.split('/')[1]} - - {#if can_write} - - {/if} - {/each} - - + {#if can_write} +
+ + +
+ {/if} + {#if managing_groups.length == 0} +

No group is managing this group

+ {:else} + + + group + + + + {#each managing_groups as managing_group} + {managing_group.split('/')[1]} + + {#if can_write} + + {/if} + {/each} + + + {/if} {:else}
{#each new Array(6) as _} diff --git a/frontend/src/lib/components/Path.svelte b/frontend/src/lib/components/Path.svelte index e862992df3..7e8c64ef78 100644 --- a/frontend/src/lib/components/Path.svelte +++ b/frontend/src/lib/components/Path.svelte @@ -16,8 +16,11 @@ import Required from './Required.svelte' import Popover from './Popover.svelte' import { Button, Drawer, DrawerContent } from './common' - import { faPlus } from '@fortawesome/free-solid-svg-icons' + import { faEye, faPlus } from '@fortawesome/free-solid-svg-icons' import GroupEditor from './GroupEditor.svelte' + import ToggleButtonGroup from './common/toggleButton/ToggleButtonGroup.svelte' + import ToggleButton from './common/toggleButton/ToggleButton.svelte' + import { Icon } from 'svelte-awesome' type PathKind = 'resource' | 'script' | 'variable' | 'flow' | 'schedule' | 'app' let meta: Meta | undefined = undefined @@ -33,7 +36,7 @@ const dispatch = createEventDispatcher() - let groups: Group[] = [] + let groups: string[] = [] $: meta && onMetaChange() @@ -82,7 +85,10 @@ } async function loadGroups(): Promise { - groups = await GroupService.listGroups({ workspace: $workspaceStore! }) + groups = await GroupService.listGroupNames({ + workspace: $workspaceStore!, + onlyMemberOf: !($userStore?.is_admin || $superadmin) + }) } async function validate(meta: Meta, path: string, kind: PathKind) { @@ -161,6 +167,7 @@ } let newGroup: Drawer + let viewGroup: Drawer let newGroupName: string let groupCreated: string | undefined = undefined @@ -190,63 +197,77 @@ -
-
- {#if meta != undefined} - - {#if meta.ownerKind === 'user'} - - {:else} - - {/if} + {#if meta.ownerKind === 'user'} + + {:else} + + {/if} +