setHoveredBlock(blockIndex)}
+ onMouseLeave={() => setHoveredBlock(undefined)}
+ >
+ {isBlockStart && (
+ |
+ {block.end > block.start ? (
+
+ {r.order} ∥
+
+ ) : (
+ r.order
+ )}
+ |
+ )}
+
+ {executor.primary}
+ {executor.secondary && {executor.secondary}}
+ |
+
+
+ {routeStepStatusLabels[r.status]}
+
+ |
+
+ {r.allowReassignToOtherApprovers
+ ? {texts.routeSteps.reassignAllowed}
+ : {texts.common.no}}
+ |
+ {describeStepCondition(r) ?? texts.common.empty} |
+ {/* Стрелки — одна пара на весь блок (rowSpan): двигают шаг
+ целиком, а не отдельного участника параллельной группы. */}
+ {isBlockStart && (
+
+
+ moveBlockUp(blockIndex)}
+ />
+ = blocks.length - 1}
+ onClick={() => moveBlockDown(blockIndex)}
+ />
+
+ |
+ )}
+
+
+ toggleParallel(i)}
+ />
+ openEdit(r)}
+ />
+ deleteTarget.ask(r)}
+ />
+
+ |
+
+ );
+ })}
+