From b6a4c635eefaf6ff51d9c922c3ccde2c810ee079 Mon Sep 17 00:00:00 2001 From: Thomas Trompette Date: Tue, 28 Jul 2026 19:23:22 +0200 Subject: [PATCH] fix(workflow): rename the trigger step through the dedicated mutation (#23450) ## Bug Renaming the **trigger** step from the workflow side panel fails with: > Updating a workflowVersion through the generic mutation is restricted. steps, trigger, status, position, workflowId and coreWorkflowVersionId cannot be changed... Renaming a **regular** step works, which is why this is easy to miss: only the trigger branch is broken. ## Cause This is a regression from #23207. That PR added the server-side denylist on `updateOneWorkflowVersion` and switched `useUpdateWorkflowVersionTrigger` to the dedicated `updateWorkflowVersionTrigger` mutation, but missed the call site in `SidePanelWorkflowStepInfo`, which still did: ```ts if (isTrigger) { await updateOneWorkflowVersion({ // generic mutation, sends `trigger` updateOneRecordInput: { trigger: { ...stepDefinition.definition, name: title } }, }); } else { await updateWorkflowVersionStep({ ... }); // dedicated, unaffected } ``` The observed request confirms it: `UpdateOneWorkflowVersion` with `input.trigger`. ## Fix Route the trigger branch through `updateTrigger`, which already resolves the draft version, calls the dedicated mutation, marks the step for recomputation and updates the cache. `useUpdateWorkflowVersionTrigger` now accepts an **optional** `instanceId`. This matters here: the side panel computes the visualizer instance id explicitly (it already passes it to `useGetUpdatableWorkflowVersionOrThrow`), and without it the hook would resolve the updatable version from a different component instance. Being optional, the four existing callers are unaffected. Also removes the now-redundant `getUpdatableWorkflowVersion()` call on the trigger path, so a rename no longer risks resolving the draft twice. ## Verification - `nx typecheck twenty-front` green - `oxfmt` + `oxlint --type-aware` green on both changed files - `useUpdateWorkflowVersionTrigger` unit tests green (2/2) - Not yet clicked through locally; the reporter hit this on a dev instance and can confirm the rename now succeeds Review in cubic --- .../components/SidePanelWorkflowStepInfo.tsx | 20 +++++++------------ .../hooks/useUpdateWorkflowVersionTrigger.ts | 4 ++-- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/packages/twenty-front/src/modules/side-panel/components/SidePanelWorkflowStepInfo.tsx b/packages/twenty-front/src/modules/side-panel/components/SidePanelWorkflowStepInfo.tsx index b377a442ec..137a278511 100644 --- a/packages/twenty-front/src/modules/side-panel/components/SidePanelWorkflowStepInfo.tsx +++ b/packages/twenty-front/src/modules/side-panel/components/SidePanelWorkflowStepInfo.tsx @@ -4,7 +4,6 @@ import { useUpdateSidePanelPageInfo } from '@/side-panel/hooks/useUpdateSidePane import { useSidePanelWorkflowIdOrThrow } from '@/side-panel/pages/workflow/hooks/useSidePanelWorkflowIdOrThrow'; import { sidePanelWorkflowStepIdComponentState } from '@/side-panel/pages/workflow/states/sidePanelWorkflowStepIdComponentState'; import { sidePanelPageState } from '@/side-panel/states/sidePanelPageState'; -import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; import { TitleInput } from '@/ui/input/components/TitleInput'; import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue'; import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue'; @@ -15,13 +14,14 @@ import { getStepDefinitionOrThrow } from '@/workflow/utils/getStepDefinitionOrTh import { getWorkflowVisualizerComponentInstanceId } from '@/workflow/utils/getWorkflowVisualizerComponentInstanceId'; import { useUpdateAgentLabel } from '@/workflow/workflow-steps/hooks/useUpdateAgentLabel'; import { useUpdateWorkflowVersionStep } from '@/workflow/workflow-steps/hooks/useUpdateWorkflowVersionStep'; +import { useUpdateWorkflowVersionTrigger } from '@/workflow/workflow-trigger/hooks/useUpdateWorkflowVersionTrigger'; import { getActionIcon } from '@/workflow/workflow-steps/workflow-actions/utils/getActionIcon'; import { getActionIconColorOrThrow } from '@/workflow/workflow-steps/workflow-actions/utils/getActionIconColorOrThrow'; import { getTriggerIcon } from '@/workflow/workflow-trigger/utils/getTriggerIcon'; import { getTriggerIconColor } from '@/workflow/workflow-trigger/utils/getTriggerIconColor'; import { t } from '@lingui/core/macro'; import { useContext, useState } from 'react'; -import { CoreObjectNameSingular, SidePanelPages } from 'twenty-shared/types'; +import { SidePanelPages } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { TRIGGER_STEP_ID } from 'twenty-shared/workflow'; import { useIcons } from 'twenty-ui/icon'; @@ -60,7 +60,7 @@ export const SidePanelWorkflowStepInfo = ({ useGetUpdatableWorkflowVersionOrThrow(instanceId); const { updateWorkflowVersionStep } = useUpdateWorkflowVersionStep(); - const { updateOneRecord: updateOneWorkflowVersion } = useUpdateOneRecord(); + const { updateTrigger } = useUpdateWorkflowVersionTrigger(instanceId); const { trigger, @@ -156,16 +156,10 @@ export const SidePanelWorkflowStepInfo = ({ const targetWorkflowVersionId = await getUpdatableWorkflowVersion(); if (isTrigger) { - await updateOneWorkflowVersion({ - objectNameSingular: CoreObjectNameSingular.WorkflowVersion, - idToUpdate: targetWorkflowVersionId, - updateOneRecordInput: { - trigger: { - ...stepDefinition.definition, - name: title, - } as typeof stepDefinition.definition, - }, - }); + await updateTrigger({ + ...stepDefinition.definition, + name: title, + } as typeof stepDefinition.definition); } else { await updateWorkflowVersionStep({ workflowVersionId: targetWorkflowVersionId, diff --git a/packages/twenty-front/src/modules/workflow/workflow-trigger/hooks/useUpdateWorkflowVersionTrigger.ts b/packages/twenty-front/src/modules/workflow/workflow-trigger/hooks/useUpdateWorkflowVersionTrigger.ts index 58625799b0..be3ae856ed 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-trigger/hooks/useUpdateWorkflowVersionTrigger.ts +++ b/packages/twenty-front/src/modules/workflow/workflow-trigger/hooks/useUpdateWorkflowVersionTrigger.ts @@ -21,14 +21,14 @@ import { type UpdateWorkflowVersionTriggerMutationVariables, } from '~/generated/graphql'; -export const useUpdateWorkflowVersionTrigger = () => { +export const useUpdateWorkflowVersionTrigger = (instanceId?: string) => { const apolloCoreClient = useApolloCoreClient(); const { objectMetadataItems } = useObjectMetadataItems(); const { objectPermissionsByObjectMetadataId } = useObjectPermissions(); const { enqueueErrorSnackBar } = useSnackBar(); const { getUpdatableWorkflowVersion } = - useGetUpdatableWorkflowVersionOrThrow(); + useGetUpdatableWorkflowVersionOrThrow(instanceId); const { markStepForRecomputation } = useStepsOutputSchema();