@strapi/review-workflows 5.9.0 → 5.10.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.
- package/dist/admin/chunks/Layout-27uslS7w.mjs +265 -0
- package/dist/admin/chunks/Layout-27uslS7w.mjs.map +1 -0
- package/dist/admin/chunks/Layout-B4l91S3p.js +290 -0
- package/dist/admin/chunks/Layout-B4l91S3p.js.map +1 -0
- package/dist/admin/chunks/en-BixG7IBu.mjs +14 -0
- package/dist/admin/chunks/en-BixG7IBu.mjs.map +1 -0
- package/dist/admin/chunks/en-C6SESe-Y.js +16 -0
- package/dist/admin/chunks/en-C6SESe-Y.js.map +1 -0
- package/dist/admin/chunks/id-DnRGfGvc.js +1442 -0
- package/dist/admin/chunks/id-DnRGfGvc.js.map +1 -0
- package/dist/admin/chunks/id-LAMc9ydb.mjs +1420 -0
- package/dist/admin/chunks/id-LAMc9ydb.mjs.map +1 -0
- package/dist/admin/chunks/index-BiGArvbK.mjs +271 -0
- package/dist/admin/chunks/index-BiGArvbK.mjs.map +1 -0
- package/dist/admin/chunks/index-C5IeISWp.js +960 -0
- package/dist/admin/chunks/index-C5IeISWp.js.map +1 -0
- package/dist/admin/chunks/index-CSYOmjZt.mjs +926 -0
- package/dist/admin/chunks/index-CSYOmjZt.mjs.map +1 -0
- package/dist/admin/chunks/index-DZpcSUvc.js +293 -0
- package/dist/admin/chunks/index-DZpcSUvc.js.map +1 -0
- package/dist/admin/chunks/purchase-review-workflows-CEP8kvxZ.mjs +53 -0
- package/dist/admin/chunks/purchase-review-workflows-CEP8kvxZ.mjs.map +1 -0
- package/dist/admin/chunks/purchase-review-workflows-Drlxm8yP.js +55 -0
- package/dist/admin/chunks/purchase-review-workflows-Drlxm8yP.js.map +1 -0
- package/dist/admin/chunks/router-CrN8UbpP.js +30 -0
- package/dist/admin/chunks/router-CrN8UbpP.js.map +1 -0
- package/dist/admin/chunks/router-Z3AR7XZ7.mjs +28 -0
- package/dist/admin/chunks/router-Z3AR7XZ7.mjs.map +1 -0
- package/dist/admin/index.js +17 -2
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +12 -4
- package/dist/admin/index.mjs.map +1 -1
- package/dist/server/index.js +2109 -7839
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +2114 -7847
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/src/services/document-service-middleware.d.ts +1 -1
- package/dist/server/src/services/document-service-middleware.d.ts.map +1 -1
- package/dist/shared/contracts/review-workflows.d.ts +0 -1
- package/package.json +14 -10
- package/dist/_chunks/Layout-C3IORH2n.js +0 -250
- package/dist/_chunks/Layout-C3IORH2n.js.map +0 -1
- package/dist/_chunks/Layout-DNKR5bym.mjs +0 -233
- package/dist/_chunks/Layout-DNKR5bym.mjs.map +0 -1
- package/dist/_chunks/en-CYgjfSep.js +0 -15
- package/dist/_chunks/en-CYgjfSep.js.map +0 -1
- package/dist/_chunks/en-D9dxziEb.mjs +0 -15
- package/dist/_chunks/en-D9dxziEb.mjs.map +0 -1
- package/dist/_chunks/id-C9Ku9Br9.mjs +0 -1274
- package/dist/_chunks/id-C9Ku9Br9.mjs.map +0 -1
- package/dist/_chunks/id-oOE1bYls.js +0 -1293
- package/dist/_chunks/id-oOE1bYls.js.map +0 -1
- package/dist/_chunks/index-ByXbOW-R.mjs +0 -815
- package/dist/_chunks/index-ByXbOW-R.mjs.map +0 -1
- package/dist/_chunks/index-CmHHjN95.js +0 -231
- package/dist/_chunks/index-CmHHjN95.js.map +0 -1
- package/dist/_chunks/index-CyhaJuJG.mjs +0 -213
- package/dist/_chunks/index-CyhaJuJG.mjs.map +0 -1
- package/dist/_chunks/index-DMT27jNE.js +0 -832
- package/dist/_chunks/index-DMT27jNE.js.map +0 -1
- package/dist/_chunks/purchase-review-workflows-BxoDFxQ5.js +0 -52
- package/dist/_chunks/purchase-review-workflows-BxoDFxQ5.js.map +0 -1
- package/dist/_chunks/purchase-review-workflows-DyFV_H0I.mjs +0 -52
- package/dist/_chunks/purchase-review-workflows-DyFV_H0I.mjs.map +0 -1
- package/dist/_chunks/router-BPl2HZMq.mjs +0 -24
- package/dist/_chunks/router-BPl2HZMq.mjs.map +0 -1
- package/dist/_chunks/router-vDfGt9bq.js +0 -24
- package/dist/_chunks/router-vDfGt9bq.js.map +0 -1
- /package/dist/admin/src/routes/content-manager/{[model] → model}/components/AssigneeFilter.d.ts +0 -0
- /package/dist/admin/src/routes/content-manager/{[model] → model}/components/StageFilter.d.ts +0 -0
- /package/dist/admin/src/routes/content-manager/{[model] → model}/components/TableColumns.d.ts +0 -0
- /package/dist/admin/src/routes/content-manager/{[model] → model}/configure/constants.d.ts +0 -0
- /package/dist/admin/src/routes/content-manager/{[model] → model}/constants.d.ts +0 -0
- /package/dist/admin/src/routes/content-manager/{[model]/[id] → model/id}/components/AssigneeSelect.d.ts +0 -0
- /package/dist/admin/src/routes/content-manager/{[model]/[id] → model/id}/components/Panel.d.ts +0 -0
- /package/dist/admin/src/routes/content-manager/{[model]/[id] → model/id}/components/StageSelect.d.ts +0 -0
- /package/dist/admin/src/routes/content-manager/{[model]/[id] → model/id}/components/constants.d.ts +0 -0
@@ -1,231 +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-DMT27jNE.js");
|
12
|
-
const Layout = require("./Layout-C3IORH2n.js");
|
13
|
-
function _interopNamespace(e) {
|
14
|
-
if (e && e.__esModule) return e;
|
15
|
-
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
16
|
-
if (e) {
|
17
|
-
for (const k in e) {
|
18
|
-
if (k !== "default") {
|
19
|
-
const d = Object.getOwnPropertyDescriptor(e, k);
|
20
|
-
Object.defineProperty(n, k, d.get ? d : {
|
21
|
-
enumerable: true,
|
22
|
-
get: () => e[k]
|
23
|
-
});
|
24
|
-
}
|
25
|
-
}
|
26
|
-
}
|
27
|
-
n.default = e;
|
28
|
-
return Object.freeze(n);
|
29
|
-
}
|
30
|
-
const React__namespace = /* @__PURE__ */ _interopNamespace(React);
|
31
|
-
const ReviewWorkflowsListView = () => {
|
32
|
-
const { formatMessage } = reactIntl.useIntl();
|
33
|
-
const navigate = reactRouterDom.useNavigate();
|
34
|
-
const { trackUsage } = strapiAdmin.useTracking();
|
35
|
-
const [workflowToDelete, setWorkflowToDelete] = React__namespace.useState(null);
|
36
|
-
const [showLimitModal, setShowLimitModal] = React__namespace.useState(false);
|
37
|
-
const { data, isLoading: isLoadingModels } = index.useGetContentTypesQuery();
|
38
|
-
const { meta, workflows, isLoading, delete: deleteAction } = Layout.useReviewWorkflows();
|
39
|
-
const { getFeature, isLoading: isLicenseLoading } = ee.useLicenseLimits();
|
40
|
-
const permissions = index.useTypedSelector(
|
41
|
-
(state) => state.admin_app.permissions.settings?.["review-workflows"]
|
42
|
-
);
|
43
|
-
const {
|
44
|
-
allowedActions: { canCreate, canRead, canUpdate, canDelete }
|
45
|
-
} = strapiAdmin.useRBAC(permissions);
|
46
|
-
const limits = getFeature("review-workflows");
|
47
|
-
const numberOfWorkflows = limits?.[index.CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME];
|
48
|
-
const handleDeleteWorkflow = (workflowId) => {
|
49
|
-
setWorkflowToDelete(workflowId);
|
50
|
-
};
|
51
|
-
const toggleConfirmDeleteDialog = () => {
|
52
|
-
setWorkflowToDelete(null);
|
53
|
-
};
|
54
|
-
const handleConfirmDeleteDialog = async () => {
|
55
|
-
if (!workflowToDelete) return;
|
56
|
-
await deleteAction(workflowToDelete);
|
57
|
-
setWorkflowToDelete(null);
|
58
|
-
};
|
59
|
-
const handleCreateClick = (event) => {
|
60
|
-
event.preventDefault();
|
61
|
-
if (numberOfWorkflows && meta && meta?.workflowCount >= parseInt(numberOfWorkflows, 10)) {
|
62
|
-
event.preventDefault();
|
63
|
-
setShowLimitModal(true);
|
64
|
-
} else {
|
65
|
-
navigate("create");
|
66
|
-
trackUsage("willCreateWorkflow");
|
67
|
-
}
|
68
|
-
};
|
69
|
-
React__namespace.useEffect(() => {
|
70
|
-
if (!isLoading && !isLicenseLoading) {
|
71
|
-
if (numberOfWorkflows && meta && meta?.workflowCount > parseInt(numberOfWorkflows, 10)) {
|
72
|
-
setShowLimitModal(true);
|
73
|
-
}
|
74
|
-
}
|
75
|
-
}, [isLicenseLoading, isLoading, meta, meta?.workflowCount, numberOfWorkflows]);
|
76
|
-
const headers = [
|
77
|
-
{
|
78
|
-
label: formatMessage({
|
79
|
-
id: "Settings.review-workflows.list.page.list.column.name.title",
|
80
|
-
defaultMessage: "Name"
|
81
|
-
}),
|
82
|
-
name: "name"
|
83
|
-
},
|
84
|
-
{
|
85
|
-
label: formatMessage({
|
86
|
-
id: "Settings.review-workflows.list.page.list.column.stages.title",
|
87
|
-
defaultMessage: "Stages"
|
88
|
-
}),
|
89
|
-
name: "stages"
|
90
|
-
},
|
91
|
-
{
|
92
|
-
label: formatMessage({
|
93
|
-
id: "Settings.review-workflows.list.page.list.column.contentTypes.title",
|
94
|
-
defaultMessage: "Content Types"
|
95
|
-
}),
|
96
|
-
name: "content-types"
|
97
|
-
}
|
98
|
-
];
|
99
|
-
if (isLoading || isLoadingModels) {
|
100
|
-
return /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Loading, {});
|
101
|
-
}
|
102
|
-
const contentTypes = Object.values(data ?? {}).reduce((acc, curr) => {
|
103
|
-
acc.push(...curr);
|
104
|
-
return acc;
|
105
|
-
}, []);
|
106
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
107
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
108
|
-
Layout.Header,
|
109
|
-
{
|
110
|
-
primaryAction: canCreate ? /* @__PURE__ */ jsxRuntime.jsx(
|
111
|
-
designSystem.LinkButton,
|
112
|
-
{
|
113
|
-
startIcon: /* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}),
|
114
|
-
size: "S",
|
115
|
-
tag: reactRouterDom.NavLink,
|
116
|
-
to: "create",
|
117
|
-
onClick: handleCreateClick,
|
118
|
-
children: formatMessage({
|
119
|
-
id: "Settings.review-workflows.list.page.create",
|
120
|
-
defaultMessage: "Create new workflow"
|
121
|
-
})
|
122
|
-
}
|
123
|
-
) : null,
|
124
|
-
subtitle: formatMessage({
|
125
|
-
id: "Settings.review-workflows.list.page.subtitle",
|
126
|
-
defaultMessage: "Manage your content review process"
|
127
|
-
}),
|
128
|
-
title: formatMessage({
|
129
|
-
id: "Settings.review-workflows.list.page.title",
|
130
|
-
defaultMessage: "Review Workflows"
|
131
|
-
})
|
132
|
-
}
|
133
|
-
),
|
134
|
-
/* @__PURE__ */ jsxRuntime.jsxs(Layout.Root, { children: [
|
135
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
136
|
-
strapiAdmin.Table.Root,
|
137
|
-
{
|
138
|
-
isLoading,
|
139
|
-
rows: workflows,
|
140
|
-
footer: canCreate ? /* @__PURE__ */ jsxRuntime.jsx(designSystem.TFooter, { cursor: "pointer", icon: /* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}), onClick: handleCreateClick, children: formatMessage({
|
141
|
-
id: "Settings.review-workflows.list.page.create",
|
142
|
-
defaultMessage: "Create new workflow"
|
143
|
-
}) }) : null,
|
144
|
-
headers,
|
145
|
-
children: /* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Table.Content, { children: [
|
146
|
-
/* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Head, { children: headers.map((head) => /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.HeaderCell, { ...head }, head.name)) }),
|
147
|
-
/* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Body, { children: workflows.map((workflow) => /* @__PURE__ */ jsxRuntime.jsxs(
|
148
|
-
strapiAdmin.Table.Row,
|
149
|
-
{
|
150
|
-
onClick: () => {
|
151
|
-
navigate(`${workflow.id}`);
|
152
|
-
},
|
153
|
-
children: [
|
154
|
-
/* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { width: "25rem", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", fontWeight: "bold", ellipsis: true, children: workflow.name }) }),
|
155
|
-
/* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", children: workflow.stages.length }) }),
|
156
|
-
/* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", children: workflow.contentTypes.map((uid) => {
|
157
|
-
const contentType = contentTypes.find(
|
158
|
-
(contentType2) => contentType2.uid === uid
|
159
|
-
);
|
160
|
-
return contentType?.info.displayName ?? "";
|
161
|
-
}).join(", ") }) }),
|
162
|
-
/* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { alignItems: "center", justifyContent: "end", children: [
|
163
|
-
canRead || canUpdate ? /* @__PURE__ */ jsxRuntime.jsx(
|
164
|
-
designSystem.IconButton,
|
165
|
-
{
|
166
|
-
tag: reactRouterDom.Link,
|
167
|
-
to: workflow.id.toString(),
|
168
|
-
label: formatMessage(
|
169
|
-
{
|
170
|
-
id: "Settings.review-workflows.list.page.list.column.actions.edit.label",
|
171
|
-
defaultMessage: "Edit {name}"
|
172
|
-
},
|
173
|
-
{ name: workflow.name }
|
174
|
-
),
|
175
|
-
variant: "ghost",
|
176
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(icons.Pencil, {})
|
177
|
-
}
|
178
|
-
) : null,
|
179
|
-
workflows.length > 1 && canDelete ? /* @__PURE__ */ jsxRuntime.jsx(
|
180
|
-
designSystem.IconButton,
|
181
|
-
{
|
182
|
-
withTooltip: false,
|
183
|
-
label: formatMessage(
|
184
|
-
{
|
185
|
-
id: "Settings.review-workflows.list.page.list.column.actions.delete.label",
|
186
|
-
defaultMessage: "Delete {name}"
|
187
|
-
},
|
188
|
-
{ name: "Default workflow" }
|
189
|
-
),
|
190
|
-
variant: "ghost",
|
191
|
-
onClick: (e) => {
|
192
|
-
e.stopPropagation();
|
193
|
-
handleDeleteWorkflow(String(workflow.id));
|
194
|
-
},
|
195
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(icons.Trash, {})
|
196
|
-
}
|
197
|
-
) : null
|
198
|
-
] }) })
|
199
|
-
]
|
200
|
-
},
|
201
|
-
workflow.id
|
202
|
-
)) })
|
203
|
-
] })
|
204
|
-
}
|
205
|
-
),
|
206
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Root, { open: !!workflowToDelete, onOpenChange: toggleConfirmDeleteDialog, children: /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.ConfirmDialog, { onConfirm: handleConfirmDeleteDialog, children: formatMessage({
|
207
|
-
id: "Settings.review-workflows.list.page.delete.confirm.body",
|
208
|
-
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?"
|
209
|
-
}) }) }),
|
210
|
-
/* @__PURE__ */ jsxRuntime.jsxs(index.LimitsModal.Root, { open: showLimitModal, onOpenChange: () => setShowLimitModal(false), children: [
|
211
|
-
/* @__PURE__ */ jsxRuntime.jsx(index.LimitsModal.Title, { children: formatMessage({
|
212
|
-
id: "Settings.review-workflows.list.page.workflows.limit.title",
|
213
|
-
defaultMessage: "You’ve reached the limit of workflows in your plan"
|
214
|
-
}) }),
|
215
|
-
/* @__PURE__ */ jsxRuntime.jsx(index.LimitsModal.Body, { children: formatMessage({
|
216
|
-
id: "Settings.review-workflows.list.page.workflows.limit.body",
|
217
|
-
defaultMessage: "Delete a workflow or contact Sales to enable more workflows."
|
218
|
-
}) })
|
219
|
-
] })
|
220
|
-
] })
|
221
|
-
] });
|
222
|
-
};
|
223
|
-
const ProtectedListPage = () => {
|
224
|
-
const permissions = index.useTypedSelector(
|
225
|
-
(state) => state.admin_app.permissions.settings?.["review-workflows"]?.main
|
226
|
-
);
|
227
|
-
return /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Protect, { permissions, children: /* @__PURE__ */ jsxRuntime.jsx(ReviewWorkflowsListView, {}) });
|
228
|
-
};
|
229
|
-
exports.ProtectedListPage = ProtectedListPage;
|
230
|
-
exports.ReviewWorkflowsListView = ReviewWorkflowsListView;
|
231
|
-
//# sourceMappingURL=index-CmHHjN95.js.map
|
@@ -1 +0,0 @@
|
|
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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"}
|
@@ -1,213 +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-ByXbOW-R.mjs";
|
10
|
-
import { u as useReviewWorkflows, H as Header, R as Root } from "./Layout-DNKR5bym.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) return;
|
36
|
-
await deleteAction(workflowToDelete);
|
37
|
-
setWorkflowToDelete(null);
|
38
|
-
};
|
39
|
-
const handleCreateClick = (event) => {
|
40
|
-
event.preventDefault();
|
41
|
-
if (numberOfWorkflows && meta && meta?.workflowCount >= parseInt(numberOfWorkflows, 10)) {
|
42
|
-
event.preventDefault();
|
43
|
-
setShowLimitModal(true);
|
44
|
-
} else {
|
45
|
-
navigate("create");
|
46
|
-
trackUsage("willCreateWorkflow");
|
47
|
-
}
|
48
|
-
};
|
49
|
-
React.useEffect(() => {
|
50
|
-
if (!isLoading && !isLicenseLoading) {
|
51
|
-
if (numberOfWorkflows && meta && meta?.workflowCount > parseInt(numberOfWorkflows, 10)) {
|
52
|
-
setShowLimitModal(true);
|
53
|
-
}
|
54
|
-
}
|
55
|
-
}, [isLicenseLoading, isLoading, meta, meta?.workflowCount, numberOfWorkflows]);
|
56
|
-
const headers = [
|
57
|
-
{
|
58
|
-
label: formatMessage({
|
59
|
-
id: "Settings.review-workflows.list.page.list.column.name.title",
|
60
|
-
defaultMessage: "Name"
|
61
|
-
}),
|
62
|
-
name: "name"
|
63
|
-
},
|
64
|
-
{
|
65
|
-
label: formatMessage({
|
66
|
-
id: "Settings.review-workflows.list.page.list.column.stages.title",
|
67
|
-
defaultMessage: "Stages"
|
68
|
-
}),
|
69
|
-
name: "stages"
|
70
|
-
},
|
71
|
-
{
|
72
|
-
label: formatMessage({
|
73
|
-
id: "Settings.review-workflows.list.page.list.column.contentTypes.title",
|
74
|
-
defaultMessage: "Content Types"
|
75
|
-
}),
|
76
|
-
name: "content-types"
|
77
|
-
}
|
78
|
-
];
|
79
|
-
if (isLoading || isLoadingModels) {
|
80
|
-
return /* @__PURE__ */ jsx(Page.Loading, {});
|
81
|
-
}
|
82
|
-
const contentTypes = Object.values(data ?? {}).reduce((acc, curr) => {
|
83
|
-
acc.push(...curr);
|
84
|
-
return acc;
|
85
|
-
}, []);
|
86
|
-
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
87
|
-
/* @__PURE__ */ jsx(
|
88
|
-
Header,
|
89
|
-
{
|
90
|
-
primaryAction: canCreate ? /* @__PURE__ */ jsx(
|
91
|
-
LinkButton,
|
92
|
-
{
|
93
|
-
startIcon: /* @__PURE__ */ jsx(Plus, {}),
|
94
|
-
size: "S",
|
95
|
-
tag: NavLink,
|
96
|
-
to: "create",
|
97
|
-
onClick: handleCreateClick,
|
98
|
-
children: formatMessage({
|
99
|
-
id: "Settings.review-workflows.list.page.create",
|
100
|
-
defaultMessage: "Create new workflow"
|
101
|
-
})
|
102
|
-
}
|
103
|
-
) : null,
|
104
|
-
subtitle: formatMessage({
|
105
|
-
id: "Settings.review-workflows.list.page.subtitle",
|
106
|
-
defaultMessage: "Manage your content review process"
|
107
|
-
}),
|
108
|
-
title: formatMessage({
|
109
|
-
id: "Settings.review-workflows.list.page.title",
|
110
|
-
defaultMessage: "Review Workflows"
|
111
|
-
})
|
112
|
-
}
|
113
|
-
),
|
114
|
-
/* @__PURE__ */ jsxs(Root, { children: [
|
115
|
-
/* @__PURE__ */ jsx(
|
116
|
-
Table.Root,
|
117
|
-
{
|
118
|
-
isLoading,
|
119
|
-
rows: workflows,
|
120
|
-
footer: canCreate ? /* @__PURE__ */ jsx(TFooter, { cursor: "pointer", icon: /* @__PURE__ */ jsx(Plus, {}), onClick: handleCreateClick, children: formatMessage({
|
121
|
-
id: "Settings.review-workflows.list.page.create",
|
122
|
-
defaultMessage: "Create new workflow"
|
123
|
-
}) }) : null,
|
124
|
-
headers,
|
125
|
-
children: /* @__PURE__ */ jsxs(Table.Content, { children: [
|
126
|
-
/* @__PURE__ */ jsx(Table.Head, { children: headers.map((head) => /* @__PURE__ */ jsx(Table.HeaderCell, { ...head }, head.name)) }),
|
127
|
-
/* @__PURE__ */ jsx(Table.Body, { children: workflows.map((workflow) => /* @__PURE__ */ jsxs(
|
128
|
-
Table.Row,
|
129
|
-
{
|
130
|
-
onClick: () => {
|
131
|
-
navigate(`${workflow.id}`);
|
132
|
-
},
|
133
|
-
children: [
|
134
|
-
/* @__PURE__ */ jsx(Table.Cell, { width: "25rem", children: /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", fontWeight: "bold", ellipsis: true, children: workflow.name }) }),
|
135
|
-
/* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", children: workflow.stages.length }) }),
|
136
|
-
/* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", children: workflow.contentTypes.map((uid) => {
|
137
|
-
const contentType = contentTypes.find(
|
138
|
-
(contentType2) => contentType2.uid === uid
|
139
|
-
);
|
140
|
-
return contentType?.info.displayName ?? "";
|
141
|
-
}).join(", ") }) }),
|
142
|
-
/* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", justifyContent: "end", children: [
|
143
|
-
canRead || canUpdate ? /* @__PURE__ */ jsx(
|
144
|
-
IconButton,
|
145
|
-
{
|
146
|
-
tag: Link,
|
147
|
-
to: workflow.id.toString(),
|
148
|
-
label: formatMessage(
|
149
|
-
{
|
150
|
-
id: "Settings.review-workflows.list.page.list.column.actions.edit.label",
|
151
|
-
defaultMessage: "Edit {name}"
|
152
|
-
},
|
153
|
-
{ name: workflow.name }
|
154
|
-
),
|
155
|
-
variant: "ghost",
|
156
|
-
children: /* @__PURE__ */ jsx(Pencil, {})
|
157
|
-
}
|
158
|
-
) : null,
|
159
|
-
workflows.length > 1 && canDelete ? /* @__PURE__ */ jsx(
|
160
|
-
IconButton,
|
161
|
-
{
|
162
|
-
withTooltip: false,
|
163
|
-
label: formatMessage(
|
164
|
-
{
|
165
|
-
id: "Settings.review-workflows.list.page.list.column.actions.delete.label",
|
166
|
-
defaultMessage: "Delete {name}"
|
167
|
-
},
|
168
|
-
{ name: "Default workflow" }
|
169
|
-
),
|
170
|
-
variant: "ghost",
|
171
|
-
onClick: (e) => {
|
172
|
-
e.stopPropagation();
|
173
|
-
handleDeleteWorkflow(String(workflow.id));
|
174
|
-
},
|
175
|
-
children: /* @__PURE__ */ jsx(Trash, {})
|
176
|
-
}
|
177
|
-
) : null
|
178
|
-
] }) })
|
179
|
-
]
|
180
|
-
},
|
181
|
-
workflow.id
|
182
|
-
)) })
|
183
|
-
] })
|
184
|
-
}
|
185
|
-
),
|
186
|
-
/* @__PURE__ */ jsx(Dialog.Root, { open: !!workflowToDelete, onOpenChange: toggleConfirmDeleteDialog, children: /* @__PURE__ */ jsx(ConfirmDialog, { onConfirm: handleConfirmDeleteDialog, children: formatMessage({
|
187
|
-
id: "Settings.review-workflows.list.page.delete.confirm.body",
|
188
|
-
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?"
|
189
|
-
}) }) }),
|
190
|
-
/* @__PURE__ */ jsxs(LimitsModal.Root, { open: showLimitModal, onOpenChange: () => setShowLimitModal(false), children: [
|
191
|
-
/* @__PURE__ */ jsx(LimitsModal.Title, { children: formatMessage({
|
192
|
-
id: "Settings.review-workflows.list.page.workflows.limit.title",
|
193
|
-
defaultMessage: "You’ve reached the limit of workflows in your plan"
|
194
|
-
}) }),
|
195
|
-
/* @__PURE__ */ jsx(LimitsModal.Body, { children: formatMessage({
|
196
|
-
id: "Settings.review-workflows.list.page.workflows.limit.body",
|
197
|
-
defaultMessage: "Delete a workflow or contact Sales to enable more workflows."
|
198
|
-
}) })
|
199
|
-
] })
|
200
|
-
] })
|
201
|
-
] });
|
202
|
-
};
|
203
|
-
const ProtectedListPage = () => {
|
204
|
-
const permissions = useTypedSelector(
|
205
|
-
(state) => state.admin_app.permissions.settings?.["review-workflows"]?.main
|
206
|
-
);
|
207
|
-
return /* @__PURE__ */ jsx(Page.Protect, { permissions, children: /* @__PURE__ */ jsx(ReviewWorkflowsListView, {}) });
|
208
|
-
};
|
209
|
-
export {
|
210
|
-
ProtectedListPage,
|
211
|
-
ReviewWorkflowsListView
|
212
|
-
};
|
213
|
-
//# sourceMappingURL=index-CyhaJuJG.mjs.map
|
@@ -1 +0,0 @@
|
|
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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"}
|