From 145d02461cebbb0b2e4dd351d50f7b7d372b814d Mon Sep 17 00:00:00 2001 From: Diego Imbert <70353967+diegoimbert@users.noreply.github.com> Date: Tue, 28 Oct 2025 12:32:10 +0100 Subject: [PATCH] User item filters in Resource and Variables page (#6971) * Only f/* and u/username toggle in Variables page * Only f/* and u/username toggle in Resources page --- .../(root)/(logged)/resources/+page.svelte | 81 +++++++++++++------ .../(root)/(logged)/variables/+page.svelte | 40 +++++++-- 2 files changed, 90 insertions(+), 31 deletions(-) diff --git a/frontend/src/routes/(root)/(logged)/resources/+page.svelte b/frontend/src/routes/(root)/(logged)/resources/+page.svelte index a5f7269f11..0452b14ffe 100644 --- a/frontend/src/routes/(root)/(logged)/resources/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/resources/+page.svelte @@ -383,32 +383,41 @@ ? currentResources : currentResources?.filter((x) => x.path.startsWith(ownerFilter ?? '')) ) - let preFilteredType = $derived( - typeFilter == undefined - ? preFilteredItemsOwners?.filter((x) => { - return tab === 'workspace' - ? x.resource_type !== 'app_theme' && - x.resource_type !== 'state' && - x.resource_type !== 'cache' - : tab === 'states' - ? x.resource_type === 'state' - : tab === 'cache' - ? x.resource_type === 'cache' - : tab === 'theme' - ? x.resource_type === 'app_theme' - : true - }) - : preFilteredItemsOwners?.filter((x) => { - return ( - x.resource_type === typeFilter && - (tab === 'workspace' + let preFilteredType = $derived.by(() => { + let l = + typeFilter == undefined + ? preFilteredItemsOwners?.filter((x) => { + return tab === 'workspace' ? x.resource_type !== 'app_theme' && - x.resource_type !== 'state' && - x.resource_type !== 'cache' - : true) - ) - }) - ) + x.resource_type !== 'state' && + x.resource_type !== 'cache' + : tab === 'states' + ? x.resource_type === 'state' + : tab === 'cache' + ? x.resource_type === 'cache' + : tab === 'theme' + ? x.resource_type === 'app_theme' + : true + }) + : preFilteredItemsOwners?.filter((x) => { + return ( + x.resource_type === typeFilter && + (tab === 'workspace' + ? x.resource_type !== 'app_theme' && + x.resource_type !== 'state' && + x.resource_type !== 'cache' + : true) + ) + }) + if (filterUserFolders) { + l = l?.filter((item) => { + if (filterUserFoldersType === 'only f/*') return item.path.startsWith('f/') + if (filterUserFoldersType === 'u/username and f/*') + return item.path.startsWith('f/') || item.path.startsWith(`u/${$userStore?.username}/`) + }) + } + return l + }) $effect(() => { if ($workspaceStore && $userStore) { untrack(() => { @@ -428,6 +437,15 @@ }) let dbManagerDrawer: DbManagerDrawer | undefined = $state() + + let filterUserFolders = $state(false) + let filterUserFoldersType: 'only f/*' | 'u/username and f/*' | undefined = $derived( + $userStore?.is_super_admin && $userStore.username.includes('@') + ? 'only f/*' + : $userStore?.is_admin || $userStore?.is_super_admin + ? 'u/username and f/*' + : undefined + ) {/if} -
+
+ {#if $userStore?.is_super_admin && $userStore.username.includes('@')} + + {:else if $userStore?.is_admin || $userStore?.is_super_admin} + + {/if} +
{#if loading.resources} {#each new Array(6) as _} diff --git a/frontend/src/routes/(root)/(logged)/variables/+page.svelte b/frontend/src/routes/(root)/(logged)/variables/+page.svelte index 3ef551f01f..96d27a324d 100644 --- a/frontend/src/routes/(root)/(logged)/variables/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/variables/+page.svelte @@ -16,6 +16,7 @@ import Head from '$lib/components/table/Head.svelte' import Row from '$lib/components/table/Row.svelte' import TableSimple from '$lib/components/TableSimple.svelte' + import Toggle from '$lib/components/Toggle.svelte' import Tooltip from '$lib/components/Tooltip.svelte' import VariableEditor from '$lib/components/VariableEditor.svelte' import type { ContextualVariable, ListableVariable, WorkspaceDeployUISettings } from '$lib/gen' @@ -69,11 +70,20 @@ } }) - let preFilteredItems = $derived( - ownerFilter == undefined - ? variables - : variables?.filter((x) => x.path.startsWith(ownerFilter ?? '')) - ) + let preFilteredItems = $derived.by(() => { + let l = + ownerFilter == undefined + ? variables + : variables?.filter((x) => x.path.startsWith(ownerFilter ?? '')) + if (filterUserFolders) { + l = l?.filter((item) => { + if (filterUserFoldersType === 'only f/*') return item.path.startsWith('f/') + if (filterUserFoldersType === 'u/username and f/*') + return item.path.startsWith('f/') || item.path.startsWith(`u/${$userStore?.username}/`) + }) + } + return l + }) // If relative, the dropdown is positioned relative to its button async function loadVariables(): Promise { @@ -141,6 +151,15 @@ loadContextualVariables() }, 5000) } + + let filterUserFolders = $state(false) + let filterUserFoldersType: 'only f/*' | 'u/username and f/*' | undefined = $derived( + $userStore?.is_super_admin && $userStore.username.includes('@') + ? 'only f/*' + : $userStore?.is_admin || $userStore?.is_super_admin + ? 'u/username and f/*' + : undefined + ) @@ -220,6 +239,17 @@
+
+ {#if $userStore?.is_super_admin && $userStore.username.includes('@')} + + {:else if $userStore?.is_admin || $userStore?.is_super_admin} + + {/if} +
{#if !filteredItems} {#each new Array(3) as _}