From ad2357a6fd971ed8e8732a5a5b02fe4dbbf753a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Bosi?= <71827178+bosiraphael@users.noreply.github.com> Date: Fri, 4 Apr 2025 14:26:19 +0200 Subject: [PATCH] Fix error when workflows aren't enabled (#11388) Fix Uncaught Error: Workflow is not enabled. If you want to use it, please enable it in the lab. erroractionmenu This error was due to using the hook `useWorkflowWithCurrentVersion` outside of a workflow object. Adding a skip parameter wasn't enough because the `useFindOneRecord` uses `useObjectMetadataItem` which throws if workflows aren't enabled. --- .../RecordActionMenuEntriesSetter.tsx | 15 +++++- .../RegisterRecordActionEffects.tsx | 6 +++ .../RegisterWorkflowRecordActionEffects.tsx | 50 +++++++++++++++++++ .../hooks/useRegisteredRecordActions.ts | 10 ++-- .../useShouldActionBeRegisteredParams.ts | 7 --- .../hooks/useWorkflowWithCurrentVersion.ts | 3 +- 6 files changed, 75 insertions(+), 16 deletions(-) create mode 100644 packages/twenty-front/src/modules/action-menu/actions/record-actions/components/RegisterWorkflowRecordActionEffects.tsx diff --git a/packages/twenty-front/src/modules/action-menu/actions/record-actions/components/RecordActionMenuEntriesSetter.tsx b/packages/twenty-front/src/modules/action-menu/actions/record-actions/components/RecordActionMenuEntriesSetter.tsx index f6ad70b7b..8410c15f6 100644 --- a/packages/twenty-front/src/modules/action-menu/actions/record-actions/components/RecordActionMenuEntriesSetter.tsx +++ b/packages/twenty-front/src/modules/action-menu/actions/record-actions/components/RecordActionMenuEntriesSetter.tsx @@ -1,9 +1,11 @@ import { RegisterRecordActionEffects } from '@/action-menu/actions/record-actions/components/RegisterRecordActionEffects'; +import { RegisterWorkflowRecordActionEffects } from '@/action-menu/actions/record-actions/components/RegisterWorkflowRecordActionEffects'; import { WorkflowRunRecordActionMenuEntrySetterEffect } from '@/action-menu/actions/record-actions/workflow-run-record-actions/components/WorkflowRunRecordActionMenuEntrySetter'; import { MAIN_CONTEXT_STORE_INSTANCE_ID } from '@/context-store/constants/MainContextStoreInstanceId'; import { contextStoreCurrentObjectMetadataItemIdComponentState } from '@/context-store/states/contextStoreCurrentObjectMetadataItemIdComponentState'; import { contextStoreTargetedRecordsRuleComponentState } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; +import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled'; import { useRecoilValue } from 'recoil'; @@ -48,9 +50,20 @@ export const RecordActionMenuEntriesSetter = () => { return null; } + const isWorkflowObject = + objectMetadataItem.nameSingular === CoreObjectNameSingular.Workflow || + objectMetadataItem.nameSingular === CoreObjectNameSingular.WorkflowRun || + objectMetadataItem.nameSingular === CoreObjectNameSingular.WorkflowVersion; + return ( <> - + {isWorkflowObject ? ( + + ) : ( + + )} {isWorkflowEnabled && contextStoreTargetedRecordsRule?.mode === 'selection' && diff --git a/packages/twenty-front/src/modules/action-menu/actions/record-actions/components/RegisterRecordActionEffects.tsx b/packages/twenty-front/src/modules/action-menu/actions/record-actions/components/RegisterRecordActionEffects.tsx index c9a2f4b84..fa907f4f4 100644 --- a/packages/twenty-front/src/modules/action-menu/actions/record-actions/components/RegisterRecordActionEffects.tsx +++ b/packages/twenty-front/src/modules/action-menu/actions/record-actions/components/RegisterRecordActionEffects.tsx @@ -1,5 +1,6 @@ import { RegisterRecordActionEffect } from '@/action-menu/actions/record-actions/components/RegisterRecordActionEffect'; import { useRegisteredRecordActions } from '@/action-menu/hooks/useRegisteredRecordActions'; +import { useShouldActionBeRegisteredParams } from '@/action-menu/hooks/useShouldActionBeRegisteredParams'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; type RegisterRecordActionEffectsProps = { @@ -9,8 +10,13 @@ type RegisterRecordActionEffectsProps = { export const RegisterRecordActionEffects = ({ objectMetadataItem, }: RegisterRecordActionEffectsProps) => { + const shouldBeRegisteredParams = useShouldActionBeRegisteredParams({ + objectMetadataItem, + }); + const actionsToRegister = useRegisteredRecordActions({ objectMetadataItem, + shouldBeRegisteredParams, }); return ( diff --git a/packages/twenty-front/src/modules/action-menu/actions/record-actions/components/RegisterWorkflowRecordActionEffects.tsx b/packages/twenty-front/src/modules/action-menu/actions/record-actions/components/RegisterWorkflowRecordActionEffects.tsx new file mode 100644 index 000000000..c0b857cf1 --- /dev/null +++ b/packages/twenty-front/src/modules/action-menu/actions/record-actions/components/RegisterWorkflowRecordActionEffects.tsx @@ -0,0 +1,50 @@ +import { RegisterRecordActionEffect } from '@/action-menu/actions/record-actions/components/RegisterRecordActionEffect'; +import { useRegisteredRecordActions } from '@/action-menu/hooks/useRegisteredRecordActions'; +import { useShouldActionBeRegisteredParams } from '@/action-menu/hooks/useShouldActionBeRegisteredParams'; +import { contextStoreTargetedRecordsRuleComponentState } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState'; +import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; +import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; +import { useWorkflowWithCurrentVersion } from '@/workflow/hooks/useWorkflowWithCurrentVersion'; + +type RegisterWorkflowRecordActionEffectsProps = { + objectMetadataItem: ObjectMetadataItem; +}; + +export const RegisterWorkflowRecordActionEffects = ({ + objectMetadataItem, +}: RegisterWorkflowRecordActionEffectsProps) => { + const shouldBeRegisteredParams = useShouldActionBeRegisteredParams({ + objectMetadataItem, + }); + + const contextStoreTargetedRecordsRule = useRecoilComponentValueV2( + contextStoreTargetedRecordsRuleComponentState, + ); + + const recordId = + contextStoreTargetedRecordsRule.mode === 'selection' + ? contextStoreTargetedRecordsRule.selectedRecordIds[0] + : undefined; + + const workflowWithCurrentVersion = useWorkflowWithCurrentVersion(recordId); + + const actionsToRegister = useRegisteredRecordActions({ + objectMetadataItem, + shouldBeRegisteredParams: { + ...shouldBeRegisteredParams, + workflowWithCurrentVersion, + }, + }); + + return ( + <> + {actionsToRegister.map((action) => ( + + ))} + + ); +}; diff --git a/packages/twenty-front/src/modules/action-menu/hooks/useRegisteredRecordActions.ts b/packages/twenty-front/src/modules/action-menu/hooks/useRegisteredRecordActions.ts index 8656f3573..b31773a95 100644 --- a/packages/twenty-front/src/modules/action-menu/hooks/useRegisteredRecordActions.ts +++ b/packages/twenty-front/src/modules/action-menu/hooks/useRegisteredRecordActions.ts @@ -1,7 +1,7 @@ import { ActionViewType } from '@/action-menu/actions/types/ActionViewType'; +import { ShouldBeRegisteredFunctionParams } from '@/action-menu/actions/types/ShouldBeRegisteredFunctionParams'; import { getActionConfig } from '@/action-menu/actions/utils/getActionConfig'; import { getActionViewType } from '@/action-menu/actions/utils/getActionViewType'; -import { useShouldActionBeRegisteredParams } from '@/action-menu/hooks/useShouldActionBeRegisteredParams'; import { contextStoreCurrentViewTypeComponentState } from '@/context-store/states/contextStoreCurrentViewTypeComponentState'; import { contextStoreTargetedRecordsRuleComponentState } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; @@ -10,13 +10,11 @@ import { isDefined } from 'twenty-shared/utils'; export const useRegisteredRecordActions = ({ objectMetadataItem, + shouldBeRegisteredParams, }: { objectMetadataItem: ObjectMetadataItem; + shouldBeRegisteredParams: ShouldBeRegisteredFunctionParams; }) => { - const params = useShouldActionBeRegisteredParams({ - objectMetadataItem, - }); - const contextStoreTargetedRecordsRule = useRecoilComponentValueV2( contextStoreTargetedRecordsRuleComponentState, ); @@ -41,7 +39,7 @@ export const useRegisteredRecordActions = ({ : []; const actions = actionsToRegister.filter((action) => - action.shouldBeRegistered(params), + action.shouldBeRegistered(shouldBeRegisteredParams), ); return actions; diff --git a/packages/twenty-front/src/modules/action-menu/hooks/useShouldActionBeRegisteredParams.ts b/packages/twenty-front/src/modules/action-menu/hooks/useShouldActionBeRegisteredParams.ts index 33b0d1f1e..023604984 100644 --- a/packages/twenty-front/src/modules/action-menu/hooks/useShouldActionBeRegisteredParams.ts +++ b/packages/twenty-front/src/modules/action-menu/hooks/useShouldActionBeRegisteredParams.ts @@ -10,7 +10,6 @@ import { recordStoreFamilyState } from '@/object-record/record-store/states/reco import { isSoftDeleteFilterActiveComponentState } from '@/object-record/record-table/states/isSoftDeleteFilterActiveComponentState'; import { useHasObjectReadOnlyPermission } from '@/settings/roles/hooks/useHasObjectReadOnlyPermission'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; -import { useWorkflowWithCurrentVersion } from '@/workflow/hooks/useWorkflowWithCurrentVersion'; import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled'; import { useContext } from 'react'; import { useRecoilValue } from 'recoil'; @@ -67,11 +66,6 @@ export const useShouldActionBeRegisteredParams = ({ contextStoreNumberOfSelectedRecordsComponentState, ); - const workflowWithCurrentVersion = useWorkflowWithCurrentVersion( - recordId, - objectMetadataItem.nameSingular !== CoreObjectNameSingular.Workflow, - ); - return { isFavorite, isRemoteObject, @@ -83,6 +77,5 @@ export const useShouldActionBeRegisteredParams = ({ selectedRecord, isWorkflowsEnabled, numberOfSelectedRecords, - workflowWithCurrentVersion, }; }; diff --git a/packages/twenty-front/src/modules/workflow/hooks/useWorkflowWithCurrentVersion.ts b/packages/twenty-front/src/modules/workflow/hooks/useWorkflowWithCurrentVersion.ts index bca93e017..d3a4920f8 100644 --- a/packages/twenty-front/src/modules/workflow/hooks/useWorkflowWithCurrentVersion.ts +++ b/packages/twenty-front/src/modules/workflow/hooks/useWorkflowWithCurrentVersion.ts @@ -9,7 +9,6 @@ import { isDefined } from 'twenty-shared/utils'; export const useWorkflowWithCurrentVersion = ( workflowId: string | undefined, - skip = false, ): WorkflowWithCurrentVersion | undefined => { const { record: workflow } = useFindOneRecord({ objectNameSingular: CoreObjectNameSingular.Workflow, @@ -21,7 +20,7 @@ export const useWorkflowWithCurrentVersion = ( lastPublishedVersionId: true, versions: true, }, - skip: !isDefined(workflowId) || skip, + skip: !isDefined(workflowId), }); return useMemo(() => {