Skip to content

Commit d024c1e

Browse files
authored
fix(shift): fix shift select blue ring fading (#2863)
1 parent d75ea37 commit d024c1e

File tree

5 files changed

+48
-15
lines changed

5 files changed

+48
-15
lines changed

apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/note-block/note-block.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,12 +168,17 @@ const NoteMarkdown = memo(function NoteMarkdown({ content }: { content: string }
168168
)
169169
})
170170

171-
export const NoteBlock = memo(function NoteBlock({ id, data }: NodeProps<NoteBlockNodeData>) {
171+
export const NoteBlock = memo(function NoteBlock({
172+
id,
173+
data,
174+
selected,
175+
}: NodeProps<NoteBlockNodeData>) {
172176
const { type, config, name } = data
173177

174178
const { activeWorkflowId, isEnabled, handleClick, hasRing, ringStyles } = useBlockVisual({
175179
blockId: id,
176180
data,
181+
isSelected: selected,
177182
})
178183
const storedValues = useSubBlockStore(
179184
useCallback(

apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/subflow-node.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ export interface SubflowNodeData {
6666
* @param props - Node properties containing data and id
6767
* @returns Rendered subflow node component
6868
*/
69-
export const SubflowNodeComponent = memo(({ data, id }: NodeProps<SubflowNodeData>) => {
69+
export const SubflowNodeComponent = memo(({ data, id, selected }: NodeProps<SubflowNodeData>) => {
7070
const { getNodes } = useReactFlow()
7171
const blockRef = useRef<HTMLDivElement>(null)
7272
const userPermissions = useUserPermissionsContext()
@@ -134,13 +134,15 @@ export const SubflowNodeComponent = memo(({ data, id }: NodeProps<SubflowNodeDat
134134

135135
/**
136136
* Determine the ring styling based on subflow state priority:
137-
* 1. Focused (selected in editor) or preview selected - blue ring
137+
* 1. Focused (selected in editor), selected (shift-click/box), or preview selected - blue ring
138138
* 2. Diff status (version comparison) - green/orange ring
139139
*/
140-
const hasRing = isFocused || isPreviewSelected || diffStatus === 'new' || diffStatus === 'edited'
140+
const isSelected = !isPreview && selected
141+
const hasRing =
142+
isFocused || isSelected || isPreviewSelected || diffStatus === 'new' || diffStatus === 'edited'
141143
const ringStyles = cn(
142144
hasRing && 'ring-[1.75px]',
143-
(isFocused || isPreviewSelected) && 'ring-[var(--brand-secondary)]',
145+
(isFocused || isSelected || isPreviewSelected) && 'ring-[var(--brand-secondary)]',
144146
diffStatus === 'new' && 'ring-[var(--brand-tertiary-2)]',
145147
diffStatus === 'edited' && 'ring-[var(--warning)]'
146148
)
@@ -167,7 +169,7 @@ export const SubflowNodeComponent = memo(({ data, id }: NodeProps<SubflowNodeDat
167169
data-node-id={id}
168170
data-type='subflowNode'
169171
data-nesting-level={nestingLevel}
170-
data-subflow-selected={isFocused || isPreviewSelected}
172+
data-subflow-selected={isFocused || isSelected || isPreviewSelected}
171173
>
172174
{!isPreview && (
173175
<ActionBar blockId={id} blockType={data.kind} disabled={!userPermissions.canEdit} />

apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/workflow-block.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,6 @@ const tryParseJson = (value: unknown): unknown => {
208208
export const getDisplayValue = (value: unknown): string => {
209209
if (value == null || value === '') return '-'
210210

211-
// Try parsing JSON strings first
212211
const parsedValue = tryParseJson(value)
213212

214213
if (isMessagesArray(parsedValue)) {
@@ -557,6 +556,7 @@ const SubBlockRow = ({
557556
export const WorkflowBlock = memo(function WorkflowBlock({
558557
id,
559558
data,
559+
selected,
560560
}: NodeProps<WorkflowBlockProps>) {
561561
const { type, config, name, isPending } = data
562562

@@ -574,7 +574,7 @@ export const WorkflowBlock = memo(function WorkflowBlock({
574574
hasRing,
575575
ringStyles,
576576
runPathStatus,
577-
} = useBlockVisual({ blockId: id, data, isPending })
577+
} = useBlockVisual({ blockId: id, data, isPending, isSelected: selected })
578578

579579
const currentBlock = currentWorkflow.getBlockById(id)
580580

apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-block-visual.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ interface UseBlockVisualProps {
1717
data: WorkflowBlockProps
1818
/** Whether the block is pending execution */
1919
isPending?: boolean
20+
/** Whether the block is selected (via shift-click or selection box) */
21+
isSelected?: boolean
2022
}
2123

2224
/**
@@ -28,7 +30,12 @@ interface UseBlockVisualProps {
2830
* @param props - The hook properties
2931
* @returns Visual state, click handler, and ring styling for the block
3032
*/
31-
export function useBlockVisual({ blockId, data, isPending = false }: UseBlockVisualProps) {
33+
export function useBlockVisual({
34+
blockId,
35+
data,
36+
isPending = false,
37+
isSelected = false,
38+
}: UseBlockVisualProps) {
3239
const isPreview = data.isPreview ?? false
3340
const isPreviewSelected = data.isPreviewSelected ?? false
3441

@@ -42,7 +49,6 @@ export function useBlockVisual({ blockId, data, isPending = false }: UseBlockVis
4249
isDeletedBlock,
4350
} = useBlockState(blockId, currentWorkflow, data)
4451

45-
// Check if the editor panel is open for this block
4652
const currentBlockId = usePanelEditorStore((state) => state.currentBlockId)
4753
const activeTab = usePanelStore((state) => state.activeTab)
4854
const isEditorOpen = !isPreview && currentBlockId === blockId && activeTab === 'editor'
@@ -68,6 +74,7 @@ export function useBlockVisual({ blockId, data, isPending = false }: UseBlockVis
6874
diffStatus: isPreview ? undefined : diffStatus,
6975
runPathStatus,
7076
isPreviewSelection: isPreview && isPreviewSelected,
77+
isSelected: isPreview ? false : isSelected,
7178
}),
7279
[
7380
isExecuting,
@@ -78,6 +85,7 @@ export function useBlockVisual({ blockId, data, isPending = false }: UseBlockVis
7885
runPathStatus,
7986
isPreview,
8087
isPreviewSelected,
88+
isSelected,
8189
]
8290
)
8391

apps/sim/app/workspace/[workspaceId]/w/[workflowId]/utils/block-ring-utils.ts

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ export interface BlockRingOptions {
1414
diffStatus: BlockDiffStatus
1515
runPathStatus: BlockRunPathStatus
1616
isPreviewSelection?: boolean
17+
/** Whether the block is selected via shift-click or selection box (shows blue ring) */
18+
isSelected?: boolean
1719
}
1820

1921
/**
@@ -32,11 +34,13 @@ export function getBlockRingStyles(options: BlockRingOptions): {
3234
diffStatus,
3335
runPathStatus,
3436
isPreviewSelection,
37+
isSelected,
3538
} = options
3639

3740
const hasRing =
3841
isExecuting ||
3942
isEditorOpen ||
43+
isSelected ||
4044
isPending ||
4145
diffStatus === 'new' ||
4246
diffStatus === 'edited' ||
@@ -46,39 +50,53 @@ export function getBlockRingStyles(options: BlockRingOptions): {
4650
const ringClassName = cn(
4751
// Executing block: pulsing success ring with prominent thickness (highest priority)
4852
isExecuting && 'ring-[3.5px] ring-[var(--border-success)] animate-ring-pulse',
49-
// Editor open or preview selection: static blue ring
53+
// Editor open, selected, or preview selection: static blue ring
5054
!isExecuting &&
51-
(isEditorOpen || isPreviewSelection) &&
55+
(isEditorOpen || isSelected || isPreviewSelection) &&
5256
'ring-[1.75px] ring-[var(--brand-secondary)]',
5357
// Non-active states use standard ring utilities
54-
!isExecuting && !isEditorOpen && !isPreviewSelection && hasRing && 'ring-[1.75px]',
58+
!isExecuting &&
59+
!isEditorOpen &&
60+
!isSelected &&
61+
!isPreviewSelection &&
62+
hasRing &&
63+
'ring-[1.75px]',
5564
// Pending state: warning ring
56-
!isExecuting && !isEditorOpen && isPending && 'ring-[var(--warning)]',
65+
!isExecuting && !isEditorOpen && !isSelected && isPending && 'ring-[var(--warning)]',
5766
// Deleted state (highest priority after active/pending)
58-
!isExecuting && !isEditorOpen && !isPending && isDeletedBlock && 'ring-[var(--text-error)]',
67+
!isExecuting &&
68+
!isEditorOpen &&
69+
!isSelected &&
70+
!isPending &&
71+
isDeletedBlock &&
72+
'ring-[var(--text-error)]',
5973
// Diff states
6074
!isExecuting &&
6175
!isEditorOpen &&
76+
!isSelected &&
6277
!isPending &&
6378
!isDeletedBlock &&
6479
diffStatus === 'new' &&
6580
'ring-[var(--brand-tertiary-2)]',
6681
!isExecuting &&
6782
!isEditorOpen &&
83+
!isSelected &&
6884
!isPending &&
6985
!isDeletedBlock &&
7086
diffStatus === 'edited' &&
7187
'ring-[var(--warning)]',
7288
// Run path states (lowest priority - only show if no other states active)
7389
!isExecuting &&
7490
!isEditorOpen &&
91+
!isSelected &&
7592
!isPending &&
7693
!isDeletedBlock &&
7794
!diffStatus &&
7895
runPathStatus === 'success' &&
7996
'ring-[var(--border-success)]',
8097
!isExecuting &&
8198
!isEditorOpen &&
99+
!isSelected &&
82100
!isPending &&
83101
!isDeletedBlock &&
84102
!diffStatus &&

0 commit comments

Comments
 (0)