@strapi/content-manager 5.41.1 → 5.42.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/admin/components/ConfigurationForm/Fields.js +21 -13
  2. package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
  3. package/dist/admin/components/ConfigurationForm/Fields.mjs +21 -13
  4. package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
  5. package/dist/admin/hooks/useContentManagerInitData.js +35 -17
  6. package/dist/admin/hooks/useContentManagerInitData.js.map +1 -1
  7. package/dist/admin/hooks/useContentManagerInitData.mjs +36 -18
  8. package/dist/admin/hooks/useContentManagerInitData.mjs.map +1 -1
  9. package/dist/admin/hooks/useDocument.js +4 -1
  10. package/dist/admin/hooks/useDocument.js.map +1 -1
  11. package/dist/admin/hooks/useDocument.mjs +4 -1
  12. package/dist/admin/hooks/useDocument.mjs.map +1 -1
  13. package/dist/admin/hooks/useDocumentLayout.js +17 -1
  14. package/dist/admin/hooks/useDocumentLayout.js.map +1 -1
  15. package/dist/admin/hooks/useDocumentLayout.mjs +17 -1
  16. package/dist/admin/hooks/useDocumentLayout.mjs.map +1 -1
  17. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +13 -1
  18. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  19. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +13 -1
  20. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  21. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js +17 -4
  22. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -1
  23. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs +17 -4
  24. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs.map +1 -1
  25. package/dist/admin/pages/EditView/utils/data.js +1 -1
  26. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  27. package/dist/admin/pages/EditView/utils/data.mjs +1 -1
  28. package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
  29. package/dist/admin/pages/ListView/ListViewPage.js +8 -4
  30. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  31. package/dist/admin/pages/ListView/ListViewPage.mjs +8 -4
  32. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  33. package/dist/admin/src/hooks/useDocument.d.ts +5 -0
  34. package/dist/admin/src/hooks/useDocumentLayout.d.ts +19 -0
  35. package/dist/admin/translations/pl.json.js +184 -34
  36. package/dist/admin/translations/pl.json.js.map +1 -1
  37. package/dist/admin/translations/pl.json.mjs +184 -34
  38. package/dist/admin/translations/pl.json.mjs.map +1 -1
  39. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"Fields.mjs","sources":["../../../../admin/src/components/ConfigurationForm/Fields.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useDroppable, DndContext, UniqueIdentifier, DragOverlay } from '@dnd-kit/core';\nimport { arraySwap, SortableContext, useSortable, rectSwappingStrategy } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { useField, useForm, useIsDesktop } from '@strapi/admin/strapi-admin';\nimport {\n Modal,\n Box,\n Flex,\n Grid,\n IconButton,\n IconButtonComponent,\n Typography,\n Link,\n Menu,\n} from '@strapi/design-system';\nimport { Cog, Cross, Drag, Pencil, Plus } from '@strapi/icons';\nimport { generateNKeysBetween as generateNKeysBetweenImpl } from 'fractional-indexing';\nimport { produce } from 'immer';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { getTranslation } from '../../utils/translations';\nimport { ComponentIcon } from '../ComponentIcon';\n\nimport { EditFieldForm, EditFieldFormProps } from './EditFieldForm';\n\nimport type { ConfigurationFormData, EditFieldSpacerLayout } from './Form';\nimport type { EditLayout } from '../../hooks/useDocumentLayout';\n\ntype FormField = ConfigurationFormData['layout'][number]['children'][number];\ntype Field = Omit<ConfigurationFormData['layout'][number]['children'][number], '__temp_key__'>;\n\nconst GRID_COLUMNS = 12;\n\n/* -------------------------------------------------------------------------------------------------\n * Drag and Drop\n * -----------------------------------------------------------------------------------------------*/\n\nconst DroppableContainer = ({\n id,\n children,\n}: {\n id: string;\n children: (props: ReturnType<typeof useDroppable>) => React.ReactNode;\n}) => {\n const droppable = useDroppable({\n id,\n });\n\n return children(droppable);\n};\n\nexport const SortableItem = ({ id, children }: { id: string; children: React.ReactNode }) => {\n const { attributes, setNodeRef, transform, transition, isDragging } = useSortable({\n id,\n });\n\n const style = {\n transform: CSS.Transform.toString({\n x: transform?.x ?? 0,\n y: transform?.y ?? 0,\n // Avoid any scaling animations which can visually \"squish\" or\n // \"stretch\" neighbouring cards in mixed-width grids (4/8/12 cols).\n scaleX: 1,\n scaleY: 1,\n }),\n transition,\n height: '100%',\n opacity: isDragging ? 0.6 : 1,\n outlineOffset: 2,\n };\n\n return (\n <div ref={setNodeRef} style={style} {...attributes}>\n {children}\n </div>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Fields\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FieldsProps extends Pick<EditLayout, 'metadatas'>, Pick<FieldProps, 'components'> {\n attributes: {\n [key: string]: FieldProps['attribute'];\n };\n fieldSizes: Record<string, number>;\n components: EditLayout['components'];\n}\n\n/**\n * Compute uids and formName for drag and drop items for the incoming layout\n */\nconst createDragAndDropContainersFromLayout = (layout: ConfigurationFormData['layout']) => {\n return layout.map((row, containerIndex) => ({\n ...row,\n // Use unique ids for drag and drop items\n dndId: `container-${containerIndex}`,\n children: row.children.map((child, childIndex) => ({\n ...child,\n dndId: `container-${containerIndex}-child-${childIndex}`,\n\n // The formName must be recomputed each time an item is moved\n formName: `layout.${containerIndex}.children.${childIndex}`,\n })),\n }));\n};\n\nconst Fields = ({ attributes, fieldSizes, components, metadatas = {} }: FieldsProps) => {\n const { formatMessage } = useIntl();\n\n const layout = useForm<ConfigurationFormData['layout']>(\n 'Fields',\n (state) => state.values.layout ?? []\n );\n\n const onChange = useForm('Fields', (state) => state.onChange);\n const addFieldRow = useForm('Fields', (state) => state.addFieldRow);\n const removeFieldRow = useForm('Fields', (state) => state.removeFieldRow);\n\n const existingFields = layout.map((row) => row.children.map((field) => field.name)).flat();\n\n /**\n * Get the fields that are not already in the layout\n * But also check that they are visible before we give users\n * the option to display them. e.g. `id` is not visible.\n */\n const remainingFields = Object.entries(metadatas).reduce<Field[]>((acc, current) => {\n const [name, { visible, ...field }] = current;\n\n if (!existingFields.includes(name) && visible === true) {\n const type = attributes[name]?.type;\n const size = type ? fieldSizes[type] : GRID_COLUMNS;\n\n acc.push({\n ...field,\n label: field.label ?? name,\n name,\n size,\n });\n }\n\n return acc;\n }, []);\n\n const handleRemoveField =\n (rowIndex: number, fieldIndex: number): FieldProps['onRemoveField'] =>\n () => {\n if (layout[rowIndex].children.length === 1) {\n removeFieldRow(`layout`, rowIndex);\n } else {\n onChange(`layout.${rowIndex}.children`, [\n ...layout[rowIndex].children.slice(0, fieldIndex),\n ...layout[rowIndex].children.slice(fieldIndex + 1),\n ]);\n }\n };\n\n const handleAddField = (field: Field) => () => {\n addFieldRow('layout', { children: [field] });\n };\n\n const [containers, setContainers] = React.useState(() =>\n createDragAndDropContainersFromLayout(layout)\n );\n type Container = (typeof containers)[number];\n const [activeDragItem, setActiveDragItem] = React.useState<Container['children'][number] | null>(\n null\n );\n\n /**\n * Finds either the parent container id or the child id within a container\n */\n function findContainer(id: UniqueIdentifier, containersAsDictionary: Record<string, Container>) {\n // If the id is a key, then it is the parent container\n if (id in containersAsDictionary) {\n return id;\n }\n\n // Otherwise, it is a child inside a container\n return Object.keys(containersAsDictionary).find((key) =>\n containersAsDictionary[key].children.find((child) => child.dndId === id)\n );\n }\n\n /**\n * Gets an item from a container based on its id\n */\n const getItemFromContainer = (id: UniqueIdentifier, container: Container) => {\n return container.children.find((item) => id === item.dndId);\n };\n\n /**\n * Gets the containers as dictionary for quick lookup\n */\n const getContainersAsDictionary = () => {\n return Object.fromEntries(containers.map((container) => [container.dndId, container]));\n };\n\n /**\n * Recomputes the empty space in the grid\n */\n const createContainersWithSpacers = (layout: typeof containers) => {\n return layout\n .map((row) => ({\n ...row,\n children: row.children.filter((field) => field.name !== TEMP_FIELD_NAME),\n }))\n .filter((row) => row.children.length > 0)\n .map((row) => {\n const totalSpaceTaken = row.children.reduce((acc, curr) => acc + curr.size, 0);\n\n if (totalSpaceTaken < GRID_COLUMNS) {\n const [spacerKey] = generateNKeysBetweenImpl(\n row.children.at(-1)?.__temp_key__,\n undefined,\n 1\n );\n\n return {\n ...row,\n children: [\n ...row.children,\n {\n name: TEMP_FIELD_NAME,\n size: GRID_COLUMNS - totalSpaceTaken,\n __temp_key__: spacerKey,\n } satisfies EditFieldSpacerLayout,\n ],\n };\n }\n\n return row;\n });\n };\n\n /**\n * When layout changes (e.g. when a field size is changed or the containers are reordered)\n * we need to update the ids and form names\n */\n React.useEffect(() => {\n const containers = createDragAndDropContainersFromLayout(layout);\n setContainers(containers);\n }, [layout, setContainers]);\n\n return (\n <DndContext\n onDragStart={(event) => {\n const containersAsDictionary = getContainersAsDictionary();\n\n const activeContainer = findContainer(event.active.id, containersAsDictionary);\n\n if (!activeContainer) return;\n\n const activeItem = getItemFromContainer(\n event.active.id,\n containersAsDictionary[activeContainer]\n );\n\n if (activeItem) {\n setActiveDragItem(activeItem);\n }\n }}\n onDragOver={({ active, over }) => {\n const containersAsDictionary = getContainersAsDictionary();\n const activeContainer = findContainer(active.id, containersAsDictionary);\n const overContainer = findContainer(over?.id ?? '', containersAsDictionary);\n const activeContainerIndex = containers.findIndex(\n (container) => container.dndId === activeContainer\n );\n const overContainerIndex = containers.findIndex(\n (container) => container.dndId === overContainer\n );\n\n if (!activeContainer || !overContainer) {\n return;\n }\n\n const draggedItem = getItemFromContainer(\n active.id,\n containersAsDictionary[activeContainer]\n );\n const overItem = getItemFromContainer(\n over?.id ?? '',\n containersAsDictionary[overContainer]\n );\n const overIndex = containersAsDictionary[overContainer].children.findIndex(\n (item) => item.dndId === over?.id\n );\n const activeIndex = containersAsDictionary[activeContainer].children.findIndex(\n (item) => item.dndId === active.id\n );\n\n if (!draggedItem) return;\n\n // Handle a full width field being dragged\n if (draggedItem?.size === GRID_COLUMNS) {\n // Swap the items in the containers\n const update = produce(containers, (draft) => {\n draft[activeContainerIndex].children = containers[overContainerIndex].children;\n draft[overContainerIndex].children = containers[activeContainerIndex].children;\n });\n setContainers(update);\n return;\n }\n\n /**\n * Handle an item being dragged from one container to another,\n * the item is removed from its current container, and then added to its new container\n * An item can only be added in a container if there is enough space\n */\n const update = produce(containers, (draft) => {\n draft[activeContainerIndex].children = draft[activeContainerIndex].children.filter(\n (item) => item.dndId !== active.id\n );\n\n const targetChildren = draft[overContainerIndex].children;\n const spaceTaken = targetChildren.reduce((acc, curr) => {\n if (curr.name === TEMP_FIELD_NAME) {\n return acc;\n }\n\n return acc + curr.size;\n }, 0);\n const isNotEnoughSpace = spaceTaken + draggedItem.size > GRID_COLUMNS;\n const canSwapSameSizeItem =\n overItem &&\n overItem.name !== TEMP_FIELD_NAME &&\n overItem.size === draggedItem.size &&\n activeIndex !== -1 &&\n overIndex !== -1;\n const canCreateNewRowForItem =\n activeContainerIndex !== overContainerIndex && GRID_COLUMNS - spaceTaken === 0;\n const isHoveringOverSpacer = overItem?.name === TEMP_FIELD_NAME;\n\n /**\n * Not enough space in the hovered row\n *\n * We still want:\n * - ability to swap items of the same size\n * - ability to create a single extra row to host the dragged item\n * when surrounding rows are full\n */\n if (isNotEnoughSpace) {\n // Try a simple swap when target item is of the same size\n if (canSwapSameSizeItem) {\n const sourceChildren = draft[activeContainerIndex].children;\n\n // Put the hovered item back where the dragged item came from\n sourceChildren.splice(activeIndex, 0, overItem);\n\n // Swap the hovered item with the dragged one in the target row\n const draftOverIndex = targetChildren.findIndex(\n (item) => item.dndId === overItem.dndId\n );\n\n if (draftOverIndex !== -1) {\n targetChildren.splice(draftOverIndex, 1, draggedItem);\n }\n\n return;\n }\n\n // If there is absolutely no space left in the target row and the\n // dragged item comes from a different row, add it to a new row\n if (canCreateNewRowForItem) {\n const insertIndex = overContainerIndex + 1;\n const existingRow = draft[insertIndex];\n\n if (existingRow) {\n const nonTempChildren = existingRow.children.filter(\n (child) => child.name !== TEMP_FIELD_NAME\n );\n const isNextRowEmpty = nonTempChildren.length === 0;\n\n // If the row directly after is empty (only spacers), reuse it\n // instead of creating yet another row.\n if (isNextRowEmpty) {\n existingRow.children = [draggedItem];\n return;\n }\n }\n\n const newContainerPrototype = draft[overContainerIndex];\n const newContainerId = `container-${draft.length}`;\n\n draft.splice(insertIndex, 0, {\n ...newContainerPrototype,\n dndId: newContainerId,\n children: [draggedItem],\n });\n\n return;\n }\n }\n\n // There is enough room in the target row\n if (isHoveringOverSpacer) {\n // We are over an invisible spacer, replace it with the dragged item\n targetChildren.splice(overIndex, 1, draggedItem);\n return;\n }\n\n // There is room for the item in the container, drop it\n targetChildren.splice(overIndex, 0, draggedItem);\n });\n\n setContainers(update);\n }}\n onDragEnd={(event) => {\n const { active, over } = event;\n const { id } = active;\n const overId = over?.id;\n const containersAsDictionary = getContainersAsDictionary();\n const activeContainer = findContainer(id, containersAsDictionary);\n const overContainer = findContainer(overId!, containersAsDictionary);\n\n if (!activeContainer || !overContainer) {\n return;\n }\n\n const activeIndex = containersAsDictionary[activeContainer].children.findIndex(\n (children) => children.dndId === id\n );\n const overIndex = containersAsDictionary[overContainer].children.findIndex(\n (children) => children.dndId === overId\n );\n\n const movedContainerItems = produce(containersAsDictionary, (draft) => {\n if (activeIndex !== overIndex && activeContainer === overContainer) {\n // Move items around inside their own container\n draft[activeContainer].children = arraySwap(\n draft[activeContainer].children,\n activeIndex,\n overIndex\n );\n }\n });\n\n // Remove properties the server does not expect before updating the form\n const updatedContainers = Object.values(movedContainerItems);\n const updatedContainersWithSpacers = createContainersWithSpacers(\n updatedContainers\n ) as typeof containers;\n const updatedLayout = updatedContainersWithSpacers.map(\n ({ dndId: _dndId, children, ...container }) => ({\n ...container,\n children: children.map(({ dndId: _dndId, formName: _formName, ...child }) => child),\n })\n );\n\n // Update the layout\n onChange('layout', updatedLayout);\n setActiveDragItem(null);\n }}\n >\n <Flex paddingTop={6} direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Flex alignItems=\"flex-start\" direction=\"column\" justifyContent=\"space-between\">\n <Typography fontWeight=\"bold\">\n {formatMessage({\n id: getTranslation('containers.list.displayedFields'),\n defaultMessage: 'Displayed fields',\n })}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: 'containers.SettingPage.editSettings.description',\n defaultMessage: 'Drag & drop the fields to build the layout',\n })}\n </Typography>\n </Flex>\n <Box padding={4} hasRadius borderStyle=\"dashed\" borderWidth=\"1px\" borderColor=\"neutral300\">\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n {containers.map((container, containerIndex) => (\n <SortableContext\n key={container.dndId}\n id={container.dndId}\n items={container.children.map((child) => ({ id: child.dndId }))}\n strategy={rectSwappingStrategy}\n >\n <DroppableContainer id={container.dndId}>\n {({ setNodeRef }) => (\n <Grid.Root key={container.dndId} ref={setNodeRef} gap={2}>\n {container.children.map((child, childIndex) => (\n <Grid.Item\n col={child.size}\n xs={12}\n key={child.dndId}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <SortableItem id={child.dndId}>\n <Field\n attribute={attributes[child.name]}\n components={components}\n name={child.formName}\n onRemoveField={handleRemoveField(containerIndex, childIndex)}\n dndId={child.dndId}\n />\n </SortableItem>\n </Grid.Item>\n ))}\n </Grid.Root>\n )}\n </DroppableContainer>\n </SortableContext>\n ))}\n <DragOverlay>\n {activeDragItem ? (\n <Field\n attribute={attributes[activeDragItem.name]}\n components={components}\n name={activeDragItem.formName}\n dndId={activeDragItem.dndId}\n />\n ) : null}\n </DragOverlay>\n <Menu.Root>\n <Menu.Trigger\n startIcon={<Plus />}\n endIcon={null}\n disabled={remainingFields.length === 0}\n fullWidth\n variant=\"secondary\"\n >\n {formatMessage({\n id: getTranslation('containers.SettingPage.add.field'),\n defaultMessage: 'Insert another field',\n })}\n </Menu.Trigger>\n <Menu.Content>\n {remainingFields.map((field) => (\n <Menu.Item key={field.name} onSelect={handleAddField(field)}>\n {field.label}\n </Menu.Item>\n ))}\n </Menu.Content>\n </Menu.Root>\n </Flex>\n </Box>\n </Flex>\n </DndContext>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Field\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FieldProps extends Pick<EditFieldFormProps, 'name' | 'attribute'> {\n components: EditLayout['components'];\n dndId: string;\n onRemoveField?: React.MouseEventHandler<HTMLButtonElement>;\n}\n\nconst TEMP_FIELD_NAME = '_TEMP_';\n\n/**\n * Displays a field in the layout with drag options, also\n * opens a modal to edit the details of said field.\n */\nconst Field = ({ attribute, components, name, onRemoveField, dndId }: FieldProps) => {\n const isDesktop = useIsDesktop();\n const [isModalOpen, setIsModalOpen] = React.useState(false);\n const { formatMessage } = useIntl();\n const { value } = useField<FormField>(name);\n const { listeners, setActivatorNodeRef } = useSortable({\n id: dndId,\n });\n\n const handleRemoveField: React.MouseEventHandler<HTMLButtonElement> = (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (onRemoveField) {\n onRemoveField?.(e);\n }\n };\n\n const onEditFieldMeta: React.MouseEventHandler<HTMLButtonElement> = (e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsModalOpen(true);\n };\n\n if (!value) {\n return null;\n }\n\n if (value.name === TEMP_FIELD_NAME) {\n return <Flex tag=\"span\" height=\"100%\" style={{ opacity: 0 }} />;\n }\n\n if (!attribute) {\n return null;\n }\n\n return (\n <Modal.Root open={isModalOpen} onOpenChange={setIsModalOpen}>\n <Flex\n borderColor=\"neutral150\"\n background=\"neutral100\"\n hasRadius\n gap={3}\n cursor=\"pointer\"\n onClick={() => {\n setIsModalOpen(true);\n }}\n position=\"relative\"\n >\n {isDesktop && (\n <DragButton\n ref={setActivatorNodeRef}\n tag=\"span\"\n withTooltip={false}\n label={formatMessage(\n {\n id: getTranslation('components.DraggableCard.move.field'),\n defaultMessage: 'Move {item}',\n },\n { item: value.label }\n )}\n {...listeners}\n >\n <Drag />\n </DragButton>\n )}\n <Flex direction=\"column\" alignItems=\"flex-start\" grow={1} overflow=\"hidden\">\n <Flex gap={3} justifyContent=\"space-between\" width=\"100%\">\n <Typography ellipsis fontWeight=\"bold\">\n {value.label}\n </Typography>\n <Flex position=\"relative\">\n <IconButton\n type=\"button\"\n variant=\"ghost\"\n background=\"transparent\"\n onClick={onEditFieldMeta}\n withTooltip={false}\n label={formatMessage(\n {\n id: getTranslation('components.DraggableCard.edit.field'),\n defaultMessage: 'Edit {item}',\n },\n { item: value.label }\n )}\n >\n <Pencil />\n </IconButton>\n <IconButton\n type=\"button\"\n variant=\"ghost\"\n onClick={handleRemoveField}\n background=\"transparent\"\n withTooltip={false}\n label={formatMessage(\n {\n id: getTranslation('components.DraggableCard.delete.field'),\n defaultMessage: 'Delete {item}',\n },\n { item: value.label }\n )}\n >\n <Cross />\n </IconButton>\n </Flex>\n </Flex>\n {attribute?.type === 'component' ? (\n <Flex\n paddingTop={3}\n paddingRight={3}\n paddingBottom={3}\n paddingLeft={0}\n alignItems=\"flex-start\"\n direction=\"column\"\n gap={2}\n width=\"100%\"\n >\n <Grid.Root gap={4} width=\"100%\">\n {components[attribute.component].layout.map((row) =>\n row.map(({ size, ...field }) => (\n <Grid.Item\n key={field.name}\n col={size}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <Flex\n alignItems=\"center\"\n background=\"neutral0\"\n paddingTop={2}\n paddingBottom={2}\n paddingLeft={3}\n paddingRight={3}\n hasRadius\n borderColor=\"neutral200\"\n >\n <Typography textColor=\"neutral800\">{field.name}</Typography>\n </Flex>\n </Grid.Item>\n ))\n )}\n </Grid.Root>\n <Link\n // used to stop the edit form from appearing when we click here.\n onClick={(e) => e.stopPropagation()}\n startIcon={<Cog />}\n tag={NavLink}\n to={`../components/${attribute.component}/configurations/edit`}\n >\n {formatMessage({\n id: getTranslation('components.FieldItem.linkToComponentLayout'),\n defaultMessage: \"Set the component's layout\",\n })}\n </Link>\n </Flex>\n ) : null}\n {attribute?.type === 'dynamiczone' ? (\n <Flex\n paddingTop={3}\n paddingRight={3}\n paddingBottom={3}\n paddingLeft={0}\n alignItems=\"flex-start\"\n gap={2}\n width=\"100%\"\n wrap=\"wrap\"\n >\n {attribute?.components.map((uid) => (\n <ComponentLink\n // used to stop the edit form from appearing when we click here.\n onClick={(e) => e.stopPropagation()}\n key={uid}\n to={`../components/${uid}/configurations/edit`}\n >\n <ComponentIcon icon={components[uid].settings.icon} />\n <Typography fontSize={1} textColor=\"neutral600\" fontWeight=\"bold\">\n {components[uid].settings.displayName}\n </Typography>\n </ComponentLink>\n ))}\n </Flex>\n ) : null}\n </Flex>\n </Flex>\n {value.name !== TEMP_FIELD_NAME && (\n <EditFieldForm attribute={attribute} name={name} onClose={() => setIsModalOpen(false)} />\n )}\n </Modal.Root>\n );\n};\n\nconst DragButton = styled<IconButtonComponent<'span'>>(IconButton)`\n height: unset;\n align-self: stretch;\n display: flex;\n align-items: center;\n padding: 0;\n border: none;\n background-color: transparent;\n border-radius: 0px;\n border-right: 1px solid ${({ theme }) => theme.colors.neutral150};\n cursor: all-scroll;\n\n svg {\n width: 1.2rem;\n height: 1.2rem;\n }\n`;\n\nconst ComponentLink = styled(NavLink)`\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: ${({ theme }) => theme.spaces[1]};\n padding: ${(props) => props.theme.spaces[2]};\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n background: ${({ theme }) => theme.colors.neutral0};\n width: 14rem;\n border-radius: ${({ theme }) => theme.borderRadius};\n text-decoration: none;\n\n &:focus,\n &:hover {\n ${({ theme }) => `\n background-color: ${theme.colors.primary100};\n border-color: ${theme.colors.primary200};\n\n ${Typography} {\n color: ${theme.colors.primary600};\n }\n `}\n\n /* > ComponentIcon */\n > div:first-child {\n background: ${({ theme }) => theme.colors.primary200};\n color: ${({ theme }) => theme.colors.primary600};\n\n svg {\n path {\n fill: ${({ theme }) => theme.colors.primary600};\n }\n }\n }\n }\n`;\n\nexport { Fields, TEMP_FIELD_NAME };\nexport type { FieldsProps };\n"],"names":["GRID_COLUMNS","DroppableContainer","id","children","droppable","useDroppable","SortableItem","attributes","setNodeRef","transform","transition","isDragging","useSortable","style","CSS","Transform","toString","x","y","scaleX","scaleY","height","opacity","outlineOffset","_jsx","div","ref","createDragAndDropContainersFromLayout","layout","map","row","containerIndex","dndId","child","childIndex","formName","Fields","fieldSizes","components","metadatas","formatMessage","useIntl","useForm","state","values","onChange","addFieldRow","removeFieldRow","existingFields","field","name","flat","remainingFields","Object","entries","reduce","acc","current","visible","includes","type","size","push","label","handleRemoveField","rowIndex","fieldIndex","length","slice","handleAddField","containers","setContainers","React","useState","activeDragItem","setActiveDragItem","findContainer","containersAsDictionary","keys","find","key","getItemFromContainer","container","item","getContainersAsDictionary","fromEntries","createContainersWithSpacers","filter","TEMP_FIELD_NAME","totalSpaceTaken","curr","spacerKey","generateNKeysBetweenImpl","at","__temp_key__","undefined","useEffect","DndContext","onDragStart","event","activeContainer","active","activeItem","onDragOver","over","overContainer","activeContainerIndex","findIndex","overContainerIndex","draggedItem","overItem","overIndex","activeIndex","update","produce","draft","targetChildren","spaceTaken","isNotEnoughSpace","canSwapSameSizeItem","canCreateNewRowForItem","isHoveringOverSpacer","sourceChildren","splice","draftOverIndex","insertIndex","existingRow","nonTempChildren","isNextRowEmpty","newContainerPrototype","newContainerId","onDragEnd","overId","movedContainerItems","arraySwap","updatedContainers","updatedContainersWithSpacers","updatedLayout","_dndId","_formName","_jsxs","Flex","paddingTop","direction","alignItems","gap","justifyContent","Typography","fontWeight","getTranslation","defaultMessage","variant","textColor","Box","padding","hasRadius","borderStyle","borderWidth","borderColor","SortableContext","items","strategy","rectSwappingStrategy","Grid","Root","Item","col","xs","Field","attribute","onRemoveField","DragOverlay","Menu","Trigger","startIcon","Plus","endIcon","disabled","fullWidth","Content","onSelect","isDesktop","useIsDesktop","isModalOpen","setIsModalOpen","value","useField","listeners","setActivatorNodeRef","e","preventDefault","stopPropagation","onEditFieldMeta","tag","Modal","open","onOpenChange","background","cursor","onClick","position","DragButton","withTooltip","Drag","grow","overflow","width","ellipsis","IconButton","Pencil","Cross","paddingRight","paddingBottom","paddingLeft","component","Link","Cog","NavLink","to","wrap","uid","ComponentLink","ComponentIcon","icon","settings","fontSize","displayName","EditFieldForm","onClose","styled","theme","colors","neutral150","spaces","props","neutral200","neutral0","borderRadius","primary100","primary200","primary600"],"mappings":"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"}
1
+ {"version":3,"file":"Fields.mjs","sources":["../../../../admin/src/components/ConfigurationForm/Fields.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useDroppable, DndContext, UniqueIdentifier, DragOverlay } from '@dnd-kit/core';\nimport { arraySwap, SortableContext, useSortable, rectSwappingStrategy } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { useField, useForm, useIsDesktop } from '@strapi/admin/strapi-admin';\nimport {\n Modal,\n Box,\n Flex,\n Grid,\n IconButton,\n IconButtonComponent,\n Typography,\n Link,\n Menu,\n} from '@strapi/design-system';\nimport { Cog, Cross, Drag, Pencil, Plus } from '@strapi/icons';\nimport { generateNKeysBetween as generateNKeysBetweenImpl } from 'fractional-indexing';\nimport { produce } from 'immer';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { getTranslation } from '../../utils/translations';\nimport { ComponentIcon } from '../ComponentIcon';\n\nimport { EditFieldForm, EditFieldFormProps } from './EditFieldForm';\n\nimport type { ConfigurationFormData, EditFieldSpacerLayout } from './Form';\nimport type { EditLayout } from '../../hooks/useDocumentLayout';\n\ntype FormField = ConfigurationFormData['layout'][number]['children'][number];\ntype Field = Omit<ConfigurationFormData['layout'][number]['children'][number], '__temp_key__'>;\n\nconst GRID_COLUMNS = 12;\n\n/* -------------------------------------------------------------------------------------------------\n * Drag and Drop\n * -----------------------------------------------------------------------------------------------*/\n\nconst DroppableContainer = ({\n id,\n children,\n}: {\n id: string;\n children: (props: ReturnType<typeof useDroppable>) => React.ReactNode;\n}) => {\n const droppable = useDroppable({\n id,\n });\n\n return children(droppable);\n};\n\nexport const SortableItem = ({ id, children }: { id: string; children: React.ReactNode }) => {\n const { attributes, setNodeRef, transform, transition, isDragging } = useSortable({\n id,\n });\n\n const style = {\n transform: CSS.Transform.toString({\n x: transform?.x ?? 0,\n y: transform?.y ?? 0,\n // Avoid any scaling animations which can visually \"squish\" or\n // \"stretch\" neighbouring cards in mixed-width grids (4/8/12 cols).\n scaleX: 1,\n scaleY: 1,\n }),\n transition,\n height: '100%',\n opacity: isDragging ? 0.6 : 1,\n outlineOffset: 2,\n };\n\n return (\n <div ref={setNodeRef} style={style} {...attributes}>\n {children}\n </div>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Fields\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FieldsProps extends Pick<EditLayout, 'metadatas'>, Pick<FieldProps, 'components'> {\n attributes: {\n [key: string]: FieldProps['attribute'];\n };\n fieldSizes: Record<string, number>;\n components: EditLayout['components'];\n}\n\n/**\n * Compute uids and formName for drag and drop items for the incoming layout\n */\nconst createDragAndDropContainersFromLayout = (layout: ConfigurationFormData['layout']) => {\n return layout.map((row, containerIndex) => ({\n ...row,\n // Use unique ids for drag and drop items\n dndId: `container-${containerIndex}`,\n children: row.children.map((child, childIndex) => ({\n ...child,\n dndId: `container-${containerIndex}-child-${childIndex}`,\n\n // The formName must be recomputed each time an item is moved\n formName: `layout.${containerIndex}.children.${childIndex}`,\n })),\n }));\n};\n\nconst Fields = ({ attributes, fieldSizes, components, metadatas = {} }: FieldsProps) => {\n const { formatMessage } = useIntl();\n\n const layout = useForm<ConfigurationFormData['layout']>(\n 'Fields',\n (state) => state.values.layout ?? []\n );\n\n const onChange = useForm('Fields', (state) => state.onChange);\n const addFieldRow = useForm('Fields', (state) => state.addFieldRow);\n const removeFieldRow = useForm('Fields', (state) => state.removeFieldRow);\n\n const existingFields = layout.map((row) => row.children.map((field) => field.name)).flat();\n\n /**\n * Get the fields that are not already in the layout\n * But also check that they are visible before we give users\n * the option to display them. e.g. `id` is not visible.\n */\n const remainingFields = Object.entries(metadatas).reduce<Field[]>((acc, current) => {\n const [name, { visible, ...field }] = current;\n\n if (!existingFields.includes(name) && visible === true) {\n const type = attributes[name]?.type;\n const size = type ? fieldSizes[type] : GRID_COLUMNS;\n\n acc.push({\n ...field,\n label: field.label ?? name,\n name,\n size,\n });\n }\n\n return acc;\n }, []);\n\n const handleRemoveField =\n (rowIndex: number, fieldIndex: number): FieldProps['onRemoveField'] =>\n () => {\n if (layout[rowIndex].children.length === 1) {\n removeFieldRow(`layout`, rowIndex);\n } else {\n onChange(`layout.${rowIndex}.children`, [\n ...layout[rowIndex].children.slice(0, fieldIndex),\n ...layout[rowIndex].children.slice(fieldIndex + 1),\n ]);\n }\n };\n\n const handleAddField = (field: Field) => () => {\n addFieldRow('layout', { children: [field] });\n };\n\n const [containers, setContainers] = React.useState(() =>\n createDragAndDropContainersFromLayout(layout)\n );\n type Container = (typeof containers)[number];\n const [activeDragItem, setActiveDragItem] = React.useState<Container['children'][number] | null>(\n null\n );\n\n /**\n * Finds either the parent container id or the child id within a container\n */\n function findContainer(id: UniqueIdentifier, containersAsDictionary: Record<string, Container>) {\n // If the id is a key, then it is the parent container\n if (id in containersAsDictionary) {\n return id;\n }\n\n // Otherwise, it is a child inside a container\n return Object.keys(containersAsDictionary).find((key) =>\n containersAsDictionary[key].children.find((child) => child.dndId === id)\n );\n }\n\n /**\n * Gets an item from a container based on its id\n */\n const getItemFromContainer = (id: UniqueIdentifier, container: Container) => {\n return container.children.find((item) => id === item.dndId);\n };\n\n /**\n * Gets the containers as dictionary for quick lookup\n */\n const getContainersAsDictionary = () => {\n return Object.fromEntries(containers.map((container) => [container.dndId, container]));\n };\n\n /**\n * Recomputes the empty space in the grid\n */\n const createContainersWithSpacers = (layout: typeof containers) => {\n return layout\n .map((row) => ({\n ...row,\n children: row.children.filter((field) => field.name !== TEMP_FIELD_NAME),\n }))\n .filter((row) => row.children.length > 0)\n .map((row) => {\n const totalSpaceTaken = row.children.reduce((acc, curr) => acc + curr.size, 0);\n\n if (totalSpaceTaken < GRID_COLUMNS) {\n const [spacerKey] = generateNKeysBetweenImpl(\n row.children.at(-1)?.__temp_key__,\n undefined,\n 1\n );\n\n return {\n ...row,\n children: [\n ...row.children,\n {\n name: TEMP_FIELD_NAME,\n size: GRID_COLUMNS - totalSpaceTaken,\n __temp_key__: spacerKey,\n } satisfies EditFieldSpacerLayout,\n ],\n };\n }\n\n return row;\n });\n };\n\n /**\n * When layout changes (e.g. when a field size is changed or the containers are reordered)\n * we need to update the ids and form names\n */\n React.useEffect(() => {\n const containers = createDragAndDropContainersFromLayout(layout);\n setContainers(containers);\n }, [layout, setContainers]);\n\n return (\n <DndContext\n onDragStart={(event) => {\n const containersAsDictionary = getContainersAsDictionary();\n\n const activeContainer = findContainer(event.active.id, containersAsDictionary);\n\n if (!activeContainer) return;\n\n const activeItem = getItemFromContainer(\n event.active.id,\n containersAsDictionary[activeContainer]\n );\n\n if (activeItem) {\n setActiveDragItem(activeItem);\n }\n }}\n onDragOver={({ active, over }) => {\n const containersAsDictionary = getContainersAsDictionary();\n const activeContainer = findContainer(active.id, containersAsDictionary);\n const overContainer = findContainer(over?.id ?? '', containersAsDictionary);\n const activeContainerIndex = containers.findIndex(\n (container) => container.dndId === activeContainer\n );\n const overContainerIndex = containers.findIndex(\n (container) => container.dndId === overContainer\n );\n\n if (!activeContainer || !overContainer) {\n return;\n }\n\n const draggedItem = getItemFromContainer(\n active.id,\n containersAsDictionary[activeContainer]\n );\n const overItem = getItemFromContainer(\n over?.id ?? '',\n containersAsDictionary[overContainer]\n );\n const overIndex = containersAsDictionary[overContainer].children.findIndex(\n (item) => item.dndId === over?.id\n );\n const activeIndex = containersAsDictionary[activeContainer].children.findIndex(\n (item) => item.dndId === active.id\n );\n\n if (!draggedItem) return;\n\n // Handle a full width field being dragged\n if (draggedItem?.size === GRID_COLUMNS) {\n // Swap the items in the containers\n const update = produce(containers, (draft) => {\n draft[activeContainerIndex].children = containers[overContainerIndex].children;\n draft[overContainerIndex].children = containers[activeContainerIndex].children;\n });\n setContainers(update);\n return;\n }\n\n /**\n * Handle an item being dragged from one container to another,\n * the item is removed from its current container, and then added to its new container\n * An item can only be added in a container if there is enough space\n */\n const update = produce(containers, (draft) => {\n draft[activeContainerIndex].children = draft[activeContainerIndex].children.filter(\n (item) => item.dndId !== active.id\n );\n\n const targetChildren = draft[overContainerIndex].children;\n const spaceTaken = targetChildren.reduce((acc, curr) => {\n if (curr.name === TEMP_FIELD_NAME) {\n return acc;\n }\n\n return acc + curr.size;\n }, 0);\n const isNotEnoughSpace = spaceTaken + draggedItem.size > GRID_COLUMNS;\n const canSwapSameSizeItem =\n overItem &&\n overItem.name !== TEMP_FIELD_NAME &&\n overItem.size === draggedItem.size &&\n activeIndex !== -1 &&\n overIndex !== -1;\n const canCreateNewRowForItem =\n activeContainerIndex !== overContainerIndex && GRID_COLUMNS - spaceTaken === 0;\n const isHoveringOverSpacer = overItem?.name === TEMP_FIELD_NAME;\n\n /**\n * Not enough space in the hovered row\n *\n * We still want:\n * - ability to swap items of the same size\n * - ability to create a single extra row to host the dragged item\n * when surrounding rows are full\n */\n if (isNotEnoughSpace) {\n // Try a simple swap when target item is of the same size\n if (canSwapSameSizeItem) {\n const sourceChildren = draft[activeContainerIndex].children;\n\n // Put the hovered item back where the dragged item came from\n sourceChildren.splice(activeIndex, 0, overItem);\n\n // Swap the hovered item with the dragged one in the target row\n const draftOverIndex = targetChildren.findIndex(\n (item) => item.dndId === overItem.dndId\n );\n\n if (draftOverIndex !== -1) {\n targetChildren.splice(draftOverIndex, 1, draggedItem);\n }\n\n return;\n }\n\n // If there is absolutely no space left in the target row and the\n // dragged item comes from a different row, add it to a new row\n if (canCreateNewRowForItem) {\n // Default: insert a new row after the row being hovered (between that row and the\n // next). For row 0, use index 0 instead so fields that are not full-width can still\n // be moved above the first row—there is no separate drop area above it in the UI.\n const insertIndex = overContainerIndex === 0 ? 0 : overContainerIndex + 1;\n\n /**\n * When inserting *after* the hovered row, reuse the following row if it only\n * contains spacers. Skip when inserting at index 0 — draft[0] is the hovered row.\n */\n if (insertIndex > overContainerIndex) {\n const existingRow = draft[insertIndex];\n\n if (existingRow) {\n const nonTempChildren = existingRow.children.filter(\n (child) => child.name !== TEMP_FIELD_NAME\n );\n const isNextRowEmpty = nonTempChildren.length === 0;\n\n // If the row directly after is empty (only spacers), reuse it\n // instead of creating yet another row.\n if (isNextRowEmpty) {\n existingRow.children = [draggedItem];\n return;\n }\n }\n }\n\n const newContainerPrototype = draft[overContainerIndex];\n const newContainerId = `container-${draft.length}`;\n\n draft.splice(insertIndex, 0, {\n ...newContainerPrototype,\n dndId: newContainerId,\n children: [draggedItem],\n });\n\n return;\n }\n }\n\n // There is enough room in the target row\n if (isHoveringOverSpacer) {\n // We are over an invisible spacer, replace it with the dragged item\n targetChildren.splice(overIndex, 1, draggedItem);\n return;\n }\n\n // There is room for the item in the container, drop it\n targetChildren.splice(overIndex, 0, draggedItem);\n });\n\n setContainers(update);\n }}\n onDragEnd={(event) => {\n const { active, over } = event;\n const { id } = active;\n const overId = over?.id;\n const containersAsDictionary = getContainersAsDictionary();\n const activeContainer = findContainer(id, containersAsDictionary);\n const overContainer = findContainer(overId!, containersAsDictionary);\n\n if (!activeContainer || !overContainer) {\n return;\n }\n\n const activeIndex = containersAsDictionary[activeContainer].children.findIndex(\n (children) => children.dndId === id\n );\n const overIndex = containersAsDictionary[overContainer].children.findIndex(\n (children) => children.dndId === overId\n );\n\n const movedContainerItems = produce(containersAsDictionary, (draft) => {\n if (\n activeIndex >= 0 &&\n overIndex >= 0 &&\n activeIndex !== overIndex &&\n activeContainer === overContainer\n ) {\n // Move items around inside their own container\n draft[activeContainer].children = arraySwap(\n draft[activeContainer].children,\n activeIndex,\n overIndex\n );\n }\n });\n\n // Remove properties the server does not expect before updating the form\n const updatedContainers = Object.values(movedContainerItems);\n const updatedContainersWithSpacers = createContainersWithSpacers(\n updatedContainers\n ) as typeof containers;\n const updatedLayout = updatedContainersWithSpacers.map(\n ({ dndId: _dndId, children, ...container }) => ({\n ...container,\n children: children.map(({ dndId: _dndId, formName: _formName, ...child }) => child),\n })\n );\n\n // Update the layout\n onChange('layout', updatedLayout);\n setActiveDragItem(null);\n }}\n >\n <Flex paddingTop={6} direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Flex alignItems=\"flex-start\" direction=\"column\" justifyContent=\"space-between\">\n <Typography fontWeight=\"bold\">\n {formatMessage({\n id: getTranslation('containers.list.displayedFields'),\n defaultMessage: 'Displayed fields',\n })}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: 'containers.SettingPage.editSettings.description',\n defaultMessage: 'Drag & drop the fields to build the layout',\n })}\n </Typography>\n </Flex>\n <Box padding={4} hasRadius borderStyle=\"dashed\" borderWidth=\"1px\" borderColor=\"neutral300\">\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n {containers.map((container, containerIndex) => (\n <SortableContext\n key={container.dndId}\n id={container.dndId}\n items={container.children.map((child) => ({ id: child.dndId }))}\n strategy={rectSwappingStrategy}\n >\n <DroppableContainer id={container.dndId}>\n {({ setNodeRef }) => (\n <Grid.Root key={container.dndId} ref={setNodeRef} gap={2}>\n {container.children.map((child, childIndex) => (\n <Grid.Item\n col={child.size}\n xs={12}\n key={child.dndId}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <SortableItem id={child.dndId}>\n <Field\n attribute={attributes[child.name]}\n components={components}\n name={child.formName}\n onRemoveField={handleRemoveField(containerIndex, childIndex)}\n dndId={child.dndId}\n />\n </SortableItem>\n </Grid.Item>\n ))}\n </Grid.Root>\n )}\n </DroppableContainer>\n </SortableContext>\n ))}\n <DragOverlay>\n {activeDragItem ? (\n <Field\n attribute={attributes[activeDragItem.name]}\n components={components}\n name={activeDragItem.formName}\n dndId={activeDragItem.dndId}\n />\n ) : null}\n </DragOverlay>\n <Menu.Root>\n <Menu.Trigger\n startIcon={<Plus />}\n endIcon={null}\n disabled={remainingFields.length === 0}\n fullWidth\n variant=\"secondary\"\n >\n {formatMessage({\n id: getTranslation('containers.SettingPage.add.field'),\n defaultMessage: 'Insert another field',\n })}\n </Menu.Trigger>\n <Menu.Content>\n {remainingFields.map((field) => (\n <Menu.Item key={field.name} onSelect={handleAddField(field)}>\n {field.label}\n </Menu.Item>\n ))}\n </Menu.Content>\n </Menu.Root>\n </Flex>\n </Box>\n </Flex>\n </DndContext>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Field\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FieldProps extends Pick<EditFieldFormProps, 'name' | 'attribute'> {\n components: EditLayout['components'];\n dndId: string;\n onRemoveField?: React.MouseEventHandler<HTMLButtonElement>;\n}\n\nconst TEMP_FIELD_NAME = '_TEMP_';\n\n/**\n * Displays a field in the layout with drag options, also\n * opens a modal to edit the details of said field.\n */\nconst Field = ({ attribute, components, name, onRemoveField, dndId }: FieldProps) => {\n const isDesktop = useIsDesktop();\n const [isModalOpen, setIsModalOpen] = React.useState(false);\n const { formatMessage } = useIntl();\n const { value } = useField<FormField>(name);\n const { listeners, setActivatorNodeRef } = useSortable({\n id: dndId,\n });\n\n const handleRemoveField: React.MouseEventHandler<HTMLButtonElement> = (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (onRemoveField) {\n onRemoveField?.(e);\n }\n };\n\n const onEditFieldMeta: React.MouseEventHandler<HTMLButtonElement> = (e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsModalOpen(true);\n };\n\n if (!value) {\n return null;\n }\n\n if (value.name === TEMP_FIELD_NAME) {\n return <Flex tag=\"span\" height=\"100%\" style={{ opacity: 0 }} />;\n }\n\n if (!attribute) {\n return null;\n }\n\n return (\n <Modal.Root open={isModalOpen} onOpenChange={setIsModalOpen}>\n <Flex\n borderColor=\"neutral150\"\n background=\"neutral100\"\n hasRadius\n gap={3}\n cursor=\"pointer\"\n onClick={() => {\n setIsModalOpen(true);\n }}\n position=\"relative\"\n >\n {isDesktop && (\n <DragButton\n ref={setActivatorNodeRef}\n tag=\"span\"\n withTooltip={false}\n label={formatMessage(\n {\n id: getTranslation('components.DraggableCard.move.field'),\n defaultMessage: 'Move {item}',\n },\n { item: value.label }\n )}\n {...listeners}\n >\n <Drag />\n </DragButton>\n )}\n <Flex direction=\"column\" alignItems=\"flex-start\" grow={1} overflow=\"hidden\">\n <Flex gap={3} justifyContent=\"space-between\" width=\"100%\">\n <Typography ellipsis fontWeight=\"bold\">\n {value.label}\n </Typography>\n <Flex position=\"relative\">\n <IconButton\n type=\"button\"\n variant=\"ghost\"\n background=\"transparent\"\n onClick={onEditFieldMeta}\n withTooltip={false}\n label={formatMessage(\n {\n id: getTranslation('components.DraggableCard.edit.field'),\n defaultMessage: 'Edit {item}',\n },\n { item: value.label }\n )}\n >\n <Pencil />\n </IconButton>\n <IconButton\n type=\"button\"\n variant=\"ghost\"\n onClick={handleRemoveField}\n background=\"transparent\"\n withTooltip={false}\n label={formatMessage(\n {\n id: getTranslation('components.DraggableCard.delete.field'),\n defaultMessage: 'Delete {item}',\n },\n { item: value.label }\n )}\n >\n <Cross />\n </IconButton>\n </Flex>\n </Flex>\n {attribute?.type === 'component' ? (\n <Flex\n paddingTop={3}\n paddingRight={3}\n paddingBottom={3}\n paddingLeft={0}\n alignItems=\"flex-start\"\n direction=\"column\"\n gap={2}\n width=\"100%\"\n >\n <Grid.Root gap={4} width=\"100%\">\n {components[attribute.component].layout.map((row) =>\n row.map(({ size, ...field }) => (\n <Grid.Item\n key={field.name}\n col={size}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <Flex\n alignItems=\"center\"\n background=\"neutral0\"\n paddingTop={2}\n paddingBottom={2}\n paddingLeft={3}\n paddingRight={3}\n hasRadius\n borderColor=\"neutral200\"\n >\n <Typography textColor=\"neutral800\">{field.name}</Typography>\n </Flex>\n </Grid.Item>\n ))\n )}\n </Grid.Root>\n <Link\n // used to stop the edit form from appearing when we click here.\n onClick={(e) => e.stopPropagation()}\n startIcon={<Cog />}\n tag={NavLink}\n to={`../components/${attribute.component}/configurations/edit`}\n >\n {formatMessage({\n id: getTranslation('components.FieldItem.linkToComponentLayout'),\n defaultMessage: \"Set the component's layout\",\n })}\n </Link>\n </Flex>\n ) : null}\n {attribute?.type === 'dynamiczone' ? (\n <Flex\n paddingTop={3}\n paddingRight={3}\n paddingBottom={3}\n paddingLeft={0}\n alignItems=\"flex-start\"\n gap={2}\n width=\"100%\"\n wrap=\"wrap\"\n >\n {attribute?.components.map((uid) => (\n <ComponentLink\n // used to stop the edit form from appearing when we click here.\n onClick={(e) => e.stopPropagation()}\n key={uid}\n to={`../components/${uid}/configurations/edit`}\n >\n <ComponentIcon icon={components[uid].settings.icon} />\n <Typography fontSize={1} textColor=\"neutral600\" fontWeight=\"bold\">\n {components[uid].settings.displayName}\n </Typography>\n </ComponentLink>\n ))}\n </Flex>\n ) : null}\n </Flex>\n </Flex>\n {value.name !== TEMP_FIELD_NAME && (\n <EditFieldForm attribute={attribute} name={name} onClose={() => setIsModalOpen(false)} />\n )}\n </Modal.Root>\n );\n};\n\nconst DragButton = styled<IconButtonComponent<'span'>>(IconButton)`\n height: unset;\n align-self: stretch;\n display: flex;\n align-items: center;\n padding: 0;\n border: none;\n background-color: transparent;\n border-radius: 0px;\n border-right: 1px solid ${({ theme }) => theme.colors.neutral150};\n cursor: all-scroll;\n\n svg {\n width: 1.2rem;\n height: 1.2rem;\n }\n`;\n\nconst ComponentLink = styled(NavLink)`\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: ${({ theme }) => theme.spaces[1]};\n padding: ${(props) => props.theme.spaces[2]};\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n background: ${({ theme }) => theme.colors.neutral0};\n width: 14rem;\n border-radius: ${({ theme }) => theme.borderRadius};\n text-decoration: none;\n\n &:focus,\n &:hover {\n ${({ theme }) => `\n background-color: ${theme.colors.primary100};\n border-color: ${theme.colors.primary200};\n\n ${Typography} {\n color: ${theme.colors.primary600};\n }\n `}\n\n /* > ComponentIcon */\n > div:first-child {\n background: ${({ theme }) => theme.colors.primary200};\n color: ${({ theme }) => theme.colors.primary600};\n\n svg {\n path {\n fill: ${({ theme }) => theme.colors.primary600};\n }\n }\n }\n }\n`;\n\nexport { Fields, TEMP_FIELD_NAME };\nexport type { FieldsProps };\n"],"names":["GRID_COLUMNS","DroppableContainer","id","children","droppable","useDroppable","SortableItem","attributes","setNodeRef","transform","transition","isDragging","useSortable","style","CSS","Transform","toString","x","y","scaleX","scaleY","height","opacity","outlineOffset","_jsx","div","ref","createDragAndDropContainersFromLayout","layout","map","row","containerIndex","dndId","child","childIndex","formName","Fields","fieldSizes","components","metadatas","formatMessage","useIntl","useForm","state","values","onChange","addFieldRow","removeFieldRow","existingFields","field","name","flat","remainingFields","Object","entries","reduce","acc","current","visible","includes","type","size","push","label","handleRemoveField","rowIndex","fieldIndex","length","slice","handleAddField","containers","setContainers","React","useState","activeDragItem","setActiveDragItem","findContainer","containersAsDictionary","keys","find","key","getItemFromContainer","container","item","getContainersAsDictionary","fromEntries","createContainersWithSpacers","filter","TEMP_FIELD_NAME","totalSpaceTaken","curr","spacerKey","generateNKeysBetweenImpl","at","__temp_key__","undefined","useEffect","DndContext","onDragStart","event","activeContainer","active","activeItem","onDragOver","over","overContainer","activeContainerIndex","findIndex","overContainerIndex","draggedItem","overItem","overIndex","activeIndex","update","produce","draft","targetChildren","spaceTaken","isNotEnoughSpace","canSwapSameSizeItem","canCreateNewRowForItem","isHoveringOverSpacer","sourceChildren","splice","draftOverIndex","insertIndex","existingRow","nonTempChildren","isNextRowEmpty","newContainerPrototype","newContainerId","onDragEnd","overId","movedContainerItems","arraySwap","updatedContainers","updatedContainersWithSpacers","updatedLayout","_dndId","_formName","_jsxs","Flex","paddingTop","direction","alignItems","gap","justifyContent","Typography","fontWeight","getTranslation","defaultMessage","variant","textColor","Box","padding","hasRadius","borderStyle","borderWidth","borderColor","SortableContext","items","strategy","rectSwappingStrategy","Grid","Root","Item","col","xs","Field","attribute","onRemoveField","DragOverlay","Menu","Trigger","startIcon","Plus","endIcon","disabled","fullWidth","Content","onSelect","isDesktop","useIsDesktop","isModalOpen","setIsModalOpen","value","useField","listeners","setActivatorNodeRef","e","preventDefault","stopPropagation","onEditFieldMeta","tag","Modal","open","onOpenChange","background","cursor","onClick","position","DragButton","withTooltip","Drag","grow","overflow","width","ellipsis","IconButton","Pencil","Cross","paddingRight","paddingBottom","paddingLeft","component","Link","Cog","NavLink","to","wrap","uid","ComponentLink","ComponentIcon","icon","settings","fontSize","displayName","EditFieldForm","onClose","styled","theme","colors","neutral150","spaces","props","neutral200","neutral0","borderRadius","primary100","primary200","primary600"],"mappings":"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"}
@@ -14,6 +14,12 @@ var init = require('../services/init.js');
14
14
  var translations = require('../utils/translations.js');
15
15
 
16
16
  const { MUTATE_COLLECTION_TYPES_LINKS, MUTATE_SINGLE_TYPES_LINKS } = hooks$1.HOOKS;
17
+ const getPermissionKey = (permission)=>`${permission.action}::${permission.subject ?? ''}`;
18
+ const authorizeLinks = async (links, checkUserHasPermissions)=>{
19
+ const authorizedPermissions = await checkUserHasPermissions(links.flatMap(({ permissions })=>permissions));
20
+ const authorizedPermissionKeys = new Set(authorizedPermissions.map(getPermissionKey));
21
+ return links.filter(({ permissions })=>permissions.some((permission)=>authorizedPermissionKeys.has(getPermissionKey(permission))));
22
+ };
17
23
  const useContentManagerInitData = ()=>{
18
24
  const { toggleNotification } = strapiAdmin.useNotification();
19
25
  const dispatch = hooks.useTypedDispatch();
@@ -66,15 +72,15 @@ const useContentManagerInitData = ()=>{
66
72
  contentTypeSettingsQuery.error,
67
73
  toggleNotification
68
74
  ]);
69
- const formatData = async (components, contentTypes, fieldSizes, contentTypeConfigurations)=>{
75
+ const formatData = React.useCallback(async (components, contentTypes, fieldSizes, contentTypeConfigurations)=>{
70
76
  /**
71
- * We group these by the two types we support. We do with an object because we can use default
72
- * values of arrays to make sure we always have an array to manipulate further on if, for example,
73
- * a user has not made any single types.
74
- *
75
- * This means we have to manually add new content types to this hook if we add a new type – but
76
- * the safety is worth it.
77
- */ const { collectionType: collectionTypeLinks, singleType: singleTypeLinks } = contentTypes.reduce((acc, model)=>{
77
+ * We group these by the two types we support. We do with an object because we can use default
78
+ * values of arrays to make sure we always have an array to manipulate further on if, for example,
79
+ * a user has not made any single types.
80
+ *
81
+ * This means we have to manually add new content types to this hook if we add a new type – but
82
+ * the safety is worth it.
83
+ */ const { collectionType: collectionTypeLinks, singleType: singleTypeLinks } = contentTypes.reduce((acc, model)=>{
78
84
  acc[model.kind].push(model);
79
85
  return acc;
80
86
  }, {
@@ -83,12 +89,12 @@ const useContentManagerInitData = ()=>{
83
89
  });
84
90
  const collectionTypeSectionLinks = generateLinks(collectionTypeLinks, 'collectionTypes', contentTypeConfigurations);
85
91
  const singleTypeSectionLinks = generateLinks(singleTypeLinks, 'singleTypes');
86
- // Collection Types verifications
87
- const collectionTypeLinksPermissions = await Promise.all(collectionTypeSectionLinks.map(({ permissions })=>checkUserHasPermissions(permissions)));
88
- const authorizedCollectionTypeLinks = collectionTypeSectionLinks.filter((_, index)=>collectionTypeLinksPermissions[index].length > 0);
89
- // Single Types verifications
90
- const singleTypeLinksPermissions = await Promise.all(singleTypeSectionLinks.map(({ permissions })=>checkUserHasPermissions(permissions)));
91
- const authorizedSingleTypeLinks = singleTypeSectionLinks.filter((_, index)=>singleTypeLinksPermissions[index].length > 0);
92
+ const authorizedLinks = await authorizeLinks([
93
+ ...collectionTypeSectionLinks,
94
+ ...singleTypeSectionLinks
95
+ ], checkUserHasPermissions);
96
+ const authorizedCollectionTypeLinks = authorizedLinks.filter((link)=>link.kind === 'collectionType');
97
+ const authorizedSingleTypeLinks = authorizedLinks.filter((link)=>link.kind === 'singleType');
92
98
  const { ctLinks } = runHookWaterfall(MUTATE_COLLECTION_TYPES_LINKS, {
93
99
  ctLinks: authorizedCollectionTypeLinks,
94
100
  models: contentTypes
@@ -104,14 +110,26 @@ const useContentManagerInitData = ()=>{
104
110
  contentTypeSchemas: contentTypes,
105
111
  fieldSizes
106
112
  }));
107
- };
113
+ }, [
114
+ checkUserHasPermissions,
115
+ dispatch,
116
+ runHookWaterfall
117
+ ]);
108
118
  React.useEffect(()=>{
109
119
  if (initialDataQuery.data && contentTypeSettingsQuery.data) {
110
- formatData(initialDataQuery.data.components, initialDataQuery.data.contentTypes, initialDataQuery.data.fieldSizes, contentTypeSettingsQuery.data);
120
+ formatData(initialDataQuery.data.components, initialDataQuery.data.contentTypes, initialDataQuery.data.fieldSizes, contentTypeSettingsQuery.data).catch((error)=>{
121
+ toggleNotification({
122
+ type: 'danger',
123
+ message: formatAPIError(error)
124
+ });
125
+ });
111
126
  }
112
127
  }, [
128
+ formatAPIError,
129
+ formatData,
113
130
  initialDataQuery.data,
114
- contentTypeSettingsQuery.data
131
+ contentTypeSettingsQuery.data,
132
+ toggleNotification
115
133
  ]);
116
134
  return {
117
135
  ...state
@@ -1 +1 @@
1
- {"version":3,"file":"useContentManagerInitData.js","sources":["../../../admin/src/hooks/useContentManagerInitData.ts"],"sourcesContent":["import { useEffect } from 'react';\n\nimport {\n useAuth,\n type Permission,\n useNotification,\n useStrapiApp,\n useAPIErrorHandler,\n} from '@strapi/admin/strapi-admin';\nimport { useNotifyAT } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\n\nimport { COLLECTION_TYPES, SINGLE_TYPES } from '../constants/collections';\nimport { HOOKS } from '../constants/hooks';\nimport { AppState, setInitialData } from '../modules/app';\nimport { useTypedDispatch, useTypedSelector } from '../modules/hooks';\nimport { useGetAllContentTypeSettingsQuery } from '../services/contentTypes';\nimport { useGetInitialDataQuery } from '../services/init';\nimport { getTranslation } from '../utils/translations';\n\nimport type { Component } from '../../../shared/contracts/components';\nimport type {\n ContentType,\n FindContentTypesSettings,\n} from '../../../shared/contracts/content-types';\nimport type { GetInitData } from '../../../shared/contracts/init';\n\nconst { MUTATE_COLLECTION_TYPES_LINKS, MUTATE_SINGLE_TYPES_LINKS } = HOOKS;\n\ninterface ContentManagerLink {\n permissions: Permission[];\n search: string | null;\n kind: string;\n title: string;\n to: string;\n uid: string;\n name: string;\n isDisplayed: boolean;\n}\n\nconst useContentManagerInitData = (): AppState => {\n const { toggleNotification } = useNotification();\n const dispatch = useTypedDispatch();\n const runHookWaterfall = useStrapiApp(\n 'useContentManagerInitData',\n (state) => state.runHookWaterfall\n );\n const { notifyStatus } = useNotifyAT();\n const { formatMessage } = useIntl();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler(getTranslation);\n const checkUserHasPermissions = useAuth(\n 'useContentManagerInitData',\n (state) => state.checkUserHasPermissions\n );\n\n const state = useTypedSelector((state) => state['content-manager'].app);\n\n const initialDataQuery = useGetInitialDataQuery(undefined, {\n /**\n * TODO: remove this when the CTB has been refactored to use redux-toolkit-query\n * and it can invalidate the cache on mutation\n */\n refetchOnMountOrArgChange: true,\n });\n\n useEffect(() => {\n if (initialDataQuery.data) {\n notifyStatus(\n formatMessage({\n id: getTranslation('App.schemas.data-loaded'),\n defaultMessage: 'The schemas have been successfully loaded.',\n })\n );\n }\n }, [formatMessage, initialDataQuery.data, notifyStatus]);\n\n useEffect(() => {\n if (initialDataQuery.error) {\n toggleNotification({ type: 'danger', message: formatAPIError(initialDataQuery.error) });\n }\n }, [formatAPIError, initialDataQuery.error, toggleNotification]);\n\n const contentTypeSettingsQuery = useGetAllContentTypeSettingsQuery();\n\n useEffect(() => {\n if (contentTypeSettingsQuery.error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(contentTypeSettingsQuery.error),\n });\n }\n }, [formatAPIError, contentTypeSettingsQuery.error, toggleNotification]);\n\n const formatData = async (\n components: Component[],\n contentTypes: ContentType[],\n fieldSizes: GetInitData.Response['data']['fieldSizes'],\n contentTypeConfigurations: FindContentTypesSettings.Response['data']\n ) => {\n /**\n * We group these by the two types we support. We do with an object because we can use default\n * values of arrays to make sure we always have an array to manipulate further on if, for example,\n * a user has not made any single types.\n *\n * This means we have to manually add new content types to this hook if we add a new type – but\n * the safety is worth it.\n */\n const { collectionType: collectionTypeLinks, singleType: singleTypeLinks } =\n contentTypes.reduce<{\n collectionType: ContentType[];\n singleType: ContentType[];\n }>(\n (acc, model) => {\n acc[model.kind].push(model);\n return acc;\n },\n {\n collectionType: [],\n singleType: [],\n }\n );\n const collectionTypeSectionLinks = generateLinks(\n collectionTypeLinks,\n 'collectionTypes',\n contentTypeConfigurations\n );\n const singleTypeSectionLinks = generateLinks(singleTypeLinks, 'singleTypes');\n\n // Collection Types verifications\n const collectionTypeLinksPermissions = await Promise.all(\n collectionTypeSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedCollectionTypeLinks = collectionTypeSectionLinks.filter(\n (_, index) => collectionTypeLinksPermissions[index].length > 0\n );\n\n // Single Types verifications\n const singleTypeLinksPermissions = await Promise.all(\n singleTypeSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n const authorizedSingleTypeLinks = singleTypeSectionLinks.filter(\n (_, index) => singleTypeLinksPermissions[index].length > 0\n );\n const { ctLinks } = runHookWaterfall(MUTATE_COLLECTION_TYPES_LINKS, {\n ctLinks: authorizedCollectionTypeLinks,\n models: contentTypes,\n });\n const { stLinks } = runHookWaterfall(MUTATE_SINGLE_TYPES_LINKS, {\n stLinks: authorizedSingleTypeLinks,\n models: contentTypes,\n });\n\n dispatch(\n setInitialData({\n authorizedCollectionTypeLinks: ctLinks,\n authorizedSingleTypeLinks: stLinks,\n components,\n contentTypeSchemas: contentTypes,\n fieldSizes,\n })\n );\n };\n\n useEffect(() => {\n if (initialDataQuery.data && contentTypeSettingsQuery.data) {\n formatData(\n initialDataQuery.data.components,\n initialDataQuery.data.contentTypes,\n initialDataQuery.data.fieldSizes,\n contentTypeSettingsQuery.data\n );\n }\n }, [initialDataQuery.data, contentTypeSettingsQuery.data]);\n\n return { ...state };\n};\n\nconst generateLinks = (\n links: ContentType[],\n type: 'collectionTypes' | 'singleTypes',\n configurations: FindContentTypesSettings.Response['data'] = []\n) => {\n return links\n .filter((link) => link.isDisplayed)\n .map((link) => {\n const collectionTypesPermissions = [\n { action: 'plugin::content-manager.explorer.create', subject: link.uid },\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const singleTypesPermissions = [\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const permissions =\n type === 'collectionTypes' ? collectionTypesPermissions : singleTypesPermissions;\n\n const currentContentTypeConfig = configurations.find(({ uid }) => uid === link.uid);\n\n let search = null;\n\n if (currentContentTypeConfig) {\n const searchParams = {\n page: 1,\n pageSize: currentContentTypeConfig.settings.pageSize,\n sort: `${currentContentTypeConfig.settings.defaultSortBy}:${currentContentTypeConfig.settings.defaultSortOrder}`,\n };\n\n search = stringify(searchParams, { encode: false });\n }\n\n return {\n permissions,\n search,\n kind: link.kind,\n title: link.info.displayName,\n to: `/content-manager/${link.kind === 'collectionType' ? COLLECTION_TYPES : SINGLE_TYPES}/${\n link.uid\n }`,\n uid: link.uid,\n // Used for the list item key in the helper plugin\n name: link.uid,\n isDisplayed: link.isDisplayed,\n } satisfies ContentManagerLink;\n });\n};\n\nexport { useContentManagerInitData };\nexport type { ContentManagerLink };\n"],"names":["MUTATE_COLLECTION_TYPES_LINKS","MUTATE_SINGLE_TYPES_LINKS","HOOKS","useContentManagerInitData","toggleNotification","useNotification","dispatch","useTypedDispatch","runHookWaterfall","useStrapiApp","state","notifyStatus","useNotifyAT","formatMessage","useIntl","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","getTranslation","checkUserHasPermissions","useAuth","useTypedSelector","app","initialDataQuery","useGetInitialDataQuery","undefined","refetchOnMountOrArgChange","useEffect","data","id","defaultMessage","error","type","message","contentTypeSettingsQuery","useGetAllContentTypeSettingsQuery","formatData","components","contentTypes","fieldSizes","contentTypeConfigurations","collectionType","collectionTypeLinks","singleType","singleTypeLinks","reduce","acc","model","kind","push","collectionTypeSectionLinks","generateLinks","singleTypeSectionLinks","collectionTypeLinksPermissions","Promise","all","map","permissions","authorizedCollectionTypeLinks","filter","_","index","length","singleTypeLinksPermissions","authorizedSingleTypeLinks","ctLinks","models","stLinks","setInitialData","contentTypeSchemas","links","configurations","link","isDisplayed","collectionTypesPermissions","action","subject","uid","singleTypesPermissions","currentContentTypeConfig","find","search","searchParams","page","pageSize","settings","sort","defaultSortBy","defaultSortOrder","stringify","encode","title","info","displayName","to","COLLECTION_TYPES","SINGLE_TYPES","name"],"mappings":"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"}
1
+ {"version":3,"file":"useContentManagerInitData.js","sources":["../../../admin/src/hooks/useContentManagerInitData.ts"],"sourcesContent":["import { useCallback, useEffect } from 'react';\n\nimport {\n useAuth,\n type Permission,\n useNotification,\n useStrapiApp,\n useAPIErrorHandler,\n} from '@strapi/admin/strapi-admin';\nimport { useNotifyAT } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\n\nimport { COLLECTION_TYPES, SINGLE_TYPES } from '../constants/collections';\nimport { HOOKS } from '../constants/hooks';\nimport { AppState, setInitialData } from '../modules/app';\nimport { useTypedDispatch, useTypedSelector } from '../modules/hooks';\nimport { useGetAllContentTypeSettingsQuery } from '../services/contentTypes';\nimport { useGetInitialDataQuery } from '../services/init';\nimport { getTranslation } from '../utils/translations';\n\nimport type { Component } from '../../../shared/contracts/components';\nimport type {\n ContentType,\n FindContentTypesSettings,\n} from '../../../shared/contracts/content-types';\nimport type { GetInitData } from '../../../shared/contracts/init';\n\nconst { MUTATE_COLLECTION_TYPES_LINKS, MUTATE_SINGLE_TYPES_LINKS } = HOOKS;\n\ninterface ContentManagerLink {\n permissions: Permission[];\n search: string | null;\n kind: string;\n title: string;\n to: string;\n uid: string;\n name: string;\n isDisplayed: boolean;\n}\n\nconst getPermissionKey = (permission: Pick<Permission, 'action' | 'subject'>) =>\n `${permission.action}::${permission.subject ?? ''}`;\n\nconst authorizeLinks = async (\n links: ContentManagerLink[],\n checkUserHasPermissions: (\n permissions?: Array<Pick<Permission, 'action'> & Partial<Omit<Permission, 'action'>>>\n ) => Promise<Permission[]>\n) => {\n const authorizedPermissions = await checkUserHasPermissions(\n links.flatMap(({ permissions }) => permissions)\n );\n\n const authorizedPermissionKeys = new Set(authorizedPermissions.map(getPermissionKey));\n\n return links.filter(({ permissions }) =>\n permissions.some((permission) => authorizedPermissionKeys.has(getPermissionKey(permission)))\n );\n};\n\nconst useContentManagerInitData = (): AppState => {\n const { toggleNotification } = useNotification();\n const dispatch = useTypedDispatch();\n const runHookWaterfall = useStrapiApp(\n 'useContentManagerInitData',\n (state) => state.runHookWaterfall\n );\n const { notifyStatus } = useNotifyAT();\n const { formatMessage } = useIntl();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler(getTranslation);\n const checkUserHasPermissions = useAuth(\n 'useContentManagerInitData',\n (state) => state.checkUserHasPermissions\n );\n\n const state = useTypedSelector((state) => state['content-manager'].app);\n\n const initialDataQuery = useGetInitialDataQuery(undefined, {\n /**\n * TODO: remove this when the CTB has been refactored to use redux-toolkit-query\n * and it can invalidate the cache on mutation\n */\n refetchOnMountOrArgChange: true,\n });\n\n useEffect(() => {\n if (initialDataQuery.data) {\n notifyStatus(\n formatMessage({\n id: getTranslation('App.schemas.data-loaded'),\n defaultMessage: 'The schemas have been successfully loaded.',\n })\n );\n }\n }, [formatMessage, initialDataQuery.data, notifyStatus]);\n\n useEffect(() => {\n if (initialDataQuery.error) {\n toggleNotification({ type: 'danger', message: formatAPIError(initialDataQuery.error) });\n }\n }, [formatAPIError, initialDataQuery.error, toggleNotification]);\n\n const contentTypeSettingsQuery = useGetAllContentTypeSettingsQuery();\n\n useEffect(() => {\n if (contentTypeSettingsQuery.error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(contentTypeSettingsQuery.error),\n });\n }\n }, [formatAPIError, contentTypeSettingsQuery.error, toggleNotification]);\n\n const formatData = useCallback(\n async (\n components: Component[],\n contentTypes: ContentType[],\n fieldSizes: GetInitData.Response['data']['fieldSizes'],\n contentTypeConfigurations: FindContentTypesSettings.Response['data']\n ) => {\n /**\n * We group these by the two types we support. We do with an object because we can use default\n * values of arrays to make sure we always have an array to manipulate further on if, for example,\n * a user has not made any single types.\n *\n * This means we have to manually add new content types to this hook if we add a new type – but\n * the safety is worth it.\n */\n const { collectionType: collectionTypeLinks, singleType: singleTypeLinks } =\n contentTypes.reduce<{\n collectionType: ContentType[];\n singleType: ContentType[];\n }>(\n (acc, model) => {\n acc[model.kind].push(model);\n return acc;\n },\n {\n collectionType: [],\n singleType: [],\n }\n );\n const collectionTypeSectionLinks = generateLinks(\n collectionTypeLinks,\n 'collectionTypes',\n contentTypeConfigurations\n );\n const singleTypeSectionLinks = generateLinks(singleTypeLinks, 'singleTypes');\n\n const authorizedLinks = await authorizeLinks(\n [...collectionTypeSectionLinks, ...singleTypeSectionLinks],\n checkUserHasPermissions\n );\n const authorizedCollectionTypeLinks = authorizedLinks.filter(\n (link) => link.kind === 'collectionType'\n );\n const authorizedSingleTypeLinks = authorizedLinks.filter(\n (link) => link.kind === 'singleType'\n );\n const { ctLinks } = runHookWaterfall(MUTATE_COLLECTION_TYPES_LINKS, {\n ctLinks: authorizedCollectionTypeLinks,\n models: contentTypes,\n });\n const { stLinks } = runHookWaterfall(MUTATE_SINGLE_TYPES_LINKS, {\n stLinks: authorizedSingleTypeLinks,\n models: contentTypes,\n });\n\n dispatch(\n setInitialData({\n authorizedCollectionTypeLinks: ctLinks,\n authorizedSingleTypeLinks: stLinks,\n components,\n contentTypeSchemas: contentTypes,\n fieldSizes,\n })\n );\n },\n [checkUserHasPermissions, dispatch, runHookWaterfall]\n );\n\n useEffect(() => {\n if (initialDataQuery.data && contentTypeSettingsQuery.data) {\n formatData(\n initialDataQuery.data.components,\n initialDataQuery.data.contentTypes,\n initialDataQuery.data.fieldSizes,\n contentTypeSettingsQuery.data\n ).catch((error) => {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n });\n }\n }, [\n formatAPIError,\n formatData,\n initialDataQuery.data,\n contentTypeSettingsQuery.data,\n toggleNotification,\n ]);\n\n return { ...state };\n};\n\nconst generateLinks = (\n links: ContentType[],\n type: 'collectionTypes' | 'singleTypes',\n configurations: FindContentTypesSettings.Response['data'] = []\n) => {\n return links\n .filter((link) => link.isDisplayed)\n .map((link) => {\n const collectionTypesPermissions = [\n { action: 'plugin::content-manager.explorer.create', subject: link.uid },\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const singleTypesPermissions = [\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const permissions =\n type === 'collectionTypes' ? collectionTypesPermissions : singleTypesPermissions;\n\n const currentContentTypeConfig = configurations.find(({ uid }) => uid === link.uid);\n\n let search = null;\n\n if (currentContentTypeConfig) {\n const searchParams = {\n page: 1,\n pageSize: currentContentTypeConfig.settings.pageSize,\n sort: `${currentContentTypeConfig.settings.defaultSortBy}:${currentContentTypeConfig.settings.defaultSortOrder}`,\n };\n\n search = stringify(searchParams, { encode: false });\n }\n\n return {\n permissions,\n search,\n kind: link.kind,\n title: link.info.displayName,\n to: `/content-manager/${link.kind === 'collectionType' ? COLLECTION_TYPES : SINGLE_TYPES}/${\n link.uid\n }`,\n uid: link.uid,\n // Used for the list item key in the helper plugin\n name: link.uid,\n isDisplayed: link.isDisplayed,\n } satisfies ContentManagerLink;\n });\n};\n\nexport { useContentManagerInitData };\nexport type { ContentManagerLink };\n"],"names":["MUTATE_COLLECTION_TYPES_LINKS","MUTATE_SINGLE_TYPES_LINKS","HOOKS","getPermissionKey","permission","action","subject","authorizeLinks","links","checkUserHasPermissions","authorizedPermissions","flatMap","permissions","authorizedPermissionKeys","Set","map","filter","some","has","useContentManagerInitData","toggleNotification","useNotification","dispatch","useTypedDispatch","runHookWaterfall","useStrapiApp","state","notifyStatus","useNotifyAT","formatMessage","useIntl","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","getTranslation","useAuth","useTypedSelector","app","initialDataQuery","useGetInitialDataQuery","undefined","refetchOnMountOrArgChange","useEffect","data","id","defaultMessage","error","type","message","contentTypeSettingsQuery","useGetAllContentTypeSettingsQuery","formatData","useCallback","components","contentTypes","fieldSizes","contentTypeConfigurations","collectionType","collectionTypeLinks","singleType","singleTypeLinks","reduce","acc","model","kind","push","collectionTypeSectionLinks","generateLinks","singleTypeSectionLinks","authorizedLinks","authorizedCollectionTypeLinks","link","authorizedSingleTypeLinks","ctLinks","models","stLinks","setInitialData","contentTypeSchemas","catch","configurations","isDisplayed","collectionTypesPermissions","uid","singleTypesPermissions","currentContentTypeConfig","find","search","searchParams","page","pageSize","settings","sort","defaultSortBy","defaultSortOrder","stringify","encode","title","info","displayName","to","COLLECTION_TYPES","SINGLE_TYPES","name"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { useEffect } from 'react';
1
+ import { useEffect, useCallback } from 'react';
2
2
  import { useNotification, useStrapiApp, useAPIErrorHandler, useAuth } from '@strapi/admin/strapi-admin';
3
3
  import { useNotifyAT } from '@strapi/design-system';
4
4
  import { stringify } from 'qs';
@@ -12,6 +12,12 @@ import { useGetInitialDataQuery } from '../services/init.mjs';
12
12
  import { getTranslation } from '../utils/translations.mjs';
13
13
 
14
14
  const { MUTATE_COLLECTION_TYPES_LINKS, MUTATE_SINGLE_TYPES_LINKS } = HOOKS;
15
+ const getPermissionKey = (permission)=>`${permission.action}::${permission.subject ?? ''}`;
16
+ const authorizeLinks = async (links, checkUserHasPermissions)=>{
17
+ const authorizedPermissions = await checkUserHasPermissions(links.flatMap(({ permissions })=>permissions));
18
+ const authorizedPermissionKeys = new Set(authorizedPermissions.map(getPermissionKey));
19
+ return links.filter(({ permissions })=>permissions.some((permission)=>authorizedPermissionKeys.has(getPermissionKey(permission))));
20
+ };
15
21
  const useContentManagerInitData = ()=>{
16
22
  const { toggleNotification } = useNotification();
17
23
  const dispatch = useTypedDispatch();
@@ -64,15 +70,15 @@ const useContentManagerInitData = ()=>{
64
70
  contentTypeSettingsQuery.error,
65
71
  toggleNotification
66
72
  ]);
67
- const formatData = async (components, contentTypes, fieldSizes, contentTypeConfigurations)=>{
73
+ const formatData = useCallback(async (components, contentTypes, fieldSizes, contentTypeConfigurations)=>{
68
74
  /**
69
- * We group these by the two types we support. We do with an object because we can use default
70
- * values of arrays to make sure we always have an array to manipulate further on if, for example,
71
- * a user has not made any single types.
72
- *
73
- * This means we have to manually add new content types to this hook if we add a new type – but
74
- * the safety is worth it.
75
- */ const { collectionType: collectionTypeLinks, singleType: singleTypeLinks } = contentTypes.reduce((acc, model)=>{
75
+ * We group these by the two types we support. We do with an object because we can use default
76
+ * values of arrays to make sure we always have an array to manipulate further on if, for example,
77
+ * a user has not made any single types.
78
+ *
79
+ * This means we have to manually add new content types to this hook if we add a new type – but
80
+ * the safety is worth it.
81
+ */ const { collectionType: collectionTypeLinks, singleType: singleTypeLinks } = contentTypes.reduce((acc, model)=>{
76
82
  acc[model.kind].push(model);
77
83
  return acc;
78
84
  }, {
@@ -81,12 +87,12 @@ const useContentManagerInitData = ()=>{
81
87
  });
82
88
  const collectionTypeSectionLinks = generateLinks(collectionTypeLinks, 'collectionTypes', contentTypeConfigurations);
83
89
  const singleTypeSectionLinks = generateLinks(singleTypeLinks, 'singleTypes');
84
- // Collection Types verifications
85
- const collectionTypeLinksPermissions = await Promise.all(collectionTypeSectionLinks.map(({ permissions })=>checkUserHasPermissions(permissions)));
86
- const authorizedCollectionTypeLinks = collectionTypeSectionLinks.filter((_, index)=>collectionTypeLinksPermissions[index].length > 0);
87
- // Single Types verifications
88
- const singleTypeLinksPermissions = await Promise.all(singleTypeSectionLinks.map(({ permissions })=>checkUserHasPermissions(permissions)));
89
- const authorizedSingleTypeLinks = singleTypeSectionLinks.filter((_, index)=>singleTypeLinksPermissions[index].length > 0);
90
+ const authorizedLinks = await authorizeLinks([
91
+ ...collectionTypeSectionLinks,
92
+ ...singleTypeSectionLinks
93
+ ], checkUserHasPermissions);
94
+ const authorizedCollectionTypeLinks = authorizedLinks.filter((link)=>link.kind === 'collectionType');
95
+ const authorizedSingleTypeLinks = authorizedLinks.filter((link)=>link.kind === 'singleType');
90
96
  const { ctLinks } = runHookWaterfall(MUTATE_COLLECTION_TYPES_LINKS, {
91
97
  ctLinks: authorizedCollectionTypeLinks,
92
98
  models: contentTypes
@@ -102,14 +108,26 @@ const useContentManagerInitData = ()=>{
102
108
  contentTypeSchemas: contentTypes,
103
109
  fieldSizes
104
110
  }));
105
- };
111
+ }, [
112
+ checkUserHasPermissions,
113
+ dispatch,
114
+ runHookWaterfall
115
+ ]);
106
116
  useEffect(()=>{
107
117
  if (initialDataQuery.data && contentTypeSettingsQuery.data) {
108
- formatData(initialDataQuery.data.components, initialDataQuery.data.contentTypes, initialDataQuery.data.fieldSizes, contentTypeSettingsQuery.data);
118
+ formatData(initialDataQuery.data.components, initialDataQuery.data.contentTypes, initialDataQuery.data.fieldSizes, contentTypeSettingsQuery.data).catch((error)=>{
119
+ toggleNotification({
120
+ type: 'danger',
121
+ message: formatAPIError(error)
122
+ });
123
+ });
109
124
  }
110
125
  }, [
126
+ formatAPIError,
127
+ formatData,
111
128
  initialDataQuery.data,
112
- contentTypeSettingsQuery.data
129
+ contentTypeSettingsQuery.data,
130
+ toggleNotification
113
131
  ]);
114
132
  return {
115
133
  ...state
@@ -1 +1 @@
1
- {"version":3,"file":"useContentManagerInitData.mjs","sources":["../../../admin/src/hooks/useContentManagerInitData.ts"],"sourcesContent":["import { useEffect } from 'react';\n\nimport {\n useAuth,\n type Permission,\n useNotification,\n useStrapiApp,\n useAPIErrorHandler,\n} from '@strapi/admin/strapi-admin';\nimport { useNotifyAT } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\n\nimport { COLLECTION_TYPES, SINGLE_TYPES } from '../constants/collections';\nimport { HOOKS } from '../constants/hooks';\nimport { AppState, setInitialData } from '../modules/app';\nimport { useTypedDispatch, useTypedSelector } from '../modules/hooks';\nimport { useGetAllContentTypeSettingsQuery } from '../services/contentTypes';\nimport { useGetInitialDataQuery } from '../services/init';\nimport { getTranslation } from '../utils/translations';\n\nimport type { Component } from '../../../shared/contracts/components';\nimport type {\n ContentType,\n FindContentTypesSettings,\n} from '../../../shared/contracts/content-types';\nimport type { GetInitData } from '../../../shared/contracts/init';\n\nconst { MUTATE_COLLECTION_TYPES_LINKS, MUTATE_SINGLE_TYPES_LINKS } = HOOKS;\n\ninterface ContentManagerLink {\n permissions: Permission[];\n search: string | null;\n kind: string;\n title: string;\n to: string;\n uid: string;\n name: string;\n isDisplayed: boolean;\n}\n\nconst useContentManagerInitData = (): AppState => {\n const { toggleNotification } = useNotification();\n const dispatch = useTypedDispatch();\n const runHookWaterfall = useStrapiApp(\n 'useContentManagerInitData',\n (state) => state.runHookWaterfall\n );\n const { notifyStatus } = useNotifyAT();\n const { formatMessage } = useIntl();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler(getTranslation);\n const checkUserHasPermissions = useAuth(\n 'useContentManagerInitData',\n (state) => state.checkUserHasPermissions\n );\n\n const state = useTypedSelector((state) => state['content-manager'].app);\n\n const initialDataQuery = useGetInitialDataQuery(undefined, {\n /**\n * TODO: remove this when the CTB has been refactored to use redux-toolkit-query\n * and it can invalidate the cache on mutation\n */\n refetchOnMountOrArgChange: true,\n });\n\n useEffect(() => {\n if (initialDataQuery.data) {\n notifyStatus(\n formatMessage({\n id: getTranslation('App.schemas.data-loaded'),\n defaultMessage: 'The schemas have been successfully loaded.',\n })\n );\n }\n }, [formatMessage, initialDataQuery.data, notifyStatus]);\n\n useEffect(() => {\n if (initialDataQuery.error) {\n toggleNotification({ type: 'danger', message: formatAPIError(initialDataQuery.error) });\n }\n }, [formatAPIError, initialDataQuery.error, toggleNotification]);\n\n const contentTypeSettingsQuery = useGetAllContentTypeSettingsQuery();\n\n useEffect(() => {\n if (contentTypeSettingsQuery.error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(contentTypeSettingsQuery.error),\n });\n }\n }, [formatAPIError, contentTypeSettingsQuery.error, toggleNotification]);\n\n const formatData = async (\n components: Component[],\n contentTypes: ContentType[],\n fieldSizes: GetInitData.Response['data']['fieldSizes'],\n contentTypeConfigurations: FindContentTypesSettings.Response['data']\n ) => {\n /**\n * We group these by the two types we support. We do with an object because we can use default\n * values of arrays to make sure we always have an array to manipulate further on if, for example,\n * a user has not made any single types.\n *\n * This means we have to manually add new content types to this hook if we add a new type – but\n * the safety is worth it.\n */\n const { collectionType: collectionTypeLinks, singleType: singleTypeLinks } =\n contentTypes.reduce<{\n collectionType: ContentType[];\n singleType: ContentType[];\n }>(\n (acc, model) => {\n acc[model.kind].push(model);\n return acc;\n },\n {\n collectionType: [],\n singleType: [],\n }\n );\n const collectionTypeSectionLinks = generateLinks(\n collectionTypeLinks,\n 'collectionTypes',\n contentTypeConfigurations\n );\n const singleTypeSectionLinks = generateLinks(singleTypeLinks, 'singleTypes');\n\n // Collection Types verifications\n const collectionTypeLinksPermissions = await Promise.all(\n collectionTypeSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedCollectionTypeLinks = collectionTypeSectionLinks.filter(\n (_, index) => collectionTypeLinksPermissions[index].length > 0\n );\n\n // Single Types verifications\n const singleTypeLinksPermissions = await Promise.all(\n singleTypeSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n const authorizedSingleTypeLinks = singleTypeSectionLinks.filter(\n (_, index) => singleTypeLinksPermissions[index].length > 0\n );\n const { ctLinks } = runHookWaterfall(MUTATE_COLLECTION_TYPES_LINKS, {\n ctLinks: authorizedCollectionTypeLinks,\n models: contentTypes,\n });\n const { stLinks } = runHookWaterfall(MUTATE_SINGLE_TYPES_LINKS, {\n stLinks: authorizedSingleTypeLinks,\n models: contentTypes,\n });\n\n dispatch(\n setInitialData({\n authorizedCollectionTypeLinks: ctLinks,\n authorizedSingleTypeLinks: stLinks,\n components,\n contentTypeSchemas: contentTypes,\n fieldSizes,\n })\n );\n };\n\n useEffect(() => {\n if (initialDataQuery.data && contentTypeSettingsQuery.data) {\n formatData(\n initialDataQuery.data.components,\n initialDataQuery.data.contentTypes,\n initialDataQuery.data.fieldSizes,\n contentTypeSettingsQuery.data\n );\n }\n }, [initialDataQuery.data, contentTypeSettingsQuery.data]);\n\n return { ...state };\n};\n\nconst generateLinks = (\n links: ContentType[],\n type: 'collectionTypes' | 'singleTypes',\n configurations: FindContentTypesSettings.Response['data'] = []\n) => {\n return links\n .filter((link) => link.isDisplayed)\n .map((link) => {\n const collectionTypesPermissions = [\n { action: 'plugin::content-manager.explorer.create', subject: link.uid },\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const singleTypesPermissions = [\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const permissions =\n type === 'collectionTypes' ? collectionTypesPermissions : singleTypesPermissions;\n\n const currentContentTypeConfig = configurations.find(({ uid }) => uid === link.uid);\n\n let search = null;\n\n if (currentContentTypeConfig) {\n const searchParams = {\n page: 1,\n pageSize: currentContentTypeConfig.settings.pageSize,\n sort: `${currentContentTypeConfig.settings.defaultSortBy}:${currentContentTypeConfig.settings.defaultSortOrder}`,\n };\n\n search = stringify(searchParams, { encode: false });\n }\n\n return {\n permissions,\n search,\n kind: link.kind,\n title: link.info.displayName,\n to: `/content-manager/${link.kind === 'collectionType' ? COLLECTION_TYPES : SINGLE_TYPES}/${\n link.uid\n }`,\n uid: link.uid,\n // Used for the list item key in the helper plugin\n name: link.uid,\n isDisplayed: link.isDisplayed,\n } satisfies ContentManagerLink;\n });\n};\n\nexport { useContentManagerInitData };\nexport type { ContentManagerLink };\n"],"names":["MUTATE_COLLECTION_TYPES_LINKS","MUTATE_SINGLE_TYPES_LINKS","HOOKS","useContentManagerInitData","toggleNotification","useNotification","dispatch","useTypedDispatch","runHookWaterfall","useStrapiApp","state","notifyStatus","useNotifyAT","formatMessage","useIntl","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","getTranslation","checkUserHasPermissions","useAuth","useTypedSelector","app","initialDataQuery","useGetInitialDataQuery","undefined","refetchOnMountOrArgChange","useEffect","data","id","defaultMessage","error","type","message","contentTypeSettingsQuery","useGetAllContentTypeSettingsQuery","formatData","components","contentTypes","fieldSizes","contentTypeConfigurations","collectionType","collectionTypeLinks","singleType","singleTypeLinks","reduce","acc","model","kind","push","collectionTypeSectionLinks","generateLinks","singleTypeSectionLinks","collectionTypeLinksPermissions","Promise","all","map","permissions","authorizedCollectionTypeLinks","filter","_","index","length","singleTypeLinksPermissions","authorizedSingleTypeLinks","ctLinks","models","stLinks","setInitialData","contentTypeSchemas","links","configurations","link","isDisplayed","collectionTypesPermissions","action","subject","uid","singleTypesPermissions","currentContentTypeConfig","find","search","searchParams","page","pageSize","settings","sort","defaultSortBy","defaultSortOrder","stringify","encode","title","info","displayName","to","COLLECTION_TYPES","SINGLE_TYPES","name"],"mappings":"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"}
1
+ {"version":3,"file":"useContentManagerInitData.mjs","sources":["../../../admin/src/hooks/useContentManagerInitData.ts"],"sourcesContent":["import { useCallback, useEffect } from 'react';\n\nimport {\n useAuth,\n type Permission,\n useNotification,\n useStrapiApp,\n useAPIErrorHandler,\n} from '@strapi/admin/strapi-admin';\nimport { useNotifyAT } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\n\nimport { COLLECTION_TYPES, SINGLE_TYPES } from '../constants/collections';\nimport { HOOKS } from '../constants/hooks';\nimport { AppState, setInitialData } from '../modules/app';\nimport { useTypedDispatch, useTypedSelector } from '../modules/hooks';\nimport { useGetAllContentTypeSettingsQuery } from '../services/contentTypes';\nimport { useGetInitialDataQuery } from '../services/init';\nimport { getTranslation } from '../utils/translations';\n\nimport type { Component } from '../../../shared/contracts/components';\nimport type {\n ContentType,\n FindContentTypesSettings,\n} from '../../../shared/contracts/content-types';\nimport type { GetInitData } from '../../../shared/contracts/init';\n\nconst { MUTATE_COLLECTION_TYPES_LINKS, MUTATE_SINGLE_TYPES_LINKS } = HOOKS;\n\ninterface ContentManagerLink {\n permissions: Permission[];\n search: string | null;\n kind: string;\n title: string;\n to: string;\n uid: string;\n name: string;\n isDisplayed: boolean;\n}\n\nconst getPermissionKey = (permission: Pick<Permission, 'action' | 'subject'>) =>\n `${permission.action}::${permission.subject ?? ''}`;\n\nconst authorizeLinks = async (\n links: ContentManagerLink[],\n checkUserHasPermissions: (\n permissions?: Array<Pick<Permission, 'action'> & Partial<Omit<Permission, 'action'>>>\n ) => Promise<Permission[]>\n) => {\n const authorizedPermissions = await checkUserHasPermissions(\n links.flatMap(({ permissions }) => permissions)\n );\n\n const authorizedPermissionKeys = new Set(authorizedPermissions.map(getPermissionKey));\n\n return links.filter(({ permissions }) =>\n permissions.some((permission) => authorizedPermissionKeys.has(getPermissionKey(permission)))\n );\n};\n\nconst useContentManagerInitData = (): AppState => {\n const { toggleNotification } = useNotification();\n const dispatch = useTypedDispatch();\n const runHookWaterfall = useStrapiApp(\n 'useContentManagerInitData',\n (state) => state.runHookWaterfall\n );\n const { notifyStatus } = useNotifyAT();\n const { formatMessage } = useIntl();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler(getTranslation);\n const checkUserHasPermissions = useAuth(\n 'useContentManagerInitData',\n (state) => state.checkUserHasPermissions\n );\n\n const state = useTypedSelector((state) => state['content-manager'].app);\n\n const initialDataQuery = useGetInitialDataQuery(undefined, {\n /**\n * TODO: remove this when the CTB has been refactored to use redux-toolkit-query\n * and it can invalidate the cache on mutation\n */\n refetchOnMountOrArgChange: true,\n });\n\n useEffect(() => {\n if (initialDataQuery.data) {\n notifyStatus(\n formatMessage({\n id: getTranslation('App.schemas.data-loaded'),\n defaultMessage: 'The schemas have been successfully loaded.',\n })\n );\n }\n }, [formatMessage, initialDataQuery.data, notifyStatus]);\n\n useEffect(() => {\n if (initialDataQuery.error) {\n toggleNotification({ type: 'danger', message: formatAPIError(initialDataQuery.error) });\n }\n }, [formatAPIError, initialDataQuery.error, toggleNotification]);\n\n const contentTypeSettingsQuery = useGetAllContentTypeSettingsQuery();\n\n useEffect(() => {\n if (contentTypeSettingsQuery.error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(contentTypeSettingsQuery.error),\n });\n }\n }, [formatAPIError, contentTypeSettingsQuery.error, toggleNotification]);\n\n const formatData = useCallback(\n async (\n components: Component[],\n contentTypes: ContentType[],\n fieldSizes: GetInitData.Response['data']['fieldSizes'],\n contentTypeConfigurations: FindContentTypesSettings.Response['data']\n ) => {\n /**\n * We group these by the two types we support. We do with an object because we can use default\n * values of arrays to make sure we always have an array to manipulate further on if, for example,\n * a user has not made any single types.\n *\n * This means we have to manually add new content types to this hook if we add a new type – but\n * the safety is worth it.\n */\n const { collectionType: collectionTypeLinks, singleType: singleTypeLinks } =\n contentTypes.reduce<{\n collectionType: ContentType[];\n singleType: ContentType[];\n }>(\n (acc, model) => {\n acc[model.kind].push(model);\n return acc;\n },\n {\n collectionType: [],\n singleType: [],\n }\n );\n const collectionTypeSectionLinks = generateLinks(\n collectionTypeLinks,\n 'collectionTypes',\n contentTypeConfigurations\n );\n const singleTypeSectionLinks = generateLinks(singleTypeLinks, 'singleTypes');\n\n const authorizedLinks = await authorizeLinks(\n [...collectionTypeSectionLinks, ...singleTypeSectionLinks],\n checkUserHasPermissions\n );\n const authorizedCollectionTypeLinks = authorizedLinks.filter(\n (link) => link.kind === 'collectionType'\n );\n const authorizedSingleTypeLinks = authorizedLinks.filter(\n (link) => link.kind === 'singleType'\n );\n const { ctLinks } = runHookWaterfall(MUTATE_COLLECTION_TYPES_LINKS, {\n ctLinks: authorizedCollectionTypeLinks,\n models: contentTypes,\n });\n const { stLinks } = runHookWaterfall(MUTATE_SINGLE_TYPES_LINKS, {\n stLinks: authorizedSingleTypeLinks,\n models: contentTypes,\n });\n\n dispatch(\n setInitialData({\n authorizedCollectionTypeLinks: ctLinks,\n authorizedSingleTypeLinks: stLinks,\n components,\n contentTypeSchemas: contentTypes,\n fieldSizes,\n })\n );\n },\n [checkUserHasPermissions, dispatch, runHookWaterfall]\n );\n\n useEffect(() => {\n if (initialDataQuery.data && contentTypeSettingsQuery.data) {\n formatData(\n initialDataQuery.data.components,\n initialDataQuery.data.contentTypes,\n initialDataQuery.data.fieldSizes,\n contentTypeSettingsQuery.data\n ).catch((error) => {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n });\n }\n }, [\n formatAPIError,\n formatData,\n initialDataQuery.data,\n contentTypeSettingsQuery.data,\n toggleNotification,\n ]);\n\n return { ...state };\n};\n\nconst generateLinks = (\n links: ContentType[],\n type: 'collectionTypes' | 'singleTypes',\n configurations: FindContentTypesSettings.Response['data'] = []\n) => {\n return links\n .filter((link) => link.isDisplayed)\n .map((link) => {\n const collectionTypesPermissions = [\n { action: 'plugin::content-manager.explorer.create', subject: link.uid },\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const singleTypesPermissions = [\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const permissions =\n type === 'collectionTypes' ? collectionTypesPermissions : singleTypesPermissions;\n\n const currentContentTypeConfig = configurations.find(({ uid }) => uid === link.uid);\n\n let search = null;\n\n if (currentContentTypeConfig) {\n const searchParams = {\n page: 1,\n pageSize: currentContentTypeConfig.settings.pageSize,\n sort: `${currentContentTypeConfig.settings.defaultSortBy}:${currentContentTypeConfig.settings.defaultSortOrder}`,\n };\n\n search = stringify(searchParams, { encode: false });\n }\n\n return {\n permissions,\n search,\n kind: link.kind,\n title: link.info.displayName,\n to: `/content-manager/${link.kind === 'collectionType' ? COLLECTION_TYPES : SINGLE_TYPES}/${\n link.uid\n }`,\n uid: link.uid,\n // Used for the list item key in the helper plugin\n name: link.uid,\n isDisplayed: link.isDisplayed,\n } satisfies ContentManagerLink;\n });\n};\n\nexport { useContentManagerInitData };\nexport type { ContentManagerLink };\n"],"names":["MUTATE_COLLECTION_TYPES_LINKS","MUTATE_SINGLE_TYPES_LINKS","HOOKS","getPermissionKey","permission","action","subject","authorizeLinks","links","checkUserHasPermissions","authorizedPermissions","flatMap","permissions","authorizedPermissionKeys","Set","map","filter","some","has","useContentManagerInitData","toggleNotification","useNotification","dispatch","useTypedDispatch","runHookWaterfall","useStrapiApp","state","notifyStatus","useNotifyAT","formatMessage","useIntl","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","getTranslation","useAuth","useTypedSelector","app","initialDataQuery","useGetInitialDataQuery","undefined","refetchOnMountOrArgChange","useEffect","data","id","defaultMessage","error","type","message","contentTypeSettingsQuery","useGetAllContentTypeSettingsQuery","formatData","useCallback","components","contentTypes","fieldSizes","contentTypeConfigurations","collectionType","collectionTypeLinks","singleType","singleTypeLinks","reduce","acc","model","kind","push","collectionTypeSectionLinks","generateLinks","singleTypeSectionLinks","authorizedLinks","authorizedCollectionTypeLinks","link","authorizedSingleTypeLinks","ctLinks","models","stLinks","setInitialData","contentTypeSchemas","catch","configurations","isDisplayed","collectionTypesPermissions","uid","singleTypesPermissions","currentContentTypeConfig","find","search","searchParams","page","pageSize","settings","sort","defaultSortBy","defaultSortOrder","stringify","encode","title","info","displayName","to","COLLECTION_TYPES","SINGLE_TYPES","name"],"mappings":"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"}