@strapi/content-manager 5.38.1 → 5.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/admin/hooks/useDocument.js +21 -5
  2. package/dist/admin/hooks/useDocument.js.map +1 -1
  3. package/dist/admin/hooks/useDocument.mjs +22 -6
  4. package/dist/admin/hooks/useDocument.mjs.map +1 -1
  5. package/dist/admin/pages/EditView/components/DocumentActions.js +1 -0
  6. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  7. package/dist/admin/pages/EditView/components/DocumentActions.mjs +3 -2
  8. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  9. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs +4 -4
  10. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
  11. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +71 -44
  12. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  13. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +54 -46
  14. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
  15. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +107 -88
  16. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  17. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +109 -90
  18. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  19. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +91 -106
  20. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  21. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +94 -109
  22. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  23. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +43 -23
  24. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  25. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +45 -25
  26. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  27. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +2 -2
  28. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +30 -19
  29. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  30. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +34 -23
  31. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  32. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs +1 -1
  33. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs +1 -1
  34. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.mjs +1 -1
  35. package/dist/admin/pages/EditView/components/FormLayout.js +23 -3
  36. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  37. package/dist/admin/pages/EditView/components/FormLayout.mjs +4 -3
  38. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  39. package/dist/admin/pages/EditView/components/Header.js +3 -0
  40. package/dist/admin/pages/EditView/components/Header.js.map +1 -1
  41. package/dist/admin/pages/EditView/components/Header.mjs +3 -0
  42. package/dist/admin/pages/EditView/components/Header.mjs.map +1 -1
  43. package/dist/admin/pages/EditView/components/InputRenderer.js +19 -7
  44. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  45. package/dist/admin/pages/EditView/components/InputRenderer.mjs +20 -8
  46. package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
  47. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js +11 -15
  48. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js.map +1 -1
  49. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs +11 -16
  50. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs.map +1 -1
  51. package/dist/admin/src/pages/EditView/components/FormInputs/Component/NonRepeatable.d.ts +3 -2
  52. package/dist/admin/src/pages/EditView/components/FormInputs/Component/Repeatable.d.ts +3 -2
  53. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +3 -3
  54. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +1 -1
  55. package/dist/admin/src/pages/EditView/components/InputRenderer.d.ts +1 -1
  56. package/dist/admin/src/pages/ListView/components/BulkActions/PublishAction.d.ts +3 -0
  57. package/dist/admin/src/pages/ListView/components/Filters.d.ts +3 -0
  58. package/dist/server/services/utils/draft.js +8 -1
  59. package/dist/server/services/utils/draft.js.map +1 -1
  60. package/dist/server/services/utils/draft.mjs +8 -1
  61. package/dist/server/services/utils/draft.mjs.map +1 -1
  62. package/dist/server/services/utils/populate.js +16 -1
  63. package/dist/server/services/utils/populate.js.map +1 -1
  64. package/dist/server/services/utils/populate.mjs +16 -1
  65. package/dist/server/services/utils/populate.mjs.map +1 -1
  66. package/dist/server/src/services/utils/draft.d.ts.map +1 -1
  67. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  68. package/package.json +6 -6
@@ -35,28 +35,23 @@ const TableComponent = styled(RawTable)`
35
35
  /* -------------------------------------------------------------------------------------------------
36
36
  * EntryValidationText
37
37
  * -----------------------------------------------------------------------------------------------*/ const formatErrorMessages = (errors, parentKey, formatMessage)=>{
38
+ if (!errors) return [];
38
39
  const messages = [];
39
40
  Object.entries(errors).forEach(([key, value])=>{
40
41
  const currentKey = parentKey ? `${parentKey}.${key}` : key;
41
- if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
42
- if ('id' in value && 'defaultMessage' in value) {
43
- messages.push(formatMessage({
44
- id: `${value.id}.withField`,
45
- defaultMessage: value.defaultMessage
46
- }, {
47
- field: currentKey
48
- }));
49
- } else {
50
- messages.push(...formatErrorMessages(// @ts-expect-error TODO: check why value is not compatible with FormErrors
51
- value, currentKey, formatMessage));
52
- }
53
- } else {
42
+ if (!value) return;
43
+ const isErrorMessageDescriptor = typeof value === 'object' && 'id' in value && 'defaultMessage' in value;
44
+ if (isErrorMessageDescriptor || typeof value === 'string') {
45
+ const id = isErrorMessageDescriptor ? value.id : value;
46
+ const defaultMessage = isErrorMessageDescriptor ? value.defaultMessage : value;
54
47
  messages.push(formatMessage({
55
- id: `${value}.withField`,
56
- defaultMessage: value
48
+ id: `${id}.withField`,
49
+ defaultMessage
57
50
  }, {
58
51
  field: currentKey
59
52
  }));
53
+ } else {
54
+ messages.push(...formatErrorMessages(value, currentKey, formatMessage));
60
55
  }
61
56
  });
62
57
  return messages;
@@ -552,5 +547,5 @@ const SelectedEntriesModalContent = ({ listViewSelectedEntries, toggleModal, set
552
547
  };
553
548
  };
554
549
 
555
- export { PublishAction, SelectedEntriesModalContent };
550
+ export { PublishAction, SelectedEntriesModalContent, formatErrorMessages };
556
551
  //# sourceMappingURL=PublishAction.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"PublishAction.mjs","sources":["../../../../../../admin/src/pages/ListView/components/BulkActions/PublishAction.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n FormErrors,\n getYupValidationErrors,\n Table,\n useQueryParams,\n useTable,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Button,\n Flex,\n IconButton,\n Loader,\n Modal,\n Tooltip,\n Typography,\n TypographyComponent,\n RawTable,\n Tr,\n Td,\n Tbody,\n} from '@strapi/design-system';\nimport { ArrowsCounterClockwise, CheckCircle, CrossCircle, Pencil } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Link, useLocation } from 'react-router-dom';\nimport { styled } from 'styled-components';\nimport { ValidationError } from 'yup';\n\nimport { useDocumentRBAC } from '../../../../features/DocumentRBAC';\nimport { useContentTypeSchema } from '../../../../hooks/useContentTypeSchema';\nimport { useDocumentActions } from '../../../../hooks/useDocumentActions';\nimport { useDocLayout } from '../../../../hooks/useDocumentLayout';\nimport { contentManagerApi } from '../../../../services/api';\nimport {\n useGetAllDocumentsQuery,\n usePublishManyDocumentsMutation,\n} from '../../../../services/documents';\nimport { buildValidParams } from '../../../../utils/api';\nimport { getTranslation } from '../../../../utils/translations';\nimport { createYupSchema } from '../../../../utils/validation';\nimport { DocumentStatus } from '../../../EditView/components/DocumentStatus';\n\nimport { ConfirmDialogPublishAll, ConfirmDialogPublishAllProps } from './ConfirmBulkActionDialog';\n\nimport type { BulkActionComponent } from '../../../../content-manager';\nimport type { Document } from '../../../../hooks/useDocument';\n\nconst TypographyMaxWidth = styled<TypographyComponent>(Typography)`\n max-width: 300px;\n`;\n\nconst TableComponent = styled(RawTable)`\n width: 100%;\n table-layout: fixed;\n td:first-child {\n border-right: 1px solid ${({ theme }) => theme.colors.neutral150};\n }\n td:first-of-type {\n padding: ${({ theme }) => theme.spaces[4]};\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * EntryValidationText\n * -----------------------------------------------------------------------------------------------*/\n\nconst formatErrorMessages = (errors: FormErrors, parentKey: string, formatMessage: any) => {\n const messages: string[] = [];\n\n Object.entries(errors).forEach(([key, value]) => {\n const currentKey = parentKey ? `${parentKey}.${key}` : key;\n\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n if ('id' in value && 'defaultMessage' in value) {\n messages.push(\n formatMessage(\n {\n id: `${value.id}.withField`,\n defaultMessage: value.defaultMessage,\n },\n { field: currentKey }\n )\n );\n } else {\n messages.push(\n ...formatErrorMessages(\n // @ts-expect-error TODO: check why value is not compatible with FormErrors\n value,\n currentKey,\n formatMessage\n )\n );\n }\n } else {\n messages.push(\n formatMessage(\n {\n id: `${value}.withField`,\n defaultMessage: value,\n },\n { field: currentKey }\n )\n );\n }\n });\n\n return messages;\n};\n\ninterface EntryValidationTextProps {\n validationErrors?: FormErrors;\n status: string;\n}\n\nconst EntryValidationText = ({ validationErrors, status }: EntryValidationTextProps) => {\n const { formatMessage } = useIntl();\n\n if (validationErrors) {\n const validationErrorsMessages = formatErrorMessages(validationErrors, '', formatMessage).join(\n ' '\n );\n\n return (\n <Flex gap={2}>\n <CrossCircle fill=\"danger600\" />\n <Tooltip label={validationErrorsMessages}>\n <TypographyMaxWidth textColor=\"danger600\" variant=\"omega\" fontWeight=\"bold\" ellipsis>\n {validationErrorsMessages}\n </TypographyMaxWidth>\n </Tooltip>\n </Flex>\n );\n }\n\n if (status === 'published') {\n return (\n <Flex gap={2}>\n <CheckCircle fill=\"success600\" />\n <Typography textColor=\"success600\" fontWeight=\"bold\">\n {formatMessage({\n id: 'content-manager.bulk-publish.already-published',\n defaultMessage: 'Already Published',\n })}\n </Typography>\n </Flex>\n );\n }\n\n if (status === 'modified') {\n return (\n <Flex gap={2}>\n <ArrowsCounterClockwise fill=\"alternative600\" />\n <Typography textColor=\"alternative600\" fontWeight=\"bold\">\n {formatMessage({\n id: 'content-manager.bulk-publish.modified',\n defaultMessage: 'Ready to publish changes',\n })}\n </Typography>\n </Flex>\n );\n }\n\n return (\n <Flex gap={2}>\n <CheckCircle fill=\"success600\" />\n <Typography textColor=\"success600\" fontWeight=\"bold\">\n {formatMessage({\n id: 'app.utils.ready-to-publish',\n defaultMessage: 'Ready to publish',\n })}\n </Typography>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * SelectedEntriesTableContent\n * -----------------------------------------------------------------------------------------------*/\n\ninterface SelectedEntriesTableContentProps {\n isPublishing?: boolean;\n rowsToDisplay?: TableRow[];\n entriesToPublish?: TableRow['documentId'][];\n validationErrors: Record<string, EntryValidationTextProps['validationErrors']>;\n}\n\nconst TABLE_HEADERS = [\n { name: 'id', label: 'id' },\n { name: 'name', label: 'name' },\n { name: 'status', label: 'status' },\n { name: 'publicationStatus', label: 'Publication status' },\n];\n\nconst SelectedEntriesTableContent = ({\n isPublishing,\n rowsToDisplay = [],\n entriesToPublish = [],\n validationErrors = {},\n}: SelectedEntriesTableContentProps) => {\n const { pathname } = useLocation();\n const { formatMessage } = useIntl();\n\n const {\n list: {\n settings: { mainField },\n },\n } = useDocLayout();\n\n const shouldDisplayMainField = mainField != null && mainField !== 'id';\n\n return (\n <Table.Content>\n <Table.Head>\n <Table.HeaderCheckboxCell />\n {TABLE_HEADERS.filter((head) => head.name !== 'name' || shouldDisplayMainField).map(\n (head) => (\n <Table.HeaderCell key={head.name} {...head} />\n )\n )}\n </Table.Head>\n <Table.Loading />\n <Table.Body>\n {rowsToDisplay.map((row) => (\n <Table.Row key={row.id}>\n <Table.CheckboxCell id={row.id} />\n <Table.Cell>\n <Typography>{row.id}</Typography>\n </Table.Cell>\n {shouldDisplayMainField && (\n <Table.Cell>\n <Typography>{row[mainField as keyof TableRow]}</Typography>\n </Table.Cell>\n )}\n <Table.Cell>\n <DocumentStatus status={row.status} maxWidth={'min-content'} />\n </Table.Cell>\n <Table.Cell>\n {isPublishing && entriesToPublish.includes(row.documentId) ? (\n <Flex gap={2}>\n <Typography>\n {formatMessage({\n id: 'content-manager.success.record.publishing',\n defaultMessage: 'Publishing...',\n })}\n </Typography>\n <Loader small />\n </Flex>\n ) : (\n <EntryValidationText\n validationErrors={validationErrors[row.documentId]}\n status={row.status}\n />\n )}\n </Table.Cell>\n <Table.Cell>\n <Flex>\n <IconButton\n tag={Link}\n to={{\n pathname: `${pathname}/${row.documentId}`,\n search: row.locale && `?plugins[i18n][locale]=${row.locale}`,\n }}\n state={{ from: pathname }}\n label={formatMessage({\n id: 'content-manager.bulk-publish.edit',\n defaultMessage: 'Edit',\n })}\n target=\"_blank\"\n marginLeft=\"auto\"\n variant=\"ghost\"\n >\n <Pencil width={'1.6rem'} height={'1.6rem'} />\n </IconButton>\n </Flex>\n </Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table.Content>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * PublicationStatusSummary\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PublicationStatusSummaryProps {\n count: number;\n icon: React.ReactNode;\n message: string;\n textColor: string;\n}\n\nconst PublicationStatusSummary = ({\n count,\n icon,\n message,\n textColor,\n}: PublicationStatusSummaryProps) => {\n return (\n <Flex justifyContent=\"space-between\" flex={1} gap={3}>\n <Flex gap={2}>\n {icon}\n <Typography textColor={textColor} fontWeight=\"bold\">\n {message}\n </Typography>\n </Flex>\n <Typography fontWeight=\"bold\">{count}</Typography>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * PublicationStatusGrid\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PublicationStatusGridProps {\n entriesReadyToPublishCount: number;\n entriesModifiedCount: number;\n entriesPublishedCount: number;\n entriesWithErrorsCount: number;\n}\n\nconst PublicationStatusGrid = ({\n entriesReadyToPublishCount,\n entriesPublishedCount,\n entriesModifiedCount,\n entriesWithErrorsCount,\n}: PublicationStatusGridProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Box hasRadius borderColor=\"neutral150\">\n <TableComponent colCount={2} rowCount={2}>\n <Tbody>\n <Tr>\n <Td>\n <PublicationStatusSummary\n textColor=\"success600\"\n count={entriesReadyToPublishCount}\n icon={<CheckCircle fill=\"success600\" />}\n message={formatMessage({\n id: 'app.utils.ready-to-publish',\n defaultMessage: 'Ready to publish',\n })}\n />\n </Td>\n <Td>\n <PublicationStatusSummary\n textColor=\"success600\"\n count={entriesPublishedCount}\n icon={<CheckCircle fill=\"success600\" />}\n message={formatMessage({\n id: 'app.utils.already-published',\n defaultMessage: 'Already published',\n })}\n />\n </Td>\n </Tr>\n <Tr>\n <Td>\n <PublicationStatusSummary\n textColor=\"alternative600\"\n count={entriesModifiedCount}\n icon={<ArrowsCounterClockwise fill=\"alternative600\" />}\n message={formatMessage({\n id: 'content-manager.bulk-publish.modified',\n defaultMessage: 'Ready to publish changes',\n })}\n />\n </Td>\n <Td>\n <PublicationStatusSummary\n textColor=\"danger600\"\n count={entriesWithErrorsCount}\n icon={<CrossCircle fill=\"danger600\" />}\n message={formatMessage({\n id: 'content-manager.bulk-publish.waiting-for-action',\n defaultMessage: 'Waiting for action',\n })}\n />\n </Td>\n </Tr>\n </Tbody>\n </TableComponent>\n </Box>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * SelectedEntriesModalContent\n * -----------------------------------------------------------------------------------------------*/\n\ninterface TableRow extends Document {}\n\ninterface SelectedEntriesModalContentProps {\n listViewSelectedEntries: TableRow[];\n toggleModal: ConfirmDialogPublishAllProps['onToggleDialog'];\n setListViewSelectedDocuments: (documents: TableRow[]) => void;\n model: string;\n}\n\nconst SelectedEntriesModalContent = ({\n listViewSelectedEntries,\n toggleModal,\n setListViewSelectedDocuments,\n model,\n}: SelectedEntriesModalContentProps) => {\n const { formatMessage } = useIntl();\n const { schema, components } = useContentTypeSchema(model);\n const documentIds = listViewSelectedEntries.map(({ documentId }) => documentId);\n\n // We want to keep the selected entries order same as the list view\n const [{ query }] = useQueryParams<{ sort?: string; plugins?: Record<string, any> }>();\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n // Fetch the documents based on the selected entries and update the modal table\n const { data, isLoading, isFetching, refetch } = useGetAllDocumentsQuery(\n {\n model,\n params: {\n page: '1',\n pageSize: documentIds.length.toString(),\n sort: query.sort,\n filters: {\n documentId: {\n $in: documentIds,\n },\n },\n locale: query.plugins?.i18n?.locale,\n },\n },\n {\n selectFromResult: ({ data, ...restRes }) => ({ data: data?.results ?? [], ...restRes }),\n }\n );\n\n // Validate the entries based on the schema to show errors if any\n const { rows, validationErrors } = React.useMemo(() => {\n if (data.length > 0 && schema) {\n const validate = createYupSchema(\n schema.attributes,\n components,\n // Since this is the \"Publish\" action, the validation\n // schema must enforce the rules for published entities\n { status: 'published' }\n );\n const validationErrors: Record<TableRow['documentId'], FormErrors> = {};\n const rows = data.map((entry: Document) => {\n try {\n validate.validateSync(entry, { abortEarly: false });\n\n return entry;\n } catch (e) {\n if (e instanceof ValidationError) {\n validationErrors[entry.documentId] = getYupValidationErrors(e);\n }\n\n return entry;\n }\n });\n\n return { rows, validationErrors };\n }\n\n return {\n rows: [],\n validationErrors: {},\n };\n }, [components, data, schema]);\n\n const [isDialogOpen, setIsDialogOpen] = React.useState(false);\n\n const { publishMany: bulkPublishAction, isLoading: isPublishing } = useDocumentActions();\n const [, { isLoading: isSubmittingForm }] = usePublishManyDocumentsMutation();\n\n const selectedRows = useTable('publishAction', (state) => state.selectedRows);\n\n // Filter selected entries from the updated modal table rows\n const selectedEntries = rows.filter((entry) =>\n selectedRows.some((selectedEntry) => selectedEntry.documentId === entry.documentId)\n );\n\n const entriesToPublish = selectedEntries\n .filter((entry) => !validationErrors[entry.documentId])\n .map((entry) => entry.documentId);\n\n const selectedEntriesWithErrorsCount = selectedEntries.filter(\n ({ documentId }) => validationErrors[documentId]\n ).length;\n const selectedEntriesPublishedCount = selectedEntries.filter(\n ({ status }) => status === 'published'\n ).length;\n const selectedEntriesModifiedCount = selectedEntries.filter(\n ({ status, documentId }) => status === 'modified' && !validationErrors[documentId]\n ).length;\n const selectedEntriesWithNoErrorsCount =\n selectedEntries.length - selectedEntriesWithErrorsCount - selectedEntriesPublishedCount;\n\n const toggleDialog = () => setIsDialogOpen((prev) => !prev);\n\n const handleConfirmBulkPublish = async () => {\n toggleDialog();\n\n const res = await bulkPublishAction({ model: model, documentIds: entriesToPublish, params });\n if (!('error' in res)) {\n const unpublishedEntries = rows.filter((row) => {\n return !entriesToPublish.includes(row.documentId);\n });\n // Keep selection of the entries in list view that were not published\n setListViewSelectedDocuments(unpublishedEntries);\n }\n };\n\n return (\n <>\n <Modal.Body>\n <PublicationStatusGrid\n entriesReadyToPublishCount={\n selectedEntriesWithNoErrorsCount - selectedEntriesModifiedCount\n }\n entriesPublishedCount={selectedEntriesPublishedCount}\n entriesModifiedCount={selectedEntriesModifiedCount}\n entriesWithErrorsCount={selectedEntriesWithErrorsCount}\n />\n <Box marginTop={7}>\n <SelectedEntriesTableContent\n isPublishing={isSubmittingForm}\n rowsToDisplay={rows}\n entriesToPublish={entriesToPublish}\n validationErrors={validationErrors}\n />\n </Box>\n </Modal.Body>\n <Modal.Footer>\n <Button onClick={toggleModal} variant=\"tertiary\">\n {formatMessage({\n id: 'app.components.Button.cancel',\n defaultMessage: 'Cancel',\n })}\n </Button>\n <Flex gap={2}>\n <Button onClick={refetch} variant=\"tertiary\" loading={isFetching}>\n {formatMessage({ id: 'app.utils.refresh', defaultMessage: 'Refresh' })}\n </Button>\n <Button\n onClick={toggleDialog}\n disabled={\n selectedEntries.length === 0 ||\n selectedEntries.length === selectedEntriesWithErrorsCount ||\n selectedEntriesPublishedCount === selectedEntries.length ||\n isLoading\n }\n loading={isPublishing || isSubmittingForm}\n >\n {formatMessage({ id: 'app.utils.publish', defaultMessage: 'Publish' })}\n </Button>\n </Flex>\n </Modal.Footer>\n <ConfirmDialogPublishAll\n isOpen={isDialogOpen}\n onToggleDialog={toggleDialog}\n isConfirmButtonLoading={isPublishing || isSubmittingForm}\n onConfirm={handleConfirmBulkPublish}\n />\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * PublishAction\n * -----------------------------------------------------------------------------------------------*/\n\nconst PublishAction: BulkActionComponent = ({ documents, model }) => {\n const { formatMessage } = useIntl();\n // Publish button visibility\n const hasPublishPermission = useDocumentRBAC('unpublishAction', (state) => state.canPublish);\n const showPublishButton =\n hasPublishPermission && documents.some(({ status }) => status !== 'published');\n\n const setListViewSelectedDocuments = useTable('publishAction', (state) => state.selectRow);\n\n const refetchList = () => {\n contentManagerApi.util.invalidateTags([{ type: 'Document', id: `${model}_LIST` }]);\n };\n\n if (!showPublishButton) return null;\n\n return {\n actionType: 'publish',\n variant: 'tertiary',\n label: formatMessage({ id: 'app.utils.publish', defaultMessage: 'Publish' }),\n dialog: {\n type: 'modal',\n title: formatMessage({\n id: getTranslation('containers.ListPage.selectedEntriesModal.title'),\n defaultMessage: 'Publish entries',\n }),\n content: ({ onClose }) => {\n return (\n <Table.Root rows={documents} defaultSelectedRows={documents} headers={TABLE_HEADERS}>\n <SelectedEntriesModalContent\n listViewSelectedEntries={documents}\n toggleModal={() => {\n onClose();\n refetchList();\n }}\n setListViewSelectedDocuments={setListViewSelectedDocuments}\n model={model}\n />\n </Table.Root>\n );\n },\n onClose: () => {\n refetchList();\n },\n },\n };\n};\n\nexport { PublishAction, SelectedEntriesModalContent };\n"],"names":["TypographyMaxWidth","styled","Typography","TableComponent","RawTable","theme","colors","neutral150","spaces","formatErrorMessages","errors","parentKey","formatMessage","messages","Object","entries","forEach","key","value","currentKey","Array","isArray","push","id","defaultMessage","field","EntryValidationText","validationErrors","status","useIntl","validationErrorsMessages","join","_jsxs","Flex","gap","_jsx","CrossCircle","fill","Tooltip","label","textColor","variant","fontWeight","ellipsis","CheckCircle","ArrowsCounterClockwise","TABLE_HEADERS","name","SelectedEntriesTableContent","isPublishing","rowsToDisplay","entriesToPublish","pathname","useLocation","list","settings","mainField","useDocLayout","shouldDisplayMainField","Table","Content","Head","HeaderCheckboxCell","filter","head","map","HeaderCell","Loading","Body","row","Row","CheckboxCell","Cell","DocumentStatus","maxWidth","includes","documentId","Loader","small","IconButton","tag","Link","to","search","locale","state","from","target","marginLeft","Pencil","width","height","PublicationStatusSummary","count","icon","message","justifyContent","flex","PublicationStatusGrid","entriesReadyToPublishCount","entriesPublishedCount","entriesModifiedCount","entriesWithErrorsCount","Box","hasRadius","borderColor","colCount","rowCount","Tbody","Tr","Td","SelectedEntriesModalContent","listViewSelectedEntries","toggleModal","setListViewSelectedDocuments","model","schema","components","useContentTypeSchema","documentIds","query","useQueryParams","params","React","useMemo","buildValidParams","data","isLoading","isFetching","refetch","useGetAllDocumentsQuery","page","pageSize","length","toString","sort","filters","$in","plugins","i18n","selectFromResult","restRes","results","rows","validate","createYupSchema","attributes","entry","validateSync","abortEarly","e","ValidationError","getYupValidationErrors","isDialogOpen","setIsDialogOpen","useState","publishMany","bulkPublishAction","useDocumentActions","isSubmittingForm","usePublishManyDocumentsMutation","selectedRows","useTable","selectedEntries","some","selectedEntry","selectedEntriesWithErrorsCount","selectedEntriesPublishedCount","selectedEntriesModifiedCount","selectedEntriesWithNoErrorsCount","toggleDialog","prev","handleConfirmBulkPublish","res","unpublishedEntries","_Fragment","Modal","marginTop","Footer","Button","onClick","loading","disabled","ConfirmDialogPublishAll","isOpen","onToggleDialog","isConfirmButtonLoading","onConfirm","PublishAction","documents","hasPublishPermission","useDocumentRBAC","canPublish","showPublishButton","selectRow","refetchList","contentManagerApi","util","invalidateTags","type","actionType","dialog","title","getTranslation","content","onClose","Root","defaultSelectedRows","headers"],"mappings":"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"}
1
+ {"version":3,"file":"PublishAction.mjs","sources":["../../../../../../admin/src/pages/ListView/components/BulkActions/PublishAction.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n FormErrors,\n getYupValidationErrors,\n Table,\n useQueryParams,\n useTable,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Button,\n Flex,\n IconButton,\n Loader,\n Modal,\n Tooltip,\n Typography,\n TypographyComponent,\n RawTable,\n Tr,\n Td,\n Tbody,\n} from '@strapi/design-system';\nimport { ArrowsCounterClockwise, CheckCircle, CrossCircle, Pencil } from '@strapi/icons';\nimport { useIntl, type IntlShape } from 'react-intl';\nimport { Link, useLocation } from 'react-router-dom';\nimport { styled } from 'styled-components';\nimport { ValidationError } from 'yup';\n\nimport { useDocumentRBAC } from '../../../../features/DocumentRBAC';\nimport { useContentTypeSchema } from '../../../../hooks/useContentTypeSchema';\nimport { useDocumentActions } from '../../../../hooks/useDocumentActions';\nimport { useDocLayout } from '../../../../hooks/useDocumentLayout';\nimport { contentManagerApi } from '../../../../services/api';\nimport {\n useGetAllDocumentsQuery,\n usePublishManyDocumentsMutation,\n} from '../../../../services/documents';\nimport { buildValidParams } from '../../../../utils/api';\nimport { getTranslation } from '../../../../utils/translations';\nimport { createYupSchema } from '../../../../utils/validation';\nimport { DocumentStatus } from '../../../EditView/components/DocumentStatus';\n\nimport { ConfirmDialogPublishAll, ConfirmDialogPublishAllProps } from './ConfirmBulkActionDialog';\n\nimport type { BulkActionComponent } from '../../../../content-manager';\nimport type { Document } from '../../../../hooks/useDocument';\n\nconst TypographyMaxWidth = styled<TypographyComponent>(Typography)`\n max-width: 300px;\n`;\n\nconst TableComponent = styled(RawTable)`\n width: 100%;\n table-layout: fixed;\n td:first-child {\n border-right: 1px solid ${({ theme }) => theme.colors.neutral150};\n }\n td:first-of-type {\n padding: ${({ theme }) => theme.spaces[4]};\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * EntryValidationText\n * -----------------------------------------------------------------------------------------------*/\n\nexport const formatErrorMessages = (\n errors: FormErrors,\n parentKey: string,\n formatMessage: IntlShape['formatMessage']\n) => {\n if (!errors) return [];\n\n const messages: string[] = [];\n\n Object.entries(errors).forEach(([key, value]) => {\n const currentKey = parentKey ? `${parentKey}.${key}` : key;\n\n if (!value) return;\n const isErrorMessageDescriptor =\n typeof value === 'object' && 'id' in value && 'defaultMessage' in value;\n if (isErrorMessageDescriptor || typeof value === 'string') {\n const id = isErrorMessageDescriptor ? value.id : value;\n const defaultMessage = isErrorMessageDescriptor\n ? (value.defaultMessage as string)\n : (value as string);\n messages.push(\n formatMessage(\n {\n id: `${id}.withField`,\n defaultMessage,\n },\n { field: currentKey }\n )\n );\n } else {\n messages.push(\n ...formatErrorMessages(value as unknown as FormErrors, currentKey, formatMessage)\n );\n }\n });\n\n return messages;\n};\n\ninterface EntryValidationTextProps {\n validationErrors?: FormErrors;\n status: string;\n}\n\nconst EntryValidationText = ({ validationErrors, status }: EntryValidationTextProps) => {\n const { formatMessage } = useIntl();\n\n if (validationErrors) {\n const validationErrorsMessages = formatErrorMessages(validationErrors, '', formatMessage).join(\n ' '\n );\n\n return (\n <Flex gap={2}>\n <CrossCircle fill=\"danger600\" />\n <Tooltip label={validationErrorsMessages}>\n <TypographyMaxWidth textColor=\"danger600\" variant=\"omega\" fontWeight=\"bold\" ellipsis>\n {validationErrorsMessages}\n </TypographyMaxWidth>\n </Tooltip>\n </Flex>\n );\n }\n\n if (status === 'published') {\n return (\n <Flex gap={2}>\n <CheckCircle fill=\"success600\" />\n <Typography textColor=\"success600\" fontWeight=\"bold\">\n {formatMessage({\n id: 'content-manager.bulk-publish.already-published',\n defaultMessage: 'Already Published',\n })}\n </Typography>\n </Flex>\n );\n }\n\n if (status === 'modified') {\n return (\n <Flex gap={2}>\n <ArrowsCounterClockwise fill=\"alternative600\" />\n <Typography textColor=\"alternative600\" fontWeight=\"bold\">\n {formatMessage({\n id: 'content-manager.bulk-publish.modified',\n defaultMessage: 'Ready to publish changes',\n })}\n </Typography>\n </Flex>\n );\n }\n\n return (\n <Flex gap={2}>\n <CheckCircle fill=\"success600\" />\n <Typography textColor=\"success600\" fontWeight=\"bold\">\n {formatMessage({\n id: 'app.utils.ready-to-publish',\n defaultMessage: 'Ready to publish',\n })}\n </Typography>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * SelectedEntriesTableContent\n * -----------------------------------------------------------------------------------------------*/\n\ninterface SelectedEntriesTableContentProps {\n isPublishing?: boolean;\n rowsToDisplay?: TableRow[];\n entriesToPublish?: TableRow['documentId'][];\n validationErrors: Record<string, EntryValidationTextProps['validationErrors']>;\n}\n\nconst TABLE_HEADERS = [\n { name: 'id', label: 'id' },\n { name: 'name', label: 'name' },\n { name: 'status', label: 'status' },\n { name: 'publicationStatus', label: 'Publication status' },\n];\n\nconst SelectedEntriesTableContent = ({\n isPublishing,\n rowsToDisplay = [],\n entriesToPublish = [],\n validationErrors = {},\n}: SelectedEntriesTableContentProps) => {\n const { pathname } = useLocation();\n const { formatMessage } = useIntl();\n\n const {\n list: {\n settings: { mainField },\n },\n } = useDocLayout();\n\n const shouldDisplayMainField = mainField != null && mainField !== 'id';\n\n return (\n <Table.Content>\n <Table.Head>\n <Table.HeaderCheckboxCell />\n {TABLE_HEADERS.filter((head) => head.name !== 'name' || shouldDisplayMainField).map(\n (head) => (\n <Table.HeaderCell key={head.name} {...head} />\n )\n )}\n </Table.Head>\n <Table.Loading />\n <Table.Body>\n {rowsToDisplay.map((row) => (\n <Table.Row key={row.id}>\n <Table.CheckboxCell id={row.id} />\n <Table.Cell>\n <Typography>{row.id}</Typography>\n </Table.Cell>\n {shouldDisplayMainField && (\n <Table.Cell>\n <Typography>{row[mainField as keyof TableRow]}</Typography>\n </Table.Cell>\n )}\n <Table.Cell>\n <DocumentStatus status={row.status} maxWidth={'min-content'} />\n </Table.Cell>\n <Table.Cell>\n {isPublishing && entriesToPublish.includes(row.documentId) ? (\n <Flex gap={2}>\n <Typography>\n {formatMessage({\n id: 'content-manager.success.record.publishing',\n defaultMessage: 'Publishing...',\n })}\n </Typography>\n <Loader small />\n </Flex>\n ) : (\n <EntryValidationText\n validationErrors={validationErrors[row.documentId]}\n status={row.status}\n />\n )}\n </Table.Cell>\n <Table.Cell>\n <Flex>\n <IconButton\n tag={Link}\n to={{\n pathname: `${pathname}/${row.documentId}`,\n search: row.locale && `?plugins[i18n][locale]=${row.locale}`,\n }}\n state={{ from: pathname }}\n label={formatMessage({\n id: 'content-manager.bulk-publish.edit',\n defaultMessage: 'Edit',\n })}\n target=\"_blank\"\n marginLeft=\"auto\"\n variant=\"ghost\"\n >\n <Pencil width={'1.6rem'} height={'1.6rem'} />\n </IconButton>\n </Flex>\n </Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table.Content>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * PublicationStatusSummary\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PublicationStatusSummaryProps {\n count: number;\n icon: React.ReactNode;\n message: string;\n textColor: string;\n}\n\nconst PublicationStatusSummary = ({\n count,\n icon,\n message,\n textColor,\n}: PublicationStatusSummaryProps) => {\n return (\n <Flex justifyContent=\"space-between\" flex={1} gap={3}>\n <Flex gap={2}>\n {icon}\n <Typography textColor={textColor} fontWeight=\"bold\">\n {message}\n </Typography>\n </Flex>\n <Typography fontWeight=\"bold\">{count}</Typography>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * PublicationStatusGrid\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PublicationStatusGridProps {\n entriesReadyToPublishCount: number;\n entriesModifiedCount: number;\n entriesPublishedCount: number;\n entriesWithErrorsCount: number;\n}\n\nconst PublicationStatusGrid = ({\n entriesReadyToPublishCount,\n entriesPublishedCount,\n entriesModifiedCount,\n entriesWithErrorsCount,\n}: PublicationStatusGridProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Box hasRadius borderColor=\"neutral150\">\n <TableComponent colCount={2} rowCount={2}>\n <Tbody>\n <Tr>\n <Td>\n <PublicationStatusSummary\n textColor=\"success600\"\n count={entriesReadyToPublishCount}\n icon={<CheckCircle fill=\"success600\" />}\n message={formatMessage({\n id: 'app.utils.ready-to-publish',\n defaultMessage: 'Ready to publish',\n })}\n />\n </Td>\n <Td>\n <PublicationStatusSummary\n textColor=\"success600\"\n count={entriesPublishedCount}\n icon={<CheckCircle fill=\"success600\" />}\n message={formatMessage({\n id: 'app.utils.already-published',\n defaultMessage: 'Already published',\n })}\n />\n </Td>\n </Tr>\n <Tr>\n <Td>\n <PublicationStatusSummary\n textColor=\"alternative600\"\n count={entriesModifiedCount}\n icon={<ArrowsCounterClockwise fill=\"alternative600\" />}\n message={formatMessage({\n id: 'content-manager.bulk-publish.modified',\n defaultMessage: 'Ready to publish changes',\n })}\n />\n </Td>\n <Td>\n <PublicationStatusSummary\n textColor=\"danger600\"\n count={entriesWithErrorsCount}\n icon={<CrossCircle fill=\"danger600\" />}\n message={formatMessage({\n id: 'content-manager.bulk-publish.waiting-for-action',\n defaultMessage: 'Waiting for action',\n })}\n />\n </Td>\n </Tr>\n </Tbody>\n </TableComponent>\n </Box>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * SelectedEntriesModalContent\n * -----------------------------------------------------------------------------------------------*/\n\ninterface TableRow extends Document {}\n\ninterface SelectedEntriesModalContentProps {\n listViewSelectedEntries: TableRow[];\n toggleModal: ConfirmDialogPublishAllProps['onToggleDialog'];\n setListViewSelectedDocuments: (documents: TableRow[]) => void;\n model: string;\n}\n\nconst SelectedEntriesModalContent = ({\n listViewSelectedEntries,\n toggleModal,\n setListViewSelectedDocuments,\n model,\n}: SelectedEntriesModalContentProps) => {\n const { formatMessage } = useIntl();\n const { schema, components } = useContentTypeSchema(model);\n const documentIds = listViewSelectedEntries.map(({ documentId }) => documentId);\n\n // We want to keep the selected entries order same as the list view\n const [{ query }] = useQueryParams<{ sort?: string; plugins?: Record<string, any> }>();\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n // Fetch the documents based on the selected entries and update the modal table\n const { data, isLoading, isFetching, refetch } = useGetAllDocumentsQuery(\n {\n model,\n params: {\n page: '1',\n pageSize: documentIds.length.toString(),\n sort: query.sort,\n filters: {\n documentId: {\n $in: documentIds,\n },\n },\n locale: query.plugins?.i18n?.locale,\n },\n },\n {\n selectFromResult: ({ data, ...restRes }) => ({ data: data?.results ?? [], ...restRes }),\n }\n );\n\n // Validate the entries based on the schema to show errors if any\n const { rows, validationErrors } = React.useMemo(() => {\n if (data.length > 0 && schema) {\n const validate = createYupSchema(\n schema.attributes,\n components,\n // Since this is the \"Publish\" action, the validation\n // schema must enforce the rules for published entities\n { status: 'published' }\n );\n const validationErrors: Record<TableRow['documentId'], FormErrors> = {};\n const rows = data.map((entry: Document) => {\n try {\n validate.validateSync(entry, { abortEarly: false });\n\n return entry;\n } catch (e) {\n if (e instanceof ValidationError) {\n validationErrors[entry.documentId] = getYupValidationErrors(e);\n }\n\n return entry;\n }\n });\n\n return { rows, validationErrors };\n }\n\n return {\n rows: [],\n validationErrors: {},\n };\n }, [components, data, schema]);\n\n const [isDialogOpen, setIsDialogOpen] = React.useState(false);\n\n const { publishMany: bulkPublishAction, isLoading: isPublishing } = useDocumentActions();\n const [, { isLoading: isSubmittingForm }] = usePublishManyDocumentsMutation();\n\n const selectedRows = useTable('publishAction', (state) => state.selectedRows);\n\n // Filter selected entries from the updated modal table rows\n const selectedEntries = rows.filter((entry) =>\n selectedRows.some((selectedEntry) => selectedEntry.documentId === entry.documentId)\n );\n\n const entriesToPublish = selectedEntries\n .filter((entry) => !validationErrors[entry.documentId])\n .map((entry) => entry.documentId);\n\n const selectedEntriesWithErrorsCount = selectedEntries.filter(\n ({ documentId }) => validationErrors[documentId]\n ).length;\n const selectedEntriesPublishedCount = selectedEntries.filter(\n ({ status }) => status === 'published'\n ).length;\n const selectedEntriesModifiedCount = selectedEntries.filter(\n ({ status, documentId }) => status === 'modified' && !validationErrors[documentId]\n ).length;\n const selectedEntriesWithNoErrorsCount =\n selectedEntries.length - selectedEntriesWithErrorsCount - selectedEntriesPublishedCount;\n\n const toggleDialog = () => setIsDialogOpen((prev) => !prev);\n\n const handleConfirmBulkPublish = async () => {\n toggleDialog();\n\n const res = await bulkPublishAction({ model: model, documentIds: entriesToPublish, params });\n if (!('error' in res)) {\n const unpublishedEntries = rows.filter((row) => {\n return !entriesToPublish.includes(row.documentId);\n });\n // Keep selection of the entries in list view that were not published\n setListViewSelectedDocuments(unpublishedEntries);\n }\n };\n\n return (\n <>\n <Modal.Body>\n <PublicationStatusGrid\n entriesReadyToPublishCount={\n selectedEntriesWithNoErrorsCount - selectedEntriesModifiedCount\n }\n entriesPublishedCount={selectedEntriesPublishedCount}\n entriesModifiedCount={selectedEntriesModifiedCount}\n entriesWithErrorsCount={selectedEntriesWithErrorsCount}\n />\n <Box marginTop={7}>\n <SelectedEntriesTableContent\n isPublishing={isSubmittingForm}\n rowsToDisplay={rows}\n entriesToPublish={entriesToPublish}\n validationErrors={validationErrors}\n />\n </Box>\n </Modal.Body>\n <Modal.Footer>\n <Button onClick={toggleModal} variant=\"tertiary\">\n {formatMessage({\n id: 'app.components.Button.cancel',\n defaultMessage: 'Cancel',\n })}\n </Button>\n <Flex gap={2}>\n <Button onClick={refetch} variant=\"tertiary\" loading={isFetching}>\n {formatMessage({ id: 'app.utils.refresh', defaultMessage: 'Refresh' })}\n </Button>\n <Button\n onClick={toggleDialog}\n disabled={\n selectedEntries.length === 0 ||\n selectedEntries.length === selectedEntriesWithErrorsCount ||\n selectedEntriesPublishedCount === selectedEntries.length ||\n isLoading\n }\n loading={isPublishing || isSubmittingForm}\n >\n {formatMessage({ id: 'app.utils.publish', defaultMessage: 'Publish' })}\n </Button>\n </Flex>\n </Modal.Footer>\n <ConfirmDialogPublishAll\n isOpen={isDialogOpen}\n onToggleDialog={toggleDialog}\n isConfirmButtonLoading={isPublishing || isSubmittingForm}\n onConfirm={handleConfirmBulkPublish}\n />\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * PublishAction\n * -----------------------------------------------------------------------------------------------*/\n\nconst PublishAction: BulkActionComponent = ({ documents, model }) => {\n const { formatMessage } = useIntl();\n // Publish button visibility\n const hasPublishPermission = useDocumentRBAC('unpublishAction', (state) => state.canPublish);\n const showPublishButton =\n hasPublishPermission && documents.some(({ status }) => status !== 'published');\n\n const setListViewSelectedDocuments = useTable('publishAction', (state) => state.selectRow);\n\n const refetchList = () => {\n contentManagerApi.util.invalidateTags([{ type: 'Document', id: `${model}_LIST` }]);\n };\n\n if (!showPublishButton) return null;\n\n return {\n actionType: 'publish',\n variant: 'tertiary',\n label: formatMessage({ id: 'app.utils.publish', defaultMessage: 'Publish' }),\n dialog: {\n type: 'modal',\n title: formatMessage({\n id: getTranslation('containers.ListPage.selectedEntriesModal.title'),\n defaultMessage: 'Publish entries',\n }),\n content: ({ onClose }) => {\n return (\n <Table.Root rows={documents} defaultSelectedRows={documents} headers={TABLE_HEADERS}>\n <SelectedEntriesModalContent\n listViewSelectedEntries={documents}\n toggleModal={() => {\n onClose();\n refetchList();\n }}\n setListViewSelectedDocuments={setListViewSelectedDocuments}\n model={model}\n />\n </Table.Root>\n );\n },\n onClose: () => {\n refetchList();\n },\n },\n };\n};\n\nexport { PublishAction, SelectedEntriesModalContent };\n"],"names":["TypographyMaxWidth","styled","Typography","TableComponent","RawTable","theme","colors","neutral150","spaces","formatErrorMessages","errors","parentKey","formatMessage","messages","Object","entries","forEach","key","value","currentKey","isErrorMessageDescriptor","id","defaultMessage","push","field","EntryValidationText","validationErrors","status","useIntl","validationErrorsMessages","join","_jsxs","Flex","gap","_jsx","CrossCircle","fill","Tooltip","label","textColor","variant","fontWeight","ellipsis","CheckCircle","ArrowsCounterClockwise","TABLE_HEADERS","name","SelectedEntriesTableContent","isPublishing","rowsToDisplay","entriesToPublish","pathname","useLocation","list","settings","mainField","useDocLayout","shouldDisplayMainField","Table","Content","Head","HeaderCheckboxCell","filter","head","map","HeaderCell","Loading","Body","row","Row","CheckboxCell","Cell","DocumentStatus","maxWidth","includes","documentId","Loader","small","IconButton","tag","Link","to","search","locale","state","from","target","marginLeft","Pencil","width","height","PublicationStatusSummary","count","icon","message","justifyContent","flex","PublicationStatusGrid","entriesReadyToPublishCount","entriesPublishedCount","entriesModifiedCount","entriesWithErrorsCount","Box","hasRadius","borderColor","colCount","rowCount","Tbody","Tr","Td","SelectedEntriesModalContent","listViewSelectedEntries","toggleModal","setListViewSelectedDocuments","model","schema","components","useContentTypeSchema","documentIds","query","useQueryParams","params","React","useMemo","buildValidParams","data","isLoading","isFetching","refetch","useGetAllDocumentsQuery","page","pageSize","length","toString","sort","filters","$in","plugins","i18n","selectFromResult","restRes","results","rows","validate","createYupSchema","attributes","entry","validateSync","abortEarly","e","ValidationError","getYupValidationErrors","isDialogOpen","setIsDialogOpen","useState","publishMany","bulkPublishAction","useDocumentActions","isSubmittingForm","usePublishManyDocumentsMutation","selectedRows","useTable","selectedEntries","some","selectedEntry","selectedEntriesWithErrorsCount","selectedEntriesPublishedCount","selectedEntriesModifiedCount","selectedEntriesWithNoErrorsCount","toggleDialog","prev","handleConfirmBulkPublish","res","unpublishedEntries","_Fragment","Modal","marginTop","Footer","Button","onClick","loading","disabled","ConfirmDialogPublishAll","isOpen","onToggleDialog","isConfirmButtonLoading","onConfirm","PublishAction","documents","hasPublishPermission","useDocumentRBAC","canPublish","showPublishButton","selectRow","refetchList","contentManagerApi","util","invalidateTags","type","actionType","dialog","title","getTranslation","content","onClose","Root","defaultSelectedRows","headers"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
+ import * as React from 'react';
1
2
  import type { ComponentInputProps } from './Input';
2
3
  type NonRepeatableComponentProps = Omit<ComponentInputProps, 'required' | 'label'>;
3
- declare const NonRepeatableComponent: ({ attribute, name, children, layout, }: NonRepeatableComponentProps) => import("react/jsx-runtime").JSX.Element;
4
- export { NonRepeatableComponent };
4
+ declare const MemoizedNonRepeatableComponent: React.MemoExoticComponent<({ attribute, name, children, layout, }: NonRepeatableComponentProps) => import("react/jsx-runtime").JSX.Element>;
5
+ export { MemoizedNonRepeatableComponent as NonRepeatableComponent };
5
6
  export type { NonRepeatableComponentProps };
@@ -1,5 +1,6 @@
1
+ import * as React from 'react';
1
2
  import type { ComponentInputProps } from './Input';
2
3
  type RepeatableComponentProps = Omit<ComponentInputProps, 'required' | 'label'>;
3
- declare const RepeatableComponent: ({ attribute, disabled, name, mainField, children, layout, }: RepeatableComponentProps) => import("react/jsx-runtime").JSX.Element;
4
- export { RepeatableComponent };
4
+ declare const MemoizedRepeatableComponent: React.MemoExoticComponent<({ attribute, disabled, name, mainField, children, layout, }: RepeatableComponentProps) => import("react/jsx-runtime").JSX.Element>;
5
+ export { MemoizedRepeatableComponent as RepeatableComponent };
5
6
  export type { RepeatableComponentProps };
@@ -8,11 +8,11 @@ interface DynamicComponentProps extends Pick<UseDragAndDropOptions, 'onGrabItem'
8
8
  index: number;
9
9
  name: string;
10
10
  onAddComponent: (componentUid: string, index: number) => void;
11
- onRemoveComponentClick: () => void;
11
+ onRemoveComponentClick: (index: number) => void;
12
12
  onMoveComponent: (dragIndex: number, hoverIndex: number) => void;
13
13
  totalLength: number;
14
14
  children?: (props: InputRendererProps) => React.ReactNode;
15
15
  }
16
- declare const DynamicComponent: ({ componentUid, disabled, index, name, onRemoveComponentClick, onMoveComponent, onGrabItem, onDropItem, onCancel, dynamicComponentsByCategory, onAddComponent, totalLength, children, }: DynamicComponentProps) => import("react/jsx-runtime").JSX.Element;
17
- export { DynamicComponent };
16
+ declare const MemoizedDynamicComponent: React.MemoExoticComponent<({ componentUid, disabled, index, name, onRemoveComponentClick, onMoveComponent, onGrabItem, onDropItem, onCancel, dynamicComponentsByCategory, onAddComponent, totalLength, children, }: DynamicComponentProps) => import("react/jsx-runtime").JSX.Element>;
17
+ export { MemoizedDynamicComponent as DynamicComponent };
18
18
  export type { DynamicComponentProps };
@@ -30,5 +30,5 @@ interface FormLayoutProps extends Pick<EditLayout, 'layout'> {
30
30
  hasBackground?: boolean;
31
31
  document: ReturnType<UseDocument>;
32
32
  }
33
- declare const FormLayout: ({ layout, document, hasBackground }: FormLayoutProps) => import("react/jsx-runtime").JSX.Element;
33
+ declare const FormLayout: React.MemoExoticComponent<({ layout, document, hasBackground }: FormLayoutProps) => import("react/jsx-runtime").JSX.Element>;
34
34
  export { FormLayout, FormLayoutProps };
@@ -4,7 +4,7 @@ import type { EditFieldLayout } from '../../../hooks/useDocumentLayout';
4
4
  import type { Schema } from '@strapi/types';
5
5
  import type { DistributiveOmit } from 'react-redux';
6
6
  type InputRendererProps = DistributiveOmit<EditFieldLayout, 'size'> & {
7
- document: ReturnType<UseDocument>;
7
+ document?: ReturnType<UseDocument>;
8
8
  };
9
9
  declare const useFieldHint: (hint: React.ReactNode, attribute: Schema.Attribute.AnyAttribute) => string | number | boolean | import("react/jsx-runtime").JSX.Element | Iterable<React.ReactNode> | (string | import("react/jsx-runtime").JSX.Element | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal)[] | null | undefined;
10
10
  /**
@@ -1,6 +1,9 @@
1
+ import { FormErrors } from '@strapi/admin/strapi-admin';
2
+ import { type IntlShape } from 'react-intl';
1
3
  import { ConfirmDialogPublishAllProps } from './ConfirmBulkActionDialog';
2
4
  import type { BulkActionComponent } from '../../../../content-manager';
3
5
  import type { Document } from '../../../../hooks/useDocument';
6
+ export declare const formatErrorMessages: (errors: FormErrors, parentKey: string, formatMessage: IntlShape['formatMessage']) => string[];
4
7
  interface TableRow extends Document {
5
8
  }
6
9
  interface SelectedEntriesModalContentProps {
@@ -10,6 +10,9 @@ declare const listViewFilters: {
10
10
  Root: ({ disabled, schema, children }: FiltersProps) => import("react/jsx-runtime").JSX.Element;
11
11
  Trigger: React.ForwardRefExoticComponent<Filters.TriggerProps & React.RefAttributes<HTMLButtonElement>>;
12
12
  Popover: ({ zIndex }: {
13
+ /**
14
+ * If new attributes are added, this list needs to be updated.
15
+ */
13
16
  zIndex?: number | undefined;
14
17
  }) => import("react/jsx-runtime").JSX.Element | null;
15
18
  List: () => import("react/jsx-runtime").JSX.Element | null;
@@ -3,7 +3,7 @@
3
3
  var fp = require('lodash/fp');
4
4
  var strapiUtils = require('@strapi/utils');
5
5
 
6
- const { isVisibleAttribute } = strapiUtils.contentTypes;
6
+ const { isVisibleAttribute, hasDraftAndPublish } = strapiUtils.contentTypes;
7
7
  /**
8
8
  * sumDraftCounts works recursively on the attributes of a model counting the
9
9
  * number of draft relations
@@ -22,6 +22,13 @@ const { isVisibleAttribute } = strapiUtils.contentTypes;
22
22
  switch(attribute.type){
23
23
  case 'relation':
24
24
  {
25
+ if (!('target' in attribute)) {
26
+ return sum;
27
+ }
28
+ const targetModel = strapi.getModel(attribute.target);
29
+ if (!targetModel || !hasDraftAndPublish(targetModel)) {
30
+ return sum;
31
+ }
25
32
  if (isVisibleAttribute(model, attributeName)) {
26
33
  return sum + value.count;
27
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"draft.js","sources":["../../../../server/src/services/utils/draft.ts"],"sourcesContent":["import { castArray } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\n\nconst { isVisibleAttribute } = strapiUtils.contentTypes;\n/**\n * sumDraftCounts works recursively on the attributes of a model counting the\n * number of draft relations\n * These relations can be direct to this content type or contained within components/dynamic zones\n * @param {Object} entity containing the draft relation counts\n * @param {String} uid of the content type\n * @returns {Number} of draft relations\n */\nconst sumDraftCounts = (entity: any, uid: any): number => {\n const model = strapi.getModel(uid);\n\n return Object.keys(model.attributes).reduce((sum, attributeName) => {\n const attribute: any = model.attributes[attributeName];\n const value = entity[attributeName];\n if (!value) {\n return sum;\n }\n\n switch (attribute.type) {\n case 'relation': {\n if (isVisibleAttribute(model, attributeName)) {\n return sum + value.count;\n }\n return sum;\n }\n case 'component': {\n const compoSum = castArray(value).reduce((acc, componentValue) => {\n return acc + sumDraftCounts(componentValue, attribute.component);\n }, 0);\n return sum + compoSum;\n }\n case 'dynamiczone': {\n const dzSum = value.reduce((acc: any, componentValue: any) => {\n return acc + sumDraftCounts(componentValue, componentValue.__component);\n }, 0);\n return sum + dzSum;\n }\n default:\n return sum;\n }\n }, 0);\n};\n\nexport { sumDraftCounts };\n"],"names":["isVisibleAttribute","strapiUtils","contentTypes","sumDraftCounts","entity","uid","model","strapi","getModel","Object","keys","attributes","reduce","sum","attributeName","attribute","value","type","count","compoSum","castArray","acc","componentValue","component","dzSum","__component"],"mappings":";;;;;AAGA,MAAM,EAAEA,kBAAkB,EAAE,GAAGC,YAAYC,YAAY;AACvD;;;;;;;IAQA,MAAMC,cAAAA,GAAiB,CAACC,MAAAA,EAAaC,GAAAA,GAAAA;IACnC,MAAMC,KAAAA,GAAQC,MAAAA,CAAOC,QAAQ,CAACH,GAAAA,CAAAA;IAE9B,OAAOI,MAAAA,CAAOC,IAAI,CAACJ,KAAAA,CAAMK,UAAU,CAAA,CAAEC,MAAM,CAAC,CAACC,GAAAA,EAAKC,aAAAA,GAAAA;AAChD,QAAA,MAAMC,SAAAA,GAAiBT,KAAAA,CAAMK,UAAU,CAACG,aAAAA,CAAc;QACtD,MAAME,KAAAA,GAAQZ,MAAM,CAACU,aAAAA,CAAc;AACnC,QAAA,IAAI,CAACE,KAAAA,EAAO;YACV,OAAOH,GAAAA;AACT,QAAA;AAEA,QAAA,OAAQE,UAAUE,IAAI;YACpB,KAAK,UAAA;AAAY,gBAAA;oBACf,IAAIjB,kBAAAA,CAAmBM,OAAOQ,aAAAA,CAAAA,EAAgB;wBAC5C,OAAOD,GAAAA,GAAMG,MAAME,KAAK;AAC1B,oBAAA;oBACA,OAAOL,GAAAA;AACT,gBAAA;YACA,KAAK,WAAA;AAAa,gBAAA;AAChB,oBAAA,MAAMM,WAAWC,YAAAA,CAAUJ,KAAAA,CAAAA,CAAOJ,MAAM,CAAC,CAACS,GAAAA,EAAKC,cAAAA,GAAAA;AAC7C,wBAAA,OAAOD,GAAAA,GAAMlB,cAAAA,CAAemB,cAAAA,EAAgBP,SAAAA,CAAUQ,SAAS,CAAA;oBACjE,CAAA,EAAG,CAAA,CAAA;AACH,oBAAA,OAAOV,GAAAA,GAAMM,QAAAA;AACf,gBAAA;YACA,KAAK,aAAA;AAAe,gBAAA;AAClB,oBAAA,MAAMK,KAAAA,GAAQR,KAAAA,CAAMJ,MAAM,CAAC,CAACS,GAAAA,EAAUC,cAAAA,GAAAA;AACpC,wBAAA,OAAOD,GAAAA,GAAMlB,cAAAA,CAAemB,cAAAA,EAAgBA,cAAAA,CAAeG,WAAW,CAAA;oBACxE,CAAA,EAAG,CAAA,CAAA;AACH,oBAAA,OAAOZ,GAAAA,GAAMW,KAAAA;AACf,gBAAA;AACA,YAAA;gBACE,OAAOX,GAAAA;AACX;IACF,CAAA,EAAG,CAAA,CAAA;AACL;;;;"}
1
+ {"version":3,"file":"draft.js","sources":["../../../../server/src/services/utils/draft.ts"],"sourcesContent":["import { castArray } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\n\nconst { isVisibleAttribute, hasDraftAndPublish } = strapiUtils.contentTypes;\n/**\n * sumDraftCounts works recursively on the attributes of a model counting the\n * number of draft relations\n * These relations can be direct to this content type or contained within components/dynamic zones\n * @param {Object} entity containing the draft relation counts\n * @param {String} uid of the content type\n * @returns {Number} of draft relations\n */\nconst sumDraftCounts = (entity: any, uid: any): number => {\n const model = strapi.getModel(uid);\n\n return Object.keys(model.attributes).reduce((sum, attributeName) => {\n const attribute: any = model.attributes[attributeName];\n const value = entity[attributeName];\n if (!value) {\n return sum;\n }\n\n switch (attribute.type) {\n case 'relation': {\n if (!('target' in attribute)) {\n return sum;\n }\n\n const targetModel = strapi.getModel(attribute.target);\n if (!targetModel || !hasDraftAndPublish(targetModel)) {\n return sum;\n }\n if (isVisibleAttribute(model, attributeName)) {\n return sum + value.count;\n }\n return sum;\n }\n case 'component': {\n const compoSum = castArray(value).reduce((acc, componentValue) => {\n return acc + sumDraftCounts(componentValue, attribute.component);\n }, 0);\n return sum + compoSum;\n }\n case 'dynamiczone': {\n const dzSum = value.reduce((acc: any, componentValue: any) => {\n return acc + sumDraftCounts(componentValue, componentValue.__component);\n }, 0);\n return sum + dzSum;\n }\n default:\n return sum;\n }\n }, 0);\n};\n\nexport { sumDraftCounts };\n"],"names":["isVisibleAttribute","hasDraftAndPublish","strapiUtils","contentTypes","sumDraftCounts","entity","uid","model","strapi","getModel","Object","keys","attributes","reduce","sum","attributeName","attribute","value","type","targetModel","target","count","compoSum","castArray","acc","componentValue","component","dzSum","__component"],"mappings":";;;;;AAGA,MAAM,EAAEA,kBAAkB,EAAEC,kBAAkB,EAAE,GAAGC,YAAYC,YAAY;AAC3E;;;;;;;IAQA,MAAMC,cAAAA,GAAiB,CAACC,MAAAA,EAAaC,GAAAA,GAAAA;IACnC,MAAMC,KAAAA,GAAQC,MAAAA,CAAOC,QAAQ,CAACH,GAAAA,CAAAA;IAE9B,OAAOI,MAAAA,CAAOC,IAAI,CAACJ,KAAAA,CAAMK,UAAU,CAAA,CAAEC,MAAM,CAAC,CAACC,GAAAA,EAAKC,aAAAA,GAAAA;AAChD,QAAA,MAAMC,SAAAA,GAAiBT,KAAAA,CAAMK,UAAU,CAACG,aAAAA,CAAc;QACtD,MAAME,KAAAA,GAAQZ,MAAM,CAACU,aAAAA,CAAc;AACnC,QAAA,IAAI,CAACE,KAAAA,EAAO;YACV,OAAOH,GAAAA;AACT,QAAA;AAEA,QAAA,OAAQE,UAAUE,IAAI;YACpB,KAAK,UAAA;AAAY,gBAAA;AACf,oBAAA,IAAI,EAAE,QAAA,IAAYF,SAAQ,CAAA,EAAI;wBAC5B,OAAOF,GAAAA;AACT,oBAAA;AAEA,oBAAA,MAAMK,WAAAA,GAAcX,MAAAA,CAAOC,QAAQ,CAACO,UAAUI,MAAM,CAAA;AACpD,oBAAA,IAAI,CAACD,WAAAA,IAAe,CAAClB,kBAAAA,CAAmBkB,WAAAA,CAAAA,EAAc;wBACpD,OAAOL,GAAAA;AACT,oBAAA;oBACA,IAAId,kBAAAA,CAAmBO,OAAOQ,aAAAA,CAAAA,EAAgB;wBAC5C,OAAOD,GAAAA,GAAMG,MAAMI,KAAK;AAC1B,oBAAA;oBACA,OAAOP,GAAAA;AACT,gBAAA;YACA,KAAK,WAAA;AAAa,gBAAA;AAChB,oBAAA,MAAMQ,WAAWC,YAAAA,CAAUN,KAAAA,CAAAA,CAAOJ,MAAM,CAAC,CAACW,GAAAA,EAAKC,cAAAA,GAAAA;AAC7C,wBAAA,OAAOD,GAAAA,GAAMpB,cAAAA,CAAeqB,cAAAA,EAAgBT,SAAAA,CAAUU,SAAS,CAAA;oBACjE,CAAA,EAAG,CAAA,CAAA;AACH,oBAAA,OAAOZ,GAAAA,GAAMQ,QAAAA;AACf,gBAAA;YACA,KAAK,aAAA;AAAe,gBAAA;AAClB,oBAAA,MAAMK,KAAAA,GAAQV,KAAAA,CAAMJ,MAAM,CAAC,CAACW,GAAAA,EAAUC,cAAAA,GAAAA;AACpC,wBAAA,OAAOD,GAAAA,GAAMpB,cAAAA,CAAeqB,cAAAA,EAAgBA,cAAAA,CAAeG,WAAW,CAAA;oBACxE,CAAA,EAAG,CAAA,CAAA;AACH,oBAAA,OAAOd,GAAAA,GAAMa,KAAAA;AACf,gBAAA;AACA,YAAA;gBACE,OAAOb,GAAAA;AACX;IACF,CAAA,EAAG,CAAA,CAAA;AACL;;;;"}
@@ -1,7 +1,7 @@
1
1
  import { castArray } from 'lodash/fp';
2
2
  import strapiUtils from '@strapi/utils';
3
3
 
4
- const { isVisibleAttribute } = strapiUtils.contentTypes;
4
+ const { isVisibleAttribute, hasDraftAndPublish } = strapiUtils.contentTypes;
5
5
  /**
6
6
  * sumDraftCounts works recursively on the attributes of a model counting the
7
7
  * number of draft relations
@@ -20,6 +20,13 @@ const { isVisibleAttribute } = strapiUtils.contentTypes;
20
20
  switch(attribute.type){
21
21
  case 'relation':
22
22
  {
23
+ if (!('target' in attribute)) {
24
+ return sum;
25
+ }
26
+ const targetModel = strapi.getModel(attribute.target);
27
+ if (!targetModel || !hasDraftAndPublish(targetModel)) {
28
+ return sum;
29
+ }
23
30
  if (isVisibleAttribute(model, attributeName)) {
24
31
  return sum + value.count;
25
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"draft.mjs","sources":["../../../../server/src/services/utils/draft.ts"],"sourcesContent":["import { castArray } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\n\nconst { isVisibleAttribute } = strapiUtils.contentTypes;\n/**\n * sumDraftCounts works recursively on the attributes of a model counting the\n * number of draft relations\n * These relations can be direct to this content type or contained within components/dynamic zones\n * @param {Object} entity containing the draft relation counts\n * @param {String} uid of the content type\n * @returns {Number} of draft relations\n */\nconst sumDraftCounts = (entity: any, uid: any): number => {\n const model = strapi.getModel(uid);\n\n return Object.keys(model.attributes).reduce((sum, attributeName) => {\n const attribute: any = model.attributes[attributeName];\n const value = entity[attributeName];\n if (!value) {\n return sum;\n }\n\n switch (attribute.type) {\n case 'relation': {\n if (isVisibleAttribute(model, attributeName)) {\n return sum + value.count;\n }\n return sum;\n }\n case 'component': {\n const compoSum = castArray(value).reduce((acc, componentValue) => {\n return acc + sumDraftCounts(componentValue, attribute.component);\n }, 0);\n return sum + compoSum;\n }\n case 'dynamiczone': {\n const dzSum = value.reduce((acc: any, componentValue: any) => {\n return acc + sumDraftCounts(componentValue, componentValue.__component);\n }, 0);\n return sum + dzSum;\n }\n default:\n return sum;\n }\n }, 0);\n};\n\nexport { sumDraftCounts };\n"],"names":["isVisibleAttribute","strapiUtils","contentTypes","sumDraftCounts","entity","uid","model","strapi","getModel","Object","keys","attributes","reduce","sum","attributeName","attribute","value","type","count","compoSum","castArray","acc","componentValue","component","dzSum","__component"],"mappings":";;;AAGA,MAAM,EAAEA,kBAAkB,EAAE,GAAGC,YAAYC,YAAY;AACvD;;;;;;;IAQA,MAAMC,cAAAA,GAAiB,CAACC,MAAAA,EAAaC,GAAAA,GAAAA;IACnC,MAAMC,KAAAA,GAAQC,MAAAA,CAAOC,QAAQ,CAACH,GAAAA,CAAAA;IAE9B,OAAOI,MAAAA,CAAOC,IAAI,CAACJ,KAAAA,CAAMK,UAAU,CAAA,CAAEC,MAAM,CAAC,CAACC,GAAAA,EAAKC,aAAAA,GAAAA;AAChD,QAAA,MAAMC,SAAAA,GAAiBT,KAAAA,CAAMK,UAAU,CAACG,aAAAA,CAAc;QACtD,MAAME,KAAAA,GAAQZ,MAAM,CAACU,aAAAA,CAAc;AACnC,QAAA,IAAI,CAACE,KAAAA,EAAO;YACV,OAAOH,GAAAA;AACT,QAAA;AAEA,QAAA,OAAQE,UAAUE,IAAI;YACpB,KAAK,UAAA;AAAY,gBAAA;oBACf,IAAIjB,kBAAAA,CAAmBM,OAAOQ,aAAAA,CAAAA,EAAgB;wBAC5C,OAAOD,GAAAA,GAAMG,MAAME,KAAK;AAC1B,oBAAA;oBACA,OAAOL,GAAAA;AACT,gBAAA;YACA,KAAK,WAAA;AAAa,gBAAA;AAChB,oBAAA,MAAMM,WAAWC,SAAAA,CAAUJ,KAAAA,CAAAA,CAAOJ,MAAM,CAAC,CAACS,GAAAA,EAAKC,cAAAA,GAAAA;AAC7C,wBAAA,OAAOD,GAAAA,GAAMlB,cAAAA,CAAemB,cAAAA,EAAgBP,SAAAA,CAAUQ,SAAS,CAAA;oBACjE,CAAA,EAAG,CAAA,CAAA;AACH,oBAAA,OAAOV,GAAAA,GAAMM,QAAAA;AACf,gBAAA;YACA,KAAK,aAAA;AAAe,gBAAA;AAClB,oBAAA,MAAMK,KAAAA,GAAQR,KAAAA,CAAMJ,MAAM,CAAC,CAACS,GAAAA,EAAUC,cAAAA,GAAAA;AACpC,wBAAA,OAAOD,GAAAA,GAAMlB,cAAAA,CAAemB,cAAAA,EAAgBA,cAAAA,CAAeG,WAAW,CAAA;oBACxE,CAAA,EAAG,CAAA,CAAA;AACH,oBAAA,OAAOZ,GAAAA,GAAMW,KAAAA;AACf,gBAAA;AACA,YAAA;gBACE,OAAOX,GAAAA;AACX;IACF,CAAA,EAAG,CAAA,CAAA;AACL;;;;"}
1
+ {"version":3,"file":"draft.mjs","sources":["../../../../server/src/services/utils/draft.ts"],"sourcesContent":["import { castArray } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\n\nconst { isVisibleAttribute, hasDraftAndPublish } = strapiUtils.contentTypes;\n/**\n * sumDraftCounts works recursively on the attributes of a model counting the\n * number of draft relations\n * These relations can be direct to this content type or contained within components/dynamic zones\n * @param {Object} entity containing the draft relation counts\n * @param {String} uid of the content type\n * @returns {Number} of draft relations\n */\nconst sumDraftCounts = (entity: any, uid: any): number => {\n const model = strapi.getModel(uid);\n\n return Object.keys(model.attributes).reduce((sum, attributeName) => {\n const attribute: any = model.attributes[attributeName];\n const value = entity[attributeName];\n if (!value) {\n return sum;\n }\n\n switch (attribute.type) {\n case 'relation': {\n if (!('target' in attribute)) {\n return sum;\n }\n\n const targetModel = strapi.getModel(attribute.target);\n if (!targetModel || !hasDraftAndPublish(targetModel)) {\n return sum;\n }\n if (isVisibleAttribute(model, attributeName)) {\n return sum + value.count;\n }\n return sum;\n }\n case 'component': {\n const compoSum = castArray(value).reduce((acc, componentValue) => {\n return acc + sumDraftCounts(componentValue, attribute.component);\n }, 0);\n return sum + compoSum;\n }\n case 'dynamiczone': {\n const dzSum = value.reduce((acc: any, componentValue: any) => {\n return acc + sumDraftCounts(componentValue, componentValue.__component);\n }, 0);\n return sum + dzSum;\n }\n default:\n return sum;\n }\n }, 0);\n};\n\nexport { sumDraftCounts };\n"],"names":["isVisibleAttribute","hasDraftAndPublish","strapiUtils","contentTypes","sumDraftCounts","entity","uid","model","strapi","getModel","Object","keys","attributes","reduce","sum","attributeName","attribute","value","type","targetModel","target","count","compoSum","castArray","acc","componentValue","component","dzSum","__component"],"mappings":";;;AAGA,MAAM,EAAEA,kBAAkB,EAAEC,kBAAkB,EAAE,GAAGC,YAAYC,YAAY;AAC3E;;;;;;;IAQA,MAAMC,cAAAA,GAAiB,CAACC,MAAAA,EAAaC,GAAAA,GAAAA;IACnC,MAAMC,KAAAA,GAAQC,MAAAA,CAAOC,QAAQ,CAACH,GAAAA,CAAAA;IAE9B,OAAOI,MAAAA,CAAOC,IAAI,CAACJ,KAAAA,CAAMK,UAAU,CAAA,CAAEC,MAAM,CAAC,CAACC,GAAAA,EAAKC,aAAAA,GAAAA;AAChD,QAAA,MAAMC,SAAAA,GAAiBT,KAAAA,CAAMK,UAAU,CAACG,aAAAA,CAAc;QACtD,MAAME,KAAAA,GAAQZ,MAAM,CAACU,aAAAA,CAAc;AACnC,QAAA,IAAI,CAACE,KAAAA,EAAO;YACV,OAAOH,GAAAA;AACT,QAAA;AAEA,QAAA,OAAQE,UAAUE,IAAI;YACpB,KAAK,UAAA;AAAY,gBAAA;AACf,oBAAA,IAAI,EAAE,QAAA,IAAYF,SAAQ,CAAA,EAAI;wBAC5B,OAAOF,GAAAA;AACT,oBAAA;AAEA,oBAAA,MAAMK,WAAAA,GAAcX,MAAAA,CAAOC,QAAQ,CAACO,UAAUI,MAAM,CAAA;AACpD,oBAAA,IAAI,CAACD,WAAAA,IAAe,CAAClB,kBAAAA,CAAmBkB,WAAAA,CAAAA,EAAc;wBACpD,OAAOL,GAAAA;AACT,oBAAA;oBACA,IAAId,kBAAAA,CAAmBO,OAAOQ,aAAAA,CAAAA,EAAgB;wBAC5C,OAAOD,GAAAA,GAAMG,MAAMI,KAAK;AAC1B,oBAAA;oBACA,OAAOP,GAAAA;AACT,gBAAA;YACA,KAAK,WAAA;AAAa,gBAAA;AAChB,oBAAA,MAAMQ,WAAWC,SAAAA,CAAUN,KAAAA,CAAAA,CAAOJ,MAAM,CAAC,CAACW,GAAAA,EAAKC,cAAAA,GAAAA;AAC7C,wBAAA,OAAOD,GAAAA,GAAMpB,cAAAA,CAAeqB,cAAAA,EAAgBT,SAAAA,CAAUU,SAAS,CAAA;oBACjE,CAAA,EAAG,CAAA,CAAA;AACH,oBAAA,OAAOZ,GAAAA,GAAMQ,QAAAA;AACf,gBAAA;YACA,KAAK,aAAA;AAAe,gBAAA;AAClB,oBAAA,MAAMK,KAAAA,GAAQV,KAAAA,CAAMJ,MAAM,CAAC,CAACW,GAAAA,EAAUC,cAAAA,GAAAA;AACpC,wBAAA,OAAOD,GAAAA,GAAMpB,cAAAA,CAAeqB,cAAAA,EAAgBA,cAAAA,CAAeG,WAAW,CAAA;oBACxE,CAAA,EAAG,CAAA,CAAA;AACH,oBAAA,OAAOd,GAAAA,GAAMa,KAAAA;AACf,gBAAA;AACA,YAAA;gBACE,OAAOb,GAAAA;AACX;IACF,CAAA,EAAG,CAAA,CAAA;AACL;;;;"}
@@ -4,7 +4,7 @@ var fp = require('lodash/fp');
4
4
  var strapiUtils = require('@strapi/utils');
5
5
  var index = require('../../utils/index.js');
6
6
 
7
- const { isVisibleAttribute, isScalarAttribute, getDoesAttributeRequireValidation } = strapiUtils.contentTypes;
7
+ const { isVisibleAttribute, isScalarAttribute, getDoesAttributeRequireValidation, hasDraftAndPublish } = strapiUtils.contentTypes;
8
8
  const { isAnyToMany } = strapiUtils.relations;
9
9
  const { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants;
10
10
  const isMorphToRelation = (attribute)=>isRelation(attribute) && attribute.relation.includes('morphTo');
@@ -195,6 +195,12 @@ const isDynamicZone = fp.propEq('type', 'dynamiczone');
195
195
  * @returns result.hasRelations
196
196
  */ const getDeepPopulateDraftCount = (uid)=>{
197
197
  const model = strapi.getModel(uid);
198
+ if (!model) {
199
+ return {
200
+ populate: {},
201
+ hasRelations: false
202
+ };
203
+ }
198
204
  let hasRelations = false;
199
205
  const populate = Object.keys(model.attributes).reduce((populateAcc, attributeName)=>{
200
206
  const attribute = model.attributes[attributeName];
@@ -206,6 +212,15 @@ const isDynamicZone = fp.propEq('type', 'dynamiczone');
206
212
  if (isMorphRelation) {
207
213
  break;
208
214
  }
215
+ // Skip relations to content types without draft & publish,
216
+ // as they don't have a publishedAt attribute and can't have drafts
217
+ if (!('target' in attribute)) {
218
+ break;
219
+ }
220
+ const targetModel = strapi.getModel(attribute.target);
221
+ if (!targetModel || !hasDraftAndPublish(targetModel)) {
222
+ break;
223
+ }
209
224
  if (isVisibleAttribute(model, attributeName)) {
210
225
  populateAcc[attributeName] = {
211
226
  count: true,
@@ -1 +1 @@
1
- {"version":3,"file":"populate.js","sources":["../../../../server/src/services/utils/populate.ts"],"sourcesContent":["import { merge, isEmpty, set, propEq } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\nimport type { UID, Schema, Modules } from '@strapi/types';\nimport { getService } from '../../utils';\n\nconst { isVisibleAttribute, isScalarAttribute, getDoesAttributeRequireValidation } =\n strapiUtils.contentTypes;\nconst { isAnyToMany } = strapiUtils.relations;\nconst { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants;\n\nconst isMorphToRelation = (attribute: any) =>\n isRelation(attribute) && attribute.relation.includes('morphTo');\nconst isMedia = propEq('type', 'media');\nconst isRelation = propEq('type', 'relation');\nconst isComponent = propEq('type', 'component');\nconst isDynamicZone = propEq('type', 'dynamiczone');\n\n// TODO: Import from @strapi/types when it's available there\ntype Model = Parameters<typeof isVisibleAttribute>[0];\nexport type Populate = Modules.EntityService.Params.Populate.Any<UID.Schema>;\n\ntype PopulateOptions = {\n initialPopulate?: Populate;\n countMany?: boolean;\n countOne?: boolean;\n maxLevel?: number;\n};\n\n/**\n * Populate the model for relation\n * @param attribute - Attribute containing a relation\n * @param attribute.relation - type of relation\n * @param model - Model of the populated entity\n * @param attributeName\n * @param options - Options to apply while populating\n */\nfunction getPopulateForRelation(\n attribute: Schema.Attribute.AnyAttribute,\n model: Model,\n attributeName: string,\n { countMany, countOne, initialPopulate }: PopulateOptions\n) {\n const isManyRelation = isAnyToMany(attribute);\n\n if (initialPopulate) {\n return initialPopulate;\n }\n\n // If populating localizations attribute, also include validatable fields\n // Mainly needed for bulk locale publishing, so the Client has all the information necessary to perform validations\n if (attributeName === 'localizations') {\n const validationPopulate = getPopulateForValidation(model.uid as UID.Schema);\n\n return {\n populate: validationPopulate.populate,\n };\n }\n\n // always populate createdBy, updatedBy, localizations etc.\n if (!isVisibleAttribute(model, attributeName)) {\n return true;\n }\n\n if ((isManyRelation && countMany) || (!isManyRelation && countOne)) {\n return { count: true };\n }\n\n return true;\n}\n\n/**\n * Populate the model for Dynamic Zone components\n * @param attribute - Attribute containing the components\n * @param attribute.components - IDs of components\n * @param options - Options to apply while populating\n */\nfunction getPopulateForDZ(\n attribute: Schema.Attribute.DynamicZone,\n options: PopulateOptions,\n level: number\n) {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => ({\n ...acc,\n [componentUID]: {\n populate: getDeepPopulate(componentUID, options, level + 1),\n },\n }),\n {}\n );\n\n return { on: populatedComponents };\n}\n\n/**\n * Get the populated value based on the type of the attribute\n * @param attributeName - Name of the attribute\n * @param model - Model of the populated entity\n * @param model.attributes\n * @param options - Options to apply while populating\n * @param options.countMany\n * @param options.countOne\n * @param options.maxLevel\n * @param level\n */\nfunction getPopulateFor(\n attributeName: string,\n model: any,\n options: PopulateOptions,\n level: number\n): { [key: string]: boolean | object } {\n const attribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation':\n // @ts-expect-error - TODO: support populate count typing\n return {\n [attributeName]: getPopulateForRelation(attribute, model, attributeName, options),\n };\n case 'component':\n return {\n [attributeName]: {\n populate: getDeepPopulate(attribute.component, options, level + 1),\n },\n };\n case 'media':\n return {\n [attributeName]: {\n populate: {\n folder: true,\n },\n },\n };\n case 'dynamiczone':\n return {\n [attributeName]: getPopulateForDZ(attribute, options, level),\n };\n default:\n return {};\n }\n}\n\n/**\n * Deeply populate a model based on UID\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getDeepPopulate = (\n uid: UID.Schema,\n {\n initialPopulate = {} as any,\n countMany = false,\n countOne = false,\n maxLevel = Infinity,\n }: PopulateOptions = {},\n level = 1\n) => {\n if (level > maxLevel) {\n return {};\n }\n\n const model = strapi.getModel(uid);\n\n if (!model) {\n return {};\n }\n\n return Object.keys(model.attributes).reduce(\n (populateAcc, attributeName: string) =>\n merge(\n populateAcc,\n getPopulateFor(\n attributeName,\n model,\n {\n // @ts-expect-error - improve types\n initialPopulate: initialPopulate?.[attributeName],\n countMany,\n countOne,\n maxLevel,\n },\n level\n )\n ),\n {}\n );\n};\n\n/**\n * Deeply populate a model based on UID. Only populating fields that require validation.\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getPopulateForValidation = (uid: UID.Schema): Record<string, any> => {\n const model = strapi.getModel(uid);\n if (!model) {\n return {};\n }\n\n return Object.entries(model.attributes).reduce((populateAcc: any, [attributeName, attribute]) => {\n if (isScalarAttribute(attribute)) {\n // If the scalar attribute requires validation, add it to the fields array\n if (getDoesAttributeRequireValidation(attribute)) {\n populateAcc.fields = populateAcc.fields || [];\n populateAcc.fields.push(attributeName);\n }\n return populateAcc;\n }\n\n if (isMedia(attribute)) {\n if (getDoesAttributeRequireValidation(attribute)) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = {\n populate: {\n folder: true,\n },\n };\n return populateAcc;\n }\n }\n\n if (isComponent(attribute)) {\n // @ts-expect-error - should be a component\n const component = attribute.component;\n\n // Get the validation result for this component\n const componentResult = getPopulateForValidation(component);\n\n if (Object.keys(componentResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = componentResult;\n }\n\n return populateAcc;\n }\n\n if (isDynamicZone(attribute)) {\n const components = (attribute as Schema.Attribute.DynamicZone).components;\n // Handle dynamic zone components\n const componentsResult = (components || []).reduce(\n (acc, componentUID) => {\n // Get validation populate for this component\n const componentResult = getPopulateForValidation(componentUID);\n\n // Only include component if it has fields requiring validation\n if (Object.keys(componentResult).length > 0) {\n acc[componentUID] = componentResult;\n }\n\n return acc;\n },\n {} as Record<string, any>\n );\n\n // Only add to populate if we have components requiring validation\n if (Object.keys(componentsResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = { on: componentsResult };\n }\n }\n\n return populateAcc;\n }, {});\n};\n\n/**\n * getDeepPopulateDraftCount works recursively on the attributes of a model\n * creating a populated object to count all the unpublished relations within the model\n * These relations can be direct to this content type or contained within components/dynamic zones\n * @param uid of the model\n * @returns result\n * @returns result.populate\n * @returns result.hasRelations\n */\nconst getDeepPopulateDraftCount = (uid: UID.Schema) => {\n const model = strapi.getModel(uid);\n let hasRelations = false;\n\n const populate = Object.keys(model.attributes).reduce((populateAcc: any, attributeName) => {\n const attribute: Schema.Attribute.AnyAttribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation': {\n // TODO: Support polymorphic relations\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n if (isMorphRelation) {\n break;\n }\n\n if (isVisibleAttribute(model, attributeName)) {\n populateAcc[attributeName] = {\n count: true,\n filters: { [PUBLISHED_AT_ATTRIBUTE]: { $null: true } },\n };\n hasRelations = true;\n }\n break;\n }\n case 'component': {\n const { populate, hasRelations: childHasRelations } = getDeepPopulateDraftCount(\n attribute.component\n );\n if (childHasRelations) {\n populateAcc[attributeName] = {\n populate,\n };\n hasRelations = true;\n }\n break;\n }\n case 'dynamiczone': {\n const dzPopulateFragment = attribute.components?.reduce((acc, componentUID) => {\n const { populate: componentPopulate, hasRelations: componentHasRelations } =\n getDeepPopulateDraftCount(componentUID);\n\n if (componentHasRelations) {\n hasRelations = true;\n\n return { ...acc, [componentUID]: { populate: componentPopulate } };\n }\n\n return acc;\n }, {});\n\n if (!isEmpty(dzPopulateFragment)) {\n populateAcc[attributeName] = { on: dzPopulateFragment };\n }\n break;\n }\n default:\n }\n\n return populateAcc;\n }, {});\n\n return { populate, hasRelations };\n};\n\n/**\n * Create a Strapi populate object which populates all attribute fields of a Strapi query.\n */\nconst getQueryPopulate = async (uid: UID.Schema, query: object): Promise<Populate> => {\n let populateQuery: Populate = {};\n\n await strapiUtils.traverse.traverseQueryFilters(\n /**\n *\n * @param {Object} param0\n * @param {string} param0.key - Attribute name\n * @param {Object} param0.attribute - Attribute definition\n * @param {string} param0.path - Content Type path to the attribute\n * @returns\n */\n ({ attribute, path }: any) => {\n // TODO: handle dynamic zones and morph relations\n if (!attribute || isDynamicZone(attribute) || isMorphToRelation(attribute)) {\n return;\n }\n\n // Populate all relations, components and media\n if (isRelation(attribute) || isMedia(attribute) || isComponent(attribute)) {\n const populatePath = path.attribute.replace(/\\./g, '.populate.');\n // @ts-expect-error - lodash doesn't resolve the Populate type correctly\n populateQuery = set(populatePath, {}, populateQuery);\n }\n },\n { schema: strapi.getModel(uid), getModel: strapi.getModel.bind(strapi) },\n query\n );\n\n return populateQuery;\n};\n\nconst buildDeepPopulate = (uid: UID.CollectionType) => {\n return getService('populate-builder')(uid).populateDeep(Infinity).countRelations().build();\n};\n\nexport {\n getDeepPopulate,\n getDeepPopulateDraftCount,\n getPopulateForValidation,\n getQueryPopulate,\n buildDeepPopulate,\n};\n"],"names":["isVisibleAttribute","isScalarAttribute","getDoesAttributeRequireValidation","strapiUtils","contentTypes","isAnyToMany","relations","PUBLISHED_AT_ATTRIBUTE","constants","isMorphToRelation","attribute","isRelation","relation","includes","isMedia","propEq","isComponent","isDynamicZone","getPopulateForRelation","model","attributeName","countMany","countOne","initialPopulate","isManyRelation","validationPopulate","getPopulateForValidation","uid","populate","count","getPopulateForDZ","options","level","populatedComponents","components","reduce","acc","componentUID","getDeepPopulate","on","getPopulateFor","attributes","type","component","folder","maxLevel","Infinity","strapi","getModel","Object","keys","populateAcc","merge","entries","fields","push","componentResult","length","componentsResult","getDeepPopulateDraftCount","hasRelations","isMorphRelation","toLowerCase","startsWith","filters","$null","childHasRelations","dzPopulateFragment","componentPopulate","componentHasRelations","isEmpty","getQueryPopulate","query","populateQuery","traverse","traverseQueryFilters","path","populatePath","replace","set","schema","bind","buildDeepPopulate","getService","populateDeep","countRelations","build"],"mappings":"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"}
1
+ {"version":3,"file":"populate.js","sources":["../../../../server/src/services/utils/populate.ts"],"sourcesContent":["import { merge, isEmpty, set, propEq } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\nimport type { UID, Schema, Modules } from '@strapi/types';\nimport { getService } from '../../utils';\n\nconst {\n isVisibleAttribute,\n isScalarAttribute,\n getDoesAttributeRequireValidation,\n hasDraftAndPublish,\n} = strapiUtils.contentTypes;\nconst { isAnyToMany } = strapiUtils.relations;\nconst { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants;\n\nconst isMorphToRelation = (attribute: any) =>\n isRelation(attribute) && attribute.relation.includes('morphTo');\nconst isMedia = propEq('type', 'media');\nconst isRelation = propEq('type', 'relation');\nconst isComponent = propEq('type', 'component');\nconst isDynamicZone = propEq('type', 'dynamiczone');\n\n// TODO: Import from @strapi/types when it's available there\ntype Model = Parameters<typeof isVisibleAttribute>[0];\nexport type Populate = Modules.EntityService.Params.Populate.Any<UID.Schema>;\n\ntype PopulateOptions = {\n initialPopulate?: Populate;\n countMany?: boolean;\n countOne?: boolean;\n maxLevel?: number;\n};\n\n/**\n * Populate the model for relation\n * @param attribute - Attribute containing a relation\n * @param attribute.relation - type of relation\n * @param model - Model of the populated entity\n * @param attributeName\n * @param options - Options to apply while populating\n */\nfunction getPopulateForRelation(\n attribute: Schema.Attribute.AnyAttribute,\n model: Model,\n attributeName: string,\n { countMany, countOne, initialPopulate }: PopulateOptions\n) {\n const isManyRelation = isAnyToMany(attribute);\n\n if (initialPopulate) {\n return initialPopulate;\n }\n\n // If populating localizations attribute, also include validatable fields\n // Mainly needed for bulk locale publishing, so the Client has all the information necessary to perform validations\n if (attributeName === 'localizations') {\n const validationPopulate = getPopulateForValidation(model.uid as UID.Schema);\n\n return {\n populate: validationPopulate.populate,\n };\n }\n\n // always populate createdBy, updatedBy, localizations etc.\n if (!isVisibleAttribute(model, attributeName)) {\n return true;\n }\n\n if ((isManyRelation && countMany) || (!isManyRelation && countOne)) {\n return { count: true };\n }\n\n return true;\n}\n\n/**\n * Populate the model for Dynamic Zone components\n * @param attribute - Attribute containing the components\n * @param attribute.components - IDs of components\n * @param options - Options to apply while populating\n */\nfunction getPopulateForDZ(\n attribute: Schema.Attribute.DynamicZone,\n options: PopulateOptions,\n level: number\n) {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => ({\n ...acc,\n [componentUID]: {\n populate: getDeepPopulate(componentUID, options, level + 1),\n },\n }),\n {}\n );\n\n return { on: populatedComponents };\n}\n\n/**\n * Get the populated value based on the type of the attribute\n * @param attributeName - Name of the attribute\n * @param model - Model of the populated entity\n * @param model.attributes\n * @param options - Options to apply while populating\n * @param options.countMany\n * @param options.countOne\n * @param options.maxLevel\n * @param level\n */\nfunction getPopulateFor(\n attributeName: string,\n model: any,\n options: PopulateOptions,\n level: number\n): { [key: string]: boolean | object } {\n const attribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation':\n // @ts-expect-error - TODO: support populate count typing\n return {\n [attributeName]: getPopulateForRelation(attribute, model, attributeName, options),\n };\n case 'component':\n return {\n [attributeName]: {\n populate: getDeepPopulate(attribute.component, options, level + 1),\n },\n };\n case 'media':\n return {\n [attributeName]: {\n populate: {\n folder: true,\n },\n },\n };\n case 'dynamiczone':\n return {\n [attributeName]: getPopulateForDZ(attribute, options, level),\n };\n default:\n return {};\n }\n}\n\n/**\n * Deeply populate a model based on UID\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getDeepPopulate = (\n uid: UID.Schema,\n {\n initialPopulate = {} as any,\n countMany = false,\n countOne = false,\n maxLevel = Infinity,\n }: PopulateOptions = {},\n level = 1\n) => {\n if (level > maxLevel) {\n return {};\n }\n\n const model = strapi.getModel(uid);\n\n if (!model) {\n return {};\n }\n\n return Object.keys(model.attributes).reduce(\n (populateAcc, attributeName: string) =>\n merge(\n populateAcc,\n getPopulateFor(\n attributeName,\n model,\n {\n // @ts-expect-error - improve types\n initialPopulate: initialPopulate?.[attributeName],\n countMany,\n countOne,\n maxLevel,\n },\n level\n )\n ),\n {}\n );\n};\n\n/**\n * Deeply populate a model based on UID. Only populating fields that require validation.\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getPopulateForValidation = (uid: UID.Schema): Record<string, any> => {\n const model = strapi.getModel(uid);\n if (!model) {\n return {};\n }\n\n return Object.entries(model.attributes).reduce((populateAcc: any, [attributeName, attribute]) => {\n if (isScalarAttribute(attribute)) {\n // If the scalar attribute requires validation, add it to the fields array\n if (getDoesAttributeRequireValidation(attribute)) {\n populateAcc.fields = populateAcc.fields || [];\n populateAcc.fields.push(attributeName);\n }\n return populateAcc;\n }\n\n if (isMedia(attribute)) {\n if (getDoesAttributeRequireValidation(attribute)) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = {\n populate: {\n folder: true,\n },\n };\n return populateAcc;\n }\n }\n\n if (isComponent(attribute)) {\n // @ts-expect-error - should be a component\n const component = attribute.component;\n\n // Get the validation result for this component\n const componentResult = getPopulateForValidation(component);\n\n if (Object.keys(componentResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = componentResult;\n }\n\n return populateAcc;\n }\n\n if (isDynamicZone(attribute)) {\n const components = (attribute as Schema.Attribute.DynamicZone).components;\n // Handle dynamic zone components\n const componentsResult = (components || []).reduce(\n (acc, componentUID) => {\n // Get validation populate for this component\n const componentResult = getPopulateForValidation(componentUID);\n\n // Only include component if it has fields requiring validation\n if (Object.keys(componentResult).length > 0) {\n acc[componentUID] = componentResult;\n }\n\n return acc;\n },\n {} as Record<string, any>\n );\n\n // Only add to populate if we have components requiring validation\n if (Object.keys(componentsResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = { on: componentsResult };\n }\n }\n\n return populateAcc;\n }, {});\n};\n\n/**\n * getDeepPopulateDraftCount works recursively on the attributes of a model\n * creating a populated object to count all the unpublished relations within the model\n * These relations can be direct to this content type or contained within components/dynamic zones\n * @param uid of the model\n * @returns result\n * @returns result.populate\n * @returns result.hasRelations\n */\nconst getDeepPopulateDraftCount = (uid: UID.Schema) => {\n const model = strapi.getModel(uid);\n if (!model) {\n return { populate: {}, hasRelations: false };\n }\n let hasRelations = false;\n\n const populate = Object.keys(model.attributes).reduce((populateAcc: any, attributeName) => {\n const attribute: Schema.Attribute.AnyAttribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation': {\n // TODO: Support polymorphic relations\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n if (isMorphRelation) {\n break;\n }\n\n // Skip relations to content types without draft & publish,\n // as they don't have a publishedAt attribute and can't have drafts\n if (!('target' in attribute)) {\n break;\n }\n\n const targetModel = strapi.getModel(attribute.target);\n if (!targetModel || !hasDraftAndPublish(targetModel)) {\n break;\n }\n\n if (isVisibleAttribute(model, attributeName)) {\n populateAcc[attributeName] = {\n count: true,\n filters: { [PUBLISHED_AT_ATTRIBUTE]: { $null: true } },\n };\n hasRelations = true;\n }\n break;\n }\n case 'component': {\n const { populate, hasRelations: childHasRelations } = getDeepPopulateDraftCount(\n attribute.component\n );\n if (childHasRelations) {\n populateAcc[attributeName] = {\n populate,\n };\n hasRelations = true;\n }\n break;\n }\n case 'dynamiczone': {\n const dzPopulateFragment = attribute.components?.reduce((acc, componentUID) => {\n const { populate: componentPopulate, hasRelations: componentHasRelations } =\n getDeepPopulateDraftCount(componentUID);\n\n if (componentHasRelations) {\n hasRelations = true;\n\n return { ...acc, [componentUID]: { populate: componentPopulate } };\n }\n\n return acc;\n }, {});\n\n if (!isEmpty(dzPopulateFragment)) {\n populateAcc[attributeName] = { on: dzPopulateFragment };\n }\n break;\n }\n default:\n }\n\n return populateAcc;\n }, {});\n\n return { populate, hasRelations };\n};\n\n/**\n * Create a Strapi populate object which populates all attribute fields of a Strapi query.\n */\nconst getQueryPopulate = async (uid: UID.Schema, query: object): Promise<Populate> => {\n let populateQuery: Populate = {};\n\n await strapiUtils.traverse.traverseQueryFilters(\n /**\n *\n * @param {Object} param0\n * @param {string} param0.key - Attribute name\n * @param {Object} param0.attribute - Attribute definition\n * @param {string} param0.path - Content Type path to the attribute\n * @returns\n */\n ({ attribute, path }: any) => {\n // TODO: handle dynamic zones and morph relations\n if (!attribute || isDynamicZone(attribute) || isMorphToRelation(attribute)) {\n return;\n }\n\n // Populate all relations, components and media\n if (isRelation(attribute) || isMedia(attribute) || isComponent(attribute)) {\n const populatePath = path.attribute.replace(/\\./g, '.populate.');\n // @ts-expect-error - lodash doesn't resolve the Populate type correctly\n populateQuery = set(populatePath, {}, populateQuery);\n }\n },\n { schema: strapi.getModel(uid), getModel: strapi.getModel.bind(strapi) },\n query\n );\n\n return populateQuery;\n};\n\nconst buildDeepPopulate = (uid: UID.CollectionType) => {\n return getService('populate-builder')(uid).populateDeep(Infinity).countRelations().build();\n};\n\nexport {\n getDeepPopulate,\n getDeepPopulateDraftCount,\n getPopulateForValidation,\n getQueryPopulate,\n buildDeepPopulate,\n};\n"],"names":["isVisibleAttribute","isScalarAttribute","getDoesAttributeRequireValidation","hasDraftAndPublish","strapiUtils","contentTypes","isAnyToMany","relations","PUBLISHED_AT_ATTRIBUTE","constants","isMorphToRelation","attribute","isRelation","relation","includes","isMedia","propEq","isComponent","isDynamicZone","getPopulateForRelation","model","attributeName","countMany","countOne","initialPopulate","isManyRelation","validationPopulate","getPopulateForValidation","uid","populate","count","getPopulateForDZ","options","level","populatedComponents","components","reduce","acc","componentUID","getDeepPopulate","on","getPopulateFor","attributes","type","component","folder","maxLevel","Infinity","strapi","getModel","Object","keys","populateAcc","merge","entries","fields","push","componentResult","length","componentsResult","getDeepPopulateDraftCount","hasRelations","isMorphRelation","toLowerCase","startsWith","targetModel","target","filters","$null","childHasRelations","dzPopulateFragment","componentPopulate","componentHasRelations","isEmpty","getQueryPopulate","query","populateQuery","traverse","traverseQueryFilters","path","populatePath","replace","set","schema","bind","buildDeepPopulate","getService","populateDeep","countRelations","build"],"mappings":";;;;;;AAKA,MAAM,EACJA,kBAAkB,EAClBC,iBAAiB,EACjBC,iCAAiC,EACjCC,kBAAkB,EACnB,GAAGC,WAAAA,CAAYC,YAAY;AAC5B,MAAM,EAAEC,WAAW,EAAE,GAAGF,YAAYG,SAAS;AAC7C,MAAM,EAAEC,sBAAsB,EAAE,GAAGJ,WAAAA,CAAYC,YAAY,CAACI,SAAS;AAErE,MAAMC,iBAAAA,GAAoB,CAACC,SAAAA,GACzBC,UAAAA,CAAWD,cAAcA,SAAAA,CAAUE,QAAQ,CAACC,QAAQ,CAAC,SAAA,CAAA;AACvD,MAAMC,OAAAA,GAAUC,UAAO,MAAA,EAAQ,OAAA,CAAA;AAC/B,MAAMJ,UAAAA,GAAaI,UAAO,MAAA,EAAQ,UAAA,CAAA;AAClC,MAAMC,WAAAA,GAAcD,UAAO,MAAA,EAAQ,WAAA,CAAA;AACnC,MAAME,aAAAA,GAAgBF,UAAO,MAAA,EAAQ,aAAA,CAAA;AAarC;;;;;;;AAOC,IACD,SAASG,sBAAAA,CACPR,SAAwC,EACxCS,KAAY,EACZC,aAAqB,EACrB,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,eAAe,EAAmB,EAAA;AAEzD,IAAA,MAAMC,iBAAiBnB,WAAAA,CAAYK,SAAAA,CAAAA;AAEnC,IAAA,IAAIa,eAAAA,EAAiB;QACnB,OAAOA,eAAAA;AACT,IAAA;;;AAIA,IAAA,IAAIH,kBAAkB,eAAA,EAAiB;QACrC,MAAMK,kBAAAA,GAAqBC,wBAAAA,CAAyBP,KAAAA,CAAMQ,GAAG,CAAA;QAE7D,OAAO;AACLC,YAAAA,QAAAA,EAAUH,mBAAmBG;AAC/B,SAAA;AACF,IAAA;;IAGA,IAAI,CAAC7B,kBAAAA,CAAmBoB,KAAAA,EAAOC,aAAAA,CAAAA,EAAgB;QAC7C,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,IAAI,cAACI,IAAkBH,SAAAA,IAAe,CAACG,kBAAkBF,QAAAA,EAAW;QAClE,OAAO;YAAEO,KAAAA,EAAO;AAAK,SAAA;AACvB,IAAA;IAEA,OAAO,IAAA;AACT;AAEA;;;;;AAKC,IACD,SAASC,gBAAAA,CACPpB,SAAuC,EACvCqB,OAAwB,EACxBC,KAAa,EAAA;;AAGb,IAAA,MAAMC,mBAAAA,GAAuBvB,CAAAA,SAAAA,CAAUwB,UAAU,IAAI,EAAE,EAAEC,MAAM,CAC7D,CAACC,GAAAA,EAAUC,gBAAiC;AAC1C,YAAA,GAAGD,GAAG;AACN,YAAA,CAACC,eAAe;gBACdT,QAAAA,EAAUU,eAAAA,CAAgBD,YAAAA,EAAcN,OAAAA,EAASC,KAAAA,GAAQ,CAAA;AAC3D;AACF,SAAA,GACA,EAAC,CAAA;IAGH,OAAO;QAAEO,EAAAA,EAAIN;AAAoB,KAAA;AACnC;AAEA;;;;;;;;;;IAWA,SAASO,eACPpB,aAAqB,EACrBD,KAAU,EACVY,OAAwB,EACxBC,KAAa,EAAA;AAEb,IAAA,MAAMtB,SAAAA,GAAYS,KAAAA,CAAMsB,UAAU,CAACrB,aAAAA,CAAc;AAEjD,IAAA,OAAQV,UAAUgC,IAAI;QACpB,KAAK,UAAA;;YAEH,OAAO;AACL,gBAAA,CAACtB,aAAAA,GAAgBF,sBAAAA,CAAuBR,SAAAA,EAAWS,OAAOC,aAAAA,EAAeW,OAAAA;AAC3E,aAAA;QACF,KAAK,WAAA;YACH,OAAO;AACL,gBAAA,CAACX,gBAAgB;AACfQ,oBAAAA,QAAAA,EAAUU,eAAAA,CAAgB5B,SAAAA,CAAUiC,SAAS,EAAEZ,SAASC,KAAAA,GAAQ,CAAA;AAClE;AACF,aAAA;QACF,KAAK,OAAA;YACH,OAAO;AACL,gBAAA,CAACZ,gBAAgB;oBACfQ,QAAAA,EAAU;wBACRgB,MAAAA,EAAQ;AACV;AACF;AACF,aAAA;QACF,KAAK,aAAA;YACH,OAAO;AACL,gBAAA,CAACxB,aAAAA,GAAgBU,gBAAAA,CAAiBpB,SAAAA,EAAWqB,OAAAA,EAASC,KAAAA;AACxD,aAAA;AACF,QAAA;AACE,YAAA,OAAO,EAAC;AACZ;AACF;AAEA;;;;;IAMA,MAAMM,kBAAkB,CACtBX,GAAAA,EACA,EACEJ,eAAAA,GAAkB,EAAS,EAC3BF,SAAAA,GAAY,KAAK,EACjBC,QAAAA,GAAW,KAAK,EAChBuB,QAAAA,GAAWC,QAAQ,EACH,GAAG,EAAE,EACvBd,KAAAA,GAAQ,CAAC,GAAA;AAET,IAAA,IAAIA,QAAQa,QAAAA,EAAU;AACpB,QAAA,OAAO,EAAC;AACV,IAAA;IAEA,MAAM1B,KAAAA,GAAQ4B,MAAAA,CAAOC,QAAQ,CAACrB,GAAAA,CAAAA;AAE9B,IAAA,IAAI,CAACR,KAAAA,EAAO;AACV,QAAA,OAAO,EAAC;AACV,IAAA;AAEA,IAAA,OAAO8B,MAAAA,CAAOC,IAAI,CAAC/B,KAAAA,CAAMsB,UAAU,CAAA,CAAEN,MAAM,CACzC,CAACgB,aAAa/B,aAAAA,GACZgC,QAAAA,CACED,WAAAA,EACAX,cAAAA,CACEpB,eACAD,KAAAA,EACA;;YAEEI,eAAAA,EAAiBA,eAAAA,GAAkBH,aAAAA,CAAc;AACjDC,YAAAA,SAAAA;AACAC,YAAAA,QAAAA;AACAuB,YAAAA;AACF,SAAA,EACAb,SAGN,EAAC,CAAA;AAEL;AAEA;;;;;IAMA,MAAMN,2BAA2B,CAACC,GAAAA,GAAAA;IAChC,MAAMR,KAAAA,GAAQ4B,MAAAA,CAAOC,QAAQ,CAACrB,GAAAA,CAAAA;AAC9B,IAAA,IAAI,CAACR,KAAAA,EAAO;AACV,QAAA,OAAO,EAAC;AACV,IAAA;AAEA,IAAA,OAAO8B,MAAAA,CAAOI,OAAO,CAAClC,KAAAA,CAAMsB,UAAU,CAAA,CAAEN,MAAM,CAAC,CAACgB,WAAAA,EAAkB,CAAC/B,aAAAA,EAAeV,SAAAA,CAAU,GAAA;AAC1F,QAAA,IAAIV,kBAAkBU,SAAAA,CAAAA,EAAY;;AAEhC,YAAA,IAAIT,kCAAkCS,SAAAA,CAAAA,EAAY;AAChDyC,gBAAAA,WAAAA,CAAYG,MAAM,GAAGH,WAAAA,CAAYG,MAAM,IAAI,EAAE;gBAC7CH,WAAAA,CAAYG,MAAM,CAACC,IAAI,CAACnC,aAAAA,CAAAA;AAC1B,YAAA;YACA,OAAO+B,WAAAA;AACT,QAAA;AAEA,QAAA,IAAIrC,QAAQJ,SAAAA,CAAAA,EAAY;AACtB,YAAA,IAAIT,kCAAkCS,SAAAA,CAAAA,EAAY;AAChDyC,gBAAAA,WAAAA,CAAYvB,QAAQ,GAAGuB,WAAAA,CAAYvB,QAAQ,IAAI,EAAC;gBAChDuB,WAAAA,CAAYvB,QAAQ,CAACR,aAAAA,CAAc,GAAG;oBACpCQ,QAAAA,EAAU;wBACRgB,MAAAA,EAAQ;AACV;AACF,iBAAA;gBACA,OAAOO,WAAAA;AACT,YAAA;AACF,QAAA;AAEA,QAAA,IAAInC,YAAYN,SAAAA,CAAAA,EAAY;;YAE1B,MAAMiC,SAAAA,GAAYjC,UAAUiC,SAAS;;AAGrC,YAAA,MAAMa,kBAAkB9B,wBAAAA,CAAyBiB,SAAAA,CAAAA;AAEjD,YAAA,IAAIM,OAAOC,IAAI,CAACM,eAAAA,CAAAA,CAAiBC,MAAM,GAAG,CAAA,EAAG;AAC3CN,gBAAAA,WAAAA,CAAYvB,QAAQ,GAAGuB,WAAAA,CAAYvB,QAAQ,IAAI,EAAC;gBAChDuB,WAAAA,CAAYvB,QAAQ,CAACR,aAAAA,CAAc,GAAGoC,eAAAA;AACxC,YAAA;YAEA,OAAOL,WAAAA;AACT,QAAA;AAEA,QAAA,IAAIlC,cAAcP,SAAAA,CAAAA,EAAY;YAC5B,MAAMwB,UAAAA,GAAa,SAACxB,CAA2CwB,UAAU;;YAEzE,MAAMwB,gBAAAA,GAAmB,CAACxB,UAAAA,IAAc,EAAE,EAAEC,MAAM,CAChD,CAACC,GAAAA,EAAKC,YAAAA,GAAAA;;AAEJ,gBAAA,MAAMmB,kBAAkB9B,wBAAAA,CAAyBW,YAAAA,CAAAA;;AAGjD,gBAAA,IAAIY,OAAOC,IAAI,CAACM,eAAAA,CAAAA,CAAiBC,MAAM,GAAG,CAAA,EAAG;oBAC3CrB,GAAG,CAACC,aAAa,GAAGmB,eAAAA;AACtB,gBAAA;gBAEA,OAAOpB,GAAAA;AACT,YAAA,CAAA,EACA,EAAC,CAAA;;AAIH,YAAA,IAAIa,OAAOC,IAAI,CAACQ,gBAAAA,CAAAA,CAAkBD,MAAM,GAAG,CAAA,EAAG;AAC5CN,gBAAAA,WAAAA,CAAYvB,QAAQ,GAAGuB,WAAAA,CAAYvB,QAAQ,IAAI,EAAC;gBAChDuB,WAAAA,CAAYvB,QAAQ,CAACR,aAAAA,CAAc,GAAG;oBAAEmB,EAAAA,EAAImB;AAAiB,iBAAA;AAC/D,YAAA;AACF,QAAA;QAEA,OAAOP,WAAAA;AACT,IAAA,CAAA,EAAG,EAAC,CAAA;AACN;AAEA;;;;;;;;IASA,MAAMQ,4BAA4B,CAAChC,GAAAA,GAAAA;IACjC,MAAMR,KAAAA,GAAQ4B,MAAAA,CAAOC,QAAQ,CAACrB,GAAAA,CAAAA;AAC9B,IAAA,IAAI,CAACR,KAAAA,EAAO;QACV,OAAO;AAAES,YAAAA,QAAAA,EAAU,EAAC;YAAGgC,YAAAA,EAAc;AAAM,SAAA;AAC7C,IAAA;AACA,IAAA,IAAIA,YAAAA,GAAe,KAAA;IAEnB,MAAMhC,QAAAA,GAAWqB,MAAAA,CAAOC,IAAI,CAAC/B,KAAAA,CAAMsB,UAAU,CAAA,CAAEN,MAAM,CAAC,CAACgB,WAAAA,EAAkB/B,aAAAA,GAAAA;AACvE,QAAA,MAAMV,SAAAA,GAA2CS,KAAAA,CAAMsB,UAAU,CAACrB,aAAAA,CAAc;AAEhF,QAAA,OAAQV,UAAUgC,IAAI;YACpB,KAAK,UAAA;AAAY,gBAAA;;AAEf,oBAAA,MAAMmB,kBAAkBnD,SAAAA,CAAUE,QAAQ,CAACkD,WAAW,EAAA,CAAGC,UAAU,CAAC,OAAA,CAAA;AACpE,oBAAA,IAAIF,eAAAA,EAAiB;AACnB,wBAAA;AACF,oBAAA;;;AAIA,oBAAA,IAAI,EAAE,QAAA,IAAYnD,SAAQ,CAAA,EAAI;AAC5B,wBAAA;AACF,oBAAA;AAEA,oBAAA,MAAMsD,WAAAA,GAAcjB,MAAAA,CAAOC,QAAQ,CAACtC,UAAUuD,MAAM,CAAA;AACpD,oBAAA,IAAI,CAACD,WAAAA,IAAe,CAAC9D,kBAAAA,CAAmB8D,WAAAA,CAAAA,EAAc;AACpD,wBAAA;AACF,oBAAA;oBAEA,IAAIjE,kBAAAA,CAAmBoB,OAAOC,aAAAA,CAAAA,EAAgB;wBAC5C+B,WAAW,CAAC/B,cAAc,GAAG;4BAC3BS,KAAAA,EAAO,IAAA;4BACPqC,OAAAA,EAAS;AAAE,gCAAA,CAAC3D,yBAAyB;oCAAE4D,KAAAA,EAAO;AAAK;AAAE;AACvD,yBAAA;wBACAP,YAAAA,GAAe,IAAA;AACjB,oBAAA;AACA,oBAAA;AACF,gBAAA;YACA,KAAK,WAAA;AAAa,gBAAA;oBAChB,MAAM,EAAEhC,QAAQ,EAAEgC,YAAAA,EAAcQ,iBAAiB,EAAE,GAAGT,yBAAAA,CACpDjD,SAAAA,CAAUiC,SAAS,CAAA;AAErB,oBAAA,IAAIyB,iBAAAA,EAAmB;wBACrBjB,WAAW,CAAC/B,cAAc,GAAG;AAC3BQ,4BAAAA;AACF,yBAAA;wBACAgC,YAAAA,GAAe,IAAA;AACjB,oBAAA;AACA,oBAAA;AACF,gBAAA;YACA,KAAK,aAAA;AAAe,gBAAA;AAClB,oBAAA,MAAMS,qBAAqB3D,SAAAA,CAAUwB,UAAU,EAAEC,MAAAA,CAAO,CAACC,GAAAA,EAAKC,YAAAA,GAAAA;wBAC5D,MAAM,EAAET,UAAU0C,iBAAiB,EAAEV,cAAcW,qBAAqB,EAAE,GACxEZ,yBAAAA,CAA0BtB,YAAAA,CAAAA;AAE5B,wBAAA,IAAIkC,qBAAAA,EAAuB;4BACzBX,YAAAA,GAAe,IAAA;4BAEf,OAAO;AAAE,gCAAA,GAAGxB,GAAG;AAAE,gCAAA,CAACC,eAAe;oCAAET,QAAAA,EAAU0C;AAAkB;AAAE,6BAAA;AACnE,wBAAA;wBAEA,OAAOlC,GAAAA;AACT,oBAAA,CAAA,EAAG,EAAC,CAAA;oBAEJ,IAAI,CAACoC,WAAQH,kBAAAA,CAAAA,EAAqB;wBAChClB,WAAW,CAAC/B,cAAc,GAAG;4BAAEmB,EAAAA,EAAI8B;AAAmB,yBAAA;AACxD,oBAAA;AACA,oBAAA;AACF,gBAAA;AAEF;QAEA,OAAOlB,WAAAA;AACT,IAAA,CAAA,EAAG,EAAC,CAAA;IAEJ,OAAO;AAAEvB,QAAAA,QAAAA;AAAUgC,QAAAA;AAAa,KAAA;AAClC;AAEA;;IAGA,MAAMa,gBAAAA,GAAmB,OAAO9C,GAAAA,EAAiB+C,KAAAA,GAAAA;AAC/C,IAAA,IAAIC,gBAA0B,EAAC;AAE/B,IAAA,MAAMxE,WAAAA,CAAYyE,QAAQ,CAACC,oBAAoB;;;;;;;AAQ5C,QACD,CAAC,EAAEnE,SAAS,EAAEoE,IAAI,EAAO,GAAA;;AAEvB,QAAA,IAAI,CAACpE,SAAAA,IAAaO,aAAAA,CAAcP,SAAAA,CAAAA,IAAcD,kBAAkBC,SAAAA,CAAAA,EAAY;AAC1E,YAAA;AACF,QAAA;;AAGA,QAAA,IAAIC,UAAAA,CAAWD,SAAAA,CAAAA,IAAcI,OAAAA,CAAQJ,SAAAA,CAAAA,IAAcM,YAAYN,SAAAA,CAAAA,EAAY;AACzE,YAAA,MAAMqE,eAAeD,IAAAA,CAAKpE,SAAS,CAACsE,OAAO,CAAC,KAAA,EAAO,YAAA,CAAA;;YAEnDL,aAAAA,GAAgBM,MAAAA,CAAIF,YAAAA,EAAc,EAAC,EAAGJ,aAAAA,CAAAA;AACxC,QAAA;IACF,CAAA,EACA;QAAEO,MAAAA,EAAQnC,MAAAA,CAAOC,QAAQ,CAACrB,GAAAA,CAAAA;AAAMqB,QAAAA,QAAAA,EAAUD,MAAAA,CAAOC,QAAQ,CAACmC,IAAI,CAACpC,MAAAA;KAAQ,EACvE2B,KAAAA,CAAAA;IAGF,OAAOC,aAAAA;AACT;AAEA,MAAMS,oBAAoB,CAACzD,GAAAA,GAAAA;IACzB,OAAO0D,gBAAAA,CAAW,oBAAoB1D,GAAAA,CAAAA,CAAK2D,YAAY,CAACxC,QAAAA,CAAAA,CAAUyC,cAAc,GAAGC,KAAK,EAAA;AAC1F;;;;;;;;"}
@@ -2,7 +2,7 @@ import { propEq, isEmpty, merge, set } from 'lodash/fp';
2
2
  import strapiUtils from '@strapi/utils';
3
3
  import { getService } from '../../utils/index.mjs';
4
4
 
5
- const { isVisibleAttribute, isScalarAttribute, getDoesAttributeRequireValidation } = strapiUtils.contentTypes;
5
+ const { isVisibleAttribute, isScalarAttribute, getDoesAttributeRequireValidation, hasDraftAndPublish } = strapiUtils.contentTypes;
6
6
  const { isAnyToMany } = strapiUtils.relations;
7
7
  const { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants;
8
8
  const isMorphToRelation = (attribute)=>isRelation(attribute) && attribute.relation.includes('morphTo');
@@ -193,6 +193,12 @@ const isDynamicZone = propEq('type', 'dynamiczone');
193
193
  * @returns result.hasRelations
194
194
  */ const getDeepPopulateDraftCount = (uid)=>{
195
195
  const model = strapi.getModel(uid);
196
+ if (!model) {
197
+ return {
198
+ populate: {},
199
+ hasRelations: false
200
+ };
201
+ }
196
202
  let hasRelations = false;
197
203
  const populate = Object.keys(model.attributes).reduce((populateAcc, attributeName)=>{
198
204
  const attribute = model.attributes[attributeName];
@@ -204,6 +210,15 @@ const isDynamicZone = propEq('type', 'dynamiczone');
204
210
  if (isMorphRelation) {
205
211
  break;
206
212
  }
213
+ // Skip relations to content types without draft & publish,
214
+ // as they don't have a publishedAt attribute and can't have drafts
215
+ if (!('target' in attribute)) {
216
+ break;
217
+ }
218
+ const targetModel = strapi.getModel(attribute.target);
219
+ if (!targetModel || !hasDraftAndPublish(targetModel)) {
220
+ break;
221
+ }
207
222
  if (isVisibleAttribute(model, attributeName)) {
208
223
  populateAcc[attributeName] = {
209
224
  count: true,