follow up #12033 in #12033, SettingsDataModelFieldRelationForm I changed the the use of objectMetadataItems to activeObjectMetadataItems, which filtered out system objects. The naming was one factor for this confusion Renaming it everywhere to specify that they don't include system objects --------- Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
@ -1,5 +1,5 @@
|
|||||||
import { GoToHotkeyItemEffect } from '@/app/effect-components/GoToHotkeyItemEffect';
|
import { GoToHotkeyItemEffect } from '@/app/effect-components/GoToHotkeyItemEffect';
|
||||||
import { useNonSystemActiveObjectMetadataItems } from '@/object-metadata/hooks/useNonSystemActiveObjectMetadataItems';
|
import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilteredObjectMetadataItems';
|
||||||
import { isNavigationDrawerExpandedState } from '@/ui/navigation/states/isNavigationDrawerExpanded';
|
import { isNavigationDrawerExpandedState } from '@/ui/navigation/states/isNavigationDrawerExpanded';
|
||||||
import { navigationDrawerExpandedMemorizedState } from '@/ui/navigation/states/navigationDrawerExpandedMemorizedState';
|
import { navigationDrawerExpandedMemorizedState } from '@/ui/navigation/states/navigationDrawerExpandedMemorizedState';
|
||||||
import { navigationMemorizedUrlState } from '@/ui/navigation/states/navigationMemorizedUrlState';
|
import { navigationMemorizedUrlState } from '@/ui/navigation/states/navigationMemorizedUrlState';
|
||||||
@ -8,8 +8,8 @@ import { useLocation } from 'react-router-dom';
|
|||||||
import { useRecoilCallback } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
|
|
||||||
export const GotoHotkeysEffectsProvider = () => {
|
export const GotoHotkeysEffectsProvider = () => {
|
||||||
const { nonSystemActiveObjectMetadataItems } =
|
const { activeNonSystemObjectMetadataItems } =
|
||||||
useNonSystemActiveObjectMetadataItems();
|
useFilteredObjectMetadataItems();
|
||||||
|
|
||||||
const location = useLocation();
|
const location = useLocation();
|
||||||
|
|
||||||
@ -27,7 +27,7 @@ export const GotoHotkeysEffectsProvider = () => {
|
|||||||
),
|
),
|
||||||
});
|
});
|
||||||
|
|
||||||
return nonSystemActiveObjectMetadataItems.map((objectMetadataItem) => {
|
return activeNonSystemObjectMetadataItems.map((objectMetadataItem) => {
|
||||||
if (!objectMetadataItem.shortcut) {
|
if (!objectMetadataItem.shortcut) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,7 +24,8 @@ export const CommandMenuWorkflowSelectTriggerTypeContent = ({
|
|||||||
const { getIcon } = useIcons();
|
const { getIcon } = useIcons();
|
||||||
const { updateTrigger } = useUpdateWorkflowVersionTrigger({ workflow });
|
const { updateTrigger } = useUpdateWorkflowVersionTrigger({ workflow });
|
||||||
|
|
||||||
const { activeObjectMetadataItems } = useFilteredObjectMetadataItems();
|
const { activeNonSystemObjectMetadataItems } =
|
||||||
|
useFilteredObjectMetadataItems();
|
||||||
|
|
||||||
const setWorkflowSelectedNode = useSetRecoilComponentStateV2(
|
const setWorkflowSelectedNode = useSetRecoilComponentStateV2(
|
||||||
workflowSelectedNodeComponentState,
|
workflowSelectedNodeComponentState,
|
||||||
@ -45,7 +46,7 @@ export const CommandMenuWorkflowSelectTriggerTypeContent = ({
|
|||||||
getTriggerDefaultDefinition({
|
getTriggerDefaultDefinition({
|
||||||
defaultLabel,
|
defaultLabel,
|
||||||
type,
|
type,
|
||||||
activeObjectMetadataItems,
|
activeNonSystemObjectMetadataItems,
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -64,16 +64,17 @@ export const useWorkspaceFavorites = () => {
|
|||||||
}, []),
|
}, []),
|
||||||
);
|
);
|
||||||
|
|
||||||
const { activeObjectMetadataItems } = useFilteredObjectMetadataItems();
|
const { activeNonSystemObjectMetadataItems } =
|
||||||
|
useFilteredObjectMetadataItems();
|
||||||
|
|
||||||
const activeObjectMetadataItemsInWorkspaceFavorites =
|
const activeNonSystemObjectMetadataItemsInWorkspaceFavorites =
|
||||||
activeObjectMetadataItems.filter((item) =>
|
activeNonSystemObjectMetadataItems.filter((item) =>
|
||||||
favoriteViewObjectMetadataIds.has(item.id),
|
favoriteViewObjectMetadataIds.has(item.id),
|
||||||
);
|
);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
workspaceFavorites: sortedWorkspaceFavorites,
|
workspaceFavorites: sortedWorkspaceFavorites,
|
||||||
workspaceFavoritesObjectMetadataItems:
|
workspaceFavoritesObjectMetadataItems:
|
||||||
activeObjectMetadataItemsInWorkspaceFavorites,
|
activeNonSystemObjectMetadataItemsInWorkspaceFavorites,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@ -6,13 +6,15 @@ import { prefetchViewsState } from '@/prefetch/states/prefetchViewsState';
|
|||||||
import { AppPath } from '@/types/AppPath';
|
import { AppPath } from '@/types/AppPath';
|
||||||
import { useCallback, useMemo } from 'react';
|
import { useCallback, useMemo } from 'react';
|
||||||
import { useRecoilValue } from 'recoil';
|
import { useRecoilValue } from 'recoil';
|
||||||
import { getAppPath } from '~/utils/navigation/getAppPath';
|
|
||||||
import { isDefined } from 'twenty-shared/utils';
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
|
import { getAppPath } from '~/utils/navigation/getAppPath';
|
||||||
|
|
||||||
export const useDefaultHomePagePath = () => {
|
export const useDefaultHomePagePath = () => {
|
||||||
const currentUser = useRecoilValue(currentUserState);
|
const currentUser = useRecoilValue(currentUserState);
|
||||||
const { activeObjectMetadataItems, alphaSortedActiveObjectMetadataItems } =
|
const {
|
||||||
useFilteredObjectMetadataItems();
|
activeNonSystemObjectMetadataItems,
|
||||||
|
alphaSortedActiveNonSystemObjectMetadataItems,
|
||||||
|
} = useFilteredObjectMetadataItems();
|
||||||
const prefetchViews = useRecoilValue(prefetchViewsState);
|
const prefetchViews = useRecoilValue(prefetchViewsState);
|
||||||
const lastVisitedObjectMetadataItemId = useRecoilValue(
|
const lastVisitedObjectMetadataItemId = useRecoilValue(
|
||||||
lastVisitedObjectMetadataItemIdState,
|
lastVisitedObjectMetadataItemIdState,
|
||||||
@ -20,11 +22,11 @@ export const useDefaultHomePagePath = () => {
|
|||||||
|
|
||||||
const getActiveObjectMetadataItemMatchingId = useCallback(
|
const getActiveObjectMetadataItemMatchingId = useCallback(
|
||||||
(objectMetadataId: string) => {
|
(objectMetadataId: string) => {
|
||||||
return activeObjectMetadataItems.find(
|
return activeNonSystemObjectMetadataItems.find(
|
||||||
(item) => item.id === objectMetadataId,
|
(item) => item.id === objectMetadataId,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
[activeObjectMetadataItems],
|
[activeNonSystemObjectMetadataItems],
|
||||||
);
|
);
|
||||||
|
|
||||||
const getFirstView = useCallback(
|
const getFirstView = useCallback(
|
||||||
@ -36,7 +38,8 @@ export const useDefaultHomePagePath = () => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
const firstObjectPathInfo = useMemo<ObjectPathInfo | null>(() => {
|
const firstObjectPathInfo = useMemo<ObjectPathInfo | null>(() => {
|
||||||
const [firstObjectMetadataItem] = alphaSortedActiveObjectMetadataItems;
|
const [firstObjectMetadataItem] =
|
||||||
|
alphaSortedActiveNonSystemObjectMetadataItems;
|
||||||
|
|
||||||
if (!isDefined(firstObjectMetadataItem)) {
|
if (!isDefined(firstObjectMetadataItem)) {
|
||||||
return null;
|
return null;
|
||||||
@ -45,7 +48,7 @@ export const useDefaultHomePagePath = () => {
|
|||||||
const view = getFirstView(firstObjectMetadataItem?.id);
|
const view = getFirstView(firstObjectMetadataItem?.id);
|
||||||
|
|
||||||
return { objectMetadataItem: firstObjectMetadataItem, view };
|
return { objectMetadataItem: firstObjectMetadataItem, view };
|
||||||
}, [alphaSortedActiveObjectMetadataItems, getFirstView]);
|
}, [alphaSortedActiveNonSystemObjectMetadataItems, getFirstView]);
|
||||||
|
|
||||||
const defaultObjectPathInfo = useMemo<ObjectPathInfo | null>(() => {
|
const defaultObjectPathInfo = useMemo<ObjectPathInfo | null>(() => {
|
||||||
if (!isDefined(lastVisitedObjectMetadataItemId)) {
|
if (!isDefined(lastVisitedObjectMetadataItemId)) {
|
||||||
|
|||||||
@ -10,10 +10,10 @@ import { useLingui } from '@lingui/react/macro';
|
|||||||
export const NavigationDrawerOpenedSection = () => {
|
export const NavigationDrawerOpenedSection = () => {
|
||||||
const { t } = useLingui();
|
const { t } = useLingui();
|
||||||
|
|
||||||
const { activeObjectMetadataItems } = useFilteredObjectMetadataItems();
|
const { activeNonSystemObjectMetadataItems } =
|
||||||
const filteredActiveObjectMetadataItems = activeObjectMetadataItems.filter(
|
useFilteredObjectMetadataItems();
|
||||||
(item) => !item.isRemote,
|
const filteredActiveNonSystemObjectMetadataItems =
|
||||||
);
|
activeNonSystemObjectMetadataItems.filter((item) => !item.isRemote);
|
||||||
|
|
||||||
const loading = useIsPrefetchLoading();
|
const loading = useIsPrefetchLoading();
|
||||||
|
|
||||||
@ -28,7 +28,7 @@ export const NavigationDrawerOpenedSection = () => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const objectMetadataItem = filteredActiveObjectMetadataItems.find(
|
const objectMetadataItem = filteredActiveNonSystemObjectMetadataItems.find(
|
||||||
(item) =>
|
(item) =>
|
||||||
item.namePlural === currentObjectNamePlural ||
|
item.namePlural === currentObjectNamePlural ||
|
||||||
item.nameSingular === currentObjectNameSingular,
|
item.nameSingular === currentObjectNameSingular,
|
||||||
|
|||||||
@ -10,10 +10,10 @@ import { isDefined } from 'twenty-shared/utils';
|
|||||||
export const RemoteNavigationDrawerSection = () => {
|
export const RemoteNavigationDrawerSection = () => {
|
||||||
const currentUser = useRecoilValue(currentUserState);
|
const currentUser = useRecoilValue(currentUserState);
|
||||||
|
|
||||||
const { activeObjectMetadataItems } = useFilteredObjectMetadataItems();
|
const { activeNonSystemObjectMetadataItems } =
|
||||||
const filteredActiveObjectMetadataItems = activeObjectMetadataItems.filter(
|
useFilteredObjectMetadataItems();
|
||||||
(item) => item.isRemote,
|
const filteredActiveNonSystemObjectMetadataItems =
|
||||||
);
|
activeNonSystemObjectMetadataItems.filter((item) => item.isRemote);
|
||||||
const loading = useIsPrefetchLoading();
|
const loading = useIsPrefetchLoading();
|
||||||
|
|
||||||
if (loading && isDefined(currentUser)) {
|
if (loading && isDefined(currentUser)) {
|
||||||
@ -23,7 +23,7 @@ export const RemoteNavigationDrawerSection = () => {
|
|||||||
return (
|
return (
|
||||||
<NavigationDrawerSectionForObjectMetadataItems
|
<NavigationDrawerSectionForObjectMetadataItems
|
||||||
sectionTitle={'Remote'}
|
sectionTitle={'Remote'}
|
||||||
objectMetadataItems={filteredActiveObjectMetadataItems}
|
objectMetadataItems={filteredActiveNonSystemObjectMetadataItems}
|
||||||
isRemote={true}
|
isRemote={true}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -22,7 +22,7 @@ export const useFilteredObjectMetadataItems = () => {
|
|||||||
[isWorkflowEnabled],
|
[isWorkflowEnabled],
|
||||||
);
|
);
|
||||||
|
|
||||||
const activeObjectMetadataItems = useMemo(
|
const activeNonSystemObjectMetadataItems = useMemo(
|
||||||
() =>
|
() =>
|
||||||
objectMetadataItems.filter(
|
objectMetadataItems.filter(
|
||||||
({ isActive, isSystem, nameSingular }) =>
|
({ isActive, isSystem, nameSingular }) =>
|
||||||
@ -31,8 +31,17 @@ export const useFilteredObjectMetadataItems = () => {
|
|||||||
[isWorkflowToBeFiltered, objectMetadataItems],
|
[isWorkflowToBeFiltered, objectMetadataItems],
|
||||||
);
|
);
|
||||||
|
|
||||||
const alphaSortedActiveObjectMetadataItems = activeObjectMetadataItems.sort(
|
const activeObjectMetadataItems = useMemo(
|
||||||
(a, b) => {
|
() =>
|
||||||
|
objectMetadataItems.filter(
|
||||||
|
({ isActive, nameSingular }) =>
|
||||||
|
isActive && !isWorkflowToBeFiltered(nameSingular),
|
||||||
|
),
|
||||||
|
[isWorkflowToBeFiltered, objectMetadataItems],
|
||||||
|
);
|
||||||
|
|
||||||
|
const alphaSortedActiveNonSystemObjectMetadataItems =
|
||||||
|
activeNonSystemObjectMetadataItems.sort((a, b) => {
|
||||||
if (a.nameSingular < b.nameSingular) {
|
if (a.nameSingular < b.nameSingular) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -40,15 +49,14 @@ export const useFilteredObjectMetadataItems = () => {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
},
|
});
|
||||||
);
|
|
||||||
|
|
||||||
const inactiveObjectMetadataItems = objectMetadataItems.filter(
|
const inactiveNonSystemObjectMetadataItems = objectMetadataItems.filter(
|
||||||
({ isActive, isSystem }) => !isActive && !isSystem,
|
({ isActive, isSystem }) => !isActive && !isSystem,
|
||||||
);
|
);
|
||||||
|
|
||||||
const findActiveObjectMetadataItemByNamePlural = (namePlural: string) =>
|
const findActiveObjectMetadataItemByNamePlural = (namePlural: string) =>
|
||||||
activeObjectMetadataItems.find(
|
activeNonSystemObjectMetadataItems.find(
|
||||||
(activeObjectMetadataItem) =>
|
(activeObjectMetadataItem) =>
|
||||||
activeObjectMetadataItem.namePlural === namePlural,
|
activeObjectMetadataItem.namePlural === namePlural,
|
||||||
);
|
);
|
||||||
@ -64,12 +72,13 @@ export const useFilteredObjectMetadataItems = () => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
activeNonSystemObjectMetadataItems,
|
||||||
activeObjectMetadataItems,
|
activeObjectMetadataItems,
|
||||||
findObjectMetadataItemById,
|
findObjectMetadataItemById,
|
||||||
findObjectMetadataItemByNamePlural,
|
findObjectMetadataItemByNamePlural,
|
||||||
findActiveObjectMetadataItemByNamePlural,
|
findActiveObjectMetadataItemByNamePlural,
|
||||||
inactiveObjectMetadataItems,
|
inactiveNonSystemObjectMetadataItems,
|
||||||
objectMetadataItems,
|
objectMetadataItems,
|
||||||
alphaSortedActiveObjectMetadataItems,
|
alphaSortedActiveNonSystemObjectMetadataItems,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,20 +0,0 @@
|
|||||||
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
|
|
||||||
import { useMemo } from 'react';
|
|
||||||
import { useRecoilValue } from 'recoil';
|
|
||||||
|
|
||||||
export const useNonSystemActiveObjectMetadataItems = () => {
|
|
||||||
const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
|
|
||||||
|
|
||||||
const nonSystemActiveObjectMetadataItems = useMemo(
|
|
||||||
() =>
|
|
||||||
objectMetadataItems.filter(
|
|
||||||
(objectMetadataItem) =>
|
|
||||||
!objectMetadataItem.isSystem && objectMetadataItem.isActive,
|
|
||||||
),
|
|
||||||
[objectMetadataItems],
|
|
||||||
);
|
|
||||||
|
|
||||||
return {
|
|
||||||
nonSystemActiveObjectMetadataItems,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@ -4,8 +4,8 @@ import { Edge, Node } from '@xyflow/react';
|
|||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
|
|
||||||
import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilteredObjectMetadataItems';
|
import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilteredObjectMetadataItems';
|
||||||
import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull';
|
|
||||||
import { isDefined } from 'twenty-shared/utils';
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
|
import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull';
|
||||||
|
|
||||||
type SettingsDataModelOverviewEffectProps = {
|
type SettingsDataModelOverviewEffectProps = {
|
||||||
setEdges: (edges: Edge[]) => void;
|
setEdges: (edges: Edge[]) => void;
|
||||||
@ -17,7 +17,8 @@ export const SettingsDataModelOverviewEffect = ({
|
|||||||
setNodes,
|
setNodes,
|
||||||
}: SettingsDataModelOverviewEffectProps) => {
|
}: SettingsDataModelOverviewEffectProps) => {
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
const { activeObjectMetadataItems: items } = useFilteredObjectMetadataItems();
|
const { activeNonSystemObjectMetadataItems: items } =
|
||||||
|
useFilteredObjectMetadataItems();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const g = new dagre.graphlib.Graph();
|
const g = new dagre.graphlib.Graph();
|
||||||
|
|||||||
@ -19,7 +19,7 @@ export const SettingsRolePermissionsObjectLevelObjectPickerDropdownContent = ({
|
|||||||
}: SettingsRolePermissionsObjectLevelObjectPickerDropdownContentProps) => {
|
}: SettingsRolePermissionsObjectLevelObjectPickerDropdownContentProps) => {
|
||||||
const [searchFilter, setSearchFilter] = useState('');
|
const [searchFilter, setSearchFilter] = useState('');
|
||||||
|
|
||||||
const { alphaSortedActiveObjectMetadataItems: objectMetadataItems } =
|
const { alphaSortedActiveNonSystemObjectMetadataItems: objectMetadataItems } =
|
||||||
useFilteredObjectMetadataItems();
|
useFilteredObjectMetadataItems();
|
||||||
|
|
||||||
const { getIcon } = useIcons();
|
const { getIcon } = useIcons();
|
||||||
|
|||||||
@ -61,10 +61,11 @@ export const WorkflowEditActionCreateRecord = ({
|
|||||||
}: WorkflowEditActionCreateRecordProps) => {
|
}: WorkflowEditActionCreateRecordProps) => {
|
||||||
const { getIcon } = useIcons();
|
const { getIcon } = useIcons();
|
||||||
|
|
||||||
const { activeObjectMetadataItems } = useFilteredObjectMetadataItems();
|
const { activeNonSystemObjectMetadataItems } =
|
||||||
|
useFilteredObjectMetadataItems();
|
||||||
|
|
||||||
const availableMetadata: Array<SelectOption<string>> =
|
const availableMetadata: Array<SelectOption<string>> =
|
||||||
activeObjectMetadataItems.map((item) => ({
|
activeNonSystemObjectMetadataItems.map((item) => ({
|
||||||
Icon: getIcon(item.icon),
|
Icon: getIcon(item.icon),
|
||||||
label: item.labelPlural,
|
label: item.labelPlural,
|
||||||
value: item.nameSingular,
|
value: item.nameSingular,
|
||||||
|
|||||||
@ -39,10 +39,11 @@ export const WorkflowEditActionDeleteRecord = ({
|
|||||||
}: WorkflowEditActionDeleteRecordProps) => {
|
}: WorkflowEditActionDeleteRecordProps) => {
|
||||||
const { getIcon } = useIcons();
|
const { getIcon } = useIcons();
|
||||||
|
|
||||||
const { activeObjectMetadataItems } = useFilteredObjectMetadataItems();
|
const { activeNonSystemObjectMetadataItems } =
|
||||||
|
useFilteredObjectMetadataItems();
|
||||||
|
|
||||||
const availableMetadata: Array<SelectOption<string>> =
|
const availableMetadata: Array<SelectOption<string>> =
|
||||||
activeObjectMetadataItems.map((item) => ({
|
activeNonSystemObjectMetadataItems.map((item) => ({
|
||||||
Icon: getIcon(item.icon),
|
Icon: getIcon(item.icon),
|
||||||
label: item.labelPlural,
|
label: item.labelPlural,
|
||||||
value: item.nameSingular,
|
value: item.nameSingular,
|
||||||
@ -68,7 +69,7 @@ export const WorkflowEditActionDeleteRecord = ({
|
|||||||
saveAction(newFormData);
|
saveAction(newFormData);
|
||||||
};
|
};
|
||||||
|
|
||||||
const objectNameSingular = activeObjectMetadataItems.find(
|
const objectNameSingular = activeNonSystemObjectMetadataItems.find(
|
||||||
(item) => item.nameSingular === formData.objectName,
|
(item) => item.nameSingular === formData.objectName,
|
||||||
)?.nameSingular;
|
)?.nameSingular;
|
||||||
|
|
||||||
|
|||||||
@ -37,10 +37,11 @@ export const WorkflowEditActionFindRecords = ({
|
|||||||
}: WorkflowEditActionFindRecordsProps) => {
|
}: WorkflowEditActionFindRecordsProps) => {
|
||||||
const { getIcon } = useIcons();
|
const { getIcon } = useIcons();
|
||||||
|
|
||||||
const { activeObjectMetadataItems } = useFilteredObjectMetadataItems();
|
const { activeNonSystemObjectMetadataItems } =
|
||||||
|
useFilteredObjectMetadataItems();
|
||||||
|
|
||||||
const availableMetadata: Array<SelectOption<string>> =
|
const availableMetadata: Array<SelectOption<string>> =
|
||||||
activeObjectMetadataItems.map((item) => ({
|
activeNonSystemObjectMetadataItems.map((item) => ({
|
||||||
Icon: getIcon(item.icon),
|
Icon: getIcon(item.icon),
|
||||||
label: item.labelPlural,
|
label: item.labelPlural,
|
||||||
value: item.nameSingular,
|
value: item.nameSingular,
|
||||||
@ -53,7 +54,7 @@ export const WorkflowEditActionFindRecords = ({
|
|||||||
const isFormDisabled = actionOptions.readonly;
|
const isFormDisabled = actionOptions.readonly;
|
||||||
|
|
||||||
const selectedObjectMetadataItemNameSingular =
|
const selectedObjectMetadataItemNameSingular =
|
||||||
activeObjectMetadataItems.find(
|
activeNonSystemObjectMetadataItems.find(
|
||||||
(item) => item.nameSingular === formData.objectName,
|
(item) => item.nameSingular === formData.objectName,
|
||||||
)?.nameSingular ?? '';
|
)?.nameSingular ?? '';
|
||||||
|
|
||||||
|
|||||||
@ -63,10 +63,11 @@ export const WorkflowEditActionUpdateRecord = ({
|
|||||||
}: WorkflowEditActionUpdateRecordProps) => {
|
}: WorkflowEditActionUpdateRecordProps) => {
|
||||||
const { getIcon } = useIcons();
|
const { getIcon } = useIcons();
|
||||||
|
|
||||||
const { activeObjectMetadataItems } = useFilteredObjectMetadataItems();
|
const { activeNonSystemObjectMetadataItems } =
|
||||||
|
useFilteredObjectMetadataItems();
|
||||||
|
|
||||||
const availableMetadata: Array<SelectOption<string>> =
|
const availableMetadata: Array<SelectOption<string>> =
|
||||||
activeObjectMetadataItems.map((item) => ({
|
activeNonSystemObjectMetadataItems.map((item) => ({
|
||||||
Icon: getIcon(item.icon),
|
Icon: getIcon(item.icon),
|
||||||
label: item.labelPlural,
|
label: item.labelPlural,
|
||||||
value: item.nameSingular,
|
value: item.nameSingular,
|
||||||
@ -94,7 +95,7 @@ export const WorkflowEditActionUpdateRecord = ({
|
|||||||
saveAction(newFormData);
|
saveAction(newFormData);
|
||||||
};
|
};
|
||||||
|
|
||||||
const selectedObjectMetadataItem = activeObjectMetadataItems.find(
|
const selectedObjectMetadataItem = activeNonSystemObjectMetadataItems.find(
|
||||||
(item) => item.nameSingular === formData.objectName,
|
(item) => item.nameSingular === formData.objectName,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -27,10 +27,11 @@ export const WorkflowFormFieldSettingsRecordPicker = ({
|
|||||||
}: WorkflowFormFieldSettingsRecordPickerProps) => {
|
}: WorkflowFormFieldSettingsRecordPickerProps) => {
|
||||||
const { getIcon } = useIcons();
|
const { getIcon } = useIcons();
|
||||||
|
|
||||||
const { activeObjectMetadataItems } = useFilteredObjectMetadataItems();
|
const { activeNonSystemObjectMetadataItems } =
|
||||||
|
useFilteredObjectMetadataItems();
|
||||||
|
|
||||||
const availableMetadata: Array<SelectOption<string>> =
|
const availableMetadata: Array<SelectOption<string>> =
|
||||||
activeObjectMetadataItems.map((item) => ({
|
activeNonSystemObjectMetadataItems.map((item) => ({
|
||||||
Icon: getIcon(item.icon),
|
Icon: getIcon(item.icon),
|
||||||
label: item.labelPlural,
|
label: item.labelPlural,
|
||||||
value: item.nameSingular,
|
value: item.nameSingular,
|
||||||
@ -50,7 +51,7 @@ export const WorkflowFormFieldSettingsRecordPicker = ({
|
|||||||
onChange({
|
onChange({
|
||||||
...field,
|
...field,
|
||||||
placeholder: `Select a ${
|
placeholder: `Select a ${
|
||||||
activeObjectMetadataItems.find(
|
activeNonSystemObjectMetadataItems.find(
|
||||||
(item) => item.nameSingular === updatedObjectName,
|
(item) => item.nameSingular === updatedObjectName,
|
||||||
)?.labelSingular || 'record'
|
)?.labelSingular || 'record'
|
||||||
}`,
|
}`,
|
||||||
|
|||||||
@ -36,10 +36,11 @@ export const WorkflowEditTriggerManualForm = ({
|
|||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
const { getIcon } = useIcons();
|
const { getIcon } = useIcons();
|
||||||
|
|
||||||
const { activeObjectMetadataItems } = useFilteredObjectMetadataItems();
|
const { activeNonSystemObjectMetadataItems } =
|
||||||
|
useFilteredObjectMetadataItems();
|
||||||
|
|
||||||
const availableMetadata: Array<SelectOption<string>> =
|
const availableMetadata: Array<SelectOption<string>> =
|
||||||
activeObjectMetadataItems.map((item) => ({
|
activeNonSystemObjectMetadataItems.map((item) => ({
|
||||||
label: item.labelPlural,
|
label: item.labelPlural,
|
||||||
value: item.nameSingular,
|
value: item.nameSingular,
|
||||||
Icon: getIcon(item.icon),
|
Icon: getIcon(item.icon),
|
||||||
@ -91,7 +92,7 @@ export const WorkflowEditTriggerManualForm = ({
|
|||||||
...trigger,
|
...trigger,
|
||||||
settings: getManualTriggerDefaultSettings({
|
settings: getManualTriggerDefaultSettings({
|
||||||
availability: updatedTriggerType,
|
availability: updatedTriggerType,
|
||||||
activeObjectMetadataItems,
|
activeNonSystemObjectMetadataItems,
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
|
|||||||
@ -5,7 +5,7 @@ it('returns settings for a manual trigger that can be activated from any where',
|
|||||||
expect(
|
expect(
|
||||||
getManualTriggerDefaultSettings({
|
getManualTriggerDefaultSettings({
|
||||||
availability: 'EVERYWHERE',
|
availability: 'EVERYWHERE',
|
||||||
activeObjectMetadataItems: generatedMockObjectMetadataItems,
|
activeNonSystemObjectMetadataItems: generatedMockObjectMetadataItems,
|
||||||
}),
|
}),
|
||||||
).toStrictEqual({
|
).toStrictEqual({
|
||||||
objectType: undefined,
|
objectType: undefined,
|
||||||
@ -17,7 +17,7 @@ it('returns settings for a manual trigger that can be activated from any where',
|
|||||||
expect(
|
expect(
|
||||||
getManualTriggerDefaultSettings({
|
getManualTriggerDefaultSettings({
|
||||||
availability: 'WHEN_RECORD_SELECTED',
|
availability: 'WHEN_RECORD_SELECTED',
|
||||||
activeObjectMetadataItems: generatedMockObjectMetadataItems,
|
activeNonSystemObjectMetadataItems: generatedMockObjectMetadataItems,
|
||||||
}),
|
}),
|
||||||
).toStrictEqual({
|
).toStrictEqual({
|
||||||
objectType: generatedMockObjectMetadataItems[0].nameSingular,
|
objectType: generatedMockObjectMetadataItems[0].nameSingular,
|
||||||
|
|||||||
@ -3,12 +3,12 @@ import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedM
|
|||||||
import { getTriggerDefaultDefinition } from '../getTriggerDefaultDefinition';
|
import { getTriggerDefaultDefinition } from '../getTriggerDefaultDefinition';
|
||||||
|
|
||||||
describe('getTriggerDefaultDefinition', () => {
|
describe('getTriggerDefaultDefinition', () => {
|
||||||
it('throws if the activeObjectMetadataItems list is empty', () => {
|
it('throws if the activeNonSystemObjectMetadataItems list is empty', () => {
|
||||||
expect(() => {
|
expect(() => {
|
||||||
getTriggerDefaultDefinition({
|
getTriggerDefaultDefinition({
|
||||||
defaultLabel: DatabaseTriggerDefaultLabel.RECORD_IS_CREATED,
|
defaultLabel: DatabaseTriggerDefaultLabel.RECORD_IS_CREATED,
|
||||||
type: 'DATABASE_EVENT',
|
type: 'DATABASE_EVENT',
|
||||||
activeObjectMetadataItems: [],
|
activeNonSystemObjectMetadataItems: [],
|
||||||
});
|
});
|
||||||
}).toThrow();
|
}).toThrow();
|
||||||
});
|
});
|
||||||
@ -18,7 +18,7 @@ describe('getTriggerDefaultDefinition', () => {
|
|||||||
getTriggerDefaultDefinition({
|
getTriggerDefaultDefinition({
|
||||||
defaultLabel: DatabaseTriggerDefaultLabel.RECORD_IS_CREATED,
|
defaultLabel: DatabaseTriggerDefaultLabel.RECORD_IS_CREATED,
|
||||||
type: 'DATABASE_EVENT',
|
type: 'DATABASE_EVENT',
|
||||||
activeObjectMetadataItems: generatedMockObjectMetadataItems,
|
activeNonSystemObjectMetadataItems: generatedMockObjectMetadataItems,
|
||||||
}),
|
}),
|
||||||
).toStrictEqual({
|
).toStrictEqual({
|
||||||
type: 'DATABASE_EVENT',
|
type: 'DATABASE_EVENT',
|
||||||
@ -35,7 +35,7 @@ describe('getTriggerDefaultDefinition', () => {
|
|||||||
getTriggerDefaultDefinition({
|
getTriggerDefaultDefinition({
|
||||||
defaultLabel: DatabaseTriggerDefaultLabel.RECORD_IS_UPDATED,
|
defaultLabel: DatabaseTriggerDefaultLabel.RECORD_IS_UPDATED,
|
||||||
type: 'DATABASE_EVENT',
|
type: 'DATABASE_EVENT',
|
||||||
activeObjectMetadataItems: generatedMockObjectMetadataItems,
|
activeNonSystemObjectMetadataItems: generatedMockObjectMetadataItems,
|
||||||
}),
|
}),
|
||||||
).toStrictEqual({
|
).toStrictEqual({
|
||||||
type: 'DATABASE_EVENT',
|
type: 'DATABASE_EVENT',
|
||||||
@ -52,7 +52,7 @@ describe('getTriggerDefaultDefinition', () => {
|
|||||||
getTriggerDefaultDefinition({
|
getTriggerDefaultDefinition({
|
||||||
defaultLabel: DatabaseTriggerDefaultLabel.RECORD_IS_DELETED,
|
defaultLabel: DatabaseTriggerDefaultLabel.RECORD_IS_DELETED,
|
||||||
type: 'DATABASE_EVENT',
|
type: 'DATABASE_EVENT',
|
||||||
activeObjectMetadataItems: generatedMockObjectMetadataItems,
|
activeNonSystemObjectMetadataItems: generatedMockObjectMetadataItems,
|
||||||
}),
|
}),
|
||||||
).toStrictEqual({
|
).toStrictEqual({
|
||||||
type: 'DATABASE_EVENT',
|
type: 'DATABASE_EVENT',
|
||||||
@ -69,7 +69,7 @@ describe('getTriggerDefaultDefinition', () => {
|
|||||||
getTriggerDefaultDefinition({
|
getTriggerDefaultDefinition({
|
||||||
defaultLabel: DatabaseTriggerDefaultLabel.RECORD_IS_CREATED,
|
defaultLabel: DatabaseTriggerDefaultLabel.RECORD_IS_CREATED,
|
||||||
type: 'DATABASE_EVENT',
|
type: 'DATABASE_EVENT',
|
||||||
activeObjectMetadataItems: generatedMockObjectMetadataItems,
|
activeNonSystemObjectMetadataItems: generatedMockObjectMetadataItems,
|
||||||
}),
|
}),
|
||||||
).toStrictEqual({
|
).toStrictEqual({
|
||||||
type: 'DATABASE_EVENT',
|
type: 'DATABASE_EVENT',
|
||||||
@ -86,7 +86,7 @@ describe('getTriggerDefaultDefinition', () => {
|
|||||||
getTriggerDefaultDefinition({
|
getTriggerDefaultDefinition({
|
||||||
defaultLabel: 'Launch manually',
|
defaultLabel: 'Launch manually',
|
||||||
type: 'MANUAL',
|
type: 'MANUAL',
|
||||||
activeObjectMetadataItems: generatedMockObjectMetadataItems,
|
activeNonSystemObjectMetadataItems: generatedMockObjectMetadataItems,
|
||||||
}),
|
}),
|
||||||
).toStrictEqual({
|
).toStrictEqual({
|
||||||
type: 'MANUAL',
|
type: 'MANUAL',
|
||||||
@ -103,7 +103,7 @@ describe('getTriggerDefaultDefinition', () => {
|
|||||||
getTriggerDefaultDefinition({
|
getTriggerDefaultDefinition({
|
||||||
defaultLabel: DatabaseTriggerDefaultLabel.RECORD_IS_CREATED,
|
defaultLabel: DatabaseTriggerDefaultLabel.RECORD_IS_CREATED,
|
||||||
type: 'unknown' as any,
|
type: 'unknown' as any,
|
||||||
activeObjectMetadataItems: generatedMockObjectMetadataItems,
|
activeNonSystemObjectMetadataItems: generatedMockObjectMetadataItems,
|
||||||
});
|
});
|
||||||
}).toThrow('Unknown type: unknown');
|
}).toThrow('Unknown type: unknown');
|
||||||
});
|
});
|
||||||
|
|||||||
@ -7,10 +7,10 @@ import { assertUnreachable } from '@/workflow/utils/assertUnreachable';
|
|||||||
|
|
||||||
export const getManualTriggerDefaultSettings = ({
|
export const getManualTriggerDefaultSettings = ({
|
||||||
availability,
|
availability,
|
||||||
activeObjectMetadataItems,
|
activeNonSystemObjectMetadataItems,
|
||||||
}: {
|
}: {
|
||||||
availability: WorkflowManualTriggerAvailability;
|
availability: WorkflowManualTriggerAvailability;
|
||||||
activeObjectMetadataItems: ObjectMetadataItem[];
|
activeNonSystemObjectMetadataItems: ObjectMetadataItem[];
|
||||||
}): WorkflowManualTriggerSettings => {
|
}): WorkflowManualTriggerSettings => {
|
||||||
switch (availability) {
|
switch (availability) {
|
||||||
case 'EVERYWHERE': {
|
case 'EVERYWHERE': {
|
||||||
@ -21,7 +21,7 @@ export const getManualTriggerDefaultSettings = ({
|
|||||||
}
|
}
|
||||||
case 'WHEN_RECORD_SELECTED': {
|
case 'WHEN_RECORD_SELECTED': {
|
||||||
return {
|
return {
|
||||||
objectType: activeObjectMetadataItems[0].nameSingular,
|
objectType: activeNonSystemObjectMetadataItems[0].nameSingular,
|
||||||
outputSchema: {},
|
outputSchema: {},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,13 +10,13 @@ import { getManualTriggerDefaultSettings } from '@/workflow/workflow-trigger/uti
|
|||||||
export const getTriggerDefaultDefinition = ({
|
export const getTriggerDefaultDefinition = ({
|
||||||
defaultLabel,
|
defaultLabel,
|
||||||
type,
|
type,
|
||||||
activeObjectMetadataItems,
|
activeNonSystemObjectMetadataItems,
|
||||||
}: {
|
}: {
|
||||||
defaultLabel: string;
|
defaultLabel: string;
|
||||||
type: WorkflowTriggerType;
|
type: WorkflowTriggerType;
|
||||||
activeObjectMetadataItems: ObjectMetadataItem[];
|
activeNonSystemObjectMetadataItems: ObjectMetadataItem[];
|
||||||
}): WorkflowTrigger => {
|
}): WorkflowTrigger => {
|
||||||
if (activeObjectMetadataItems.length === 0) {
|
if (activeNonSystemObjectMetadataItems.length === 0) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
'This function need to receive at least one object metadata item to run.',
|
'This function need to receive at least one object metadata item to run.',
|
||||||
);
|
);
|
||||||
@ -28,7 +28,7 @@ export const getTriggerDefaultDefinition = ({
|
|||||||
type,
|
type,
|
||||||
name: defaultLabel,
|
name: defaultLabel,
|
||||||
settings: {
|
settings: {
|
||||||
eventName: `${activeObjectMetadataItems[0].nameSingular}.${
|
eventName: `${activeNonSystemObjectMetadataItems[0].nameSingular}.${
|
||||||
DATABASE_TRIGGER_TYPES.find(
|
DATABASE_TRIGGER_TYPES.find(
|
||||||
(availableEvent) => availableEvent.defaultLabel === defaultLabel,
|
(availableEvent) => availableEvent.defaultLabel === defaultLabel,
|
||||||
)?.event
|
)?.event
|
||||||
@ -43,7 +43,7 @@ export const getTriggerDefaultDefinition = ({
|
|||||||
name: defaultLabel,
|
name: defaultLabel,
|
||||||
settings: getManualTriggerDefaultSettings({
|
settings: getManualTriggerDefaultSettings({
|
||||||
availability: 'WHEN_RECORD_SELECTED',
|
availability: 'WHEN_RECORD_SELECTED',
|
||||||
activeObjectMetadataItems,
|
activeNonSystemObjectMetadataItems,
|
||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,18 +23,18 @@ import styled from '@emotion/styled';
|
|||||||
import { Trans, useLingui } from '@lingui/react/macro';
|
import { Trans, useLingui } from '@lingui/react/macro';
|
||||||
import { isNonEmptyArray } from '@sniptt/guards';
|
import { isNonEmptyArray } from '@sniptt/guards';
|
||||||
import { useMemo, useState } from 'react';
|
import { useMemo, useState } from 'react';
|
||||||
import { GET_SETTINGS_OBJECT_TABLE_METADATA } from '~/pages/settings/data-model/constants/SettingsObjectTableMetadata';
|
|
||||||
import { SettingsObjectTableItem } from '~/pages/settings/data-model/types/SettingsObjectTableItem';
|
|
||||||
import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
|
|
||||||
import { Button } from 'twenty-ui/input';
|
|
||||||
import {
|
import {
|
||||||
H2Title,
|
H2Title,
|
||||||
IconChevronRight,
|
IconChevronRight,
|
||||||
IconPlus,
|
IconPlus,
|
||||||
IconSearch,
|
IconSearch,
|
||||||
} from 'twenty-ui/display';
|
} from 'twenty-ui/display';
|
||||||
|
import { Button } from 'twenty-ui/input';
|
||||||
import { Section } from 'twenty-ui/layout';
|
import { Section } from 'twenty-ui/layout';
|
||||||
import { UndecoratedLink } from 'twenty-ui/navigation';
|
import { UndecoratedLink } from 'twenty-ui/navigation';
|
||||||
|
import { GET_SETTINGS_OBJECT_TABLE_METADATA } from '~/pages/settings/data-model/constants/SettingsObjectTableMetadata';
|
||||||
|
import { SettingsObjectTableItem } from '~/pages/settings/data-model/types/SettingsObjectTableItem';
|
||||||
|
import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
|
||||||
|
|
||||||
const StyledIconChevronRight = styled(IconChevronRight)`
|
const StyledIconChevronRight = styled(IconChevronRight)`
|
||||||
color: ${({ theme }) => theme.font.color.tertiary};
|
color: ${({ theme }) => theme.font.color.tertiary};
|
||||||
@ -52,21 +52,23 @@ export const SettingsObjects = () => {
|
|||||||
const { deleteOneObjectMetadataItem } = useDeleteOneObjectMetadataItem();
|
const { deleteOneObjectMetadataItem } = useDeleteOneObjectMetadataItem();
|
||||||
const { updateOneObjectMetadataItem } = useUpdateOneObjectMetadataItem();
|
const { updateOneObjectMetadataItem } = useUpdateOneObjectMetadataItem();
|
||||||
|
|
||||||
const { activeObjectMetadataItems, inactiveObjectMetadataItems } =
|
const {
|
||||||
useFilteredObjectMetadataItems();
|
activeNonSystemObjectMetadataItems,
|
||||||
|
inactiveNonSystemObjectMetadataItems,
|
||||||
|
} = useFilteredObjectMetadataItems();
|
||||||
|
|
||||||
const { totalCountByObjectMetadataItemNamePlural } = useCombinedGetTotalCount(
|
const { totalCountByObjectMetadataItemNamePlural } = useCombinedGetTotalCount(
|
||||||
{
|
{
|
||||||
objectMetadataItems: [
|
objectMetadataItems: [
|
||||||
...activeObjectMetadataItems,
|
...activeNonSystemObjectMetadataItems,
|
||||||
...inactiveObjectMetadataItems,
|
...inactiveNonSystemObjectMetadataItems,
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
const activeObjectSettingsArray = useMemo(
|
const activeObjectSettingsArray = useMemo(
|
||||||
() =>
|
() =>
|
||||||
activeObjectMetadataItems.map(
|
activeNonSystemObjectMetadataItems.map(
|
||||||
(objectMetadataItem) =>
|
(objectMetadataItem) =>
|
||||||
({
|
({
|
||||||
objectMetadataItem,
|
objectMetadataItem,
|
||||||
@ -81,12 +83,15 @@ export const SettingsObjects = () => {
|
|||||||
] ?? 0,
|
] ?? 0,
|
||||||
}) satisfies SettingsObjectTableItem,
|
}) satisfies SettingsObjectTableItem,
|
||||||
),
|
),
|
||||||
[activeObjectMetadataItems, totalCountByObjectMetadataItemNamePlural],
|
[
|
||||||
|
activeNonSystemObjectMetadataItems,
|
||||||
|
totalCountByObjectMetadataItemNamePlural,
|
||||||
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
const inactiveObjectSettingsArray = useMemo(
|
const inactiveObjectSettingsArray = useMemo(
|
||||||
() =>
|
() =>
|
||||||
inactiveObjectMetadataItems.map(
|
inactiveNonSystemObjectMetadataItems.map(
|
||||||
(objectMetadataItem) =>
|
(objectMetadataItem) =>
|
||||||
({
|
({
|
||||||
objectMetadataItem,
|
objectMetadataItem,
|
||||||
@ -101,7 +106,10 @@ export const SettingsObjects = () => {
|
|||||||
] ?? 0,
|
] ?? 0,
|
||||||
}) satisfies SettingsObjectTableItem,
|
}) satisfies SettingsObjectTableItem,
|
||||||
),
|
),
|
||||||
[inactiveObjectMetadataItems, totalCountByObjectMetadataItemNamePlural],
|
[
|
||||||
|
inactiveNonSystemObjectMetadataItems,
|
||||||
|
totalCountByObjectMetadataItemNamePlural,
|
||||||
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
const sortedActiveObjectSettingsItems = useSortedArray(
|
const sortedActiveObjectSettingsItems = useSortedArray(
|
||||||
@ -211,7 +219,7 @@ export const SettingsObjects = () => {
|
|||||||
)}
|
)}
|
||||||
</TableSection>
|
</TableSection>
|
||||||
)}
|
)}
|
||||||
{isNonEmptyArray(inactiveObjectMetadataItems) && (
|
{isNonEmptyArray(inactiveNonSystemObjectMetadataItems) && (
|
||||||
<TableSection title={t`Inactive`}>
|
<TableSection title={t`Inactive`}>
|
||||||
{filteredInactiveObjectSettingsItems.map(
|
{filteredInactiveObjectSettingsItems.map(
|
||||||
(objectSettingsItem) => (
|
(objectSettingsItem) => (
|
||||||
|
|||||||
Reference in New Issue
Block a user