148 lines
5.7 KiB
TypeScript
148 lines
5.7 KiB
TypeScript
import { NavigationDrawerItemForObjectMetadataItem } from '@/object-metadata/components/NavigationDrawerItemForObjectMetadataItem';
|
|
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
|
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
|
import { getObjectPermissionsForObject } from '@/object-metadata/utils/getObjectPermissionsForObject';
|
|
import { useObjectPermissions } from '@/object-record/hooks/useObjectPermissions';
|
|
import { NavigationDrawerAnimatedCollapseWrapper } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerAnimatedCollapseWrapper';
|
|
import { NavigationDrawerSection } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerSection';
|
|
import { NavigationDrawerSectionTitle } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerSectionTitle';
|
|
import { useNavigationSection } from '@/ui/navigation/navigation-drawer/hooks/useNavigationSection';
|
|
import { isNavigationSectionOpenFamilyState } from '@/ui/navigation/navigation-drawer/states/isNavigationSectionOpenFamilyState';
|
|
import { useAtomFamilyStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomFamilyStateValue';
|
|
import { isDefined } from 'twenty-shared/utils';
|
|
|
|
const ORDERED_FIRST_STANDARD_OBJECTS: string[] = [
|
|
CoreObjectNameSingular.Person,
|
|
CoreObjectNameSingular.Company,
|
|
CoreObjectNameSingular.Opportunity,
|
|
CoreObjectNameSingular.Task,
|
|
CoreObjectNameSingular.Note,
|
|
];
|
|
|
|
const ORDERED_LAST_STANDARD_OBJECTS: string[] = [
|
|
CoreObjectNameSingular.Dashboard,
|
|
];
|
|
|
|
type NavigationDrawerSectionForObjectMetadataItemsProps = {
|
|
sectionTitle: string;
|
|
isRemote: boolean;
|
|
objectMetadataItems: ObjectMetadataItem[];
|
|
rightIcon?: React.ReactNode;
|
|
selectedObjectMetadataItemId?: string | null;
|
|
onObjectMetadataItemClick?: (objectMetadataItem: ObjectMetadataItem) => void;
|
|
onActiveObjectMetadataItemClick?: (
|
|
objectMetadataItem: ObjectMetadataItem,
|
|
) => void;
|
|
};
|
|
|
|
export const NavigationDrawerSectionForObjectMetadataItems = ({
|
|
sectionTitle,
|
|
isRemote,
|
|
objectMetadataItems,
|
|
rightIcon,
|
|
selectedObjectMetadataItemId = null,
|
|
onObjectMetadataItemClick,
|
|
onActiveObjectMetadataItemClick,
|
|
}: NavigationDrawerSectionForObjectMetadataItemsProps) => {
|
|
const navigationSectionId = 'Objects' + (isRemote ? 'Remote' : 'Workspace');
|
|
const { toggleNavigationSection } = useNavigationSection(navigationSectionId);
|
|
const isNavigationSectionOpen = useAtomFamilyStateValue(
|
|
isNavigationSectionOpenFamilyState,
|
|
navigationSectionId,
|
|
);
|
|
|
|
const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
|
|
|
|
const sortedStandardObjectMetadataItems = [...objectMetadataItems]
|
|
.filter(
|
|
(item) =>
|
|
ORDERED_FIRST_STANDARD_OBJECTS.includes(item.nameSingular) &&
|
|
!ORDERED_LAST_STANDARD_OBJECTS.includes(item.nameSingular),
|
|
)
|
|
.sort((objectMetadataItemA, objectMetadataItemB) => {
|
|
const indexA = ORDERED_FIRST_STANDARD_OBJECTS.indexOf(
|
|
objectMetadataItemA.nameSingular,
|
|
);
|
|
const indexB = ORDERED_FIRST_STANDARD_OBJECTS.indexOf(
|
|
objectMetadataItemB.nameSingular,
|
|
);
|
|
if (indexA === -1 || indexB === -1) {
|
|
return objectMetadataItemA.nameSingular.localeCompare(
|
|
objectMetadataItemB.nameSingular,
|
|
);
|
|
}
|
|
return indexA - indexB;
|
|
});
|
|
|
|
const sortedCustomObjectMetadataItems = [...objectMetadataItems]
|
|
.filter(
|
|
(item) =>
|
|
!ORDERED_FIRST_STANDARD_OBJECTS.includes(item.nameSingular) &&
|
|
!ORDERED_LAST_STANDARD_OBJECTS.includes(item.nameSingular),
|
|
)
|
|
.sort((objectMetadataItemA, objectMetadataItemB) => {
|
|
return new Date(objectMetadataItemA.createdAt) <
|
|
new Date(objectMetadataItemB.createdAt)
|
|
? 1
|
|
: -1;
|
|
});
|
|
|
|
const sortedLastStandardObjectMetadataItems =
|
|
ORDERED_LAST_STANDARD_OBJECTS.map((nameSingular) => {
|
|
return objectMetadataItems.find(
|
|
(item) => item.nameSingular === nameSingular,
|
|
);
|
|
}).filter(isDefined);
|
|
|
|
const objectMetadataItemsForNavigationItems = [
|
|
...sortedStandardObjectMetadataItems,
|
|
...sortedCustomObjectMetadataItems,
|
|
...sortedLastStandardObjectMetadataItems,
|
|
];
|
|
|
|
const objectMetadataItemsForNavigationItemsWithReadPermission =
|
|
objectMetadataItemsForNavigationItems.filter(
|
|
(objectMetadataItem) =>
|
|
getObjectPermissionsForObject(
|
|
objectPermissionsByObjectMetadataId,
|
|
objectMetadataItem.id,
|
|
).canReadObjectRecords,
|
|
);
|
|
|
|
return (
|
|
objectMetadataItems.length > 0 && (
|
|
<NavigationDrawerSection>
|
|
<NavigationDrawerAnimatedCollapseWrapper>
|
|
<NavigationDrawerSectionTitle
|
|
label={sectionTitle}
|
|
onClick={() => toggleNavigationSection()}
|
|
rightIcon={rightIcon}
|
|
/>
|
|
</NavigationDrawerAnimatedCollapseWrapper>
|
|
{isNavigationSectionOpen &&
|
|
objectMetadataItemsForNavigationItemsWithReadPermission.map(
|
|
(objectMetadataItem) => (
|
|
<NavigationDrawerItemForObjectMetadataItem
|
|
key={`navigation-drawer-item-${objectMetadataItem.id}`}
|
|
objectMetadataItem={objectMetadataItem}
|
|
isSelectedInEditMode={
|
|
selectedObjectMetadataItemId === objectMetadataItem.id
|
|
}
|
|
onEditModeClick={
|
|
onObjectMetadataItemClick
|
|
? () => onObjectMetadataItemClick(objectMetadataItem)
|
|
: undefined
|
|
}
|
|
onActiveItemClickWhenNotInEditMode={
|
|
onActiveObjectMetadataItemClick
|
|
? () => onActiveObjectMetadataItemClick(objectMetadataItem)
|
|
: undefined
|
|
}
|
|
/>
|
|
),
|
|
)}
|
|
</NavigationDrawerSection>
|
|
)
|
|
);
|
|
};
|