fix: stabilize promoted widget identity and fix link position on mode switch

Promoted widget rename propagation:
- Separate identity (name) from display (label) in PromotedWidgetView
  using a stable identityName (subgraphInput.name, e.g. "value_1")
- label getter/setter now reads/writes the bound subgraph slot directly
  via cached getBoundSubgraphSlot(), not widget state
- drawWidget uses this.label with try/finally for safe projected label
- SubgraphNode passes slotName through the reconcile pipeline as
  identityName; rename handler only changes input.label and _widget.label,
  preserving input.widget.name for matching
- renameWidget() no longer propagates to interior node widgets/inputs
- Vue label source changed from widget.slotName to widget.promotedLabel

Link position on draft restore:
- Call handleVueNodeLifecycleReset after initializeWorkflow so the node
  manager initializes against the fully-configured graph

Link position on legacy-to-Vue mode switch:
- Debounce layoutStore.onChange (800ms) to wait for all ResizeObserver
  measurement cycles to settle before resetting, with 3s fallback
This commit is contained in:
jaeone94
2026-03-23 21:13:27 +09:00
parent b1f141d76d
commit 0c062c24c7
7 changed files with 154 additions and 58 deletions

View File

@@ -92,6 +92,10 @@ export interface SafeWidgetData {
* execution ID (e.g. `"65:42"` vs the host node's `"65"`).
*/
sourceExecutionId?: string
/** Tooltip text from the resolved widget. */
tooltip?: string
/** For promoted widgets, the display label from the subgraph input slot. */
promotedLabel?: string
}
export interface VueNodeData {
@@ -352,7 +356,8 @@ function safeWidgetMapper(
sourceNode && app.rootGraph
? (getExecutionIdByNode(app.rootGraph, sourceNode) ?? undefined)
: undefined,
tooltip: widget.tooltip
tooltip: widget.tooltip,
promotedLabel: isPromotedWidgetView(widget) ? widget.label : undefined
}
} catch (error) {
console.warn(