@strapi/review-workflows 0.0.0-next.3c5bc3f35387771b185349533729e99e6e59c525 → 0.0.0-next.3e198200d32a65f20bd375086da6b1501e469c51

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 (110) hide show
  1. package/dist/admin/chunks/Layout-C4ri_ldC.js +290 -0
  2. package/dist/admin/chunks/Layout-C4ri_ldC.js.map +1 -0
  3. package/dist/admin/chunks/Layout-CF497D6H.mjs +265 -0
  4. package/dist/admin/chunks/Layout-CF497D6H.mjs.map +1 -0
  5. package/dist/admin/chunks/en-BNGiWajd.js +20 -0
  6. package/dist/admin/chunks/en-BNGiWajd.js.map +1 -0
  7. package/dist/admin/chunks/en-BrZXFtVv.mjs +18 -0
  8. package/dist/admin/chunks/en-BrZXFtVv.mjs.map +1 -0
  9. package/dist/admin/chunks/id-DVOtqJqn.js +1442 -0
  10. package/dist/admin/chunks/id-DVOtqJqn.js.map +1 -0
  11. package/dist/admin/chunks/id-QD0V9dME.mjs +1420 -0
  12. package/dist/admin/chunks/id-QD0V9dME.mjs.map +1 -0
  13. package/dist/admin/chunks/index-CCx4kT-t.js +293 -0
  14. package/dist/admin/chunks/index-CCx4kT-t.js.map +1 -0
  15. package/dist/admin/chunks/index-CzdEqFOm.js +1115 -0
  16. package/dist/admin/chunks/index-CzdEqFOm.js.map +1 -0
  17. package/dist/admin/chunks/index-DcEF47R4.mjs +1081 -0
  18. package/dist/admin/chunks/index-DcEF47R4.mjs.map +1 -0
  19. package/dist/admin/chunks/index-iChY7MsG.mjs +271 -0
  20. package/dist/admin/chunks/index-iChY7MsG.mjs.map +1 -0
  21. package/dist/admin/chunks/purchase-review-workflows-4n0KXAeo.mjs +200 -0
  22. package/dist/admin/chunks/purchase-review-workflows-4n0KXAeo.mjs.map +1 -0
  23. package/dist/admin/chunks/purchase-review-workflows-BDLncDcz.js +202 -0
  24. package/dist/admin/chunks/purchase-review-workflows-BDLncDcz.js.map +1 -0
  25. package/dist/admin/chunks/router-ChVwf8TN.js +30 -0
  26. package/dist/admin/chunks/router-ChVwf8TN.js.map +1 -0
  27. package/dist/admin/chunks/router-D-YCUzYy.mjs +28 -0
  28. package/dist/admin/chunks/router-D-YCUzYy.mjs.map +1 -0
  29. package/dist/admin/chunks/uk-CbRUr1I7.js +16 -0
  30. package/dist/admin/chunks/uk-CbRUr1I7.js.map +1 -0
  31. package/dist/admin/chunks/uk-DLlzEBUF.mjs +14 -0
  32. package/dist/admin/chunks/uk-DLlzEBUF.mjs.map +1 -0
  33. package/dist/admin/index.js +17 -2
  34. package/dist/admin/index.js.map +1 -1
  35. package/dist/admin/index.mjs +12 -4
  36. package/dist/admin/index.mjs.map +1 -1
  37. package/dist/admin/src/routes/content-manager/model/id/components/AssigneeSelect.d.ts +4 -0
  38. package/dist/admin/src/routes/content-manager/model/id/components/Header.d.ts +5 -0
  39. package/dist/admin/src/routes/content-manager/model/id/components/StageSelect.d.ts +3 -0
  40. package/dist/admin/src/services/settings.d.ts +7 -3
  41. package/dist/server/index.js +2112 -7994
  42. package/dist/server/index.js.map +1 -1
  43. package/dist/server/index.mjs +2118 -8003
  44. package/dist/server/index.mjs.map +1 -1
  45. package/dist/server/src/bootstrap.d.ts.map +1 -1
  46. package/dist/server/src/constants/workflows.d.ts +1 -0
  47. package/dist/server/src/constants/workflows.d.ts.map +1 -1
  48. package/dist/server/src/content-types/index.d.ts +6 -0
  49. package/dist/server/src/content-types/index.d.ts.map +1 -1
  50. package/dist/server/src/content-types/workflow/index.d.ts +6 -0
  51. package/dist/server/src/content-types/workflow/index.d.ts.map +1 -1
  52. package/dist/server/src/controllers/assignees.d.ts.map +1 -1
  53. package/dist/server/src/controllers/stages.d.ts.map +1 -1
  54. package/dist/server/src/index.d.ts +28 -6
  55. package/dist/server/src/index.d.ts.map +1 -1
  56. package/dist/server/src/register.d.ts.map +1 -1
  57. package/dist/server/src/services/assignees.d.ts +8 -4
  58. package/dist/server/src/services/assignees.d.ts.map +1 -1
  59. package/dist/server/src/services/document-service-middleware.d.ts +2 -1
  60. package/dist/server/src/services/document-service-middleware.d.ts.map +1 -1
  61. package/dist/server/src/services/index.d.ts +16 -6
  62. package/dist/server/src/services/index.d.ts.map +1 -1
  63. package/dist/server/src/services/metrics/index.d.ts +4 -4
  64. package/dist/server/src/services/metrics/index.d.ts.map +1 -1
  65. package/dist/server/src/services/stages.d.ts +6 -1
  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 +8 -4
  71. package/dist/shared/contracts/review-workflows.d.ts.map +1 -1
  72. package/package.json +17 -16
  73. package/dist/_chunks/Layout-CJZ4iUxI.mjs +0 -233
  74. package/dist/_chunks/Layout-CJZ4iUxI.mjs.map +0 -1
  75. package/dist/_chunks/Layout-D7wwT4c7.js +0 -251
  76. package/dist/_chunks/Layout-D7wwT4c7.js.map +0 -1
  77. package/dist/_chunks/_id-DA44l-QM.mjs +0 -1217
  78. package/dist/_chunks/_id-DA44l-QM.mjs.map +0 -1
  79. package/dist/_chunks/_id-DgUOk637.js +0 -1237
  80. package/dist/_chunks/_id-DgUOk637.js.map +0 -1
  81. package/dist/_chunks/en-D9ZrQAV6.mjs +0 -12
  82. package/dist/_chunks/en-D9ZrQAV6.mjs.map +0 -1
  83. package/dist/_chunks/en-xcewH2pC.js +0 -12
  84. package/dist/_chunks/en-xcewH2pC.js.map +0 -1
  85. package/dist/_chunks/index-C33Q2-Fc.mjs +0 -815
  86. package/dist/_chunks/index-C33Q2-Fc.mjs.map +0 -1
  87. package/dist/_chunks/index-CnyO97Gi.mjs +0 -214
  88. package/dist/_chunks/index-CnyO97Gi.mjs.map +0 -1
  89. package/dist/_chunks/index-DL9odlOl.js +0 -233
  90. package/dist/_chunks/index-DL9odlOl.js.map +0 -1
  91. package/dist/_chunks/index-mQar1hfK.js +0 -833
  92. package/dist/_chunks/index-mQar1hfK.js.map +0 -1
  93. package/dist/_chunks/purchase-review-workflows-BN-5Ube7.mjs +0 -52
  94. package/dist/_chunks/purchase-review-workflows-BN-5Ube7.mjs.map +0 -1
  95. package/dist/_chunks/purchase-review-workflows-DlCDg0fD.js +0 -52
  96. package/dist/_chunks/purchase-review-workflows-DlCDg0fD.js.map +0 -1
  97. package/dist/_chunks/router-B1YtLp6u.js +0 -24
  98. package/dist/_chunks/router-B1YtLp6u.js.map +0 -1
  99. package/dist/_chunks/router-BFv8U71z.mjs +0 -24
  100. package/dist/_chunks/router-BFv8U71z.mjs.map +0 -1
  101. package/dist/admin/src/routes/content-manager/[model]/[id]/components/AssigneeSelect.d.ts +0 -2
  102. package/dist/admin/src/routes/content-manager/[model]/[id]/components/StageSelect.d.ts +0 -1
  103. /package/dist/admin/src/routes/content-manager/{[model] → model}/components/AssigneeFilter.d.ts +0 -0
  104. /package/dist/admin/src/routes/content-manager/{[model] → model}/components/StageFilter.d.ts +0 -0
  105. /package/dist/admin/src/routes/content-manager/{[model] → model}/components/TableColumns.d.ts +0 -0
  106. /package/dist/admin/src/routes/content-manager/{[model] → model}/configure/constants.d.ts +0 -0
  107. /package/dist/admin/src/routes/content-manager/{[model] → model}/constants.d.ts +0 -0
  108. /package/dist/admin/src/routes/content-manager/{[model]/[id] → model/id}/components/Panel.d.ts +0 -0
  109. /package/dist/admin/src/routes/content-manager/{[model]/[id] → model/id}/components/constants.d.ts +0 -0
  110. /package/dist/admin/src/routes/settings/{:id.d.ts → id.d.ts} +0 -0
@@ -1,214 +0,0 @@
1
- import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
- import * as React from "react";
3
- import { useTracking, useRBAC, Page, Table, ConfirmDialog } from "@strapi/admin/strapi-admin";
4
- import { useLicenseLimits } from "@strapi/admin/strapi-admin/ee";
5
- import { LinkButton, TFooter, Typography, Flex, IconButton, Dialog } from "@strapi/design-system";
6
- import { Plus, Pencil, Trash } from "@strapi/icons";
7
- import { useIntl } from "react-intl";
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-C33Q2-Fc.mjs";
10
- import { u as useReviewWorkflows, H as Header, R as Root } from "./Layout-CJZ4iUxI.mjs";
11
- const ReviewWorkflowsListView = () => {
12
- const { formatMessage } = useIntl();
13
- const navigate = useNavigate();
14
- const { trackUsage } = useTracking();
15
- const [workflowToDelete, setWorkflowToDelete] = React.useState(null);
16
- const [showLimitModal, setShowLimitModal] = React.useState(false);
17
- const { data, isLoading: isLoadingModels } = useGetContentTypesQuery();
18
- const { meta, workflows, isLoading, delete: deleteAction } = useReviewWorkflows();
19
- const { getFeature, isLoading: isLicenseLoading } = useLicenseLimits();
20
- const permissions = useTypedSelector(
21
- (state) => state.admin_app.permissions.settings?.["review-workflows"]
22
- );
23
- const {
24
- allowedActions: { canCreate, canRead, canUpdate, canDelete }
25
- } = useRBAC(permissions);
26
- const limits = getFeature("review-workflows");
27
- const numberOfWorkflows = limits?.[CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME];
28
- const handleDeleteWorkflow = (workflowId) => {
29
- setWorkflowToDelete(workflowId);
30
- };
31
- const toggleConfirmDeleteDialog = () => {
32
- setWorkflowToDelete(null);
33
- };
34
- const handleConfirmDeleteDialog = async () => {
35
- if (!workflowToDelete)
36
- return;
37
- await deleteAction(workflowToDelete);
38
- setWorkflowToDelete(null);
39
- };
40
- const handleCreateClick = (event) => {
41
- event.preventDefault();
42
- if (numberOfWorkflows && meta && meta?.workflowCount >= parseInt(numberOfWorkflows, 10)) {
43
- event.preventDefault();
44
- setShowLimitModal(true);
45
- } else {
46
- navigate("create");
47
- trackUsage("willCreateWorkflow");
48
- }
49
- };
50
- React.useEffect(() => {
51
- if (!isLoading && !isLicenseLoading) {
52
- if (numberOfWorkflows && meta && meta?.workflowCount > parseInt(numberOfWorkflows, 10)) {
53
- setShowLimitModal(true);
54
- }
55
- }
56
- }, [isLicenseLoading, isLoading, meta, meta?.workflowCount, numberOfWorkflows]);
57
- const headers = [
58
- {
59
- label: formatMessage({
60
- id: "Settings.review-workflows.list.page.list.column.name.title",
61
- defaultMessage: "Name"
62
- }),
63
- name: "name"
64
- },
65
- {
66
- label: formatMessage({
67
- id: "Settings.review-workflows.list.page.list.column.stages.title",
68
- defaultMessage: "Stages"
69
- }),
70
- name: "stages"
71
- },
72
- {
73
- label: formatMessage({
74
- id: "Settings.review-workflows.list.page.list.column.contentTypes.title",
75
- defaultMessage: "Content Types"
76
- }),
77
- name: "content-types"
78
- }
79
- ];
80
- if (isLoading || isLoadingModels) {
81
- return /* @__PURE__ */ jsx(Page.Loading, {});
82
- }
83
- const contentTypes = Object.values(data ?? {}).reduce((acc, curr) => {
84
- acc.push(...curr);
85
- return acc;
86
- }, []);
87
- return /* @__PURE__ */ jsxs(Fragment, { children: [
88
- /* @__PURE__ */ jsx(
89
- Header,
90
- {
91
- primaryAction: canCreate ? /* @__PURE__ */ jsx(
92
- LinkButton,
93
- {
94
- startIcon: /* @__PURE__ */ jsx(Plus, {}),
95
- size: "S",
96
- tag: NavLink,
97
- to: "create",
98
- onClick: handleCreateClick,
99
- children: formatMessage({
100
- id: "Settings.review-workflows.list.page.create",
101
- defaultMessage: "Create new workflow"
102
- })
103
- }
104
- ) : null,
105
- subtitle: formatMessage({
106
- id: "Settings.review-workflows.list.page.subtitle",
107
- defaultMessage: "Manage your content review process"
108
- }),
109
- title: formatMessage({
110
- id: "Settings.review-workflows.list.page.title",
111
- defaultMessage: "Review Workflows"
112
- })
113
- }
114
- ),
115
- /* @__PURE__ */ jsxs(Root, { children: [
116
- /* @__PURE__ */ jsx(
117
- Table.Root,
118
- {
119
- isLoading,
120
- rows: workflows,
121
- footer: canCreate ? /* @__PURE__ */ jsx(TFooter, { icon: /* @__PURE__ */ jsx(Plus, {}), onClick: handleCreateClick, children: formatMessage({
122
- id: "Settings.review-workflows.list.page.create",
123
- defaultMessage: "Create new workflow"
124
- }) }) : null,
125
- headers,
126
- children: /* @__PURE__ */ jsxs(Table.Content, { children: [
127
- /* @__PURE__ */ jsx(Table.Head, { children: headers.map((head) => /* @__PURE__ */ jsx(Table.HeaderCell, { ...head }, head.name)) }),
128
- /* @__PURE__ */ jsx(Table.Body, { children: workflows.map((workflow) => /* @__PURE__ */ jsxs(
129
- Table.Row,
130
- {
131
- onClick: () => {
132
- navigate(`${workflow.id}`);
133
- },
134
- children: [
135
- /* @__PURE__ */ jsx(Table.Cell, { width: "25rem", children: /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", fontWeight: "bold", ellipsis: true, children: workflow.name }) }),
136
- /* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", children: workflow.stages.length }) }),
137
- /* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", children: workflow.contentTypes.map((uid) => {
138
- const contentType = contentTypes.find(
139
- (contentType2) => contentType2.uid === uid
140
- );
141
- return contentType?.info.displayName ?? "";
142
- }).join(", ") }) }),
143
- /* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", justifyContent: "end", children: [
144
- canRead || canUpdate ? /* @__PURE__ */ jsx(
145
- IconButton,
146
- {
147
- tag: Link,
148
- to: workflow.id.toString(),
149
- label: formatMessage(
150
- {
151
- id: "Settings.review-workflows.list.page.list.column.actions.edit.label",
152
- defaultMessage: "Edit {name}"
153
- },
154
- { name: workflow.name }
155
- ),
156
- variant: "ghost",
157
- children: /* @__PURE__ */ jsx(Pencil, {})
158
- }
159
- ) : null,
160
- workflows.length > 1 && canDelete ? /* @__PURE__ */ jsx(
161
- IconButton,
162
- {
163
- withTooltip: false,
164
- label: formatMessage(
165
- {
166
- id: "Settings.review-workflows.list.page.list.column.actions.delete.label",
167
- defaultMessage: "Delete {name}"
168
- },
169
- { name: "Default workflow" }
170
- ),
171
- variant: "ghost",
172
- onClick: (e) => {
173
- e.stopPropagation();
174
- handleDeleteWorkflow(String(workflow.id));
175
- },
176
- children: /* @__PURE__ */ jsx(Trash, {})
177
- }
178
- ) : null
179
- ] }) })
180
- ]
181
- },
182
- workflow.id
183
- )) })
184
- ] })
185
- }
186
- ),
187
- /* @__PURE__ */ jsx(Dialog.Root, { open: !!workflowToDelete, onOpenChange: toggleConfirmDeleteDialog, children: /* @__PURE__ */ jsx(ConfirmDialog, { onConfirm: handleConfirmDeleteDialog, children: formatMessage({
188
- id: "Settings.review-workflows.list.page.delete.confirm.body",
189
- defaultMessage: "If you remove this worfklow, all stage-related information will be removed for this content-type. Are you sure you want to remove it?"
190
- }) }) }),
191
- /* @__PURE__ */ jsxs(LimitsModal.Root, { open: showLimitModal, onOpenChange: () => setShowLimitModal(false), children: [
192
- /* @__PURE__ */ jsx(LimitsModal.Title, { children: formatMessage({
193
- id: "Settings.review-workflows.list.page.workflows.limit.title",
194
- defaultMessage: "You’ve reached the limit of workflows in your plan"
195
- }) }),
196
- /* @__PURE__ */ jsx(LimitsModal.Body, { children: formatMessage({
197
- id: "Settings.review-workflows.list.page.workflows.limit.body",
198
- defaultMessage: "Delete a workflow or contact Sales to enable more workflows."
199
- }) })
200
- ] })
201
- ] })
202
- ] });
203
- };
204
- const ProtectedListPage = () => {
205
- const permissions = useTypedSelector(
206
- (state) => state.admin_app.permissions.settings?.["review-workflows"]?.main
207
- );
208
- return /* @__PURE__ */ jsx(Page.Protect, { permissions, children: /* @__PURE__ */ jsx(ReviewWorkflowsListView, {}) });
209
- };
210
- export {
211
- ProtectedListPage,
212
- ReviewWorkflowsListView
213
- };
214
- //# sourceMappingURL=index-CnyO97Gi.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-CnyO97Gi.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 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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"}
@@ -1,233 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const jsxRuntime = require("react/jsx-runtime");
4
- const React = require("react");
5
- const strapiAdmin = require("@strapi/admin/strapi-admin");
6
- const ee = require("@strapi/admin/strapi-admin/ee");
7
- const designSystem = require("@strapi/design-system");
8
- const icons = require("@strapi/icons");
9
- const reactIntl = require("react-intl");
10
- const reactRouterDom = require("react-router-dom");
11
- const index = require("./index-mQar1hfK.js");
12
- const Layout = require("./Layout-D7wwT4c7.js");
13
- function _interopNamespace(e) {
14
- if (e && e.__esModule)
15
- return e;
16
- const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
17
- if (e) {
18
- for (const k in e) {
19
- if (k !== "default") {
20
- const d = Object.getOwnPropertyDescriptor(e, k);
21
- Object.defineProperty(n, k, d.get ? d : {
22
- enumerable: true,
23
- get: () => e[k]
24
- });
25
- }
26
- }
27
- }
28
- n.default = e;
29
- return Object.freeze(n);
30
- }
31
- const React__namespace = /* @__PURE__ */ _interopNamespace(React);
32
- const ReviewWorkflowsListView = () => {
33
- const { formatMessage } = reactIntl.useIntl();
34
- const navigate = reactRouterDom.useNavigate();
35
- const { trackUsage } = strapiAdmin.useTracking();
36
- const [workflowToDelete, setWorkflowToDelete] = React__namespace.useState(null);
37
- const [showLimitModal, setShowLimitModal] = React__namespace.useState(false);
38
- const { data, isLoading: isLoadingModels } = index.useGetContentTypesQuery();
39
- const { meta, workflows, isLoading, delete: deleteAction } = Layout.useReviewWorkflows();
40
- const { getFeature, isLoading: isLicenseLoading } = ee.useLicenseLimits();
41
- const permissions = index.useTypedSelector(
42
- (state) => state.admin_app.permissions.settings?.["review-workflows"]
43
- );
44
- const {
45
- allowedActions: { canCreate, canRead, canUpdate, canDelete }
46
- } = strapiAdmin.useRBAC(permissions);
47
- const limits = getFeature("review-workflows");
48
- const numberOfWorkflows = limits?.[index.CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME];
49
- const handleDeleteWorkflow = (workflowId) => {
50
- setWorkflowToDelete(workflowId);
51
- };
52
- const toggleConfirmDeleteDialog = () => {
53
- setWorkflowToDelete(null);
54
- };
55
- const handleConfirmDeleteDialog = async () => {
56
- if (!workflowToDelete)
57
- return;
58
- await deleteAction(workflowToDelete);
59
- setWorkflowToDelete(null);
60
- };
61
- const handleCreateClick = (event) => {
62
- event.preventDefault();
63
- if (numberOfWorkflows && meta && meta?.workflowCount >= parseInt(numberOfWorkflows, 10)) {
64
- event.preventDefault();
65
- setShowLimitModal(true);
66
- } else {
67
- navigate("create");
68
- trackUsage("willCreateWorkflow");
69
- }
70
- };
71
- React__namespace.useEffect(() => {
72
- if (!isLoading && !isLicenseLoading) {
73
- if (numberOfWorkflows && meta && meta?.workflowCount > parseInt(numberOfWorkflows, 10)) {
74
- setShowLimitModal(true);
75
- }
76
- }
77
- }, [isLicenseLoading, isLoading, meta, meta?.workflowCount, numberOfWorkflows]);
78
- const headers = [
79
- {
80
- label: formatMessage({
81
- id: "Settings.review-workflows.list.page.list.column.name.title",
82
- defaultMessage: "Name"
83
- }),
84
- name: "name"
85
- },
86
- {
87
- label: formatMessage({
88
- id: "Settings.review-workflows.list.page.list.column.stages.title",
89
- defaultMessage: "Stages"
90
- }),
91
- name: "stages"
92
- },
93
- {
94
- label: formatMessage({
95
- id: "Settings.review-workflows.list.page.list.column.contentTypes.title",
96
- defaultMessage: "Content Types"
97
- }),
98
- name: "content-types"
99
- }
100
- ];
101
- if (isLoading || isLoadingModels) {
102
- return /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Loading, {});
103
- }
104
- const contentTypes = Object.values(data ?? {}).reduce((acc, curr) => {
105
- acc.push(...curr);
106
- return acc;
107
- }, []);
108
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
109
- /* @__PURE__ */ jsxRuntime.jsx(
110
- Layout.Header,
111
- {
112
- primaryAction: canCreate ? /* @__PURE__ */ jsxRuntime.jsx(
113
- designSystem.LinkButton,
114
- {
115
- startIcon: /* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}),
116
- size: "S",
117
- tag: reactRouterDom.NavLink,
118
- to: "create",
119
- onClick: handleCreateClick,
120
- children: formatMessage({
121
- id: "Settings.review-workflows.list.page.create",
122
- defaultMessage: "Create new workflow"
123
- })
124
- }
125
- ) : null,
126
- subtitle: formatMessage({
127
- id: "Settings.review-workflows.list.page.subtitle",
128
- defaultMessage: "Manage your content review process"
129
- }),
130
- title: formatMessage({
131
- id: "Settings.review-workflows.list.page.title",
132
- defaultMessage: "Review Workflows"
133
- })
134
- }
135
- ),
136
- /* @__PURE__ */ jsxRuntime.jsxs(Layout.Root, { children: [
137
- /* @__PURE__ */ jsxRuntime.jsx(
138
- strapiAdmin.Table.Root,
139
- {
140
- isLoading,
141
- rows: workflows,
142
- footer: canCreate ? /* @__PURE__ */ jsxRuntime.jsx(designSystem.TFooter, { icon: /* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}), onClick: handleCreateClick, children: formatMessage({
143
- id: "Settings.review-workflows.list.page.create",
144
- defaultMessage: "Create new workflow"
145
- }) }) : null,
146
- headers,
147
- children: /* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Table.Content, { children: [
148
- /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Head, { children: headers.map((head) => /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.HeaderCell, { ...head }, head.name)) }),
149
- /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Body, { children: workflows.map((workflow) => /* @__PURE__ */ jsxRuntime.jsxs(
150
- strapiAdmin.Table.Row,
151
- {
152
- onClick: () => {
153
- navigate(`${workflow.id}`);
154
- },
155
- children: [
156
- /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { width: "25rem", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", fontWeight: "bold", ellipsis: true, children: workflow.name }) }),
157
- /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", children: workflow.stages.length }) }),
158
- /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", children: workflow.contentTypes.map((uid) => {
159
- const contentType = contentTypes.find(
160
- (contentType2) => contentType2.uid === uid
161
- );
162
- return contentType?.info.displayName ?? "";
163
- }).join(", ") }) }),
164
- /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { alignItems: "center", justifyContent: "end", children: [
165
- canRead || canUpdate ? /* @__PURE__ */ jsxRuntime.jsx(
166
- designSystem.IconButton,
167
- {
168
- tag: reactRouterDom.Link,
169
- to: workflow.id.toString(),
170
- label: formatMessage(
171
- {
172
- id: "Settings.review-workflows.list.page.list.column.actions.edit.label",
173
- defaultMessage: "Edit {name}"
174
- },
175
- { name: workflow.name }
176
- ),
177
- variant: "ghost",
178
- children: /* @__PURE__ */ jsxRuntime.jsx(icons.Pencil, {})
179
- }
180
- ) : null,
181
- workflows.length > 1 && canDelete ? /* @__PURE__ */ jsxRuntime.jsx(
182
- designSystem.IconButton,
183
- {
184
- withTooltip: false,
185
- label: formatMessage(
186
- {
187
- id: "Settings.review-workflows.list.page.list.column.actions.delete.label",
188
- defaultMessage: "Delete {name}"
189
- },
190
- { name: "Default workflow" }
191
- ),
192
- variant: "ghost",
193
- onClick: (e) => {
194
- e.stopPropagation();
195
- handleDeleteWorkflow(String(workflow.id));
196
- },
197
- children: /* @__PURE__ */ jsxRuntime.jsx(icons.Trash, {})
198
- }
199
- ) : null
200
- ] }) })
201
- ]
202
- },
203
- workflow.id
204
- )) })
205
- ] })
206
- }
207
- ),
208
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Root, { open: !!workflowToDelete, onOpenChange: toggleConfirmDeleteDialog, children: /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.ConfirmDialog, { onConfirm: handleConfirmDeleteDialog, children: formatMessage({
209
- id: "Settings.review-workflows.list.page.delete.confirm.body",
210
- defaultMessage: "If you remove this worfklow, all stage-related information will be removed for this content-type. Are you sure you want to remove it?"
211
- }) }) }),
212
- /* @__PURE__ */ jsxRuntime.jsxs(index.LimitsModal.Root, { open: showLimitModal, onOpenChange: () => setShowLimitModal(false), children: [
213
- /* @__PURE__ */ jsxRuntime.jsx(index.LimitsModal.Title, { children: formatMessage({
214
- id: "Settings.review-workflows.list.page.workflows.limit.title",
215
- defaultMessage: "You’ve reached the limit of workflows in your plan"
216
- }) }),
217
- /* @__PURE__ */ jsxRuntime.jsx(index.LimitsModal.Body, { children: formatMessage({
218
- id: "Settings.review-workflows.list.page.workflows.limit.body",
219
- defaultMessage: "Delete a workflow or contact Sales to enable more workflows."
220
- }) })
221
- ] })
222
- ] })
223
- ] });
224
- };
225
- const ProtectedListPage = () => {
226
- const permissions = index.useTypedSelector(
227
- (state) => state.admin_app.permissions.settings?.["review-workflows"]?.main
228
- );
229
- return /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Protect, { permissions, children: /* @__PURE__ */ jsxRuntime.jsx(ReviewWorkflowsListView, {}) });
230
- };
231
- exports.ProtectedListPage = ProtectedListPage;
232
- exports.ReviewWorkflowsListView = ReviewWorkflowsListView;
233
- //# sourceMappingURL=index-DL9odlOl.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-DL9odlOl.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 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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"}