@strapi/content-manager 0.0.0-experimental.0e5c9562e7bee0ab55e14e247b87a12c3b0ecb40 → 0.0.0-experimental.0ef52256bbcb9fb8e0689f4b51a6e8356f520184
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.
- package/dist/admin/components/ConfigurationForm/Fields.js +4 -1
- package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/Fields.mjs +5 -2
- package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
- package/dist/admin/components/ConfigurationForm/Form.js +1 -1
- package/dist/admin/components/ConfigurationForm/Form.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/Form.mjs +3 -3
- package/dist/admin/components/ConfigurationForm/Form.mjs.map +1 -1
- package/dist/admin/components/DragPreviews/CardDragPreview.js +3 -1
- package/dist/admin/components/DragPreviews/CardDragPreview.js.map +1 -1
- package/dist/admin/components/DragPreviews/CardDragPreview.mjs +3 -1
- package/dist/admin/components/DragPreviews/CardDragPreview.mjs.map +1 -1
- package/dist/admin/components/DragPreviews/ComponentDragPreview.js +3 -1
- package/dist/admin/components/DragPreviews/ComponentDragPreview.js.map +1 -1
- package/dist/admin/components/DragPreviews/ComponentDragPreview.mjs +3 -1
- package/dist/admin/components/DragPreviews/ComponentDragPreview.mjs.map +1 -1
- package/dist/admin/components/DragPreviews/RelationDragPreview.js +3 -1
- package/dist/admin/components/DragPreviews/RelationDragPreview.js.map +1 -1
- package/dist/admin/components/DragPreviews/RelationDragPreview.mjs +3 -1
- package/dist/admin/components/DragPreviews/RelationDragPreview.mjs.map +1 -1
- package/dist/admin/components/LeftMenu.js +87 -45
- package/dist/admin/components/LeftMenu.js.map +1 -1
- package/dist/admin/components/LeftMenu.mjs +89 -47
- package/dist/admin/components/LeftMenu.mjs.map +1 -1
- package/dist/admin/history/components/VersionHeader.js +1 -0
- package/dist/admin/history/components/VersionHeader.js.map +1 -1
- package/dist/admin/history/components/VersionHeader.mjs +1 -0
- package/dist/admin/history/components/VersionHeader.mjs.map +1 -1
- package/dist/admin/history/components/VersionsList.js +1 -1
- package/dist/admin/history/components/VersionsList.js.map +1 -1
- package/dist/admin/history/components/VersionsList.mjs +1 -1
- package/dist/admin/history/components/VersionsList.mjs.map +1 -1
- package/dist/admin/history/pages/History.js +7 -7
- package/dist/admin/history/pages/History.js.map +1 -1
- package/dist/admin/history/pages/History.mjs +7 -7
- package/dist/admin/history/pages/History.mjs.map +1 -1
- package/dist/admin/layout.js +27 -6
- package/dist/admin/layout.js.map +1 -1
- package/dist/admin/layout.mjs +28 -7
- package/dist/admin/layout.mjs.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.js +7 -3
- package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.mjs +8 -4
- package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +2 -2
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +2 -2
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +2 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +1 -2
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +1 -2
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +2 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +2 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js +2 -2
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs +2 -2
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.js +13 -8
- package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.mjs +14 -8
- package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/Header.js +14 -6
- package/dist/admin/pages/EditView/components/Header.js.map +1 -1
- package/dist/admin/pages/EditView/components/Header.mjs +15 -7
- package/dist/admin/pages/EditView/components/Header.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js +6 -3
- package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.mjs +6 -3
- package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
- package/dist/admin/pages/EditView/utils/data.js +1 -1
- package/dist/admin/pages/EditView/utils/data.js.map +1 -1
- package/dist/admin/pages/EditView/utils/data.mjs +1 -1
- package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js +30 -31
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs +31 -32
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs.map +1 -1
- package/dist/admin/preview/components/InputPopover.js +130 -14
- package/dist/admin/preview/components/InputPopover.js.map +1 -1
- package/dist/admin/preview/components/InputPopover.mjs +112 -15
- package/dist/admin/preview/components/InputPopover.mjs.map +1 -1
- package/dist/admin/preview/components/PreviewHeader.js +0 -1
- package/dist/admin/preview/components/PreviewHeader.js.map +1 -1
- package/dist/admin/preview/components/PreviewHeader.mjs +0 -1
- package/dist/admin/preview/components/PreviewHeader.mjs.map +1 -1
- package/dist/admin/preview/hooks/usePreviewInputManager.js +18 -8
- package/dist/admin/preview/hooks/usePreviewInputManager.js.map +1 -1
- package/dist/admin/preview/hooks/usePreviewInputManager.mjs +18 -8
- package/dist/admin/preview/hooks/usePreviewInputManager.mjs.map +1 -1
- package/dist/admin/preview/pages/Preview.js +12 -10
- package/dist/admin/preview/pages/Preview.js.map +1 -1
- package/dist/admin/preview/pages/Preview.mjs +14 -12
- package/dist/admin/preview/pages/Preview.mjs.map +1 -1
- package/dist/admin/preview/utils/constants.js +34 -0
- package/dist/admin/preview/utils/constants.js.map +1 -1
- package/dist/admin/preview/utils/constants.mjs +34 -1
- package/dist/admin/preview/utils/constants.mjs.map +1 -1
- package/dist/admin/preview/utils/fieldUtils.js +107 -0
- package/dist/admin/preview/utils/fieldUtils.js.map +1 -0
- package/dist/admin/preview/utils/fieldUtils.mjs +102 -0
- package/dist/admin/preview/utils/fieldUtils.mjs.map +1 -0
- package/dist/admin/preview/utils/previewScript.js +134 -50
- package/dist/admin/preview/utils/previewScript.js.map +1 -1
- package/dist/admin/preview/utils/previewScript.mjs +134 -50
- package/dist/admin/preview/utils/previewScript.mjs.map +1 -1
- package/dist/admin/src/components/LeftMenu.d.ts +3 -1
- package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +0 -3
- package/dist/admin/src/preview/components/InputPopover.d.ts +1 -1
- package/dist/admin/src/preview/hooks/usePreviewInputManager.d.ts +2 -1
- package/dist/admin/src/preview/pages/Preview.d.ts +6 -2
- package/dist/admin/src/preview/utils/constants.d.ts +35 -0
- package/dist/admin/src/preview/utils/fieldUtils.d.ts +22 -0
- package/dist/admin/src/preview/utils/previewScript.d.ts +1 -0
- package/dist/admin/translations/en.json.js +5 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +5 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Header.mjs","sources":["../../../../../admin/src/pages/EditView/components/Header.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n DescriptionComponentRenderer,\n useForm,\n BackButton,\n useNotification,\n useStrapiApp,\n useQueryParams,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n SingleSelect,\n SingleSelectOption,\n Typography,\n IconButton,\n Dialog,\n} from '@strapi/design-system';\nimport { ListPlus, Pencil, Trash, WarningCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useMatch, useNavigate, useParams } from 'react-router-dom';\n\nimport { RelativeTime } from '../../../components/RelativeTime';\nimport {\n CREATED_AT_ATTRIBUTE_NAME,\n CREATED_BY_ATTRIBUTE_NAME,\n PUBLISHED_AT_ATTRIBUTE_NAME,\n PUBLISHED_BY_ATTRIBUTE_NAME,\n UPDATED_AT_ATTRIBUTE_NAME,\n UPDATED_BY_ATTRIBUTE_NAME,\n} from '../../../constants/attributes';\nimport { COLLECTION_TYPES, SINGLE_TYPES } from '../../../constants/collections';\nimport { useDocumentRBAC } from '../../../features/DocumentRBAC';\nimport { useDoc } from '../../../hooks/useDocument';\nimport { useDocumentActions } from '../../../hooks/useDocumentActions';\nimport { CLONE_PATH, LIST_PATH } from '../../../router';\nimport { getDisplayName } from '../../../utils/users';\n\nimport { DocumentActionsMenu } from './DocumentActions';\nimport { DocumentStatus } from './DocumentStatus';\n\nimport type { ContentManagerPlugin, DocumentActionComponent } from '../../../content-manager';\n\n/* -------------------------------------------------------------------------------------------------\n * Header\n * -----------------------------------------------------------------------------------------------*/\n\ninterface HeaderProps {\n isCreating?: boolean;\n status?: 'draft' | 'published' | 'modified';\n title?: string;\n}\n\nconst Header = ({ isCreating, status, title: documentTitle = 'Untitled' }: HeaderProps) => {\n const { formatMessage } = useIntl();\n const isCloning = useMatch(CLONE_PATH) !== null;\n const params = useParams<{ collectionType: string; slug: string }>();\n\n const title = isCreating\n ? formatMessage({\n id: 'content-manager.containers.edit.title.new',\n defaultMessage: 'Create an entry',\n })\n : documentTitle;\n\n return (\n <Flex direction=\"column\" alignItems=\"flex-start\" paddingTop={6} paddingBottom={4} gap={2}>\n <BackButton\n fallback={\n params.collectionType === SINGLE_TYPES\n ? undefined\n : `../${COLLECTION_TYPES}/${params.slug}`\n }\n />\n <Flex width=\"100%\" justifyContent=\"space-between\" gap=\"80px\" alignItems=\"flex-start\">\n <Typography variant=\"alpha\" tag=\"h1\">\n {title}\n </Typography>\n <HeaderToolbar />\n </Flex>\n {status ? (\n <Box marginTop={1}>\n <DocumentStatus status={isCloning ? 'draft' : status} />\n </Box>\n ) : null}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HeaderToolbar\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DialogOptions {\n type: 'dialog';\n title: string;\n content?: React.ReactNode;\n footer?: React.ReactNode;\n}\n\ninterface HeaderActionDescription {\n disabled?: boolean;\n label: string;\n icon?: React.ReactNode;\n type?: 'icon' | 'default';\n onClick?: (event: React.SyntheticEvent) => Promise<boolean | void> | boolean | void;\n dialog?: DialogOptions;\n options?: Array<{\n disabled?: boolean;\n label: string;\n startIcon?: React.ReactNode;\n textValue?: string;\n value: string;\n }>;\n onSelect?: (value: string) => void;\n value?: string;\n customizeContent?: (value: string) => React.ReactNode;\n}\n\n/**\n * @description Contains the document actions that have `position: header`, if there are\n * none we still render the menu because we render the information about the document there.\n */\nconst HeaderToolbar = () => {\n const { formatMessage } = useIntl();\n const isCloning = useMatch(CLONE_PATH) !== null;\n const [\n {\n query: { status = 'draft' },\n },\n ] = useQueryParams<{ status: 'draft' | 'published' }>();\n const { model, id, document, meta, collectionType } = useDoc();\n const plugins = useStrapiApp('HeaderToolbar', (state) => state.plugins);\n\n return (\n <Flex gap={2}>\n <DescriptionComponentRenderer\n props={{\n activeTab: status,\n model,\n documentId: id,\n document: isCloning ? undefined : document,\n meta: isCloning ? undefined : meta,\n collectionType,\n }}\n descriptions={(\n plugins['content-manager'].apis as ContentManagerPlugin['config']['apis']\n ).getHeaderActions()}\n >\n {(actions) => {\n if (actions.length > 0) {\n return <HeaderActions actions={actions} />;\n } else {\n return null;\n }\n }}\n </DescriptionComponentRenderer>\n <DescriptionComponentRenderer\n props={{\n activeTab: status,\n model,\n documentId: id,\n document: isCloning ? undefined : document,\n meta: isCloning ? undefined : meta,\n collectionType,\n }}\n descriptions={(\n plugins['content-manager'].apis as ContentManagerPlugin['config']['apis']\n ).getDocumentActions('header')}\n >\n {(actions) => {\n const headerActions = actions.filter((action) => {\n const positions = Array.isArray(action.position) ? action.position : [action.position];\n return positions.includes('header');\n });\n\n return (\n <DocumentActionsMenu\n actions={headerActions}\n label={formatMessage({\n id: 'content-manager.containers.edit.header.more-actions',\n defaultMessage: 'More actions',\n })}\n >\n <Information activeTab={status} />\n </DocumentActionsMenu>\n );\n }}\n </DescriptionComponentRenderer>\n </Flex>\n );\n};\n\ninterface InformationProps {\n activeTab: 'draft' | 'published';\n}\n\nconst Information = ({ activeTab }: InformationProps) => {\n const { formatMessage } = useIntl();\n const { document, meta } = useDoc();\n\n if (!document || !document.id) {\n return null;\n }\n\n /**\n * Because in the backend separate entries are made for draft and published\n * documents, the creator fields are different for each of them. For example,\n * you could make your draft in January and then publish it for the first time\n * in Feb. This would make the createdAt value for the published entry in Feb\n * but really we want to show the document as a whole. The draft entry will also\n * never have the publishedAt values.\n *\n * So, we decipher which document to show the creator for based on the activeTab.\n */\n\n const createAndUpdateDocument =\n activeTab === 'draft'\n ? document\n : meta?.availableStatus.find((status) => status.publishedAt === null);\n\n const publishDocument =\n activeTab === 'published'\n ? document\n : meta?.availableStatus.find((status) => status.publishedAt !== null);\n\n const creator = createAndUpdateDocument?.[CREATED_BY_ATTRIBUTE_NAME]\n ? getDisplayName(createAndUpdateDocument[CREATED_BY_ATTRIBUTE_NAME])\n : null;\n\n const updator = createAndUpdateDocument?.[UPDATED_BY_ATTRIBUTE_NAME]\n ? getDisplayName(createAndUpdateDocument[UPDATED_BY_ATTRIBUTE_NAME])\n : null;\n\n const information: Array<{ isDisplayed?: boolean; label: string; value: React.ReactNode }> = [\n {\n isDisplayed: !!publishDocument?.[PUBLISHED_AT_ATTRIBUTE_NAME],\n label: formatMessage({\n id: 'content-manager.containers.edit.information.last-published.label',\n defaultMessage: 'Published',\n }),\n value: formatMessage(\n {\n id: 'content-manager.containers.edit.information.last-published.value',\n defaultMessage: `{time}{isAnonymous, select, true {} other { by {author}}}`,\n },\n {\n time: (\n <RelativeTime timestamp={new Date(publishDocument?.[PUBLISHED_AT_ATTRIBUTE_NAME])} />\n ),\n isAnonymous: !publishDocument?.[PUBLISHED_BY_ATTRIBUTE_NAME],\n author: publishDocument?.[PUBLISHED_BY_ATTRIBUTE_NAME]\n ? getDisplayName(publishDocument?.[PUBLISHED_BY_ATTRIBUTE_NAME])\n : null,\n }\n ),\n },\n {\n isDisplayed: !!createAndUpdateDocument?.[UPDATED_AT_ATTRIBUTE_NAME],\n label: formatMessage({\n id: 'content-manager.containers.edit.information.last-draft.label',\n defaultMessage: 'Updated',\n }),\n value: formatMessage(\n {\n id: 'content-manager.containers.edit.information.last-draft.value',\n defaultMessage: `{time}{isAnonymous, select, true {} other { by {author}}}`,\n },\n {\n time: (\n <RelativeTime\n timestamp={new Date(createAndUpdateDocument?.[UPDATED_AT_ATTRIBUTE_NAME])}\n />\n ),\n isAnonymous: !updator,\n author: updator,\n }\n ),\n },\n {\n isDisplayed: !!createAndUpdateDocument?.[CREATED_AT_ATTRIBUTE_NAME],\n label: formatMessage({\n id: 'content-manager.containers.edit.information.document.label',\n defaultMessage: 'Created',\n }),\n value: formatMessage(\n {\n id: 'content-manager.containers.edit.information.document.value',\n defaultMessage: `{time}{isAnonymous, select, true {} other { by {author}}}`,\n },\n {\n time: (\n <RelativeTime\n timestamp={new Date(createAndUpdateDocument?.[CREATED_AT_ATTRIBUTE_NAME])}\n />\n ),\n isAnonymous: !creator,\n author: creator,\n }\n ),\n },\n ].filter((info) => info.isDisplayed);\n\n return (\n <Flex\n borderWidth=\"1px 0 0 0\"\n borderStyle=\"solid\"\n borderColor=\"neutral150\"\n direction=\"column\"\n marginTop={2}\n tag=\"dl\"\n padding={5}\n gap={3}\n alignItems=\"flex-start\"\n /**\n * The menu content has a padding of 4px, but we want our divider (the border top applied) to\n * be flush with the menu content. So we need to adjust the margin & width to account for the padding.\n */\n marginLeft=\"-0.4rem\"\n marginRight=\"-0.4rem\"\n width=\"calc(100% + 8px)\"\n >\n {information.map((info) => (\n <Flex gap={1} direction=\"column\" alignItems=\"flex-start\" key={info.label}>\n <Typography tag=\"dt\" variant=\"pi\" fontWeight=\"bold\">\n {info.label}\n </Typography>\n <Typography tag=\"dd\" variant=\"pi\" textColor=\"neutral600\">\n {info.value}\n </Typography>\n </Flex>\n ))}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HeaderActions\n * -----------------------------------------------------------------------------------------------*/\n\ninterface HeaderActionsProps {\n actions: Array<HeaderActionDescription & { id: string }>;\n}\n\nconst HeaderActions = ({ actions }: HeaderActionsProps) => {\n const [dialogId, setDialogId] = React.useState<string | null>(null);\n\n const handleClick =\n (action: HeaderActionDescription & { id: string }) => async (e: React.MouseEvent) => {\n if (!('options' in action)) {\n const { onClick = () => false, dialog, id } = action;\n\n const muteDialog = await onClick(e);\n\n if (dialog && !muteDialog) {\n e.preventDefault();\n setDialogId(id);\n }\n }\n };\n\n const handleClose = () => {\n setDialogId(null);\n };\n\n return (\n <Flex gap={1}>\n {actions.map((action) => {\n if (action.options) {\n return (\n <SingleSelect\n key={action.id}\n size=\"S\"\n // @ts-expect-error – the DS will handle numbers, but we're not allowing the API.\n onChange={action.onSelect}\n aria-label={action.label}\n {...action}\n >\n {action.options.map(({ label, ...option }) => (\n <SingleSelectOption key={option.value} {...option}>\n {label}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n );\n } else {\n if (action.type === 'icon') {\n return (\n <React.Fragment key={action.id}>\n <IconButton\n disabled={action.disabled}\n label={action.label}\n size=\"S\"\n onClick={handleClick(action)}\n >\n {action.icon}\n </IconButton>\n {action.dialog ? (\n <HeaderActionDialog\n {...action.dialog}\n isOpen={dialogId === action.id}\n onClose={handleClose}\n />\n ) : null}\n </React.Fragment>\n );\n }\n }\n })}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HeaderActionDialog\n * -----------------------------------------------------------------------------------------------*/\ninterface HeaderActionDialogProps {\n onClose: () => void;\n onCancel?: () => Promise<void>;\n title: string;\n content?: React.ReactNode | ((props: { onClose: () => void }) => React.ReactNode);\n isOpen: boolean;\n}\n\nconst HeaderActionDialog = ({\n onClose,\n onCancel,\n title,\n content: Content,\n isOpen,\n}: HeaderActionDialogProps) => {\n const handleClose = async () => {\n if (onCancel) {\n await onCancel();\n }\n\n onClose();\n };\n\n return (\n <Dialog.Root open={isOpen} onOpenChange={handleClose}>\n <Dialog.Content>\n <Dialog.Header>{title}</Dialog.Header>\n {typeof Content === 'function' ? <Content onClose={handleClose} /> : Content}\n </Dialog.Content>\n </Dialog.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DocumentActionComponents\n * -----------------------------------------------------------------------------------------------*/\n\nconst ConfigureTheViewAction: DocumentActionComponent = ({ collectionType, model }) => {\n const navigate = useNavigate();\n const { formatMessage } = useIntl();\n\n return {\n label: formatMessage({\n id: 'app.links.configure-view',\n defaultMessage: 'Configure the view',\n }),\n icon: <ListPlus />,\n onClick: () => {\n navigate(`../${collectionType}/${model}/configurations/edit`);\n },\n position: 'header',\n };\n};\n\nConfigureTheViewAction.type = 'configure-the-view';\nConfigureTheViewAction.position = 'header';\n\nconst EditTheModelAction: DocumentActionComponent = ({ model }) => {\n const navigate = useNavigate();\n const { formatMessage } = useIntl();\n\n return {\n label: formatMessage({\n id: 'content-manager.link-to-ctb',\n defaultMessage: 'Edit the model',\n }),\n icon: <Pencil />,\n onClick: () => {\n navigate(`/plugins/content-type-builder/content-types/${model}`);\n },\n position: 'header',\n };\n};\n\nEditTheModelAction.type = 'edit-the-model';\nEditTheModelAction.position = 'header';\n\nconst DeleteAction: DocumentActionComponent = ({ documentId, model, collectionType, document }) => {\n const navigate = useNavigate();\n const { formatMessage } = useIntl();\n const listViewPathMatch = useMatch(LIST_PATH);\n const canDelete = useDocumentRBAC('DeleteAction', (state) => state.canDelete);\n const { delete: deleteAction, isLoading } = useDocumentActions();\n const { toggleNotification } = useNotification();\n const setSubmitting = useForm('DeleteAction', (state) => state.setSubmitting);\n const isLocalized = document?.locale != null;\n\n return {\n disabled: !canDelete || !document,\n label: formatMessage(\n {\n id: 'content-manager.actions.delete.label',\n defaultMessage: 'Delete entry{isLocalized, select, true { (all locales)} other {}}',\n },\n { isLocalized }\n ),\n icon: <Trash />,\n dialog: {\n type: 'dialog',\n title: formatMessage({\n id: 'app.components.ConfirmDialog.title',\n defaultMessage: 'Confirmation',\n }),\n content: (\n <Flex direction=\"column\" gap={2}>\n <WarningCircle width=\"24px\" height=\"24px\" fill=\"danger600\" />\n <Typography tag=\"p\" variant=\"omega\" textAlign=\"center\">\n {formatMessage({\n id: 'content-manager.actions.delete.dialog.body',\n defaultMessage: 'Are you sure?',\n })}\n </Typography>\n </Flex>\n ),\n loading: isLoading,\n onConfirm: async () => {\n /**\n * If we have a match, we're in the list view\n * and therefore not in a form and shouldn't be\n * trying to set the submitting value.\n */\n if (!listViewPathMatch) {\n setSubmitting(true);\n }\n try {\n if (!documentId && collectionType !== SINGLE_TYPES) {\n console.error(\n \"You're trying to delete a document without an id, this is likely a bug with Strapi. Please open an issue.\"\n );\n\n toggleNotification({\n message: formatMessage({\n id: 'content-manager.actions.delete.error',\n defaultMessage: 'An error occurred while trying to delete the document.',\n }),\n type: 'danger',\n });\n\n return;\n }\n\n const res = await deleteAction({\n documentId,\n model,\n collectionType,\n params: {\n locale: '*',\n },\n });\n\n if (!('error' in res)) {\n navigate({ pathname: `../${collectionType}/${model}` }, { replace: true });\n }\n } finally {\n if (!listViewPathMatch) {\n setSubmitting(false);\n }\n }\n },\n },\n variant: 'danger',\n position: ['header', 'table-row'],\n };\n};\n\nDeleteAction.type = 'delete';\nDeleteAction.position = ['header', 'table-row'];\n\nconst DEFAULT_HEADER_ACTIONS = [EditTheModelAction, ConfigureTheViewAction, DeleteAction];\n\nexport { Header, DEFAULT_HEADER_ACTIONS };\nexport type { HeaderProps, HeaderActionDescription };\n"],"names":["Header","isCreating","status","title","documentTitle","formatMessage","useIntl","isCloning","useMatch","CLONE_PATH","params","useParams","id","defaultMessage","_jsxs","Flex","direction","alignItems","paddingTop","paddingBottom","gap","_jsx","BackButton","fallback","collectionType","SINGLE_TYPES","undefined","COLLECTION_TYPES","slug","width","justifyContent","Typography","variant","tag","HeaderToolbar","Box","marginTop","DocumentStatus","query","useQueryParams","model","document","meta","useDoc","plugins","useStrapiApp","state","DescriptionComponentRenderer","props","activeTab","documentId","descriptions","apis","getHeaderActions","actions","length","HeaderActions","getDocumentActions","headerActions","filter","action","positions","Array","isArray","position","includes","DocumentActionsMenu","label","Information","createAndUpdateDocument","availableStatus","find","publishedAt","publishDocument","creator","CREATED_BY_ATTRIBUTE_NAME","getDisplayName","updator","UPDATED_BY_ATTRIBUTE_NAME","information","isDisplayed","PUBLISHED_AT_ATTRIBUTE_NAME","value","time","RelativeTime","timestamp","Date","isAnonymous","PUBLISHED_BY_ATTRIBUTE_NAME","author","UPDATED_AT_ATTRIBUTE_NAME","CREATED_AT_ATTRIBUTE_NAME","info","borderWidth","borderStyle","borderColor","padding","marginLeft","marginRight","map","fontWeight","textColor","dialogId","setDialogId","React","useState","handleClick","e","onClick","dialog","muteDialog","preventDefault","handleClose","options","SingleSelect","size","onChange","onSelect","aria-label","option","SingleSelectOption","type","Fragment","IconButton","disabled","icon","HeaderActionDialog","isOpen","onClose","onCancel","content","Content","Dialog","Root","open","onOpenChange","ConfigureTheViewAction","navigate","useNavigate","ListPlus","EditTheModelAction","Pencil","DeleteAction","listViewPathMatch","LIST_PATH","canDelete","useDocumentRBAC","delete","deleteAction","isLoading","useDocumentActions","toggleNotification","useNotification","setSubmitting","useForm","isLocalized","locale","Trash","WarningCircle","height","fill","textAlign","loading","onConfirm","console","error","message","res","pathname","replace","DEFAULT_HEADER_ACTIONS"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Header.mjs","sources":["../../../../../admin/src/pages/EditView/components/Header.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n DescriptionComponentRenderer,\n useForm,\n BackButton,\n useNotification,\n useStrapiApp,\n useQueryParams,\n useIsDesktop,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n SingleSelect,\n SingleSelectOption,\n Typography,\n IconButton,\n Dialog,\n} from '@strapi/design-system';\nimport { ListPlus, Pencil, Trash, WarningCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useMatch, useNavigate, useParams } from 'react-router-dom';\n\nimport { RelativeTime } from '../../../components/RelativeTime';\nimport {\n CREATED_AT_ATTRIBUTE_NAME,\n CREATED_BY_ATTRIBUTE_NAME,\n PUBLISHED_AT_ATTRIBUTE_NAME,\n PUBLISHED_BY_ATTRIBUTE_NAME,\n UPDATED_AT_ATTRIBUTE_NAME,\n UPDATED_BY_ATTRIBUTE_NAME,\n} from '../../../constants/attributes';\nimport { COLLECTION_TYPES, SINGLE_TYPES } from '../../../constants/collections';\nimport { useDocumentRBAC } from '../../../features/DocumentRBAC';\nimport { useDoc } from '../../../hooks/useDocument';\nimport { useDocumentActions } from '../../../hooks/useDocumentActions';\nimport { CLONE_PATH, LIST_PATH } from '../../../router';\nimport { getDisplayName } from '../../../utils/users';\n\nimport { DocumentActionsMenu } from './DocumentActions';\nimport { DocumentStatus } from './DocumentStatus';\n\nimport type { ContentManagerPlugin, DocumentActionComponent } from '../../../content-manager';\n\n/* -------------------------------------------------------------------------------------------------\n * Header\n * -----------------------------------------------------------------------------------------------*/\n\ninterface HeaderProps {\n isCreating?: boolean;\n status?: 'draft' | 'published' | 'modified';\n title?: string;\n}\n\nconst Header = ({ isCreating, status, title: documentTitle = 'Untitled' }: HeaderProps) => {\n const { formatMessage } = useIntl();\n const isCloning = useMatch(CLONE_PATH) !== null;\n const params = useParams<{ collectionType: string; slug: string }>();\n\n const title = isCreating\n ? formatMessage({\n id: 'content-manager.containers.edit.title.new',\n defaultMessage: 'Create an entry',\n })\n : documentTitle;\n\n return (\n <Flex\n direction=\"column\"\n alignItems=\"flex-start\"\n paddingTop={{\n initial: 4,\n large: 6,\n }}\n paddingBottom={{\n initial: 0,\n large: 4,\n }}\n gap={2}\n >\n <BackButton\n fallback={\n params.collectionType === SINGLE_TYPES\n ? undefined\n : `../${COLLECTION_TYPES}/${params.slug}`\n }\n />\n <Flex width=\"100%\" justifyContent=\"space-between\" gap=\"80px\" alignItems=\"flex-start\">\n <Typography variant=\"alpha\" tag=\"h1\">\n {title}\n </Typography>\n <HeaderToolbar />\n </Flex>\n {status ? (\n <Box marginTop={1}>\n <DocumentStatus status={isCloning ? 'draft' : status} />\n </Box>\n ) : null}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HeaderToolbar\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DialogOptions {\n type: 'dialog';\n title: string;\n content?: React.ReactNode;\n footer?: React.ReactNode;\n}\n\ninterface HeaderActionDescription {\n disabled?: boolean;\n label: string;\n icon?: React.ReactNode;\n type?: 'icon' | 'default';\n onClick?: (event: React.SyntheticEvent) => Promise<boolean | void> | boolean | void;\n dialog?: DialogOptions;\n options?: Array<{\n disabled?: boolean;\n label: string;\n startIcon?: React.ReactNode;\n textValue?: string;\n value: string;\n }>;\n onSelect?: (value: string) => void;\n value?: string;\n customizeContent?: (value: string) => React.ReactNode;\n}\n\n/**\n * @description Contains the document actions that have `position: header`, if there are\n * none we still render the menu because we render the information about the document there.\n */\nconst HeaderToolbar = () => {\n const { formatMessage } = useIntl();\n const isCloning = useMatch(CLONE_PATH) !== null;\n const [\n {\n query: { status = 'draft' },\n },\n ] = useQueryParams<{ status: 'draft' | 'published' }>();\n const { model, id, document, meta, collectionType } = useDoc();\n const plugins = useStrapiApp('HeaderToolbar', (state) => state.plugins);\n\n return (\n <Flex gap={2}>\n <DescriptionComponentRenderer\n props={{\n activeTab: status,\n model,\n documentId: id,\n document: isCloning ? undefined : document,\n meta: isCloning ? undefined : meta,\n collectionType,\n }}\n descriptions={(\n plugins['content-manager'].apis as ContentManagerPlugin['config']['apis']\n ).getHeaderActions()}\n >\n {(actions) => {\n if (actions.length > 0) {\n return <HeaderActions actions={actions} />;\n } else {\n return null;\n }\n }}\n </DescriptionComponentRenderer>\n <DescriptionComponentRenderer\n props={{\n activeTab: status,\n model,\n documentId: id,\n document: isCloning ? undefined : document,\n meta: isCloning ? undefined : meta,\n collectionType,\n }}\n descriptions={(\n plugins['content-manager'].apis as ContentManagerPlugin['config']['apis']\n ).getDocumentActions('header')}\n >\n {(actions) => {\n const headerActions = actions.filter((action) => {\n const positions = Array.isArray(action.position) ? action.position : [action.position];\n return positions.includes('header');\n });\n\n return (\n <DocumentActionsMenu\n actions={headerActions}\n label={formatMessage({\n id: 'content-manager.containers.edit.header.more-actions',\n defaultMessage: 'More actions',\n })}\n >\n <Information activeTab={status} />\n </DocumentActionsMenu>\n );\n }}\n </DescriptionComponentRenderer>\n </Flex>\n );\n};\n\ninterface InformationProps {\n activeTab: 'draft' | 'published';\n}\n\nconst Information = ({ activeTab }: InformationProps) => {\n const { formatMessage } = useIntl();\n const { document, meta } = useDoc();\n\n if (!document || !document.id) {\n return null;\n }\n\n /**\n * Because in the backend separate entries are made for draft and published\n * documents, the creator fields are different for each of them. For example,\n * you could make your draft in January and then publish it for the first time\n * in Feb. This would make the createdAt value for the published entry in Feb\n * but really we want to show the document as a whole. The draft entry will also\n * never have the publishedAt values.\n *\n * So, we decipher which document to show the creator for based on the activeTab.\n */\n\n const createAndUpdateDocument =\n activeTab === 'draft'\n ? document\n : meta?.availableStatus.find((status) => status.publishedAt === null);\n\n const publishDocument =\n activeTab === 'published'\n ? document\n : meta?.availableStatus.find((status) => status.publishedAt !== null);\n\n const creator = createAndUpdateDocument?.[CREATED_BY_ATTRIBUTE_NAME]\n ? getDisplayName(createAndUpdateDocument[CREATED_BY_ATTRIBUTE_NAME])\n : null;\n\n const updator = createAndUpdateDocument?.[UPDATED_BY_ATTRIBUTE_NAME]\n ? getDisplayName(createAndUpdateDocument[UPDATED_BY_ATTRIBUTE_NAME])\n : null;\n\n const information: Array<{ isDisplayed?: boolean; label: string; value: React.ReactNode }> = [\n {\n isDisplayed: !!publishDocument?.[PUBLISHED_AT_ATTRIBUTE_NAME],\n label: formatMessage({\n id: 'content-manager.containers.edit.information.last-published.label',\n defaultMessage: 'Published',\n }),\n value: formatMessage(\n {\n id: 'content-manager.containers.edit.information.last-published.value',\n defaultMessage: `{time}{isAnonymous, select, true {} other { by {author}}}`,\n },\n {\n time: (\n <RelativeTime timestamp={new Date(publishDocument?.[PUBLISHED_AT_ATTRIBUTE_NAME])} />\n ),\n isAnonymous: !publishDocument?.[PUBLISHED_BY_ATTRIBUTE_NAME],\n author: publishDocument?.[PUBLISHED_BY_ATTRIBUTE_NAME]\n ? getDisplayName(publishDocument?.[PUBLISHED_BY_ATTRIBUTE_NAME])\n : null,\n }\n ),\n },\n {\n isDisplayed: !!createAndUpdateDocument?.[UPDATED_AT_ATTRIBUTE_NAME],\n label: formatMessage({\n id: 'content-manager.containers.edit.information.last-draft.label',\n defaultMessage: 'Updated',\n }),\n value: formatMessage(\n {\n id: 'content-manager.containers.edit.information.last-draft.value',\n defaultMessage: `{time}{isAnonymous, select, true {} other { by {author}}}`,\n },\n {\n time: (\n <RelativeTime\n timestamp={new Date(createAndUpdateDocument?.[UPDATED_AT_ATTRIBUTE_NAME])}\n />\n ),\n isAnonymous: !updator,\n author: updator,\n }\n ),\n },\n {\n isDisplayed: !!createAndUpdateDocument?.[CREATED_AT_ATTRIBUTE_NAME],\n label: formatMessage({\n id: 'content-manager.containers.edit.information.document.label',\n defaultMessage: 'Created',\n }),\n value: formatMessage(\n {\n id: 'content-manager.containers.edit.information.document.value',\n defaultMessage: `{time}{isAnonymous, select, true {} other { by {author}}}`,\n },\n {\n time: (\n <RelativeTime\n timestamp={new Date(createAndUpdateDocument?.[CREATED_AT_ATTRIBUTE_NAME])}\n />\n ),\n isAnonymous: !creator,\n author: creator,\n }\n ),\n },\n ].filter((info) => info.isDisplayed);\n\n return (\n <Flex\n borderWidth=\"1px 0 0 0\"\n borderStyle=\"solid\"\n borderColor=\"neutral150\"\n direction=\"column\"\n marginTop={2}\n tag=\"dl\"\n padding={5}\n gap={3}\n alignItems=\"flex-start\"\n /**\n * The menu content has a padding of 4px, but we want our divider (the border top applied) to\n * be flush with the menu content. So we need to adjust the margin & width to account for the padding.\n */\n marginLeft=\"-0.4rem\"\n marginRight=\"-0.4rem\"\n width=\"calc(100% + 8px)\"\n >\n {information.map((info) => (\n <Flex gap={1} direction=\"column\" alignItems=\"flex-start\" key={info.label}>\n <Typography tag=\"dt\" variant=\"pi\" fontWeight=\"bold\">\n {info.label}\n </Typography>\n <Typography tag=\"dd\" variant=\"pi\" textColor=\"neutral600\">\n {info.value}\n </Typography>\n </Flex>\n ))}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HeaderActions\n * -----------------------------------------------------------------------------------------------*/\n\ninterface HeaderActionsProps {\n actions: Array<HeaderActionDescription & { id: string }>;\n}\n\nconst HeaderActions = ({ actions }: HeaderActionsProps) => {\n const [dialogId, setDialogId] = React.useState<string | null>(null);\n\n const handleClick =\n (action: HeaderActionDescription & { id: string }) => async (e: React.MouseEvent) => {\n if (!('options' in action)) {\n const { onClick = () => false, dialog, id } = action;\n\n const muteDialog = await onClick(e);\n\n if (dialog && !muteDialog) {\n e.preventDefault();\n setDialogId(id);\n }\n }\n };\n\n const handleClose = () => {\n setDialogId(null);\n };\n\n return (\n <Flex gap={1}>\n {actions.map((action) => {\n if (action.options) {\n return (\n <SingleSelect\n key={action.id}\n size=\"S\"\n // @ts-expect-error – the DS will handle numbers, but we're not allowing the API.\n onChange={action.onSelect}\n aria-label={action.label}\n {...action}\n >\n {action.options.map(({ label, ...option }) => (\n <SingleSelectOption key={option.value} {...option}>\n {label}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n );\n } else {\n if (action.type === 'icon') {\n return (\n <React.Fragment key={action.id}>\n <IconButton\n disabled={action.disabled}\n label={action.label}\n size=\"S\"\n onClick={handleClick(action)}\n >\n {action.icon}\n </IconButton>\n {action.dialog ? (\n <HeaderActionDialog\n {...action.dialog}\n isOpen={dialogId === action.id}\n onClose={handleClose}\n />\n ) : null}\n </React.Fragment>\n );\n }\n }\n })}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HeaderActionDialog\n * -----------------------------------------------------------------------------------------------*/\ninterface HeaderActionDialogProps {\n onClose: () => void;\n onCancel?: () => Promise<void>;\n title: string;\n content?: React.ReactNode | ((props: { onClose: () => void }) => React.ReactNode);\n isOpen: boolean;\n}\n\nconst HeaderActionDialog = ({\n onClose,\n onCancel,\n title,\n content: Content,\n isOpen,\n}: HeaderActionDialogProps) => {\n const handleClose = async () => {\n if (onCancel) {\n await onCancel();\n }\n\n onClose();\n };\n\n return (\n <Dialog.Root open={isOpen} onOpenChange={handleClose}>\n <Dialog.Content>\n <Dialog.Header>{title}</Dialog.Header>\n {typeof Content === 'function' ? <Content onClose={handleClose} /> : Content}\n </Dialog.Content>\n </Dialog.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DocumentActionComponents\n * -----------------------------------------------------------------------------------------------*/\n\nconst ConfigureTheViewAction: DocumentActionComponent = ({ collectionType, model }) => {\n const navigate = useNavigate();\n const { formatMessage } = useIntl();\n const isDesktop = useIsDesktop();\n\n return isDesktop\n ? {\n label: formatMessage({\n id: 'app.links.configure-view',\n defaultMessage: 'Configure the view',\n }),\n icon: <ListPlus />,\n onClick: () => {\n navigate(`../${collectionType}/${model}/configurations/edit`);\n },\n position: 'header',\n }\n : null;\n};\n\nConfigureTheViewAction.type = 'configure-the-view';\nConfigureTheViewAction.position = 'header';\n\nconst EditTheModelAction: DocumentActionComponent = ({ model }) => {\n const navigate = useNavigate();\n const { formatMessage } = useIntl();\n const isDesktop = useIsDesktop();\n\n return isDesktop\n ? {\n label: formatMessage({\n id: 'content-manager.link-to-ctb',\n defaultMessage: 'Edit the model',\n }),\n icon: <Pencil />,\n onClick: () => {\n navigate(`/plugins/content-type-builder/content-types/${model}`);\n },\n position: 'header',\n }\n : null;\n};\n\nEditTheModelAction.type = 'edit-the-model';\nEditTheModelAction.position = 'header';\n\nconst DeleteAction: DocumentActionComponent = ({ documentId, model, collectionType, document }) => {\n const navigate = useNavigate();\n const { formatMessage } = useIntl();\n const listViewPathMatch = useMatch(LIST_PATH);\n const canDelete = useDocumentRBAC('DeleteAction', (state) => state.canDelete);\n const { delete: deleteAction, isLoading } = useDocumentActions();\n const { toggleNotification } = useNotification();\n const setSubmitting = useForm('DeleteAction', (state) => state.setSubmitting);\n const isLocalized = document?.locale != null;\n\n return {\n disabled: !canDelete || !document,\n label: formatMessage(\n {\n id: 'content-manager.actions.delete.label',\n defaultMessage: 'Delete entry{isLocalized, select, true { (all locales)} other {}}',\n },\n { isLocalized }\n ),\n icon: <Trash />,\n dialog: {\n type: 'dialog',\n title: formatMessage({\n id: 'app.components.ConfirmDialog.title',\n defaultMessage: 'Confirmation',\n }),\n content: (\n <Flex direction=\"column\" gap={2}>\n <WarningCircle width=\"24px\" height=\"24px\" fill=\"danger600\" />\n <Typography tag=\"p\" variant=\"omega\" textAlign=\"center\">\n {formatMessage({\n id: 'content-manager.actions.delete.dialog.body',\n defaultMessage: 'Are you sure?',\n })}\n </Typography>\n </Flex>\n ),\n loading: isLoading,\n onConfirm: async () => {\n /**\n * If we have a match, we're in the list view\n * and therefore not in a form and shouldn't be\n * trying to set the submitting value.\n */\n if (!listViewPathMatch) {\n setSubmitting(true);\n }\n try {\n if (!documentId && collectionType !== SINGLE_TYPES) {\n console.error(\n \"You're trying to delete a document without an id, this is likely a bug with Strapi. Please open an issue.\"\n );\n\n toggleNotification({\n message: formatMessage({\n id: 'content-manager.actions.delete.error',\n defaultMessage: 'An error occurred while trying to delete the document.',\n }),\n type: 'danger',\n });\n\n return;\n }\n\n const res = await deleteAction({\n documentId,\n model,\n collectionType,\n params: {\n locale: '*',\n },\n });\n\n if (!('error' in res)) {\n navigate({ pathname: `../${collectionType}/${model}` }, { replace: true });\n }\n } finally {\n if (!listViewPathMatch) {\n setSubmitting(false);\n }\n }\n },\n },\n variant: 'danger',\n position: ['header', 'table-row'],\n };\n};\n\nDeleteAction.type = 'delete';\nDeleteAction.position = ['header', 'table-row'];\n\nconst DEFAULT_HEADER_ACTIONS = [EditTheModelAction, ConfigureTheViewAction, DeleteAction];\n\nexport { Header, DEFAULT_HEADER_ACTIONS };\nexport type { HeaderProps, HeaderActionDescription };\n"],"names":["Header","isCreating","status","title","documentTitle","formatMessage","useIntl","isCloning","useMatch","CLONE_PATH","params","useParams","id","defaultMessage","_jsxs","Flex","direction","alignItems","paddingTop","initial","large","paddingBottom","gap","_jsx","BackButton","fallback","collectionType","SINGLE_TYPES","undefined","COLLECTION_TYPES","slug","width","justifyContent","Typography","variant","tag","HeaderToolbar","Box","marginTop","DocumentStatus","query","useQueryParams","model","document","meta","useDoc","plugins","useStrapiApp","state","DescriptionComponentRenderer","props","activeTab","documentId","descriptions","apis","getHeaderActions","actions","length","HeaderActions","getDocumentActions","headerActions","filter","action","positions","Array","isArray","position","includes","DocumentActionsMenu","label","Information","createAndUpdateDocument","availableStatus","find","publishedAt","publishDocument","creator","CREATED_BY_ATTRIBUTE_NAME","getDisplayName","updator","UPDATED_BY_ATTRIBUTE_NAME","information","isDisplayed","PUBLISHED_AT_ATTRIBUTE_NAME","value","time","RelativeTime","timestamp","Date","isAnonymous","PUBLISHED_BY_ATTRIBUTE_NAME","author","UPDATED_AT_ATTRIBUTE_NAME","CREATED_AT_ATTRIBUTE_NAME","info","borderWidth","borderStyle","borderColor","padding","marginLeft","marginRight","map","fontWeight","textColor","dialogId","setDialogId","React","useState","handleClick","e","onClick","dialog","muteDialog","preventDefault","handleClose","options","SingleSelect","size","onChange","onSelect","aria-label","option","SingleSelectOption","type","Fragment","IconButton","disabled","icon","HeaderActionDialog","isOpen","onClose","onCancel","content","Content","Dialog","Root","open","onOpenChange","ConfigureTheViewAction","navigate","useNavigate","isDesktop","useIsDesktop","ListPlus","EditTheModelAction","Pencil","DeleteAction","listViewPathMatch","LIST_PATH","canDelete","useDocumentRBAC","delete","deleteAction","isLoading","useDocumentActions","toggleNotification","useNotification","setSubmitting","useForm","isLocalized","locale","Trash","WarningCircle","height","fill","textAlign","loading","onConfirm","console","error","message","res","pathname","replace","DEFAULT_HEADER_ACTIONS"],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ var DocumentRBAC = require('../../../features/DocumentRBAC.js');
|
|
|
9
9
|
var useDocumentContext = require('../../../hooks/useDocumentContext.js');
|
|
10
10
|
var useDocumentLayout = require('../../../hooks/useDocumentLayout.js');
|
|
11
11
|
var useLazyComponents = require('../../../hooks/useLazyComponents.js');
|
|
12
|
+
var InputPopover = require('../../../preview/components/InputPopover.js');
|
|
12
13
|
var usePreviewInputManager = require('../../../preview/hooks/usePreviewInputManager.js');
|
|
13
14
|
var BlocksInput = require('./FormInputs/BlocksInput/BlocksInput.js');
|
|
14
15
|
var Input = require('./FormInputs/Component/Input.js');
|
|
@@ -49,6 +50,8 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
|
49
50
|
const { edit: { components } } = useDocumentLayout.useDocumentLayout(currentDocumentMeta.model);
|
|
50
51
|
const collectionType = document.schema?.kind === 'collectionType' ? 'collection-types' : 'single-types';
|
|
51
52
|
const isInDynamicZone = Field.useDynamicZone('isInDynamicZone', (state)=>state.isInDynamicZone);
|
|
53
|
+
const isInPreviewPopover = InputPopover.useHasInputPopoverParent();
|
|
54
|
+
const shouldIgnorePermissions = isInDynamicZone || isInPreviewPopover;
|
|
52
55
|
const isFormDisabled = strapiAdmin.useForm('InputRenderer', (state)=>state.disabled);
|
|
53
56
|
const canCreateFields = DocumentRBAC.useDocumentRBAC('InputRenderer', (rbac)=>rbac.canCreateFields);
|
|
54
57
|
const canReadFields = DocumentRBAC.useDocumentRBAC('InputRenderer', (rbac)=>rbac.canReadFields);
|
|
@@ -61,7 +64,7 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
|
61
64
|
const editableFields = idToCheck ? canUpdateFields : canCreateFields;
|
|
62
65
|
const readableFields = idToCheck ? canReadFields : canCreateFields;
|
|
63
66
|
// Everything preview related
|
|
64
|
-
const previewProps = usePreviewInputManager.usePreviewInputManager(inputProps.name);
|
|
67
|
+
const previewProps = usePreviewInputManager.usePreviewInputManager(inputProps.name, inputProps.attribute);
|
|
65
68
|
const props = {
|
|
66
69
|
...inputProps,
|
|
67
70
|
...previewProps
|
|
@@ -83,13 +86,13 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
|
83
86
|
}
|
|
84
87
|
/**
|
|
85
88
|
* If the user can't read the field then we don't want to ever render it.
|
|
86
|
-
*/ if (!canUserReadField && !
|
|
89
|
+
*/ if (!canUserReadField && !shouldIgnorePermissions) {
|
|
87
90
|
return /*#__PURE__*/ jsxRuntime.jsx(NotAllowed.NotAllowedInput, {
|
|
88
91
|
hint: hint,
|
|
89
92
|
...props
|
|
90
93
|
});
|
|
91
94
|
}
|
|
92
|
-
const fieldIsDisabled = !canUserEditField && !
|
|
95
|
+
const fieldIsDisabled = !canUserEditField && !shouldIgnorePermissions || props.disabled || isFormDisabled;
|
|
93
96
|
/**
|
|
94
97
|
* Because a custom field has a unique prop but the type could be confused with either
|
|
95
98
|
* the useField hook or the type of the field we need to handle it separately and first.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputRenderer.js","sources":["../../../../../admin/src/pages/EditView/components/InputRenderer.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n useStrapiApp,\n useForm,\n InputRenderer as FormInputRenderer,\n useField,\n} from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\n\nimport { SINGLE_TYPES } from '../../../constants/collections';\nimport { useDocumentRBAC } from '../../../features/DocumentRBAC';\nimport { type UseDocument } from '../../../hooks/useDocument';\nimport { useDocumentContext } from '../../../hooks/useDocumentContext';\nimport { useDocumentLayout } from '../../../hooks/useDocumentLayout';\nimport { useLazyComponents } from '../../../hooks/useLazyComponents';\nimport { usePreviewInputManager } from '../../../preview/hooks/usePreviewInputManager';\n\nimport { BlocksInput } from './FormInputs/BlocksInput/BlocksInput';\nimport { ComponentInput } from './FormInputs/Component/Input';\nimport { DynamicZone, useDynamicZone } from './FormInputs/DynamicZone/Field';\nimport { NotAllowedInput } from './FormInputs/NotAllowed';\nimport { RelationsInput } from './FormInputs/Relations/Relations';\nimport { UIDInput } from './FormInputs/UID';\nimport { Wysiwyg } from './FormInputs/Wysiwyg/Field';\n\nimport type { EditFieldLayout } from '../../../hooks/useDocumentLayout';\nimport type { Schema } from '@strapi/types';\nimport type { DistributiveOmit } from 'react-redux';\n\ntype InputRendererProps = DistributiveOmit<EditFieldLayout, 'size'> & {\n document: ReturnType<UseDocument>;\n};\n\n/**\n * @internal\n *\n * @description An abstraction around the regular form input renderer designed\n * specifically to be used in the EditView of the content-manager this understands\n * the complete EditFieldLayout and will handle RBAC conditions and rendering CM specific\n * components such as Blocks / Relations.\n */\nconst InputRenderer = ({\n visible,\n hint: providedHint,\n document,\n ...inputProps\n}: InputRendererProps) => {\n const { currentDocumentMeta } = useDocumentContext('DynamicComponent');\n const {\n edit: { components },\n } = useDocumentLayout(currentDocumentMeta.model);\n\n const collectionType =\n document.schema?.kind === 'collectionType' ? 'collection-types' : 'single-types';\n\n const isInDynamicZone = useDynamicZone('isInDynamicZone', (state) => state.isInDynamicZone);\n\n const isFormDisabled = useForm('InputRenderer', (state) => state.disabled);\n const canCreateFields = useDocumentRBAC('InputRenderer', (rbac) => rbac.canCreateFields);\n const canReadFields = useDocumentRBAC('InputRenderer', (rbac) => rbac.canReadFields);\n const canUpdateFields = useDocumentRBAC('InputRenderer', (rbac) => rbac.canUpdateFields);\n const canUserAction = useDocumentRBAC('InputRenderer', (rbac) => rbac.canUserAction);\n\n let idToCheck = document.document?.documentId;\n if (collectionType === SINGLE_TYPES) {\n idToCheck = document?.document?.documentId;\n }\n\n const editableFields = idToCheck ? canUpdateFields : canCreateFields;\n const readableFields = idToCheck ? canReadFields : canCreateFields;\n\n // Everything preview related\n const previewProps = usePreviewInputManager(inputProps.name);\n const props = { ...inputProps, ...previewProps };\n\n /**\n * Component fields are always readable and editable,\n * however the fields within them may not be.\n */\n const canUserReadField = canUserAction(props.name, readableFields, props.type);\n const canUserEditField = canUserAction(props.name, editableFields, props.type);\n\n const fields = useStrapiApp('InputRenderer', (app) => app.fields);\n const { lazyComponentStore } = useLazyComponents(\n attributeHasCustomFieldProperty(props.attribute) ? [props.attribute.customField] : undefined\n );\n\n const hint = useFieldHint(providedHint, props.attribute);\n\n // We pass field in case of Custom Fields to keep backward compatibility\n const field = useField(props.name);\n\n if (!visible) {\n return null;\n }\n\n /**\n * If the user can't read the field then we don't want to ever render it.\n */\n if (!canUserReadField && !isInDynamicZone) {\n return <NotAllowedInput hint={hint} {...props} />;\n }\n\n const fieldIsDisabled =\n (!canUserEditField && !isInDynamicZone) || props.disabled || isFormDisabled;\n\n /**\n * Because a custom field has a unique prop but the type could be confused with either\n * the useField hook or the type of the field we need to handle it separately and first.\n */\n if (attributeHasCustomFieldProperty(props.attribute)) {\n const CustomInput = lazyComponentStore[props.attribute.customField];\n\n if (CustomInput) {\n return (\n <CustomInput\n {...props}\n {...field}\n // @ts-expect-error – TODO: fix this type error in the useLazyComponents hook.\n hint={hint}\n disabled={fieldIsDisabled}\n />\n );\n }\n\n return (\n <FormInputRenderer\n {...props}\n {...previewProps}\n hint={hint}\n // @ts-expect-error – this workaround lets us display that the custom field is missing.\n type={props.attribute.customField}\n disabled={fieldIsDisabled}\n />\n );\n }\n\n /**\n * This is where we handle ONLY the fields from the `useLibrary` hook.\n */\n const addedInputTypes = Object.keys(fields);\n if (!attributeHasCustomFieldProperty(props.attribute) && addedInputTypes.includes(props.type)) {\n const CustomInput = fields[props.type];\n return (\n <CustomInput\n {...props}\n // @ts-expect-error – TODO: fix this type error in the useLazyComponents hook.\n hint={hint}\n disabled={fieldIsDisabled}\n />\n );\n }\n\n /**\n * These include the content-manager specific fields, failing that we fall back\n * to the more generic form input renderer.\n */\n switch (props.type) {\n case 'blocks':\n return <BlocksInput {...props} hint={hint} type={props.type} disabled={fieldIsDisabled} />;\n case 'component':\n return (\n <ComponentInput\n {...props}\n hint={hint}\n layout={components[props.attribute.component].layout}\n disabled={fieldIsDisabled}\n >\n {(componentInputProps) => <InputRenderer {...componentInputProps} />}\n </ComponentInput>\n );\n case 'dynamiczone':\n return <DynamicZone {...props} hint={hint} disabled={fieldIsDisabled} />;\n case 'relation':\n return <RelationsInput {...props} hint={hint} disabled={fieldIsDisabled} />;\n case 'richtext':\n return <Wysiwyg {...props} hint={hint} type={props.type} disabled={fieldIsDisabled} />;\n case 'uid':\n return <UIDInput {...props} hint={hint} type={props.type} disabled={fieldIsDisabled} />;\n /**\n * Enumerations are a special case because they require options.\n */\n case 'enumeration':\n return (\n <FormInputRenderer\n {...props}\n {...previewProps}\n hint={hint}\n options={props.attribute.enum.map((value) => ({ value }))}\n // @ts-expect-error – Temp workaround so we don't forget custom-fields don't work!\n type={props.customField ? 'custom-field' : props.type}\n disabled={fieldIsDisabled}\n />\n );\n default:\n // These props are not needed for the generic form input renderer.\n const { unique: _unique, mainField: _mainField, ...restProps } = props;\n return (\n <FormInputRenderer\n {...restProps}\n {...previewProps}\n hint={hint}\n // @ts-expect-error – Temp workaround so we don't forget custom-fields don't work!\n type={props.customField ? 'custom-field' : props.type}\n disabled={fieldIsDisabled}\n />\n );\n }\n};\n\nconst attributeHasCustomFieldProperty = (\n attribute: Schema.Attribute.AnyAttribute\n): attribute is Schema.Attribute.AnyAttribute & Schema.Attribute.CustomField<string> =>\n 'customField' in attribute && typeof attribute.customField === 'string';\n\nconst useFieldHint = (\n hint: React.ReactNode = undefined,\n attribute: Schema.Attribute.AnyAttribute\n) => {\n const { formatMessage } = useIntl();\n\n const { maximum, minimum } = getMinMax(attribute);\n\n if (!maximum && !minimum) {\n return hint;\n }\n\n const units = !['biginteger', 'integer', 'number', 'dynamiczone', 'component'].includes(\n attribute.type\n )\n ? formatMessage(\n {\n id: 'content-manager.form.Input.hint.character.unit',\n defaultMessage: '{maxValue, plural, one { character} other { characters}}',\n },\n {\n maxValue: Math.max(minimum || 0, maximum || 0),\n }\n )\n : null;\n\n const hasMinAndMax = typeof minimum === 'number' && typeof maximum === 'number';\n\n return formatMessage(\n {\n id: 'content-manager.form.Input.hint.text',\n defaultMessage:\n '{min, select, undefined {} other {min. {min}}}{divider}{max, select, undefined {} other {max. {max}}}{unit}{br}{description}',\n },\n {\n min: minimum,\n max: maximum,\n description: hint,\n unit: units,\n divider: hasMinAndMax\n ? formatMessage({\n id: 'content-manager.form.Input.hint.minMaxDivider',\n defaultMessage: ' / ',\n })\n : null,\n br: <br />,\n }\n );\n};\n\nconst getMinMax = (attribute: Schema.Attribute.AnyAttribute) => {\n if ('min' in attribute || 'max' in attribute) {\n return {\n maximum: !Number.isNaN(Number(attribute.max)) ? Number(attribute.max) : undefined,\n minimum: !Number.isNaN(Number(attribute.min)) ? Number(attribute.min) : undefined,\n };\n } else if ('maxLength' in attribute || 'minLength' in attribute) {\n return { maximum: attribute.maxLength, minimum: attribute.minLength };\n } else {\n return { maximum: undefined, minimum: undefined };\n }\n};\n\nconst MemoizedInputRenderer = React.memo(InputRenderer);\n\nexport type { InputRendererProps };\nexport { MemoizedInputRenderer as InputRenderer, useFieldHint };\n"],"names":["InputRenderer","visible","hint","providedHint","document","inputProps","currentDocumentMeta","useDocumentContext","edit","components","useDocumentLayout","model","collectionType","schema","kind","isInDynamicZone","useDynamicZone","state","isFormDisabled","useForm","disabled","canCreateFields","useDocumentRBAC","rbac","canReadFields","canUpdateFields","canUserAction","idToCheck","documentId","SINGLE_TYPES","editableFields","readableFields","previewProps","usePreviewInputManager","name","props","canUserReadField","type","canUserEditField","fields","useStrapiApp","app","lazyComponentStore","useLazyComponents","attributeHasCustomFieldProperty","attribute","customField","undefined","useFieldHint","field","useField","_jsx","NotAllowedInput","fieldIsDisabled","CustomInput","FormInputRenderer","addedInputTypes","Object","keys","includes","BlocksInput","ComponentInput","layout","component","componentInputProps","DynamicZone","RelationsInput","Wysiwyg","UIDInput","options","enum","map","value","unique","_unique","mainField","_mainField","restProps","formatMessage","useIntl","maximum","minimum","getMinMax","units","id","defaultMessage","maxValue","Math","max","hasMinAndMax","min","description","unit","divider","br","Number","isNaN","maxLength","minLength","MemoizedInputRenderer","React","memo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"InputRenderer.js","sources":["../../../../../admin/src/pages/EditView/components/InputRenderer.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n useStrapiApp,\n useForm,\n InputRenderer as FormInputRenderer,\n useField,\n} from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\n\nimport { SINGLE_TYPES } from '../../../constants/collections';\nimport { useDocumentRBAC } from '../../../features/DocumentRBAC';\nimport { type UseDocument } from '../../../hooks/useDocument';\nimport { useDocumentContext } from '../../../hooks/useDocumentContext';\nimport { useDocumentLayout } from '../../../hooks/useDocumentLayout';\nimport { useLazyComponents } from '../../../hooks/useLazyComponents';\nimport { useHasInputPopoverParent } from '../../../preview/components/InputPopover';\nimport { usePreviewInputManager } from '../../../preview/hooks/usePreviewInputManager';\n\nimport { BlocksInput } from './FormInputs/BlocksInput/BlocksInput';\nimport { ComponentInput } from './FormInputs/Component/Input';\nimport { DynamicZone, useDynamicZone } from './FormInputs/DynamicZone/Field';\nimport { NotAllowedInput } from './FormInputs/NotAllowed';\nimport { RelationsInput } from './FormInputs/Relations/Relations';\nimport { UIDInput } from './FormInputs/UID';\nimport { Wysiwyg } from './FormInputs/Wysiwyg/Field';\n\nimport type { EditFieldLayout } from '../../../hooks/useDocumentLayout';\nimport type { Schema } from '@strapi/types';\nimport type { DistributiveOmit } from 'react-redux';\n\ntype InputRendererProps = DistributiveOmit<EditFieldLayout, 'size'> & {\n document: ReturnType<UseDocument>;\n};\n\n/**\n * @internal\n *\n * @description An abstraction around the regular form input renderer designed\n * specifically to be used in the EditView of the content-manager this understands\n * the complete EditFieldLayout and will handle RBAC conditions and rendering CM specific\n * components such as Blocks / Relations.\n */\nconst InputRenderer = ({\n visible,\n hint: providedHint,\n document,\n ...inputProps\n}: InputRendererProps) => {\n const { currentDocumentMeta } = useDocumentContext('DynamicComponent');\n const {\n edit: { components },\n } = useDocumentLayout(currentDocumentMeta.model);\n\n const collectionType =\n document.schema?.kind === 'collectionType' ? 'collection-types' : 'single-types';\n\n const isInDynamicZone = useDynamicZone('isInDynamicZone', (state) => state.isInDynamicZone);\n const isInPreviewPopover = useHasInputPopoverParent();\n const shouldIgnorePermissions = isInDynamicZone || isInPreviewPopover;\n\n const isFormDisabled = useForm('InputRenderer', (state) => state.disabled);\n const canCreateFields = useDocumentRBAC('InputRenderer', (rbac) => rbac.canCreateFields);\n const canReadFields = useDocumentRBAC('InputRenderer', (rbac) => rbac.canReadFields);\n const canUpdateFields = useDocumentRBAC('InputRenderer', (rbac) => rbac.canUpdateFields);\n const canUserAction = useDocumentRBAC('InputRenderer', (rbac) => rbac.canUserAction);\n\n let idToCheck = document.document?.documentId;\n if (collectionType === SINGLE_TYPES) {\n idToCheck = document?.document?.documentId;\n }\n\n const editableFields = idToCheck ? canUpdateFields : canCreateFields;\n const readableFields = idToCheck ? canReadFields : canCreateFields;\n\n // Everything preview related\n const previewProps = usePreviewInputManager(inputProps.name, inputProps.attribute);\n const props = { ...inputProps, ...previewProps };\n\n /**\n * Component fields are always readable and editable,\n * however the fields within them may not be.\n */\n const canUserReadField = canUserAction(props.name, readableFields, props.type);\n const canUserEditField = canUserAction(props.name, editableFields, props.type);\n\n const fields = useStrapiApp('InputRenderer', (app) => app.fields);\n const { lazyComponentStore } = useLazyComponents(\n attributeHasCustomFieldProperty(props.attribute) ? [props.attribute.customField] : undefined\n );\n\n const hint = useFieldHint(providedHint, props.attribute);\n\n // We pass field in case of Custom Fields to keep backward compatibility\n const field = useField(props.name);\n\n if (!visible) {\n return null;\n }\n\n /**\n * If the user can't read the field then we don't want to ever render it.\n */\n if (!canUserReadField && !shouldIgnorePermissions) {\n return <NotAllowedInput hint={hint} {...props} />;\n }\n\n const fieldIsDisabled =\n (!canUserEditField && !shouldIgnorePermissions) || props.disabled || isFormDisabled;\n\n /**\n * Because a custom field has a unique prop but the type could be confused with either\n * the useField hook or the type of the field we need to handle it separately and first.\n */\n if (attributeHasCustomFieldProperty(props.attribute)) {\n const CustomInput = lazyComponentStore[props.attribute.customField];\n\n if (CustomInput) {\n return (\n <CustomInput\n {...props}\n {...field}\n // @ts-expect-error – TODO: fix this type error in the useLazyComponents hook.\n hint={hint}\n disabled={fieldIsDisabled}\n />\n );\n }\n\n return (\n <FormInputRenderer\n {...props}\n {...previewProps}\n hint={hint}\n // @ts-expect-error – this workaround lets us display that the custom field is missing.\n type={props.attribute.customField}\n disabled={fieldIsDisabled}\n />\n );\n }\n\n /**\n * This is where we handle ONLY the fields from the `useLibrary` hook.\n */\n const addedInputTypes = Object.keys(fields);\n if (!attributeHasCustomFieldProperty(props.attribute) && addedInputTypes.includes(props.type)) {\n const CustomInput = fields[props.type];\n return (\n <CustomInput\n {...props}\n // @ts-expect-error – TODO: fix this type error in the useLazyComponents hook.\n hint={hint}\n disabled={fieldIsDisabled}\n />\n );\n }\n\n /**\n * These include the content-manager specific fields, failing that we fall back\n * to the more generic form input renderer.\n */\n switch (props.type) {\n case 'blocks':\n return <BlocksInput {...props} hint={hint} type={props.type} disabled={fieldIsDisabled} />;\n case 'component':\n return (\n <ComponentInput\n {...props}\n hint={hint}\n layout={components[props.attribute.component].layout}\n disabled={fieldIsDisabled}\n >\n {(componentInputProps) => <InputRenderer {...componentInputProps} />}\n </ComponentInput>\n );\n case 'dynamiczone':\n return <DynamicZone {...props} hint={hint} disabled={fieldIsDisabled} />;\n case 'relation':\n return <RelationsInput {...props} hint={hint} disabled={fieldIsDisabled} />;\n case 'richtext':\n return <Wysiwyg {...props} hint={hint} type={props.type} disabled={fieldIsDisabled} />;\n case 'uid':\n return <UIDInput {...props} hint={hint} type={props.type} disabled={fieldIsDisabled} />;\n /**\n * Enumerations are a special case because they require options.\n */\n case 'enumeration':\n return (\n <FormInputRenderer\n {...props}\n {...previewProps}\n hint={hint}\n options={props.attribute.enum.map((value) => ({ value }))}\n // @ts-expect-error – Temp workaround so we don't forget custom-fields don't work!\n type={props.customField ? 'custom-field' : props.type}\n disabled={fieldIsDisabled}\n />\n );\n default:\n // These props are not needed for the generic form input renderer.\n const { unique: _unique, mainField: _mainField, ...restProps } = props;\n return (\n <FormInputRenderer\n {...restProps}\n {...previewProps}\n hint={hint}\n // @ts-expect-error – Temp workaround so we don't forget custom-fields don't work!\n type={props.customField ? 'custom-field' : props.type}\n disabled={fieldIsDisabled}\n />\n );\n }\n};\n\nconst attributeHasCustomFieldProperty = (\n attribute: Schema.Attribute.AnyAttribute\n): attribute is Schema.Attribute.AnyAttribute & Schema.Attribute.CustomField<string> =>\n 'customField' in attribute && typeof attribute.customField === 'string';\n\nconst useFieldHint = (\n hint: React.ReactNode = undefined,\n attribute: Schema.Attribute.AnyAttribute\n) => {\n const { formatMessage } = useIntl();\n\n const { maximum, minimum } = getMinMax(attribute);\n\n if (!maximum && !minimum) {\n return hint;\n }\n\n const units = !['biginteger', 'integer', 'number', 'dynamiczone', 'component'].includes(\n attribute.type\n )\n ? formatMessage(\n {\n id: 'content-manager.form.Input.hint.character.unit',\n defaultMessage: '{maxValue, plural, one { character} other { characters}}',\n },\n {\n maxValue: Math.max(minimum || 0, maximum || 0),\n }\n )\n : null;\n\n const hasMinAndMax = typeof minimum === 'number' && typeof maximum === 'number';\n\n return formatMessage(\n {\n id: 'content-manager.form.Input.hint.text',\n defaultMessage:\n '{min, select, undefined {} other {min. {min}}}{divider}{max, select, undefined {} other {max. {max}}}{unit}{br}{description}',\n },\n {\n min: minimum,\n max: maximum,\n description: hint,\n unit: units,\n divider: hasMinAndMax\n ? formatMessage({\n id: 'content-manager.form.Input.hint.minMaxDivider',\n defaultMessage: ' / ',\n })\n : null,\n br: <br />,\n }\n );\n};\n\nconst getMinMax = (attribute: Schema.Attribute.AnyAttribute) => {\n if ('min' in attribute || 'max' in attribute) {\n return {\n maximum: !Number.isNaN(Number(attribute.max)) ? Number(attribute.max) : undefined,\n minimum: !Number.isNaN(Number(attribute.min)) ? Number(attribute.min) : undefined,\n };\n } else if ('maxLength' in attribute || 'minLength' in attribute) {\n return { maximum: attribute.maxLength, minimum: attribute.minLength };\n } else {\n return { maximum: undefined, minimum: undefined };\n }\n};\n\nconst MemoizedInputRenderer = React.memo(InputRenderer);\n\nexport type { InputRendererProps };\nexport { MemoizedInputRenderer as InputRenderer, useFieldHint };\n"],"names":["InputRenderer","visible","hint","providedHint","document","inputProps","currentDocumentMeta","useDocumentContext","edit","components","useDocumentLayout","model","collectionType","schema","kind","isInDynamicZone","useDynamicZone","state","isInPreviewPopover","useHasInputPopoverParent","shouldIgnorePermissions","isFormDisabled","useForm","disabled","canCreateFields","useDocumentRBAC","rbac","canReadFields","canUpdateFields","canUserAction","idToCheck","documentId","SINGLE_TYPES","editableFields","readableFields","previewProps","usePreviewInputManager","name","attribute","props","canUserReadField","type","canUserEditField","fields","useStrapiApp","app","lazyComponentStore","useLazyComponents","attributeHasCustomFieldProperty","customField","undefined","useFieldHint","field","useField","_jsx","NotAllowedInput","fieldIsDisabled","CustomInput","FormInputRenderer","addedInputTypes","Object","keys","includes","BlocksInput","ComponentInput","layout","component","componentInputProps","DynamicZone","RelationsInput","Wysiwyg","UIDInput","options","enum","map","value","unique","_unique","mainField","_mainField","restProps","formatMessage","useIntl","maximum","minimum","getMinMax","units","id","defaultMessage","maxValue","Math","max","hasMinAndMax","min","description","unit","divider","br","Number","isNaN","maxLength","minLength","MemoizedInputRenderer","React","memo"],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ import { useDocumentRBAC } from '../../../features/DocumentRBAC.mjs';
|
|
|
7
7
|
import { useDocumentContext } from '../../../hooks/useDocumentContext.mjs';
|
|
8
8
|
import { useDocumentLayout } from '../../../hooks/useDocumentLayout.mjs';
|
|
9
9
|
import { useLazyComponents } from '../../../hooks/useLazyComponents.mjs';
|
|
10
|
+
import { useHasInputPopoverParent } from '../../../preview/components/InputPopover.mjs';
|
|
10
11
|
import { usePreviewInputManager } from '../../../preview/hooks/usePreviewInputManager.mjs';
|
|
11
12
|
import { BlocksInput as MemoizedBlocksInput } from './FormInputs/BlocksInput/BlocksInput.mjs';
|
|
12
13
|
import { ComponentInput as MemoizedComponentInput } from './FormInputs/Component/Input.mjs';
|
|
@@ -28,6 +29,8 @@ import { Wysiwyg as MemoizedWysiwyg } from './FormInputs/Wysiwyg/Field.mjs';
|
|
|
28
29
|
const { edit: { components } } = useDocumentLayout(currentDocumentMeta.model);
|
|
29
30
|
const collectionType = document.schema?.kind === 'collectionType' ? 'collection-types' : 'single-types';
|
|
30
31
|
const isInDynamicZone = useDynamicZone('isInDynamicZone', (state)=>state.isInDynamicZone);
|
|
32
|
+
const isInPreviewPopover = useHasInputPopoverParent();
|
|
33
|
+
const shouldIgnorePermissions = isInDynamicZone || isInPreviewPopover;
|
|
31
34
|
const isFormDisabled = useForm('InputRenderer', (state)=>state.disabled);
|
|
32
35
|
const canCreateFields = useDocumentRBAC('InputRenderer', (rbac)=>rbac.canCreateFields);
|
|
33
36
|
const canReadFields = useDocumentRBAC('InputRenderer', (rbac)=>rbac.canReadFields);
|
|
@@ -40,7 +43,7 @@ import { Wysiwyg as MemoizedWysiwyg } from './FormInputs/Wysiwyg/Field.mjs';
|
|
|
40
43
|
const editableFields = idToCheck ? canUpdateFields : canCreateFields;
|
|
41
44
|
const readableFields = idToCheck ? canReadFields : canCreateFields;
|
|
42
45
|
// Everything preview related
|
|
43
|
-
const previewProps = usePreviewInputManager(inputProps.name);
|
|
46
|
+
const previewProps = usePreviewInputManager(inputProps.name, inputProps.attribute);
|
|
44
47
|
const props = {
|
|
45
48
|
...inputProps,
|
|
46
49
|
...previewProps
|
|
@@ -62,13 +65,13 @@ import { Wysiwyg as MemoizedWysiwyg } from './FormInputs/Wysiwyg/Field.mjs';
|
|
|
62
65
|
}
|
|
63
66
|
/**
|
|
64
67
|
* If the user can't read the field then we don't want to ever render it.
|
|
65
|
-
*/ if (!canUserReadField && !
|
|
68
|
+
*/ if (!canUserReadField && !shouldIgnorePermissions) {
|
|
66
69
|
return /*#__PURE__*/ jsx(NotAllowedInput, {
|
|
67
70
|
hint: hint,
|
|
68
71
|
...props
|
|
69
72
|
});
|
|
70
73
|
}
|
|
71
|
-
const fieldIsDisabled = !canUserEditField && !
|
|
74
|
+
const fieldIsDisabled = !canUserEditField && !shouldIgnorePermissions || props.disabled || isFormDisabled;
|
|
72
75
|
/**
|
|
73
76
|
* Because a custom field has a unique prop but the type could be confused with either
|
|
74
77
|
* the useField hook or the type of the field we need to handle it separately and first.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputRenderer.mjs","sources":["../../../../../admin/src/pages/EditView/components/InputRenderer.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n useStrapiApp,\n useForm,\n InputRenderer as FormInputRenderer,\n useField,\n} from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\n\nimport { SINGLE_TYPES } from '../../../constants/collections';\nimport { useDocumentRBAC } from '../../../features/DocumentRBAC';\nimport { type UseDocument } from '../../../hooks/useDocument';\nimport { useDocumentContext } from '../../../hooks/useDocumentContext';\nimport { useDocumentLayout } from '../../../hooks/useDocumentLayout';\nimport { useLazyComponents } from '../../../hooks/useLazyComponents';\nimport { usePreviewInputManager } from '../../../preview/hooks/usePreviewInputManager';\n\nimport { BlocksInput } from './FormInputs/BlocksInput/BlocksInput';\nimport { ComponentInput } from './FormInputs/Component/Input';\nimport { DynamicZone, useDynamicZone } from './FormInputs/DynamicZone/Field';\nimport { NotAllowedInput } from './FormInputs/NotAllowed';\nimport { RelationsInput } from './FormInputs/Relations/Relations';\nimport { UIDInput } from './FormInputs/UID';\nimport { Wysiwyg } from './FormInputs/Wysiwyg/Field';\n\nimport type { EditFieldLayout } from '../../../hooks/useDocumentLayout';\nimport type { Schema } from '@strapi/types';\nimport type { DistributiveOmit } from 'react-redux';\n\ntype InputRendererProps = DistributiveOmit<EditFieldLayout, 'size'> & {\n document: ReturnType<UseDocument>;\n};\n\n/**\n * @internal\n *\n * @description An abstraction around the regular form input renderer designed\n * specifically to be used in the EditView of the content-manager this understands\n * the complete EditFieldLayout and will handle RBAC conditions and rendering CM specific\n * components such as Blocks / Relations.\n */\nconst InputRenderer = ({\n visible,\n hint: providedHint,\n document,\n ...inputProps\n}: InputRendererProps) => {\n const { currentDocumentMeta } = useDocumentContext('DynamicComponent');\n const {\n edit: { components },\n } = useDocumentLayout(currentDocumentMeta.model);\n\n const collectionType =\n document.schema?.kind === 'collectionType' ? 'collection-types' : 'single-types';\n\n const isInDynamicZone = useDynamicZone('isInDynamicZone', (state) => state.isInDynamicZone);\n\n const isFormDisabled = useForm('InputRenderer', (state) => state.disabled);\n const canCreateFields = useDocumentRBAC('InputRenderer', (rbac) => rbac.canCreateFields);\n const canReadFields = useDocumentRBAC('InputRenderer', (rbac) => rbac.canReadFields);\n const canUpdateFields = useDocumentRBAC('InputRenderer', (rbac) => rbac.canUpdateFields);\n const canUserAction = useDocumentRBAC('InputRenderer', (rbac) => rbac.canUserAction);\n\n let idToCheck = document.document?.documentId;\n if (collectionType === SINGLE_TYPES) {\n idToCheck = document?.document?.documentId;\n }\n\n const editableFields = idToCheck ? canUpdateFields : canCreateFields;\n const readableFields = idToCheck ? canReadFields : canCreateFields;\n\n // Everything preview related\n const previewProps = usePreviewInputManager(inputProps.name);\n const props = { ...inputProps, ...previewProps };\n\n /**\n * Component fields are always readable and editable,\n * however the fields within them may not be.\n */\n const canUserReadField = canUserAction(props.name, readableFields, props.type);\n const canUserEditField = canUserAction(props.name, editableFields, props.type);\n\n const fields = useStrapiApp('InputRenderer', (app) => app.fields);\n const { lazyComponentStore } = useLazyComponents(\n attributeHasCustomFieldProperty(props.attribute) ? [props.attribute.customField] : undefined\n );\n\n const hint = useFieldHint(providedHint, props.attribute);\n\n // We pass field in case of Custom Fields to keep backward compatibility\n const field = useField(props.name);\n\n if (!visible) {\n return null;\n }\n\n /**\n * If the user can't read the field then we don't want to ever render it.\n */\n if (!canUserReadField && !isInDynamicZone) {\n return <NotAllowedInput hint={hint} {...props} />;\n }\n\n const fieldIsDisabled =\n (!canUserEditField && !isInDynamicZone) || props.disabled || isFormDisabled;\n\n /**\n * Because a custom field has a unique prop but the type could be confused with either\n * the useField hook or the type of the field we need to handle it separately and first.\n */\n if (attributeHasCustomFieldProperty(props.attribute)) {\n const CustomInput = lazyComponentStore[props.attribute.customField];\n\n if (CustomInput) {\n return (\n <CustomInput\n {...props}\n {...field}\n // @ts-expect-error – TODO: fix this type error in the useLazyComponents hook.\n hint={hint}\n disabled={fieldIsDisabled}\n />\n );\n }\n\n return (\n <FormInputRenderer\n {...props}\n {...previewProps}\n hint={hint}\n // @ts-expect-error – this workaround lets us display that the custom field is missing.\n type={props.attribute.customField}\n disabled={fieldIsDisabled}\n />\n );\n }\n\n /**\n * This is where we handle ONLY the fields from the `useLibrary` hook.\n */\n const addedInputTypes = Object.keys(fields);\n if (!attributeHasCustomFieldProperty(props.attribute) && addedInputTypes.includes(props.type)) {\n const CustomInput = fields[props.type];\n return (\n <CustomInput\n {...props}\n // @ts-expect-error – TODO: fix this type error in the useLazyComponents hook.\n hint={hint}\n disabled={fieldIsDisabled}\n />\n );\n }\n\n /**\n * These include the content-manager specific fields, failing that we fall back\n * to the more generic form input renderer.\n */\n switch (props.type) {\n case 'blocks':\n return <BlocksInput {...props} hint={hint} type={props.type} disabled={fieldIsDisabled} />;\n case 'component':\n return (\n <ComponentInput\n {...props}\n hint={hint}\n layout={components[props.attribute.component].layout}\n disabled={fieldIsDisabled}\n >\n {(componentInputProps) => <InputRenderer {...componentInputProps} />}\n </ComponentInput>\n );\n case 'dynamiczone':\n return <DynamicZone {...props} hint={hint} disabled={fieldIsDisabled} />;\n case 'relation':\n return <RelationsInput {...props} hint={hint} disabled={fieldIsDisabled} />;\n case 'richtext':\n return <Wysiwyg {...props} hint={hint} type={props.type} disabled={fieldIsDisabled} />;\n case 'uid':\n return <UIDInput {...props} hint={hint} type={props.type} disabled={fieldIsDisabled} />;\n /**\n * Enumerations are a special case because they require options.\n */\n case 'enumeration':\n return (\n <FormInputRenderer\n {...props}\n {...previewProps}\n hint={hint}\n options={props.attribute.enum.map((value) => ({ value }))}\n // @ts-expect-error – Temp workaround so we don't forget custom-fields don't work!\n type={props.customField ? 'custom-field' : props.type}\n disabled={fieldIsDisabled}\n />\n );\n default:\n // These props are not needed for the generic form input renderer.\n const { unique: _unique, mainField: _mainField, ...restProps } = props;\n return (\n <FormInputRenderer\n {...restProps}\n {...previewProps}\n hint={hint}\n // @ts-expect-error – Temp workaround so we don't forget custom-fields don't work!\n type={props.customField ? 'custom-field' : props.type}\n disabled={fieldIsDisabled}\n />\n );\n }\n};\n\nconst attributeHasCustomFieldProperty = (\n attribute: Schema.Attribute.AnyAttribute\n): attribute is Schema.Attribute.AnyAttribute & Schema.Attribute.CustomField<string> =>\n 'customField' in attribute && typeof attribute.customField === 'string';\n\nconst useFieldHint = (\n hint: React.ReactNode = undefined,\n attribute: Schema.Attribute.AnyAttribute\n) => {\n const { formatMessage } = useIntl();\n\n const { maximum, minimum } = getMinMax(attribute);\n\n if (!maximum && !minimum) {\n return hint;\n }\n\n const units = !['biginteger', 'integer', 'number', 'dynamiczone', 'component'].includes(\n attribute.type\n )\n ? formatMessage(\n {\n id: 'content-manager.form.Input.hint.character.unit',\n defaultMessage: '{maxValue, plural, one { character} other { characters}}',\n },\n {\n maxValue: Math.max(minimum || 0, maximum || 0),\n }\n )\n : null;\n\n const hasMinAndMax = typeof minimum === 'number' && typeof maximum === 'number';\n\n return formatMessage(\n {\n id: 'content-manager.form.Input.hint.text',\n defaultMessage:\n '{min, select, undefined {} other {min. {min}}}{divider}{max, select, undefined {} other {max. {max}}}{unit}{br}{description}',\n },\n {\n min: minimum,\n max: maximum,\n description: hint,\n unit: units,\n divider: hasMinAndMax\n ? formatMessage({\n id: 'content-manager.form.Input.hint.minMaxDivider',\n defaultMessage: ' / ',\n })\n : null,\n br: <br />,\n }\n );\n};\n\nconst getMinMax = (attribute: Schema.Attribute.AnyAttribute) => {\n if ('min' in attribute || 'max' in attribute) {\n return {\n maximum: !Number.isNaN(Number(attribute.max)) ? Number(attribute.max) : undefined,\n minimum: !Number.isNaN(Number(attribute.min)) ? Number(attribute.min) : undefined,\n };\n } else if ('maxLength' in attribute || 'minLength' in attribute) {\n return { maximum: attribute.maxLength, minimum: attribute.minLength };\n } else {\n return { maximum: undefined, minimum: undefined };\n }\n};\n\nconst MemoizedInputRenderer = React.memo(InputRenderer);\n\nexport type { InputRendererProps };\nexport { MemoizedInputRenderer as InputRenderer, useFieldHint };\n"],"names":["InputRenderer","visible","hint","providedHint","document","inputProps","currentDocumentMeta","useDocumentContext","edit","components","useDocumentLayout","model","collectionType","schema","kind","isInDynamicZone","useDynamicZone","state","isFormDisabled","useForm","disabled","canCreateFields","useDocumentRBAC","rbac","canReadFields","canUpdateFields","canUserAction","idToCheck","documentId","SINGLE_TYPES","editableFields","readableFields","previewProps","usePreviewInputManager","name","props","canUserReadField","type","canUserEditField","fields","useStrapiApp","app","lazyComponentStore","useLazyComponents","attributeHasCustomFieldProperty","attribute","customField","undefined","useFieldHint","field","useField","_jsx","NotAllowedInput","fieldIsDisabled","CustomInput","FormInputRenderer","addedInputTypes","Object","keys","includes","BlocksInput","ComponentInput","layout","component","componentInputProps","DynamicZone","RelationsInput","Wysiwyg","UIDInput","options","enum","map","value","unique","_unique","mainField","_mainField","restProps","formatMessage","useIntl","maximum","minimum","getMinMax","units","id","defaultMessage","maxValue","Math","max","hasMinAndMax","min","description","unit","divider","br","Number","isNaN","maxLength","minLength","MemoizedInputRenderer","React","memo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"InputRenderer.mjs","sources":["../../../../../admin/src/pages/EditView/components/InputRenderer.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n useStrapiApp,\n useForm,\n InputRenderer as FormInputRenderer,\n useField,\n} from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\n\nimport { SINGLE_TYPES } from '../../../constants/collections';\nimport { useDocumentRBAC } from '../../../features/DocumentRBAC';\nimport { type UseDocument } from '../../../hooks/useDocument';\nimport { useDocumentContext } from '../../../hooks/useDocumentContext';\nimport { useDocumentLayout } from '../../../hooks/useDocumentLayout';\nimport { useLazyComponents } from '../../../hooks/useLazyComponents';\nimport { useHasInputPopoverParent } from '../../../preview/components/InputPopover';\nimport { usePreviewInputManager } from '../../../preview/hooks/usePreviewInputManager';\n\nimport { BlocksInput } from './FormInputs/BlocksInput/BlocksInput';\nimport { ComponentInput } from './FormInputs/Component/Input';\nimport { DynamicZone, useDynamicZone } from './FormInputs/DynamicZone/Field';\nimport { NotAllowedInput } from './FormInputs/NotAllowed';\nimport { RelationsInput } from './FormInputs/Relations/Relations';\nimport { UIDInput } from './FormInputs/UID';\nimport { Wysiwyg } from './FormInputs/Wysiwyg/Field';\n\nimport type { EditFieldLayout } from '../../../hooks/useDocumentLayout';\nimport type { Schema } from '@strapi/types';\nimport type { DistributiveOmit } from 'react-redux';\n\ntype InputRendererProps = DistributiveOmit<EditFieldLayout, 'size'> & {\n document: ReturnType<UseDocument>;\n};\n\n/**\n * @internal\n *\n * @description An abstraction around the regular form input renderer designed\n * specifically to be used in the EditView of the content-manager this understands\n * the complete EditFieldLayout and will handle RBAC conditions and rendering CM specific\n * components such as Blocks / Relations.\n */\nconst InputRenderer = ({\n visible,\n hint: providedHint,\n document,\n ...inputProps\n}: InputRendererProps) => {\n const { currentDocumentMeta } = useDocumentContext('DynamicComponent');\n const {\n edit: { components },\n } = useDocumentLayout(currentDocumentMeta.model);\n\n const collectionType =\n document.schema?.kind === 'collectionType' ? 'collection-types' : 'single-types';\n\n const isInDynamicZone = useDynamicZone('isInDynamicZone', (state) => state.isInDynamicZone);\n const isInPreviewPopover = useHasInputPopoverParent();\n const shouldIgnorePermissions = isInDynamicZone || isInPreviewPopover;\n\n const isFormDisabled = useForm('InputRenderer', (state) => state.disabled);\n const canCreateFields = useDocumentRBAC('InputRenderer', (rbac) => rbac.canCreateFields);\n const canReadFields = useDocumentRBAC('InputRenderer', (rbac) => rbac.canReadFields);\n const canUpdateFields = useDocumentRBAC('InputRenderer', (rbac) => rbac.canUpdateFields);\n const canUserAction = useDocumentRBAC('InputRenderer', (rbac) => rbac.canUserAction);\n\n let idToCheck = document.document?.documentId;\n if (collectionType === SINGLE_TYPES) {\n idToCheck = document?.document?.documentId;\n }\n\n const editableFields = idToCheck ? canUpdateFields : canCreateFields;\n const readableFields = idToCheck ? canReadFields : canCreateFields;\n\n // Everything preview related\n const previewProps = usePreviewInputManager(inputProps.name, inputProps.attribute);\n const props = { ...inputProps, ...previewProps };\n\n /**\n * Component fields are always readable and editable,\n * however the fields within them may not be.\n */\n const canUserReadField = canUserAction(props.name, readableFields, props.type);\n const canUserEditField = canUserAction(props.name, editableFields, props.type);\n\n const fields = useStrapiApp('InputRenderer', (app) => app.fields);\n const { lazyComponentStore } = useLazyComponents(\n attributeHasCustomFieldProperty(props.attribute) ? [props.attribute.customField] : undefined\n );\n\n const hint = useFieldHint(providedHint, props.attribute);\n\n // We pass field in case of Custom Fields to keep backward compatibility\n const field = useField(props.name);\n\n if (!visible) {\n return null;\n }\n\n /**\n * If the user can't read the field then we don't want to ever render it.\n */\n if (!canUserReadField && !shouldIgnorePermissions) {\n return <NotAllowedInput hint={hint} {...props} />;\n }\n\n const fieldIsDisabled =\n (!canUserEditField && !shouldIgnorePermissions) || props.disabled || isFormDisabled;\n\n /**\n * Because a custom field has a unique prop but the type could be confused with either\n * the useField hook or the type of the field we need to handle it separately and first.\n */\n if (attributeHasCustomFieldProperty(props.attribute)) {\n const CustomInput = lazyComponentStore[props.attribute.customField];\n\n if (CustomInput) {\n return (\n <CustomInput\n {...props}\n {...field}\n // @ts-expect-error – TODO: fix this type error in the useLazyComponents hook.\n hint={hint}\n disabled={fieldIsDisabled}\n />\n );\n }\n\n return (\n <FormInputRenderer\n {...props}\n {...previewProps}\n hint={hint}\n // @ts-expect-error – this workaround lets us display that the custom field is missing.\n type={props.attribute.customField}\n disabled={fieldIsDisabled}\n />\n );\n }\n\n /**\n * This is where we handle ONLY the fields from the `useLibrary` hook.\n */\n const addedInputTypes = Object.keys(fields);\n if (!attributeHasCustomFieldProperty(props.attribute) && addedInputTypes.includes(props.type)) {\n const CustomInput = fields[props.type];\n return (\n <CustomInput\n {...props}\n // @ts-expect-error – TODO: fix this type error in the useLazyComponents hook.\n hint={hint}\n disabled={fieldIsDisabled}\n />\n );\n }\n\n /**\n * These include the content-manager specific fields, failing that we fall back\n * to the more generic form input renderer.\n */\n switch (props.type) {\n case 'blocks':\n return <BlocksInput {...props} hint={hint} type={props.type} disabled={fieldIsDisabled} />;\n case 'component':\n return (\n <ComponentInput\n {...props}\n hint={hint}\n layout={components[props.attribute.component].layout}\n disabled={fieldIsDisabled}\n >\n {(componentInputProps) => <InputRenderer {...componentInputProps} />}\n </ComponentInput>\n );\n case 'dynamiczone':\n return <DynamicZone {...props} hint={hint} disabled={fieldIsDisabled} />;\n case 'relation':\n return <RelationsInput {...props} hint={hint} disabled={fieldIsDisabled} />;\n case 'richtext':\n return <Wysiwyg {...props} hint={hint} type={props.type} disabled={fieldIsDisabled} />;\n case 'uid':\n return <UIDInput {...props} hint={hint} type={props.type} disabled={fieldIsDisabled} />;\n /**\n * Enumerations are a special case because they require options.\n */\n case 'enumeration':\n return (\n <FormInputRenderer\n {...props}\n {...previewProps}\n hint={hint}\n options={props.attribute.enum.map((value) => ({ value }))}\n // @ts-expect-error – Temp workaround so we don't forget custom-fields don't work!\n type={props.customField ? 'custom-field' : props.type}\n disabled={fieldIsDisabled}\n />\n );\n default:\n // These props are not needed for the generic form input renderer.\n const { unique: _unique, mainField: _mainField, ...restProps } = props;\n return (\n <FormInputRenderer\n {...restProps}\n {...previewProps}\n hint={hint}\n // @ts-expect-error – Temp workaround so we don't forget custom-fields don't work!\n type={props.customField ? 'custom-field' : props.type}\n disabled={fieldIsDisabled}\n />\n );\n }\n};\n\nconst attributeHasCustomFieldProperty = (\n attribute: Schema.Attribute.AnyAttribute\n): attribute is Schema.Attribute.AnyAttribute & Schema.Attribute.CustomField<string> =>\n 'customField' in attribute && typeof attribute.customField === 'string';\n\nconst useFieldHint = (\n hint: React.ReactNode = undefined,\n attribute: Schema.Attribute.AnyAttribute\n) => {\n const { formatMessage } = useIntl();\n\n const { maximum, minimum } = getMinMax(attribute);\n\n if (!maximum && !minimum) {\n return hint;\n }\n\n const units = !['biginteger', 'integer', 'number', 'dynamiczone', 'component'].includes(\n attribute.type\n )\n ? formatMessage(\n {\n id: 'content-manager.form.Input.hint.character.unit',\n defaultMessage: '{maxValue, plural, one { character} other { characters}}',\n },\n {\n maxValue: Math.max(minimum || 0, maximum || 0),\n }\n )\n : null;\n\n const hasMinAndMax = typeof minimum === 'number' && typeof maximum === 'number';\n\n return formatMessage(\n {\n id: 'content-manager.form.Input.hint.text',\n defaultMessage:\n '{min, select, undefined {} other {min. {min}}}{divider}{max, select, undefined {} other {max. {max}}}{unit}{br}{description}',\n },\n {\n min: minimum,\n max: maximum,\n description: hint,\n unit: units,\n divider: hasMinAndMax\n ? formatMessage({\n id: 'content-manager.form.Input.hint.minMaxDivider',\n defaultMessage: ' / ',\n })\n : null,\n br: <br />,\n }\n );\n};\n\nconst getMinMax = (attribute: Schema.Attribute.AnyAttribute) => {\n if ('min' in attribute || 'max' in attribute) {\n return {\n maximum: !Number.isNaN(Number(attribute.max)) ? Number(attribute.max) : undefined,\n minimum: !Number.isNaN(Number(attribute.min)) ? Number(attribute.min) : undefined,\n };\n } else if ('maxLength' in attribute || 'minLength' in attribute) {\n return { maximum: attribute.maxLength, minimum: attribute.minLength };\n } else {\n return { maximum: undefined, minimum: undefined };\n }\n};\n\nconst MemoizedInputRenderer = React.memo(InputRenderer);\n\nexport type { InputRendererProps };\nexport { MemoizedInputRenderer as InputRenderer, useFieldHint };\n"],"names":["InputRenderer","visible","hint","providedHint","document","inputProps","currentDocumentMeta","useDocumentContext","edit","components","useDocumentLayout","model","collectionType","schema","kind","isInDynamicZone","useDynamicZone","state","isInPreviewPopover","useHasInputPopoverParent","shouldIgnorePermissions","isFormDisabled","useForm","disabled","canCreateFields","useDocumentRBAC","rbac","canReadFields","canUpdateFields","canUserAction","idToCheck","documentId","SINGLE_TYPES","editableFields","readableFields","previewProps","usePreviewInputManager","name","attribute","props","canUserReadField","type","canUserEditField","fields","useStrapiApp","app","lazyComponentStore","useLazyComponents","attributeHasCustomFieldProperty","customField","undefined","useFieldHint","field","useField","_jsx","NotAllowedInput","fieldIsDisabled","CustomInput","FormInputRenderer","addedInputTypes","Object","keys","includes","BlocksInput","ComponentInput","layout","component","componentInputProps","DynamicZone","RelationsInput","Wysiwyg","UIDInput","options","enum","map","value","unique","_unique","mainField","_mainField","restProps","formatMessage","useIntl","maximum","minimum","getMinMax","units","id","defaultMessage","maxValue","Math","max","hasMinAndMax","min","description","unit","divider","br","Number","isNaN","maxLength","minLength","MemoizedInputRenderer","React","memo"],"mappings":"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"}
|
|
@@ -176,7 +176,7 @@ const BLOCK_LIST_ATTRIBUTE_KEYS = [
|
|
|
176
176
|
// 🔹 Handle components
|
|
177
177
|
if (attrDef.type === 'component') {
|
|
178
178
|
const compSchema = components[attrDef.component];
|
|
179
|
-
const value = currentValue
|
|
179
|
+
const value = currentValue === undefined ? initialValue : currentValue;
|
|
180
180
|
if (!value) {
|
|
181
181
|
result[attrName] = attrDef.repeatable ? [] : null;
|
|
182
182
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.js","sources":["../../../../../admin/src/pages/EditView/utils/data.ts"],"sourcesContent":["import { createRulesEngine } from '@strapi/admin/strapi-admin';\nimport { generateNKeysBetween } from 'fractional-indexing';\nimport pipe from 'lodash/fp/pipe';\n\nimport { DOCUMENT_META_FIELDS } from '../../../constants/attributes';\n\nimport type { ComponentsDictionary, Document } from '../../../hooks/useDocument';\nimport type { Schema, UID } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * traverseData\n * -----------------------------------------------------------------------------------------------*/\n\n// Make only attributes required since it's the only one Content History has\ntype PartialSchema = Partial<Schema.Schema> & Pick<Schema.Schema, 'attributes'>;\n\ntype Predicate = <TAttribute extends Schema.Attribute.AnyAttribute>(\n attribute: TAttribute,\n value: Schema.Attribute.Value<TAttribute>\n) => boolean;\ntype Transform = <TAttribute extends Schema.Attribute.AnyAttribute>(\n value: any,\n attribute: TAttribute\n) => any;\ntype AnyData = Omit<Document, 'id'>;\n\nconst BLOCK_LIST_ATTRIBUTE_KEYS = ['__component', '__temp_key__'];\n\n/**\n * @internal This function is used to traverse the data and transform the values.\n * Given a predicate function, it will transform the value (using the given transform function)\n * if the predicate returns true. If it finds that the attribute is a component or dynamiczone,\n * it will recursively traverse those data structures as well.\n *\n * It is possible to break the ContentManager by using this function incorrectly, for example,\n * if you transform a number into a string but the attribute type is a number, the ContentManager\n * will not be able to save the data and the Form will likely crash because the component it's\n * passing the data too won't succesfully be able to handle the value.\n */\nconst traverseData =\n (predicate: Predicate, transform: Transform) =>\n (schema: PartialSchema, components: ComponentsDictionary = {}) =>\n (data: AnyData = {}) => {\n const traverse = (datum: AnyData, attributes: Schema.Schema['attributes']) => {\n return Object.entries(datum).reduce<AnyData>((acc, [key, value]) => {\n const attribute = attributes[key];\n\n /**\n * If the attribute is a block list attribute, we don't want to transform it.\n * We also don't want to transform null or undefined values.\n */\n if (BLOCK_LIST_ATTRIBUTE_KEYS.includes(key) || value === null || value === undefined) {\n acc[key] = value;\n return acc;\n }\n\n if (attribute.type === 'component') {\n if (attribute.repeatable) {\n const componentValue = (\n predicate(attribute, value) ? transform(value, attribute) : value\n ) as Schema.Attribute.Value<Schema.Attribute.Component<UID.Component, true>>;\n acc[key] = componentValue.map((componentData) =>\n traverse(componentData, components[attribute.component]?.attributes ?? {})\n );\n } else {\n const componentValue = (\n predicate(attribute, value) ? transform(value, attribute) : value\n ) as Schema.Attribute.Value<Schema.Attribute.Component<UID.Component, false>>;\n\n acc[key] = traverse(componentValue, components[attribute.component]?.attributes ?? {});\n }\n } else if (attribute.type === 'dynamiczone') {\n const dynamicZoneValue = (\n predicate(attribute, value) ? transform(value, attribute) : value\n ) as Schema.Attribute.Value<Schema.Attribute.DynamicZone>;\n\n acc[key] = dynamicZoneValue.map((componentData) =>\n traverse(componentData, components[componentData.__component]?.attributes ?? {})\n );\n } else if (predicate(attribute, value)) {\n acc[key] = transform(value, attribute);\n } else {\n acc[key] = value;\n }\n\n return acc;\n }, {});\n };\n\n return traverse(data, schema.attributes);\n };\n\n/* -------------------------------------------------------------------------------------------------\n * removeProhibitedFields\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal Removes all the fields that are not allowed.\n */\nconst removeProhibitedFields = (prohibitedFields: Schema.Attribute.Kind[]) =>\n traverseData(\n (attribute) => prohibitedFields.includes(attribute.type),\n () => ''\n );\n\n/* -------------------------------------------------------------------------------------------------\n * prepareRelations\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description Sets all relation values to an empty array.\n */\nconst prepareRelations = traverseData(\n (attribute) => attribute.type === 'relation',\n () => ({\n connect: [],\n disconnect: [],\n })\n);\n\n/* -------------------------------------------------------------------------------------------------\n * prepareTempKeys\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description Adds a `__temp_key__` to each component and dynamiczone item. This gives us\n * a stable identifier regardless of its ids etc. that we can then use for drag and drop.\n */\nconst prepareTempKeys = traverseData(\n (attribute) =>\n (attribute.type === 'component' && attribute.repeatable) || attribute.type === 'dynamiczone',\n (data) => {\n if (Array.isArray(data) && data.length > 0) {\n const keys = generateNKeysBetween(undefined, undefined, data.length);\n\n return data.map((datum, index) => ({\n ...datum,\n __temp_key__: keys[index],\n }));\n }\n\n return data;\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * removeFieldsThatDontExistOnSchema\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description Fields that don't exist in the schema like createdAt etc. are only on the first level (not nested),\n * as such we don't need to traverse the components to remove them.\n */\nconst removeFieldsThatDontExistOnSchema = (schema: PartialSchema) => (data: AnyData) => {\n const schemaKeys = Object.keys(schema.attributes);\n const dataKeys = Object.keys(data);\n\n const keysToRemove = dataKeys.filter((key) => !schemaKeys.includes(key));\n\n const revisedData = [...keysToRemove, ...DOCUMENT_META_FIELDS].reduce((acc, key) => {\n delete acc[key];\n\n return acc;\n }, structuredClone(data));\n\n return revisedData;\n};\n\n/**\n * @internal\n * @description We need to remove null fields from the data-structure because it will pass it\n * to the specific inputs breaking them as most would prefer empty strings or `undefined` if\n * they're controlled / uncontrolled.\n */\nconst removeNullValues = (data: AnyData) => {\n return Object.entries(data).reduce<AnyData>((acc, [key, value]) => {\n if (value === null) {\n return acc;\n }\n\n acc[key] = value;\n\n return acc;\n }, {});\n};\n\n/* -------------------------------------------------------------------------------------------------\n * transformDocuments\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description Takes a document data structure (this could be from the API or a default form structure)\n * and applies consistent data transformations to it. This is also used when we add new components to the\n * form to ensure the data is correctly prepared from their default state e.g. relations are set to an empty array.\n */\nconst transformDocument =\n (schema: PartialSchema, components: ComponentsDictionary = {}) =>\n (document: AnyData) => {\n const transformations = pipe(\n removeFieldsThatDontExistOnSchema(schema),\n removeProhibitedFields(['password'])(schema, components),\n removeNullValues,\n prepareRelations(schema, components),\n prepareTempKeys(schema, components)\n );\n\n return transformations(document);\n };\n\ntype HandleOptions = {\n schema?: Schema.ContentType | Schema.Component;\n initialValues?: AnyData;\n components?: Record<string, Schema.Component>;\n};\n\ntype RemovedFieldPath = string;\n\n/**\n * @internal\n * @description Finds the initial value for a component or dynamic zone item (based on its __temp_key__ and not its index).\n * @param initialValue - The initial values object.\n * @param item - The item to find the initial value for.\n * @returns The initial value for the item.\n */\nconst getItemInitialValue = (initialValue: AnyData, item: AnyData) => {\n if (initialValue && Array.isArray(initialValue)) {\n const matchingInitialItem = initialValue.find(\n (initialItem) => initialItem.__temp_key__ === item.__temp_key__\n );\n if (matchingInitialItem) {\n return matchingInitialItem;\n }\n }\n return {};\n};\n\n/**\n * Removes values from the data object if their corresponding attribute has a\n * visibility condition that evaluates to false.\n *\n * @param {object} schema - The content type schema (with attributes).\n * @param {object} data - The data object to filter based on visibility.\n * @returns {object} A new data object with only visible fields retained.\n */\nconst handleInvisibleAttributes = (\n data: AnyData,\n { schema, initialValues = {}, components = {} }: HandleOptions,\n path: string[] = [],\n removedAttributes: RemovedFieldPath[] = []\n): {\n data: AnyData;\n removedAttributes: RemovedFieldPath[];\n} => {\n if (!schema?.attributes) return { data, removedAttributes };\n\n const rulesEngine = createRulesEngine();\n const result: AnyData = {};\n\n for (const [attrName, attrDef] of Object.entries(schema.attributes)) {\n const fullPath = [...path, attrName].join('.');\n const condition = attrDef?.conditions?.visible;\n const isVisible = condition ? rulesEngine.evaluate(condition, { ...data, ...result }) : true;\n\n if (!isVisible) {\n removedAttributes.push(fullPath);\n continue;\n }\n\n const userProvided = Object.prototype.hasOwnProperty.call(data, attrName);\n const currentValue = userProvided ? data[attrName] : undefined;\n const initialValue = initialValues?.[attrName];\n\n // 🔹 Handle components\n if (attrDef.type === 'component') {\n const compSchema = components[attrDef.component];\n const value = currentValue ?? initialValue;\n\n if (!value) {\n result[attrName] = attrDef.repeatable ? [] : null;\n continue;\n }\n\n if (attrDef.repeatable && Array.isArray(value)) {\n result[attrName] = value.map((item) => {\n const componentInitialValue = getItemInitialValue(initialValue, item);\n\n return handleInvisibleAttributes(\n item,\n {\n schema: compSchema,\n initialValues: componentInitialValue,\n components,\n },\n [...path, `${attrName}[${item.__temp_key__}]`],\n removedAttributes\n ).data;\n });\n } else {\n result[attrName] = handleInvisibleAttributes(\n value,\n {\n schema: compSchema,\n initialValues: initialValue ?? {},\n components,\n },\n [...path, attrName],\n removedAttributes\n ).data;\n }\n\n continue;\n }\n\n // 🔸 Handle dynamic zones\n if (attrDef.type === 'dynamiczone') {\n if (!Array.isArray(currentValue)) {\n result[attrName] = [];\n continue;\n }\n\n result[attrName] = currentValue.map((dzItem) => {\n const compUID = dzItem?.__component;\n const compSchema = components[compUID];\n\n const componentInitialValue = getItemInitialValue(initialValue, dzItem);\n\n const cleaned = handleInvisibleAttributes(\n dzItem,\n {\n schema: compSchema,\n initialValues: componentInitialValue,\n components,\n },\n [...path, `${attrName}[${dzItem.__temp_key__}]`],\n removedAttributes\n ).data;\n\n // For newly created components, we want to be sure that the id is undefined (in case of reordering items)\n const processedItem =\n dzItem.id === undefined || dzItem.id === null\n ? { __component: compUID, ...cleaned, id: undefined }\n : { __component: compUID, ...cleaned };\n\n return processedItem;\n });\n\n continue;\n }\n\n // 🟡 Handle scalar/primitive\n if (currentValue !== undefined) {\n result[attrName] = currentValue;\n } else if (initialValue !== undefined) {\n result[attrName] = initialValue;\n } else {\n if (attrName === 'id' || attrName === 'documentId') {\n // If the attribute is 'id', we don't want to set it to null, as it should not be removed.\n continue;\n }\n result[attrName] = null;\n }\n }\n\n return {\n data: result,\n removedAttributes,\n };\n};\n\nexport {\n removeProhibitedFields,\n prepareRelations,\n prepareTempKeys,\n removeFieldsThatDontExistOnSchema,\n transformDocument,\n handleInvisibleAttributes,\n};\nexport type { AnyData };\n"],"names":["BLOCK_LIST_ATTRIBUTE_KEYS","traverseData","predicate","transform","schema","components","data","traverse","datum","attributes","Object","entries","reduce","acc","key","value","attribute","includes","undefined","type","repeatable","componentValue","map","componentData","component","dynamicZoneValue","__component","removeProhibitedFields","prohibitedFields","prepareRelations","connect","disconnect","prepareTempKeys","Array","isArray","length","keys","generateNKeysBetween","index","__temp_key__","removeFieldsThatDontExistOnSchema","schemaKeys","dataKeys","keysToRemove","filter","revisedData","DOCUMENT_META_FIELDS","structuredClone","removeNullValues","transformDocument","document","transformations","pipe","getItemInitialValue","initialValue","item","matchingInitialItem","find","initialItem","handleInvisibleAttributes","initialValues","path","removedAttributes","rulesEngine","createRulesEngine","result","attrName","attrDef","fullPath","join","condition","conditions","visible","isVisible","evaluate","push","userProvided","prototype","hasOwnProperty","call","currentValue","compSchema","componentInitialValue","dzItem","compUID","cleaned","processedItem","id"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"data.js","sources":["../../../../../admin/src/pages/EditView/utils/data.ts"],"sourcesContent":["import { createRulesEngine } from '@strapi/admin/strapi-admin';\nimport { generateNKeysBetween } from 'fractional-indexing';\nimport pipe from 'lodash/fp/pipe';\n\nimport { DOCUMENT_META_FIELDS } from '../../../constants/attributes';\n\nimport type { ComponentsDictionary, Document } from '../../../hooks/useDocument';\nimport type { Schema, UID } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * traverseData\n * -----------------------------------------------------------------------------------------------*/\n\n// Make only attributes required since it's the only one Content History has\ntype PartialSchema = Partial<Schema.Schema> & Pick<Schema.Schema, 'attributes'>;\n\ntype Predicate = <TAttribute extends Schema.Attribute.AnyAttribute>(\n attribute: TAttribute,\n value: Schema.Attribute.Value<TAttribute>\n) => boolean;\ntype Transform = <TAttribute extends Schema.Attribute.AnyAttribute>(\n value: any,\n attribute: TAttribute\n) => any;\ntype AnyData = Omit<Document, 'id'>;\n\nconst BLOCK_LIST_ATTRIBUTE_KEYS = ['__component', '__temp_key__'];\n\n/**\n * @internal This function is used to traverse the data and transform the values.\n * Given a predicate function, it will transform the value (using the given transform function)\n * if the predicate returns true. If it finds that the attribute is a component or dynamiczone,\n * it will recursively traverse those data structures as well.\n *\n * It is possible to break the ContentManager by using this function incorrectly, for example,\n * if you transform a number into a string but the attribute type is a number, the ContentManager\n * will not be able to save the data and the Form will likely crash because the component it's\n * passing the data too won't succesfully be able to handle the value.\n */\nconst traverseData =\n (predicate: Predicate, transform: Transform) =>\n (schema: PartialSchema, components: ComponentsDictionary = {}) =>\n (data: AnyData = {}) => {\n const traverse = (datum: AnyData, attributes: Schema.Schema['attributes']) => {\n return Object.entries(datum).reduce<AnyData>((acc, [key, value]) => {\n const attribute = attributes[key];\n\n /**\n * If the attribute is a block list attribute, we don't want to transform it.\n * We also don't want to transform null or undefined values.\n */\n if (BLOCK_LIST_ATTRIBUTE_KEYS.includes(key) || value === null || value === undefined) {\n acc[key] = value;\n return acc;\n }\n\n if (attribute.type === 'component') {\n if (attribute.repeatable) {\n const componentValue = (\n predicate(attribute, value) ? transform(value, attribute) : value\n ) as Schema.Attribute.Value<Schema.Attribute.Component<UID.Component, true>>;\n acc[key] = componentValue.map((componentData) =>\n traverse(componentData, components[attribute.component]?.attributes ?? {})\n );\n } else {\n const componentValue = (\n predicate(attribute, value) ? transform(value, attribute) : value\n ) as Schema.Attribute.Value<Schema.Attribute.Component<UID.Component, false>>;\n\n acc[key] = traverse(componentValue, components[attribute.component]?.attributes ?? {});\n }\n } else if (attribute.type === 'dynamiczone') {\n const dynamicZoneValue = (\n predicate(attribute, value) ? transform(value, attribute) : value\n ) as Schema.Attribute.Value<Schema.Attribute.DynamicZone>;\n\n acc[key] = dynamicZoneValue.map((componentData) =>\n traverse(componentData, components[componentData.__component]?.attributes ?? {})\n );\n } else if (predicate(attribute, value)) {\n acc[key] = transform(value, attribute);\n } else {\n acc[key] = value;\n }\n\n return acc;\n }, {});\n };\n\n return traverse(data, schema.attributes);\n };\n\n/* -------------------------------------------------------------------------------------------------\n * removeProhibitedFields\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal Removes all the fields that are not allowed.\n */\nconst removeProhibitedFields = (prohibitedFields: Schema.Attribute.Kind[]) =>\n traverseData(\n (attribute) => prohibitedFields.includes(attribute.type),\n () => ''\n );\n\n/* -------------------------------------------------------------------------------------------------\n * prepareRelations\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description Sets all relation values to an empty array.\n */\nconst prepareRelations = traverseData(\n (attribute) => attribute.type === 'relation',\n () => ({\n connect: [],\n disconnect: [],\n })\n);\n\n/* -------------------------------------------------------------------------------------------------\n * prepareTempKeys\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description Adds a `__temp_key__` to each component and dynamiczone item. This gives us\n * a stable identifier regardless of its ids etc. that we can then use for drag and drop.\n */\nconst prepareTempKeys = traverseData(\n (attribute) =>\n (attribute.type === 'component' && attribute.repeatable) || attribute.type === 'dynamiczone',\n (data) => {\n if (Array.isArray(data) && data.length > 0) {\n const keys = generateNKeysBetween(undefined, undefined, data.length);\n\n return data.map((datum, index) => ({\n ...datum,\n __temp_key__: keys[index],\n }));\n }\n\n return data;\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * removeFieldsThatDontExistOnSchema\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description Fields that don't exist in the schema like createdAt etc. are only on the first level (not nested),\n * as such we don't need to traverse the components to remove them.\n */\nconst removeFieldsThatDontExistOnSchema = (schema: PartialSchema) => (data: AnyData) => {\n const schemaKeys = Object.keys(schema.attributes);\n const dataKeys = Object.keys(data);\n\n const keysToRemove = dataKeys.filter((key) => !schemaKeys.includes(key));\n\n const revisedData = [...keysToRemove, ...DOCUMENT_META_FIELDS].reduce((acc, key) => {\n delete acc[key];\n\n return acc;\n }, structuredClone(data));\n\n return revisedData;\n};\n\n/**\n * @internal\n * @description We need to remove null fields from the data-structure because it will pass it\n * to the specific inputs breaking them as most would prefer empty strings or `undefined` if\n * they're controlled / uncontrolled.\n */\nconst removeNullValues = (data: AnyData) => {\n return Object.entries(data).reduce<AnyData>((acc, [key, value]) => {\n if (value === null) {\n return acc;\n }\n\n acc[key] = value;\n\n return acc;\n }, {});\n};\n\n/* -------------------------------------------------------------------------------------------------\n * transformDocuments\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description Takes a document data structure (this could be from the API or a default form structure)\n * and applies consistent data transformations to it. This is also used when we add new components to the\n * form to ensure the data is correctly prepared from their default state e.g. relations are set to an empty array.\n */\nconst transformDocument =\n (schema: PartialSchema, components: ComponentsDictionary = {}) =>\n (document: AnyData) => {\n const transformations = pipe(\n removeFieldsThatDontExistOnSchema(schema),\n removeProhibitedFields(['password'])(schema, components),\n removeNullValues,\n prepareRelations(schema, components),\n prepareTempKeys(schema, components)\n );\n\n return transformations(document);\n };\n\ntype HandleOptions = {\n schema?: Schema.ContentType | Schema.Component;\n initialValues?: AnyData;\n components?: Record<string, Schema.Component>;\n};\n\ntype RemovedFieldPath = string;\n\n/**\n * @internal\n * @description Finds the initial value for a component or dynamic zone item (based on its __temp_key__ and not its index).\n * @param initialValue - The initial values object.\n * @param item - The item to find the initial value for.\n * @returns The initial value for the item.\n */\nconst getItemInitialValue = (initialValue: AnyData, item: AnyData) => {\n if (initialValue && Array.isArray(initialValue)) {\n const matchingInitialItem = initialValue.find(\n (initialItem) => initialItem.__temp_key__ === item.__temp_key__\n );\n if (matchingInitialItem) {\n return matchingInitialItem;\n }\n }\n return {};\n};\n\n/**\n * Removes values from the data object if their corresponding attribute has a\n * visibility condition that evaluates to false.\n *\n * @param {object} schema - The content type schema (with attributes).\n * @param {object} data - The data object to filter based on visibility.\n * @returns {object} A new data object with only visible fields retained.\n */\nconst handleInvisibleAttributes = (\n data: AnyData,\n { schema, initialValues = {}, components = {} }: HandleOptions,\n path: string[] = [],\n removedAttributes: RemovedFieldPath[] = []\n): {\n data: AnyData;\n removedAttributes: RemovedFieldPath[];\n} => {\n if (!schema?.attributes) return { data, removedAttributes };\n\n const rulesEngine = createRulesEngine();\n const result: AnyData = {};\n\n for (const [attrName, attrDef] of Object.entries(schema.attributes)) {\n const fullPath = [...path, attrName].join('.');\n const condition = attrDef?.conditions?.visible;\n const isVisible = condition ? rulesEngine.evaluate(condition, { ...data, ...result }) : true;\n\n if (!isVisible) {\n removedAttributes.push(fullPath);\n continue;\n }\n\n const userProvided = Object.prototype.hasOwnProperty.call(data, attrName);\n const currentValue = userProvided ? data[attrName] : undefined;\n const initialValue = initialValues?.[attrName];\n\n // 🔹 Handle components\n if (attrDef.type === 'component') {\n const compSchema = components[attrDef.component];\n const value = currentValue === undefined ? initialValue : currentValue;\n\n if (!value) {\n result[attrName] = attrDef.repeatable ? [] : null;\n continue;\n }\n\n if (attrDef.repeatable && Array.isArray(value)) {\n result[attrName] = value.map((item) => {\n const componentInitialValue = getItemInitialValue(initialValue, item);\n\n return handleInvisibleAttributes(\n item,\n {\n schema: compSchema,\n initialValues: componentInitialValue,\n components,\n },\n [...path, `${attrName}[${item.__temp_key__}]`],\n removedAttributes\n ).data;\n });\n } else {\n result[attrName] = handleInvisibleAttributes(\n value,\n {\n schema: compSchema,\n initialValues: initialValue ?? {},\n components,\n },\n [...path, attrName],\n removedAttributes\n ).data;\n }\n\n continue;\n }\n\n // 🔸 Handle dynamic zones\n if (attrDef.type === 'dynamiczone') {\n if (!Array.isArray(currentValue)) {\n result[attrName] = [];\n continue;\n }\n\n result[attrName] = currentValue.map((dzItem) => {\n const compUID = dzItem?.__component;\n const compSchema = components[compUID];\n\n const componentInitialValue = getItemInitialValue(initialValue, dzItem);\n\n const cleaned = handleInvisibleAttributes(\n dzItem,\n {\n schema: compSchema,\n initialValues: componentInitialValue,\n components,\n },\n [...path, `${attrName}[${dzItem.__temp_key__}]`],\n removedAttributes\n ).data;\n\n // For newly created components, we want to be sure that the id is undefined (in case of reordering items)\n const processedItem =\n dzItem.id === undefined || dzItem.id === null\n ? { __component: compUID, ...cleaned, id: undefined }\n : { __component: compUID, ...cleaned };\n\n return processedItem;\n });\n\n continue;\n }\n\n // 🟡 Handle scalar/primitive\n if (currentValue !== undefined) {\n result[attrName] = currentValue;\n } else if (initialValue !== undefined) {\n result[attrName] = initialValue;\n } else {\n if (attrName === 'id' || attrName === 'documentId') {\n // If the attribute is 'id', we don't want to set it to null, as it should not be removed.\n continue;\n }\n result[attrName] = null;\n }\n }\n\n return {\n data: result,\n removedAttributes,\n };\n};\n\nexport {\n removeProhibitedFields,\n prepareRelations,\n prepareTempKeys,\n removeFieldsThatDontExistOnSchema,\n transformDocument,\n handleInvisibleAttributes,\n};\nexport type { AnyData };\n"],"names":["BLOCK_LIST_ATTRIBUTE_KEYS","traverseData","predicate","transform","schema","components","data","traverse","datum","attributes","Object","entries","reduce","acc","key","value","attribute","includes","undefined","type","repeatable","componentValue","map","componentData","component","dynamicZoneValue","__component","removeProhibitedFields","prohibitedFields","prepareRelations","connect","disconnect","prepareTempKeys","Array","isArray","length","keys","generateNKeysBetween","index","__temp_key__","removeFieldsThatDontExistOnSchema","schemaKeys","dataKeys","keysToRemove","filter","revisedData","DOCUMENT_META_FIELDS","structuredClone","removeNullValues","transformDocument","document","transformations","pipe","getItemInitialValue","initialValue","item","matchingInitialItem","find","initialItem","handleInvisibleAttributes","initialValues","path","removedAttributes","rulesEngine","createRulesEngine","result","attrName","attrDef","fullPath","join","condition","conditions","visible","isVisible","evaluate","push","userProvided","prototype","hasOwnProperty","call","currentValue","compSchema","componentInitialValue","dzItem","compUID","cleaned","processedItem","id"],"mappings":"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"}
|
|
@@ -174,7 +174,7 @@ const BLOCK_LIST_ATTRIBUTE_KEYS = [
|
|
|
174
174
|
// 🔹 Handle components
|
|
175
175
|
if (attrDef.type === 'component') {
|
|
176
176
|
const compSchema = components[attrDef.component];
|
|
177
|
-
const value = currentValue
|
|
177
|
+
const value = currentValue === undefined ? initialValue : currentValue;
|
|
178
178
|
if (!value) {
|
|
179
179
|
result[attrName] = attrDef.repeatable ? [] : null;
|
|
180
180
|
continue;
|