@strapi/review-workflows 0.0.0-experimental.e60ec1829240dae21c1e1d29076681c322288813 → 0.0.0-experimental.e8d8fc824d0f6a695b2a9ebaa4680ed21c3645ca
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/LICENSE +12 -17
- package/dist/_chunks/{Layout-BemsgaWF.js → Layout-C3IORH2n.js} +12 -22
- package/dist/_chunks/Layout-C3IORH2n.js.map +1 -0
- package/dist/_chunks/{Layout-BSrg0PBJ.mjs → Layout-DNKR5bym.mjs} +11 -18
- package/dist/_chunks/Layout-DNKR5bym.mjs.map +1 -0
- package/dist/_chunks/{en-xcewH2pC.js → en-CYgjfSep.js} +5 -2
- package/dist/_chunks/en-CYgjfSep.js.map +1 -0
- package/dist/_chunks/{en-D9ZrQAV6.mjs → en-D9dxziEb.mjs} +5 -2
- package/dist/_chunks/en-D9dxziEb.mjs.map +1 -0
- package/dist/_chunks/{_id-DO302-GM.mjs → id-C9Ku9Br9.mjs} +384 -381
- package/dist/_chunks/id-C9Ku9Br9.mjs.map +1 -0
- package/dist/_chunks/{_id-BDSg16su.js → id-oOE1bYls.js} +389 -389
- package/dist/_chunks/id-oOE1bYls.js.map +1 -0
- package/dist/_chunks/{index-7V_6cgRk.mjs → index-ByXbOW-R.mjs} +194 -229
- package/dist/_chunks/index-ByXbOW-R.mjs.map +1 -0
- package/dist/_chunks/{index-DV2HXfsG.js → index-CmHHjN95.js} +22 -53
- package/dist/_chunks/index-CmHHjN95.js.map +1 -0
- package/dist/_chunks/{index-u8XaKwOw.mjs → index-CyhaJuJG.mjs} +23 -51
- package/dist/_chunks/index-CyhaJuJG.mjs.map +1 -0
- package/dist/_chunks/{index-BIHOhXvS.js → index-DMT27jNE.js} +192 -230
- package/dist/_chunks/index-DMT27jNE.js.map +1 -0
- package/dist/_chunks/{purchase-review-workflows-DlCDg0fD.js → purchase-review-workflows-BxoDFxQ5.js} +2 -2
- package/dist/_chunks/purchase-review-workflows-BxoDFxQ5.js.map +1 -0
- package/dist/_chunks/{purchase-review-workflows-BN-5Ube7.mjs → purchase-review-workflows-DyFV_H0I.mjs} +2 -2
- package/dist/_chunks/{purchase-review-workflows-BN-5Ube7.mjs.map → purchase-review-workflows-DyFV_H0I.mjs.map} +1 -1
- package/dist/_chunks/{router-BdBbXIaZ.mjs → router-BPl2HZMq.mjs} +3 -3
- package/dist/_chunks/router-BPl2HZMq.mjs.map +1 -0
- package/dist/_chunks/{router-BtE6OQHw.js → router-vDfGt9bq.js} +3 -3
- package/dist/_chunks/router-vDfGt9bq.js.map +1 -0
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +1 -1
- package/dist/admin/src/components/LimitsModal.d.ts +2 -4
- package/dist/admin/src/routes/settings/hooks/useDragAndDrop.d.ts +4 -4
- package/dist/admin/src/routes/settings/hooks/useKeyboardDragAndDrop.d.ts +1 -1
- package/dist/admin/src/routes/settings/hooks/useReviewWorkflows.d.ts +3 -3
- package/dist/admin/src/services/admin.d.ts +2 -2
- package/dist/admin/src/services/api.d.ts +2 -3
- package/dist/admin/src/services/content-manager.d.ts +6 -6
- package/dist/admin/src/services/settings.d.ts +1740 -10
- package/dist/admin/src/utils/api.d.ts +4 -19
- package/dist/server/index.js +455 -628
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +455 -628
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/constants/workflows.d.ts +1 -0
- package/dist/server/src/constants/workflows.d.ts.map +1 -1
- package/dist/server/src/content-types/index.d.ts +6 -0
- package/dist/server/src/content-types/index.d.ts.map +1 -1
- package/dist/server/src/content-types/workflow/index.d.ts +6 -0
- package/dist/server/src/content-types/workflow/index.d.ts.map +1 -1
- package/dist/server/src/controllers/assignees.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +0 -1
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/controllers/stages.d.ts.map +1 -1
- package/dist/server/src/controllers/workflows.d.ts +0 -7
- package/dist/server/src/controllers/workflows.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +28 -7
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/routes/review-workflows.d.ts.map +1 -1
- package/dist/server/src/services/assignees.d.ts +8 -4
- package/dist/server/src/services/assignees.d.ts.map +1 -1
- package/dist/server/src/services/document-service-middleware.d.ts +1 -0
- package/dist/server/src/services/document-service-middleware.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +16 -6
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/metrics/index.d.ts +4 -4
- package/dist/server/src/services/metrics/index.d.ts.map +1 -1
- package/dist/server/src/services/metrics/weekly-metrics.d.ts.map +1 -1
- package/dist/server/src/services/stages.d.ts +7 -7
- package/dist/server/src/services/stages.d.ts.map +1 -1
- package/dist/server/src/services/workflows.d.ts.map +1 -1
- package/dist/server/src/validation/review-workflows.d.ts +4 -0
- package/dist/server/src/validation/review-workflows.d.ts.map +1 -1
- package/dist/shared/contracts/review-workflows.d.ts +9 -17
- package/dist/shared/contracts/review-workflows.d.ts.map +1 -1
- package/package.json +17 -19
- package/dist/_chunks/Layout-BSrg0PBJ.mjs.map +0 -1
- package/dist/_chunks/Layout-BemsgaWF.js.map +0 -1
- package/dist/_chunks/_id-BDSg16su.js.map +0 -1
- package/dist/_chunks/_id-DO302-GM.mjs.map +0 -1
- package/dist/_chunks/en-D9ZrQAV6.mjs.map +0 -1
- package/dist/_chunks/en-xcewH2pC.js.map +0 -1
- package/dist/_chunks/index-7V_6cgRk.mjs.map +0 -1
- package/dist/_chunks/index-BIHOhXvS.js.map +0 -1
- package/dist/_chunks/index-DV2HXfsG.js.map +0 -1
- package/dist/_chunks/index-u8XaKwOw.mjs.map +0 -1
- package/dist/_chunks/purchase-review-workflows-DlCDg0fD.js.map +0 -1
- package/dist/_chunks/router-BdBbXIaZ.mjs.map +0 -1
- package/dist/_chunks/router-BtE6OQHw.js.map +0 -1
- package/strapi-server.js +0 -3
- /package/dist/admin/src/routes/settings/{:id.d.ts → id.d.ts} +0 -0
|
@@ -2,22 +2,21 @@ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
import { useTracking, useForm, useField, InputRenderer as InputRenderer$1, useNotification, ConfirmDialog, Page, useAPIErrorHandler, useRBAC, Form, BackButton } from "@strapi/admin/strapi-admin";
|
|
4
4
|
import { useLicenseLimits } from "@strapi/admin/strapi-admin/ee";
|
|
5
|
-
import { Box, Typography, Flex, MenuItem, Menu,
|
|
6
|
-
import { PlusCircle,
|
|
5
|
+
import { Box, Typography, Flex, Accordion, MenuItem, Menu, MultiSelectOption, useComposedRefs, VisuallyHidden, IconButton, Grid, Field, SingleSelect, SingleSelectOption, TextInput, MultiSelect, MultiSelectGroup, Dialog, useCollator, Button } from "@strapi/design-system";
|
|
6
|
+
import { PlusCircle, More, Drag, EyeStriked, Duplicate, Check } from "@strapi/icons";
|
|
7
7
|
import { generateNKeysBetween } from "fractional-indexing";
|
|
8
8
|
import { useIntl } from "react-intl";
|
|
9
|
-
import { useDispatch } from "react-redux";
|
|
10
9
|
import { useParams, useNavigate } from "react-router-dom";
|
|
11
10
|
import * as yup from "yup";
|
|
12
|
-
import { r as reviewWorkflowsApi, A as AVAILABLE_COLORS, g as getStageColorByHex, u as useGetContentTypesQuery, a as useTypedSelector, C as CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME, b as CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME, L as LimitsModal, i as isBaseQueryError } from "./index-
|
|
13
|
-
import { D as DRAG_DROP_TYPES, u as useReviewWorkflows, a as DragLayerRendered, H as Header, R as Root } from "./Layout-
|
|
11
|
+
import { r as reviewWorkflowsApi, A as AVAILABLE_COLORS, g as getStageColorByHex, u as useGetContentTypesQuery, a as useTypedSelector, C as CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME, b as CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME, L as LimitsModal, i as isBaseQueryError } from "./index-ByXbOW-R.mjs";
|
|
12
|
+
import { D as DRAG_DROP_TYPES, u as useReviewWorkflows, a as DragLayerRendered, H as Header, R as Root } from "./Layout-DNKR5bym.mjs";
|
|
14
13
|
import { getEmptyImage } from "react-dnd-html5-backend";
|
|
15
|
-
import styled from "styled-components";
|
|
14
|
+
import { styled } from "styled-components";
|
|
16
15
|
import { useDrop, useDrag } from "react-dnd";
|
|
17
16
|
const adminApi = reviewWorkflowsApi.injectEndpoints({
|
|
18
17
|
endpoints(builder) {
|
|
19
18
|
return {
|
|
20
|
-
|
|
19
|
+
getAdminRoles: builder.query({
|
|
21
20
|
query: () => ({
|
|
22
21
|
url: `/admin/roles`,
|
|
23
22
|
method: "GET"
|
|
@@ -29,7 +28,7 @@ const adminApi = reviewWorkflowsApi.injectEndpoints({
|
|
|
29
28
|
};
|
|
30
29
|
}
|
|
31
30
|
});
|
|
32
|
-
const {
|
|
31
|
+
const { useGetAdminRolesQuery } = adminApi;
|
|
33
32
|
const useKeyboardDragAndDrop = (active, index, { onCancel, onDropItem, onGrabItem, onMoveItem }) => {
|
|
34
33
|
const [isSelected, setIsSelected] = React.useState(false);
|
|
35
34
|
const handleMove = (movement) => {
|
|
@@ -138,8 +137,7 @@ const useDragAndDrop = (active, {
|
|
|
138
137
|
const hoverBoundingRect = objectRef.current?.getBoundingClientRect();
|
|
139
138
|
const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2;
|
|
140
139
|
const clientOffset = monitor.getClientOffset();
|
|
141
|
-
if (!clientOffset)
|
|
142
|
-
return;
|
|
140
|
+
if (!clientOffset) return;
|
|
143
141
|
const hoverClientY = clientOffset && clientOffset.y - hoverBoundingRect.top;
|
|
144
142
|
if (typeof dragIndex === "number" && typeof newIndex === "number") {
|
|
145
143
|
if (dragIndex === newIndex) {
|
|
@@ -192,10 +190,8 @@ const useDragAndDrop = (active, {
|
|
|
192
190
|
const getDragDirection = (monitor) => {
|
|
193
191
|
if (monitor && monitor.isDragging() && !monitor.didDrop() && monitor.getInitialClientOffset() && monitor.getClientOffset()) {
|
|
194
192
|
const deltaY = monitor.getInitialClientOffset().y - monitor.getClientOffset().y;
|
|
195
|
-
if (deltaY > 0)
|
|
196
|
-
|
|
197
|
-
if (deltaY < 0)
|
|
198
|
-
return DIRECTIONS.DOWNWARD;
|
|
193
|
+
if (deltaY > 0) return DIRECTIONS.UPWARD;
|
|
194
|
+
if (deltaY < 0) return DIRECTIONS.DOWNWARD;
|
|
199
195
|
return null;
|
|
200
196
|
}
|
|
201
197
|
return null;
|
|
@@ -248,16 +244,16 @@ const AddStage = ({ children, ...props }) => {
|
|
|
248
244
|
return /* @__PURE__ */ jsx(
|
|
249
245
|
StyledButton,
|
|
250
246
|
{
|
|
251
|
-
|
|
247
|
+
tag: "button",
|
|
252
248
|
background: "neutral0",
|
|
253
|
-
|
|
249
|
+
borderColor: "neutral150",
|
|
254
250
|
paddingBottom: 3,
|
|
255
251
|
paddingLeft: 4,
|
|
256
252
|
paddingRight: 4,
|
|
257
253
|
paddingTop: 3,
|
|
258
254
|
shadow: "filterShadow",
|
|
259
255
|
...props,
|
|
260
|
-
children: /* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold",
|
|
256
|
+
children: /* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", children: /* @__PURE__ */ jsxs(Flex, { tag: "span", gap: 2, children: [
|
|
261
257
|
/* @__PURE__ */ jsx(PlusCircle, { width: "2.4rem", height: "2.4rem", "aria-hidden": true }),
|
|
262
258
|
children
|
|
263
259
|
] }) })
|
|
@@ -276,7 +272,7 @@ const StyledButton = styled(Box)`
|
|
|
276
272
|
color: ${({ theme }) => theme.colors.primary600};
|
|
277
273
|
}
|
|
278
274
|
`;
|
|
279
|
-
const Stages = ({ canDelete = true, canUpdate = true, isCreating
|
|
275
|
+
const Stages = ({ canDelete = true, canUpdate = true, isCreating }) => {
|
|
280
276
|
const { formatMessage } = useIntl();
|
|
281
277
|
const { trackUsage } = useTracking();
|
|
282
278
|
const addFieldRow = useForm("Stages", (state) => state.addFieldRow);
|
|
@@ -291,35 +287,23 @@ const Stages = ({ canDelete = true, canUpdate = true, isCreating = false }) => {
|
|
|
291
287
|
left: "50%",
|
|
292
288
|
position: "absolute",
|
|
293
289
|
top: "0",
|
|
294
|
-
width: 2
|
|
295
|
-
zIndex: 1
|
|
290
|
+
width: 2
|
|
296
291
|
}
|
|
297
292
|
),
|
|
298
|
-
/* @__PURE__ */ jsx(
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
canDelete: stages.length > 1 && canDelete,
|
|
313
|
-
canReorder: stages.length > 1,
|
|
314
|
-
canUpdate,
|
|
315
|
-
stagesCount: stages.length,
|
|
316
|
-
isOpen: isCreating,
|
|
317
|
-
...stage
|
|
318
|
-
}
|
|
319
|
-
) }, stage.__temp_key__);
|
|
320
|
-
})
|
|
321
|
-
}
|
|
322
|
-
)
|
|
293
|
+
/* @__PURE__ */ jsx(Flex, { direction: "column", alignItems: "stretch", gap: 6, position: "relative", tag: "ol", children: stages.map((stage, index) => {
|
|
294
|
+
return /* @__PURE__ */ jsx(Box, { tag: "li", children: /* @__PURE__ */ jsx(
|
|
295
|
+
Stage,
|
|
296
|
+
{
|
|
297
|
+
index,
|
|
298
|
+
canDelete: stages.length > 1 && canDelete,
|
|
299
|
+
canReorder: stages.length > 1,
|
|
300
|
+
canUpdate,
|
|
301
|
+
stagesCount: stages.length,
|
|
302
|
+
defaultOpen: !stage.id,
|
|
303
|
+
...stage
|
|
304
|
+
}
|
|
305
|
+
) }, stage.__temp_key__);
|
|
306
|
+
}) })
|
|
323
307
|
] }),
|
|
324
308
|
canUpdate && /* @__PURE__ */ jsx(
|
|
325
309
|
AddStage,
|
|
@@ -345,16 +329,15 @@ const Stage = ({
|
|
|
345
329
|
canDelete = false,
|
|
346
330
|
canReorder = false,
|
|
347
331
|
canUpdate = false,
|
|
348
|
-
isOpen: isOpenDefault = false,
|
|
349
332
|
stagesCount,
|
|
350
333
|
name,
|
|
351
334
|
permissions,
|
|
352
|
-
color
|
|
335
|
+
color,
|
|
336
|
+
defaultOpen
|
|
353
337
|
}) => {
|
|
354
338
|
const [liveText, setLiveText] = React.useState();
|
|
355
339
|
const { formatMessage } = useIntl();
|
|
356
340
|
const { trackUsage } = useTracking();
|
|
357
|
-
const [isOpen, setIsOpen] = React.useState(isOpenDefault);
|
|
358
341
|
const stageErrors = useForm("Stages", (state) => state.errors.stages);
|
|
359
342
|
const error = stageErrors?.[index];
|
|
360
343
|
const addFieldRow = useForm("Stage", (state) => state.addFieldRow);
|
|
@@ -436,7 +419,8 @@ const Stage = ({
|
|
|
436
419
|
const handleCloneClick = () => {
|
|
437
420
|
addFieldRow("stages", { name, color, permissions });
|
|
438
421
|
};
|
|
439
|
-
|
|
422
|
+
const id = React.useId();
|
|
423
|
+
return /* @__PURE__ */ jsxs(Box, { ref: composedRef, shadow: "tableShadow", children: [
|
|
440
424
|
liveText && /* @__PURE__ */ jsx(VisuallyHidden, { "aria-live": "assertive", children: liveText }),
|
|
441
425
|
isDragging ? /* @__PURE__ */ jsx(
|
|
442
426
|
Box,
|
|
@@ -447,74 +431,61 @@ const Stage = ({
|
|
|
447
431
|
borderWidth: "1px",
|
|
448
432
|
display: "block",
|
|
449
433
|
hasRadius: true,
|
|
450
|
-
padding: 6
|
|
451
|
-
shadow: "tableShadow"
|
|
434
|
+
padding: 6
|
|
452
435
|
}
|
|
453
|
-
) : /* @__PURE__ */
|
|
454
|
-
|
|
436
|
+
) : /* @__PURE__ */ jsx(
|
|
437
|
+
AccordionRoot,
|
|
455
438
|
{
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
onToggle: () => {
|
|
459
|
-
setIsOpen(!isOpen);
|
|
460
|
-
if (!isOpen) {
|
|
439
|
+
onValueChange: (value) => {
|
|
440
|
+
if (value) {
|
|
461
441
|
trackUsage("willEditStage");
|
|
462
442
|
}
|
|
463
443
|
},
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
/* @__PURE__ */ jsx(More, { "aria-hidden": true, focusable: false }),
|
|
478
|
-
/* @__PURE__ */ jsx(VisuallyHidden, { as: "span", children: formatMessage({
|
|
479
|
-
id: "[tbdb].components.DynamicZone.more-actions",
|
|
480
|
-
defaultMessage: "More actions"
|
|
481
|
-
}) })
|
|
482
|
-
] }),
|
|
483
|
-
/* @__PURE__ */ jsx(Menu.Content, { popoverPlacement: "bottom-end", zIndex: 2, children: /* @__PURE__ */ jsxs(Menu.SubRoot, { children: [
|
|
484
|
-
canUpdate && /* @__PURE__ */ jsx(MenuItem, { onClick: handleCloneClick, children: formatMessage({
|
|
485
|
-
id: "Settings.review-workflows.stage.delete",
|
|
486
|
-
defaultMessage: "Duplicate stage"
|
|
487
|
-
}) }),
|
|
488
|
-
canDelete && /* @__PURE__ */ jsx(DeleteMenuItem, { onClick: () => removeFieldRow("stages", index), children: formatMessage({
|
|
489
|
-
id: "Settings.review-workflows.stage.delete",
|
|
490
|
-
defaultMessage: "Delete"
|
|
491
|
-
}) })
|
|
492
|
-
] }) })
|
|
444
|
+
defaultValue: defaultOpen ? id : void 0,
|
|
445
|
+
$error: Object.values(error ?? {}).length > 0,
|
|
446
|
+
children: /* @__PURE__ */ jsxs(Accordion.Item, { value: id, children: [
|
|
447
|
+
/* @__PURE__ */ jsxs(Accordion.Header, { children: [
|
|
448
|
+
/* @__PURE__ */ jsx(Accordion.Trigger, { children: name }),
|
|
449
|
+
/* @__PURE__ */ jsx(Accordion.Actions, { children: canDelete || canUpdate ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
450
|
+
/* @__PURE__ */ jsxs(Menu.Root, { children: [
|
|
451
|
+
/* @__PURE__ */ jsxs(ContextMenuTrigger, { size: "S", endIcon: null, paddingLeft: 2, paddingRight: 2, children: [
|
|
452
|
+
/* @__PURE__ */ jsx(More, { "aria-hidden": true, focusable: false }),
|
|
453
|
+
/* @__PURE__ */ jsx(VisuallyHidden, { tag: "span", children: formatMessage({
|
|
454
|
+
id: "[tbdb].components.DynamicZone.more-actions",
|
|
455
|
+
defaultMessage: "More actions"
|
|
456
|
+
}) })
|
|
493
457
|
] }),
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
458
|
+
/* @__PURE__ */ jsx(Menu.Content, { popoverPlacement: "bottom-end", zIndex: 2, children: /* @__PURE__ */ jsxs(Menu.SubRoot, { children: [
|
|
459
|
+
canUpdate && /* @__PURE__ */ jsx(MenuItem, { onClick: handleCloneClick, children: formatMessage({
|
|
460
|
+
id: "Settings.review-workflows.stage.delete",
|
|
461
|
+
defaultMessage: "Duplicate stage"
|
|
462
|
+
}) }),
|
|
463
|
+
canDelete && /* @__PURE__ */ jsx(DeleteMenuItem, { onClick: () => removeFieldRow("stages", index), children: formatMessage({
|
|
464
|
+
id: "Settings.review-workflows.stage.delete",
|
|
465
|
+
defaultMessage: "Delete"
|
|
466
|
+
}) })
|
|
467
|
+
] }) })
|
|
468
|
+
] }),
|
|
469
|
+
canUpdate && /* @__PURE__ */ jsx(
|
|
470
|
+
IconButton,
|
|
471
|
+
{
|
|
472
|
+
background: "transparent",
|
|
473
|
+
hasRadius: true,
|
|
474
|
+
variant: "ghost",
|
|
475
|
+
"data-handler-id": handlerId,
|
|
476
|
+
ref: dragRef,
|
|
477
|
+
label: formatMessage({
|
|
478
|
+
id: "Settings.review-workflows.stage.drag",
|
|
479
|
+
defaultMessage: "Drag"
|
|
480
|
+
}),
|
|
481
|
+
onClick: (e) => e.stopPropagation(),
|
|
482
|
+
onKeyDown: handleKeyDown,
|
|
483
|
+
children: /* @__PURE__ */ jsx(Drag, {})
|
|
484
|
+
}
|
|
485
|
+
)
|
|
486
|
+
] }) : null })
|
|
487
|
+
] }),
|
|
488
|
+
/* @__PURE__ */ jsx(Accordion.Content, { children: /* @__PURE__ */ jsx(Grid.Root, { gap: 4, padding: 6, children: [
|
|
518
489
|
{
|
|
519
490
|
disabled: !canUpdate,
|
|
520
491
|
label: formatMessage({
|
|
@@ -552,12 +523,16 @@ const Stage = ({
|
|
|
552
523
|
size: 6,
|
|
553
524
|
type: "permissions"
|
|
554
525
|
}
|
|
555
|
-
].map(({ size, ...field }) => /* @__PURE__ */ jsx(
|
|
556
|
-
]
|
|
526
|
+
].map(({ size, ...field }) => /* @__PURE__ */ jsx(Grid.Item, { col: size, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsx(InputRenderer, { ...field }) }, field.name)) }) })
|
|
527
|
+
] })
|
|
557
528
|
}
|
|
558
529
|
)
|
|
559
530
|
] });
|
|
560
531
|
};
|
|
532
|
+
const AccordionRoot = styled(Accordion.Root)`
|
|
533
|
+
border: 1px solid
|
|
534
|
+
${({ theme, $error }) => $error ? theme.colors.danger600 : theme.colors.neutral200};
|
|
535
|
+
`;
|
|
561
536
|
const DeleteMenuItem = styled(MenuItem)`
|
|
562
537
|
color: ${({ theme }) => theme.colors.danger600};
|
|
563
538
|
`;
|
|
@@ -571,22 +546,6 @@ const ContextMenuTrigger = styled(Menu.Trigger)`
|
|
|
571
546
|
font-size: 0;
|
|
572
547
|
}
|
|
573
548
|
`;
|
|
574
|
-
const DragIconButton = styled(IconButton)`
|
|
575
|
-
align-items: center;
|
|
576
|
-
border-radius: ${({ theme }) => theme.borderRadius};
|
|
577
|
-
display: flex;
|
|
578
|
-
justify-content: center;
|
|
579
|
-
|
|
580
|
-
&:hover,
|
|
581
|
-
&:focus {
|
|
582
|
-
background-color: ${({ theme }) => theme.colors.neutral100};
|
|
583
|
-
}
|
|
584
|
-
|
|
585
|
-
svg {
|
|
586
|
-
height: auto;
|
|
587
|
-
width: ${({ theme }) => theme.spaces[3]};
|
|
588
|
-
}
|
|
589
|
-
`;
|
|
590
549
|
const InputRenderer = (props) => {
|
|
591
550
|
switch (props.type) {
|
|
592
551
|
case "color":
|
|
@@ -612,54 +571,55 @@ const ColorSelector = ({ disabled, label, name, required }) => {
|
|
|
612
571
|
color: hex
|
|
613
572
|
}));
|
|
614
573
|
const { themeColorName } = getStageColorByHex(value) ?? {};
|
|
615
|
-
return /* @__PURE__ */
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
Flex,
|
|
628
|
-
{
|
|
629
|
-
as: "span",
|
|
630
|
-
height: 2,
|
|
631
|
-
background: value,
|
|
632
|
-
borderColor: themeColorName === "neutral0" ? "neutral150" : "transparent",
|
|
633
|
-
hasRadius: true,
|
|
634
|
-
shrink: 0,
|
|
635
|
-
width: 2
|
|
636
|
-
}
|
|
637
|
-
),
|
|
638
|
-
children: colorOptions.map(({ value: value2, label: label2, color }) => {
|
|
639
|
-
const { themeColorName: themeColorName2 } = getStageColorByHex(color) || {};
|
|
640
|
-
return /* @__PURE__ */ jsx(
|
|
641
|
-
SingleSelectOption,
|
|
574
|
+
return /* @__PURE__ */ jsxs(Field.Root, { error, name, required, children: [
|
|
575
|
+
/* @__PURE__ */ jsx(Field.Label, { children: label }),
|
|
576
|
+
/* @__PURE__ */ jsx(
|
|
577
|
+
SingleSelect,
|
|
578
|
+
{
|
|
579
|
+
disabled,
|
|
580
|
+
onChange: (v) => {
|
|
581
|
+
onChange(name, v.toString());
|
|
582
|
+
},
|
|
583
|
+
value: value?.toUpperCase(),
|
|
584
|
+
startIcon: /* @__PURE__ */ jsx(
|
|
585
|
+
Flex,
|
|
642
586
|
{
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
587
|
+
tag: "span",
|
|
588
|
+
height: 2,
|
|
589
|
+
background: value,
|
|
590
|
+
borderColor: themeColorName === "neutral0" ? "neutral150" : "transparent",
|
|
591
|
+
hasRadius: true,
|
|
592
|
+
shrink: 0,
|
|
593
|
+
width: 2
|
|
594
|
+
}
|
|
595
|
+
),
|
|
596
|
+
children: colorOptions.map(({ value: value2, label: label2, color }) => {
|
|
597
|
+
const { themeColorName: themeColorName2 } = getStageColorByHex(color) || {};
|
|
598
|
+
return /* @__PURE__ */ jsx(
|
|
599
|
+
SingleSelectOption,
|
|
600
|
+
{
|
|
601
|
+
value: value2,
|
|
602
|
+
startIcon: /* @__PURE__ */ jsx(
|
|
603
|
+
Flex,
|
|
604
|
+
{
|
|
605
|
+
tag: "span",
|
|
606
|
+
height: 2,
|
|
607
|
+
background: color,
|
|
608
|
+
borderColor: themeColorName2 === "neutral0" ? "neutral150" : "transparent",
|
|
609
|
+
hasRadius: true,
|
|
610
|
+
shrink: 0,
|
|
611
|
+
width: 2
|
|
612
|
+
}
|
|
613
|
+
),
|
|
614
|
+
children: label2
|
|
615
|
+
},
|
|
616
|
+
value2
|
|
617
|
+
);
|
|
618
|
+
})
|
|
619
|
+
}
|
|
620
|
+
),
|
|
621
|
+
/* @__PURE__ */ jsx(Field.Error, {})
|
|
622
|
+
] });
|
|
663
623
|
};
|
|
664
624
|
const PermissionsField = ({ disabled, name, placeholder, required }) => {
|
|
665
625
|
const { formatMessage } = useIntl();
|
|
@@ -668,57 +628,65 @@ const PermissionsField = ({ disabled, name, placeholder, required }) => {
|
|
|
668
628
|
const { value = [], error, onChange } = useField(name);
|
|
669
629
|
const allStages = useForm("PermissionsField", (state) => state.values.stages);
|
|
670
630
|
const onFormValueChange = useForm("PermissionsField", (state) => state.onChange);
|
|
671
|
-
const
|
|
631
|
+
const rolesErrorCount = React.useRef(0);
|
|
632
|
+
const { data: roles = [], isLoading, error: getRolesError } = useGetAdminRolesQuery();
|
|
672
633
|
const filteredRoles = roles?.filter((role) => role.code !== "strapi-super-admin") ?? [];
|
|
673
634
|
React.useEffect(() => {
|
|
674
|
-
if (!isLoading &&
|
|
635
|
+
if (!isLoading && getRolesError && "status" in getRolesError && getRolesError.status == 403 && rolesErrorCount.current === 0) {
|
|
636
|
+
rolesErrorCount.current = 1;
|
|
675
637
|
toggleNotification({
|
|
676
638
|
blockTransition: true,
|
|
677
639
|
type: "danger",
|
|
678
640
|
message: formatMessage({
|
|
679
641
|
id: "review-workflows.stage.permissions.noPermissions.description",
|
|
680
|
-
defaultMessage: "You don’t have the permission to see roles"
|
|
642
|
+
defaultMessage: "You don’t have the permission to see roles. Contact your administrator."
|
|
681
643
|
})
|
|
682
644
|
});
|
|
683
645
|
}
|
|
684
|
-
}, [formatMessage, isLoading, roles, toggleNotification]);
|
|
646
|
+
}, [formatMessage, isLoading, roles, toggleNotification, getRolesError]);
|
|
685
647
|
if (!isLoading && filteredRoles.length === 0) {
|
|
686
|
-
return /* @__PURE__ */
|
|
687
|
-
|
|
648
|
+
return /* @__PURE__ */ jsxs(
|
|
649
|
+
Field.Root,
|
|
688
650
|
{
|
|
689
|
-
disabled: true,
|
|
690
651
|
name,
|
|
691
652
|
hint: formatMessage({
|
|
692
653
|
id: "Settings.review-workflows.stage.permissions.noPermissions.description",
|
|
693
654
|
defaultMessage: "You don’t have the permission to see roles"
|
|
694
655
|
}),
|
|
695
|
-
label: formatMessage({
|
|
696
|
-
id: "Settings.review-workflows.stage.permissions.label",
|
|
697
|
-
defaultMessage: "Roles that can change this stage"
|
|
698
|
-
}),
|
|
699
|
-
placeholder: formatMessage({
|
|
700
|
-
id: "components.NotAllowedInput.text",
|
|
701
|
-
defaultMessage: "No permissions to see this field"
|
|
702
|
-
}),
|
|
703
656
|
required,
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
657
|
+
children: [
|
|
658
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
659
|
+
id: "Settings.review-workflows.stage.permissions.label",
|
|
660
|
+
defaultMessage: "Roles that can change this stage"
|
|
661
|
+
}) }),
|
|
662
|
+
/* @__PURE__ */ jsx(
|
|
663
|
+
TextInput,
|
|
664
|
+
{
|
|
665
|
+
disabled: true,
|
|
666
|
+
placeholder: formatMessage({
|
|
667
|
+
id: "components.NotAllowedInput.text",
|
|
668
|
+
defaultMessage: "No permissions to see this field"
|
|
669
|
+
}),
|
|
670
|
+
startAction: /* @__PURE__ */ jsx(EyeStriked, { fill: "neutral600" }),
|
|
671
|
+
type: "text",
|
|
672
|
+
value: ""
|
|
673
|
+
}
|
|
674
|
+
),
|
|
675
|
+
/* @__PURE__ */ jsx(Field.Hint, {})
|
|
676
|
+
]
|
|
707
677
|
}
|
|
708
678
|
);
|
|
709
679
|
}
|
|
710
|
-
return /* @__PURE__ */
|
|
711
|
-
/* @__PURE__ */
|
|
712
|
-
/* @__PURE__ */ jsx(
|
|
680
|
+
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(Flex, { alignItems: "flex-end", gap: 3, children: [
|
|
681
|
+
/* @__PURE__ */ jsx(PermissionWrapper, { grow: 1, children: /* @__PURE__ */ jsxs(Field.Root, { error, name, required: true, children: [
|
|
682
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
683
|
+
id: "Settings.review-workflows.stage.permissions.label",
|
|
684
|
+
defaultMessage: "Roles that can change this stage"
|
|
685
|
+
}) }),
|
|
686
|
+
/* @__PURE__ */ jsx(
|
|
713
687
|
MultiSelect,
|
|
714
688
|
{
|
|
715
689
|
disabled,
|
|
716
|
-
error,
|
|
717
|
-
id: name,
|
|
718
|
-
label: formatMessage({
|
|
719
|
-
id: "Settings.review-workflows.stage.permissions.label",
|
|
720
|
-
defaultMessage: "Roles that can change this stage"
|
|
721
|
-
}),
|
|
722
690
|
onChange: (values) => {
|
|
723
691
|
const permissions = values.map((value2) => ({
|
|
724
692
|
role: parseInt(value2, 10),
|
|
@@ -727,7 +695,6 @@ const PermissionsField = ({ disabled, name, placeholder, required }) => {
|
|
|
727
695
|
onChange(name, permissions);
|
|
728
696
|
},
|
|
729
697
|
placeholder,
|
|
730
|
-
required: true,
|
|
731
698
|
value: value.map((permission) => `${permission.role}`),
|
|
732
699
|
withTags: true,
|
|
733
700
|
children: /* @__PURE__ */ jsx(
|
|
@@ -744,58 +711,52 @@ const PermissionsField = ({ disabled, name, placeholder, required }) => {
|
|
|
744
711
|
}
|
|
745
712
|
)
|
|
746
713
|
}
|
|
747
|
-
)
|
|
748
|
-
/* @__PURE__ */ jsx(
|
|
714
|
+
),
|
|
715
|
+
/* @__PURE__ */ jsx(Field.Error, {})
|
|
716
|
+
] }) }),
|
|
717
|
+
/* @__PURE__ */ jsxs(Dialog.Root, { open: isApplyAllConfirmationOpen, onOpenChange: setIsApplyAllConfirmationOpen, children: [
|
|
718
|
+
/* @__PURE__ */ jsx(Dialog.Trigger, { children: /* @__PURE__ */ jsx(
|
|
749
719
|
IconButton,
|
|
750
720
|
{
|
|
751
721
|
disabled,
|
|
752
|
-
icon: /* @__PURE__ */ jsx(Duplicate, {}),
|
|
753
722
|
label: formatMessage({
|
|
754
723
|
id: "Settings.review-workflows.stage.permissions.apply.label",
|
|
755
724
|
defaultMessage: "Apply to all stages"
|
|
756
725
|
}),
|
|
757
726
|
size: "L",
|
|
758
|
-
|
|
759
|
-
|
|
727
|
+
children: /* @__PURE__ */ jsx(Duplicate, {})
|
|
728
|
+
}
|
|
729
|
+
) }),
|
|
730
|
+
/* @__PURE__ */ jsx(
|
|
731
|
+
ConfirmDialog,
|
|
732
|
+
{
|
|
733
|
+
onConfirm: () => {
|
|
734
|
+
onFormValueChange(
|
|
735
|
+
"stages",
|
|
736
|
+
allStages.map((stage) => ({
|
|
737
|
+
...stage,
|
|
738
|
+
permissions: value
|
|
739
|
+
}))
|
|
740
|
+
);
|
|
741
|
+
setIsApplyAllConfirmationOpen(false);
|
|
742
|
+
toggleNotification({
|
|
743
|
+
type: "success",
|
|
744
|
+
message: formatMessage({
|
|
745
|
+
id: "Settings.review-workflows.page.edit.confirm.stages.permissions.copy.success",
|
|
746
|
+
defaultMessage: "Applied roles to all other stages of the workflow"
|
|
747
|
+
})
|
|
748
|
+
});
|
|
749
|
+
},
|
|
750
|
+
variant: "default",
|
|
751
|
+
children: formatMessage({
|
|
752
|
+
id: "Settings.review-workflows.page.edit.confirm.stages.permissions.copy",
|
|
753
|
+
defaultMessage: "Roles that can change that stage will be applied to all the other stages."
|
|
754
|
+
})
|
|
760
755
|
}
|
|
761
756
|
)
|
|
762
|
-
] })
|
|
763
|
-
|
|
764
|
-
ConfirmDialog,
|
|
765
|
-
{
|
|
766
|
-
isOpen: isApplyAllConfirmationOpen,
|
|
767
|
-
onClose: () => setIsApplyAllConfirmationOpen(false),
|
|
768
|
-
onConfirm: () => {
|
|
769
|
-
onFormValueChange(
|
|
770
|
-
"stages",
|
|
771
|
-
allStages.map((stage) => ({
|
|
772
|
-
...stage,
|
|
773
|
-
permissions: value
|
|
774
|
-
}))
|
|
775
|
-
);
|
|
776
|
-
setIsApplyAllConfirmationOpen(false);
|
|
777
|
-
toggleNotification({
|
|
778
|
-
type: "success",
|
|
779
|
-
message: formatMessage({
|
|
780
|
-
id: "Settings.review-workflows.page.edit.confirm.stages.permissions.copy.success",
|
|
781
|
-
defaultMessage: "Applied roles to all other stages of the workflow"
|
|
782
|
-
})
|
|
783
|
-
});
|
|
784
|
-
},
|
|
785
|
-
variant: "default",
|
|
786
|
-
children: formatMessage({
|
|
787
|
-
id: "Settings.review-workflows.page.edit.confirm.stages.permissions.copy",
|
|
788
|
-
defaultMessage: "Roles that can change that stage will be applied to all the other stages."
|
|
789
|
-
})
|
|
790
|
-
}
|
|
791
|
-
)
|
|
792
|
-
] });
|
|
757
|
+
] })
|
|
758
|
+
] }) });
|
|
793
759
|
};
|
|
794
|
-
const StyledIcon = styled(EyeStriked)`
|
|
795
|
-
& > path {
|
|
796
|
-
fill: ${({ theme }) => theme.colors.neutral600};
|
|
797
|
-
}
|
|
798
|
-
`;
|
|
799
760
|
const NestedOption$1 = styled(MultiSelectOption)`
|
|
800
761
|
padding-left: ${({ theme }) => theme.spaces[7]};
|
|
801
762
|
`;
|
|
@@ -806,8 +767,8 @@ const PermissionWrapper = styled(Flex)`
|
|
|
806
767
|
`;
|
|
807
768
|
const WorkflowAttributes = ({ canUpdate = true }) => {
|
|
808
769
|
const { formatMessage } = useIntl();
|
|
809
|
-
return /* @__PURE__ */ jsxs(Grid, { background: "neutral0", hasRadius: true, gap: 4, padding: 6, shadow: "tableShadow", children: [
|
|
810
|
-
/* @__PURE__ */ jsx(
|
|
770
|
+
return /* @__PURE__ */ jsxs(Grid.Root, { background: "neutral0", hasRadius: true, gap: 4, padding: 6, shadow: "tableShadow", children: [
|
|
771
|
+
/* @__PURE__ */ jsx(Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsx(
|
|
811
772
|
InputRenderer$1,
|
|
812
773
|
{
|
|
813
774
|
disabled: !canUpdate,
|
|
@@ -820,7 +781,8 @@ const WorkflowAttributes = ({ canUpdate = true }) => {
|
|
|
820
781
|
type: "string"
|
|
821
782
|
}
|
|
822
783
|
) }),
|
|
823
|
-
/* @__PURE__ */ jsx(
|
|
784
|
+
/* @__PURE__ */ jsx(Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsx(ContentTypesSelector, { disabled: !canUpdate }) }),
|
|
785
|
+
/* @__PURE__ */ jsx(Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsx(StageSelector, { disabled: !canUpdate }) })
|
|
824
786
|
] });
|
|
825
787
|
};
|
|
826
788
|
const ContentTypesSelector = ({ disabled }) => {
|
|
@@ -841,81 +803,82 @@ const ContentTypesSelector = ({ disabled }) => {
|
|
|
841
803
|
label: contentType.info.displayName,
|
|
842
804
|
value: contentType.uid
|
|
843
805
|
}));
|
|
844
|
-
return /* @__PURE__ */
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
),
|
|
854
|
-
disabled: isDisabled,
|
|
855
|
-
error,
|
|
856
|
-
label: formatMessage({
|
|
857
|
-
id: "Settings.review-workflows.workflow.contentTypes.label",
|
|
858
|
-
defaultMessage: "Associated to"
|
|
859
|
-
}),
|
|
860
|
-
onChange: (values) => {
|
|
861
|
-
onChange("contentTypes", values);
|
|
862
|
-
},
|
|
863
|
-
value,
|
|
864
|
-
placeholder: formatMessage({
|
|
865
|
-
id: "Settings.review-workflows.workflow.contentTypes.placeholder",
|
|
866
|
-
defaultMessage: "Select"
|
|
867
|
-
}),
|
|
868
|
-
children: [
|
|
869
|
-
...collectionTypes.length > 0 ? [
|
|
870
|
-
{
|
|
871
|
-
label: formatMessage({
|
|
872
|
-
id: "Settings.review-workflows.workflow.contentTypes.collectionTypes.label",
|
|
873
|
-
defaultMessage: "Collection Types"
|
|
874
|
-
}),
|
|
875
|
-
children: collectionTypes
|
|
876
|
-
}
|
|
877
|
-
] : [],
|
|
878
|
-
...singleTypes.length > 0 ? [
|
|
879
|
-
{
|
|
880
|
-
label: formatMessage({
|
|
881
|
-
id: "Settings.review-workflows.workflow.contentTypes.singleTypes.label",
|
|
882
|
-
defaultMessage: "Single Types"
|
|
883
|
-
}),
|
|
884
|
-
children: singleTypes
|
|
885
|
-
}
|
|
886
|
-
] : []
|
|
887
|
-
].map((opt) => {
|
|
888
|
-
return /* @__PURE__ */ jsx(
|
|
889
|
-
MultiSelectGroup,
|
|
806
|
+
return /* @__PURE__ */ jsxs(Field.Root, { error, name: "contentTypes", children: [
|
|
807
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
808
|
+
id: "Settings.review-workflows.workflow.contentTypes.label",
|
|
809
|
+
defaultMessage: "Associated to"
|
|
810
|
+
}) }),
|
|
811
|
+
/* @__PURE__ */ jsx(
|
|
812
|
+
MultiSelect,
|
|
813
|
+
{
|
|
814
|
+
customizeContent: (value2) => formatMessage(
|
|
890
815
|
{
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
children: opt.children.map((child) => {
|
|
894
|
-
const { name: assignedWorkflowName } = workflows?.find(
|
|
895
|
-
(workflow) => (currentWorkflow && workflow.id !== currentWorkflow.id || !currentWorkflow) && workflow.contentTypes.includes(child.value)
|
|
896
|
-
) ?? {};
|
|
897
|
-
return /* @__PURE__ */ jsx(NestedOption, { value: child.value, children: /* @__PURE__ */ jsx(Typography, {
|
|
898
|
-
// @ts-expect-error - formatMessage options doesn't expect to be a React component but that's what we need actually for the <i> and <em> components
|
|
899
|
-
children: formatMessage(
|
|
900
|
-
{
|
|
901
|
-
id: "Settings.review-workflows.workflow.contentTypes.assigned.notice",
|
|
902
|
-
defaultMessage: "{label} {name, select, undefined {} other {<i>(assigned to <em>{name}</em> workflow)</i>}}"
|
|
903
|
-
},
|
|
904
|
-
{
|
|
905
|
-
label: child.label,
|
|
906
|
-
name: assignedWorkflowName,
|
|
907
|
-
em: (...children) => /* @__PURE__ */ jsx(Typography, { as: "em", fontWeight: "bold", children }),
|
|
908
|
-
i: (...children) => /* @__PURE__ */ jsx(ContentTypeTakeNotice, { children })
|
|
909
|
-
}
|
|
910
|
-
)
|
|
911
|
-
}) }, child.value);
|
|
912
|
-
})
|
|
816
|
+
id: "Settings.review-workflows.workflow.contentTypes.displayValue",
|
|
817
|
+
defaultMessage: "{count} {count, plural, one {content type} other {content types}} selected"
|
|
913
818
|
},
|
|
914
|
-
|
|
915
|
-
)
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
819
|
+
{ count: value2?.length }
|
|
820
|
+
),
|
|
821
|
+
disabled: isDisabled,
|
|
822
|
+
onChange: (values) => {
|
|
823
|
+
onChange("contentTypes", values);
|
|
824
|
+
},
|
|
825
|
+
value,
|
|
826
|
+
placeholder: formatMessage({
|
|
827
|
+
id: "Settings.review-workflows.workflow.contentTypes.placeholder",
|
|
828
|
+
defaultMessage: "Select"
|
|
829
|
+
}),
|
|
830
|
+
children: [
|
|
831
|
+
...collectionTypes.length > 0 ? [
|
|
832
|
+
{
|
|
833
|
+
label: formatMessage({
|
|
834
|
+
id: "Settings.review-workflows.workflow.contentTypes.collectionTypes.label",
|
|
835
|
+
defaultMessage: "Collection Types"
|
|
836
|
+
}),
|
|
837
|
+
children: collectionTypes
|
|
838
|
+
}
|
|
839
|
+
] : [],
|
|
840
|
+
...singleTypes.length > 0 ? [
|
|
841
|
+
{
|
|
842
|
+
label: formatMessage({
|
|
843
|
+
id: "Settings.review-workflows.workflow.contentTypes.singleTypes.label",
|
|
844
|
+
defaultMessage: "Single Types"
|
|
845
|
+
}),
|
|
846
|
+
children: singleTypes
|
|
847
|
+
}
|
|
848
|
+
] : []
|
|
849
|
+
].map((opt) => {
|
|
850
|
+
return /* @__PURE__ */ jsx(
|
|
851
|
+
MultiSelectGroup,
|
|
852
|
+
{
|
|
853
|
+
label: opt.label,
|
|
854
|
+
values: opt.children.map((child) => child.value.toString()),
|
|
855
|
+
children: opt.children.map((child) => {
|
|
856
|
+
const { name: assignedWorkflowName } = workflows?.find(
|
|
857
|
+
(workflow) => (currentWorkflow && workflow.id !== currentWorkflow.id || !currentWorkflow) && workflow.contentTypes.includes(child.value)
|
|
858
|
+
) ?? {};
|
|
859
|
+
return /* @__PURE__ */ jsx(NestedOption, { value: child.value, children: /* @__PURE__ */ jsx(Typography, {
|
|
860
|
+
// @ts-expect-error - formatMessage options doesn't expect to be a React component but that's what we need actually for the <i> and <em> components
|
|
861
|
+
children: formatMessage(
|
|
862
|
+
{
|
|
863
|
+
id: "Settings.review-workflows.workflow.contentTypes.assigned.notice",
|
|
864
|
+
defaultMessage: "{label} {name, select, undefined {} other {<i>(assigned to <em>{name}</em> workflow)</i>}}"
|
|
865
|
+
},
|
|
866
|
+
{
|
|
867
|
+
label: child.label,
|
|
868
|
+
name: assignedWorkflowName,
|
|
869
|
+
em: (...children) => /* @__PURE__ */ jsx(Typography, { tag: "em", fontWeight: "bold", children }),
|
|
870
|
+
i: (...children) => /* @__PURE__ */ jsx(ContentTypeTakeNotice, { children })
|
|
871
|
+
}
|
|
872
|
+
)
|
|
873
|
+
}) }, child.value);
|
|
874
|
+
})
|
|
875
|
+
},
|
|
876
|
+
opt.label
|
|
877
|
+
);
|
|
878
|
+
})
|
|
879
|
+
}
|
|
880
|
+
)
|
|
881
|
+
] });
|
|
919
882
|
};
|
|
920
883
|
const NestedOption = styled(MultiSelectOption)`
|
|
921
884
|
padding-left: ${({ theme }) => theme.spaces[7]};
|
|
@@ -923,15 +886,63 @@ const NestedOption = styled(MultiSelectOption)`
|
|
|
923
886
|
const ContentTypeTakeNotice = styled(Typography)`
|
|
924
887
|
font-style: italic;
|
|
925
888
|
`;
|
|
889
|
+
const StageSelector = ({ disabled }) => {
|
|
890
|
+
const { value: stages = [] } = useField("stages");
|
|
891
|
+
const { formatMessage } = useIntl();
|
|
892
|
+
const { error, value, onChange } = useField("stageRequiredToPublish");
|
|
893
|
+
const validStages = stages.filter((stage) => stage.name);
|
|
894
|
+
return /* @__PURE__ */ jsxs(
|
|
895
|
+
Field.Root,
|
|
896
|
+
{
|
|
897
|
+
error,
|
|
898
|
+
name: "stageRequiredToPublish",
|
|
899
|
+
hint: formatMessage({
|
|
900
|
+
id: "settings.review-workflows.workflow.stageRequiredToPublish.hint",
|
|
901
|
+
defaultMessage: "Prevents entries from being published if they are not at the required stage."
|
|
902
|
+
}),
|
|
903
|
+
children: [
|
|
904
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
905
|
+
id: "settings.review-workflows.workflow.stageRequiredToPublish.label",
|
|
906
|
+
defaultMessage: "Required stage for publishing"
|
|
907
|
+
}) }),
|
|
908
|
+
/* @__PURE__ */ jsxs(
|
|
909
|
+
SingleSelect,
|
|
910
|
+
{
|
|
911
|
+
disabled,
|
|
912
|
+
onChange: (value2) => {
|
|
913
|
+
onChange("stageRequiredToPublish", value2);
|
|
914
|
+
},
|
|
915
|
+
value,
|
|
916
|
+
children: [
|
|
917
|
+
/* @__PURE__ */ jsx(SingleSelectOption, { value: "", children: formatMessage({
|
|
918
|
+
id: "settings.review-workflows.workflow.stageRequiredToPublish.any",
|
|
919
|
+
defaultMessage: "Any stage"
|
|
920
|
+
}) }),
|
|
921
|
+
validStages.map((stage, i) => /* @__PURE__ */ jsx(
|
|
922
|
+
SingleSelectOption,
|
|
923
|
+
{
|
|
924
|
+
value: stage.id?.toString() || stage.__temp_key__,
|
|
925
|
+
children: stage.name
|
|
926
|
+
},
|
|
927
|
+
`requiredToPublishStage-${stage.id || stage.__temp_key__}`
|
|
928
|
+
))
|
|
929
|
+
]
|
|
930
|
+
}
|
|
931
|
+
),
|
|
932
|
+
/* @__PURE__ */ jsx(Field.Hint, {})
|
|
933
|
+
]
|
|
934
|
+
}
|
|
935
|
+
);
|
|
936
|
+
};
|
|
926
937
|
const WORKFLOW_SCHEMA = yup.object({
|
|
927
938
|
contentTypes: yup.array().of(yup.string()),
|
|
928
939
|
name: yup.string().max(255, {
|
|
929
940
|
id: "review-workflows.validation.name.max-length",
|
|
930
941
|
defaultMessage: "Name can not be longer than 255 characters"
|
|
931
|
-
}).required(),
|
|
942
|
+
}).required().nullable(),
|
|
932
943
|
stages: yup.array().of(
|
|
933
944
|
yup.object().shape({
|
|
934
|
-
name: yup.string().required({
|
|
945
|
+
name: yup.string().nullable().required({
|
|
935
946
|
id: "review-workflows.validation.stage.name",
|
|
936
947
|
defaultMessage: "Name is required"
|
|
937
948
|
}).max(255, {
|
|
@@ -948,7 +959,7 @@ const WORKFLOW_SCHEMA = yup.object({
|
|
|
948
959
|
return stages.filter((stage) => stage.name === stageName).length === 1;
|
|
949
960
|
}
|
|
950
961
|
),
|
|
951
|
-
color: yup.string().required({
|
|
962
|
+
color: yup.string().nullable().required({
|
|
952
963
|
id: "review-workflows.validation.stage.color",
|
|
953
964
|
defaultMessage: "Color is required"
|
|
954
965
|
}).matches(/^#(?:[0-9a-fA-F]{3}){1,2}$/i),
|
|
@@ -965,7 +976,8 @@ const WORKFLOW_SCHEMA = yup.object({
|
|
|
965
976
|
})
|
|
966
977
|
).strict()
|
|
967
978
|
})
|
|
968
|
-
).min(1)
|
|
979
|
+
).min(1),
|
|
980
|
+
stageRequiredToPublish: yup.string().nullable()
|
|
969
981
|
});
|
|
970
982
|
const EditPage = () => {
|
|
971
983
|
const { id = "" } = useParams();
|
|
@@ -974,7 +986,6 @@ const EditPage = () => {
|
|
|
974
986
|
const { _unstableFormatValidationErrors: formatValidationErrors } = useAPIErrorHandler();
|
|
975
987
|
const navigate = useNavigate();
|
|
976
988
|
const { toggleNotification } = useNotification();
|
|
977
|
-
const dispatch = useDispatch();
|
|
978
989
|
const {
|
|
979
990
|
isLoading: isLoadingWorkflow,
|
|
980
991
|
meta,
|
|
@@ -982,7 +993,7 @@ const EditPage = () => {
|
|
|
982
993
|
error,
|
|
983
994
|
update,
|
|
984
995
|
create
|
|
985
|
-
} = useReviewWorkflows(
|
|
996
|
+
} = useReviewWorkflows();
|
|
986
997
|
const permissions = useTypedSelector(
|
|
987
998
|
(state) => state.admin_app.permissions["settings"]?.["review-workflows"]
|
|
988
999
|
);
|
|
@@ -999,13 +1010,17 @@ const EditPage = () => {
|
|
|
999
1010
|
const stagesPerWorkflow = limits?.[CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME];
|
|
1000
1011
|
const submitForm = async (data, helpers) => {
|
|
1001
1012
|
try {
|
|
1013
|
+
const { stageRequiredToPublish, ...rest } = data;
|
|
1014
|
+
const stageRequiredToPublishName = stageRequiredToPublish === "" ? null : rest.stages.find(
|
|
1015
|
+
(stage) => stage.id === Number(stageRequiredToPublish) || stage.__temp_key__ === stageRequiredToPublish
|
|
1016
|
+
)?.name;
|
|
1002
1017
|
if (!isCreatingWorkflow) {
|
|
1003
1018
|
const res = await update(id, {
|
|
1004
|
-
...
|
|
1019
|
+
...rest,
|
|
1005
1020
|
// compare permissions of stages and only submit them if at least one has
|
|
1006
1021
|
// changed; this enables partial updates e.g. for users who don't have
|
|
1007
1022
|
// permissions to see roles
|
|
1008
|
-
stages:
|
|
1023
|
+
stages: rest.stages.map((stage) => {
|
|
1009
1024
|
let hasUpdatedPermissions = true;
|
|
1010
1025
|
const serverStage = currentWorkflow?.stages?.find(
|
|
1011
1026
|
(serverStage2) => serverStage2.id === stage?.id
|
|
@@ -1021,40 +1036,21 @@ const EditPage = () => {
|
|
|
1021
1036
|
...stage,
|
|
1022
1037
|
permissions: hasUpdatedPermissions ? stage.permissions : void 0
|
|
1023
1038
|
};
|
|
1024
|
-
})
|
|
1039
|
+
}),
|
|
1040
|
+
stageRequiredToPublishName
|
|
1025
1041
|
});
|
|
1026
1042
|
if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
|
|
1027
1043
|
helpers.setErrors(formatValidationErrors(res.error));
|
|
1028
|
-
} else if ("data" in res) {
|
|
1029
|
-
for (const uid of res.data.contentTypes) {
|
|
1030
|
-
dispatch({
|
|
1031
|
-
type: "contentManagerApi/invalidateTags",
|
|
1032
|
-
payload: [
|
|
1033
|
-
{
|
|
1034
|
-
type: "ContentTypesConfiguration",
|
|
1035
|
-
id: uid
|
|
1036
|
-
}
|
|
1037
|
-
]
|
|
1038
|
-
});
|
|
1039
|
-
}
|
|
1040
1044
|
}
|
|
1041
1045
|
} else {
|
|
1042
|
-
const res = await create(
|
|
1046
|
+
const res = await create({
|
|
1047
|
+
...rest,
|
|
1048
|
+
stageRequiredToPublishName
|
|
1049
|
+
});
|
|
1043
1050
|
if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
|
|
1044
1051
|
helpers.setErrors(formatValidationErrors(res.error));
|
|
1045
1052
|
} else if ("data" in res) {
|
|
1046
|
-
|
|
1047
|
-
dispatch({
|
|
1048
|
-
type: "contentManagerApi/invalidateTags",
|
|
1049
|
-
payload: [
|
|
1050
|
-
{
|
|
1051
|
-
type: "ContentTypesConfiguration",
|
|
1052
|
-
id: uid
|
|
1053
|
-
}
|
|
1054
|
-
]
|
|
1055
|
-
});
|
|
1056
|
-
}
|
|
1057
|
-
navigate(`../${res.data.id}`);
|
|
1053
|
+
navigate(`../${res.data.id}`, { replace: true });
|
|
1058
1054
|
}
|
|
1059
1055
|
}
|
|
1060
1056
|
} catch (error2) {
|
|
@@ -1118,13 +1114,15 @@ const EditPage = () => {
|
|
|
1118
1114
|
return {
|
|
1119
1115
|
name: "",
|
|
1120
1116
|
stages: [],
|
|
1121
|
-
contentTypes: []
|
|
1117
|
+
contentTypes: [],
|
|
1118
|
+
stageRequiredToPublish: ""
|
|
1122
1119
|
};
|
|
1123
1120
|
} else {
|
|
1124
1121
|
return {
|
|
1125
1122
|
name: currentWorkflow.name,
|
|
1126
1123
|
stages: addTmpKeysToStages(currentWorkflow.stages),
|
|
1127
|
-
contentTypes: currentWorkflow.contentTypes
|
|
1124
|
+
contentTypes: currentWorkflow.contentTypes,
|
|
1125
|
+
stageRequiredToPublish: currentWorkflow.stageRequiredToPublish?.id.toString() ?? ""
|
|
1128
1126
|
};
|
|
1129
1127
|
}
|
|
1130
1128
|
}, [currentWorkflow, isCreatingWorkflow]);
|
|
@@ -1147,13 +1145,12 @@ const EditPage = () => {
|
|
|
1147
1145
|
/* @__PURE__ */ jsx(
|
|
1148
1146
|
Header,
|
|
1149
1147
|
{
|
|
1150
|
-
navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
|
|
1148
|
+
navigationAction: /* @__PURE__ */ jsx(BackButton, { fallback: ".." }),
|
|
1151
1149
|
primaryAction: canUpdate || canCreate ? /* @__PURE__ */ jsx(
|
|
1152
1150
|
Button,
|
|
1153
1151
|
{
|
|
1154
1152
|
startIcon: /* @__PURE__ */ jsx(Check, {}),
|
|
1155
1153
|
type: "submit",
|
|
1156
|
-
size: "M",
|
|
1157
1154
|
disabled: !modified || isSubmitting || values.stages.length === 0,
|
|
1158
1155
|
loading: !Boolean(Object.keys(savePrompts).length > 0) && isSubmitting,
|
|
1159
1156
|
children: formatMessage({
|
|
@@ -1176,23 +1173,22 @@ const EditPage = () => {
|
|
|
1176
1173
|
}
|
|
1177
1174
|
),
|
|
1178
1175
|
/* @__PURE__ */ jsx(Root, { children: /* @__PURE__ */ jsxs(Flex, { alignItems: "stretch", direction: "column", gap: 7, children: [
|
|
1179
|
-
/* @__PURE__ */ jsx(WorkflowAttributes, { canUpdate }),
|
|
1176
|
+
/* @__PURE__ */ jsx(WorkflowAttributes, { canUpdate: canUpdate || canCreate }),
|
|
1180
1177
|
/* @__PURE__ */ jsx(
|
|
1181
1178
|
Stages,
|
|
1182
1179
|
{
|
|
1183
1180
|
canDelete,
|
|
1184
|
-
canUpdate,
|
|
1181
|
+
canUpdate: canUpdate || canCreate,
|
|
1185
1182
|
isCreating: isCreatingWorkflow
|
|
1186
1183
|
}
|
|
1187
1184
|
)
|
|
1188
1185
|
] }) }),
|
|
1189
1186
|
/* @__PURE__ */ jsx(
|
|
1190
|
-
|
|
1187
|
+
Dialog.Root,
|
|
1191
1188
|
{
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
onConfirm: handleConfirmDeleteDialog(values, { setErrors }),
|
|
1195
|
-
children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 5, children: [
|
|
1189
|
+
open: Object.keys(savePrompts).length > 0,
|
|
1190
|
+
onOpenChange: handleConfirmClose,
|
|
1191
|
+
children: /* @__PURE__ */ jsx(ConfirmDialog, { onConfirm: handleConfirmDeleteDialog(values, { setErrors }), children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 5, children: [
|
|
1196
1192
|
savePrompts.hasDeletedServerStages && /* @__PURE__ */ jsx(Typography, { textAlign: "center", variant: "omega", children: formatMessage({
|
|
1197
1193
|
id: "review-workflows.page.delete.confirm.stages.body",
|
|
1198
1194
|
defaultMessage: "All entries assigned to deleted stages will be moved to the previous stage."
|
|
@@ -1204,7 +1200,7 @@ const EditPage = () => {
|
|
|
1204
1200
|
},
|
|
1205
1201
|
{
|
|
1206
1202
|
count: contentTypesFromOtherWorkflows?.filter(
|
|
1207
|
-
(contentType) =>
|
|
1203
|
+
(contentType) => values.contentTypes.includes(contentType)
|
|
1208
1204
|
).length ?? 0
|
|
1209
1205
|
}
|
|
1210
1206
|
) }),
|
|
@@ -1212,7 +1208,7 @@ const EditPage = () => {
|
|
|
1212
1208
|
id: "review-workflows.page.delete.confirm.confirm",
|
|
1213
1209
|
defaultMessage: "Are you sure you want to save?"
|
|
1214
1210
|
}) })
|
|
1215
|
-
] })
|
|
1211
|
+
] }) })
|
|
1216
1212
|
}
|
|
1217
1213
|
)
|
|
1218
1214
|
] })
|
|
@@ -1221,8 +1217,8 @@ const EditPage = () => {
|
|
|
1221
1217
|
/* @__PURE__ */ jsxs(
|
|
1222
1218
|
LimitsModal.Root,
|
|
1223
1219
|
{
|
|
1224
|
-
|
|
1225
|
-
|
|
1220
|
+
open: showLimitModal === "workflow",
|
|
1221
|
+
onOpenChange: () => setShowLimitModal(null),
|
|
1226
1222
|
children: [
|
|
1227
1223
|
/* @__PURE__ */ jsx(LimitsModal.Title, { children: formatMessage({
|
|
1228
1224
|
id: "review-workflows.edit.page.workflows.limit.title",
|
|
@@ -1235,16 +1231,23 @@ const EditPage = () => {
|
|
|
1235
1231
|
]
|
|
1236
1232
|
}
|
|
1237
1233
|
),
|
|
1238
|
-
/* @__PURE__ */ jsxs(
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1234
|
+
/* @__PURE__ */ jsxs(
|
|
1235
|
+
LimitsModal.Root,
|
|
1236
|
+
{
|
|
1237
|
+
open: showLimitModal === "stage",
|
|
1238
|
+
onOpenChange: () => setShowLimitModal(null),
|
|
1239
|
+
children: [
|
|
1240
|
+
/* @__PURE__ */ jsx(LimitsModal.Title, { children: formatMessage({
|
|
1241
|
+
id: "review-workflows.edit.page.stages.limit.title",
|
|
1242
|
+
defaultMessage: "You have reached the limit of stages for this workflow in your plan"
|
|
1243
|
+
}) }),
|
|
1244
|
+
/* @__PURE__ */ jsx(LimitsModal.Body, { children: formatMessage({
|
|
1245
|
+
id: "review-workflows.edit.page.stages.limit.body",
|
|
1246
|
+
defaultMessage: "Try deleting some stages or contact Sales to enable more stages."
|
|
1247
|
+
}) })
|
|
1248
|
+
]
|
|
1249
|
+
}
|
|
1250
|
+
)
|
|
1248
1251
|
] });
|
|
1249
1252
|
};
|
|
1250
1253
|
const addTmpKeysToStages = (data) => {
|
|
@@ -1268,4 +1271,4 @@ const ProtectedEditPage = () => {
|
|
|
1268
1271
|
export {
|
|
1269
1272
|
ProtectedEditPage
|
|
1270
1273
|
};
|
|
1271
|
-
//# sourceMappingURL=
|
|
1274
|
+
//# sourceMappingURL=id-C9Ku9Br9.mjs.map
|