From ce0a6c1b176c5a3da23bea14eaa046e9c7b33b06 Mon Sep 17 00:00:00 2001 From: Thomas Trompette Date: Wed, 29 Jan 2025 17:25:20 +0100 Subject: [PATCH] Fix empty trigger on readonly + fix cache apollo on deactivation (#9912) - On deactivation, we should not need to refresh so the workflow disappear from cmd+k https://github.com/user-attachments/assets/826fa4c6-3faa-49d1-b180-ed5d3ed187e5 - When readonly, step empty, we should not see the right drawer https://github.com/user-attachments/assets/b557ef61-da81-446d-b160-f26c4c7a5191 --- .../hooks/useDeactivateWorkflowVersion.ts | 27 +++++++++++++++++++ .../WorkflowDiagramCanvasReadonlyEffect.tsx | 4 ++- .../components/WorkflowStepDetail.tsx | 8 +----- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/packages/twenty-front/src/modules/workflow/hooks/useDeactivateWorkflowVersion.ts b/packages/twenty-front/src/modules/workflow/hooks/useDeactivateWorkflowVersion.ts index 7a03426a0..06d3e7f74 100644 --- a/packages/twenty-front/src/modules/workflow/hooks/useDeactivateWorkflowVersion.ts +++ b/packages/twenty-front/src/modules/workflow/hooks/useDeactivateWorkflowVersion.ts @@ -1,9 +1,12 @@ import { useApolloClient, useMutation } from '@apollo/client'; +import { triggerUpdateRecordOptimisticEffect } from '@/apollo/optimistic-effect/utils/triggerUpdateRecordOptimisticEffect'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { modifyRecordFromCache } from '@/object-record/cache/utils/modifyRecordFromCache'; import { DEACTIVATE_WORKFLOW_VERSION } from '@/workflow/graphql/mutations/deactivateWorkflowVersion'; +import { WorkflowVersion } from '@/workflow/types/Workflow'; +import { isDefined } from 'twenty-ui'; import { DeactivateWorkflowVersionMutation, DeactivateWorkflowVersionMutationVariables, @@ -37,6 +40,30 @@ export const useDeactivateWorkflowVersion = () => { status: () => 'DEACTIVATED', }, }); + + const cacheSnapshot = apolloClient.cache.extract(); + const workflowVersion: WorkflowVersion | undefined = Object.values( + cacheSnapshot, + ).find( + (item) => + item.__typename === 'WorkflowVersion' && + item.id === workflowVersionId, + ); + + if (!isDefined(workflowVersion)) { + return; + } + + triggerUpdateRecordOptimisticEffect({ + cache: apolloClient.cache, + objectMetadataItem: objectMetadataItemWorkflowVersion, + currentRecord: workflowVersion, + updatedRecord: { + ...workflowVersion, + status: 'DEACTIVATED', + }, + objectMetadataItems: [objectMetadataItemWorkflowVersion], + }); }, }); }; diff --git a/packages/twenty-front/src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasReadonlyEffect.tsx b/packages/twenty-front/src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasReadonlyEffect.tsx index 5b82068aa..2dfeeaa5e 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasReadonlyEffect.tsx +++ b/packages/twenty-front/src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasReadonlyEffect.tsx @@ -3,6 +3,7 @@ import { useRightDrawer } from '@/ui/layout/right-drawer/hooks/useRightDrawer'; import { RightDrawerHotkeyScope } from '@/ui/layout/right-drawer/types/RightDrawerHotkeyScope'; import { RightDrawerPages } from '@/ui/layout/right-drawer/types/RightDrawerPages'; import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope'; +import { EMPTY_TRIGGER_STEP_ID } from '@/workflow/workflow-diagram/constants/EmptyTriggerStepId'; import { useTriggerNodeSelection } from '@/workflow/workflow-diagram/hooks/useTriggerNodeSelection'; import { workflowSelectedNodeState } from '@/workflow/workflow-diagram/states/workflowSelectedNodeState'; import { @@ -27,7 +28,7 @@ export const WorkflowDiagramCanvasReadonlyEffect = () => { const selectedNode = nodes[0] as WorkflowDiagramNode; const isClosingStep = isDefined(selectedNode) === false; - if (isClosingStep) { + if (isClosingStep || selectedNode.type === EMPTY_TRIGGER_STEP_ID) { closeRightDrawer(); closeCommandMenu(); return; @@ -37,6 +38,7 @@ export const WorkflowDiagramCanvasReadonlyEffect = () => { setHotkeyScope(RightDrawerHotkeyScope.RightDrawer, { goto: false }); const selectedNodeData = selectedNode.data as WorkflowDiagramStepNodeData; + openRightDrawer(RightDrawerPages.WorkflowStepView, { title: selectedNodeData.name, Icon: getIcon(getWorkflowNodeIconKey(selectedNodeData)), diff --git a/packages/twenty-front/src/modules/workflow/workflow-steps/components/WorkflowStepDetail.tsx b/packages/twenty-front/src/modules/workflow/workflow-steps/components/WorkflowStepDetail.tsx index e01860ffb..04ef74d31 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-steps/components/WorkflowStepDetail.tsx +++ b/packages/twenty-front/src/modules/workflow/workflow-steps/components/WorkflowStepDetail.tsx @@ -48,18 +48,12 @@ export const WorkflowStepDetail = ({ stepId, workflowVersion, }); - if (!isDefined(stepDefinition)) { + if (!isDefined(stepDefinition) || !isDefined(stepDefinition.definition)) { return null; } switch (stepDefinition.type) { case 'trigger': { - if (!isDefined(stepDefinition.definition)) { - throw new Error( - 'Expected the trigger to be defined at this point. Ensure the trigger has been set with a default value before trying to edit it.', - ); - } - switch (stepDefinition.definition.type) { case 'DATABASE_EVENT': { return (