@strapi/content-releases 5.9.0 → 5.10.1

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