@strapi/content-releases 0.0.0-experimental.d23c1d5b0e45dd06ef09977f526c85468be05403 → 0.0.0-experimental.d325780feab1caf1b9e4423588eb1cc73b74c376
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 +17 -1
- package/dist/_chunks/{App-Cmn2Mkn7.mjs → App-CiZCkScI.mjs} +651 -436
- package/dist/_chunks/App-CiZCkScI.mjs.map +1 -0
- package/dist/_chunks/{App-FVorrIzF.js → App-SGjO5UPV.js} +687 -475
- package/dist/_chunks/App-SGjO5UPV.js.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-sD6ADHk2.js → PurchaseContentReleases--qQepXpP.js} +8 -7
- package/dist/_chunks/PurchaseContentReleases--qQepXpP.js.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-C8djn9fP.mjs → PurchaseContentReleases-D-n-w-st.mjs} +9 -8
- package/dist/_chunks/PurchaseContentReleases-D-n-w-st.mjs.map +1 -0
- package/dist/_chunks/ReleasesSettingsPage-Cto_NLUd.js +178 -0
- package/dist/_chunks/ReleasesSettingsPage-Cto_NLUd.js.map +1 -0
- package/dist/_chunks/ReleasesSettingsPage-DQT8N3A-.mjs +178 -0
- package/dist/_chunks/ReleasesSettingsPage-DQT8N3A-.mjs.map +1 -0
- package/dist/_chunks/{en-DtFJ5ViE.js → en-BWPPsSH-.js} +18 -2
- package/dist/_chunks/en-BWPPsSH-.js.map +1 -0
- package/dist/_chunks/{en-B9Ur3VsE.mjs → en-D9Q4YW03.mjs} +18 -2
- package/dist/_chunks/en-D9Q4YW03.mjs.map +1 -0
- package/dist/_chunks/{index-DDohgTaQ.mjs → index-BjvFfTtA.mjs} +752 -611
- package/dist/_chunks/index-BjvFfTtA.mjs.map +1 -0
- package/dist/_chunks/{index-BfJLth9Z.js → index-CyU534vL.js} +745 -607
- package/dist/_chunks/index-CyU534vL.js.map +1 -0
- package/dist/_chunks/schemas-DBYv9gK8.js +61 -0
- package/dist/_chunks/schemas-DBYv9gK8.js.map +1 -0
- package/dist/_chunks/schemas-DdA2ic2U.mjs +44 -0
- package/dist/_chunks/schemas-DdA2ic2U.mjs.map +1 -0
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +2 -2
- package/dist/admin/src/components/EntryValidationPopover.d.ts +13 -0
- package/dist/admin/src/components/ReleaseAction.d.ts +1 -1
- package/dist/admin/src/components/ReleaseActionMenu.d.ts +3 -3
- package/dist/admin/src/components/{CMReleasesContainer.d.ts → ReleaseActionModal.d.ts} +3 -1
- package/dist/admin/src/components/ReleaseListCell.d.ts +28 -0
- package/dist/admin/src/components/ReleaseModal.d.ts +3 -2
- package/dist/admin/src/components/ReleasesPanel.d.ts +3 -0
- package/dist/admin/src/constants.d.ts +18 -0
- package/dist/admin/src/modules/hooks.d.ts +7 -0
- package/dist/admin/src/pages/ReleasesSettingsPage.d.ts +1 -0
- package/dist/admin/src/services/release.d.ts +53 -370
- package/dist/admin/src/utils/api.d.ts +6 -0
- package/dist/admin/src/utils/time.d.ts +9 -0
- package/dist/admin/src/validation/schemas.d.ts +6 -0
- package/dist/server/index.js +889 -614
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +889 -613
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/constants.d.ts +11 -2
- package/dist/server/src/constants.d.ts.map +1 -1
- package/dist/server/src/content-types/index.d.ts +3 -5
- package/dist/server/src/content-types/index.d.ts.map +1 -1
- package/dist/server/src/content-types/release-action/index.d.ts +3 -5
- package/dist/server/src/content-types/release-action/index.d.ts.map +1 -1
- package/dist/server/src/content-types/release-action/schema.d.ts +3 -5
- package/dist/server/src/content-types/release-action/schema.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +6 -1
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/controllers/release-action.d.ts.map +1 -1
- package/dist/server/src/controllers/release.d.ts +7 -1
- package/dist/server/src/controllers/release.d.ts.map +1 -1
- package/dist/server/src/controllers/settings.d.ts +11 -0
- package/dist/server/src/controllers/settings.d.ts.map +1 -0
- package/dist/server/src/controllers/validation/release-action.d.ts +7 -1
- package/dist/server/src/controllers/validation/release-action.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/release.d.ts +2 -0
- package/dist/server/src/controllers/validation/release.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/settings.d.ts +3 -0
- package/dist/server/src/controllers/validation/settings.d.ts.map +1 -0
- package/dist/server/src/index.d.ts +64 -49
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/middlewares/documents.d.ts +6 -0
- package/dist/server/src/middlewares/documents.d.ts.map +1 -0
- package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts +9 -0
- package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts.map +1 -0
- package/dist/server/src/migrations/index.d.ts.map +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/routes/index.d.ts +16 -0
- package/dist/server/src/routes/index.d.ts.map +1 -1
- package/dist/server/src/routes/release.d.ts.map +1 -1
- package/dist/server/src/routes/settings.d.ts +18 -0
- package/dist/server/src/routes/settings.d.ts.map +1 -0
- package/dist/server/src/services/index.d.ts +36 -38
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/release-action.d.ts +34 -0
- package/dist/server/src/services/release-action.d.ts.map +1 -0
- package/dist/server/src/services/release.d.ts +6 -41
- package/dist/server/src/services/release.d.ts.map +1 -1
- package/dist/server/src/services/settings.d.ts +13 -0
- package/dist/server/src/services/settings.d.ts.map +1 -0
- package/dist/server/src/services/validation.d.ts +1 -1
- package/dist/server/src/services/validation.d.ts.map +1 -1
- package/dist/server/src/utils/index.d.ts +29 -8
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/dist/shared/contracts/release-actions.d.ts +17 -11
- package/dist/shared/contracts/release-actions.d.ts.map +1 -1
- package/dist/shared/contracts/releases.d.ts +9 -7
- package/dist/shared/contracts/releases.d.ts.map +1 -1
- package/dist/shared/contracts/settings.d.ts +39 -0
- package/dist/shared/contracts/settings.d.ts.map +1 -0
- package/package.json +24 -24
- package/dist/_chunks/App-Cmn2Mkn7.mjs.map +0 -1
- package/dist/_chunks/App-FVorrIzF.js.map +0 -1
- package/dist/_chunks/PurchaseContentReleases-C8djn9fP.mjs.map +0 -1
- package/dist/_chunks/PurchaseContentReleases-sD6ADHk2.js.map +0 -1
- package/dist/_chunks/en-B9Ur3VsE.mjs.map +0 -1
- package/dist/_chunks/en-DtFJ5ViE.js.map +0 -1
- package/dist/_chunks/index-BfJLth9Z.js.map +0 -1
- package/dist/_chunks/index-DDohgTaQ.mjs.map +0 -1
- package/dist/admin/src/services/axios.d.ts +0 -29
- package/dist/shared/validation-schemas.d.ts +0 -2
- package/dist/shared/validation-schemas.d.ts.map +0 -1
- package/strapi-server.js +0 -3
|
@@ -1,25 +1,29 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { IconButton, Flex, Icon, Typography, Field, FieldLabel, VisuallyHidden, FieldInput, Box, Button, EmptyStateLayout, ModalLayout, ModalHeader, ModalBody, SingleSelect, SingleSelectOption, ModalFooter } from "@strapi/design-system";
|
|
7
|
-
import { Menu, Link, LinkButton } from "@strapi/design-system/v2";
|
|
8
|
-
import { unstable_useDocument } from "@strapi/plugin-content-manager/strapi-admin";
|
|
9
|
-
import { isAxiosError as isAxiosError$1 } from "axios";
|
|
10
|
-
import { Formik, Form } from "formik";
|
|
1
|
+
import { PaperPlane, CaretDown, Cross, Pencil, More } from "@strapi/icons";
|
|
2
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
3
|
+
import { adminApi, useRBAC, useNotification, useAPIErrorHandler, useQueryParams, isFetchError, useTable, useAuth } from "@strapi/admin/strapi-admin";
|
|
4
|
+
import { Field, Flex, VisuallyHidden, Modal, Button, EmptyStateLayout, LinkButton, Box, SingleSelect, SingleSelectOption, Popover, Typography, Link as Link$1, Menu, AccessibleIcon } from "@strapi/design-system";
|
|
5
|
+
import { useFormik, Formik, Form } from "formik";
|
|
11
6
|
import { useIntl } from "react-intl";
|
|
12
|
-
import {
|
|
7
|
+
import { unstable_useDocumentLayout } from "@strapi/content-manager/strapi-admin";
|
|
8
|
+
import { EmptyDocuments } from "@strapi/icons/symbols";
|
|
9
|
+
import { Link, NavLink } from "react-router-dom";
|
|
13
10
|
import * as yup from "yup";
|
|
14
|
-
import {
|
|
15
|
-
import
|
|
16
|
-
const __variableDynamicImportRuntimeHelper = (glob, path) => {
|
|
11
|
+
import { styled } from "styled-components";
|
|
12
|
+
import * as React from "react";
|
|
13
|
+
const __variableDynamicImportRuntimeHelper = (glob, path, segs) => {
|
|
17
14
|
const v = glob[path];
|
|
18
15
|
if (v) {
|
|
19
16
|
return typeof v === "function" ? v() : Promise.resolve(v);
|
|
20
17
|
}
|
|
21
18
|
return new Promise((_, reject) => {
|
|
22
|
-
(typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
|
|
19
|
+
(typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
|
|
20
|
+
reject.bind(
|
|
21
|
+
null,
|
|
22
|
+
new Error(
|
|
23
|
+
"Unknown variable dynamic import: " + path + (path.split("/").length !== segs ? ". Note that variables only represent file names one level deep." : "")
|
|
24
|
+
)
|
|
25
|
+
)
|
|
26
|
+
);
|
|
23
27
|
});
|
|
24
28
|
};
|
|
25
29
|
const PERMISSIONS = {
|
|
@@ -94,55 +98,70 @@ const PERMISSIONS = {
|
|
|
94
98
|
}
|
|
95
99
|
]
|
|
96
100
|
};
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
method,
|
|
101
|
-
data,
|
|
102
|
-
config
|
|
103
|
-
}) => {
|
|
104
|
-
try {
|
|
105
|
-
const { get, post, del, put } = getFetchClient();
|
|
106
|
-
if (method === "POST") {
|
|
107
|
-
const result2 = await post(url, data, config);
|
|
108
|
-
return { data: result2.data };
|
|
109
|
-
}
|
|
110
|
-
if (method === "DELETE") {
|
|
111
|
-
const result2 = await del(url, config);
|
|
112
|
-
return { data: result2.data };
|
|
113
|
-
}
|
|
114
|
-
if (method === "PUT") {
|
|
115
|
-
const result2 = await put(url, data, config);
|
|
116
|
-
return { data: result2.data };
|
|
117
|
-
}
|
|
118
|
-
const result = await get(url, config);
|
|
119
|
-
return { data: result.data };
|
|
120
|
-
} catch (error) {
|
|
121
|
-
const err = error;
|
|
122
|
-
return {
|
|
123
|
-
error: {
|
|
124
|
-
status: err.response?.status,
|
|
125
|
-
code: err.code,
|
|
126
|
-
response: {
|
|
127
|
-
data: err.response?.data
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
};
|
|
101
|
+
const extendInvalidatesTags = (endpoint, extraTags) => {
|
|
102
|
+
if (!endpoint) {
|
|
103
|
+
return;
|
|
131
104
|
}
|
|
105
|
+
const originalInvalidatesTags = endpoint.invalidatesTags;
|
|
106
|
+
const newInvalidatesTags = (result, err, args, meta) => {
|
|
107
|
+
const originalTags = typeof originalInvalidatesTags === "function" ? originalInvalidatesTags(result, err, args, meta) : originalInvalidatesTags;
|
|
108
|
+
return [...originalTags ?? [], ...extraTags];
|
|
109
|
+
};
|
|
110
|
+
Object.assign(endpoint, { invalidatesTags: newInvalidatesTags });
|
|
132
111
|
};
|
|
133
|
-
const
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
112
|
+
const releaseApi = adminApi.enhanceEndpoints({
|
|
113
|
+
addTagTypes: ["Release", "ReleaseAction", "EntriesInRelease", "ReleaseSettings", "Document"],
|
|
114
|
+
endpoints: {
|
|
115
|
+
updateDocument(endpoint) {
|
|
116
|
+
extendInvalidatesTags(endpoint, [
|
|
117
|
+
{ type: "Release", id: "LIST" },
|
|
118
|
+
{ type: "ReleaseAction", id: "LIST" }
|
|
119
|
+
]);
|
|
120
|
+
},
|
|
121
|
+
deleteDocument(endpoint) {
|
|
122
|
+
extendInvalidatesTags(endpoint, [
|
|
123
|
+
{ type: "Release", id: "LIST" },
|
|
124
|
+
{ type: "ReleaseAction", id: "LIST" }
|
|
125
|
+
]);
|
|
126
|
+
},
|
|
127
|
+
deleteManyDocuments(endpoint) {
|
|
128
|
+
extendInvalidatesTags(endpoint, [
|
|
129
|
+
{ type: "Release", id: "LIST" },
|
|
130
|
+
{ type: "ReleaseAction", id: "LIST" }
|
|
131
|
+
]);
|
|
132
|
+
},
|
|
133
|
+
discardDocument(endpoint) {
|
|
134
|
+
extendInvalidatesTags(endpoint, [
|
|
135
|
+
{ type: "Release", id: "LIST" },
|
|
136
|
+
{ type: "ReleaseAction", id: "LIST" }
|
|
137
|
+
]);
|
|
138
|
+
},
|
|
139
|
+
createWorkflow(endpoint) {
|
|
140
|
+
extendInvalidatesTags(endpoint, [
|
|
141
|
+
{ type: "Release", id: "LIST" },
|
|
142
|
+
{ type: "ReleaseAction", id: "LIST" }
|
|
143
|
+
]);
|
|
144
|
+
},
|
|
145
|
+
updateWorkflow(endpoint) {
|
|
146
|
+
extendInvalidatesTags(endpoint, [
|
|
147
|
+
{ type: "Release", id: "LIST" },
|
|
148
|
+
{ type: "ReleaseAction", id: "LIST" }
|
|
149
|
+
]);
|
|
150
|
+
},
|
|
151
|
+
deleteWorkflow(endpoint) {
|
|
152
|
+
extendInvalidatesTags(endpoint, [
|
|
153
|
+
{ type: "Release", id: "LIST" },
|
|
154
|
+
{ type: "ReleaseAction", id: "LIST" }
|
|
155
|
+
]);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}).injectEndpoints({
|
|
140
159
|
endpoints: (build) => {
|
|
141
160
|
return {
|
|
142
161
|
getReleasesForEntry: build.query({
|
|
143
162
|
query(params) {
|
|
144
163
|
return {
|
|
145
|
-
url: "/content-releases",
|
|
164
|
+
url: "/content-releases/getByDocumentAttached",
|
|
146
165
|
method: "GET",
|
|
147
166
|
config: {
|
|
148
167
|
params
|
|
@@ -204,7 +223,10 @@ const releaseApi = createApi({
|
|
|
204
223
|
method: "GET"
|
|
205
224
|
};
|
|
206
225
|
},
|
|
207
|
-
providesTags: (result, error, arg) => [
|
|
226
|
+
providesTags: (result, error, arg) => [
|
|
227
|
+
{ type: "Release", id: "LIST" },
|
|
228
|
+
{ type: "Release", id: arg.id }
|
|
229
|
+
]
|
|
208
230
|
}),
|
|
209
231
|
getReleaseActions: build.query({
|
|
210
232
|
query({ releaseId, ...params }) {
|
|
@@ -273,20 +295,28 @@ const releaseApi = createApi({
|
|
|
273
295
|
data: body
|
|
274
296
|
};
|
|
275
297
|
},
|
|
276
|
-
invalidatesTags: () => [
|
|
298
|
+
invalidatesTags: (res, error, arg) => [
|
|
299
|
+
{ type: "ReleaseAction", id: "LIST" },
|
|
300
|
+
{ type: "Release", id: "LIST" },
|
|
301
|
+
{ type: "Release", id: arg.params.releaseId }
|
|
302
|
+
],
|
|
277
303
|
async onQueryStarted({ body, params, query, actionPath }, { dispatch, queryFulfilled }) {
|
|
278
304
|
const paramsWithoutActionId = {
|
|
279
305
|
releaseId: params.releaseId,
|
|
280
306
|
...query
|
|
281
307
|
};
|
|
282
308
|
const patchResult = dispatch(
|
|
283
|
-
releaseApi.util.updateQueryData(
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
309
|
+
releaseApi.util.updateQueryData(
|
|
310
|
+
"getReleaseActions",
|
|
311
|
+
paramsWithoutActionId,
|
|
312
|
+
(draft) => {
|
|
313
|
+
const [key, index] = actionPath;
|
|
314
|
+
const action = draft.data[key][index];
|
|
315
|
+
if (action) {
|
|
316
|
+
action.type = body.type;
|
|
317
|
+
}
|
|
288
318
|
}
|
|
289
|
-
|
|
319
|
+
)
|
|
290
320
|
);
|
|
291
321
|
try {
|
|
292
322
|
await queryFulfilled;
|
|
@@ -316,7 +346,10 @@ const releaseApi = createApi({
|
|
|
316
346
|
method: "POST"
|
|
317
347
|
};
|
|
318
348
|
},
|
|
319
|
-
invalidatesTags: (result, error, arg) => [
|
|
349
|
+
invalidatesTags: (result, error, arg) => [
|
|
350
|
+
{ type: "Release", id: arg.id },
|
|
351
|
+
{ type: "Document", id: `ALL_LIST` }
|
|
352
|
+
]
|
|
320
353
|
}),
|
|
321
354
|
deleteRelease: build.mutation({
|
|
322
355
|
query({ id }) {
|
|
@@ -341,6 +374,20 @@ const releaseApi = createApi({
|
|
|
341
374
|
return response.data;
|
|
342
375
|
},
|
|
343
376
|
providesTags: [{ type: "EntriesInRelease" }]
|
|
377
|
+
}),
|
|
378
|
+
getReleaseSettings: build.query({
|
|
379
|
+
query: () => "/content-releases/settings",
|
|
380
|
+
providesTags: [{ type: "ReleaseSettings" }]
|
|
381
|
+
}),
|
|
382
|
+
updateReleaseSettings: build.mutation({
|
|
383
|
+
query(data) {
|
|
384
|
+
return {
|
|
385
|
+
url: "/content-releases/settings",
|
|
386
|
+
method: "PUT",
|
|
387
|
+
data
|
|
388
|
+
};
|
|
389
|
+
},
|
|
390
|
+
invalidatesTags: [{ type: "ReleaseSettings" }]
|
|
344
391
|
})
|
|
345
392
|
};
|
|
346
393
|
}
|
|
@@ -358,205 +405,21 @@ const {
|
|
|
358
405
|
usePublishReleaseMutation,
|
|
359
406
|
useDeleteReleaseActionMutation,
|
|
360
407
|
useDeleteReleaseMutation,
|
|
361
|
-
useGetMappedEntriesInReleasesQuery
|
|
408
|
+
useGetMappedEntriesInReleasesQuery,
|
|
409
|
+
useGetReleaseSettingsQuery,
|
|
410
|
+
useUpdateReleaseSettingsMutation
|
|
362
411
|
} = releaseApi;
|
|
363
|
-
const getTimezoneOffset = (timezone, date) => {
|
|
364
|
-
try {
|
|
365
|
-
const offsetPart = new Intl.DateTimeFormat("en", {
|
|
366
|
-
timeZone: timezone,
|
|
367
|
-
timeZoneName: "longOffset"
|
|
368
|
-
}).formatToParts(date).find((part) => part.type === "timeZoneName");
|
|
369
|
-
const offset = offsetPart ? offsetPart.value : "";
|
|
370
|
-
let utcOffset = offset.replace("GMT", "UTC");
|
|
371
|
-
if (!utcOffset.includes("+") && !utcOffset.includes("-")) {
|
|
372
|
-
utcOffset = `${utcOffset}+00:00`;
|
|
373
|
-
}
|
|
374
|
-
return utcOffset;
|
|
375
|
-
} catch (error) {
|
|
376
|
-
return "";
|
|
377
|
-
}
|
|
378
|
-
};
|
|
379
|
-
const StyledMenuItem = styled(Menu.Item)`
|
|
380
|
-
&:hover {
|
|
381
|
-
background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
|
|
382
|
-
|
|
383
|
-
svg {
|
|
384
|
-
path {
|
|
385
|
-
fill: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}600`]};
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
a {
|
|
390
|
-
color: ${({ theme }) => theme.colors.neutral800};
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
svg {
|
|
395
|
-
path {
|
|
396
|
-
fill: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}600`]};
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
a {
|
|
401
|
-
color: ${({ theme }) => theme.colors.neutral800};
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
span,
|
|
405
|
-
a {
|
|
406
|
-
width: 100%;
|
|
407
|
-
}
|
|
408
|
-
`;
|
|
409
|
-
const StyledIconButton = styled(IconButton)`
|
|
410
|
-
/* Setting this style inline with borderColor will not apply the style */
|
|
411
|
-
border: ${({ theme }) => `1px solid ${theme.colors.neutral200}`};
|
|
412
|
-
`;
|
|
413
|
-
const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
|
|
414
|
-
const { formatMessage } = useIntl();
|
|
415
|
-
const { toggleNotification } = useNotification();
|
|
416
|
-
const { formatAPIError } = useAPIErrorHandler();
|
|
417
|
-
const [deleteReleaseAction] = useDeleteReleaseActionMutation();
|
|
418
|
-
const {
|
|
419
|
-
allowedActions: { canDeleteAction }
|
|
420
|
-
} = useRBAC(PERMISSIONS);
|
|
421
|
-
const handleDeleteAction = async () => {
|
|
422
|
-
const response = await deleteReleaseAction({
|
|
423
|
-
params: { releaseId, actionId }
|
|
424
|
-
});
|
|
425
|
-
if ("data" in response) {
|
|
426
|
-
toggleNotification({
|
|
427
|
-
type: "success",
|
|
428
|
-
message: formatMessage({
|
|
429
|
-
id: "content-releases.content-manager-edit-view.remove-from-release.notification.success",
|
|
430
|
-
defaultMessage: "Entry removed from release"
|
|
431
|
-
})
|
|
432
|
-
});
|
|
433
|
-
return;
|
|
434
|
-
}
|
|
435
|
-
if ("error" in response) {
|
|
436
|
-
if (isAxiosError$1(response.error)) {
|
|
437
|
-
toggleNotification({
|
|
438
|
-
type: "danger",
|
|
439
|
-
message: formatAPIError(response.error)
|
|
440
|
-
});
|
|
441
|
-
} else {
|
|
442
|
-
toggleNotification({
|
|
443
|
-
type: "danger",
|
|
444
|
-
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
445
|
-
});
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
};
|
|
449
|
-
if (!canDeleteAction) {
|
|
450
|
-
return null;
|
|
451
|
-
}
|
|
452
|
-
return /* @__PURE__ */ jsx(StyledMenuItem, { variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
453
|
-
/* @__PURE__ */ jsx(Icon, { as: Cross, width: 3, height: 3 }),
|
|
454
|
-
/* @__PURE__ */ jsx(Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
|
|
455
|
-
id: "content-releases.content-manager-edit-view.remove-from-release",
|
|
456
|
-
defaultMessage: "Remove from release"
|
|
457
|
-
}) })
|
|
458
|
-
] }) });
|
|
459
|
-
};
|
|
460
|
-
const ReleaseActionEntryLinkItem = ({
|
|
461
|
-
contentTypeUid,
|
|
462
|
-
entryId,
|
|
463
|
-
locale
|
|
464
|
-
}) => {
|
|
465
|
-
const { formatMessage } = useIntl();
|
|
466
|
-
const userPermissions = useAuth("ReleaseActionEntryLinkItem", (state) => state.permissions);
|
|
467
|
-
const canUpdateEntryForLocale = React.useMemo(() => {
|
|
468
|
-
const updatePermissions = userPermissions.find(
|
|
469
|
-
(permission) => permission.subject === contentTypeUid && permission.action === "plugin::content-manager.explorer.update"
|
|
470
|
-
);
|
|
471
|
-
if (!updatePermissions) {
|
|
472
|
-
return false;
|
|
473
|
-
}
|
|
474
|
-
return Boolean(!locale || updatePermissions.properties?.locales?.includes(locale));
|
|
475
|
-
}, [contentTypeUid, locale, userPermissions]);
|
|
476
|
-
const {
|
|
477
|
-
allowedActions: { canUpdate: canUpdateContentType }
|
|
478
|
-
} = useRBAC({
|
|
479
|
-
updateContentType: [
|
|
480
|
-
{
|
|
481
|
-
action: "plugin::content-manager.explorer.update",
|
|
482
|
-
subject: contentTypeUid
|
|
483
|
-
}
|
|
484
|
-
]
|
|
485
|
-
});
|
|
486
|
-
if (!canUpdateContentType || !canUpdateEntryForLocale) {
|
|
487
|
-
return null;
|
|
488
|
-
}
|
|
489
|
-
return /* @__PURE__ */ jsx(StyledMenuItem, { children: /* @__PURE__ */ jsx(
|
|
490
|
-
Link,
|
|
491
|
-
{
|
|
492
|
-
as: NavLink,
|
|
493
|
-
to: {
|
|
494
|
-
pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,
|
|
495
|
-
search: locale && `?plugins[i18n][locale]=${locale}`
|
|
496
|
-
},
|
|
497
|
-
startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, width: 3, height: 3 }),
|
|
498
|
-
children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
|
|
499
|
-
id: "content-releases.content-manager-edit-view.edit-entry",
|
|
500
|
-
defaultMessage: "Edit entry"
|
|
501
|
-
}) })
|
|
502
|
-
}
|
|
503
|
-
) });
|
|
504
|
-
};
|
|
505
|
-
const EditReleaseItem = ({ releaseId }) => {
|
|
506
|
-
const { formatMessage } = useIntl();
|
|
507
|
-
return /* @__PURE__ */ jsx(StyledMenuItem, { children: /* @__PURE__ */ jsx(
|
|
508
|
-
Link,
|
|
509
|
-
{
|
|
510
|
-
href: `/admin/plugins/content-releases/${releaseId}`,
|
|
511
|
-
startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, width: 3, height: 3 }),
|
|
512
|
-
isExternal: false,
|
|
513
|
-
children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
|
|
514
|
-
id: "content-releases.content-manager-edit-view.edit-release",
|
|
515
|
-
defaultMessage: "Edit release"
|
|
516
|
-
}) })
|
|
517
|
-
}
|
|
518
|
-
) });
|
|
519
|
-
};
|
|
520
|
-
const Root = ({ children, hasTriggerBorder = false }) => {
|
|
521
|
-
const { formatMessage } = useIntl();
|
|
522
|
-
const { allowedActions } = useRBAC(PERMISSIONS);
|
|
523
|
-
return (
|
|
524
|
-
// A user can access the dropdown if they have permissions to delete a release-action OR update a release
|
|
525
|
-
allowedActions.canDeleteAction || allowedActions.canUpdate ? /* @__PURE__ */ jsxs(Menu.Root, { children: [
|
|
526
|
-
/* @__PURE__ */ jsx(
|
|
527
|
-
Menu.Trigger,
|
|
528
|
-
{
|
|
529
|
-
as: hasTriggerBorder ? StyledIconButton : IconButton,
|
|
530
|
-
paddingLeft: 2,
|
|
531
|
-
paddingRight: 2,
|
|
532
|
-
"aria-label": formatMessage({
|
|
533
|
-
id: "content-releases.content-manager-edit-view.release-action-menu",
|
|
534
|
-
defaultMessage: "Release action options"
|
|
535
|
-
}),
|
|
536
|
-
icon: /* @__PURE__ */ jsx(More, {})
|
|
537
|
-
}
|
|
538
|
-
),
|
|
539
|
-
/* @__PURE__ */ jsx(Menu.Content, { top: 1, popoverPlacement: "bottom-end", children })
|
|
540
|
-
] }) : null
|
|
541
|
-
);
|
|
542
|
-
};
|
|
543
|
-
const ReleaseActionMenu = {
|
|
544
|
-
Root,
|
|
545
|
-
EditReleaseItem,
|
|
546
|
-
DeleteReleaseActionItem,
|
|
547
|
-
ReleaseActionEntryLinkItem
|
|
548
|
-
};
|
|
549
412
|
const getBorderLeftRadiusValue = (actionType) => {
|
|
550
413
|
return actionType === "publish" ? 1 : 0;
|
|
551
414
|
};
|
|
552
415
|
const getBorderRightRadiusValue = (actionType) => {
|
|
553
416
|
return actionType === "publish" ? 0 : 1;
|
|
554
417
|
};
|
|
555
|
-
const FieldWrapper = styled(Field)`
|
|
556
|
-
border-top-left-radius: ${({ actionType, theme }) => theme.spaces[getBorderLeftRadiusValue(actionType)]};
|
|
557
|
-
border-bottom-left-radius: ${({ actionType, theme }) => theme.spaces[getBorderLeftRadiusValue(actionType)]};
|
|
558
|
-
border-top-right-radius: ${({ actionType, theme }) => theme.spaces[getBorderRightRadiusValue(actionType)]};
|
|
559
|
-
border-bottom-right-radius: ${({ actionType, theme }) => theme.spaces[getBorderRightRadiusValue(actionType)]};
|
|
418
|
+
const FieldWrapper = styled(Field.Root)`
|
|
419
|
+
border-top-left-radius: ${({ $actionType, theme }) => theme.spaces[getBorderLeftRadiusValue($actionType)]};
|
|
420
|
+
border-bottom-left-radius: ${({ $actionType, theme }) => theme.spaces[getBorderLeftRadiusValue($actionType)]};
|
|
421
|
+
border-top-right-radius: ${({ $actionType, theme }) => theme.spaces[getBorderRightRadiusValue($actionType)]};
|
|
422
|
+
border-bottom-right-radius: ${({ $actionType, theme }) => theme.spaces[getBorderRightRadiusValue($actionType)]};
|
|
560
423
|
|
|
561
424
|
> label {
|
|
562
425
|
color: inherit;
|
|
@@ -567,14 +430,14 @@ const FieldWrapper = styled(Field)`
|
|
|
567
430
|
}
|
|
568
431
|
|
|
569
432
|
&[data-checked='true'] {
|
|
570
|
-
color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
|
|
571
|
-
background-color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary100 : theme.colors.danger100};
|
|
572
|
-
border-color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
|
|
433
|
+
color: ${({ theme, $actionType }) => $actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
|
|
434
|
+
background-color: ${({ theme, $actionType }) => $actionType === "publish" ? theme.colors.primary100 : theme.colors.danger100};
|
|
435
|
+
border-color: ${({ theme, $actionType }) => $actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
|
|
573
436
|
}
|
|
574
437
|
|
|
575
438
|
&[data-checked='false'] {
|
|
576
|
-
border-left: ${({ actionType }) => actionType === "unpublish" && "none"};
|
|
577
|
-
border-right: ${({ actionType }) => actionType === "publish" && "none"};
|
|
439
|
+
border-left: ${({ $actionType }) => $actionType === "unpublish" && "none"};
|
|
440
|
+
border-right: ${({ $actionType }) => $actionType === "publish" && "none"};
|
|
578
441
|
}
|
|
579
442
|
|
|
580
443
|
&[data-checked='false'][data-disabled='false']:hover {
|
|
@@ -603,7 +466,7 @@ const ActionOption = ({
|
|
|
603
466
|
return /* @__PURE__ */ jsx(
|
|
604
467
|
FieldWrapper,
|
|
605
468
|
{
|
|
606
|
-
actionType,
|
|
469
|
+
$actionType: actionType,
|
|
607
470
|
background: "primary0",
|
|
608
471
|
borderColor: "neutral200",
|
|
609
472
|
color: selected === actionType ? "primary600" : "neutral600",
|
|
@@ -611,12 +474,11 @@ const ActionOption = ({
|
|
|
611
474
|
cursor: "pointer",
|
|
612
475
|
"data-checked": selected === actionType,
|
|
613
476
|
"data-disabled": disabled && selected !== actionType,
|
|
614
|
-
children: /* @__PURE__ */ jsxs(
|
|
477
|
+
children: /* @__PURE__ */ jsxs(Field.Label, { children: [
|
|
615
478
|
/* @__PURE__ */ jsx(VisuallyHidden, { children: /* @__PURE__ */ jsx(
|
|
616
|
-
|
|
479
|
+
Field.Input,
|
|
617
480
|
{
|
|
618
481
|
type: "radio",
|
|
619
|
-
id: `${name}-${actionType}`,
|
|
620
482
|
name,
|
|
621
483
|
checked: selected === actionType,
|
|
622
484
|
onChange: handleChange,
|
|
@@ -671,7 +533,7 @@ const NoReleases = () => {
|
|
|
671
533
|
return /* @__PURE__ */ jsx(
|
|
672
534
|
EmptyStateLayout,
|
|
673
535
|
{
|
|
674
|
-
icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "
|
|
536
|
+
icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" }),
|
|
675
537
|
content: formatMessage({
|
|
676
538
|
id: "content-releases.content-manager-edit-view.add-to-release.no-releases-message",
|
|
677
539
|
defaultMessage: "No available releases. Open the list of releases and create a new one from there."
|
|
@@ -682,301 +544,192 @@ const NoReleases = () => {
|
|
|
682
544
|
to: {
|
|
683
545
|
pathname: "/plugins/content-releases"
|
|
684
546
|
},
|
|
685
|
-
|
|
547
|
+
tag: Link,
|
|
686
548
|
variant: "secondary",
|
|
687
549
|
children: formatMessage({
|
|
688
550
|
id: "content-releases.content-manager-edit-view.add-to-release.redirect-button",
|
|
689
551
|
defaultMessage: "Open the list of releases"
|
|
690
552
|
})
|
|
691
553
|
}
|
|
692
|
-
)
|
|
554
|
+
),
|
|
555
|
+
shadow: "none"
|
|
693
556
|
}
|
|
694
557
|
);
|
|
695
558
|
};
|
|
696
559
|
const AddActionToReleaseModal = ({
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
560
|
+
contentType,
|
|
561
|
+
documentId,
|
|
562
|
+
onInputChange,
|
|
563
|
+
values
|
|
700
564
|
}) => {
|
|
701
|
-
const releaseHeaderId = React.useId();
|
|
702
565
|
const { formatMessage } = useIntl();
|
|
703
|
-
const { toggleNotification } = useNotification();
|
|
704
|
-
const { formatAPIError } = useAPIErrorHandler();
|
|
705
566
|
const [{ query }] = useQueryParams();
|
|
706
567
|
const locale = query.plugins?.i18n?.locale;
|
|
707
568
|
const response = useGetReleasesForEntryQuery({
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
hasEntryAttached: false
|
|
569
|
+
contentType,
|
|
570
|
+
entryDocumentId: documentId,
|
|
571
|
+
hasEntryAttached: false,
|
|
572
|
+
locale
|
|
711
573
|
});
|
|
712
574
|
const releases = response.data?.data;
|
|
575
|
+
if (releases?.length === 0) {
|
|
576
|
+
return /* @__PURE__ */ jsx(NoReleases, {});
|
|
577
|
+
}
|
|
578
|
+
return /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
|
|
579
|
+
/* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */ jsxs(Field.Root, { required: true, children: [
|
|
580
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
581
|
+
id: "content-releases.content-manager-edit-view.add-to-release.select-label",
|
|
582
|
+
defaultMessage: "Select a release"
|
|
583
|
+
}) }),
|
|
584
|
+
/* @__PURE__ */ jsx(
|
|
585
|
+
SingleSelect,
|
|
586
|
+
{
|
|
587
|
+
required: true,
|
|
588
|
+
placeholder: formatMessage({
|
|
589
|
+
id: "content-releases.content-manager-edit-view.add-to-release.select-placeholder",
|
|
590
|
+
defaultMessage: "Select"
|
|
591
|
+
}),
|
|
592
|
+
name: "releaseId",
|
|
593
|
+
onChange: (value) => onInputChange("releaseId", value),
|
|
594
|
+
value: values.releaseId,
|
|
595
|
+
children: releases?.map((release) => /* @__PURE__ */ jsx(SingleSelectOption, { value: release.id, children: release.name }, release.id))
|
|
596
|
+
}
|
|
597
|
+
)
|
|
598
|
+
] }) }),
|
|
599
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
600
|
+
id: "content-releases.content-manager-edit-view.add-to-release.action-type-label",
|
|
601
|
+
defaultMessage: "What do you want to do with this entry?"
|
|
602
|
+
}) }),
|
|
603
|
+
/* @__PURE__ */ jsx(
|
|
604
|
+
ReleaseActionOptions,
|
|
605
|
+
{
|
|
606
|
+
selected: values.type,
|
|
607
|
+
handleChange: (e) => onInputChange("type", e.target.value),
|
|
608
|
+
name: "type"
|
|
609
|
+
}
|
|
610
|
+
)
|
|
611
|
+
] });
|
|
612
|
+
};
|
|
613
|
+
const ReleaseActionModalForm = ({
|
|
614
|
+
documentId,
|
|
615
|
+
document,
|
|
616
|
+
model,
|
|
617
|
+
collectionType
|
|
618
|
+
}) => {
|
|
619
|
+
const { formatMessage } = useIntl();
|
|
620
|
+
const { allowedActions } = useRBAC(PERMISSIONS);
|
|
621
|
+
const { canCreateAction } = allowedActions;
|
|
713
622
|
const [createReleaseAction, { isLoading }] = useCreateReleaseActionMutation();
|
|
714
|
-
const
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
if ("data" in response2) {
|
|
725
|
-
toggleNotification({
|
|
726
|
-
type: "success",
|
|
727
|
-
message: formatMessage({
|
|
728
|
-
id: "content-releases.content-manager-edit-view.add-to-release.notification.success",
|
|
729
|
-
defaultMessage: "Entry added to release"
|
|
730
|
-
})
|
|
731
|
-
});
|
|
732
|
-
handleClose();
|
|
733
|
-
return;
|
|
734
|
-
}
|
|
735
|
-
if ("error" in response2) {
|
|
736
|
-
if (isAxiosError$1(response2.error)) {
|
|
623
|
+
const { toggleNotification } = useNotification();
|
|
624
|
+
const { formatAPIError } = useAPIErrorHandler();
|
|
625
|
+
const [{ query }] = useQueryParams();
|
|
626
|
+
const locale = query.plugins?.i18n?.locale;
|
|
627
|
+
const handleSubmit = async (e, onClose) => {
|
|
628
|
+
try {
|
|
629
|
+
await formik.handleSubmit(e);
|
|
630
|
+
onClose();
|
|
631
|
+
} catch (error) {
|
|
632
|
+
if (isFetchError(error)) {
|
|
737
633
|
toggleNotification({
|
|
738
634
|
type: "danger",
|
|
739
|
-
message: formatAPIError(
|
|
635
|
+
message: formatAPIError(error)
|
|
740
636
|
});
|
|
741
637
|
} else {
|
|
742
638
|
toggleNotification({
|
|
743
639
|
type: "danger",
|
|
744
|
-
message: formatMessage({
|
|
640
|
+
message: formatMessage({
|
|
641
|
+
id: "notification.error",
|
|
642
|
+
defaultMessage: "An error occurred"
|
|
643
|
+
})
|
|
745
644
|
});
|
|
746
645
|
}
|
|
747
646
|
}
|
|
748
647
|
};
|
|
749
|
-
|
|
750
|
-
|
|
648
|
+
const formik = useFormik({
|
|
649
|
+
initialValues: INITIAL_VALUES,
|
|
650
|
+
validationSchema: RELEASE_ACTION_FORM_SCHEMA,
|
|
651
|
+
onSubmit: async (values) => {
|
|
652
|
+
if (collectionType === "collection-types" && !documentId) {
|
|
653
|
+
throw new Error("Document id is required");
|
|
654
|
+
}
|
|
655
|
+
const response = await createReleaseAction({
|
|
656
|
+
body: {
|
|
657
|
+
type: values.type,
|
|
658
|
+
contentType: model,
|
|
659
|
+
entryDocumentId: documentId,
|
|
660
|
+
locale
|
|
661
|
+
},
|
|
662
|
+
params: { releaseId: values.releaseId }
|
|
663
|
+
});
|
|
664
|
+
if ("data" in response) {
|
|
665
|
+
toggleNotification({
|
|
666
|
+
type: "success",
|
|
667
|
+
message: formatMessage({
|
|
668
|
+
id: "content-releases.content-manager-edit-view.add-to-release.notification.success",
|
|
669
|
+
defaultMessage: "Entry added to release"
|
|
670
|
+
})
|
|
671
|
+
});
|
|
672
|
+
return;
|
|
673
|
+
}
|
|
674
|
+
if ("error" in response) {
|
|
675
|
+
throw response.error;
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
});
|
|
679
|
+
const {
|
|
680
|
+
edit: { options }
|
|
681
|
+
} = unstable_useDocumentLayout(model);
|
|
682
|
+
if (!window.strapi.isEE || !options?.draftAndPublish || !canCreateAction) {
|
|
683
|
+
return null;
|
|
684
|
+
}
|
|
685
|
+
if (collectionType === "collection-types" && (!documentId || documentId === "create")) {
|
|
686
|
+
return null;
|
|
687
|
+
}
|
|
688
|
+
return {
|
|
689
|
+
label: formatMessage({
|
|
751
690
|
id: "content-releases.content-manager-edit-view.add-to-release",
|
|
752
691
|
defaultMessage: "Add to release"
|
|
753
|
-
})
|
|
754
|
-
/* @__PURE__ */ jsx(
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
/* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */ jsx(
|
|
764
|
-
SingleSelect,
|
|
765
|
-
{
|
|
766
|
-
required: true,
|
|
767
|
-
label: formatMessage({
|
|
768
|
-
id: "content-releases.content-manager-edit-view.add-to-release.select-label",
|
|
769
|
-
defaultMessage: "Select a release"
|
|
770
|
-
}),
|
|
771
|
-
placeholder: formatMessage({
|
|
772
|
-
id: "content-releases.content-manager-edit-view.add-to-release.select-placeholder",
|
|
773
|
-
defaultMessage: "Select"
|
|
774
|
-
}),
|
|
775
|
-
onChange: (value) => setFieldValue("releaseId", value),
|
|
776
|
-
value: values.releaseId,
|
|
777
|
-
children: releases?.map((release) => /* @__PURE__ */ jsx(SingleSelectOption, { value: release.id, children: release.name }, release.id))
|
|
778
|
-
}
|
|
779
|
-
) }),
|
|
780
|
-
/* @__PURE__ */ jsx(FieldLabel, { children: formatMessage({
|
|
781
|
-
id: "content-releases.content-manager-edit-view.add-to-release.action-type-label",
|
|
782
|
-
defaultMessage: "What do you want to do with this entry?"
|
|
783
|
-
}) }),
|
|
784
|
-
/* @__PURE__ */ jsx(
|
|
785
|
-
ReleaseActionOptions,
|
|
786
|
-
{
|
|
787
|
-
selected: values.type,
|
|
788
|
-
handleChange: (e) => setFieldValue("type", e.target.value),
|
|
789
|
-
name: "type"
|
|
790
|
-
}
|
|
791
|
-
)
|
|
792
|
-
] }) }),
|
|
793
|
-
/* @__PURE__ */ jsx(
|
|
794
|
-
ModalFooter,
|
|
795
|
-
{
|
|
796
|
-
startActions: /* @__PURE__ */ jsx(Button, { onClick: handleClose, variant: "tertiary", name: "cancel", children: formatMessage({
|
|
797
|
-
id: "content-releases.content-manager-edit-view.add-to-release.cancel-button",
|
|
798
|
-
defaultMessage: "Cancel"
|
|
799
|
-
}) }),
|
|
800
|
-
endActions: (
|
|
801
|
-
/**
|
|
802
|
-
* TODO: Ideally we would use isValid from Formik to disable the button, however currently it always returns true
|
|
803
|
-
* for yup.string().required(), even when the value is falsy (including empty string)
|
|
804
|
-
*/
|
|
805
|
-
/* @__PURE__ */ jsx(Button, { type: "submit", disabled: !values.releaseId, loading: isLoading, children: formatMessage({
|
|
806
|
-
id: "content-releases.content-manager-edit-view.add-to-release.continue-button",
|
|
807
|
-
defaultMessage: "Continue"
|
|
808
|
-
}) })
|
|
809
|
-
)
|
|
810
|
-
}
|
|
811
|
-
)
|
|
812
|
-
] });
|
|
813
|
-
}
|
|
814
|
-
}
|
|
815
|
-
)
|
|
816
|
-
] });
|
|
817
|
-
};
|
|
818
|
-
const CMReleasesContainer = () => {
|
|
819
|
-
const [isModalOpen, setIsModalOpen] = React.useState(false);
|
|
820
|
-
const { formatMessage, formatDate, formatTime } = useIntl();
|
|
821
|
-
const { id, slug, collectionType } = useParams();
|
|
822
|
-
const isCreatingEntry = id === "create";
|
|
823
|
-
const { allowedActions } = useRBAC(PERMISSIONS);
|
|
824
|
-
const { canCreateAction, canRead: canMain, canDeleteAction } = allowedActions;
|
|
825
|
-
const { schema } = unstable_useDocument({
|
|
826
|
-
collectionType,
|
|
827
|
-
model: slug
|
|
828
|
-
});
|
|
829
|
-
const hasDraftAndPublish = schema?.options?.draftAndPublish;
|
|
830
|
-
const contentTypeUid = slug;
|
|
831
|
-
const canFetch = id != null && contentTypeUid != null;
|
|
832
|
-
const fetchParams = canFetch ? {
|
|
833
|
-
contentTypeUid,
|
|
834
|
-
entryId: id,
|
|
835
|
-
hasEntryAttached: true
|
|
836
|
-
} : skipToken;
|
|
837
|
-
const response = useGetReleasesForEntryQuery(fetchParams);
|
|
838
|
-
const releases = response.data?.data;
|
|
839
|
-
if (!canFetch) {
|
|
840
|
-
return null;
|
|
841
|
-
}
|
|
842
|
-
if (isCreatingEntry || !hasDraftAndPublish) {
|
|
843
|
-
return null;
|
|
844
|
-
}
|
|
845
|
-
const toggleModal = () => setIsModalOpen((prev) => !prev);
|
|
846
|
-
const getReleaseColorVariant = (actionType, shade) => {
|
|
847
|
-
if (actionType === "unpublish") {
|
|
848
|
-
return `secondary${shade}`;
|
|
849
|
-
}
|
|
850
|
-
return `success${shade}`;
|
|
851
|
-
};
|
|
852
|
-
if (!canMain) {
|
|
853
|
-
return null;
|
|
854
|
-
}
|
|
855
|
-
return /* @__PURE__ */ jsxs(
|
|
856
|
-
Box,
|
|
857
|
-
{
|
|
858
|
-
as: "aside",
|
|
859
|
-
"aria-label": formatMessage({
|
|
860
|
-
id: "content-releases.plugin.name",
|
|
861
|
-
defaultMessage: "Releases"
|
|
692
|
+
}),
|
|
693
|
+
icon: /* @__PURE__ */ jsx(PaperPlane, {}),
|
|
694
|
+
// Entry is creating so we don't want to allow adding it to a release
|
|
695
|
+
disabled: !document,
|
|
696
|
+
position: ["panel", "table-row"],
|
|
697
|
+
dialog: {
|
|
698
|
+
type: "modal",
|
|
699
|
+
title: formatMessage({
|
|
700
|
+
id: "content-releases.content-manager-edit-view.add-to-release",
|
|
701
|
+
defaultMessage: "Add to release"
|
|
862
702
|
}),
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
releases
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
alignItems: "start",
|
|
880
|
-
borderWidth: "1px",
|
|
881
|
-
borderStyle: "solid",
|
|
882
|
-
borderColor: getReleaseColorVariant(release.actions[0].type, "200"),
|
|
883
|
-
overflow: "hidden",
|
|
884
|
-
hasRadius: true,
|
|
885
|
-
children: [
|
|
886
|
-
/* @__PURE__ */ jsx(
|
|
887
|
-
Box,
|
|
888
|
-
{
|
|
889
|
-
paddingTop: 3,
|
|
890
|
-
paddingBottom: 3,
|
|
891
|
-
paddingLeft: 4,
|
|
892
|
-
paddingRight: 4,
|
|
893
|
-
background: getReleaseColorVariant(release.actions[0].type, "100"),
|
|
894
|
-
width: "100%",
|
|
895
|
-
children: /* @__PURE__ */ jsx(
|
|
896
|
-
Typography,
|
|
897
|
-
{
|
|
898
|
-
fontSize: 1,
|
|
899
|
-
variant: "pi",
|
|
900
|
-
textColor: getReleaseColorVariant(release.actions[0].type, "600"),
|
|
901
|
-
children: formatMessage(
|
|
902
|
-
{
|
|
903
|
-
id: "content-releases.content-manager-edit-view.list-releases.title",
|
|
904
|
-
defaultMessage: "{isPublish, select, true {Will be published in} other {Will be unpublished in}}"
|
|
905
|
-
},
|
|
906
|
-
{ isPublish: release.actions[0].type === "publish" }
|
|
907
|
-
)
|
|
908
|
-
}
|
|
909
|
-
)
|
|
910
|
-
}
|
|
911
|
-
),
|
|
912
|
-
/* @__PURE__ */ jsx(Flex, { padding: 4, direction: "column", gap: 2, width: "100%", alignItems: "flex-start", children: /* @__PURE__ */ jsxs(Flex, { padding: 4, direction: "column", gap: 2, width: "100%", alignItems: "flex-start", children: [
|
|
913
|
-
/* @__PURE__ */ jsx(Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
|
|
914
|
-
release.scheduledAt && release.timezone && /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: formatMessage(
|
|
915
|
-
{
|
|
916
|
-
id: "content-releases.content-manager-edit-view.scheduled.date",
|
|
917
|
-
defaultMessage: "{date} at {time} ({offset})"
|
|
918
|
-
},
|
|
919
|
-
{
|
|
920
|
-
date: formatDate(new Date(release.scheduledAt), {
|
|
921
|
-
day: "2-digit",
|
|
922
|
-
month: "2-digit",
|
|
923
|
-
year: "numeric",
|
|
924
|
-
timeZone: release.timezone
|
|
925
|
-
}),
|
|
926
|
-
time: formatTime(new Date(release.scheduledAt), {
|
|
927
|
-
hourCycle: "h23",
|
|
928
|
-
timeZone: release.timezone
|
|
929
|
-
}),
|
|
930
|
-
offset: getTimezoneOffset(
|
|
931
|
-
release.timezone,
|
|
932
|
-
new Date(release.scheduledAt)
|
|
933
|
-
)
|
|
934
|
-
}
|
|
935
|
-
) }),
|
|
936
|
-
canDeleteAction ? /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: [
|
|
937
|
-
/* @__PURE__ */ jsx(ReleaseActionMenu.EditReleaseItem, { releaseId: release.id }),
|
|
938
|
-
/* @__PURE__ */ jsx(
|
|
939
|
-
ReleaseActionMenu.DeleteReleaseActionItem,
|
|
940
|
-
{
|
|
941
|
-
releaseId: release.id,
|
|
942
|
-
actionId: release.actions[0].id
|
|
943
|
-
}
|
|
944
|
-
)
|
|
945
|
-
] }) : null
|
|
946
|
-
] }) })
|
|
947
|
-
]
|
|
948
|
-
},
|
|
949
|
-
release.id
|
|
950
|
-
);
|
|
951
|
-
}),
|
|
952
|
-
canCreateAction ? /* @__PURE__ */ jsx(
|
|
953
|
-
Button,
|
|
954
|
-
{
|
|
955
|
-
justifyContent: "center",
|
|
956
|
-
paddingLeft: 4,
|
|
957
|
-
paddingRight: 4,
|
|
958
|
-
color: "neutral700",
|
|
959
|
-
variant: "tertiary",
|
|
960
|
-
startIcon: /* @__PURE__ */ jsx(Plus, {}),
|
|
961
|
-
onClick: toggleModal,
|
|
962
|
-
children: formatMessage({
|
|
963
|
-
id: "content-releases.content-manager-edit-view.add-to-release",
|
|
964
|
-
defaultMessage: "Add to release"
|
|
965
|
-
})
|
|
966
|
-
}
|
|
967
|
-
) : null
|
|
968
|
-
] }),
|
|
969
|
-
isModalOpen && /* @__PURE__ */ jsx(
|
|
970
|
-
AddActionToReleaseModal,
|
|
703
|
+
content: /* @__PURE__ */ jsx(
|
|
704
|
+
AddActionToReleaseModal,
|
|
705
|
+
{
|
|
706
|
+
contentType: model,
|
|
707
|
+
documentId,
|
|
708
|
+
onInputChange: formik.setFieldValue,
|
|
709
|
+
values: formik.values
|
|
710
|
+
}
|
|
711
|
+
),
|
|
712
|
+
footer: ({ onClose }) => /* @__PURE__ */ jsxs(Modal.Footer, { children: [
|
|
713
|
+
/* @__PURE__ */ jsx(Button, { onClick: onClose, variant: "tertiary", name: "cancel", children: formatMessage({
|
|
714
|
+
id: "content-releases.content-manager-edit-view.add-to-release.cancel-button",
|
|
715
|
+
defaultMessage: "Cancel"
|
|
716
|
+
}) }),
|
|
717
|
+
/* @__PURE__ */ jsx(
|
|
718
|
+
Button,
|
|
971
719
|
{
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
720
|
+
type: "submit",
|
|
721
|
+
onClick: (e) => handleSubmit(e, onClose),
|
|
722
|
+
disabled: !formik.values.releaseId,
|
|
723
|
+
loading: isLoading,
|
|
724
|
+
children: formatMessage({
|
|
725
|
+
id: "content-releases.content-manager-edit-view.add-to-release.continue-button",
|
|
726
|
+
defaultMessage: "Continue"
|
|
727
|
+
})
|
|
975
728
|
}
|
|
976
729
|
)
|
|
977
|
-
]
|
|
730
|
+
] })
|
|
978
731
|
}
|
|
979
|
-
|
|
732
|
+
};
|
|
980
733
|
};
|
|
981
734
|
const getContentPermissions = (subject) => {
|
|
982
735
|
const permissions = {
|
|
@@ -993,7 +746,7 @@ const getContentPermissions = (subject) => {
|
|
|
993
746
|
};
|
|
994
747
|
return permissions;
|
|
995
748
|
};
|
|
996
|
-
const ReleaseAction = ({
|
|
749
|
+
const ReleaseAction = ({ documents, model }) => {
|
|
997
750
|
const { formatMessage } = useIntl();
|
|
998
751
|
const { toggleNotification } = useNotification();
|
|
999
752
|
const { formatAPIError } = useAPIErrorHandler();
|
|
@@ -1008,16 +761,15 @@ const ReleaseAction = ({ documentIds, model }) => {
|
|
|
1008
761
|
const response = useGetReleasesQuery();
|
|
1009
762
|
const releases = response.data?.data;
|
|
1010
763
|
const [createManyReleaseActions, { isLoading }] = useCreateManyReleaseActionsMutation();
|
|
764
|
+
const documentIds = documents.map((doc) => doc.documentId);
|
|
1011
765
|
const handleSubmit = async (values) => {
|
|
1012
766
|
const locale = query.plugins?.i18n?.locale;
|
|
1013
767
|
const releaseActionEntries = documentIds.map(
|
|
1014
|
-
(
|
|
768
|
+
(entryDocumentId) => ({
|
|
1015
769
|
type: values.type,
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
locale
|
|
1020
|
-
}
|
|
770
|
+
contentType: model,
|
|
771
|
+
entryDocumentId,
|
|
772
|
+
locale
|
|
1021
773
|
})
|
|
1022
774
|
);
|
|
1023
775
|
const response2 = await createManyReleaseActions({
|
|
@@ -1053,7 +805,7 @@ const ReleaseAction = ({ documentIds, model }) => {
|
|
|
1053
805
|
return true;
|
|
1054
806
|
}
|
|
1055
807
|
if ("error" in response2) {
|
|
1056
|
-
if (
|
|
808
|
+
if (isFetchError(response2.error)) {
|
|
1057
809
|
toggleNotification({
|
|
1058
810
|
type: "warning",
|
|
1059
811
|
message: formatAPIError(response2.error)
|
|
@@ -1066,8 +818,7 @@ const ReleaseAction = ({ documentIds, model }) => {
|
|
|
1066
818
|
}
|
|
1067
819
|
}
|
|
1068
820
|
};
|
|
1069
|
-
if (!canCreate || !canPublish)
|
|
1070
|
-
return null;
|
|
821
|
+
if (!canCreate || !canPublish) return null;
|
|
1071
822
|
return {
|
|
1072
823
|
actionType: "release",
|
|
1073
824
|
variant: "tertiary",
|
|
@@ -1094,25 +845,26 @@ const ReleaseAction = ({ documentIds, model }) => {
|
|
|
1094
845
|
validationSchema: RELEASE_ACTION_FORM_SCHEMA,
|
|
1095
846
|
initialValues: INITIAL_VALUES,
|
|
1096
847
|
children: ({ values, setFieldValue }) => /* @__PURE__ */ jsxs(Form, { children: [
|
|
1097
|
-
releases?.length === 0 ? /* @__PURE__ */ jsx(NoReleases, {}) : /* @__PURE__ */ jsx(
|
|
1098
|
-
/* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
848
|
+
releases?.length === 0 ? /* @__PURE__ */ jsx(NoReleases, {}) : /* @__PURE__ */ jsx(Modal.Body, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
|
|
849
|
+
/* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */ jsxs(Field.Root, { required: true, children: [
|
|
850
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
851
|
+
id: "content-releases.content-manager-list-view.add-to-release.select-label",
|
|
852
|
+
defaultMessage: "Select a release"
|
|
853
|
+
}) }),
|
|
854
|
+
/* @__PURE__ */ jsx(
|
|
855
|
+
SingleSelect,
|
|
856
|
+
{
|
|
857
|
+
placeholder: formatMessage({
|
|
858
|
+
id: "content-releases.content-manager-list-view.add-to-release.select-placeholder",
|
|
859
|
+
defaultMessage: "Select"
|
|
860
|
+
}),
|
|
861
|
+
onChange: (value) => setFieldValue("releaseId", value),
|
|
862
|
+
value: values.releaseId,
|
|
863
|
+
children: releases?.map((release) => /* @__PURE__ */ jsx(SingleSelectOption, { value: release.id, children: release.name }, release.id))
|
|
864
|
+
}
|
|
865
|
+
)
|
|
866
|
+
] }) }),
|
|
867
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
1116
868
|
id: "content-releases.content-manager-list-view.add-to-release.action-type-label",
|
|
1117
869
|
defaultMessage: "What do you want to do with these entries?"
|
|
1118
870
|
}) }),
|
|
@@ -1125,25 +877,16 @@ const ReleaseAction = ({ documentIds, model }) => {
|
|
|
1125
877
|
}
|
|
1126
878
|
)
|
|
1127
879
|
] }) }),
|
|
1128
|
-
/* @__PURE__ */
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
* for yup.string().required(), even when the value is falsy (including empty string)
|
|
1139
|
-
*/
|
|
1140
|
-
/* @__PURE__ */ jsx(Button, { type: "submit", disabled: !values.releaseId, loading: isLoading, children: formatMessage({
|
|
1141
|
-
id: "content-releases.content-manager-list-view.add-to-release.continue-button",
|
|
1142
|
-
defaultMessage: "Continue"
|
|
1143
|
-
}) })
|
|
1144
|
-
)
|
|
1145
|
-
}
|
|
1146
|
-
)
|
|
880
|
+
/* @__PURE__ */ jsxs(Modal.Footer, { children: [
|
|
881
|
+
/* @__PURE__ */ jsx(Button, { onClick: onClose, variant: "tertiary", name: "cancel", children: formatMessage({
|
|
882
|
+
id: "content-releases.content-manager-list-view.add-to-release.cancel-button",
|
|
883
|
+
defaultMessage: "Cancel"
|
|
884
|
+
}) }),
|
|
885
|
+
/* @__PURE__ */ jsx(Button, { type: "submit", disabled: !values.releaseId, loading: isLoading, children: formatMessage({
|
|
886
|
+
id: "content-releases.content-manager-list-view.add-to-release.continue-button",
|
|
887
|
+
defaultMessage: "Continue"
|
|
888
|
+
}) })
|
|
889
|
+
] })
|
|
1147
890
|
] })
|
|
1148
891
|
}
|
|
1149
892
|
);
|
|
@@ -1151,10 +894,386 @@ const ReleaseAction = ({ documentIds, model }) => {
|
|
|
1151
894
|
}
|
|
1152
895
|
};
|
|
1153
896
|
};
|
|
1154
|
-
const
|
|
1155
|
-
|
|
1156
|
-
|
|
897
|
+
const useReleasesList = (contentTypeUid, documentId) => {
|
|
898
|
+
const listViewData = useTable("ListView", (state) => state.rows);
|
|
899
|
+
const documentIds = listViewData.map((entry) => entry.documentId);
|
|
900
|
+
const [{ query }] = useQueryParams();
|
|
901
|
+
const locale = query?.plugins?.i18n?.locale || void 0;
|
|
902
|
+
const response = useGetMappedEntriesInReleasesQuery(
|
|
903
|
+
{ contentTypeUid, documentIds, locale },
|
|
904
|
+
{ skip: !documentIds || !contentTypeUid || documentIds.length === 0 }
|
|
905
|
+
);
|
|
906
|
+
const mappedEntriesInReleases = response.data || {};
|
|
907
|
+
return mappedEntriesInReleases?.[documentId] || [];
|
|
908
|
+
};
|
|
909
|
+
const addColumnToTableHook = ({ displayedHeaders, layout }) => {
|
|
910
|
+
const { options } = layout;
|
|
911
|
+
if (!options?.draftAndPublish) {
|
|
912
|
+
return { displayedHeaders, layout };
|
|
1157
913
|
}
|
|
914
|
+
return {
|
|
915
|
+
displayedHeaders: [
|
|
916
|
+
...displayedHeaders,
|
|
917
|
+
{
|
|
918
|
+
searchable: false,
|
|
919
|
+
sortable: false,
|
|
920
|
+
name: "releases",
|
|
921
|
+
label: {
|
|
922
|
+
id: "content-releases.content-manager.list-view.releases.header",
|
|
923
|
+
defaultMessage: "To be released in"
|
|
924
|
+
},
|
|
925
|
+
cellFormatter: (props, _, { model }) => /* @__PURE__ */ jsx(ReleaseListCell, { ...props, model })
|
|
926
|
+
}
|
|
927
|
+
],
|
|
928
|
+
layout
|
|
929
|
+
};
|
|
930
|
+
};
|
|
931
|
+
const ReleaseListCell = ({ documentId, model }) => {
|
|
932
|
+
const releases = useReleasesList(model, documentId);
|
|
933
|
+
const { formatMessage } = useIntl();
|
|
934
|
+
return /* @__PURE__ */ jsxs(Popover.Root, { children: [
|
|
935
|
+
/* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(
|
|
936
|
+
Button,
|
|
937
|
+
{
|
|
938
|
+
variant: "ghost",
|
|
939
|
+
onClick: (e) => e.stopPropagation(),
|
|
940
|
+
endIcon: releases.length > 0 ? /* @__PURE__ */ jsx(CaretDown, { width: "1.2rem", height: "1.2rem" }) : null,
|
|
941
|
+
children: /* @__PURE__ */ jsx(
|
|
942
|
+
Typography,
|
|
943
|
+
{
|
|
944
|
+
style: { maxWidth: "252px", cursor: "pointer" },
|
|
945
|
+
textColor: "neutral800",
|
|
946
|
+
fontWeight: "regular",
|
|
947
|
+
children: releases.length > 0 ? formatMessage(
|
|
948
|
+
{
|
|
949
|
+
id: "content-releases.content-manager.list-view.releases-number",
|
|
950
|
+
defaultMessage: "{number} {number, plural, one {release} other {releases}}"
|
|
951
|
+
},
|
|
952
|
+
{
|
|
953
|
+
number: releases.length
|
|
954
|
+
}
|
|
955
|
+
) : "-"
|
|
956
|
+
}
|
|
957
|
+
)
|
|
958
|
+
}
|
|
959
|
+
) }),
|
|
960
|
+
/* @__PURE__ */ jsx(Popover.Content, { children: /* @__PURE__ */ jsx("ul", { children: releases.map(({ id, name }) => /* @__PURE__ */ jsx(Box, { padding: 3, tag: "li", children: /* @__PURE__ */ jsx(Link$1, { href: `/admin/plugins/content-releases/${id}`, isExternal: false, children: name }) }, id)) }) })
|
|
961
|
+
] });
|
|
962
|
+
};
|
|
963
|
+
const getTimezoneOffset = (timezone, date) => {
|
|
964
|
+
try {
|
|
965
|
+
const offsetPart = new Intl.DateTimeFormat("en", {
|
|
966
|
+
timeZone: timezone,
|
|
967
|
+
timeZoneName: "longOffset"
|
|
968
|
+
}).formatToParts(date).find((part) => part.type === "timeZoneName");
|
|
969
|
+
const offset = offsetPart ? offsetPart.value : "";
|
|
970
|
+
let utcOffset = offset.replace("GMT", "UTC");
|
|
971
|
+
if (!utcOffset.includes("+") && !utcOffset.includes("-")) {
|
|
972
|
+
utcOffset = `${utcOffset}+00:00`;
|
|
973
|
+
}
|
|
974
|
+
return utcOffset;
|
|
975
|
+
} catch (error) {
|
|
976
|
+
return "";
|
|
977
|
+
}
|
|
978
|
+
};
|
|
979
|
+
const getTimezones = (selectedDate) => {
|
|
980
|
+
const timezoneList = Intl.supportedValuesOf("timeZone").map((timezone) => {
|
|
981
|
+
const utcOffset = getTimezoneOffset(timezone, selectedDate);
|
|
982
|
+
return { offset: utcOffset, value: `${utcOffset}&${timezone}` };
|
|
983
|
+
});
|
|
984
|
+
const systemTimezone = timezoneList.find(
|
|
985
|
+
(timezone) => timezone.value.split("&")[1] === Intl.DateTimeFormat().resolvedOptions().timeZone
|
|
986
|
+
);
|
|
987
|
+
return { timezoneList, systemTimezone };
|
|
988
|
+
};
|
|
989
|
+
const StyledMenuItem = styled(Menu.Item)`
|
|
990
|
+
&:hover {
|
|
991
|
+
background: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}100`]};
|
|
992
|
+
|
|
993
|
+
svg {
|
|
994
|
+
fill: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}600`]};
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
a {
|
|
998
|
+
color: ${({ theme }) => theme.colors.neutral800};
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
svg {
|
|
1003
|
+
color: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}500`]};
|
|
1004
|
+
}
|
|
1005
|
+
|
|
1006
|
+
span {
|
|
1007
|
+
color: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}800`]};
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
span,
|
|
1011
|
+
a {
|
|
1012
|
+
width: 100%;
|
|
1013
|
+
}
|
|
1014
|
+
`;
|
|
1015
|
+
const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
|
|
1016
|
+
const { formatMessage } = useIntl();
|
|
1017
|
+
const { toggleNotification } = useNotification();
|
|
1018
|
+
const { formatAPIError } = useAPIErrorHandler();
|
|
1019
|
+
const [deleteReleaseAction] = useDeleteReleaseActionMutation();
|
|
1020
|
+
const {
|
|
1021
|
+
allowedActions: { canDeleteAction }
|
|
1022
|
+
} = useRBAC(PERMISSIONS);
|
|
1023
|
+
const handleDeleteAction = async () => {
|
|
1024
|
+
const response = await deleteReleaseAction({
|
|
1025
|
+
params: { releaseId, actionId }
|
|
1026
|
+
});
|
|
1027
|
+
if ("data" in response) {
|
|
1028
|
+
toggleNotification({
|
|
1029
|
+
type: "success",
|
|
1030
|
+
message: formatMessage({
|
|
1031
|
+
id: "content-releases.content-manager-edit-view.remove-from-release.notification.success",
|
|
1032
|
+
defaultMessage: "Entry removed from release"
|
|
1033
|
+
})
|
|
1034
|
+
});
|
|
1035
|
+
return;
|
|
1036
|
+
}
|
|
1037
|
+
if ("error" in response) {
|
|
1038
|
+
if (isFetchError(response.error)) {
|
|
1039
|
+
toggleNotification({
|
|
1040
|
+
type: "danger",
|
|
1041
|
+
message: formatAPIError(response.error)
|
|
1042
|
+
});
|
|
1043
|
+
} else {
|
|
1044
|
+
toggleNotification({
|
|
1045
|
+
type: "danger",
|
|
1046
|
+
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
1047
|
+
});
|
|
1048
|
+
}
|
|
1049
|
+
}
|
|
1050
|
+
};
|
|
1051
|
+
if (!canDeleteAction) {
|
|
1052
|
+
return null;
|
|
1053
|
+
}
|
|
1054
|
+
return /* @__PURE__ */ jsx(StyledMenuItem, { $variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
1055
|
+
/* @__PURE__ */ jsx(Cross, { width: "1.6rem", height: "1.6rem" }),
|
|
1056
|
+
/* @__PURE__ */ jsx(Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
|
|
1057
|
+
id: "content-releases.content-manager-edit-view.remove-from-release",
|
|
1058
|
+
defaultMessage: "Remove from release"
|
|
1059
|
+
}) })
|
|
1060
|
+
] }) });
|
|
1061
|
+
};
|
|
1062
|
+
const ReleaseActionEntryLinkItem = ({
|
|
1063
|
+
contentTypeUid,
|
|
1064
|
+
documentId,
|
|
1065
|
+
locale
|
|
1066
|
+
}) => {
|
|
1067
|
+
const { formatMessage } = useIntl();
|
|
1068
|
+
const userPermissions = useAuth("ReleaseActionEntryLinkItem", (state) => state.permissions);
|
|
1069
|
+
const canUpdateEntryForLocale = React.useMemo(() => {
|
|
1070
|
+
const updatePermissions = userPermissions.find(
|
|
1071
|
+
(permission) => permission.subject === contentTypeUid && permission.action === "plugin::content-manager.explorer.update"
|
|
1072
|
+
);
|
|
1073
|
+
if (!updatePermissions) {
|
|
1074
|
+
return false;
|
|
1075
|
+
}
|
|
1076
|
+
return Boolean(!locale || updatePermissions.properties?.locales?.includes(locale));
|
|
1077
|
+
}, [contentTypeUid, locale, userPermissions]);
|
|
1078
|
+
const {
|
|
1079
|
+
allowedActions: { canUpdate: canUpdateContentType }
|
|
1080
|
+
} = useRBAC({
|
|
1081
|
+
updateContentType: [
|
|
1082
|
+
{
|
|
1083
|
+
action: "plugin::content-manager.explorer.update",
|
|
1084
|
+
subject: contentTypeUid
|
|
1085
|
+
}
|
|
1086
|
+
]
|
|
1087
|
+
});
|
|
1088
|
+
if (!canUpdateContentType || !canUpdateEntryForLocale) {
|
|
1089
|
+
return null;
|
|
1090
|
+
}
|
|
1091
|
+
return /* @__PURE__ */ jsx(
|
|
1092
|
+
StyledMenuItem,
|
|
1093
|
+
{
|
|
1094
|
+
tag: NavLink,
|
|
1095
|
+
isLink: true,
|
|
1096
|
+
to: {
|
|
1097
|
+
pathname: `/content-manager/collection-types/${contentTypeUid}/${documentId}`,
|
|
1098
|
+
search: locale && `?plugins[i18n][locale]=${locale}`
|
|
1099
|
+
},
|
|
1100
|
+
children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
1101
|
+
/* @__PURE__ */ jsx(Pencil, { width: "1.6rem", height: "1.6rem" }),
|
|
1102
|
+
/* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
|
|
1103
|
+
id: "content-releases.content-manager-edit-view.edit-entry",
|
|
1104
|
+
defaultMessage: "Edit entry"
|
|
1105
|
+
}) })
|
|
1106
|
+
] })
|
|
1107
|
+
}
|
|
1108
|
+
);
|
|
1109
|
+
};
|
|
1110
|
+
const EditReleaseItem = ({ releaseId }) => {
|
|
1111
|
+
const { formatMessage } = useIntl();
|
|
1112
|
+
return (
|
|
1113
|
+
/* @ts-expect-error inference isn't working in DS */
|
|
1114
|
+
/* @__PURE__ */ jsx(StyledMenuItem, { tag: NavLink, isLink: true, to: `/plugins/content-releases/${releaseId}`, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
1115
|
+
/* @__PURE__ */ jsx(Pencil, { width: "1.6rem", height: "1.6rem" }),
|
|
1116
|
+
/* @__PURE__ */ jsx(Typography, { textColor: "neutral800", variant: "omega", children: formatMessage({
|
|
1117
|
+
id: "content-releases.content-manager-edit-view.edit-release",
|
|
1118
|
+
defaultMessage: "Edit release"
|
|
1119
|
+
}) })
|
|
1120
|
+
] }) })
|
|
1121
|
+
);
|
|
1122
|
+
};
|
|
1123
|
+
const Root = ({ children }) => {
|
|
1124
|
+
const { formatMessage } = useIntl();
|
|
1125
|
+
const { allowedActions } = useRBAC(PERMISSIONS);
|
|
1126
|
+
return (
|
|
1127
|
+
// A user can access the dropdown if they have permissions to delete a release-action OR update a release
|
|
1128
|
+
allowedActions.canDeleteAction || allowedActions.canUpdate ? /* @__PURE__ */ jsxs(Menu.Root, { children: [
|
|
1129
|
+
/* @__PURE__ */ jsx(StyledMoreButton, { variant: "tertiary", endIcon: null, paddingLeft: "7px", paddingRight: "7px", children: /* @__PURE__ */ jsx(
|
|
1130
|
+
AccessibleIcon,
|
|
1131
|
+
{
|
|
1132
|
+
label: formatMessage({
|
|
1133
|
+
id: "content-releases.content-manager-edit-view.release-action-menu",
|
|
1134
|
+
defaultMessage: "Release action options"
|
|
1135
|
+
}),
|
|
1136
|
+
children: /* @__PURE__ */ jsx(More, {})
|
|
1137
|
+
}
|
|
1138
|
+
) }),
|
|
1139
|
+
/* @__PURE__ */ jsx(Menu.Content, { top: 1, popoverPlacement: "bottom-end", children })
|
|
1140
|
+
] }) : null
|
|
1141
|
+
);
|
|
1142
|
+
};
|
|
1143
|
+
const StyledMoreButton = styled(Menu.Trigger)`
|
|
1144
|
+
& > span {
|
|
1145
|
+
display: flex;
|
|
1146
|
+
}
|
|
1147
|
+
`;
|
|
1148
|
+
const ReleaseActionMenu = {
|
|
1149
|
+
Root,
|
|
1150
|
+
EditReleaseItem,
|
|
1151
|
+
DeleteReleaseActionItem,
|
|
1152
|
+
ReleaseActionEntryLinkItem
|
|
1153
|
+
};
|
|
1154
|
+
const Panel = ({
|
|
1155
|
+
model,
|
|
1156
|
+
document,
|
|
1157
|
+
documentId,
|
|
1158
|
+
collectionType
|
|
1159
|
+
}) => {
|
|
1160
|
+
const [{ query }] = useQueryParams();
|
|
1161
|
+
const locale = query.plugins?.i18n?.locale;
|
|
1162
|
+
const {
|
|
1163
|
+
edit: { options }
|
|
1164
|
+
} = unstable_useDocumentLayout(model);
|
|
1165
|
+
const { formatMessage, formatDate, formatTime } = useIntl();
|
|
1166
|
+
const { allowedActions } = useRBAC(PERMISSIONS);
|
|
1167
|
+
const { canRead, canDeleteAction } = allowedActions;
|
|
1168
|
+
const response = useGetReleasesForEntryQuery(
|
|
1169
|
+
{
|
|
1170
|
+
contentType: model,
|
|
1171
|
+
entryDocumentId: documentId,
|
|
1172
|
+
locale,
|
|
1173
|
+
hasEntryAttached: true
|
|
1174
|
+
},
|
|
1175
|
+
{
|
|
1176
|
+
skip: !document
|
|
1177
|
+
}
|
|
1178
|
+
);
|
|
1179
|
+
const releases = response.data?.data;
|
|
1180
|
+
const getReleaseColorVariant = (actionType, shade) => {
|
|
1181
|
+
if (actionType === "unpublish") {
|
|
1182
|
+
return `secondary${shade}`;
|
|
1183
|
+
}
|
|
1184
|
+
return `success${shade}`;
|
|
1185
|
+
};
|
|
1186
|
+
if (!window.strapi.isEE || !options?.draftAndPublish || !canRead) {
|
|
1187
|
+
return null;
|
|
1188
|
+
}
|
|
1189
|
+
if (collectionType === "collection-types" && (!documentId || documentId === "create")) {
|
|
1190
|
+
return null;
|
|
1191
|
+
}
|
|
1192
|
+
if (!releases || releases.length === 0) {
|
|
1193
|
+
return null;
|
|
1194
|
+
}
|
|
1195
|
+
return {
|
|
1196
|
+
title: formatMessage({
|
|
1197
|
+
id: "content-releases.plugin.name",
|
|
1198
|
+
defaultMessage: "Releases"
|
|
1199
|
+
}),
|
|
1200
|
+
content: /* @__PURE__ */ jsx(Flex, { direction: "column", alignItems: "stretch", gap: 3, width: "100%", children: releases?.map((release) => /* @__PURE__ */ jsxs(
|
|
1201
|
+
Flex,
|
|
1202
|
+
{
|
|
1203
|
+
direction: "column",
|
|
1204
|
+
alignItems: "start",
|
|
1205
|
+
borderWidth: "1px",
|
|
1206
|
+
borderStyle: "solid",
|
|
1207
|
+
borderColor: getReleaseColorVariant(release.actions[0].type, "200"),
|
|
1208
|
+
overflow: "hidden",
|
|
1209
|
+
hasRadius: true,
|
|
1210
|
+
children: [
|
|
1211
|
+
/* @__PURE__ */ jsx(
|
|
1212
|
+
Box,
|
|
1213
|
+
{
|
|
1214
|
+
paddingTop: 3,
|
|
1215
|
+
paddingBottom: 3,
|
|
1216
|
+
paddingLeft: 4,
|
|
1217
|
+
paddingRight: 4,
|
|
1218
|
+
background: getReleaseColorVariant(release.actions[0].type, "100"),
|
|
1219
|
+
width: "100%",
|
|
1220
|
+
children: /* @__PURE__ */ jsx(
|
|
1221
|
+
Typography,
|
|
1222
|
+
{
|
|
1223
|
+
fontSize: 1,
|
|
1224
|
+
variant: "pi",
|
|
1225
|
+
textColor: getReleaseColorVariant(release.actions[0].type, "600"),
|
|
1226
|
+
children: formatMessage(
|
|
1227
|
+
{
|
|
1228
|
+
id: "content-releases.content-manager-edit-view.list-releases.title",
|
|
1229
|
+
defaultMessage: "{isPublish, select, true {Will be published in} other {Will be unpublished in}}"
|
|
1230
|
+
},
|
|
1231
|
+
{ isPublish: release.actions[0].type === "publish" }
|
|
1232
|
+
)
|
|
1233
|
+
}
|
|
1234
|
+
)
|
|
1235
|
+
}
|
|
1236
|
+
),
|
|
1237
|
+
/* @__PURE__ */ jsxs(Flex, { padding: 4, direction: "column", gap: 2, width: "100%", alignItems: "flex-start", children: [
|
|
1238
|
+
/* @__PURE__ */ jsx(Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
|
|
1239
|
+
release.scheduledAt && release.timezone && /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: formatMessage(
|
|
1240
|
+
{
|
|
1241
|
+
id: "content-releases.content-manager-edit-view.scheduled.date",
|
|
1242
|
+
defaultMessage: "{date} at {time} ({offset})"
|
|
1243
|
+
},
|
|
1244
|
+
{
|
|
1245
|
+
date: formatDate(new Date(release.scheduledAt), {
|
|
1246
|
+
day: "2-digit",
|
|
1247
|
+
month: "2-digit",
|
|
1248
|
+
year: "numeric",
|
|
1249
|
+
timeZone: release.timezone
|
|
1250
|
+
}),
|
|
1251
|
+
time: formatTime(new Date(release.scheduledAt), {
|
|
1252
|
+
hourCycle: "h23",
|
|
1253
|
+
timeZone: release.timezone
|
|
1254
|
+
}),
|
|
1255
|
+
offset: getTimezoneOffset(release.timezone, new Date(release.scheduledAt))
|
|
1256
|
+
}
|
|
1257
|
+
) }),
|
|
1258
|
+
canDeleteAction ? /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: [
|
|
1259
|
+
/* @__PURE__ */ jsx(ReleaseActionMenu.EditReleaseItem, { releaseId: release.id }),
|
|
1260
|
+
/* @__PURE__ */ jsx(
|
|
1261
|
+
ReleaseActionMenu.DeleteReleaseActionItem,
|
|
1262
|
+
{
|
|
1263
|
+
releaseId: release.id,
|
|
1264
|
+
actionId: release.actions[0].id
|
|
1265
|
+
}
|
|
1266
|
+
)
|
|
1267
|
+
] }) : null
|
|
1268
|
+
] })
|
|
1269
|
+
]
|
|
1270
|
+
},
|
|
1271
|
+
release.id
|
|
1272
|
+
)) })
|
|
1273
|
+
};
|
|
1274
|
+
};
|
|
1275
|
+
const pluginId = "content-releases";
|
|
1276
|
+
const prefixPluginTranslations = (trad, pluginId2) => {
|
|
1158
1277
|
return Object.keys(trad).reduce((acc, current) => {
|
|
1159
1278
|
acc[`${pluginId2}.${current}`] = trad[current];
|
|
1160
1279
|
return acc;
|
|
@@ -1172,43 +1291,63 @@ const admin = {
|
|
|
1172
1291
|
id: `${pluginId}.plugin.name`,
|
|
1173
1292
|
defaultMessage: "Releases"
|
|
1174
1293
|
},
|
|
1175
|
-
Component: () => import("./App-
|
|
1176
|
-
permissions: PERMISSIONS.main
|
|
1177
|
-
|
|
1178
|
-
app.addMiddlewares([() => releaseApi.middleware]);
|
|
1179
|
-
app.addReducers({
|
|
1180
|
-
[releaseApi.reducerPath]: releaseApi.reducer
|
|
1181
|
-
});
|
|
1182
|
-
app.getPlugin("content-manager").injectComponent("editView", "right-links", {
|
|
1183
|
-
name: `${pluginId}-link`,
|
|
1184
|
-
Component: CMReleasesContainer
|
|
1294
|
+
Component: () => import("./App-CiZCkScI.mjs").then((mod) => ({ default: mod.App })),
|
|
1295
|
+
permissions: PERMISSIONS.main,
|
|
1296
|
+
position: 2
|
|
1185
1297
|
});
|
|
1186
|
-
app.
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1298
|
+
const contentManagerPluginApis = app.getPlugin("content-manager").apis;
|
|
1299
|
+
if ("addEditViewSidePanel" in contentManagerPluginApis && typeof contentManagerPluginApis.addEditViewSidePanel === "function") {
|
|
1300
|
+
contentManagerPluginApis.addEditViewSidePanel([Panel]);
|
|
1301
|
+
}
|
|
1302
|
+
if ("addDocumentAction" in contentManagerPluginApis && typeof contentManagerPluginApis.addDocumentAction === "function") {
|
|
1303
|
+
contentManagerPluginApis.addDocumentAction((actions) => {
|
|
1304
|
+
const indexOfDeleteAction = actions.findIndex((action) => action.type === "unpublish");
|
|
1305
|
+
actions.splice(indexOfDeleteAction, 0, ReleaseActionModalForm);
|
|
1306
|
+
return actions;
|
|
1307
|
+
});
|
|
1308
|
+
}
|
|
1309
|
+
app.addSettingsLink("global", {
|
|
1310
|
+
id: pluginId,
|
|
1311
|
+
to: "releases",
|
|
1312
|
+
intlLabel: {
|
|
1313
|
+
id: `${pluginId}.plugin.name`,
|
|
1314
|
+
defaultMessage: "Releases"
|
|
1315
|
+
},
|
|
1316
|
+
permissions: [],
|
|
1317
|
+
async Component() {
|
|
1318
|
+
const { ProtectedReleasesSettingsPage } = await import("./ReleasesSettingsPage-DQT8N3A-.mjs");
|
|
1319
|
+
return { default: ProtectedReleasesSettingsPage };
|
|
1320
|
+
}
|
|
1190
1321
|
});
|
|
1322
|
+
if ("addBulkAction" in contentManagerPluginApis && typeof contentManagerPluginApis.addBulkAction === "function") {
|
|
1323
|
+
contentManagerPluginApis.addBulkAction((actions) => {
|
|
1324
|
+
const deleteActionIndex = actions.findIndex((action) => action.type === "delete");
|
|
1325
|
+
actions.splice(deleteActionIndex, 0, ReleaseAction);
|
|
1326
|
+
return actions;
|
|
1327
|
+
});
|
|
1328
|
+
}
|
|
1329
|
+
app.registerHook("Admin/CM/pages/ListView/inject-column-in-table", addColumnToTableHook);
|
|
1191
1330
|
} else if (!window.strapi.features.isEnabled("cms-content-releases") && window.strapi?.flags?.promoteEE) {
|
|
1192
|
-
app.
|
|
1193
|
-
|
|
1194
|
-
|
|
1331
|
+
app.addSettingsLink("global", {
|
|
1332
|
+
id: pluginId,
|
|
1333
|
+
to: "/plugins/purchase-content-releases",
|
|
1195
1334
|
intlLabel: {
|
|
1196
1335
|
id: `${pluginId}.plugin.name`,
|
|
1197
1336
|
defaultMessage: "Releases"
|
|
1198
1337
|
},
|
|
1199
1338
|
permissions: [],
|
|
1200
1339
|
async Component() {
|
|
1201
|
-
const { PurchaseContentReleases } = await import("./PurchaseContentReleases-
|
|
1340
|
+
const { PurchaseContentReleases } = await import("./PurchaseContentReleases-D-n-w-st.mjs");
|
|
1202
1341
|
return { default: PurchaseContentReleases };
|
|
1203
1342
|
},
|
|
1204
|
-
|
|
1343
|
+
licenseOnly: true
|
|
1205
1344
|
});
|
|
1206
1345
|
}
|
|
1207
1346
|
},
|
|
1208
1347
|
async registerTrads({ locales }) {
|
|
1209
1348
|
const importedTrads = await Promise.all(
|
|
1210
1349
|
locales.map((locale) => {
|
|
1211
|
-
return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-
|
|
1350
|
+
return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-D9Q4YW03.mjs") }), `./translations/${locale}.json`, 3).then(({ default: data }) => {
|
|
1212
1351
|
return {
|
|
1213
1352
|
data: prefixPluginTranslations(data, "content-releases"),
|
|
1214
1353
|
locale
|
|
@@ -1227,19 +1366,21 @@ const admin = {
|
|
|
1227
1366
|
export {
|
|
1228
1367
|
PERMISSIONS as P,
|
|
1229
1368
|
ReleaseActionOptions as R,
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1369
|
+
useGetReleaseSettingsQuery as a,
|
|
1370
|
+
useCreateReleaseMutation as b,
|
|
1371
|
+
useGetReleaseQuery as c,
|
|
1372
|
+
useUpdateReleaseMutation as d,
|
|
1373
|
+
useDeleteReleaseMutation as e,
|
|
1374
|
+
usePublishReleaseMutation as f,
|
|
1375
|
+
getTimezones as g,
|
|
1376
|
+
getTimezoneOffset as h,
|
|
1377
|
+
useGetReleaseActionsQuery as i,
|
|
1378
|
+
useUpdateReleaseActionMutation as j,
|
|
1379
|
+
ReleaseActionMenu as k,
|
|
1380
|
+
useUpdateReleaseSettingsMutation as l,
|
|
1381
|
+
admin as m,
|
|
1241
1382
|
pluginId as p,
|
|
1242
1383
|
releaseApi as r,
|
|
1243
1384
|
useGetReleasesQuery as u
|
|
1244
1385
|
};
|
|
1245
|
-
//# sourceMappingURL=index-
|
|
1386
|
+
//# sourceMappingURL=index-BjvFfTtA.mjs.map
|