Skip to content

Commit d6f7f77

Browse files
committed
address comments
1 parent 418b637 commit d6f7f77

3 files changed

Lines changed: 45 additions & 27 deletions

File tree

apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/panel.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,12 @@ export const Panel = memo(function Panel({ workspaceId: propWorkspaceId }: Panel
670670
{userPermissions.canAdmin && !isSnapshotView && (
671671
<DropdownMenuItem
672672
onSelect={handleToggleWorkflowLock}
673-
disabled={!hasBlocks || (workflowLocked && !allBlocksLocked)}
673+
disabled={!hasBlocks || workflowLocked}
674+
title={
675+
workflowLocked
676+
? 'Workflow is locked at the row or folder level — release it from the workflow notification or folder menu'
677+
: undefined
678+
}
674679
>
675680
{allBlocksLocked ? <Unlock /> : <Lock />}
676681
{allBlocksLocked ? 'Unlock workflow' : 'Lock workflow'}

apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/components/folder-item/folder-item.tsx

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,9 @@ import {
3232
useExportFolder,
3333
useExportSelection,
3434
} from '@/app/workspace/[workspaceId]/w/hooks'
35-
import { useCreateFolder, useUpdateFolder } from '@/hooks/queries/folders'
35+
import { useCreateFolder, useFolderMap, useUpdateFolder } from '@/hooks/queries/folders'
3636
import { getFolderMap } from '@/hooks/queries/utils/folder-cache'
37+
import { isFolderOrAncestorLocked } from '@/hooks/queries/utils/folder-tree'
3738
import { getWorkflows } from '@/hooks/queries/utils/workflow-cache'
3839
import { useCreateWorkflow } from '@/hooks/queries/workflows'
3940
import { useFolderStore } from '@/stores/folders/store'
@@ -76,6 +77,10 @@ export function FolderItem({
7677
const selectedFolders = useFolderStore((state) => state.selectedFolders)
7778
const isSelected = selectedFolders.has(folder.id)
7879

80+
const { data: foldersById = {} } = useFolderMap(workspaceId)
81+
const inheritedFolderLocked = isFolderOrAncestorLocked(folder.parentId, foldersById)
82+
const effectiveLocked = folder.locked || inheritedFolderLocked
83+
7984
const { canDeleteFolder, canDeleteWorkflows } = useCanDelete({ workspaceId })
8085

8186
const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false)
@@ -144,7 +149,7 @@ export function FolderItem({
144149
const dragGhostRef = useRef<HTMLElement | null>(null)
145150

146151
const handleCreateWorkflowInFolder = useCallback(() => {
147-
if (folder.locked) return
152+
if (effectiveLocked) return
148153
const name = generateCreativeWorkflowName()
149154
const color = getNextWorkflowColor()
150155
const id = generateId()
@@ -161,10 +166,10 @@ export function FolderItem({
161166
expandFolder()
162167
router.push(`/workspace/${workspaceId}/w/${id}`)
163168
window.dispatchEvent(new CustomEvent(SIDEBAR_SCROLL_EVENT, { detail: { itemId: id } }))
164-
}, [createWorkflowMutation, workspaceId, folder.id, folder.locked, router, expandFolder])
169+
}, [createWorkflowMutation, workspaceId, folder.id, effectiveLocked, router, expandFolder])
165170

166171
const handleCreateFolderInFolder = useCallback(async () => {
167-
if (folder.locked) return
172+
if (effectiveLocked) return
168173
try {
169174
const result = await createFolderMutation.mutateAsync({
170175
workspaceId,
@@ -181,15 +186,16 @@ export function FolderItem({
181186
} catch (error) {
182187
logger.error('Failed to create folder:', error)
183188
}
184-
}, [createFolderMutation, workspaceId, folder.id, folder.locked, expandFolder])
189+
}, [createFolderMutation, workspaceId, folder.id, effectiveLocked, expandFolder])
185190

186191
const handleToggleLock = useCallback(() => {
192+
if (inheritedFolderLocked) return
187193
updateFolderMutation.mutate({
188194
workspaceId,
189195
id: folder.id,
190196
updates: { locked: !folder.locked },
191197
})
192-
}, [folder.id, folder.locked, updateFolderMutation, workspaceId])
198+
}, [folder.id, folder.locked, inheritedFolderLocked, updateFolderMutation, workspaceId])
193199

194200
const onDragStart = useCallback(
195201
(e: React.DragEvent) => {
@@ -337,11 +343,11 @@ export function FolderItem({
337343
(e: React.MouseEvent) => {
338344
e.preventDefault()
339345
e.stopPropagation()
340-
if (!folder.locked) {
346+
if (!effectiveLocked) {
341347
handleStartEdit()
342348
}
343349
},
344-
[folder.locked, handleStartEdit]
350+
[effectiveLocked, handleStartEdit]
345351
)
346352

347353
const handleClick = useCallback(
@@ -491,7 +497,7 @@ export function FolderItem({
491497
onClick={handleClick}
492498
onKeyDown={handleKeyDown}
493499
onContextMenu={handleContextMenu}
494-
draggable={!isEditing && !dragDisabled && !folder.locked}
500+
draggable={!isEditing && !dragDisabled && !effectiveLocked}
495501
onDragStart={handleDragStart}
496502
onDragEnd={handleDragEnd}
497503
{...hoverHandlers}
@@ -574,22 +580,22 @@ export function FolderItem({
574580
showRename={!isMixedSelection && selectedFolders.size <= 1}
575581
showDuplicate={true}
576582
showExport={true}
577-
disableRename={!userPermissions.canEdit || folder.locked}
583+
disableRename={!userPermissions.canEdit || effectiveLocked}
578584
disableCreate={
579-
!userPermissions.canEdit || folder.locked || createWorkflowMutation.isPending
585+
!userPermissions.canEdit || effectiveLocked || createWorkflowMutation.isPending
580586
}
581587
disableCreateFolder={
582-
!userPermissions.canEdit || folder.locked || createFolderMutation.isPending
588+
!userPermissions.canEdit || effectiveLocked || createFolderMutation.isPending
583589
}
584590
disableDuplicate={
585591
!userPermissions.canEdit || isDuplicatingSelection || !hasExportableContent
586592
}
587593
disableExport={!userPermissions.canEdit || isExporting || !hasExportableContent}
588-
disableDelete={!userPermissions.canEdit || folder.locked || !canDeleteSelection}
594+
disableDelete={!userPermissions.canEdit || effectiveLocked || !canDeleteSelection}
589595
onToggleLock={handleToggleLock}
590596
showLock={!isMixedSelection && selectedFolders.size <= 1}
591-
disableLock={!userPermissions.canAdmin}
592-
isLocked={folder.locked}
597+
disableLock={!userPermissions.canAdmin || inheritedFolderLocked}
598+
isLocked={effectiveLocked}
593599
/>
594600

595601
<DeleteModal

apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/components/workflow-item/workflow-item.tsx

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ import {
3030
useExportSelection,
3131
useExportWorkflow,
3232
} from '@/app/workspace/[workspaceId]/w/hooks'
33+
import { useFolderMap } from '@/hooks/queries/folders'
3334
import { getFolderMap } from '@/hooks/queries/utils/folder-cache'
35+
import { isFolderOrAncestorLocked } from '@/hooks/queries/utils/folder-tree'
3436
import { getWorkflows } from '@/hooks/queries/utils/workflow-cache'
3537
import { useUpdateWorkflow } from '@/hooks/queries/workflows'
3638
import { useFolderStore } from '@/stores/folders/store'
@@ -70,6 +72,10 @@ export function WorkflowItem({
7072
const userPermissions = useUserPermissionsContext()
7173
const isSelected = selectedWorkflows.has(workflow.id)
7274

75+
const { data: foldersById = {} } = useFolderMap(workspaceId)
76+
const inheritedFolderLocked = isFolderOrAncestorLocked(workflow.folderId, foldersById)
77+
const effectiveLocked = !!workflow.locked || inheritedFolderLocked
78+
7379
const { canDeleteWorkflows, canDeleteFolder } = useCanDelete({ workspaceId })
7480

7581
const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false)
@@ -172,19 +178,20 @@ export function WorkflowItem({
172178

173179
const handleColorChange = useCallback(
174180
(color: string) => {
175-
if (workflow.locked) return
181+
if (effectiveLocked) return
176182
updateWorkflowMutation.mutate({ workspaceId, workflowId: workflow.id, metadata: { color } })
177183
},
178-
[updateWorkflowMutation, workflow.id, workflow.locked, workspaceId]
184+
[updateWorkflowMutation, workflow.id, effectiveLocked, workspaceId]
179185
)
180186

181187
const handleToggleLock = useCallback(() => {
188+
if (inheritedFolderLocked) return
182189
updateWorkflowMutation.mutate({
183190
workspaceId,
184191
workflowId: workflow.id,
185192
metadata: { locked: !workflow.locked },
186193
})
187-
}, [updateWorkflowMutation, workflow.id, workflow.locked, workspaceId])
194+
}, [updateWorkflowMutation, workflow.id, workflow.locked, inheritedFolderLocked, workspaceId])
188195

189196
const isEditingRef = useRef(false)
190197
const dragGhostRef = useRef<HTMLElement | null>(null)
@@ -370,10 +377,10 @@ export function WorkflowItem({
370377
(e: React.MouseEvent) => {
371378
e.preventDefault()
372379
e.stopPropagation()
373-
if (workflow.locked) return
380+
if (effectiveLocked) return
374381
handleStartEdit()
375382
},
376-
[handleStartEdit, workflow.locked]
383+
[handleStartEdit, effectiveLocked]
377384
)
378385

379386
const handleClick = useCallback(
@@ -414,7 +421,7 @@ export function WorkflowItem({
414421
'hover-hover:bg-[var(--surface-hover)]',
415422
(isDragging || (isAnyDragActive && isSelected)) && 'opacity-50'
416423
)}
417-
draggable={!isEditing && !dragDisabled && !workflow.locked}
424+
draggable={!isEditing && !dragDisabled && !effectiveLocked}
418425
onDragStart={handleDragStart}
419426
onDragEnd={handleDragEnd}
420427
onClick={handleClick}
@@ -496,15 +503,15 @@ export function WorkflowItem({
496503
showDuplicate={true}
497504
showExport={true}
498505
showColorChange={!isMixedSelection && selectedWorkflows.size <= 1}
499-
disableRename={!userPermissions.canEdit || workflow.locked}
506+
disableRename={!userPermissions.canEdit || effectiveLocked}
500507
disableDuplicate={!userPermissions.canEdit || isDuplicatingSelection}
501508
disableExport={!userPermissions.canEdit}
502-
disableColorChange={!userPermissions.canEdit || workflow.locked}
503-
disableDelete={!userPermissions.canEdit || !canDeleteSelection || workflow.locked}
509+
disableColorChange={!userPermissions.canEdit || effectiveLocked}
510+
disableDelete={!userPermissions.canEdit || !canDeleteSelection || effectiveLocked}
504511
onToggleLock={handleToggleLock}
505512
showLock={!isMixedSelection && selectedWorkflows.size <= 1}
506-
disableLock={!userPermissions.canAdmin}
507-
isLocked={!!workflow.locked}
513+
disableLock={!userPermissions.canAdmin || inheritedFolderLocked}
514+
isLocked={effectiveLocked}
508515
/>
509516

510517
<DeleteModal

0 commit comments

Comments
 (0)