From 2257b05b2857c7ae2b5ae0b4f9004e2d4e757925 Mon Sep 17 00:00:00 2001 From: Diego Imbert <70353967+diegoimbert@users.noreply.github.com> Date: Fri, 4 Sep 2026 13:58:26 +0200 Subject: [PATCH] feat: make S3 permission rules reorderable by drag and drop (#10958) Claude-Session: https://claude.ai/code/session_01DkKR3V3rWDyh1tDZCxmGLT Co-authored-by: Claude Opus 5 (1M context) --- .../S3PermissionRulesEditor.svelte | 107 ++++++++++++++++++ .../workspaceSettings/StorageSettings.svelte | 39 +------ 2 files changed, 109 insertions(+), 37 deletions(-) create mode 100644 frontend/src/lib/components/workspaceSettings/S3PermissionRulesEditor.svelte diff --git a/frontend/src/lib/components/workspaceSettings/S3PermissionRulesEditor.svelte b/frontend/src/lib/components/workspaceSettings/S3PermissionRulesEditor.svelte new file mode 100644 index 0000000000..d865756ff8 --- /dev/null +++ b/frontend/src/lib/components/workspaceSettings/S3PermissionRulesEditor.svelte @@ -0,0 +1,107 @@ + + + + The first rule whose pattern matches the path decides what is allowed — drag rules to reorder + them. A path matched by no rule is denied. +

+ Standard Unix-style glob syntax is supported. The following will be interpolated: + +
+ Note that changes may take up to 1 minute to propagate due to cache invalidation +
+ +
+
(items = e.detail.items)} + onfinalize={(e) => (items = e.detail.items)} + > + {#each items as item, idx (item.id)} + {@const shadowed = catchAllIdx !== undefined && idx > catchAllIdx} + +
+
+ + Rule {idx + 1} +
+ + + (items = items.filter((_, i) => i !== idx))} /> +
+ {/each} +
+
+{#if shadowWarning} + +{/if} + diff --git a/frontend/src/lib/components/workspaceSettings/StorageSettings.svelte b/frontend/src/lib/components/workspaceSettings/StorageSettings.svelte index a2ccf0b958..025ef23c38 100644 --- a/frontend/src/lib/components/workspaceSettings/StorageSettings.svelte +++ b/frontend/src/lib/components/workspaceSettings/StorageSettings.svelte @@ -19,9 +19,8 @@ import S3FilePicker from '../S3FilePicker.svelte' import Portal from '../Portal.svelte' import Popover from '../meltComponents/Popover.svelte' - import ClearableInput from '../common/clearableInput/ClearableInput.svelte' - import MultiSelect from '../select/MultiSelect.svelte' import CloseButton from '../common/CloseButton.svelte' + import S3PermissionRulesEditor from './S3PermissionRulesEditor.svelte' import TextInput from '../text_input/TextInput.svelte' import Select from '../select/Select.svelte' import DataTable from '../table/DataTable.svelte' @@ -529,7 +528,7 @@ disabled={!storage.advancedPermissions && !$enterpriseLicense} /> {#if storage.advancedPermissions} - {@render advancedPermissionsEditor(storage.advancedPermissions)} + {/if} {#if !storage.advancedPermissions} {#if storage.resourceType == 's3'} @@ -585,37 +584,3 @@ {/if} {/if} - -{#snippet advancedPermissionsEditor(rules: S3ResourceSettingsItem['advancedPermissions'])} - - The following will be interpolated : -
    -
  • {'{username}'} : Nickname of the user doing the request
  • -
  • {'{group}'} : Any group that the user belongs to
  • -
  • {'{folder_read}'} : Any folder that the user has read access to
  • -
  • {'{folder_write}'} : Any folder that the user has write access to
  • -
-
- Note that changes may take up to 1 minute to propagate due to cache invalidation -
- -
- {#each rules ?? [] as item, idx} -
- - - rules?.splice(idx, 1)} /> -
- {/each} -
- -{/snippet}