diff --git a/front/src/modules/metadata/hooks/useObjectMetadata.ts b/front/src/modules/metadata/hooks/useObjectMetadata.ts new file mode 100644 index 000000000..addab6790 --- /dev/null +++ b/front/src/modules/metadata/hooks/useObjectMetadata.ts @@ -0,0 +1,16 @@ +import { useRecoilValue } from 'recoil'; + +import { activeMetadataObjectsSelector } from '../states/selectors/activeMetadataObjectsSelector'; +import { disabledMetadataObjectsSelector } from '../states/selectors/disabledMetadataObjectsSelector'; + +export const useObjectMetadata = () => { + const activeMetadataObjects = useRecoilValue(activeMetadataObjectsSelector); + const disabledMetadataObjects = useRecoilValue( + disabledMetadataObjectsSelector, + ); + + return { + activeObjects: activeMetadataObjects, + disabledObjects: disabledMetadataObjects, + }; +}; diff --git a/front/src/modules/metadata/states/selectors/activeMetadataObjectsSelector.ts b/front/src/modules/metadata/states/selectors/activeMetadataObjectsSelector.ts new file mode 100644 index 000000000..9e52e7234 --- /dev/null +++ b/front/src/modules/metadata/states/selectors/activeMetadataObjectsSelector.ts @@ -0,0 +1,10 @@ +import { selector } from 'recoil'; + +import { MetadataObject } from '../../types/MetadataObject'; +import { metadataObjectsState } from '../metadataObjectsState'; + +export const activeMetadataObjectsSelector = selector({ + key: 'activeMetadataObjectsSelector', + get: ({ get }) => + get(metadataObjectsState).filter(({ isActive }) => isActive), +}); diff --git a/front/src/modules/metadata/states/selectors/disabledMetadataObjectsSelector.ts b/front/src/modules/metadata/states/selectors/disabledMetadataObjectsSelector.ts new file mode 100644 index 000000000..0274cf269 --- /dev/null +++ b/front/src/modules/metadata/states/selectors/disabledMetadataObjectsSelector.ts @@ -0,0 +1,10 @@ +import { selector } from 'recoil'; + +import { MetadataObject } from '../../types/MetadataObject'; +import { metadataObjectsState } from '../metadataObjectsState'; + +export const disabledMetadataObjectsSelector = selector({ + key: 'disabledMetadataObjectsSelector', + get: ({ get }) => + get(metadataObjectsState).filter(({ isActive }) => !isActive), +}); diff --git a/front/src/modules/settings/data-model/object-details/components/SettingsObjectItemTableRow.tsx b/front/src/modules/settings/data-model/object-details/components/SettingsObjectItemTableRow.tsx new file mode 100644 index 000000000..41f5850c9 --- /dev/null +++ b/front/src/modules/settings/data-model/object-details/components/SettingsObjectItemTableRow.tsx @@ -0,0 +1,68 @@ +import { ReactNode } from 'react'; +import { useTheme } from '@emotion/react'; +import styled from '@emotion/styled'; + +import { useFindManyObjects } from '@/metadata/hooks/useFindManyObjects'; +import { MetadataObject } from '@/metadata/types/MetadataObject'; +import { IconComponent } from '@/ui/display/icon/types/IconComponent'; +import { Tag } from '@/ui/display/tag/components/Tag'; +import { TableCell } from '@/ui/layout/table/components/TableCell'; +import { TableRow } from '@/ui/layout/table/components/TableRow'; + +type SettingsObjectItemTableRowProps = { + action: ReactNode; + Icon?: IconComponent; + objectItem: MetadataObject; + onClick?: () => void; +}; + +export const StyledObjectTableRow = styled(TableRow)` + grid-template-columns: 180px 98.7px 98.7px 98.7px 36px; +`; + +const StyledNameTableCell = styled(TableCell)` + color: ${({ theme }) => theme.font.color.primary}; + gap: ${({ theme }) => theme.spacing(2)}; +`; + +const StyledTag = styled(Tag)` + box-sizing: border-box; + height: ${({ theme }) => theme.spacing(4)}; +`; + +const StyledActionTableCell = styled(TableCell)` + justify-content: center; + padding-right: ${({ theme }) => theme.spacing(1)}; +`; + +export const SettingsObjectItemTableRow = ({ + action, + Icon, + objectItem, + onClick, +}: SettingsObjectItemTableRowProps) => { + const theme = useTheme(); + + const { objects } = useFindManyObjects({ + objectNamePlural: objectItem.namePlural, + }); + + return ( + + + {!!Icon && } + {objectItem.labelPlural} + + + {objectItem.isCustom ? ( + + ) : ( + + )} + + {objectItem.fields.length} + {objects.length} + {action} + + ); +}; diff --git a/front/src/pages/settings/data-model/SettingsObjects.tsx b/front/src/pages/settings/data-model/SettingsObjects.tsx index 80eb1da4a..ecf6978aa 100644 --- a/front/src/pages/settings/data-model/SettingsObjects.tsx +++ b/front/src/pages/settings/data-model/SettingsObjects.tsx @@ -1,47 +1,28 @@ +import { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { useTheme } from '@emotion/react'; import styled from '@emotion/styled'; +import { useObjectMetadata } from '@/metadata/hooks/useObjectMetadata'; import { SettingsHeaderContainer } from '@/settings/components/SettingsHeaderContainer'; import { SettingsPageContainer } from '@/settings/components/SettingsPageContainer'; import { - activeObjectItems, - disabledObjectItems, -} from '@/settings/data-model/constants/mockObjects'; + SettingsObjectItemTableRow, + StyledObjectTableRow, +} from '@/settings/data-model/object-details/components/SettingsObjectItemTableRow'; import { SettingsObjectCoverImage } from '@/settings/data-model/objects/SettingsObjectCoverImage'; import { SettingsObjectDisabledMenuDropDown } from '@/settings/data-model/objects/SettingsObjectDisabledMenuDropDown'; import { IconChevronRight, IconPlus, IconSettings } from '@/ui/display/icon'; -import { Tag } from '@/ui/display/tag/components/Tag'; +import { IconComponent } from '@/ui/display/icon/types/IconComponent'; import { H1Title } from '@/ui/display/typography/components/H1Title'; import { H2Title } from '@/ui/display/typography/components/H2Title'; import { Button } from '@/ui/input/button/components/Button'; import { SubMenuTopBarContainer } from '@/ui/layout/page/SubMenuTopBarContainer'; import { Section } from '@/ui/layout/section/components/Section'; import { Table } from '@/ui/layout/table/components/Table'; -import { TableCell } from '@/ui/layout/table/components/TableCell'; import { TableHeader } from '@/ui/layout/table/components/TableHeader'; -import { TableRow } from '@/ui/layout/table/components/TableRow'; import { TableSection } from '@/ui/layout/table/components/TableSection'; -const StyledTableRow = styled(TableRow)` - grid-template-columns: 180px 98.7px 98.7px 98.7px 36px; -`; - -const StyledNameTableCell = styled(TableCell)` - color: ${({ theme }) => theme.font.color.primary}; - gap: ${({ theme }) => theme.spacing(2)}; -`; - -const StyledTag = styled(Tag)` - box-sizing: border-box; - height: ${({ theme }) => theme.spacing(4)}; -`; - -const StyledIconTableCell = styled(TableCell)` - justify-content: center; - padding-right: ${({ theme }) => theme.spacing(1)}; -`; - const StyledIconChevronRight = styled(IconChevronRight)` color: ${({ theme }) => theme.font.color.tertiary}; `; @@ -54,6 +35,16 @@ export const SettingsObjects = () => { const theme = useTheme(); const navigate = useNavigate(); + const { activeObjects, disabledObjects } = useObjectMetadata(); + + const [icons, setIcons] = useState>({}); + + useEffect(() => { + import('@/ui/input/constants/icons').then((lazyLoadedIcons) => { + setIcons(lazyLoadedIcons); + }); + }, []); + return ( @@ -74,72 +65,46 @@ export const SettingsObjects = () => {
- + Name Type Fields Instances - + - {activeObjectItems.map((objectItem) => ( - - navigate( - `/settings/objects/${objectItem.name.toLowerCase()}`, - ) - } - > - - - {objectItem.name} - - - {objectItem.type === 'standard' ? ( - - ) : ( - - )} - - {objectItem.fields} - {objectItem.instances} - + {activeObjects.map((objectItem) => ( + - - + } + onClick={() => + navigate(`/settings/objects/${objectItem.namePlural}`) + } + /> ))} - {!!disabledObjectItems.length && ( + {!!disabledObjects.length && ( - {disabledObjectItems.map((objectItem) => ( - - - - {objectItem.name} - - - {objectItem.type === 'standard' ? ( - - ) : ( - - )} - - {objectItem.fields} - - {objectItem.instances} - - + {disabledObjects.map((objectItem) => ( + {}} - handleErase={() => {}} + scopeKey={objectItem.namePlural} + handleActivate={() => undefined} + handleErase={() => undefined} /> - - + } + /> ))} )}