@strapi/content-releases 5.20.0 → 5.21.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 (75) hide show
  1. package/dist/admin/components/EntryValidationPopover.js +62 -96
  2. package/dist/admin/components/EntryValidationPopover.js.map +1 -1
  3. package/dist/admin/components/EntryValidationPopover.mjs +64 -98
  4. package/dist/admin/components/EntryValidationPopover.mjs.map +1 -1
  5. package/dist/admin/components/Widgets.js +122 -0
  6. package/dist/admin/components/Widgets.js.map +1 -0
  7. package/dist/admin/components/Widgets.mjs +120 -0
  8. package/dist/admin/components/Widgets.mjs.map +1 -0
  9. package/dist/admin/constants.js +2 -0
  10. package/dist/admin/constants.js.map +1 -1
  11. package/dist/admin/constants.mjs +2 -1
  12. package/dist/admin/constants.mjs.map +1 -1
  13. package/dist/admin/index.js +24 -2
  14. package/dist/admin/index.js.map +1 -1
  15. package/dist/admin/index.mjs +25 -3
  16. package/dist/admin/index.mjs.map +1 -1
  17. package/dist/admin/services/homepage.js +24 -0
  18. package/dist/admin/services/homepage.js.map +1 -0
  19. package/dist/admin/services/homepage.mjs +22 -0
  20. package/dist/admin/services/homepage.mjs.map +1 -0
  21. package/dist/admin/services/release.js +20 -10
  22. package/dist/admin/services/release.js.map +1 -1
  23. package/dist/admin/services/release.mjs +20 -10
  24. package/dist/admin/services/release.mjs.map +1 -1
  25. package/dist/admin/src/components/Widgets.d.ts +2 -0
  26. package/dist/admin/src/constants.d.ts +1 -0
  27. package/dist/admin/src/services/homepage.d.ts +9 -0
  28. package/dist/admin/src/services/release.d.ts +28 -28
  29. package/dist/admin/translations/en.json.js +4 -1
  30. package/dist/admin/translations/en.json.js.map +1 -1
  31. package/dist/admin/translations/en.json.mjs +4 -1
  32. package/dist/admin/translations/en.json.mjs.map +1 -1
  33. package/dist/server/controllers/homepage.js +15 -0
  34. package/dist/server/controllers/homepage.js.map +1 -0
  35. package/dist/server/controllers/homepage.mjs +13 -0
  36. package/dist/server/controllers/homepage.mjs.map +1 -0
  37. package/dist/server/controllers/index.js +2 -0
  38. package/dist/server/controllers/index.js.map +1 -1
  39. package/dist/server/controllers/index.mjs +2 -0
  40. package/dist/server/controllers/index.mjs.map +1 -1
  41. package/dist/server/routes/homepage.js +25 -0
  42. package/dist/server/routes/homepage.js.map +1 -0
  43. package/dist/server/routes/homepage.mjs +23 -0
  44. package/dist/server/routes/homepage.mjs.map +1 -0
  45. package/dist/server/routes/index.js +2 -0
  46. package/dist/server/routes/index.js.map +1 -1
  47. package/dist/server/routes/index.mjs +2 -0
  48. package/dist/server/routes/index.mjs.map +1 -1
  49. package/dist/server/services/homepage.js +29 -0
  50. package/dist/server/services/homepage.js.map +1 -0
  51. package/dist/server/services/homepage.mjs +27 -0
  52. package/dist/server/services/homepage.mjs.map +1 -0
  53. package/dist/server/services/index.js +2 -0
  54. package/dist/server/services/index.js.map +1 -1
  55. package/dist/server/services/index.mjs +2 -0
  56. package/dist/server/services/index.mjs.map +1 -1
  57. package/dist/server/src/controllers/homepage.d.ts +6 -0
  58. package/dist/server/src/controllers/homepage.d.ts.map +1 -0
  59. package/dist/server/src/controllers/index.d.ts +3 -0
  60. package/dist/server/src/controllers/index.d.ts.map +1 -1
  61. package/dist/server/src/index.d.ts +9 -0
  62. package/dist/server/src/index.d.ts.map +1 -1
  63. package/dist/server/src/routes/homepage.d.ts +4 -0
  64. package/dist/server/src/routes/homepage.d.ts.map +1 -0
  65. package/dist/server/src/routes/index.d.ts +1 -0
  66. package/dist/server/src/routes/index.d.ts.map +1 -1
  67. package/dist/server/src/services/homepage.d.ts +9 -0
  68. package/dist/server/src/services/homepage.d.ts.map +1 -0
  69. package/dist/server/src/services/index.d.ts +5 -0
  70. package/dist/server/src/services/index.d.ts.map +1 -1
  71. package/dist/shared/contracts/homepage.d.ts +11 -0
  72. package/dist/shared/contracts/homepage.d.ts.map +1 -0
  73. package/dist/shared/types.d.ts +1 -0
  74. package/dist/shared/types.d.ts.map +1 -1
  75. package/package.json +7 -7
@@ -22,124 +22,90 @@ const StyledPopoverFlex = styledComponents.styled(designSystem.Flex)`
22
22
  border-bottom: none;
23
23
  }
24
24
  `;
25
+ const ButtonContent = styledComponents.styled(designSystem.Flex)`
26
+ svg {
27
+ fill: currentColor;
28
+ }
29
+ `;
30
+ const CustomStatusButton = ({ children, icon, color })=>{
31
+ return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Popover.Trigger, {
32
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
33
+ variant: "ghost",
34
+ endIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.CaretDown, {}),
35
+ children: /*#__PURE__*/ jsxRuntime.jsxs(ButtonContent, {
36
+ color: color,
37
+ gap: 2,
38
+ children: [
39
+ icon,
40
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
41
+ textColor: color,
42
+ variant: "omega",
43
+ fontWeight: "bold",
44
+ children: children
45
+ })
46
+ ]
47
+ })
48
+ })
49
+ });
50
+ };
25
51
  const EntryStatusTrigger = ({ action, status, hasErrors, requiredStage, entryStage })=>{
26
52
  const { formatMessage } = reactIntl.useIntl();
27
53
  if (action === 'publish') {
28
54
  if (hasErrors || requiredStage && requiredStage.id !== entryStage?.id) {
29
- return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Popover.Trigger, {
30
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
31
- variant: "ghost",
32
- startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.CrossCircle, {
33
- fill: "danger600"
34
- }),
35
- endIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.CaretDown, {}),
36
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
37
- textColor: "danger600",
38
- variant: "omega",
39
- fontWeight: "bold",
40
- children: formatMessage({
41
- id: 'content-releases.pages.ReleaseDetails.entry-validation.not-ready',
42
- defaultMessage: 'Not ready to publish'
43
- })
44
- })
55
+ return /*#__PURE__*/ jsxRuntime.jsx(CustomStatusButton, {
56
+ icon: /*#__PURE__*/ jsxRuntime.jsx(icons.CrossCircle, {}),
57
+ color: "danger600",
58
+ children: formatMessage({
59
+ id: 'content-releases.pages.ReleaseDetails.entry-validation.not-ready',
60
+ defaultMessage: 'Not ready to publish'
45
61
  })
46
62
  });
47
63
  }
48
64
  if (status === 'draft') {
49
- return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Popover.Trigger, {
50
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
51
- variant: "ghost",
52
- startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.CheckCircle, {
53
- fill: "success600"
54
- }),
55
- endIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.CaretDown, {}),
56
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
57
- textColor: "success600",
58
- variant: "omega",
59
- fontWeight: "bold",
60
- children: formatMessage({
61
- id: 'content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish',
62
- defaultMessage: 'Ready to publish'
63
- })
64
- })
65
+ return /*#__PURE__*/ jsxRuntime.jsx(CustomStatusButton, {
66
+ icon: /*#__PURE__*/ jsxRuntime.jsx(icons.CheckCircle, {}),
67
+ color: "success600",
68
+ children: formatMessage({
69
+ id: 'content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish',
70
+ defaultMessage: 'Ready to publish'
65
71
  })
66
72
  });
67
73
  }
68
74
  if (status === 'modified') {
69
- return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Popover.Trigger, {
70
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
71
- variant: "ghost",
72
- startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.ArrowsCounterClockwise, {
73
- fill: "alternative600"
74
- }),
75
- endIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.CaretDown, {}),
76
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
77
- variant: "omega",
78
- fontWeight: "bold",
79
- textColor: "alternative600",
80
- children: formatMessage({
81
- id: 'content-releases.pages.ReleaseDetails.entry-validation.modified',
82
- defaultMessage: 'Ready to publish changes'
83
- })
84
- })
75
+ return /*#__PURE__*/ jsxRuntime.jsx(CustomStatusButton, {
76
+ icon: /*#__PURE__*/ jsxRuntime.jsx(icons.ArrowsCounterClockwise, {}),
77
+ color: "alternative600",
78
+ children: formatMessage({
79
+ id: 'content-releases.pages.ReleaseDetails.entry-validation.modified',
80
+ defaultMessage: 'Ready to publish changes'
85
81
  })
86
82
  });
87
83
  }
88
- return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Popover.Trigger, {
89
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
90
- variant: "ghost",
91
- startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.CheckCircle, {
92
- fill: "success600"
93
- }),
94
- endIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.CaretDown, {}),
95
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
96
- textColor: "success600",
97
- variant: "omega",
98
- fontWeight: "bold",
99
- children: formatMessage({
100
- id: 'content-releases.pages.ReleaseDetails.entry-validation.already-published',
101
- defaultMessage: 'Already published'
102
- })
103
- })
84
+ return /*#__PURE__*/ jsxRuntime.jsx(CustomStatusButton, {
85
+ icon: /*#__PURE__*/ jsxRuntime.jsx(icons.CheckCircle, {}),
86
+ color: "success600",
87
+ children: formatMessage({
88
+ id: 'content-releases.pages.ReleaseDetails.entry-validation.already-published',
89
+ defaultMessage: 'Already published'
104
90
  })
105
91
  });
106
92
  }
107
93
  if (status === 'published') {
108
- return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Popover.Trigger, {
109
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
110
- variant: "ghost",
111
- startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.CheckCircle, {
112
- fill: "success600"
113
- }),
114
- endIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.CaretDown, {}),
115
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
116
- textColor: "success600",
117
- variant: "omega",
118
- fontWeight: "bold",
119
- children: formatMessage({
120
- id: 'content-releases.pages.ReleaseDetails.entry-validation.ready-to-unpublish',
121
- defaultMessage: 'Ready to unpublish'
122
- })
123
- })
94
+ return /*#__PURE__*/ jsxRuntime.jsx(CustomStatusButton, {
95
+ icon: /*#__PURE__*/ jsxRuntime.jsx(icons.CheckCircle, {}),
96
+ color: "success600",
97
+ children: formatMessage({
98
+ id: 'content-releases.pages.ReleaseDetails.entry-validation.ready-to-unpublish',
99
+ defaultMessage: 'Ready to unpublish'
124
100
  })
125
101
  });
126
102
  }
127
- return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Popover.Trigger, {
128
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
129
- variant: "ghost",
130
- startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.CheckCircle, {
131
- fill: "success600"
132
- }),
133
- endIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.CaretDown, {}),
134
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
135
- textColor: "success600",
136
- variant: "omega",
137
- fontWeight: "bold",
138
- children: formatMessage({
139
- id: 'content-releases.pages.ReleaseDetails.entry-validation.already-unpublished',
140
- defaultMessage: 'Already unpublished'
141
- })
142
- })
103
+ return /*#__PURE__*/ jsxRuntime.jsx(CustomStatusButton, {
104
+ icon: /*#__PURE__*/ jsxRuntime.jsx(icons.CheckCircle, {}),
105
+ color: "success600",
106
+ children: formatMessage({
107
+ id: 'content-releases.pages.ReleaseDetails.entry-validation.already-unpublished',
108
+ defaultMessage: 'Already unpublished'
143
109
  })
144
110
  });
145
111
  };
@@ -1 +1 @@
1
- {"version":3,"file":"EntryValidationPopover.js","sources":["../../../admin/src/components/EntryValidationPopover.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { FormErrors, FormValues } from '@strapi/admin/strapi-admin';\nimport { unstable_useDocument } from '@strapi/content-manager/strapi-admin';\nimport { Button, LinkButton, Flex, Typography, Popover } from '@strapi/design-system';\nimport { CheckCircle, CrossCircle, ArrowsCounterClockwise, CaretDown } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl, MessageDescriptor } from 'react-intl';\nimport { Link } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport type {\n ReleaseAction,\n ReleaseActionEntry,\n Stage,\n} from '../../../shared/contracts/release-actions';\nimport type { Struct } from '@strapi/types';\n\nconst StyledPopoverFlex = styled(Flex)`\n width: 100%;\n max-width: 256px;\n\n & > * {\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\n }\n\n & > *:last-child {\n border-bottom: none;\n }\n`;\n\ninterface EntryValidationPopoverProps {\n action: ReleaseAction['type'];\n schema?: Struct.ContentTypeSchema & {\n hasReviewWorkflow: boolean;\n stageRequiredToPublish?: Stage;\n };\n entry: ReleaseActionEntry;\n status: ReleaseAction['status'];\n}\n\ninterface ValidationStatusProps {\n action: ReleaseAction['type'];\n status: ReleaseAction['status'];\n hasErrors: boolean | null;\n requiredStage?: Stage;\n entryStage?: Stage;\n}\n\nconst EntryStatusTrigger = ({\n action,\n status,\n hasErrors,\n requiredStage,\n entryStage,\n}: ValidationStatusProps) => {\n const { formatMessage } = useIntl();\n\n if (action === 'publish') {\n if (hasErrors || (requiredStage && requiredStage.id !== entryStage?.id)) {\n return (\n <Popover.Trigger>\n <Button\n variant=\"ghost\"\n startIcon={<CrossCircle fill=\"danger600\" />}\n endIcon={<CaretDown />}\n >\n <Typography textColor=\"danger600\" variant=\"omega\" fontWeight=\"bold\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.not-ready',\n defaultMessage: 'Not ready to publish',\n })}\n </Typography>\n </Button>\n </Popover.Trigger>\n );\n }\n\n if (status === 'draft') {\n return (\n <Popover.Trigger>\n <Button\n variant=\"ghost\"\n startIcon={<CheckCircle fill=\"success600\" />}\n endIcon={<CaretDown />}\n >\n <Typography textColor=\"success600\" variant=\"omega\" fontWeight=\"bold\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish',\n defaultMessage: 'Ready to publish',\n })}\n </Typography>\n </Button>\n </Popover.Trigger>\n );\n }\n\n if (status === 'modified') {\n return (\n <Popover.Trigger>\n <Button\n variant=\"ghost\"\n startIcon={<ArrowsCounterClockwise fill=\"alternative600\" />}\n endIcon={<CaretDown />}\n >\n <Typography variant=\"omega\" fontWeight=\"bold\" textColor=\"alternative600\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.modified',\n defaultMessage: 'Ready to publish changes',\n })}\n </Typography>\n </Button>\n </Popover.Trigger>\n );\n }\n\n return (\n <Popover.Trigger>\n <Button\n variant=\"ghost\"\n startIcon={<CheckCircle fill=\"success600\" />}\n endIcon={<CaretDown />}\n >\n <Typography textColor=\"success600\" variant=\"omega\" fontWeight=\"bold\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.already-published',\n defaultMessage: 'Already published',\n })}\n </Typography>\n </Button>\n </Popover.Trigger>\n );\n }\n\n if (status === 'published') {\n return (\n <Popover.Trigger>\n <Button\n variant=\"ghost\"\n startIcon={<CheckCircle fill=\"success600\" />}\n endIcon={<CaretDown />}\n >\n <Typography textColor=\"success600\" variant=\"omega\" fontWeight=\"bold\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.ready-to-unpublish',\n defaultMessage: 'Ready to unpublish',\n })}\n </Typography>\n </Button>\n </Popover.Trigger>\n );\n }\n\n return (\n <Popover.Trigger>\n <Button variant=\"ghost\" startIcon={<CheckCircle fill=\"success600\" />} endIcon={<CaretDown />}>\n <Typography textColor=\"success600\" variant=\"omega\" fontWeight=\"bold\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.already-unpublished',\n defaultMessage: 'Already unpublished',\n })}\n </Typography>\n </Button>\n </Popover.Trigger>\n );\n};\n\ninterface FieldsValidationProps {\n hasErrors: boolean;\n errors: FormErrors<FormValues> | null;\n kind?: string;\n contentTypeUid?: string;\n documentId?: string;\n locale?: string;\n}\n\nconst FieldsValidation = ({\n hasErrors,\n errors,\n kind,\n contentTypeUid,\n documentId,\n locale,\n}: FieldsValidationProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex direction=\"column\" gap={1} width=\"100%\" padding={5}>\n <Flex gap={2} width=\"100%\">\n <Typography fontWeight=\"bold\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.fields',\n defaultMessage: 'Fields',\n })}\n </Typography>\n {hasErrors ? <CrossCircle fill=\"danger600\" /> : <CheckCircle fill=\"success600\" />}\n </Flex>\n <Typography width=\"100%\" textColor=\"neutral600\">\n {hasErrors\n ? formatMessage(\n {\n id: 'content-releases.pages.ReleaseDetails.entry-validation.fields.error',\n defaultMessage: '{errors} errors on fields.',\n },\n { errors: errors ? Object.keys(errors).length : 0 }\n )\n : formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.fields.success',\n defaultMessage: 'All fields are filled correctly.',\n })}\n </Typography>\n {hasErrors && (\n <LinkButton\n tag={Link}\n to={{\n pathname: `/content-manager/${kind === 'collectionType' ? 'collection-types' : 'single-types'}/${contentTypeUid}/${documentId}`,\n search: locale\n ? stringify({\n plugins: {\n i18n: {\n locale,\n },\n },\n })\n : '',\n }}\n variant=\"secondary\"\n fullWidth\n state={{ forceValidation: true }}\n >\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.fields.see-errors',\n defaultMessage: 'See errors',\n })}\n </LinkButton>\n )}\n </Flex>\n );\n};\n\nconst getReviewStageIcon = ({\n contentTypeHasReviewWorkflow,\n requiredStage,\n entryStage,\n}: {\n contentTypeHasReviewWorkflow: boolean;\n requiredStage?: Stage;\n entryStage?: Stage;\n}) => {\n if (!contentTypeHasReviewWorkflow) {\n return <CheckCircle fill=\"neutral200\" />;\n }\n if (requiredStage && requiredStage.id !== entryStage?.id) {\n return <CrossCircle fill=\"danger600\" />;\n }\n return <CheckCircle fill=\"success600\" />;\n};\n\nconst getReviewStageMessage = ({\n contentTypeHasReviewWorkflow,\n requiredStage,\n entryStage,\n formatMessage,\n}: {\n contentTypeHasReviewWorkflow: boolean;\n requiredStage?: Stage;\n entryStage?: Stage;\n formatMessage: (messageDescriptor: MessageDescriptor, values?: Record<string, string>) => string;\n}) => {\n if (!contentTypeHasReviewWorkflow) {\n return formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.review-stage.not-enabled',\n defaultMessage: 'This entry is not associated to any workflow.',\n });\n }\n\n if (requiredStage && requiredStage.id !== entryStage?.id) {\n return formatMessage(\n {\n id: 'content-releases.pages.ReleaseDetails.entry-validation.review-stage.not-ready',\n defaultMessage: 'This entry is not at the required stage for publishing. ({stageName})',\n },\n {\n stageName: requiredStage?.name ?? '',\n }\n );\n }\n\n if (requiredStage && requiredStage.id === entryStage?.id) {\n return formatMessage(\n {\n id: 'content-releases.pages.ReleaseDetails.entry-validation.review-stage.ready',\n defaultMessage: 'This entry is at the required stage for publishing. ({stageName})',\n },\n {\n stageName: requiredStage?.name ?? '',\n }\n );\n }\n\n return formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.review-stage.stage-not-required',\n defaultMessage: 'No required stage for publication',\n });\n};\n\nconst ReviewStageValidation = ({\n contentTypeHasReviewWorkflow,\n requiredStage,\n entryStage,\n}: {\n contentTypeHasReviewWorkflow: boolean;\n requiredStage?: Stage;\n entryStage?: Stage;\n}) => {\n const { formatMessage } = useIntl();\n\n const Icon = getReviewStageIcon({\n contentTypeHasReviewWorkflow,\n requiredStage,\n entryStage,\n });\n\n return (\n <Flex direction=\"column\" gap={1} width=\"100%\" padding={5}>\n <Flex gap={2} width=\"100%\">\n <Typography fontWeight=\"bold\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.review-stage',\n defaultMessage: 'Review stage',\n })}\n </Typography>\n {Icon}\n </Flex>\n <Typography textColor=\"neutral600\">\n {getReviewStageMessage({\n contentTypeHasReviewWorkflow,\n requiredStage,\n entryStage,\n formatMessage,\n })}\n </Typography>\n </Flex>\n );\n};\n\nexport const EntryValidationPopover = ({\n schema,\n entry,\n status,\n action,\n}: EntryValidationPopoverProps) => {\n const { validate, isLoading } = unstable_useDocument(\n {\n collectionType: schema?.kind ?? '',\n model: schema?.uid ?? '',\n },\n {\n // useDocument makes a request to get more data about the entry, but we only want to have the validation function so we skip the request\n skip: true,\n }\n );\n\n // Validation errors\n const errors = isLoading ? null : validate(entry);\n const hasErrors = errors ? Object.keys(errors).length > 0 : false;\n\n // Entry stage\n const contentTypeHasReviewWorkflow = schema?.hasReviewWorkflow ?? false;\n const requiredStage = schema?.stageRequiredToPublish;\n const entryStage = entry.strapi_stage;\n\n if (isLoading) {\n return null;\n }\n\n return (\n <Popover.Root>\n <EntryStatusTrigger\n action={action}\n status={status}\n hasErrors={hasErrors}\n requiredStage={requiredStage}\n entryStage={entryStage}\n />\n <Popover.Content>\n <StyledPopoverFlex direction=\"column\">\n <FieldsValidation\n hasErrors={hasErrors}\n errors={errors}\n contentTypeUid={schema?.uid}\n kind={schema?.kind}\n documentId={entry.documentId}\n locale={entry.locale}\n />\n <ReviewStageValidation\n contentTypeHasReviewWorkflow={contentTypeHasReviewWorkflow}\n requiredStage={requiredStage}\n entryStage={entryStage}\n />\n </StyledPopoverFlex>\n </Popover.Content>\n </Popover.Root>\n );\n};\n"],"names":["StyledPopoverFlex","styled","Flex","theme","colors","neutral150","EntryStatusTrigger","action","status","hasErrors","requiredStage","entryStage","formatMessage","useIntl","id","_jsx","Popover","Trigger","Button","variant","startIcon","CrossCircle","fill","endIcon","CaretDown","Typography","textColor","fontWeight","defaultMessage","CheckCircle","ArrowsCounterClockwise","FieldsValidation","errors","kind","contentTypeUid","documentId","locale","_jsxs","direction","gap","width","padding","Object","keys","length","LinkButton","tag","Link","to","pathname","search","stringify","plugins","i18n","fullWidth","state","forceValidation","getReviewStageIcon","contentTypeHasReviewWorkflow","getReviewStageMessage","stageName","name","ReviewStageValidation","Icon","EntryValidationPopover","schema","entry","validate","isLoading","unstable_useDocument","collectionType","model","uid","skip","hasReviewWorkflow","stageRequiredToPublish","strapi_stage","Root","Content"],"mappings":"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"}
1
+ {"version":3,"file":"EntryValidationPopover.js","sources":["../../../admin/src/components/EntryValidationPopover.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { FormErrors, FormValues } from '@strapi/admin/strapi-admin';\nimport { unstable_useDocument } from '@strapi/content-manager/strapi-admin';\nimport { Button, LinkButton, Flex, Typography, Popover } from '@strapi/design-system';\nimport { CheckCircle, CrossCircle, ArrowsCounterClockwise, CaretDown } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl, MessageDescriptor } from 'react-intl';\nimport { Link } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport type {\n ReleaseAction,\n ReleaseActionEntry,\n Stage,\n} from '../../../shared/contracts/release-actions';\nimport type { Struct } from '@strapi/types';\n\nconst StyledPopoverFlex = styled(Flex)`\n width: 100%;\n max-width: 256px;\n\n & > * {\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\n }\n\n & > *:last-child {\n border-bottom: none;\n }\n`;\n\nconst ButtonContent = styled(Flex)`\n svg {\n fill: currentColor;\n }\n`;\n\nconst CustomStatusButton = ({\n children,\n icon,\n color,\n}: {\n icon: React.ReactElement;\n color: string;\n} & React.PropsWithChildren) => {\n return (\n <Popover.Trigger>\n <Button variant=\"ghost\" endIcon={<CaretDown />}>\n <ButtonContent color={color} gap={2}>\n {icon}\n <Typography textColor={color} variant=\"omega\" fontWeight=\"bold\">\n {children}\n </Typography>\n </ButtonContent>\n </Button>\n </Popover.Trigger>\n );\n};\n\ninterface EntryValidationPopoverProps {\n action: ReleaseAction['type'];\n schema?: Struct.ContentTypeSchema & {\n hasReviewWorkflow: boolean;\n stageRequiredToPublish?: Stage;\n };\n entry: ReleaseActionEntry;\n status: ReleaseAction['status'];\n}\n\ninterface ValidationStatusProps {\n action: ReleaseAction['type'];\n status: ReleaseAction['status'];\n hasErrors: boolean | null;\n requiredStage?: Stage;\n entryStage?: Stage;\n}\n\nconst EntryStatusTrigger = ({\n action,\n status,\n hasErrors,\n requiredStage,\n entryStage,\n}: ValidationStatusProps) => {\n const { formatMessage } = useIntl();\n\n if (action === 'publish') {\n if (hasErrors || (requiredStage && requiredStage.id !== entryStage?.id)) {\n return (\n <CustomStatusButton icon={<CrossCircle />} color=\"danger600\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.not-ready',\n defaultMessage: 'Not ready to publish',\n })}\n </CustomStatusButton>\n );\n }\n\n if (status === 'draft') {\n return (\n <CustomStatusButton icon={<CheckCircle />} color=\"success600\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish',\n defaultMessage: 'Ready to publish',\n })}\n </CustomStatusButton>\n );\n }\n\n if (status === 'modified') {\n return (\n <CustomStatusButton icon={<ArrowsCounterClockwise />} color=\"alternative600\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.modified',\n defaultMessage: 'Ready to publish changes',\n })}\n </CustomStatusButton>\n );\n }\n\n return (\n <CustomStatusButton icon={<CheckCircle />} color=\"success600\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.already-published',\n defaultMessage: 'Already published',\n })}\n </CustomStatusButton>\n );\n }\n\n if (status === 'published') {\n return (\n <CustomStatusButton icon={<CheckCircle />} color=\"success600\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.ready-to-unpublish',\n defaultMessage: 'Ready to unpublish',\n })}\n </CustomStatusButton>\n );\n }\n\n return (\n <CustomStatusButton icon={<CheckCircle />} color=\"success600\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.already-unpublished',\n defaultMessage: 'Already unpublished',\n })}\n </CustomStatusButton>\n );\n};\n\ninterface FieldsValidationProps {\n hasErrors: boolean;\n errors: FormErrors<FormValues> | null;\n kind?: string;\n contentTypeUid?: string;\n documentId?: string;\n locale?: string;\n}\n\nconst FieldsValidation = ({\n hasErrors,\n errors,\n kind,\n contentTypeUid,\n documentId,\n locale,\n}: FieldsValidationProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex direction=\"column\" gap={1} width=\"100%\" padding={5}>\n <Flex gap={2} width=\"100%\">\n <Typography fontWeight=\"bold\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.fields',\n defaultMessage: 'Fields',\n })}\n </Typography>\n {hasErrors ? <CrossCircle fill=\"danger600\" /> : <CheckCircle fill=\"success600\" />}\n </Flex>\n <Typography width=\"100%\" textColor=\"neutral600\">\n {hasErrors\n ? formatMessage(\n {\n id: 'content-releases.pages.ReleaseDetails.entry-validation.fields.error',\n defaultMessage: '{errors} errors on fields.',\n },\n { errors: errors ? Object.keys(errors).length : 0 }\n )\n : formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.fields.success',\n defaultMessage: 'All fields are filled correctly.',\n })}\n </Typography>\n {hasErrors && (\n <LinkButton\n tag={Link}\n to={{\n pathname: `/content-manager/${kind === 'collectionType' ? 'collection-types' : 'single-types'}/${contentTypeUid}/${documentId}`,\n search: locale\n ? stringify({\n plugins: {\n i18n: {\n locale,\n },\n },\n })\n : '',\n }}\n variant=\"secondary\"\n fullWidth\n state={{ forceValidation: true }}\n >\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.fields.see-errors',\n defaultMessage: 'See errors',\n })}\n </LinkButton>\n )}\n </Flex>\n );\n};\n\nconst getReviewStageIcon = ({\n contentTypeHasReviewWorkflow,\n requiredStage,\n entryStage,\n}: {\n contentTypeHasReviewWorkflow: boolean;\n requiredStage?: Stage;\n entryStage?: Stage;\n}) => {\n if (!contentTypeHasReviewWorkflow) {\n return <CheckCircle fill=\"neutral200\" />;\n }\n if (requiredStage && requiredStage.id !== entryStage?.id) {\n return <CrossCircle fill=\"danger600\" />;\n }\n return <CheckCircle fill=\"success600\" />;\n};\n\nconst getReviewStageMessage = ({\n contentTypeHasReviewWorkflow,\n requiredStage,\n entryStage,\n formatMessage,\n}: {\n contentTypeHasReviewWorkflow: boolean;\n requiredStage?: Stage;\n entryStage?: Stage;\n formatMessage: (messageDescriptor: MessageDescriptor, values?: Record<string, string>) => string;\n}) => {\n if (!contentTypeHasReviewWorkflow) {\n return formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.review-stage.not-enabled',\n defaultMessage: 'This entry is not associated to any workflow.',\n });\n }\n\n if (requiredStage && requiredStage.id !== entryStage?.id) {\n return formatMessage(\n {\n id: 'content-releases.pages.ReleaseDetails.entry-validation.review-stage.not-ready',\n defaultMessage: 'This entry is not at the required stage for publishing. ({stageName})',\n },\n {\n stageName: requiredStage?.name ?? '',\n }\n );\n }\n\n if (requiredStage && requiredStage.id === entryStage?.id) {\n return formatMessage(\n {\n id: 'content-releases.pages.ReleaseDetails.entry-validation.review-stage.ready',\n defaultMessage: 'This entry is at the required stage for publishing. ({stageName})',\n },\n {\n stageName: requiredStage?.name ?? '',\n }\n );\n }\n\n return formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.review-stage.stage-not-required',\n defaultMessage: 'No required stage for publication',\n });\n};\n\nconst ReviewStageValidation = ({\n contentTypeHasReviewWorkflow,\n requiredStage,\n entryStage,\n}: {\n contentTypeHasReviewWorkflow: boolean;\n requiredStage?: Stage;\n entryStage?: Stage;\n}) => {\n const { formatMessage } = useIntl();\n\n const Icon = getReviewStageIcon({\n contentTypeHasReviewWorkflow,\n requiredStage,\n entryStage,\n });\n\n return (\n <Flex direction=\"column\" gap={1} width=\"100%\" padding={5}>\n <Flex gap={2} width=\"100%\">\n <Typography fontWeight=\"bold\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.review-stage',\n defaultMessage: 'Review stage',\n })}\n </Typography>\n {Icon}\n </Flex>\n <Typography textColor=\"neutral600\">\n {getReviewStageMessage({\n contentTypeHasReviewWorkflow,\n requiredStage,\n entryStage,\n formatMessage,\n })}\n </Typography>\n </Flex>\n );\n};\n\nexport const EntryValidationPopover = ({\n schema,\n entry,\n status,\n action,\n}: EntryValidationPopoverProps) => {\n const { validate, isLoading } = unstable_useDocument(\n {\n collectionType: schema?.kind ?? '',\n model: schema?.uid ?? '',\n },\n {\n // useDocument makes a request to get more data about the entry, but we only want to have the validation function so we skip the request\n skip: true,\n }\n );\n\n // Validation errors\n const errors = isLoading ? null : validate(entry);\n const hasErrors = errors ? Object.keys(errors).length > 0 : false;\n\n // Entry stage\n const contentTypeHasReviewWorkflow = schema?.hasReviewWorkflow ?? false;\n const requiredStage = schema?.stageRequiredToPublish;\n const entryStage = entry.strapi_stage;\n\n if (isLoading) {\n return null;\n }\n\n return (\n <Popover.Root>\n <EntryStatusTrigger\n action={action}\n status={status}\n hasErrors={hasErrors}\n requiredStage={requiredStage}\n entryStage={entryStage}\n />\n <Popover.Content>\n <StyledPopoverFlex direction=\"column\">\n <FieldsValidation\n hasErrors={hasErrors}\n errors={errors}\n contentTypeUid={schema?.uid}\n kind={schema?.kind}\n documentId={entry.documentId}\n locale={entry.locale}\n />\n <ReviewStageValidation\n contentTypeHasReviewWorkflow={contentTypeHasReviewWorkflow}\n requiredStage={requiredStage}\n entryStage={entryStage}\n />\n </StyledPopoverFlex>\n </Popover.Content>\n </Popover.Root>\n );\n};\n"],"names":["StyledPopoverFlex","styled","Flex","theme","colors","neutral150","ButtonContent","CustomStatusButton","children","icon","color","_jsx","Popover","Trigger","Button","variant","endIcon","CaretDown","_jsxs","gap","Typography","textColor","fontWeight","EntryStatusTrigger","action","status","hasErrors","requiredStage","entryStage","formatMessage","useIntl","id","CrossCircle","defaultMessage","CheckCircle","ArrowsCounterClockwise","FieldsValidation","errors","kind","contentTypeUid","documentId","locale","direction","width","padding","fill","Object","keys","length","LinkButton","tag","Link","to","pathname","search","stringify","plugins","i18n","fullWidth","state","forceValidation","getReviewStageIcon","contentTypeHasReviewWorkflow","getReviewStageMessage","stageName","name","ReviewStageValidation","Icon","EntryValidationPopover","schema","entry","validate","isLoading","unstable_useDocument","collectionType","model","uid","skip","hasReviewWorkflow","stageRequiredToPublish","strapi_stage","Root","Content"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import 'react';
3
3
  import { unstable_useDocument } from '@strapi/content-manager/strapi-admin';
4
- import { Flex, Popover, Button, Typography, LinkButton } from '@strapi/design-system';
5
- import { CrossCircle, CaretDown, CheckCircle, ArrowsCounterClockwise } from '@strapi/icons';
4
+ import { Flex, Popover, Typography, LinkButton, Button } from '@strapi/design-system';
5
+ import { CrossCircle, CheckCircle, ArrowsCounterClockwise, CaretDown } from '@strapi/icons';
6
6
  import { stringify } from 'qs';
7
7
  import { useIntl } from 'react-intl';
8
8
  import { Link } from 'react-router-dom';
@@ -20,124 +20,90 @@ const StyledPopoverFlex = styled(Flex)`
20
20
  border-bottom: none;
21
21
  }
22
22
  `;
23
+ const ButtonContent = styled(Flex)`
24
+ svg {
25
+ fill: currentColor;
26
+ }
27
+ `;
28
+ const CustomStatusButton = ({ children, icon, color })=>{
29
+ return /*#__PURE__*/ jsx(Popover.Trigger, {
30
+ children: /*#__PURE__*/ jsx(Button, {
31
+ variant: "ghost",
32
+ endIcon: /*#__PURE__*/ jsx(CaretDown, {}),
33
+ children: /*#__PURE__*/ jsxs(ButtonContent, {
34
+ color: color,
35
+ gap: 2,
36
+ children: [
37
+ icon,
38
+ /*#__PURE__*/ jsx(Typography, {
39
+ textColor: color,
40
+ variant: "omega",
41
+ fontWeight: "bold",
42
+ children: children
43
+ })
44
+ ]
45
+ })
46
+ })
47
+ });
48
+ };
23
49
  const EntryStatusTrigger = ({ action, status, hasErrors, requiredStage, entryStage })=>{
24
50
  const { formatMessage } = useIntl();
25
51
  if (action === 'publish') {
26
52
  if (hasErrors || requiredStage && requiredStage.id !== entryStage?.id) {
27
- return /*#__PURE__*/ jsx(Popover.Trigger, {
28
- children: /*#__PURE__*/ jsx(Button, {
29
- variant: "ghost",
30
- startIcon: /*#__PURE__*/ jsx(CrossCircle, {
31
- fill: "danger600"
32
- }),
33
- endIcon: /*#__PURE__*/ jsx(CaretDown, {}),
34
- children: /*#__PURE__*/ jsx(Typography, {
35
- textColor: "danger600",
36
- variant: "omega",
37
- fontWeight: "bold",
38
- children: formatMessage({
39
- id: 'content-releases.pages.ReleaseDetails.entry-validation.not-ready',
40
- defaultMessage: 'Not ready to publish'
41
- })
42
- })
53
+ return /*#__PURE__*/ jsx(CustomStatusButton, {
54
+ icon: /*#__PURE__*/ jsx(CrossCircle, {}),
55
+ color: "danger600",
56
+ children: formatMessage({
57
+ id: 'content-releases.pages.ReleaseDetails.entry-validation.not-ready',
58
+ defaultMessage: 'Not ready to publish'
43
59
  })
44
60
  });
45
61
  }
46
62
  if (status === 'draft') {
47
- return /*#__PURE__*/ jsx(Popover.Trigger, {
48
- children: /*#__PURE__*/ jsx(Button, {
49
- variant: "ghost",
50
- startIcon: /*#__PURE__*/ jsx(CheckCircle, {
51
- fill: "success600"
52
- }),
53
- endIcon: /*#__PURE__*/ jsx(CaretDown, {}),
54
- children: /*#__PURE__*/ jsx(Typography, {
55
- textColor: "success600",
56
- variant: "omega",
57
- fontWeight: "bold",
58
- children: formatMessage({
59
- id: 'content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish',
60
- defaultMessage: 'Ready to publish'
61
- })
62
- })
63
+ return /*#__PURE__*/ jsx(CustomStatusButton, {
64
+ icon: /*#__PURE__*/ jsx(CheckCircle, {}),
65
+ color: "success600",
66
+ children: formatMessage({
67
+ id: 'content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish',
68
+ defaultMessage: 'Ready to publish'
63
69
  })
64
70
  });
65
71
  }
66
72
  if (status === 'modified') {
67
- return /*#__PURE__*/ jsx(Popover.Trigger, {
68
- children: /*#__PURE__*/ jsx(Button, {
69
- variant: "ghost",
70
- startIcon: /*#__PURE__*/ jsx(ArrowsCounterClockwise, {
71
- fill: "alternative600"
72
- }),
73
- endIcon: /*#__PURE__*/ jsx(CaretDown, {}),
74
- children: /*#__PURE__*/ jsx(Typography, {
75
- variant: "omega",
76
- fontWeight: "bold",
77
- textColor: "alternative600",
78
- children: formatMessage({
79
- id: 'content-releases.pages.ReleaseDetails.entry-validation.modified',
80
- defaultMessage: 'Ready to publish changes'
81
- })
82
- })
73
+ return /*#__PURE__*/ jsx(CustomStatusButton, {
74
+ icon: /*#__PURE__*/ jsx(ArrowsCounterClockwise, {}),
75
+ color: "alternative600",
76
+ children: formatMessage({
77
+ id: 'content-releases.pages.ReleaseDetails.entry-validation.modified',
78
+ defaultMessage: 'Ready to publish changes'
83
79
  })
84
80
  });
85
81
  }
86
- return /*#__PURE__*/ jsx(Popover.Trigger, {
87
- children: /*#__PURE__*/ jsx(Button, {
88
- variant: "ghost",
89
- startIcon: /*#__PURE__*/ jsx(CheckCircle, {
90
- fill: "success600"
91
- }),
92
- endIcon: /*#__PURE__*/ jsx(CaretDown, {}),
93
- children: /*#__PURE__*/ jsx(Typography, {
94
- textColor: "success600",
95
- variant: "omega",
96
- fontWeight: "bold",
97
- children: formatMessage({
98
- id: 'content-releases.pages.ReleaseDetails.entry-validation.already-published',
99
- defaultMessage: 'Already published'
100
- })
101
- })
82
+ return /*#__PURE__*/ jsx(CustomStatusButton, {
83
+ icon: /*#__PURE__*/ jsx(CheckCircle, {}),
84
+ color: "success600",
85
+ children: formatMessage({
86
+ id: 'content-releases.pages.ReleaseDetails.entry-validation.already-published',
87
+ defaultMessage: 'Already published'
102
88
  })
103
89
  });
104
90
  }
105
91
  if (status === 'published') {
106
- return /*#__PURE__*/ jsx(Popover.Trigger, {
107
- children: /*#__PURE__*/ jsx(Button, {
108
- variant: "ghost",
109
- startIcon: /*#__PURE__*/ jsx(CheckCircle, {
110
- fill: "success600"
111
- }),
112
- endIcon: /*#__PURE__*/ jsx(CaretDown, {}),
113
- children: /*#__PURE__*/ jsx(Typography, {
114
- textColor: "success600",
115
- variant: "omega",
116
- fontWeight: "bold",
117
- children: formatMessage({
118
- id: 'content-releases.pages.ReleaseDetails.entry-validation.ready-to-unpublish',
119
- defaultMessage: 'Ready to unpublish'
120
- })
121
- })
92
+ return /*#__PURE__*/ jsx(CustomStatusButton, {
93
+ icon: /*#__PURE__*/ jsx(CheckCircle, {}),
94
+ color: "success600",
95
+ children: formatMessage({
96
+ id: 'content-releases.pages.ReleaseDetails.entry-validation.ready-to-unpublish',
97
+ defaultMessage: 'Ready to unpublish'
122
98
  })
123
99
  });
124
100
  }
125
- return /*#__PURE__*/ jsx(Popover.Trigger, {
126
- children: /*#__PURE__*/ jsx(Button, {
127
- variant: "ghost",
128
- startIcon: /*#__PURE__*/ jsx(CheckCircle, {
129
- fill: "success600"
130
- }),
131
- endIcon: /*#__PURE__*/ jsx(CaretDown, {}),
132
- children: /*#__PURE__*/ jsx(Typography, {
133
- textColor: "success600",
134
- variant: "omega",
135
- fontWeight: "bold",
136
- children: formatMessage({
137
- id: 'content-releases.pages.ReleaseDetails.entry-validation.already-unpublished',
138
- defaultMessage: 'Already unpublished'
139
- })
140
- })
101
+ return /*#__PURE__*/ jsx(CustomStatusButton, {
102
+ icon: /*#__PURE__*/ jsx(CheckCircle, {}),
103
+ color: "success600",
104
+ children: formatMessage({
105
+ id: 'content-releases.pages.ReleaseDetails.entry-validation.already-unpublished',
106
+ defaultMessage: 'Already unpublished'
141
107
  })
142
108
  });
143
109
  };
@@ -1 +1 @@
1
- {"version":3,"file":"EntryValidationPopover.mjs","sources":["../../../admin/src/components/EntryValidationPopover.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { FormErrors, FormValues } from '@strapi/admin/strapi-admin';\nimport { unstable_useDocument } from '@strapi/content-manager/strapi-admin';\nimport { Button, LinkButton, Flex, Typography, Popover } from '@strapi/design-system';\nimport { CheckCircle, CrossCircle, ArrowsCounterClockwise, CaretDown } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl, MessageDescriptor } from 'react-intl';\nimport { Link } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport type {\n ReleaseAction,\n ReleaseActionEntry,\n Stage,\n} from '../../../shared/contracts/release-actions';\nimport type { Struct } from '@strapi/types';\n\nconst StyledPopoverFlex = styled(Flex)`\n width: 100%;\n max-width: 256px;\n\n & > * {\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\n }\n\n & > *:last-child {\n border-bottom: none;\n }\n`;\n\ninterface EntryValidationPopoverProps {\n action: ReleaseAction['type'];\n schema?: Struct.ContentTypeSchema & {\n hasReviewWorkflow: boolean;\n stageRequiredToPublish?: Stage;\n };\n entry: ReleaseActionEntry;\n status: ReleaseAction['status'];\n}\n\ninterface ValidationStatusProps {\n action: ReleaseAction['type'];\n status: ReleaseAction['status'];\n hasErrors: boolean | null;\n requiredStage?: Stage;\n entryStage?: Stage;\n}\n\nconst EntryStatusTrigger = ({\n action,\n status,\n hasErrors,\n requiredStage,\n entryStage,\n}: ValidationStatusProps) => {\n const { formatMessage } = useIntl();\n\n if (action === 'publish') {\n if (hasErrors || (requiredStage && requiredStage.id !== entryStage?.id)) {\n return (\n <Popover.Trigger>\n <Button\n variant=\"ghost\"\n startIcon={<CrossCircle fill=\"danger600\" />}\n endIcon={<CaretDown />}\n >\n <Typography textColor=\"danger600\" variant=\"omega\" fontWeight=\"bold\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.not-ready',\n defaultMessage: 'Not ready to publish',\n })}\n </Typography>\n </Button>\n </Popover.Trigger>\n );\n }\n\n if (status === 'draft') {\n return (\n <Popover.Trigger>\n <Button\n variant=\"ghost\"\n startIcon={<CheckCircle fill=\"success600\" />}\n endIcon={<CaretDown />}\n >\n <Typography textColor=\"success600\" variant=\"omega\" fontWeight=\"bold\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish',\n defaultMessage: 'Ready to publish',\n })}\n </Typography>\n </Button>\n </Popover.Trigger>\n );\n }\n\n if (status === 'modified') {\n return (\n <Popover.Trigger>\n <Button\n variant=\"ghost\"\n startIcon={<ArrowsCounterClockwise fill=\"alternative600\" />}\n endIcon={<CaretDown />}\n >\n <Typography variant=\"omega\" fontWeight=\"bold\" textColor=\"alternative600\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.modified',\n defaultMessage: 'Ready to publish changes',\n })}\n </Typography>\n </Button>\n </Popover.Trigger>\n );\n }\n\n return (\n <Popover.Trigger>\n <Button\n variant=\"ghost\"\n startIcon={<CheckCircle fill=\"success600\" />}\n endIcon={<CaretDown />}\n >\n <Typography textColor=\"success600\" variant=\"omega\" fontWeight=\"bold\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.already-published',\n defaultMessage: 'Already published',\n })}\n </Typography>\n </Button>\n </Popover.Trigger>\n );\n }\n\n if (status === 'published') {\n return (\n <Popover.Trigger>\n <Button\n variant=\"ghost\"\n startIcon={<CheckCircle fill=\"success600\" />}\n endIcon={<CaretDown />}\n >\n <Typography textColor=\"success600\" variant=\"omega\" fontWeight=\"bold\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.ready-to-unpublish',\n defaultMessage: 'Ready to unpublish',\n })}\n </Typography>\n </Button>\n </Popover.Trigger>\n );\n }\n\n return (\n <Popover.Trigger>\n <Button variant=\"ghost\" startIcon={<CheckCircle fill=\"success600\" />} endIcon={<CaretDown />}>\n <Typography textColor=\"success600\" variant=\"omega\" fontWeight=\"bold\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.already-unpublished',\n defaultMessage: 'Already unpublished',\n })}\n </Typography>\n </Button>\n </Popover.Trigger>\n );\n};\n\ninterface FieldsValidationProps {\n hasErrors: boolean;\n errors: FormErrors<FormValues> | null;\n kind?: string;\n contentTypeUid?: string;\n documentId?: string;\n locale?: string;\n}\n\nconst FieldsValidation = ({\n hasErrors,\n errors,\n kind,\n contentTypeUid,\n documentId,\n locale,\n}: FieldsValidationProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex direction=\"column\" gap={1} width=\"100%\" padding={5}>\n <Flex gap={2} width=\"100%\">\n <Typography fontWeight=\"bold\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.fields',\n defaultMessage: 'Fields',\n })}\n </Typography>\n {hasErrors ? <CrossCircle fill=\"danger600\" /> : <CheckCircle fill=\"success600\" />}\n </Flex>\n <Typography width=\"100%\" textColor=\"neutral600\">\n {hasErrors\n ? formatMessage(\n {\n id: 'content-releases.pages.ReleaseDetails.entry-validation.fields.error',\n defaultMessage: '{errors} errors on fields.',\n },\n { errors: errors ? Object.keys(errors).length : 0 }\n )\n : formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.fields.success',\n defaultMessage: 'All fields are filled correctly.',\n })}\n </Typography>\n {hasErrors && (\n <LinkButton\n tag={Link}\n to={{\n pathname: `/content-manager/${kind === 'collectionType' ? 'collection-types' : 'single-types'}/${contentTypeUid}/${documentId}`,\n search: locale\n ? stringify({\n plugins: {\n i18n: {\n locale,\n },\n },\n })\n : '',\n }}\n variant=\"secondary\"\n fullWidth\n state={{ forceValidation: true }}\n >\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.fields.see-errors',\n defaultMessage: 'See errors',\n })}\n </LinkButton>\n )}\n </Flex>\n );\n};\n\nconst getReviewStageIcon = ({\n contentTypeHasReviewWorkflow,\n requiredStage,\n entryStage,\n}: {\n contentTypeHasReviewWorkflow: boolean;\n requiredStage?: Stage;\n entryStage?: Stage;\n}) => {\n if (!contentTypeHasReviewWorkflow) {\n return <CheckCircle fill=\"neutral200\" />;\n }\n if (requiredStage && requiredStage.id !== entryStage?.id) {\n return <CrossCircle fill=\"danger600\" />;\n }\n return <CheckCircle fill=\"success600\" />;\n};\n\nconst getReviewStageMessage = ({\n contentTypeHasReviewWorkflow,\n requiredStage,\n entryStage,\n formatMessage,\n}: {\n contentTypeHasReviewWorkflow: boolean;\n requiredStage?: Stage;\n entryStage?: Stage;\n formatMessage: (messageDescriptor: MessageDescriptor, values?: Record<string, string>) => string;\n}) => {\n if (!contentTypeHasReviewWorkflow) {\n return formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.review-stage.not-enabled',\n defaultMessage: 'This entry is not associated to any workflow.',\n });\n }\n\n if (requiredStage && requiredStage.id !== entryStage?.id) {\n return formatMessage(\n {\n id: 'content-releases.pages.ReleaseDetails.entry-validation.review-stage.not-ready',\n defaultMessage: 'This entry is not at the required stage for publishing. ({stageName})',\n },\n {\n stageName: requiredStage?.name ?? '',\n }\n );\n }\n\n if (requiredStage && requiredStage.id === entryStage?.id) {\n return formatMessage(\n {\n id: 'content-releases.pages.ReleaseDetails.entry-validation.review-stage.ready',\n defaultMessage: 'This entry is at the required stage for publishing. ({stageName})',\n },\n {\n stageName: requiredStage?.name ?? '',\n }\n );\n }\n\n return formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.review-stage.stage-not-required',\n defaultMessage: 'No required stage for publication',\n });\n};\n\nconst ReviewStageValidation = ({\n contentTypeHasReviewWorkflow,\n requiredStage,\n entryStage,\n}: {\n contentTypeHasReviewWorkflow: boolean;\n requiredStage?: Stage;\n entryStage?: Stage;\n}) => {\n const { formatMessage } = useIntl();\n\n const Icon = getReviewStageIcon({\n contentTypeHasReviewWorkflow,\n requiredStage,\n entryStage,\n });\n\n return (\n <Flex direction=\"column\" gap={1} width=\"100%\" padding={5}>\n <Flex gap={2} width=\"100%\">\n <Typography fontWeight=\"bold\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.review-stage',\n defaultMessage: 'Review stage',\n })}\n </Typography>\n {Icon}\n </Flex>\n <Typography textColor=\"neutral600\">\n {getReviewStageMessage({\n contentTypeHasReviewWorkflow,\n requiredStage,\n entryStage,\n formatMessage,\n })}\n </Typography>\n </Flex>\n );\n};\n\nexport const EntryValidationPopover = ({\n schema,\n entry,\n status,\n action,\n}: EntryValidationPopoverProps) => {\n const { validate, isLoading } = unstable_useDocument(\n {\n collectionType: schema?.kind ?? '',\n model: schema?.uid ?? '',\n },\n {\n // useDocument makes a request to get more data about the entry, but we only want to have the validation function so we skip the request\n skip: true,\n }\n );\n\n // Validation errors\n const errors = isLoading ? null : validate(entry);\n const hasErrors = errors ? Object.keys(errors).length > 0 : false;\n\n // Entry stage\n const contentTypeHasReviewWorkflow = schema?.hasReviewWorkflow ?? false;\n const requiredStage = schema?.stageRequiredToPublish;\n const entryStage = entry.strapi_stage;\n\n if (isLoading) {\n return null;\n }\n\n return (\n <Popover.Root>\n <EntryStatusTrigger\n action={action}\n status={status}\n hasErrors={hasErrors}\n requiredStage={requiredStage}\n entryStage={entryStage}\n />\n <Popover.Content>\n <StyledPopoverFlex direction=\"column\">\n <FieldsValidation\n hasErrors={hasErrors}\n errors={errors}\n contentTypeUid={schema?.uid}\n kind={schema?.kind}\n documentId={entry.documentId}\n locale={entry.locale}\n />\n <ReviewStageValidation\n contentTypeHasReviewWorkflow={contentTypeHasReviewWorkflow}\n requiredStage={requiredStage}\n entryStage={entryStage}\n />\n </StyledPopoverFlex>\n </Popover.Content>\n </Popover.Root>\n );\n};\n"],"names":["StyledPopoverFlex","styled","Flex","theme","colors","neutral150","EntryStatusTrigger","action","status","hasErrors","requiredStage","entryStage","formatMessage","useIntl","id","_jsx","Popover","Trigger","Button","variant","startIcon","CrossCircle","fill","endIcon","CaretDown","Typography","textColor","fontWeight","defaultMessage","CheckCircle","ArrowsCounterClockwise","FieldsValidation","errors","kind","contentTypeUid","documentId","locale","_jsxs","direction","gap","width","padding","Object","keys","length","LinkButton","tag","Link","to","pathname","search","stringify","plugins","i18n","fullWidth","state","forceValidation","getReviewStageIcon","contentTypeHasReviewWorkflow","getReviewStageMessage","stageName","name","ReviewStageValidation","Icon","EntryValidationPopover","schema","entry","validate","isLoading","unstable_useDocument","collectionType","model","uid","skip","hasReviewWorkflow","stageRequiredToPublish","strapi_stage","Root","Content"],"mappings":"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"}
1
+ {"version":3,"file":"EntryValidationPopover.mjs","sources":["../../../admin/src/components/EntryValidationPopover.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { FormErrors, FormValues } from '@strapi/admin/strapi-admin';\nimport { unstable_useDocument } from '@strapi/content-manager/strapi-admin';\nimport { Button, LinkButton, Flex, Typography, Popover } from '@strapi/design-system';\nimport { CheckCircle, CrossCircle, ArrowsCounterClockwise, CaretDown } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl, MessageDescriptor } from 'react-intl';\nimport { Link } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport type {\n ReleaseAction,\n ReleaseActionEntry,\n Stage,\n} from '../../../shared/contracts/release-actions';\nimport type { Struct } from '@strapi/types';\n\nconst StyledPopoverFlex = styled(Flex)`\n width: 100%;\n max-width: 256px;\n\n & > * {\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\n }\n\n & > *:last-child {\n border-bottom: none;\n }\n`;\n\nconst ButtonContent = styled(Flex)`\n svg {\n fill: currentColor;\n }\n`;\n\nconst CustomStatusButton = ({\n children,\n icon,\n color,\n}: {\n icon: React.ReactElement;\n color: string;\n} & React.PropsWithChildren) => {\n return (\n <Popover.Trigger>\n <Button variant=\"ghost\" endIcon={<CaretDown />}>\n <ButtonContent color={color} gap={2}>\n {icon}\n <Typography textColor={color} variant=\"omega\" fontWeight=\"bold\">\n {children}\n </Typography>\n </ButtonContent>\n </Button>\n </Popover.Trigger>\n );\n};\n\ninterface EntryValidationPopoverProps {\n action: ReleaseAction['type'];\n schema?: Struct.ContentTypeSchema & {\n hasReviewWorkflow: boolean;\n stageRequiredToPublish?: Stage;\n };\n entry: ReleaseActionEntry;\n status: ReleaseAction['status'];\n}\n\ninterface ValidationStatusProps {\n action: ReleaseAction['type'];\n status: ReleaseAction['status'];\n hasErrors: boolean | null;\n requiredStage?: Stage;\n entryStage?: Stage;\n}\n\nconst EntryStatusTrigger = ({\n action,\n status,\n hasErrors,\n requiredStage,\n entryStage,\n}: ValidationStatusProps) => {\n const { formatMessage } = useIntl();\n\n if (action === 'publish') {\n if (hasErrors || (requiredStage && requiredStage.id !== entryStage?.id)) {\n return (\n <CustomStatusButton icon={<CrossCircle />} color=\"danger600\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.not-ready',\n defaultMessage: 'Not ready to publish',\n })}\n </CustomStatusButton>\n );\n }\n\n if (status === 'draft') {\n return (\n <CustomStatusButton icon={<CheckCircle />} color=\"success600\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish',\n defaultMessage: 'Ready to publish',\n })}\n </CustomStatusButton>\n );\n }\n\n if (status === 'modified') {\n return (\n <CustomStatusButton icon={<ArrowsCounterClockwise />} color=\"alternative600\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.modified',\n defaultMessage: 'Ready to publish changes',\n })}\n </CustomStatusButton>\n );\n }\n\n return (\n <CustomStatusButton icon={<CheckCircle />} color=\"success600\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.already-published',\n defaultMessage: 'Already published',\n })}\n </CustomStatusButton>\n );\n }\n\n if (status === 'published') {\n return (\n <CustomStatusButton icon={<CheckCircle />} color=\"success600\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.ready-to-unpublish',\n defaultMessage: 'Ready to unpublish',\n })}\n </CustomStatusButton>\n );\n }\n\n return (\n <CustomStatusButton icon={<CheckCircle />} color=\"success600\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.already-unpublished',\n defaultMessage: 'Already unpublished',\n })}\n </CustomStatusButton>\n );\n};\n\ninterface FieldsValidationProps {\n hasErrors: boolean;\n errors: FormErrors<FormValues> | null;\n kind?: string;\n contentTypeUid?: string;\n documentId?: string;\n locale?: string;\n}\n\nconst FieldsValidation = ({\n hasErrors,\n errors,\n kind,\n contentTypeUid,\n documentId,\n locale,\n}: FieldsValidationProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex direction=\"column\" gap={1} width=\"100%\" padding={5}>\n <Flex gap={2} width=\"100%\">\n <Typography fontWeight=\"bold\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.fields',\n defaultMessage: 'Fields',\n })}\n </Typography>\n {hasErrors ? <CrossCircle fill=\"danger600\" /> : <CheckCircle fill=\"success600\" />}\n </Flex>\n <Typography width=\"100%\" textColor=\"neutral600\">\n {hasErrors\n ? formatMessage(\n {\n id: 'content-releases.pages.ReleaseDetails.entry-validation.fields.error',\n defaultMessage: '{errors} errors on fields.',\n },\n { errors: errors ? Object.keys(errors).length : 0 }\n )\n : formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.fields.success',\n defaultMessage: 'All fields are filled correctly.',\n })}\n </Typography>\n {hasErrors && (\n <LinkButton\n tag={Link}\n to={{\n pathname: `/content-manager/${kind === 'collectionType' ? 'collection-types' : 'single-types'}/${contentTypeUid}/${documentId}`,\n search: locale\n ? stringify({\n plugins: {\n i18n: {\n locale,\n },\n },\n })\n : '',\n }}\n variant=\"secondary\"\n fullWidth\n state={{ forceValidation: true }}\n >\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.fields.see-errors',\n defaultMessage: 'See errors',\n })}\n </LinkButton>\n )}\n </Flex>\n );\n};\n\nconst getReviewStageIcon = ({\n contentTypeHasReviewWorkflow,\n requiredStage,\n entryStage,\n}: {\n contentTypeHasReviewWorkflow: boolean;\n requiredStage?: Stage;\n entryStage?: Stage;\n}) => {\n if (!contentTypeHasReviewWorkflow) {\n return <CheckCircle fill=\"neutral200\" />;\n }\n if (requiredStage && requiredStage.id !== entryStage?.id) {\n return <CrossCircle fill=\"danger600\" />;\n }\n return <CheckCircle fill=\"success600\" />;\n};\n\nconst getReviewStageMessage = ({\n contentTypeHasReviewWorkflow,\n requiredStage,\n entryStage,\n formatMessage,\n}: {\n contentTypeHasReviewWorkflow: boolean;\n requiredStage?: Stage;\n entryStage?: Stage;\n formatMessage: (messageDescriptor: MessageDescriptor, values?: Record<string, string>) => string;\n}) => {\n if (!contentTypeHasReviewWorkflow) {\n return formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.review-stage.not-enabled',\n defaultMessage: 'This entry is not associated to any workflow.',\n });\n }\n\n if (requiredStage && requiredStage.id !== entryStage?.id) {\n return formatMessage(\n {\n id: 'content-releases.pages.ReleaseDetails.entry-validation.review-stage.not-ready',\n defaultMessage: 'This entry is not at the required stage for publishing. ({stageName})',\n },\n {\n stageName: requiredStage?.name ?? '',\n }\n );\n }\n\n if (requiredStage && requiredStage.id === entryStage?.id) {\n return formatMessage(\n {\n id: 'content-releases.pages.ReleaseDetails.entry-validation.review-stage.ready',\n defaultMessage: 'This entry is at the required stage for publishing. ({stageName})',\n },\n {\n stageName: requiredStage?.name ?? '',\n }\n );\n }\n\n return formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.review-stage.stage-not-required',\n defaultMessage: 'No required stage for publication',\n });\n};\n\nconst ReviewStageValidation = ({\n contentTypeHasReviewWorkflow,\n requiredStage,\n entryStage,\n}: {\n contentTypeHasReviewWorkflow: boolean;\n requiredStage?: Stage;\n entryStage?: Stage;\n}) => {\n const { formatMessage } = useIntl();\n\n const Icon = getReviewStageIcon({\n contentTypeHasReviewWorkflow,\n requiredStage,\n entryStage,\n });\n\n return (\n <Flex direction=\"column\" gap={1} width=\"100%\" padding={5}>\n <Flex gap={2} width=\"100%\">\n <Typography fontWeight=\"bold\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.review-stage',\n defaultMessage: 'Review stage',\n })}\n </Typography>\n {Icon}\n </Flex>\n <Typography textColor=\"neutral600\">\n {getReviewStageMessage({\n contentTypeHasReviewWorkflow,\n requiredStage,\n entryStage,\n formatMessage,\n })}\n </Typography>\n </Flex>\n );\n};\n\nexport const EntryValidationPopover = ({\n schema,\n entry,\n status,\n action,\n}: EntryValidationPopoverProps) => {\n const { validate, isLoading } = unstable_useDocument(\n {\n collectionType: schema?.kind ?? '',\n model: schema?.uid ?? '',\n },\n {\n // useDocument makes a request to get more data about the entry, but we only want to have the validation function so we skip the request\n skip: true,\n }\n );\n\n // Validation errors\n const errors = isLoading ? null : validate(entry);\n const hasErrors = errors ? Object.keys(errors).length > 0 : false;\n\n // Entry stage\n const contentTypeHasReviewWorkflow = schema?.hasReviewWorkflow ?? false;\n const requiredStage = schema?.stageRequiredToPublish;\n const entryStage = entry.strapi_stage;\n\n if (isLoading) {\n return null;\n }\n\n return (\n <Popover.Root>\n <EntryStatusTrigger\n action={action}\n status={status}\n hasErrors={hasErrors}\n requiredStage={requiredStage}\n entryStage={entryStage}\n />\n <Popover.Content>\n <StyledPopoverFlex direction=\"column\">\n <FieldsValidation\n hasErrors={hasErrors}\n errors={errors}\n contentTypeUid={schema?.uid}\n kind={schema?.kind}\n documentId={entry.documentId}\n locale={entry.locale}\n />\n <ReviewStageValidation\n contentTypeHasReviewWorkflow={contentTypeHasReviewWorkflow}\n requiredStage={requiredStage}\n entryStage={entryStage}\n />\n </StyledPopoverFlex>\n </Popover.Content>\n </Popover.Root>\n );\n};\n"],"names":["StyledPopoverFlex","styled","Flex","theme","colors","neutral150","ButtonContent","CustomStatusButton","children","icon","color","_jsx","Popover","Trigger","Button","variant","endIcon","CaretDown","_jsxs","gap","Typography","textColor","fontWeight","EntryStatusTrigger","action","status","hasErrors","requiredStage","entryStage","formatMessage","useIntl","id","CrossCircle","defaultMessage","CheckCircle","ArrowsCounterClockwise","FieldsValidation","errors","kind","contentTypeUid","documentId","locale","direction","width","padding","fill","Object","keys","length","LinkButton","tag","Link","to","pathname","search","stringify","plugins","i18n","fullWidth","state","forceValidation","getReviewStageIcon","contentTypeHasReviewWorkflow","getReviewStageMessage","stageName","name","ReviewStageValidation","Icon","EntryValidationPopover","schema","entry","validate","isLoading","unstable_useDocument","collectionType","model","uid","skip","hasReviewWorkflow","stageRequiredToPublish","strapi_stage","Root","Content"],"mappings":"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"}