From eb94246a04dec426689d44a6aed51b69ffe438bb Mon Sep 17 00:00:00 2001 From: Riley Evans Date: Wed, 20 May 2026 13:54:39 -0500 Subject: [PATCH 1/2] fix(DesignerV2): Clean up workflow state type and add forceSave to FloatingRunButton - Use WorkflowJson instead of Workflow type for standalone designer state - Remove id spreading from workflow state updates (use separate designerID) - Add forceSave prop to FloatingRunButton to allow saving even when not dirty - Fix getConnectionConfiguration manifest parameter to be optional - Simplify monitoring view workflow restoration --- .../laDesignerConsumptionV2.tsx | 5 +-- .../AzureLogicAppsDesigner/laDesignerV2.tsx | 35 ++++++++++--------- .../src/lib/ui/FloatingRunButton/index.tsx | 6 ++-- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/apps/Standalone/src/designer/app/AzureLogicAppsDesigner/laDesignerConsumptionV2.tsx b/apps/Standalone/src/designer/app/AzureLogicAppsDesigner/laDesignerConsumptionV2.tsx index a1f1152490d..f1e5100105e 100644 --- a/apps/Standalone/src/designer/app/AzureLogicAppsDesigner/laDesignerConsumptionV2.tsx +++ b/apps/Standalone/src/designer/app/AzureLogicAppsDesigner/laDesignerConsumptionV2.tsx @@ -490,10 +490,7 @@ const DesignerEditorConsumption = () => { if (newWorkflow.parameters) { setParameters(newWorkflow.parameters); } - setWorkflow({ - ...newWorkflow, - id: guid(), - }); + setWorkflow({ ...newWorkflow }); DesignerStore.dispatch(setIsWorkflowDirty(true)); if (changes) { const nodeIds = changes.flatMap((change) => change.nodeIds); diff --git a/apps/Standalone/src/designer/app/AzureLogicAppsDesigner/laDesignerV2.tsx b/apps/Standalone/src/designer/app/AzureLogicAppsDesigner/laDesignerV2.tsx index a982ebc885c..65543c2f2e4 100644 --- a/apps/Standalone/src/designer/app/AzureLogicAppsDesigner/laDesignerV2.tsx +++ b/apps/Standalone/src/designer/app/AzureLogicAppsDesigner/laDesignerV2.tsx @@ -2,7 +2,14 @@ import { environment } from '../../../environments/environment'; import type { AppDispatch, RootState } from '../../state/store'; import { changeRunId, setIsChatBotEnabled, setMonitoringView, setReadOnly, setRunHistoryEnabled } from '../../state/workflowLoadingSlice'; import { DesignerCommandBar } from './DesignerCommandBarV2'; -import type { ConnectionAndAppSetting, ConnectionReferenceModel, ConnectionsData, NotesData, ParametersData } from './Models/Workflow'; +import type { + ConnectionAndAppSetting, + ConnectionReferenceModel, + ConnectionsData, + NotesData, + ParametersData, + WorkflowJson, +} from './Models/Workflow'; import { Artifact, VfsArtifact } from './Models/Workflow'; import type { WorkflowApp } from './Models/WorkflowApp'; import { ArtifactService } from './Services/Artifact'; @@ -127,7 +134,7 @@ const DesignerEditor = () => { // State props const [designerID, setDesignerID] = useState(guid()); - const [workflow, setWorkflow] = useState(); // Current workflow on the designer + const [workflow, setWorkflow] = useState(); // Current workflow on the designer const [isDesignerView, setIsDesignerView] = useState(true); const [isCodeView, setIsCodeView] = useState(false); const [isDraftMode, setIsDraftMode] = useState(true); @@ -193,7 +200,7 @@ const DesignerEditor = () => { setIsDraftMode(draftMode); }, []); - const getConnectionConfiguration = async (connectionId: string, _manifest: any, useMcpConnections?: boolean): Promise => { + const getConnectionConfiguration = async (connectionId: string, _manifest?: any, useMcpConnections?: boolean): Promise => { if (!connectionId) { return Promise.resolve(); } @@ -291,10 +298,8 @@ const DesignerEditor = () => { const hideMonitoringView = useCallback(() => { if (isMonitoringView) { toggleMonitoringView(); - setWorkflow({ - ...artifactData?.properties.files[Artifact.WorkflowFile], - id: guid(), - }); + const wf = artifactData?.properties.files[Artifact.WorkflowFile]; + setWorkflow({ definition: wf?.definition, kind: wf?.kind, metadata: wf?.metadata }); } }, [artifactData?.properties.files, isMonitoringView, toggleMonitoringView]); @@ -354,9 +359,6 @@ const DesignerEditor = () => { kind, }; - delete workflowToSave.id; - delete workflowToSave.notes; - const newManagedApiConnections = { ...(connectionsData?.managedApiConnections ?? {}), }; @@ -565,8 +567,6 @@ const DesignerEditor = () => { ...prevState, definition: codeToConvert.definition, kind: codeToConvert.kind, - connectionReferences: codeToConvert.connectionReferences ?? {}, - id: guid(), })); setIsDesignerView(true); setIsCodeView(false); @@ -589,7 +589,7 @@ const DesignerEditor = () => { useEffect(() => { if (isMonitoringView && runInstanceData) { - setWorkflow((previousWorkflow?: Workflow) => { + setWorkflow((previousWorkflow?: WorkflowJson) => { if (!previousWorkflow) { // Do not update the workflow if previousWorkflow is undefined; return previous value unchanged return previousWorkflow; @@ -640,7 +640,7 @@ const DesignerEditor = () => { return (
{ notes: currentNotes, kind: workflow?.kind, }} - workflowId={workflow?.id} + workflowId={designerID} customCode={customCodeData} runInstance={runInstanceData as any} appSettings={settingsData?.properties} @@ -720,8 +720,9 @@ const DesignerEditor = () => { setCurrentParameters(newWorkflow.parameters as unknown as ParametersData); } setWorkflow({ - ...newWorkflow, - id: guid(), + definition: newWorkflow.definition, + kind: newWorkflow.kind ?? 'stateful', + metadata: (newWorkflow as any)?.metadata ?? workflow?.metadata, }); DesignerStore.dispatch(setIsWorkflowDirty(true)); if (changes) { diff --git a/libs/designer-v2/src/lib/ui/FloatingRunButton/index.tsx b/libs/designer-v2/src/lib/ui/FloatingRunButton/index.tsx index 6064273d54b..07195de361d 100644 --- a/libs/designer-v2/src/lib/ui/FloatingRunButton/index.tsx +++ b/libs/designer-v2/src/lib/ui/FloatingRunButton/index.tsx @@ -87,6 +87,7 @@ export interface FloatingRunButtonProps { tooltipText?: string; }; isConsumption?: boolean; + forceSave?: boolean; } export const FloatingRunButton = ({ @@ -101,6 +102,7 @@ export const FloatingRunButton = ({ tooltipOverride, chatProps, isConsumption, + forceSave, }: FloatingRunButtonProps) => { const intl = useIntl(); @@ -209,7 +211,7 @@ export const FloatingRunButton = ({ }); // If workflowReadOnly is true, skip the actual save and just return the serialized workflow - if (workflowReadOnly || !isDirty) { + if (workflowReadOnly || (!isDirty && !forceSave)) { return serializedWorkflow; } @@ -242,7 +244,7 @@ export const FloatingRunButton = ({ isDraftMode ); } - }, [workflowReadOnly, dispatch, saveDraftWorkflow, isDraftMode, isDirty]); + }, [workflowReadOnly, dispatch, saveDraftWorkflow, isDraftMode, isDirty, forceSave]); const { mutate: runMutate, From d8e25761d50caba2acbccd7d23d09c1ad5fe856c Mon Sep 17 00:00:00 2001 From: Riley Evans Date: Wed, 20 May 2026 14:41:47 -0500 Subject: [PATCH 2/2] fix(ConnectionsPanel): Fix node link button icon rendering and text alignment - Remove position:absolute from action icon in NodeLinkButton (both v1 and v2) - Left-align button content with justifyContent: flex-start --- .../panel/connectionsPanel/allConnections/nodeLinkButton.tsx | 3 ++- .../panel/connectionsPanel/allConnections/nodeLinkButton.tsx | 3 ++- .../src/lib/ui/panel/connectionsPanel/connectionsPanel.less | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/libs/designer-v2/src/lib/ui/panel/connectionsPanel/allConnections/nodeLinkButton.tsx b/libs/designer-v2/src/lib/ui/panel/connectionsPanel/allConnections/nodeLinkButton.tsx index bf0622951f5..170f403844b 100644 --- a/libs/designer-v2/src/lib/ui/panel/connectionsPanel/allConnections/nodeLinkButton.tsx +++ b/libs/designer-v2/src/lib/ui/panel/connectionsPanel/allConnections/nodeLinkButton.tsx @@ -14,8 +14,9 @@ export const NodeLinkButton = ({ nodeId, iconUri }: { nodeId: string; iconUri?: return ( diff --git a/libs/designer/src/lib/ui/panel/connectionsPanel/allConnections/nodeLinkButton.tsx b/libs/designer/src/lib/ui/panel/connectionsPanel/allConnections/nodeLinkButton.tsx index bf0622951f5..368f629337c 100644 --- a/libs/designer/src/lib/ui/panel/connectionsPanel/allConnections/nodeLinkButton.tsx +++ b/libs/designer/src/lib/ui/panel/connectionsPanel/allConnections/nodeLinkButton.tsx @@ -14,8 +14,9 @@ export const NodeLinkButton = ({ nodeId, iconUri }: { nodeId: string; iconUri?: return ( diff --git a/libs/designer/src/lib/ui/panel/connectionsPanel/connectionsPanel.less b/libs/designer/src/lib/ui/panel/connectionsPanel/connectionsPanel.less index e665de42e83..12256625657 100644 --- a/libs/designer/src/lib/ui/panel/connectionsPanel/connectionsPanel.less +++ b/libs/designer/src/lib/ui/panel/connectionsPanel/connectionsPanel.less @@ -20,12 +20,12 @@ .msla-action-icon { width: 24px; - height: 60px; + height: 24px; border-radius: 2px; &.large { width: 32px; - height: 52px; + height: 32px; } }