From 5e59cefd1fa579148a06bb687aa60d1de21826b5 Mon Sep 17 00:00:00 2001 From: AlexRV12 <71396855+AlexRV12@users.noreply.github.com> Date: Mon, 28 Sep 2026 18:13:06 +0200 Subject: [PATCH] fix(frontend): apply operator write locks from the session's operating workspace (#11395) Claude-Session: https://claude.ai/code/session_01VAj4mmm2YThZLVkivrgsbb Co-authored-by: Claude Opus 5.5 (1M context) --- frontend/src/lib/components/FlowBuilder.svelte | 3 ++- frontend/src/lib/components/ScriptBuilder.svelte | 3 ++- frontend/src/lib/components/ShareModal.svelte | 4 +++- .../lib/components/schedules/SchedulesList.svelte | 3 ++- .../lib/components/triggers/TriggerList.svelte | 3 ++- .../triggers/TriggerSuspendedJobsModal.svelte | 3 ++- .../triggers/amqp/AmqpTriggerEditorInner.svelte | 3 ++- .../azure/AzureTriggerEditorConfigSection.svelte | 3 ++- .../triggers/azure/AzureTriggerEditorInner.svelte | 3 ++- .../email/EmailTriggerEditorConfigSection.svelte | 3 ++- .../triggers/email/EmailTriggerEditorInner.svelte | 3 ++- .../triggers/gcp/GcpTriggerEditorInner.svelte | 3 ++- .../triggers/http/RouteEditorConfigSection.svelte | 3 ++- .../triggers/http/RouteEditorInner.svelte | 3 ++- .../triggers/kafka/KafkaTriggerEditorInner.svelte | 3 ++- .../triggers/mqtt/MqttTriggerEditorInner.svelte | 3 ++- .../triggers/native/NativeTriggerEditor.svelte | 3 ++- .../triggers/native/NativeTriggerTable.svelte | 3 ++- .../triggers/nats/NatsTriggerEditorInner.svelte | 3 ++- .../postgres/PostgresTriggerEditorInner.svelte | 3 ++- .../triggers/schedules/ScheduleEditorInner.svelte | 3 ++- .../triggers/sqs/SqsTriggerEditorInner.svelte | 3 ++- .../websocket/WebsocketTriggerEditorInner.svelte | 3 ++- frontend/src/lib/operatorWriteRights.ts | 15 +++++++++------ .../native_triggers/[service_name]/+page.svelte | 3 ++- 25 files changed, 58 insertions(+), 30 deletions(-) diff --git a/frontend/src/lib/components/FlowBuilder.svelte b/frontend/src/lib/components/FlowBuilder.svelte index f341e327ee..60577ef124 100644 --- a/frontend/src/lib/components/FlowBuilder.svelte +++ b/frontend/src/lib/components/FlowBuilder.svelte @@ -106,11 +106,12 @@ import { UserDraft } from '$lib/userDraft.svelte' import { setOpenInSessionHandoff } from './sessions/openInSessionContext' import { getEditorStoragePath, setEditorStoragePath } from './editorStoragePathContext' - import { triggerLock } from '$lib/operatorWriteRights' + import { useTriggerLock } from '$lib/operatorWriteRights' import { useOperatingUser, useOperatingWorkspace } from '$lib/components/operatingWorkspace.svelte' + const triggerLock = useTriggerLock() const operatingWorkspace = useOperatingWorkspace() const operatingUser = useOperatingUser() diff --git a/frontend/src/lib/components/ScriptBuilder.svelte b/frontend/src/lib/components/ScriptBuilder.svelte index 67de9f874c..990f02de54 100644 --- a/frontend/src/lib/components/ScriptBuilder.svelte +++ b/frontend/src/lib/components/ScriptBuilder.svelte @@ -118,7 +118,8 @@ import WacExportDrawer from './scripts/WacExportDrawer.svelte' import { UserDraft } from '$lib/userDraft.svelte' import { UserDraftDbSyncer } from '$lib/userDraftDbSyncer.svelte' - import { triggerLock } from '$lib/operatorWriteRights' + import { useTriggerLock } from '$lib/operatorWriteRights' + const triggerLock = useTriggerLock() let { script = $bindable(), diff --git a/frontend/src/lib/components/ShareModal.svelte b/frontend/src/lib/components/ShareModal.svelte index 09c1184abd..dfb5892b03 100644 --- a/frontend/src/lib/components/ShareModal.svelte +++ b/frontend/src/lib/components/ShareModal.svelte @@ -22,11 +22,13 @@ import Toggle from './Toggle.svelte' import { Trash } from 'lucide-svelte' import { DEMO_RESTRICTION_HINT, isDemoWorkspaceRestricted } from '$lib/cloud' - import { scheduleLock, triggerLock } from '$lib/operatorWriteRights' + import { useScheduleLock, useTriggerLock } from '$lib/operatorWriteRights' import { useOperatingWorkspace, useOperatingUser } from '$lib/components/operatingWorkspace.svelte' + const scheduleLock = useScheduleLock() + const triggerLock = useTriggerLock() const operatingWorkspace = useOperatingWorkspace() const operatingUser = useOperatingUser() diff --git a/frontend/src/lib/components/schedules/SchedulesList.svelte b/frontend/src/lib/components/schedules/SchedulesList.svelte index e268e5acda..05b6cdd556 100644 --- a/frontend/src/lib/components/schedules/SchedulesList.svelte +++ b/frontend/src/lib/components/schedules/SchedulesList.svelte @@ -7,7 +7,7 @@ WorkspaceService } from '$lib/gen' import { canWrite, displayDate, getLocalSetting, storeLocalSetting } from '$lib/utils' - import { scheduleLock } from '$lib/operatorWriteRights' + import { useScheduleLock } from '$lib/operatorWriteRights' import { withForkConflictRetry } from '$lib/utils/forkConflict' import { base } from '$app/paths' import CenteredPage from '$lib/components/CenteredPage.svelte' @@ -59,6 +59,7 @@ useOperatingWorkspace, useOperatingUser } from '$lib/components/operatingWorkspace.svelte' + const scheduleLock = useScheduleLock() const operatingWorkspace = useOperatingWorkspace() const operatingUser = useOperatingUser() diff --git a/frontend/src/lib/components/triggers/TriggerList.svelte b/frontend/src/lib/components/triggers/TriggerList.svelte index ad2fc30bfa..83534e915e 100644 --- a/frontend/src/lib/components/triggers/TriggerList.svelte +++ b/frontend/src/lib/components/triggers/TriggerList.svelte @@ -68,7 +68,7 @@ import MqttIcon from '$lib/components/icons/MqttIcon.svelte' import NatsIcon from '$lib/components/icons/NatsIcon.svelte' import TriggerModeToggle from './TriggerModeToggle.svelte' - import { triggerLock } from '$lib/operatorWriteRights' + import { useTriggerLock } from '$lib/operatorWriteRights' import { getHttpRoute } from './http/utils' import { getEmailAddress, getEmailDomain } from './email/utils' import { TRIGGER_LIST_CONFIG, type TriggerRow } from './triggerListConfig' @@ -78,6 +78,7 @@ useOperatingUser, useOperatingWorkspace } from '$lib/components/operatingWorkspace.svelte' + const triggerLock = useTriggerLock() let { triggerKind }: { triggerKind: TriggerKind } = $props() diff --git a/frontend/src/lib/components/triggers/TriggerSuspendedJobsModal.svelte b/frontend/src/lib/components/triggers/TriggerSuspendedJobsModal.svelte index 408bc5a753..0d558ed8f4 100644 --- a/frontend/src/lib/components/triggers/TriggerSuspendedJobsModal.svelte +++ b/frontend/src/lib/components/triggers/TriggerSuspendedJobsModal.svelte @@ -32,13 +32,14 @@ import { twMerge } from 'tailwind-merge' import Badge from '../common/badge/Badge.svelte' import Tooltip from '../meltComponents/Tooltip.svelte' - import { triggerLock } from '$lib/operatorWriteRights' + import { useTriggerLock } from '$lib/operatorWriteRights' import { deepEqual } from 'fast-equals' import { errorHandlerArgs, slackErrorHandlerHubPathEnding } from '../ErrorOrRecoveryHandler.svelte' import { useOperatingWorkspace } from '$lib/components/operatingWorkspace.svelte' + const triggerLock = useTriggerLock() type Props = { triggerPath: string diff --git a/frontend/src/lib/components/triggers/amqp/AmqpTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/amqp/AmqpTriggerEditorInner.svelte index 150919e1f2..f2f3f81c0c 100644 --- a/frontend/src/lib/components/triggers/amqp/AmqpTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/amqp/AmqpTriggerEditorInner.svelte @@ -12,7 +12,7 @@ import TriggerRunnablePicker from '$lib/components/triggers/TriggerRunnablePicker.svelte' import { usedTriggerKinds } from '$lib/stores' import { canWrite, capitalize, emptyString, sendUserToast } from '$lib/utils' - import { triggerLock } from '$lib/operatorWriteRights' + import { useTriggerLock } from '$lib/operatorWriteRights' import { withForkConflictRetry } from '$lib/utils/forkConflict' import Section from '$lib/components/Section.svelte' import { Loader2 } from 'lucide-svelte' @@ -46,6 +46,7 @@ useOperatingUser, useOperatingWorkspace } from '$lib/components/operatingWorkspace.svelte' + const triggerLock = useTriggerLock() interface Props { useDrawer?: boolean diff --git a/frontend/src/lib/components/triggers/azure/AzureTriggerEditorConfigSection.svelte b/frontend/src/lib/components/triggers/azure/AzureTriggerEditorConfigSection.svelte index 3440e4de4c..1403af6484 100644 --- a/frontend/src/lib/components/triggers/azure/AzureTriggerEditorConfigSection.svelte +++ b/frontend/src/lib/components/triggers/azure/AzureTriggerEditorConfigSection.svelte @@ -12,7 +12,8 @@ import { emptyStringTrimmed } from '$lib/utils' import { useOperatingWorkspace } from '$lib/components/operatingWorkspace.svelte' import { RefreshCw } from 'lucide-svelte' - import { triggerLock } from '$lib/operatorWriteRights' + import { useTriggerLock } from '$lib/operatorWriteRights' + const triggerLock = useTriggerLock() interface Props { can_write?: boolean diff --git a/frontend/src/lib/components/triggers/azure/AzureTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/azure/AzureTriggerEditorInner.svelte index d686ade563..ede9e8e58f 100644 --- a/frontend/src/lib/components/triggers/azure/AzureTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/azure/AzureTriggerEditorInner.svelte @@ -10,7 +10,7 @@ import Path from '$lib/components/Path.svelte' import { usedTriggerKinds } from '$lib/stores' import { canWrite, capitalize, emptyString, sendUserToast } from '$lib/utils' - import { triggerLock } from '$lib/operatorWriteRights' + import { useTriggerLock } from '$lib/operatorWriteRights' import { withForkConflictRetry } from '$lib/utils/forkConflict' import { Loader2 } from 'lucide-svelte' import Label from '$lib/components/Label.svelte' @@ -45,6 +45,7 @@ useOperatingWorkspace, useOperatingWorkspaceHref } from '$lib/components/operatingWorkspace.svelte' + const triggerLock = useTriggerLock() let drawer: Drawer | undefined = $state(undefined) let initialPath = $state('') diff --git a/frontend/src/lib/components/triggers/email/EmailTriggerEditorConfigSection.svelte b/frontend/src/lib/components/triggers/email/EmailTriggerEditorConfigSection.svelte index e76059e89f..8bea1b8534 100644 --- a/frontend/src/lib/components/triggers/email/EmailTriggerEditorConfigSection.svelte +++ b/frontend/src/lib/components/triggers/email/EmailTriggerEditorConfigSection.svelte @@ -14,7 +14,8 @@ useOperatingUser, useOperatingWorkspace } from '$lib/components/operatingWorkspace.svelte' - import { triggerLock } from '$lib/operatorWriteRights' + import { useTriggerLock } from '$lib/operatorWriteRights' + const triggerLock = useTriggerLock() interface Props { initialTriggerPath?: string | undefined dirtyLocalPart?: boolean diff --git a/frontend/src/lib/components/triggers/email/EmailTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/email/EmailTriggerEditorInner.svelte index 28b401388b..fd3b20864a 100644 --- a/frontend/src/lib/components/triggers/email/EmailTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/email/EmailTriggerEditorInner.svelte @@ -19,7 +19,7 @@ } from '$lib/gen' import { usedTriggerKinds } from '$lib/stores' import { canWrite, capitalize, emptyString, sendUserToast } from '$lib/utils' - import { triggerLock } from '$lib/operatorWriteRights' + import { useTriggerLock } from '$lib/operatorWriteRights' import Section from '$lib/components/Section.svelte' import { Loader2 } from 'lucide-svelte' import Label from '$lib/components/Label.svelte' @@ -43,6 +43,7 @@ useOperatingWorkspace, useOperatingWorkspaceHref } from '$lib/components/operatingWorkspace.svelte' + const triggerLock = useTriggerLock() let { useDrawer = true, diff --git a/frontend/src/lib/components/triggers/gcp/GcpTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/gcp/GcpTriggerEditorInner.svelte index baa02922f3..43d5f8e28c 100644 --- a/frontend/src/lib/components/triggers/gcp/GcpTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/gcp/GcpTriggerEditorInner.svelte @@ -10,7 +10,7 @@ import Path from '$lib/components/Path.svelte' import { usedTriggerKinds } from '$lib/stores' import { canWrite, capitalize, emptyString, sendUserToast } from '$lib/utils' - import { triggerLock } from '$lib/operatorWriteRights' + import { useTriggerLock } from '$lib/operatorWriteRights' import { withForkConflictRetry } from '$lib/utils/forkConflict' import { Loader2 } from 'lucide-svelte' import Label from '$lib/components/Label.svelte' @@ -48,6 +48,7 @@ useOperatingWorkspace, useOperatingWorkspaceHref } from '$lib/components/operatingWorkspace.svelte' + const triggerLock = useTriggerLock() let drawer: Drawer | undefined = $state(undefined) let initialPath = $state('') diff --git a/frontend/src/lib/components/triggers/http/RouteEditorConfigSection.svelte b/frontend/src/lib/components/triggers/http/RouteEditorConfigSection.svelte index 932125f0b0..fd501186ab 100644 --- a/frontend/src/lib/components/triggers/http/RouteEditorConfigSection.svelte +++ b/frontend/src/lib/components/triggers/http/RouteEditorConfigSection.svelte @@ -12,11 +12,12 @@ import TestingBadge from '../testingBadge.svelte' import { untrack } from 'svelte' import TextInput from '$lib/components/text_input/TextInput.svelte' - import { triggerLock } from '$lib/operatorWriteRights' + import { useTriggerLock } from '$lib/operatorWriteRights' import { useOperatingUser, useOperatingWorkspace } from '$lib/components/operatingWorkspace.svelte' + const triggerLock = useTriggerLock() interface Props { initialTriggerPath?: string | undefined diff --git a/frontend/src/lib/components/triggers/http/RouteEditorInner.svelte b/frontend/src/lib/components/triggers/http/RouteEditorInner.svelte index cfb0d4ff66..042a639014 100644 --- a/frontend/src/lib/components/triggers/http/RouteEditorInner.svelte +++ b/frontend/src/lib/components/triggers/http/RouteEditorInner.svelte @@ -29,7 +29,7 @@ generateRandomString, sendUserToast } from '$lib/utils' - import { triggerLock } from '$lib/operatorWriteRights' + import { useTriggerLock } from '$lib/operatorWriteRights' import Section from '$lib/components/Section.svelte' import { Loader2, Pipette, Plus } from 'lucide-svelte' import Label from '$lib/components/Label.svelte' @@ -82,6 +82,7 @@ useOperatingWorkspace, useOperatingWorkspaceHref } from '$lib/components/operatingWorkspace.svelte' + const triggerLock = useTriggerLock() let { useDrawer = true, diff --git a/frontend/src/lib/components/triggers/kafka/KafkaTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/kafka/KafkaTriggerEditorInner.svelte index 7e9270b3d5..cd79c98015 100644 --- a/frontend/src/lib/components/triggers/kafka/KafkaTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/kafka/KafkaTriggerEditorInner.svelte @@ -13,7 +13,7 @@ import { KafkaTriggerService, type ErrorHandler, type Retry, type TriggerMode } from '$lib/gen' import { usedTriggerKinds } from '$lib/stores' import { canWrite, capitalize, emptyString, sendUserToast } from '$lib/utils' - import { triggerLock } from '$lib/operatorWriteRights' + import { useTriggerLock } from '$lib/operatorWriteRights' import { withForkConflictRetry } from '$lib/utils/forkConflict' import Section from '$lib/components/Section.svelte' import { Loader2, RotateCcw } from 'lucide-svelte' @@ -42,6 +42,7 @@ useOperatingWorkspace, useOperatingWorkspaceHref } from '$lib/components/operatingWorkspace.svelte' + const triggerLock = useTriggerLock() interface Props { useDrawer?: boolean diff --git a/frontend/src/lib/components/triggers/mqtt/MqttTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/mqtt/MqttTriggerEditorInner.svelte index 9244397a2d..09c944ed7c 100644 --- a/frontend/src/lib/components/triggers/mqtt/MqttTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/mqtt/MqttTriggerEditorInner.svelte @@ -12,7 +12,7 @@ import TriggerRunnablePicker from '$lib/components/triggers/TriggerRunnablePicker.svelte' import { usedTriggerKinds } from '$lib/stores' import { canWrite, capitalize, emptyString, sendUserToast } from '$lib/utils' - import { triggerLock } from '$lib/operatorWriteRights' + import { useTriggerLock } from '$lib/operatorWriteRights' import { withForkConflictRetry } from '$lib/utils/forkConflict' import Section from '$lib/components/Section.svelte' import { Loader2 } from 'lucide-svelte' @@ -51,6 +51,7 @@ useOperatingWorkspace, useOperatingWorkspaceHref } from '$lib/components/operatingWorkspace.svelte' + const triggerLock = useTriggerLock() interface Props { useDrawer?: boolean diff --git a/frontend/src/lib/components/triggers/native/NativeTriggerEditor.svelte b/frontend/src/lib/components/triggers/native/NativeTriggerEditor.svelte index 9a6411dc7c..3a4be41a04 100644 --- a/frontend/src/lib/components/triggers/native/NativeTriggerEditor.svelte +++ b/frontend/src/lib/components/triggers/native/NativeTriggerEditor.svelte @@ -10,7 +10,7 @@ } from './utils' import { usedTriggerKinds } from '$lib/stores' import { canWrite, emptyString, sendUserToast } from '$lib/utils' - import { triggerLock } from '$lib/operatorWriteRights' + import { useTriggerLock } from '$lib/operatorWriteRights' import { Button } from '$lib/components/common' import TextInput from '$lib/components/text_input/TextInput.svelte' import Drawer from '$lib/components/common/drawer/Drawer.svelte' @@ -32,6 +32,7 @@ useOperatingUser, useOperatingWorkspace } from '$lib/components/operatingWorkspace.svelte' + const triggerLock = useTriggerLock() const operatingWorkspace = useOperatingWorkspace() const operatingUser = useOperatingUser() diff --git a/frontend/src/lib/components/triggers/native/NativeTriggerTable.svelte b/frontend/src/lib/components/triggers/native/NativeTriggerTable.svelte index 7908e79b07..e45f3f9eab 100644 --- a/frontend/src/lib/components/triggers/native/NativeTriggerTable.svelte +++ b/frontend/src/lib/components/triggers/native/NativeTriggerTable.svelte @@ -4,7 +4,7 @@ import type { ExtendedNativeTrigger } from './utils' import { getServiceConfig } from './utils' import { canWrite, sendUserToast } from '$lib/utils' - import { triggerLock } from '$lib/operatorWriteRights' + import { useTriggerLock } from '$lib/operatorWriteRights' import { userStore } from '$lib/stores' import TriggerModeToggle from '$lib/components/triggers/TriggerModeToggle.svelte' import Skeleton from '$lib/components/common/skeleton/Skeleton.svelte' @@ -18,6 +18,7 @@ import GoogleDriveIcon from '$lib/components/icons/GoogleDriveIcon.svelte' import GoogleCalendarIcon from '$lib/components/icons/GoogleCalendarIcon.svelte' import { useOperatingWorkspace } from '$lib/components/operatingWorkspace.svelte' + const triggerLock = useTriggerLock() const operatingWorkspace = useOperatingWorkspace() diff --git a/frontend/src/lib/components/triggers/nats/NatsTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/nats/NatsTriggerEditorInner.svelte index 95a8822bff..33af8a3d40 100644 --- a/frontend/src/lib/components/triggers/nats/NatsTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/nats/NatsTriggerEditorInner.svelte @@ -12,7 +12,7 @@ import { NatsTriggerService, type ErrorHandler, type Retry, type TriggerMode } from '$lib/gen' import { usedTriggerKinds } from '$lib/stores' import { canWrite, capitalize, emptyString, sendUserToast } from '$lib/utils' - import { triggerLock } from '$lib/operatorWriteRights' + import { useTriggerLock } from '$lib/operatorWriteRights' import { withForkConflictRetry } from '$lib/utils/forkConflict' import Section from '$lib/components/Section.svelte' import { Loader2 } from 'lucide-svelte' @@ -37,6 +37,7 @@ useOperatingWorkspace, useOperatingWorkspaceHref } from '$lib/components/operatingWorkspace.svelte' + const triggerLock = useTriggerLock() interface Props { useDrawer?: boolean diff --git a/frontend/src/lib/components/triggers/postgres/PostgresTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/postgres/PostgresTriggerEditorInner.svelte index 327680dce4..2072041c28 100644 --- a/frontend/src/lib/components/triggers/postgres/PostgresTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/postgres/PostgresTriggerEditorInner.svelte @@ -20,7 +20,7 @@ } from '$lib/gen' import { usedTriggerKinds } from '$lib/stores' import { canWrite, emptyString, emptyStringTrimmed, sendUserToast } from '$lib/utils' - import { triggerLock } from '$lib/operatorWriteRights' + import { useTriggerLock } from '$lib/operatorWriteRights' import { withForkConflictRetry } from '$lib/utils/forkConflict' import Section from '$lib/components/Section.svelte' import { Loader2 } from 'lucide-svelte' @@ -59,6 +59,7 @@ useOperatingWorkspace, useOperatingWorkspaceHref } from '$lib/components/operatingWorkspace.svelte' + const triggerLock = useTriggerLock() interface Props { useDrawer?: boolean diff --git a/frontend/src/lib/components/triggers/schedules/ScheduleEditorInner.svelte b/frontend/src/lib/components/triggers/schedules/ScheduleEditorInner.svelte index 7e95de4f40..12cd4c143e 100644 --- a/frontend/src/lib/components/triggers/schedules/ScheduleEditorInner.svelte +++ b/frontend/src/lib/components/triggers/schedules/ScheduleEditorInner.svelte @@ -34,7 +34,7 @@ } from '$lib/gen' import { enterpriseLicense } from '$lib/stores' import { canWrite, emptyString, formatCron, sendUserToast, cronV1toV2 } from '$lib/utils' - import { scheduleLock } from '$lib/operatorWriteRights' + import { useScheduleLock } from '$lib/operatorWriteRights' import { base } from '$lib/base' import Section from '$lib/components/Section.svelte' import { List, Loader2, Save, AlertTriangle } from 'lucide-svelte' @@ -55,6 +55,7 @@ import PermissionedAsLine from '../PermissionedAsLine.svelte' import { useActingUser } from '$lib/actingUser.svelte' import { useOperatingWorkspace } from '$lib/components/operatingWorkspace.svelte' + const scheduleLock = useScheduleLock() let { useDrawer = true, diff --git a/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorInner.svelte index f60d2a7cd5..0995a2e1b6 100644 --- a/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorInner.svelte @@ -10,7 +10,7 @@ import Path from '$lib/components/Path.svelte' import { usedTriggerKinds } from '$lib/stores' import { canWrite, capitalize, emptyString, sendUserToast } from '$lib/utils' - import { triggerLock } from '$lib/operatorWriteRights' + import { useTriggerLock } from '$lib/operatorWriteRights' import { withForkConflictRetry } from '$lib/utils/forkConflict' import { Loader2 } from 'lucide-svelte' import Label from '$lib/components/Label.svelte' @@ -43,6 +43,7 @@ useOperatingWorkspace, useOperatingWorkspaceHref } from '$lib/components/operatingWorkspace.svelte' + const triggerLock = useTriggerLock() interface Props { useDrawer?: boolean diff --git a/frontend/src/lib/components/triggers/websocket/WebsocketTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/websocket/WebsocketTriggerEditorInner.svelte index f9c4be990e..c626f678ef 100644 --- a/frontend/src/lib/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/websocket/WebsocketTriggerEditorInner.svelte @@ -26,7 +26,7 @@ } from '$lib/gen' import { usedTriggerKinds } from '$lib/stores' import { canWrite, emptySchema, emptyString, sendUserToast } from '$lib/utils' - import { triggerLock } from '$lib/operatorWriteRights' + import { useTriggerLock } from '$lib/operatorWriteRights' import { withForkConflictRetry } from '$lib/utils/forkConflict' import Section from '$lib/components/Section.svelte' import { Loader2, X, Plus } from 'lucide-svelte' @@ -59,6 +59,7 @@ useOperatingWorkspace, useOperatingWorkspaceHref } from '$lib/components/operatingWorkspace.svelte' + const triggerLock = useTriggerLock() interface Props { useDrawer?: boolean diff --git a/frontend/src/lib/operatorWriteRights.ts b/frontend/src/lib/operatorWriteRights.ts index d06bd666c0..2c921078e0 100644 --- a/frontend/src/lib/operatorWriteRights.ts +++ b/frontend/src/lib/operatorWriteRights.ts @@ -1,8 +1,9 @@ import { derived } from 'svelte/store' -import { userWorkspaces, workspaceStore } from '$lib/stores' +import { userWorkspaces } from '$lib/stores' +import { useOperatingWorkspace } from '$lib/components/operatingWorkspace.svelte' /** - * Why writes of this kind are locked in the active workspace, or `undefined` when they are not — + * Why writes of this kind are locked in the operating workspace, or `undefined` when they are not — * the shape `title` and `disabled` both want. See `docs/operator-write-rights.md`. * * Only `false` locks. A workspace that never configured the key and a non-operator (whose @@ -10,8 +11,8 @@ import { userWorkspaces, workspaceStore } from '$lib/stores' * for everyone. */ function writeLock(key: 'manage_schedules' | 'manage_triggers', noun: string) { - return derived([userWorkspaces, workspaceStore], ([$userWorkspaces, $workspaceStore]) => { - const settings = $userWorkspaces.find((w) => w.id === $workspaceStore)?.operator_settings + return derived([userWorkspaces, useOperatingWorkspace()], ([$userWorkspaces, $workspace]) => { + const settings = $userWorkspaces.find((w) => w.id === $workspace)?.operator_settings // Worded as the server words its refusal of the same write. return settings?.[key] === false ? `Operators cannot manage ${noun} in this workspace` @@ -19,5 +20,7 @@ function writeLock(key: 'manage_schedules' | 'manage_triggers', noun: string) { }) } -export const scheduleLock = writeLock('manage_schedules', 'schedules') -export const triggerLock = writeLock('manage_triggers', 'triggers') +/** Reads context: call during component initialisation. */ +export const useScheduleLock = () => writeLock('manage_schedules', 'schedules') +/** Reads context: call during component initialisation. */ +export const useTriggerLock = () => writeLock('manage_triggers', 'triggers') diff --git a/frontend/src/routes/(root)/(logged)/native_triggers/[service_name]/+page.svelte b/frontend/src/routes/(root)/(logged)/native_triggers/[service_name]/+page.svelte index 6c99d8d9c8..004799baed 100644 --- a/frontend/src/routes/(root)/(logged)/native_triggers/[service_name]/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/native_triggers/[service_name]/+page.svelte @@ -9,7 +9,7 @@ } from '$lib/components/triggers/native/utils' import NativeTriggerTable from '$lib/components/triggers/native/NativeTriggerTable.svelte' import NativeTriggerEditor from '$lib/components/triggers/native/NativeTriggerEditor.svelte' - import { triggerLock } from '$lib/operatorWriteRights' + import { useTriggerLock } from '$lib/operatorWriteRights' import { sendUserToast, removeTriggerKindIfUnused, @@ -29,6 +29,7 @@ import { page } from '$app/state' import Toggle from '$lib/components/Toggle.svelte' import ListFilters from '$lib/components/home/ListFilters.svelte' + const triggerLock = useTriggerLock() type TriggerW = ExtendedNativeTrigger & { marked?: any }