+
+ {showInsertBeforeZone && (
+
+ )}
{
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
- const flatWorkspaceItems = workspaceNavigationMenuItems
- .filter((item) => !isDefined(item.folderId))
- .sort((a, b) => a.position - b.position);
-
- const processedItemsById = new Map(
- workspaceNavigationMenuItemsSorted.map((item) => [item.id, item]),
- );
-
const folderChildrenById = new Map(
workspaceNavigationMenuItemsByFolder.map((folder) => [
folder.id,
@@ -45,40 +33,13 @@ export const useNavigationMenuItemSectionItems = (): NavigationMenuItem[] => {
]),
);
- const flatItems: NavigationMenuItem[] = flatWorkspaceItems.reduce<
- NavigationMenuItem[]
- >((acc, item) => {
- if (isNavigationMenuItemFolder(item)) {
- acc.push({
- ...item,
- icon: item.icon ?? FOLDER_ICON_DEFAULT,
- });
- } else {
- const validItem = processedItemsById.get(item.id);
- if (!isDefined(validItem)) {
- return acc;
- }
- if (validItem.type === NavigationMenuItemType.LINK) {
- acc.push(validItem);
- } else {
- const objectMetadataItem = getObjectMetadataForNavigationMenuItem(
- validItem,
- objectMetadataItems,
- views,
- );
- if (
- isDefined(objectMetadataItem) &&
- getObjectPermissionsForObject(
- objectPermissionsByObjectMetadataId,
- objectMetadataItem.id,
- ).canReadObjectRecords
- ) {
- acc.push(validItem);
- }
- }
- }
- return acc;
- }, []);
+ const flatItems = getWorkspaceSidebarOrphanItemsInDisplayOrder({
+ workspaceNavigationMenuItems,
+ workspaceNavigationMenuItemsSorted,
+ objectMetadataItems,
+ views,
+ objectPermissionsByObjectMetadataId,
+ });
return flatItems.flatMap((item) =>
item.type === NavigationMenuItemType.FOLDER
diff --git a/packages/twenty-front/src/modules/navigation-menu-item/display/sections/types/NavigationMenuItemSectionContentProps.ts b/packages/twenty-front/src/modules/navigation-menu-item/display/sections/types/NavigationMenuItemSectionContentProps.ts
index f7393a1cd8..5b43f34f0e 100644
--- a/packages/twenty-front/src/modules/navigation-menu-item/display/sections/types/NavigationMenuItemSectionContentProps.ts
+++ b/packages/twenty-front/src/modules/navigation-menu-item/display/sections/types/NavigationMenuItemSectionContentProps.ts
@@ -21,4 +21,5 @@ export type NavigationMenuItemSectionContentProps = {
navigationMenuItemId: string,
) => void;
readOnly?: boolean;
+ orphanIndex?: number;
};
diff --git a/packages/twenty-front/src/modules/navigation-menu-item/display/sections/workspace/components/WorkspaceSectionListDndKit.tsx b/packages/twenty-front/src/modules/navigation-menu-item/display/sections/workspace/components/WorkspaceSectionListDndKit.tsx
index 619a654b45..2e4a4b0d0c 100644
--- a/packages/twenty-front/src/modules/navigation-menu-item/display/sections/workspace/components/WorkspaceSectionListDndKit.tsx
+++ b/packages/twenty-front/src/modules/navigation-menu-item/display/sections/workspace/components/WorkspaceSectionListDndKit.tsx
@@ -75,6 +75,7 @@ export const WorkspaceSectionListDndKit = ({
selectedNavigationMenuItemId={selectedNavigationMenuItemId}
onNavigationMenuItemClick={onNavigationMenuItemClick}
onActiveObjectMetadataItemClick={onActiveObjectMetadataItemClick}
+ orphanIndex={index}
/>
diff --git a/packages/twenty-front/src/modules/navigation-menu-item/display/utils/getWorkspaceSidebarOrphanItemsInDisplayOrder.ts b/packages/twenty-front/src/modules/navigation-menu-item/display/utils/getWorkspaceSidebarOrphanItemsInDisplayOrder.ts
new file mode 100644
index 0000000000..0fc44fd7ed
--- /dev/null
+++ b/packages/twenty-front/src/modules/navigation-menu-item/display/utils/getWorkspaceSidebarOrphanItemsInDisplayOrder.ts
@@ -0,0 +1,69 @@
+import { NavigationMenuItemType } from 'twenty-shared/types';
+import { isDefined } from 'twenty-shared/utils';
+import { type NavigationMenuItem } from '~/generated-metadata/graphql';
+
+import { FOLDER_ICON_DEFAULT } from '@/navigation-menu-item/common/constants/FolderIconDefault';
+import { isNavigationMenuItemFolder } from '@/navigation-menu-item/common/utils/isNavigationMenuItemFolder';
+import { getObjectMetadataForNavigationMenuItem } from '@/navigation-menu-item/display/object/utils/getObjectMetadataForNavigationMenuItem';
+import { type EnrichedObjectMetadataItem } from '@/object-metadata/types/EnrichedObjectMetadataItem';
+import { getObjectPermissionsForObject } from '@/object-metadata/utils/getObjectPermissionsForObject';
+import { type ViewWithRelations } from '@/views/types/ViewWithRelations';
+
+type GetWorkspaceSidebarOrphanItemsInDisplayOrderArgs = {
+ workspaceNavigationMenuItems: NavigationMenuItem[];
+ workspaceNavigationMenuItemsSorted: NavigationMenuItem[];
+ objectMetadataItems: EnrichedObjectMetadataItem[];
+ views: ViewWithRelations[];
+ objectPermissionsByObjectMetadataId: Parameters<
+ typeof getObjectPermissionsForObject
+ >[0];
+};
+
+export const getWorkspaceSidebarOrphanItemsInDisplayOrder = ({
+ workspaceNavigationMenuItems,
+ workspaceNavigationMenuItemsSorted,
+ objectMetadataItems,
+ views,
+ objectPermissionsByObjectMetadataId,
+}: GetWorkspaceSidebarOrphanItemsInDisplayOrderArgs): NavigationMenuItem[] => {
+ const flatWorkspaceItems = workspaceNavigationMenuItems
+ .filter((item) => !isDefined(item.folderId))
+ .sort((a, b) => a.position - b.position);
+
+ const processedItemsById = new Map(
+ workspaceNavigationMenuItemsSorted.map((item) => [item.id, item]),
+ );
+
+ return flatWorkspaceItems.reduce((acc, item) => {
+ if (isNavigationMenuItemFolder(item)) {
+ acc.push({
+ ...item,
+ icon: item.icon ?? FOLDER_ICON_DEFAULT,
+ });
+ } else {
+ const validItem = processedItemsById.get(item.id);
+ if (!isDefined(validItem)) {
+ return acc;
+ }
+ if (validItem.type === NavigationMenuItemType.LINK) {
+ acc.push(validItem);
+ } else {
+ const objectMetadataItem = getObjectMetadataForNavigationMenuItem(
+ validItem,
+ objectMetadataItems,
+ views,
+ );
+ if (
+ isDefined(objectMetadataItem) &&
+ getObjectPermissionsForObject(
+ objectPermissionsByObjectMetadataId,
+ objectMetadataItem.id,
+ ).canReadObjectRecords
+ ) {
+ acc.push(validItem);
+ }
+ }
+ }
+ return acc;
+ }, []);
+};