@strapi/review-workflows 0.0.0-experimental.826f263c58b6886b849d3f03b81f7a530bc51c91 → 0.0.0-experimental.82afe56cecefd0078d534e25909834ecf5fdd404
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-BMqtFafC.js → Layout-C3IORH2n.js} +10 -12
- package/dist/_chunks/Layout-C3IORH2n.js.map +1 -0
- package/dist/_chunks/{Layout-lg3hbwGL.mjs → Layout-DNKR5bym.mjs} +9 -10
- 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-B3jMqqMH.mjs → id-C9Ku9Br9.mjs} +202 -179
- package/dist/_chunks/id-C9Ku9Br9.mjs.map +1 -0
- package/dist/_chunks/{_id-B853wt9z.js → id-oOE1bYls.js} +202 -180
- package/dist/_chunks/id-oOE1bYls.js.map +1 -0
- package/dist/_chunks/{index-lebOqdrv.mjs → index-ByXbOW-R.mjs} +120 -104
- package/dist/_chunks/index-ByXbOW-R.mjs.map +1 -0
- package/dist/_chunks/{index-CdU1x9cZ.js → index-CmHHjN95.js} +17 -47
- package/dist/_chunks/index-CmHHjN95.js.map +1 -0
- package/dist/_chunks/{index-BhJmjDbj.mjs → index-CyhaJuJG.mjs} +18 -47
- package/dist/_chunks/index-CyhaJuJG.mjs.map +1 -0
- package/dist/_chunks/{index-Ujtj1Rcp.js → index-DMT27jNE.js} +119 -104
- 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-CvMnSjb9.mjs → router-BPl2HZMq.mjs} +3 -3
- package/dist/_chunks/router-BPl2HZMq.mjs.map +1 -0
- package/dist/_chunks/{router-BboD243b.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/services/admin.d.ts +1 -1
- package/dist/admin/src/services/api.d.ts +1 -1
- package/dist/admin/src/services/content-manager.d.ts +4 -4
- package/dist/admin/src/services/settings.d.ts +1739 -9
- 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 +12 -14
- package/dist/_chunks/Layout-BMqtFafC.js.map +0 -1
- package/dist/_chunks/Layout-lg3hbwGL.mjs.map +0 -1
- package/dist/_chunks/_id-B3jMqqMH.mjs.map +0 -1
- package/dist/_chunks/_id-B853wt9z.js.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-BhJmjDbj.mjs.map +0 -1
- package/dist/_chunks/index-CdU1x9cZ.js.map +0 -1
- package/dist/_chunks/index-Ujtj1Rcp.js.map +0 -1
- package/dist/_chunks/index-lebOqdrv.mjs.map +0 -1
- package/dist/_chunks/purchase-review-workflows-DlCDg0fD.js.map +0 -1
- package/dist/_chunks/router-BboD243b.js.map +0 -1
- package/dist/_chunks/router-CvMnSjb9.mjs.map +0 -1
- package/strapi-server.js +0 -3
- /package/dist/admin/src/routes/settings/{:id.d.ts → id.d.ts} +0 -0
|
@@ -2,15 +2,14 @@ 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, Accordion, MenuItem, Menu, MultiSelectOption, useComposedRefs, VisuallyHidden, IconButton, Grid,
|
|
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
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
14
|
import { styled } from "styled-components";
|
|
16
15
|
import { useDrop, useDrag } from "react-dnd";
|
|
@@ -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;
|
|
@@ -291,35 +287,23 @@ const Stages = ({ canDelete = true, canUpdate = true, isCreating }) => {
|
|
|
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
|
-
defaultOpen: 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,
|
|
@@ -436,7 +420,7 @@ const Stage = ({
|
|
|
436
420
|
addFieldRow("stages", { name, color, permissions });
|
|
437
421
|
};
|
|
438
422
|
const id = React.useId();
|
|
439
|
-
return /* @__PURE__ */ jsxs(Box, { ref: composedRef, children: [
|
|
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,
|
|
@@ -487,7 +471,7 @@ const Stage = ({
|
|
|
487
471
|
{
|
|
488
472
|
background: "transparent",
|
|
489
473
|
hasRadius: true,
|
|
490
|
-
|
|
474
|
+
variant: "ghost",
|
|
491
475
|
"data-handler-id": handlerId,
|
|
492
476
|
ref: dragRef,
|
|
493
477
|
label: formatMessage({
|
|
@@ -501,7 +485,7 @@ const Stage = ({
|
|
|
501
485
|
)
|
|
502
486
|
] }) : null })
|
|
503
487
|
] }),
|
|
504
|
-
/* @__PURE__ */ jsx(Accordion.Content, { children: /* @__PURE__ */ jsx(Grid, { gap: 4, padding: 6, children: [
|
|
488
|
+
/* @__PURE__ */ jsx(Accordion.Content, { children: /* @__PURE__ */ jsx(Grid.Root, { gap: 4, padding: 6, children: [
|
|
505
489
|
{
|
|
506
490
|
disabled: !canUpdate,
|
|
507
491
|
label: formatMessage({
|
|
@@ -539,7 +523,7 @@ const Stage = ({
|
|
|
539
523
|
size: 6,
|
|
540
524
|
type: "permissions"
|
|
541
525
|
}
|
|
542
|
-
].map(({ size, ...field }) => /* @__PURE__ */ jsx(
|
|
526
|
+
].map(({ size, ...field }) => /* @__PURE__ */ jsx(Grid.Item, { col: size, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsx(InputRenderer, { ...field }) }, field.name)) }) })
|
|
543
527
|
] })
|
|
544
528
|
}
|
|
545
529
|
)
|
|
@@ -644,20 +628,22 @@ const PermissionsField = ({ disabled, name, placeholder, required }) => {
|
|
|
644
628
|
const { value = [], error, onChange } = useField(name);
|
|
645
629
|
const allStages = useForm("PermissionsField", (state) => state.values.stages);
|
|
646
630
|
const onFormValueChange = useForm("PermissionsField", (state) => state.onChange);
|
|
647
|
-
const
|
|
631
|
+
const rolesErrorCount = React.useRef(0);
|
|
632
|
+
const { data: roles = [], isLoading, error: getRolesError } = useGetAdminRolesQuery();
|
|
648
633
|
const filteredRoles = roles?.filter((role) => role.code !== "strapi-super-admin") ?? [];
|
|
649
634
|
React.useEffect(() => {
|
|
650
|
-
if (!isLoading &&
|
|
635
|
+
if (!isLoading && getRolesError && "status" in getRolesError && getRolesError.status == 403 && rolesErrorCount.current === 0) {
|
|
636
|
+
rolesErrorCount.current = 1;
|
|
651
637
|
toggleNotification({
|
|
652
638
|
blockTransition: true,
|
|
653
639
|
type: "danger",
|
|
654
640
|
message: formatMessage({
|
|
655
641
|
id: "review-workflows.stage.permissions.noPermissions.description",
|
|
656
|
-
defaultMessage: "You don’t have the permission to see roles"
|
|
642
|
+
defaultMessage: "You don’t have the permission to see roles. Contact your administrator."
|
|
657
643
|
})
|
|
658
644
|
});
|
|
659
645
|
}
|
|
660
|
-
}, [formatMessage, isLoading, roles, toggleNotification]);
|
|
646
|
+
}, [formatMessage, isLoading, roles, toggleNotification, getRolesError]);
|
|
661
647
|
if (!isLoading && filteredRoles.length === 0) {
|
|
662
648
|
return /* @__PURE__ */ jsxs(
|
|
663
649
|
Field.Root,
|
|
@@ -691,45 +677,45 @@ const PermissionsField = ({ disabled, name, placeholder, required }) => {
|
|
|
691
677
|
}
|
|
692
678
|
);
|
|
693
679
|
}
|
|
694
|
-
return /* @__PURE__ */
|
|
695
|
-
/* @__PURE__ */
|
|
696
|
-
/* @__PURE__ */ jsx(
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
}) }),
|
|
701
|
-
/* @__PURE__ */ jsx(
|
|
702
|
-
MultiSelect,
|
|
703
|
-
{
|
|
704
|
-
disabled,
|
|
705
|
-
onChange: (values) => {
|
|
706
|
-
const permissions = values.map((value2) => ({
|
|
707
|
-
role: parseInt(value2, 10),
|
|
708
|
-
action: "admin::review-workflows.stage.transition"
|
|
709
|
-
}));
|
|
710
|
-
onChange(name, permissions);
|
|
711
|
-
},
|
|
712
|
-
placeholder,
|
|
713
|
-
value: value.map((permission) => `${permission.role}`),
|
|
714
|
-
withTags: true,
|
|
715
|
-
children: /* @__PURE__ */ jsx(
|
|
716
|
-
MultiSelectGroup,
|
|
717
|
-
{
|
|
718
|
-
label: formatMessage({
|
|
719
|
-
id: "Settings.review-workflows.stage.permissions.allRoles.label",
|
|
720
|
-
defaultMessage: "All roles"
|
|
721
|
-
}),
|
|
722
|
-
values: filteredRoles.map((r) => `${r.id}`),
|
|
723
|
-
children: filteredRoles.map((role) => {
|
|
724
|
-
return /* @__PURE__ */ jsx(NestedOption$1, { value: `${role.id}`, children: role.name }, role.id);
|
|
725
|
-
})
|
|
726
|
-
}
|
|
727
|
-
)
|
|
728
|
-
}
|
|
729
|
-
),
|
|
730
|
-
/* @__PURE__ */ jsx(Field.Error, {})
|
|
731
|
-
] }) }),
|
|
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
|
+
}) }),
|
|
732
686
|
/* @__PURE__ */ jsx(
|
|
687
|
+
MultiSelect,
|
|
688
|
+
{
|
|
689
|
+
disabled,
|
|
690
|
+
onChange: (values) => {
|
|
691
|
+
const permissions = values.map((value2) => ({
|
|
692
|
+
role: parseInt(value2, 10),
|
|
693
|
+
action: "admin::review-workflows.stage.transition"
|
|
694
|
+
}));
|
|
695
|
+
onChange(name, permissions);
|
|
696
|
+
},
|
|
697
|
+
placeholder,
|
|
698
|
+
value: value.map((permission) => `${permission.role}`),
|
|
699
|
+
withTags: true,
|
|
700
|
+
children: /* @__PURE__ */ jsx(
|
|
701
|
+
MultiSelectGroup,
|
|
702
|
+
{
|
|
703
|
+
label: formatMessage({
|
|
704
|
+
id: "Settings.review-workflows.stage.permissions.allRoles.label",
|
|
705
|
+
defaultMessage: "All roles"
|
|
706
|
+
}),
|
|
707
|
+
values: filteredRoles.map((r) => `${r.id}`),
|
|
708
|
+
children: filteredRoles.map((role) => {
|
|
709
|
+
return /* @__PURE__ */ jsx(NestedOption$1, { value: `${role.id}`, children: role.name }, role.id);
|
|
710
|
+
})
|
|
711
|
+
}
|
|
712
|
+
)
|
|
713
|
+
}
|
|
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(
|
|
733
719
|
IconButton,
|
|
734
720
|
{
|
|
735
721
|
disabled,
|
|
@@ -738,42 +724,38 @@ const PermissionsField = ({ disabled, name, placeholder, required }) => {
|
|
|
738
724
|
defaultMessage: "Apply to all stages"
|
|
739
725
|
}),
|
|
740
726
|
size: "L",
|
|
741
|
-
variant: "secondary",
|
|
742
|
-
onClick: () => setIsApplyAllConfirmationOpen(true),
|
|
743
727
|
children: /* @__PURE__ */ jsx(Duplicate, {})
|
|
744
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
|
+
})
|
|
755
|
+
}
|
|
745
756
|
)
|
|
746
|
-
] })
|
|
747
|
-
|
|
748
|
-
ConfirmDialog,
|
|
749
|
-
{
|
|
750
|
-
isOpen: isApplyAllConfirmationOpen,
|
|
751
|
-
onClose: () => setIsApplyAllConfirmationOpen(false),
|
|
752
|
-
onConfirm: () => {
|
|
753
|
-
onFormValueChange(
|
|
754
|
-
"stages",
|
|
755
|
-
allStages.map((stage) => ({
|
|
756
|
-
...stage,
|
|
757
|
-
permissions: value
|
|
758
|
-
}))
|
|
759
|
-
);
|
|
760
|
-
setIsApplyAllConfirmationOpen(false);
|
|
761
|
-
toggleNotification({
|
|
762
|
-
type: "success",
|
|
763
|
-
message: formatMessage({
|
|
764
|
-
id: "Settings.review-workflows.page.edit.confirm.stages.permissions.copy.success",
|
|
765
|
-
defaultMessage: "Applied roles to all other stages of the workflow"
|
|
766
|
-
})
|
|
767
|
-
});
|
|
768
|
-
},
|
|
769
|
-
variant: "default",
|
|
770
|
-
children: formatMessage({
|
|
771
|
-
id: "Settings.review-workflows.page.edit.confirm.stages.permissions.copy",
|
|
772
|
-
defaultMessage: "Roles that can change that stage will be applied to all the other stages."
|
|
773
|
-
})
|
|
774
|
-
}
|
|
775
|
-
)
|
|
776
|
-
] });
|
|
757
|
+
] })
|
|
758
|
+
] }) });
|
|
777
759
|
};
|
|
778
760
|
const NestedOption$1 = styled(MultiSelectOption)`
|
|
779
761
|
padding-left: ${({ theme }) => theme.spaces[7]};
|
|
@@ -785,8 +767,8 @@ const PermissionWrapper = styled(Flex)`
|
|
|
785
767
|
`;
|
|
786
768
|
const WorkflowAttributes = ({ canUpdate = true }) => {
|
|
787
769
|
const { formatMessage } = useIntl();
|
|
788
|
-
return /* @__PURE__ */ jsxs(Grid, { background: "neutral0", hasRadius: true, gap: 4, padding: 6, shadow: "tableShadow", children: [
|
|
789
|
-
/* @__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(
|
|
790
772
|
InputRenderer$1,
|
|
791
773
|
{
|
|
792
774
|
disabled: !canUpdate,
|
|
@@ -799,7 +781,8 @@ const WorkflowAttributes = ({ canUpdate = true }) => {
|
|
|
799
781
|
type: "string"
|
|
800
782
|
}
|
|
801
783
|
) }),
|
|
802
|
-
/* @__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 }) })
|
|
803
786
|
] });
|
|
804
787
|
};
|
|
805
788
|
const ContentTypesSelector = ({ disabled }) => {
|
|
@@ -903,15 +886,63 @@ const NestedOption = styled(MultiSelectOption)`
|
|
|
903
886
|
const ContentTypeTakeNotice = styled(Typography)`
|
|
904
887
|
font-style: italic;
|
|
905
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
|
+
};
|
|
906
937
|
const WORKFLOW_SCHEMA = yup.object({
|
|
907
938
|
contentTypes: yup.array().of(yup.string()),
|
|
908
939
|
name: yup.string().max(255, {
|
|
909
940
|
id: "review-workflows.validation.name.max-length",
|
|
910
941
|
defaultMessage: "Name can not be longer than 255 characters"
|
|
911
|
-
}).required(),
|
|
942
|
+
}).required().nullable(),
|
|
912
943
|
stages: yup.array().of(
|
|
913
944
|
yup.object().shape({
|
|
914
|
-
name: yup.string().required({
|
|
945
|
+
name: yup.string().nullable().required({
|
|
915
946
|
id: "review-workflows.validation.stage.name",
|
|
916
947
|
defaultMessage: "Name is required"
|
|
917
948
|
}).max(255, {
|
|
@@ -928,7 +959,7 @@ const WORKFLOW_SCHEMA = yup.object({
|
|
|
928
959
|
return stages.filter((stage) => stage.name === stageName).length === 1;
|
|
929
960
|
}
|
|
930
961
|
),
|
|
931
|
-
color: yup.string().required({
|
|
962
|
+
color: yup.string().nullable().required({
|
|
932
963
|
id: "review-workflows.validation.stage.color",
|
|
933
964
|
defaultMessage: "Color is required"
|
|
934
965
|
}).matches(/^#(?:[0-9a-fA-F]{3}){1,2}$/i),
|
|
@@ -945,7 +976,8 @@ const WORKFLOW_SCHEMA = yup.object({
|
|
|
945
976
|
})
|
|
946
977
|
).strict()
|
|
947
978
|
})
|
|
948
|
-
).min(1)
|
|
979
|
+
).min(1),
|
|
980
|
+
stageRequiredToPublish: yup.string().nullable()
|
|
949
981
|
});
|
|
950
982
|
const EditPage = () => {
|
|
951
983
|
const { id = "" } = useParams();
|
|
@@ -954,7 +986,6 @@ const EditPage = () => {
|
|
|
954
986
|
const { _unstableFormatValidationErrors: formatValidationErrors } = useAPIErrorHandler();
|
|
955
987
|
const navigate = useNavigate();
|
|
956
988
|
const { toggleNotification } = useNotification();
|
|
957
|
-
const dispatch = useDispatch();
|
|
958
989
|
const {
|
|
959
990
|
isLoading: isLoadingWorkflow,
|
|
960
991
|
meta,
|
|
@@ -962,7 +993,7 @@ const EditPage = () => {
|
|
|
962
993
|
error,
|
|
963
994
|
update,
|
|
964
995
|
create
|
|
965
|
-
} = useReviewWorkflows(
|
|
996
|
+
} = useReviewWorkflows();
|
|
966
997
|
const permissions = useTypedSelector(
|
|
967
998
|
(state) => state.admin_app.permissions["settings"]?.["review-workflows"]
|
|
968
999
|
);
|
|
@@ -979,13 +1010,17 @@ const EditPage = () => {
|
|
|
979
1010
|
const stagesPerWorkflow = limits?.[CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME];
|
|
980
1011
|
const submitForm = async (data, helpers) => {
|
|
981
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;
|
|
982
1017
|
if (!isCreatingWorkflow) {
|
|
983
1018
|
const res = await update(id, {
|
|
984
|
-
...
|
|
1019
|
+
...rest,
|
|
985
1020
|
// compare permissions of stages and only submit them if at least one has
|
|
986
1021
|
// changed; this enables partial updates e.g. for users who don't have
|
|
987
1022
|
// permissions to see roles
|
|
988
|
-
stages:
|
|
1023
|
+
stages: rest.stages.map((stage) => {
|
|
989
1024
|
let hasUpdatedPermissions = true;
|
|
990
1025
|
const serverStage = currentWorkflow?.stages?.find(
|
|
991
1026
|
(serverStage2) => serverStage2.id === stage?.id
|
|
@@ -1001,40 +1036,21 @@ const EditPage = () => {
|
|
|
1001
1036
|
...stage,
|
|
1002
1037
|
permissions: hasUpdatedPermissions ? stage.permissions : void 0
|
|
1003
1038
|
};
|
|
1004
|
-
})
|
|
1039
|
+
}),
|
|
1040
|
+
stageRequiredToPublishName
|
|
1005
1041
|
});
|
|
1006
1042
|
if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
|
|
1007
1043
|
helpers.setErrors(formatValidationErrors(res.error));
|
|
1008
|
-
} else if ("data" in res) {
|
|
1009
|
-
for (const uid of res.data.contentTypes) {
|
|
1010
|
-
dispatch({
|
|
1011
|
-
type: "contentManagerApi/invalidateTags",
|
|
1012
|
-
payload: [
|
|
1013
|
-
{
|
|
1014
|
-
type: "ContentTypesConfiguration",
|
|
1015
|
-
id: uid
|
|
1016
|
-
}
|
|
1017
|
-
]
|
|
1018
|
-
});
|
|
1019
|
-
}
|
|
1020
1044
|
}
|
|
1021
1045
|
} else {
|
|
1022
|
-
const res = await create(
|
|
1046
|
+
const res = await create({
|
|
1047
|
+
...rest,
|
|
1048
|
+
stageRequiredToPublishName
|
|
1049
|
+
});
|
|
1023
1050
|
if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
|
|
1024
1051
|
helpers.setErrors(formatValidationErrors(res.error));
|
|
1025
1052
|
} else if ("data" in res) {
|
|
1026
|
-
|
|
1027
|
-
dispatch({
|
|
1028
|
-
type: "contentManagerApi/invalidateTags",
|
|
1029
|
-
payload: [
|
|
1030
|
-
{
|
|
1031
|
-
type: "ContentTypesConfiguration",
|
|
1032
|
-
id: uid
|
|
1033
|
-
}
|
|
1034
|
-
]
|
|
1035
|
-
});
|
|
1036
|
-
}
|
|
1037
|
-
navigate(`../${res.data.id}`);
|
|
1053
|
+
navigate(`../${res.data.id}`, { replace: true });
|
|
1038
1054
|
}
|
|
1039
1055
|
}
|
|
1040
1056
|
} catch (error2) {
|
|
@@ -1098,13 +1114,15 @@ const EditPage = () => {
|
|
|
1098
1114
|
return {
|
|
1099
1115
|
name: "",
|
|
1100
1116
|
stages: [],
|
|
1101
|
-
contentTypes: []
|
|
1117
|
+
contentTypes: [],
|
|
1118
|
+
stageRequiredToPublish: ""
|
|
1102
1119
|
};
|
|
1103
1120
|
} else {
|
|
1104
1121
|
return {
|
|
1105
1122
|
name: currentWorkflow.name,
|
|
1106
1123
|
stages: addTmpKeysToStages(currentWorkflow.stages),
|
|
1107
|
-
contentTypes: currentWorkflow.contentTypes
|
|
1124
|
+
contentTypes: currentWorkflow.contentTypes,
|
|
1125
|
+
stageRequiredToPublish: currentWorkflow.stageRequiredToPublish?.id.toString() ?? ""
|
|
1108
1126
|
};
|
|
1109
1127
|
}
|
|
1110
1128
|
}, [currentWorkflow, isCreatingWorkflow]);
|
|
@@ -1127,13 +1145,12 @@ const EditPage = () => {
|
|
|
1127
1145
|
/* @__PURE__ */ jsx(
|
|
1128
1146
|
Header,
|
|
1129
1147
|
{
|
|
1130
|
-
navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
|
|
1148
|
+
navigationAction: /* @__PURE__ */ jsx(BackButton, { fallback: ".." }),
|
|
1131
1149
|
primaryAction: canUpdate || canCreate ? /* @__PURE__ */ jsx(
|
|
1132
1150
|
Button,
|
|
1133
1151
|
{
|
|
1134
1152
|
startIcon: /* @__PURE__ */ jsx(Check, {}),
|
|
1135
1153
|
type: "submit",
|
|
1136
|
-
size: "M",
|
|
1137
1154
|
disabled: !modified || isSubmitting || values.stages.length === 0,
|
|
1138
1155
|
loading: !Boolean(Object.keys(savePrompts).length > 0) && isSubmitting,
|
|
1139
1156
|
children: formatMessage({
|
|
@@ -1156,23 +1173,22 @@ const EditPage = () => {
|
|
|
1156
1173
|
}
|
|
1157
1174
|
),
|
|
1158
1175
|
/* @__PURE__ */ jsx(Root, { children: /* @__PURE__ */ jsxs(Flex, { alignItems: "stretch", direction: "column", gap: 7, children: [
|
|
1159
|
-
/* @__PURE__ */ jsx(WorkflowAttributes, { canUpdate }),
|
|
1176
|
+
/* @__PURE__ */ jsx(WorkflowAttributes, { canUpdate: canUpdate || canCreate }),
|
|
1160
1177
|
/* @__PURE__ */ jsx(
|
|
1161
1178
|
Stages,
|
|
1162
1179
|
{
|
|
1163
1180
|
canDelete,
|
|
1164
|
-
canUpdate,
|
|
1181
|
+
canUpdate: canUpdate || canCreate,
|
|
1165
1182
|
isCreating: isCreatingWorkflow
|
|
1166
1183
|
}
|
|
1167
1184
|
)
|
|
1168
1185
|
] }) }),
|
|
1169
1186
|
/* @__PURE__ */ jsx(
|
|
1170
|
-
|
|
1187
|
+
Dialog.Root,
|
|
1171
1188
|
{
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
onConfirm: handleConfirmDeleteDialog(values, { setErrors }),
|
|
1175
|
-
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: [
|
|
1176
1192
|
savePrompts.hasDeletedServerStages && /* @__PURE__ */ jsx(Typography, { textAlign: "center", variant: "omega", children: formatMessage({
|
|
1177
1193
|
id: "review-workflows.page.delete.confirm.stages.body",
|
|
1178
1194
|
defaultMessage: "All entries assigned to deleted stages will be moved to the previous stage."
|
|
@@ -1184,7 +1200,7 @@ const EditPage = () => {
|
|
|
1184
1200
|
},
|
|
1185
1201
|
{
|
|
1186
1202
|
count: contentTypesFromOtherWorkflows?.filter(
|
|
1187
|
-
(contentType) =>
|
|
1203
|
+
(contentType) => values.contentTypes.includes(contentType)
|
|
1188
1204
|
).length ?? 0
|
|
1189
1205
|
}
|
|
1190
1206
|
) }),
|
|
@@ -1192,7 +1208,7 @@ const EditPage = () => {
|
|
|
1192
1208
|
id: "review-workflows.page.delete.confirm.confirm",
|
|
1193
1209
|
defaultMessage: "Are you sure you want to save?"
|
|
1194
1210
|
}) })
|
|
1195
|
-
] })
|
|
1211
|
+
] }) })
|
|
1196
1212
|
}
|
|
1197
1213
|
)
|
|
1198
1214
|
] })
|
|
@@ -1201,8 +1217,8 @@ const EditPage = () => {
|
|
|
1201
1217
|
/* @__PURE__ */ jsxs(
|
|
1202
1218
|
LimitsModal.Root,
|
|
1203
1219
|
{
|
|
1204
|
-
|
|
1205
|
-
|
|
1220
|
+
open: showLimitModal === "workflow",
|
|
1221
|
+
onOpenChange: () => setShowLimitModal(null),
|
|
1206
1222
|
children: [
|
|
1207
1223
|
/* @__PURE__ */ jsx(LimitsModal.Title, { children: formatMessage({
|
|
1208
1224
|
id: "review-workflows.edit.page.workflows.limit.title",
|
|
@@ -1215,16 +1231,23 @@ const EditPage = () => {
|
|
|
1215
1231
|
]
|
|
1216
1232
|
}
|
|
1217
1233
|
),
|
|
1218
|
-
/* @__PURE__ */ jsxs(
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
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
|
+
)
|
|
1228
1251
|
] });
|
|
1229
1252
|
};
|
|
1230
1253
|
const addTmpKeysToStages = (data) => {
|
|
@@ -1248,4 +1271,4 @@ const ProtectedEditPage = () => {
|
|
|
1248
1271
|
export {
|
|
1249
1272
|
ProtectedEditPage
|
|
1250
1273
|
};
|
|
1251
|
-
//# sourceMappingURL=
|
|
1274
|
+
//# sourceMappingURL=id-C9Ku9Br9.mjs.map
|