import { useDeleteOneObjectMetadataItem } from '@/object-metadata/hooks/useDeleteOneObjectMetadataItem'; import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilteredObjectMetadataItems'; import { useUpdateOneObjectMetadataItem } from '@/object-metadata/hooks/useUpdateOneObjectMetadataItem'; import { useCombinedGetTotalCount } from '@/object-record/multiple-objects/hooks/useCombinedGetTotalCount'; import { SettingsPageContainer } from '@/settings/components/SettingsPageContainer'; import { SettingsObjectMetadataItemTableRow, StyledObjectTableRow, } from '@/settings/data-model/object-details/components/SettingsObjectItemTableRow'; import { SettingsObjectCoverImage } from '@/settings/data-model/objects/components/SettingsObjectCoverImage'; import { SettingsObjectInactiveMenuDropDown } from '@/settings/data-model/objects/components/SettingsObjectInactiveMenuDropDown'; import { getObjectTypeLabel } from '@/settings/data-model/utils/getObjectTypeLabel'; import { SettingsPath } from '@/types/SettingsPath'; import { TextInput } from '@/ui/input/components/TextInput'; import { SubMenuTopBarContainer } from '@/ui/layout/page/components/SubMenuTopBarContainer'; import { SortableTableHeader } from '@/ui/layout/table/components/SortableTableHeader'; import { Table } from '@/ui/layout/table/components/Table'; import { TableHeader } from '@/ui/layout/table/components/TableHeader'; import { TableSection } from '@/ui/layout/table/components/TableSection'; import { useSortedArray } from '@/ui/layout/table/hooks/useSortedArray'; import { useTheme } from '@emotion/react'; import styled from '@emotion/styled'; import { Trans, useLingui } from '@lingui/react/macro'; import { isNonEmptyArray } from '@sniptt/guards'; 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 { H2Title, IconChevronRight, IconPlus, IconSearch, } from 'twenty-ui/display'; import { Section } from 'twenty-ui/layout'; import { UndecoratedLink } from 'twenty-ui/navigation'; const StyledIconChevronRight = styled(IconChevronRight)` color: ${({ theme }) => theme.font.color.tertiary}; `; const StyledSearchInput = styled(TextInput)` padding-bottom: ${({ theme }) => theme.spacing(2)}; width: 100%; `; export const SettingsObjects = () => { const { t } = useLingui(); const theme = useTheme(); const [searchTerm, setSearchTerm] = useState(''); const { deleteOneObjectMetadataItem } = useDeleteOneObjectMetadataItem(); const { updateOneObjectMetadataItem } = useUpdateOneObjectMetadataItem(); const { activeObjectMetadataItems, inactiveObjectMetadataItems } = useFilteredObjectMetadataItems(); const { totalCountByObjectMetadataItemNamePlural } = useCombinedGetTotalCount( { objectMetadataItems: [ ...activeObjectMetadataItems, ...inactiveObjectMetadataItems, ], }, ); const activeObjectSettingsArray = useMemo( () => activeObjectMetadataItems.map( (objectMetadataItem) => ({ objectMetadataItem, labelPlural: objectMetadataItem.labelPlural, objectTypeLabel: getObjectTypeLabel(objectMetadataItem).labelText, fieldsCount: objectMetadataItem.fields.filter( (field) => !field.isSystem, ).length, totalObjectCount: totalCountByObjectMetadataItemNamePlural[ objectMetadataItem.namePlural ] ?? 0, }) satisfies SettingsObjectTableItem, ), [activeObjectMetadataItems, totalCountByObjectMetadataItemNamePlural], ); const inactiveObjectSettingsArray = useMemo( () => inactiveObjectMetadataItems.map( (objectMetadataItem) => ({ objectMetadataItem, labelPlural: objectMetadataItem.labelPlural, objectTypeLabel: getObjectTypeLabel(objectMetadataItem).labelText, fieldsCount: objectMetadataItem.fields.filter( (field) => !field.isSystem, ).length, totalObjectCount: totalCountByObjectMetadataItemNamePlural[ objectMetadataItem.namePlural ] ?? 0, }) satisfies SettingsObjectTableItem, ), [inactiveObjectMetadataItems, totalCountByObjectMetadataItemNamePlural], ); const sortedActiveObjectSettingsItems = useSortedArray( activeObjectSettingsArray, GET_SETTINGS_OBJECT_TABLE_METADATA, ); const sortedInactiveObjectSettingsItems = useSortedArray( inactiveObjectSettingsArray, GET_SETTINGS_OBJECT_TABLE_METADATA, ); const filteredActiveObjectSettingsItems = useMemo( () => sortedActiveObjectSettingsItems.filter( (item) => item.labelPlural.toLowerCase().includes(searchTerm.toLowerCase()) || item.objectTypeLabel.toLowerCase().includes(searchTerm.toLowerCase()), ), [sortedActiveObjectSettingsItems, searchTerm], ); const filteredInactiveObjectSettingsItems = useMemo( () => sortedInactiveObjectSettingsItems.filter( (item) => item.labelPlural.toLowerCase().includes(searchTerm.toLowerCase()) || item.objectTypeLabel.toLowerCase().includes(searchTerm.toLowerCase()), ), [sortedInactiveObjectSettingsItems, searchTerm], ); return (