@strapi/review-workflows 0.0.0-experimental.edc24aaa3bb5a90fa5fd4fee208167dd4e2e38d4 → 0.0.0-experimental.ee7402bacc4656d268ab76aa9c334a7b7a951201

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 (87) hide show
  1. package/dist/_chunks/{Layout-D3DDQmMI.js → Layout-C3IORH2n.js} +9 -11
  2. package/dist/_chunks/Layout-C3IORH2n.js.map +1 -0
  3. package/dist/_chunks/{Layout-Da8jupiA.mjs → Layout-DNKR5bym.mjs} +8 -9
  4. package/dist/_chunks/Layout-DNKR5bym.mjs.map +1 -0
  5. package/dist/_chunks/{en-xcewH2pC.js → en-CYgjfSep.js} +5 -2
  6. package/dist/_chunks/en-CYgjfSep.js.map +1 -0
  7. package/dist/_chunks/{en-D9ZrQAV6.mjs → en-D9dxziEb.mjs} +5 -2
  8. package/dist/_chunks/en-D9dxziEb.mjs.map +1 -0
  9. package/dist/_chunks/{_id-xSrgPSJs.mjs → id-C9Ku9Br9.mjs} +85 -55
  10. package/dist/_chunks/id-C9Ku9Br9.mjs.map +1 -0
  11. package/dist/_chunks/{_id-CnRDP3Xx.js → id-oOE1bYls.js} +86 -57
  12. package/dist/_chunks/id-oOE1bYls.js.map +1 -0
  13. package/dist/_chunks/{index-DDsJlZQw.mjs → index-ByXbOW-R.mjs} +91 -77
  14. package/dist/_chunks/index-ByXbOW-R.mjs.map +1 -0
  15. package/dist/_chunks/{index-4kp4AkBB.js → index-CmHHjN95.js} +12 -34
  16. package/dist/_chunks/index-CmHHjN95.js.map +1 -0
  17. package/dist/_chunks/{index-jfO5GxtW.mjs → index-CyhaJuJG.mjs} +13 -34
  18. package/dist/_chunks/index-CyhaJuJG.mjs.map +1 -0
  19. package/dist/_chunks/{index-DhPxWpsW.js → index-DMT27jNE.js} +91 -78
  20. package/dist/_chunks/index-DMT27jNE.js.map +1 -0
  21. package/dist/_chunks/{purchase-review-workflows-DlCDg0fD.js → purchase-review-workflows-BxoDFxQ5.js} +2 -2
  22. package/dist/_chunks/purchase-review-workflows-BxoDFxQ5.js.map +1 -0
  23. package/dist/_chunks/{purchase-review-workflows-BN-5Ube7.mjs → purchase-review-workflows-DyFV_H0I.mjs} +2 -2
  24. package/dist/_chunks/{purchase-review-workflows-BN-5Ube7.mjs.map → purchase-review-workflows-DyFV_H0I.mjs.map} +1 -1
  25. package/dist/_chunks/{router-DOEULOpS.mjs → router-BPl2HZMq.mjs} +3 -3
  26. package/dist/_chunks/router-BPl2HZMq.mjs.map +1 -0
  27. package/dist/_chunks/{router-DSXpeew4.js → router-vDfGt9bq.js} +3 -3
  28. package/dist/_chunks/router-vDfGt9bq.js.map +1 -0
  29. package/dist/admin/index.js +1 -1
  30. package/dist/admin/index.mjs +1 -1
  31. package/dist/admin/src/services/admin.d.ts +1 -1
  32. package/dist/admin/src/services/api.d.ts +1 -1
  33. package/dist/admin/src/services/content-manager.d.ts +4 -4
  34. package/dist/admin/src/services/settings.d.ts +1739 -9
  35. package/dist/server/index.js +455 -628
  36. package/dist/server/index.js.map +1 -1
  37. package/dist/server/index.mjs +455 -628
  38. package/dist/server/index.mjs.map +1 -1
  39. package/dist/server/src/bootstrap.d.ts.map +1 -1
  40. package/dist/server/src/constants/workflows.d.ts +1 -0
  41. package/dist/server/src/constants/workflows.d.ts.map +1 -1
  42. package/dist/server/src/content-types/index.d.ts +6 -0
  43. package/dist/server/src/content-types/index.d.ts.map +1 -1
  44. package/dist/server/src/content-types/workflow/index.d.ts +6 -0
  45. package/dist/server/src/content-types/workflow/index.d.ts.map +1 -1
  46. package/dist/server/src/controllers/assignees.d.ts.map +1 -1
  47. package/dist/server/src/controllers/index.d.ts +0 -1
  48. package/dist/server/src/controllers/index.d.ts.map +1 -1
  49. package/dist/server/src/controllers/stages.d.ts.map +1 -1
  50. package/dist/server/src/controllers/workflows.d.ts +0 -7
  51. package/dist/server/src/controllers/workflows.d.ts.map +1 -1
  52. package/dist/server/src/index.d.ts +28 -7
  53. package/dist/server/src/index.d.ts.map +1 -1
  54. package/dist/server/src/register.d.ts.map +1 -1
  55. package/dist/server/src/routes/review-workflows.d.ts.map +1 -1
  56. package/dist/server/src/services/assignees.d.ts +8 -4
  57. package/dist/server/src/services/assignees.d.ts.map +1 -1
  58. package/dist/server/src/services/document-service-middleware.d.ts +1 -0
  59. package/dist/server/src/services/document-service-middleware.d.ts.map +1 -1
  60. package/dist/server/src/services/index.d.ts +16 -6
  61. package/dist/server/src/services/index.d.ts.map +1 -1
  62. package/dist/server/src/services/metrics/index.d.ts +4 -4
  63. package/dist/server/src/services/metrics/index.d.ts.map +1 -1
  64. package/dist/server/src/services/metrics/weekly-metrics.d.ts.map +1 -1
  65. package/dist/server/src/services/stages.d.ts +7 -7
  66. package/dist/server/src/services/stages.d.ts.map +1 -1
  67. package/dist/server/src/services/workflows.d.ts.map +1 -1
  68. package/dist/server/src/validation/review-workflows.d.ts +4 -0
  69. package/dist/server/src/validation/review-workflows.d.ts.map +1 -1
  70. package/dist/shared/contracts/review-workflows.d.ts +9 -17
  71. package/dist/shared/contracts/review-workflows.d.ts.map +1 -1
  72. package/package.json +12 -13
  73. package/dist/_chunks/Layout-D3DDQmMI.js.map +0 -1
  74. package/dist/_chunks/Layout-Da8jupiA.mjs.map +0 -1
  75. package/dist/_chunks/_id-CnRDP3Xx.js.map +0 -1
  76. package/dist/_chunks/_id-xSrgPSJs.mjs.map +0 -1
  77. package/dist/_chunks/en-D9ZrQAV6.mjs.map +0 -1
  78. package/dist/_chunks/en-xcewH2pC.js.map +0 -1
  79. package/dist/_chunks/index-4kp4AkBB.js.map +0 -1
  80. package/dist/_chunks/index-DDsJlZQw.mjs.map +0 -1
  81. package/dist/_chunks/index-DhPxWpsW.js.map +0 -1
  82. package/dist/_chunks/index-jfO5GxtW.mjs.map +0 -1
  83. package/dist/_chunks/purchase-review-workflows-DlCDg0fD.js.map +0 -1
  84. package/dist/_chunks/router-DOEULOpS.mjs.map +0 -1
  85. package/dist/_chunks/router-DSXpeew4.js.map +0 -1
  86. package/strapi-server.js +0 -3
  87. /package/dist/admin/src/routes/settings/{:id.d.ts → id.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CmHHjN95.js","sources":["../../admin/src/routes/settings/index.tsx"],"sourcesContent":["/* eslint-disable check-file/no-index */\n/* eslint-disable check-file/filename-naming-convention */\nimport * as React from 'react';\n\nimport { Page, useTracking, ConfirmDialog, useRBAC, Table } from '@strapi/admin/strapi-admin';\nimport { useLicenseLimits } from '@strapi/admin/strapi-admin/ee';\nimport { Flex, IconButton, TFooter, Typography, LinkButton, Dialog } from '@strapi/design-system';\nimport { Pencil, Plus, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { NavLink, Link, useNavigate } from 'react-router-dom';\n\nimport { LimitsModal } from '../../components/LimitsModal';\nimport { CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME } from '../../constants';\nimport { useTypedSelector } from '../../modules/hooks';\nimport { ContentType, useGetContentTypesQuery } from '../../services/content-manager';\n\nimport * as Layout from './components/Layout';\nimport { useReviewWorkflows } from './hooks/useReviewWorkflows';\n\nexport const ReviewWorkflowsListView = () => {\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const { trackUsage } = useTracking();\n const [workflowToDelete, setWorkflowToDelete] = React.useState<string | null>(null);\n const [showLimitModal, setShowLimitModal] = React.useState<boolean>(false);\n const { data, isLoading: isLoadingModels } = useGetContentTypesQuery();\n const { meta, workflows, isLoading, delete: deleteAction } = useReviewWorkflows();\n const { getFeature, isLoading: isLicenseLoading } = useLicenseLimits();\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.settings?.['review-workflows']\n );\n const {\n allowedActions: { canCreate, canRead, canUpdate, canDelete },\n } = useRBAC(permissions);\n\n const limits = getFeature('review-workflows');\n const numberOfWorkflows = limits?.[CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME] as string;\n\n const handleDeleteWorkflow = (workflowId: string) => {\n setWorkflowToDelete(workflowId);\n };\n\n const toggleConfirmDeleteDialog = () => {\n setWorkflowToDelete(null);\n };\n\n const handleConfirmDeleteDialog = async () => {\n if (!workflowToDelete) return;\n\n await deleteAction(workflowToDelete);\n\n setWorkflowToDelete(null);\n };\n\n const handleCreateClick: React.MouseEventHandler<HTMLAnchorElement> &\n ((event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void) = (event) => {\n event.preventDefault();\n /**\n * If the current license has a workflow limit:\n * check if the total count of workflows exceeds that limit. If so,\n * prevent the navigation and show the limits overlay.\n *\n * If the current license does not have a limit (e.g. offline license):\n * allow the user to navigate to the create-view. In case they exceed the\n * current hard-limit of 200 they will see an error thrown by the API.\n */\n\n if (numberOfWorkflows && meta && meta?.workflowCount >= parseInt(numberOfWorkflows, 10)) {\n event.preventDefault();\n setShowLimitModal(true);\n } else {\n navigate('create');\n trackUsage('willCreateWorkflow');\n }\n };\n\n /**\n * If the current license has a limit:\n * check if the total count of workflows or stages exceeds that limit and display\n * the limits modal on page load. It can be closed by the user, but the\n * API will throw an error in case they try to create a new workflow or update the\n * stages.\n *\n * If the current license does not have a limit (e.g. offline license):\n * do nothing (for now). In case they are trying to create the 201st workflow/ stage\n * the API will throw an error.\n *\n */\n React.useEffect(() => {\n if (!isLoading && !isLicenseLoading) {\n if (numberOfWorkflows && meta && meta?.workflowCount > parseInt(numberOfWorkflows, 10)) {\n setShowLimitModal(true);\n }\n }\n }, [isLicenseLoading, isLoading, meta, meta?.workflowCount, numberOfWorkflows]);\n\n const headers = [\n {\n label: formatMessage({\n id: 'Settings.review-workflows.list.page.list.column.name.title',\n defaultMessage: 'Name',\n }),\n name: 'name',\n },\n {\n label: formatMessage({\n id: 'Settings.review-workflows.list.page.list.column.stages.title',\n defaultMessage: 'Stages',\n }),\n name: 'stages',\n },\n {\n label: formatMessage({\n id: 'Settings.review-workflows.list.page.list.column.contentTypes.title',\n defaultMessage: 'Content Types',\n }),\n name: 'content-types',\n },\n ];\n\n if (isLoading || isLoadingModels) {\n return <Page.Loading />;\n }\n\n const contentTypes = Object.values(data ?? {}).reduce<ContentType[]>((acc, curr) => {\n acc.push(...curr);\n return acc;\n }, []);\n\n return (\n <>\n <Layout.Header\n primaryAction={\n canCreate ? (\n <LinkButton\n startIcon={<Plus />}\n size=\"S\"\n tag={NavLink}\n to=\"create\"\n onClick={handleCreateClick}\n >\n {formatMessage({\n id: 'Settings.review-workflows.list.page.create',\n defaultMessage: 'Create new workflow',\n })}\n </LinkButton>\n ) : null\n }\n subtitle={formatMessage({\n id: 'Settings.review-workflows.list.page.subtitle',\n defaultMessage: 'Manage your content review process',\n })}\n title={formatMessage({\n id: 'Settings.review-workflows.list.page.title',\n defaultMessage: 'Review Workflows',\n })}\n />\n\n <Layout.Root>\n <Table.Root\n isLoading={isLoading}\n rows={workflows}\n footer={\n canCreate ? (\n <TFooter cursor=\"pointer\" icon={<Plus />} onClick={handleCreateClick}>\n {formatMessage({\n id: 'Settings.review-workflows.list.page.create',\n defaultMessage: 'Create new workflow',\n })}\n </TFooter>\n ) : null\n }\n headers={headers}\n >\n <Table.Content>\n <Table.Head>\n {headers.map((head) => (\n <Table.HeaderCell key={head.name} {...head} />\n ))}\n </Table.Head>\n\n <Table.Body>\n {workflows.map((workflow) => (\n <Table.Row\n onClick={() => {\n navigate(`${workflow.id}`);\n }}\n key={workflow.id}\n >\n <Table.Cell width=\"25rem\">\n <Typography textColor=\"neutral800\" fontWeight=\"bold\" ellipsis>\n {workflow.name}\n </Typography>\n </Table.Cell>\n <Table.Cell>\n <Typography textColor=\"neutral800\">{workflow.stages.length}</Typography>\n </Table.Cell>\n <Table.Cell>\n <Typography textColor=\"neutral800\">\n {workflow.contentTypes\n .map((uid: string) => {\n const contentType = contentTypes.find(\n (contentType) => contentType.uid === uid\n );\n\n return contentType?.info.displayName ?? '';\n })\n .join(', ')}\n </Typography>\n </Table.Cell>\n <Table.Cell>\n <Flex alignItems=\"center\" justifyContent=\"end\">\n {canRead || canUpdate ? (\n <IconButton\n tag={Link}\n to={workflow.id.toString()}\n label={formatMessage(\n {\n id: 'Settings.review-workflows.list.page.list.column.actions.edit.label',\n defaultMessage: 'Edit {name}',\n },\n { name: workflow.name }\n )}\n variant=\"ghost\"\n >\n <Pencil />\n </IconButton>\n ) : null}\n {workflows.length > 1 && canDelete ? (\n <IconButton\n withTooltip={false}\n label={formatMessage(\n {\n id: 'Settings.review-workflows.list.page.list.column.actions.delete.label',\n defaultMessage: 'Delete {name}',\n },\n { name: 'Default workflow' }\n )}\n variant=\"ghost\"\n onClick={(e) => {\n e.stopPropagation();\n handleDeleteWorkflow(String(workflow.id));\n }}\n >\n <Trash />\n </IconButton>\n ) : null}\n </Flex>\n </Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table.Content>\n </Table.Root>\n\n <Dialog.Root open={!!workflowToDelete} onOpenChange={toggleConfirmDeleteDialog}>\n <ConfirmDialog onConfirm={handleConfirmDeleteDialog}>\n {formatMessage({\n id: 'Settings.review-workflows.list.page.delete.confirm.body',\n defaultMessage:\n 'If you remove this worfklow, all stage-related information will be removed for this content-type. Are you sure you want to remove it?',\n })}\n </ConfirmDialog>\n </Dialog.Root>\n\n <LimitsModal.Root open={showLimitModal} onOpenChange={() => setShowLimitModal(false)}>\n <LimitsModal.Title>\n {formatMessage({\n id: 'Settings.review-workflows.list.page.workflows.limit.title',\n defaultMessage: 'You’ve reached the limit of workflows in your plan',\n })}\n </LimitsModal.Title>\n\n <LimitsModal.Body>\n {formatMessage({\n id: 'Settings.review-workflows.list.page.workflows.limit.body',\n defaultMessage: 'Delete a workflow or contact Sales to enable more workflows.',\n })}\n </LimitsModal.Body>\n </LimitsModal.Root>\n </Layout.Root>\n </>\n );\n};\n\nconst ProtectedListPage = () => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.settings?.['review-workflows']?.main\n );\n\n return (\n <Page.Protect permissions={permissions}>\n <ReviewWorkflowsListView />\n </Page.Protect>\n );\n};\n\nexport { ProtectedListPage };\n"],"names":["useIntl","useNavigate","useTracking","React","useGetContentTypesQuery","useReviewWorkflows","useLicenseLimits","useTypedSelector","useRBAC","CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME","jsx","Page","jsxs","Fragment","Layout.Header","LinkButton","Plus","NavLink","Layout.Root","Table","TFooter","Typography","contentType","Flex","IconButton","Link","Pencil","Trash","Dialog","ConfirmDialog","LimitsModal"],"mappings":"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"}
@@ -2,13 +2,12 @@ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
2
  import * as React from "react";
3
3
  import { useTracking, useRBAC, Page, Table, ConfirmDialog } from "@strapi/admin/strapi-admin";
4
4
  import { useLicenseLimits } from "@strapi/admin/strapi-admin/ee";
5
- import { LinkButton, TFooter, Typography, Flex, IconButton, Dialog, Link } from "@strapi/design-system";
5
+ import { LinkButton, TFooter, Typography, Flex, IconButton, Dialog } from "@strapi/design-system";
6
6
  import { Plus, Pencil, Trash } from "@strapi/icons";
7
7
  import { useIntl } from "react-intl";
8
- import { useNavigate, NavLink } from "react-router-dom";
9
- import { styled } from "styled-components";
10
- import { u as useGetContentTypesQuery, a as useTypedSelector, C as CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME, L as LimitsModal } from "./index-DDsJlZQw.mjs";
11
- import { u as useReviewWorkflows, H as Header, R as Root } from "./Layout-Da8jupiA.mjs";
8
+ import { useNavigate, NavLink, Link } from "react-router-dom";
9
+ import { u as useGetContentTypesQuery, a as useTypedSelector, C as CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME, L as LimitsModal } from "./index-ByXbOW-R.mjs";
10
+ import { u as useReviewWorkflows, H as Header, R as Root } from "./Layout-DNKR5bym.mjs";
12
11
  const ReviewWorkflowsListView = () => {
13
12
  const { formatMessage } = useIntl();
14
13
  const navigate = useNavigate();
@@ -33,8 +32,7 @@ const ReviewWorkflowsListView = () => {
33
32
  setWorkflowToDelete(null);
34
33
  };
35
34
  const handleConfirmDeleteDialog = async () => {
36
- if (!workflowToDelete)
37
- return;
35
+ if (!workflowToDelete) return;
38
36
  await deleteAction(workflowToDelete);
39
37
  setWorkflowToDelete(null);
40
38
  };
@@ -119,7 +117,7 @@ const ReviewWorkflowsListView = () => {
119
117
  {
120
118
  isLoading,
121
119
  rows: workflows,
122
- footer: canCreate ? /* @__PURE__ */ jsx(TFooter, { icon: /* @__PURE__ */ jsx(Plus, {}), onClick: handleCreateClick, children: formatMessage({
120
+ footer: canCreate ? /* @__PURE__ */ jsx(TFooter, { cursor: "pointer", icon: /* @__PURE__ */ jsx(Plus, {}), onClick: handleCreateClick, children: formatMessage({
123
121
  id: "Settings.review-workflows.list.page.create",
124
122
  defaultMessage: "Create new workflow"
125
123
  }) }) : null,
@@ -143,16 +141,18 @@ const ReviewWorkflowsListView = () => {
143
141
  }).join(", ") }) }),
144
142
  /* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", justifyContent: "end", children: [
145
143
  canRead || canUpdate ? /* @__PURE__ */ jsx(
146
- ActionLink,
144
+ IconButton,
147
145
  {
148
- to: `${workflow.id}`,
149
- "aria-label": formatMessage(
146
+ tag: Link,
147
+ to: workflow.id.toString(),
148
+ label: formatMessage(
150
149
  {
151
150
  id: "Settings.review-workflows.list.page.list.column.actions.edit.label",
152
151
  defaultMessage: "Edit {name}"
153
152
  },
154
153
  { name: workflow.name }
155
154
  ),
155
+ variant: "ghost",
156
156
  children: /* @__PURE__ */ jsx(Pencil, {})
157
157
  }
158
158
  ) : null,
@@ -167,7 +167,7 @@ const ReviewWorkflowsListView = () => {
167
167
  },
168
168
  { name: "Default workflow" }
169
169
  ),
170
- borderWidth: 0,
170
+ variant: "ghost",
171
171
  onClick: (e) => {
172
172
  e.stopPropagation();
173
173
  handleDeleteWorkflow(String(workflow.id));
@@ -200,27 +200,6 @@ const ReviewWorkflowsListView = () => {
200
200
  ] })
201
201
  ] });
202
202
  };
203
- const ActionLink = styled(Link)`
204
- align-items: center;
205
- display: flex;
206
- justify-content: center;
207
- padding: ${({ theme }) => `${theme.spaces[2]}}`};
208
- & > span {
209
- line-height: 1rem;
210
- font-size: 1rem;
211
- }
212
-
213
- & svg > path {
214
- fill: ${({ theme }) => theme.colors.neutral500};
215
- }
216
-
217
- &:hover,
218
- &:focus {
219
- svg > path {
220
- fill: ${({ theme }) => theme.colors.neutral800};
221
- }
222
- }
223
- `;
224
203
  const ProtectedListPage = () => {
225
204
  const permissions = useTypedSelector(
226
205
  (state) => state.admin_app.permissions.settings?.["review-workflows"]?.main
@@ -231,4 +210,4 @@ export {
231
210
  ProtectedListPage,
232
211
  ReviewWorkflowsListView
233
212
  };
234
- //# sourceMappingURL=index-jfO5GxtW.mjs.map
213
+ //# sourceMappingURL=index-CyhaJuJG.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CyhaJuJG.mjs","sources":["../../admin/src/routes/settings/index.tsx"],"sourcesContent":["/* eslint-disable check-file/no-index */\n/* eslint-disable check-file/filename-naming-convention */\nimport * as React from 'react';\n\nimport { Page, useTracking, ConfirmDialog, useRBAC, Table } from '@strapi/admin/strapi-admin';\nimport { useLicenseLimits } from '@strapi/admin/strapi-admin/ee';\nimport { Flex, IconButton, TFooter, Typography, LinkButton, Dialog } from '@strapi/design-system';\nimport { Pencil, Plus, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { NavLink, Link, useNavigate } from 'react-router-dom';\n\nimport { LimitsModal } from '../../components/LimitsModal';\nimport { CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME } from '../../constants';\nimport { useTypedSelector } from '../../modules/hooks';\nimport { ContentType, useGetContentTypesQuery } from '../../services/content-manager';\n\nimport * as Layout from './components/Layout';\nimport { useReviewWorkflows } from './hooks/useReviewWorkflows';\n\nexport const ReviewWorkflowsListView = () => {\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const { trackUsage } = useTracking();\n const [workflowToDelete, setWorkflowToDelete] = React.useState<string | null>(null);\n const [showLimitModal, setShowLimitModal] = React.useState<boolean>(false);\n const { data, isLoading: isLoadingModels } = useGetContentTypesQuery();\n const { meta, workflows, isLoading, delete: deleteAction } = useReviewWorkflows();\n const { getFeature, isLoading: isLicenseLoading } = useLicenseLimits();\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.settings?.['review-workflows']\n );\n const {\n allowedActions: { canCreate, canRead, canUpdate, canDelete },\n } = useRBAC(permissions);\n\n const limits = getFeature('review-workflows');\n const numberOfWorkflows = limits?.[CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME] as string;\n\n const handleDeleteWorkflow = (workflowId: string) => {\n setWorkflowToDelete(workflowId);\n };\n\n const toggleConfirmDeleteDialog = () => {\n setWorkflowToDelete(null);\n };\n\n const handleConfirmDeleteDialog = async () => {\n if (!workflowToDelete) return;\n\n await deleteAction(workflowToDelete);\n\n setWorkflowToDelete(null);\n };\n\n const handleCreateClick: React.MouseEventHandler<HTMLAnchorElement> &\n ((event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void) = (event) => {\n event.preventDefault();\n /**\n * If the current license has a workflow limit:\n * check if the total count of workflows exceeds that limit. If so,\n * prevent the navigation and show the limits overlay.\n *\n * If the current license does not have a limit (e.g. offline license):\n * allow the user to navigate to the create-view. In case they exceed the\n * current hard-limit of 200 they will see an error thrown by the API.\n */\n\n if (numberOfWorkflows && meta && meta?.workflowCount >= parseInt(numberOfWorkflows, 10)) {\n event.preventDefault();\n setShowLimitModal(true);\n } else {\n navigate('create');\n trackUsage('willCreateWorkflow');\n }\n };\n\n /**\n * If the current license has a limit:\n * check if the total count of workflows or stages exceeds that limit and display\n * the limits modal on page load. It can be closed by the user, but the\n * API will throw an error in case they try to create a new workflow or update the\n * stages.\n *\n * If the current license does not have a limit (e.g. offline license):\n * do nothing (for now). In case they are trying to create the 201st workflow/ stage\n * the API will throw an error.\n *\n */\n React.useEffect(() => {\n if (!isLoading && !isLicenseLoading) {\n if (numberOfWorkflows && meta && meta?.workflowCount > parseInt(numberOfWorkflows, 10)) {\n setShowLimitModal(true);\n }\n }\n }, [isLicenseLoading, isLoading, meta, meta?.workflowCount, numberOfWorkflows]);\n\n const headers = [\n {\n label: formatMessage({\n id: 'Settings.review-workflows.list.page.list.column.name.title',\n defaultMessage: 'Name',\n }),\n name: 'name',\n },\n {\n label: formatMessage({\n id: 'Settings.review-workflows.list.page.list.column.stages.title',\n defaultMessage: 'Stages',\n }),\n name: 'stages',\n },\n {\n label: formatMessage({\n id: 'Settings.review-workflows.list.page.list.column.contentTypes.title',\n defaultMessage: 'Content Types',\n }),\n name: 'content-types',\n },\n ];\n\n if (isLoading || isLoadingModels) {\n return <Page.Loading />;\n }\n\n const contentTypes = Object.values(data ?? {}).reduce<ContentType[]>((acc, curr) => {\n acc.push(...curr);\n return acc;\n }, []);\n\n return (\n <>\n <Layout.Header\n primaryAction={\n canCreate ? (\n <LinkButton\n startIcon={<Plus />}\n size=\"S\"\n tag={NavLink}\n to=\"create\"\n onClick={handleCreateClick}\n >\n {formatMessage({\n id: 'Settings.review-workflows.list.page.create',\n defaultMessage: 'Create new workflow',\n })}\n </LinkButton>\n ) : null\n }\n subtitle={formatMessage({\n id: 'Settings.review-workflows.list.page.subtitle',\n defaultMessage: 'Manage your content review process',\n })}\n title={formatMessage({\n id: 'Settings.review-workflows.list.page.title',\n defaultMessage: 'Review Workflows',\n })}\n />\n\n <Layout.Root>\n <Table.Root\n isLoading={isLoading}\n rows={workflows}\n footer={\n canCreate ? (\n <TFooter cursor=\"pointer\" icon={<Plus />} onClick={handleCreateClick}>\n {formatMessage({\n id: 'Settings.review-workflows.list.page.create',\n defaultMessage: 'Create new workflow',\n })}\n </TFooter>\n ) : null\n }\n headers={headers}\n >\n <Table.Content>\n <Table.Head>\n {headers.map((head) => (\n <Table.HeaderCell key={head.name} {...head} />\n ))}\n </Table.Head>\n\n <Table.Body>\n {workflows.map((workflow) => (\n <Table.Row\n onClick={() => {\n navigate(`${workflow.id}`);\n }}\n key={workflow.id}\n >\n <Table.Cell width=\"25rem\">\n <Typography textColor=\"neutral800\" fontWeight=\"bold\" ellipsis>\n {workflow.name}\n </Typography>\n </Table.Cell>\n <Table.Cell>\n <Typography textColor=\"neutral800\">{workflow.stages.length}</Typography>\n </Table.Cell>\n <Table.Cell>\n <Typography textColor=\"neutral800\">\n {workflow.contentTypes\n .map((uid: string) => {\n const contentType = contentTypes.find(\n (contentType) => contentType.uid === uid\n );\n\n return contentType?.info.displayName ?? '';\n })\n .join(', ')}\n </Typography>\n </Table.Cell>\n <Table.Cell>\n <Flex alignItems=\"center\" justifyContent=\"end\">\n {canRead || canUpdate ? (\n <IconButton\n tag={Link}\n to={workflow.id.toString()}\n label={formatMessage(\n {\n id: 'Settings.review-workflows.list.page.list.column.actions.edit.label',\n defaultMessage: 'Edit {name}',\n },\n { name: workflow.name }\n )}\n variant=\"ghost\"\n >\n <Pencil />\n </IconButton>\n ) : null}\n {workflows.length > 1 && canDelete ? (\n <IconButton\n withTooltip={false}\n label={formatMessage(\n {\n id: 'Settings.review-workflows.list.page.list.column.actions.delete.label',\n defaultMessage: 'Delete {name}',\n },\n { name: 'Default workflow' }\n )}\n variant=\"ghost\"\n onClick={(e) => {\n e.stopPropagation();\n handleDeleteWorkflow(String(workflow.id));\n }}\n >\n <Trash />\n </IconButton>\n ) : null}\n </Flex>\n </Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table.Content>\n </Table.Root>\n\n <Dialog.Root open={!!workflowToDelete} onOpenChange={toggleConfirmDeleteDialog}>\n <ConfirmDialog onConfirm={handleConfirmDeleteDialog}>\n {formatMessage({\n id: 'Settings.review-workflows.list.page.delete.confirm.body',\n defaultMessage:\n 'If you remove this worfklow, all stage-related information will be removed for this content-type. Are you sure you want to remove it?',\n })}\n </ConfirmDialog>\n </Dialog.Root>\n\n <LimitsModal.Root open={showLimitModal} onOpenChange={() => setShowLimitModal(false)}>\n <LimitsModal.Title>\n {formatMessage({\n id: 'Settings.review-workflows.list.page.workflows.limit.title',\n defaultMessage: 'You’ve reached the limit of workflows in your plan',\n })}\n </LimitsModal.Title>\n\n <LimitsModal.Body>\n {formatMessage({\n id: 'Settings.review-workflows.list.page.workflows.limit.body',\n defaultMessage: 'Delete a workflow or contact Sales to enable more workflows.',\n })}\n </LimitsModal.Body>\n </LimitsModal.Root>\n </Layout.Root>\n </>\n );\n};\n\nconst ProtectedListPage = () => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.settings?.['review-workflows']?.main\n );\n\n return (\n <Page.Protect permissions={permissions}>\n <ReviewWorkflowsListView />\n </Page.Protect>\n );\n};\n\nexport { ProtectedListPage };\n"],"names":["Layout.Header","Layout.Root","contentType"],"mappings":"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"}
@@ -11,8 +11,7 @@ const ee = require("@strapi/admin/strapi-admin/ee");
11
11
  const icons = require("@strapi/icons");
12
12
  const styledComponents = require("styled-components");
13
13
  function _interopNamespace(e) {
14
- if (e && e.__esModule)
15
- return e;
14
+ if (e && e.__esModule) return e;
16
15
  const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
17
16
  if (e) {
18
17
  for (const k in e) {
@@ -29,13 +28,20 @@ function _interopNamespace(e) {
29
28
  return Object.freeze(n);
30
29
  }
31
30
  const React__namespace = /* @__PURE__ */ _interopNamespace(React);
32
- const __variableDynamicImportRuntimeHelper = (glob, path) => {
31
+ const __variableDynamicImportRuntimeHelper = (glob, path, segs) => {
33
32
  const v = glob[path];
34
33
  if (v) {
35
34
  return typeof v === "function" ? v() : Promise.resolve(v);
36
35
  }
37
36
  return new Promise((_, reject) => {
38
- (typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(reject.bind(null, new Error("Unknown variable dynamic import: " + path)));
37
+ (typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
38
+ reject.bind(
39
+ null,
40
+ new Error(
41
+ "Unknown variable dynamic import: " + path + (path.split("/").length !== segs ? ". Note that variables only represent file names one level deep." : "")
42
+ )
43
+ )
44
+ );
39
45
  });
40
46
  };
41
47
  const PLUGIN_ID = "review-workflows";
@@ -45,8 +51,9 @@ const CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME = "stagesPerWorkflow";
45
51
  const STAGE_COLOR_DEFAULT = designSystem.lightTheme.colors.primary600;
46
52
  const useTypedSelector = reactRedux.useSelector;
47
53
  const reviewWorkflowsApi = strapiAdmin.adminApi.enhanceEndpoints({
48
- addTagTypes: ["ReviewWorkflow", "ReviewWorkflowStages"]
54
+ addTagTypes: ["ReviewWorkflow", "ReviewWorkflowStages", "Document", "ContentTypeSettings"]
49
55
  });
56
+ const SINGLE_TYPES = "single-types";
50
57
  const contentManagerApi = reviewWorkflowsApi.injectEndpoints({
51
58
  endpoints: (builder) => ({
52
59
  getStages: builder.query({
@@ -74,7 +81,17 @@ const contentManagerApi = reviewWorkflowsApi.injectEndpoints({
74
81
  params
75
82
  }
76
83
  }),
77
- transformResponse: (res) => res.data
84
+ transformResponse: (res) => res.data,
85
+ invalidatesTags: (_result, _error, { slug, id, model }) => {
86
+ return [
87
+ {
88
+ type: "Document",
89
+ id: slug !== SINGLE_TYPES ? `${model}_${id}` : model
90
+ },
91
+ { type: "Document", id: `${model}_LIST` },
92
+ "ReviewWorkflowStages"
93
+ ];
94
+ }
78
95
  }),
79
96
  updateAssignee: builder.mutation({
80
97
  query: ({ model, slug, id, params, ...data }) => ({
@@ -85,7 +102,16 @@ const contentManagerApi = reviewWorkflowsApi.injectEndpoints({
85
102
  params
86
103
  }
87
104
  }),
88
- transformResponse: (res) => res.data
105
+ transformResponse: (res) => res.data,
106
+ invalidatesTags: (_result, _error, { slug, id, model }) => {
107
+ return [
108
+ {
109
+ type: "Document",
110
+ id: slug !== SINGLE_TYPES ? `${model}_${id}` : model
111
+ },
112
+ { type: "Document", id: `${model}_LIST` }
113
+ ];
114
+ }
89
115
  }),
90
116
  getContentTypes: builder.query({
91
117
  query: () => ({
@@ -120,8 +146,7 @@ const isBaseQueryError = (error) => {
120
146
  return error.name !== void 0;
121
147
  };
122
148
  const buildValidParams = (query) => {
123
- if (!query)
124
- return query;
149
+ if (!query) return query;
125
150
  const { plugins: _, ...validQueryParams } = {
126
151
  ...query,
127
152
  ...Object.values(query?.plugins ?? {}).reduce(
@@ -129,9 +154,6 @@ const buildValidParams = (query) => {
129
154
  {}
130
155
  )
131
156
  };
132
- if ("_q" in validQueryParams) {
133
- validQueryParams._q = encodeURIComponent(validQueryParams._q);
134
- }
135
157
  return validQueryParams;
136
158
  };
137
159
  const getDisplayName = ({
@@ -156,7 +178,6 @@ const AssigneeSelect = () => {
156
178
  id,
157
179
  slug: model = ""
158
180
  } = reactRouterDom.useParams();
159
- const dispatch = reactRedux.useDispatch();
160
181
  const permissions = useTypedSelector((state) => state.admin_app.permissions);
161
182
  const { formatMessage } = reactIntl.useIntl();
162
183
  const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler();
@@ -177,13 +198,13 @@ const AssigneeSelect = () => {
177
198
  documentId: id
178
199
  },
179
200
  {
180
- skip: !id
201
+ skip: !id && collectionType !== "single-types"
181
202
  }
182
203
  );
183
204
  const users = data?.users || [];
184
205
  const currentAssignee = document ? document[ASSIGNEE_ATTRIBUTE_NAME] : null;
185
206
  const [updateAssignee, { error, isLoading: isMutating }] = useUpdateAssigneeMutation();
186
- if (!collectionType || !model || !id) {
207
+ if (!collectionType || !model || !document?.documentId) {
187
208
  return null;
188
209
  }
189
210
  const handleChange = async (assigneeId) => {
@@ -193,22 +214,13 @@ const AssigneeSelect = () => {
193
214
  const res = await updateAssignee({
194
215
  slug: collectionType,
195
216
  model,
196
- id,
217
+ id: document.documentId,
197
218
  params,
198
219
  data: {
199
220
  id: assigneeId ? parseInt(assigneeId, 10) : null
200
221
  }
201
222
  });
202
223
  if ("data" in res) {
203
- dispatch({
204
- type: "contentManagerApi/invalidateTags",
205
- payload: [
206
- {
207
- type: "Document",
208
- id: `${model}_${id}`
209
- }
210
- ]
211
- });
212
224
  toggleNotification({
213
225
  type: "success",
214
226
  message: formatMessage({
@@ -239,7 +251,7 @@ const AssigneeSelect = () => {
239
251
  id: "content-manager.reviewWorkflows.assignee.clear",
240
252
  defaultMessage: "Clear assignee"
241
253
  }),
242
- disabled: !isLoadingPermissions && !isLoading && users.length === 0 || !id,
254
+ disabled: !isLoadingPermissions && !isLoading && users.length === 0 || !document.documentId,
243
255
  value: currentAssignee ? currentAssignee.id.toString() : null,
244
256
  onChange: handleChange,
245
257
  onClear: () => handleChange(null),
@@ -376,31 +388,31 @@ const StageSelect = () => {
376
388
  slug: model = "",
377
389
  id = ""
378
390
  } = reactRouterDom.useParams();
379
- const dispatch = reactRedux.useDispatch();
380
391
  const { formatMessage } = reactIntl.useIntl();
381
392
  const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler();
382
393
  const { toggleNotification } = strapiAdmin.useNotification();
383
394
  const [{ query }] = strapiAdmin.useQueryParams();
384
395
  const params = React__namespace.useMemo(() => buildValidParams(query), [query]);
385
- const { data, isLoading } = useGetStagesQuery(
396
+ const { document, isLoading: isLoadingDocument } = strapiAdmin$1.unstable_useDocument(
386
397
  {
387
- slug: collectionType,
398
+ collectionType,
388
399
  model,
389
- id,
390
- params
400
+ documentId: id
391
401
  },
392
402
  {
393
- skip: !id
403
+ skip: !id && collectionType !== "single-types"
394
404
  }
395
405
  );
396
- const { document } = strapiAdmin$1.unstable_useDocument(
406
+ const { data, isLoading: isLoadingStages } = useGetStagesQuery(
397
407
  {
398
- collectionType,
408
+ slug: collectionType,
399
409
  model,
400
- documentId: id
410
+ // @ts-expect-error – `id` is not correctly typed in the DS.
411
+ id: document?.documentId,
412
+ params
401
413
  },
402
414
  {
403
- skip: !id
415
+ skip: !document?.documentId
404
416
  }
405
417
  );
406
418
  const { meta, stages = [] } = data ?? {};
@@ -416,24 +428,15 @@ const StageSelect = () => {
416
428
  } else if (limits?.[CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME] && parseInt(limits[CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME], 10) < stages.length) {
417
429
  setShowLimitModal("stage");
418
430
  } else {
419
- if (id) {
431
+ if (document?.documentId) {
420
432
  const res = await updateStage({
421
433
  model,
422
- id,
434
+ id: document.documentId,
423
435
  slug: collectionType,
424
436
  params,
425
437
  data: { id: stageId }
426
438
  });
427
439
  if ("data" in res) {
428
- dispatch({
429
- type: "contentManagerApi/invalidateTags",
430
- payload: [
431
- {
432
- type: "Document",
433
- id: `${model}_${id}`
434
- }
435
- ]
436
- });
437
440
  toggleNotification({
438
441
  type: "success",
439
442
  message: formatMessage({
@@ -455,6 +458,7 @@ const StageSelect = () => {
455
458
  }
456
459
  };
457
460
  const { themeColorName } = getStageColorByHex(activeWorkflowStage?.color) ?? {};
461
+ const isLoading = isLoadingStages || isLoadingDocument;
458
462
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
459
463
  /* @__PURE__ */ jsxRuntime.jsxs(
460
464
  designSystem.Field.Root,
@@ -567,12 +571,16 @@ const StageSelect = () => {
567
571
  ] });
568
572
  };
569
573
  const Panel = () => {
570
- const { slug = "", id } = reactRouterDom.useParams();
574
+ const {
575
+ slug = "",
576
+ id,
577
+ collectionType
578
+ } = reactRouterDom.useParams();
571
579
  const {
572
580
  edit: { options }
573
581
  } = strapiAdmin$1.unstable_useDocumentLayout(slug);
574
582
  const { formatMessage } = reactIntl.useIntl();
575
- if (!window.strapi.isEE || !options?.reviewWorkflows || !id || id === "create") {
583
+ if (!window.strapi.isEE || !options?.reviewWorkflows || collectionType !== "single-types" && !id || id === "create") {
576
584
  return null;
577
585
  }
578
586
  return {
@@ -591,36 +599,25 @@ const settingsApi = reviewWorkflowsApi.injectEndpoints({
591
599
  endpoints: (builder) => ({
592
600
  getWorkflows: builder.query({
593
601
  query: (args) => {
594
- const { id, ...params } = args ?? {};
595
602
  return {
596
- url: `/review-workflows/workflows${id ? `/${id}` : ""}`,
603
+ url: "/review-workflows/workflows",
597
604
  method: "GET",
598
605
  config: {
599
- params
606
+ params: args ?? {}
600
607
  }
601
608
  };
602
609
  },
603
610
  transformResponse: (res) => {
604
- let workflows = [];
605
- if (Array.isArray(res.data)) {
606
- workflows = res.data;
607
- } else {
608
- workflows = [res.data];
609
- }
610
611
  return {
611
- workflows,
612
+ workflows: res.data,
612
613
  meta: "meta" in res ? res.meta : void 0
613
614
  };
614
615
  },
615
- providesTags: (res, _err, arg) => {
616
- if (typeof arg === "object" && "id" in arg && arg.id !== "") {
617
- return [{ type: "ReviewWorkflow", id: arg.id }];
618
- } else {
619
- return [
620
- ...res?.workflows.map(({ id }) => ({ type: "ReviewWorkflow", id })) ?? [],
621
- { type: "ReviewWorkflow", id: "LIST" }
622
- ];
623
- }
616
+ providesTags: (res) => {
617
+ return [
618
+ ...res?.workflows.map(({ id }) => ({ type: "ReviewWorkflow", id })) ?? [],
619
+ { type: "ReviewWorkflow", id: "LIST" }
620
+ ];
624
621
  }
625
622
  }),
626
623
  createWorkflow: builder.mutation({
@@ -630,7 +627,18 @@ const settingsApi = reviewWorkflowsApi.injectEndpoints({
630
627
  data
631
628
  }),
632
629
  transformResponse: (res) => res.data,
633
- invalidatesTags: [{ type: "ReviewWorkflow", id: "LIST" }, "ReviewWorkflowStages"]
630
+ invalidatesTags(res) {
631
+ return [
632
+ { type: "ReviewWorkflow", id: "LIST" },
633
+ "ReviewWorkflowStages",
634
+ { type: "Document", id: `ALL_LIST` },
635
+ { type: "ContentTypeSettings", id: "LIST" },
636
+ ...res?.contentTypes.map((uid) => ({
637
+ type: "Document",
638
+ id: `${uid}_ALL_ITEMS`
639
+ })) ?? []
640
+ ];
641
+ }
634
642
  }),
635
643
  updateWorkflow: builder.mutation({
636
644
  query: ({ id, ...data }) => ({
@@ -641,7 +649,13 @@ const settingsApi = reviewWorkflowsApi.injectEndpoints({
641
649
  transformResponse: (res) => res.data,
642
650
  invalidatesTags: (res, _err, arg) => [
643
651
  { type: "ReviewWorkflow", id: arg.id },
644
- "ReviewWorkflowStages"
652
+ "ReviewWorkflowStages",
653
+ { type: "Document", id: "ALL_LIST" },
654
+ { type: "ContentTypeSettings", id: "LIST" },
655
+ ...res?.contentTypes.map((uid) => ({
656
+ type: "Document",
657
+ id: `${uid}_ALL_ITEMS`
658
+ })) ?? []
645
659
  ]
646
660
  }),
647
661
  deleteWorkflow: builder.mutation({
@@ -652,7 +666,9 @@ const settingsApi = reviewWorkflowsApi.injectEndpoints({
652
666
  transformResponse: (res) => res.data,
653
667
  invalidatesTags: (res, _err, arg) => [
654
668
  { type: "ReviewWorkflow", id: arg.id },
655
- "ReviewWorkflowStages"
669
+ "ReviewWorkflowStages",
670
+ { type: "Document", id: `ALL_LIST` },
671
+ { type: "ContentTypeSettings", id: "LIST" }
656
672
  ]
657
673
  })
658
674
  }),
@@ -737,9 +753,6 @@ const addColumnToTableHook = ({ displayedHeaders, layout }) => {
737
753
  };
738
754
  };
739
755
  const prefixPluginTranslations = (trad, pluginId) => {
740
- if (!pluginId) {
741
- throw new TypeError("pluginId can't be empty");
742
- }
743
756
  return Object.keys(trad).reduce((acc, current) => {
744
757
  acc[`${pluginId}.${current}`] = trad[current];
745
758
  return acc;
@@ -762,7 +775,7 @@ const admin = {
762
775
  },
763
776
  permissions: [],
764
777
  async Component() {
765
- const { Router } = await Promise.resolve().then(() => require("./router-DSXpeew4.js"));
778
+ const { Router } = await Promise.resolve().then(() => require("./router-vDfGt9bq.js"));
766
779
  return { default: Router };
767
780
  }
768
781
  });
@@ -777,7 +790,7 @@ const admin = {
777
790
  licenseOnly: true,
778
791
  permissions: [],
779
792
  async Component() {
780
- const { PurchaseReviewWorkflows } = await Promise.resolve().then(() => require("./purchase-review-workflows-DlCDg0fD.js"));
793
+ const { PurchaseReviewWorkflows } = await Promise.resolve().then(() => require("./purchase-review-workflows-BxoDFxQ5.js"));
781
794
  return { default: PurchaseReviewWorkflows };
782
795
  }
783
796
  });
@@ -786,7 +799,7 @@ const admin = {
786
799
  async registerTrads({ locales }) {
787
800
  const importedTrads = await Promise.all(
788
801
  locales.map((locale) => {
789
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => Promise.resolve().then(() => require("./en-xcewH2pC.js")) }), `./translations/${locale}.json`).then(({ default: data }) => {
802
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => Promise.resolve().then(() => require("./en-CYgjfSep.js")) }), `./translations/${locale}.json`, 3).then(({ default: data }) => {
790
803
  return {
791
804
  data: prefixPluginTranslations(data, PLUGIN_ID),
792
805
  locale
@@ -816,4 +829,4 @@ exports.useGetContentTypesQuery = useGetContentTypesQuery;
816
829
  exports.useGetWorkflowsQuery = useGetWorkflowsQuery;
817
830
  exports.useTypedSelector = useTypedSelector;
818
831
  exports.useUpdateWorkflowMutation = useUpdateWorkflowMutation;
819
- //# sourceMappingURL=index-DhPxWpsW.js.map
832
+ //# sourceMappingURL=index-DMT27jNE.js.map