@strapi/content-releases 0.0.0-next.f4ff842a3cb7b83db540bee67554b704e042b042 → 0.0.0-next.f698d55751345c4ca87477ef683475c1a68f310a

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 (143) hide show
  1. package/LICENSE +17 -1
  2. package/dist/_chunks/App-Cx72FM22.mjs +1558 -0
  3. package/dist/_chunks/App-Cx72FM22.mjs.map +1 -0
  4. package/dist/_chunks/App-DyjVixKE.js +1578 -0
  5. package/dist/_chunks/App-DyjVixKE.js.map +1 -0
  6. package/dist/_chunks/{PurchaseContentReleases-bpIYXOfu.js → PurchaseContentReleases-BJlgTIuR.js} +8 -7
  7. package/dist/_chunks/PurchaseContentReleases-BJlgTIuR.js.map +1 -0
  8. package/dist/_chunks/{PurchaseContentReleases-3tRbmbY3.mjs → PurchaseContentReleases-CIiBmOhI.mjs} +9 -8
  9. package/dist/_chunks/PurchaseContentReleases-CIiBmOhI.mjs.map +1 -0
  10. package/dist/_chunks/ReleasesSettingsPage-9si_53C5.mjs +178 -0
  11. package/dist/_chunks/ReleasesSettingsPage-9si_53C5.mjs.map +1 -0
  12. package/dist/_chunks/ReleasesSettingsPage-FsXF_FuJ.js +178 -0
  13. package/dist/_chunks/ReleasesSettingsPage-FsXF_FuJ.js.map +1 -0
  14. package/dist/_chunks/{en-HrREghh3.js → en-BWPPsSH-.js} +18 -2
  15. package/dist/_chunks/en-BWPPsSH-.js.map +1 -0
  16. package/dist/_chunks/{en-ltT1TlKQ.mjs → en-D9Q4YW03.mjs} +18 -2
  17. package/dist/_chunks/en-D9Q4YW03.mjs.map +1 -0
  18. package/dist/_chunks/index-CVj5EFQC.mjs +1386 -0
  19. package/dist/_chunks/index-CVj5EFQC.mjs.map +1 -0
  20. package/dist/_chunks/index-CpTN5TdF.js +1404 -0
  21. package/dist/_chunks/index-CpTN5TdF.js.map +1 -0
  22. package/dist/_chunks/schemas-DBYv9gK8.js +61 -0
  23. package/dist/_chunks/schemas-DBYv9gK8.js.map +1 -0
  24. package/dist/_chunks/schemas-DdA2ic2U.mjs +44 -0
  25. package/dist/_chunks/schemas-DdA2ic2U.mjs.map +1 -0
  26. package/dist/admin/index.js +1 -15
  27. package/dist/admin/index.js.map +1 -1
  28. package/dist/admin/index.mjs +2 -16
  29. package/dist/admin/index.mjs.map +1 -1
  30. package/dist/admin/src/components/EntryValidationPopover.d.ts +13 -0
  31. package/dist/admin/src/components/RelativeTime.d.ts +28 -0
  32. package/dist/admin/src/components/ReleaseAction.d.ts +3 -0
  33. package/dist/admin/src/components/ReleaseActionMenu.d.ts +26 -0
  34. package/dist/admin/src/components/ReleaseActionModal.d.ts +24 -0
  35. package/dist/admin/src/components/ReleaseActionOptions.d.ts +9 -0
  36. package/dist/admin/src/components/ReleaseListCell.d.ts +28 -0
  37. package/dist/admin/src/components/ReleaseModal.d.ts +17 -0
  38. package/dist/admin/src/components/ReleasesPanel.d.ts +3 -0
  39. package/dist/admin/src/constants.d.ts +76 -0
  40. package/dist/admin/src/index.d.ts +3 -0
  41. package/dist/admin/src/modules/hooks.d.ts +7 -0
  42. package/dist/admin/src/pages/App.d.ts +1 -0
  43. package/dist/admin/src/pages/PurchaseContentReleases.d.ts +2 -0
  44. package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +2 -0
  45. package/dist/admin/src/pages/ReleasesPage.d.ts +8 -0
  46. package/dist/admin/src/pages/ReleasesSettingsPage.d.ts +1 -0
  47. package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +181 -0
  48. package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +39 -0
  49. package/dist/admin/src/pluginId.d.ts +1 -0
  50. package/dist/admin/src/services/release.d.ts +112 -0
  51. package/dist/admin/src/store/hooks.d.ts +7 -0
  52. package/dist/admin/src/utils/api.d.ts +6 -0
  53. package/dist/admin/src/utils/prefixPluginTranslations.d.ts +3 -0
  54. package/dist/admin/src/utils/time.d.ts +10 -0
  55. package/dist/admin/src/validation/schemas.d.ts +6 -0
  56. package/dist/server/index.js +932 -660
  57. package/dist/server/index.js.map +1 -1
  58. package/dist/server/index.mjs +932 -658
  59. package/dist/server/index.mjs.map +1 -1
  60. package/dist/server/src/bootstrap.d.ts +5 -0
  61. package/dist/server/src/bootstrap.d.ts.map +1 -0
  62. package/dist/server/src/constants.d.ts +21 -0
  63. package/dist/server/src/constants.d.ts.map +1 -0
  64. package/dist/server/src/content-types/index.d.ts +97 -0
  65. package/dist/server/src/content-types/index.d.ts.map +1 -0
  66. package/dist/server/src/content-types/release/index.d.ts +48 -0
  67. package/dist/server/src/content-types/release/index.d.ts.map +1 -0
  68. package/dist/server/src/content-types/release/schema.d.ts +47 -0
  69. package/dist/server/src/content-types/release/schema.d.ts.map +1 -0
  70. package/dist/server/src/content-types/release-action/index.d.ts +48 -0
  71. package/dist/server/src/content-types/release-action/index.d.ts.map +1 -0
  72. package/dist/server/src/content-types/release-action/schema.d.ts +47 -0
  73. package/dist/server/src/content-types/release-action/schema.d.ts.map +1 -0
  74. package/dist/server/src/controllers/index.d.ts +25 -0
  75. package/dist/server/src/controllers/index.d.ts.map +1 -0
  76. package/dist/server/src/controllers/release-action.d.ts +10 -0
  77. package/dist/server/src/controllers/release-action.d.ts.map +1 -0
  78. package/dist/server/src/controllers/release.d.ts +18 -0
  79. package/dist/server/src/controllers/release.d.ts.map +1 -0
  80. package/dist/server/src/controllers/settings.d.ts +11 -0
  81. package/dist/server/src/controllers/settings.d.ts.map +1 -0
  82. package/dist/server/src/controllers/validation/release-action.d.ts +14 -0
  83. package/dist/server/src/controllers/validation/release-action.d.ts.map +1 -0
  84. package/dist/server/src/controllers/validation/release.d.ts +4 -0
  85. package/dist/server/src/controllers/validation/release.d.ts.map +1 -0
  86. package/dist/server/src/controllers/validation/settings.d.ts +3 -0
  87. package/dist/server/src/controllers/validation/settings.d.ts.map +1 -0
  88. package/dist/server/src/destroy.d.ts +5 -0
  89. package/dist/server/src/destroy.d.ts.map +1 -0
  90. package/dist/server/src/index.d.ts +2111 -0
  91. package/dist/server/src/index.d.ts.map +1 -0
  92. package/dist/server/src/middlewares/documents.d.ts +6 -0
  93. package/dist/server/src/middlewares/documents.d.ts.map +1 -0
  94. package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts +9 -0
  95. package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts.map +1 -0
  96. package/dist/server/src/migrations/index.d.ts +13 -0
  97. package/dist/server/src/migrations/index.d.ts.map +1 -0
  98. package/dist/server/src/register.d.ts +5 -0
  99. package/dist/server/src/register.d.ts.map +1 -0
  100. package/dist/server/src/routes/index.d.ts +51 -0
  101. package/dist/server/src/routes/index.d.ts.map +1 -0
  102. package/dist/server/src/routes/release-action.d.ts +18 -0
  103. package/dist/server/src/routes/release-action.d.ts.map +1 -0
  104. package/dist/server/src/routes/release.d.ts +18 -0
  105. package/dist/server/src/routes/release.d.ts.map +1 -0
  106. package/dist/server/src/routes/settings.d.ts +18 -0
  107. package/dist/server/src/routes/settings.d.ts.map +1 -0
  108. package/dist/server/src/services/index.d.ts +1824 -0
  109. package/dist/server/src/services/index.d.ts.map +1 -0
  110. package/dist/server/src/services/release-action.d.ts +34 -0
  111. package/dist/server/src/services/release-action.d.ts.map +1 -0
  112. package/dist/server/src/services/release.d.ts +31 -0
  113. package/dist/server/src/services/release.d.ts.map +1 -0
  114. package/dist/server/src/services/scheduling.d.ts +18 -0
  115. package/dist/server/src/services/scheduling.d.ts.map +1 -0
  116. package/dist/server/src/services/settings.d.ts +13 -0
  117. package/dist/server/src/services/settings.d.ts.map +1 -0
  118. package/dist/server/src/services/validation.d.ts +18 -0
  119. package/dist/server/src/services/validation.d.ts.map +1 -0
  120. package/dist/server/src/utils/index.d.ts +35 -0
  121. package/dist/server/src/utils/index.d.ts.map +1 -0
  122. package/dist/shared/contracts/release-actions.d.ts +137 -0
  123. package/dist/shared/contracts/release-actions.d.ts.map +1 -0
  124. package/dist/shared/contracts/releases.d.ts +184 -0
  125. package/dist/shared/contracts/releases.d.ts.map +1 -0
  126. package/dist/shared/contracts/settings.d.ts +39 -0
  127. package/dist/shared/contracts/settings.d.ts.map +1 -0
  128. package/dist/shared/types.d.ts +24 -0
  129. package/dist/shared/types.d.ts.map +1 -0
  130. package/package.json +35 -39
  131. package/dist/_chunks/App-dLXY5ei3.js +0 -1353
  132. package/dist/_chunks/App-dLXY5ei3.js.map +0 -1
  133. package/dist/_chunks/App-jrh58sXY.mjs +0 -1330
  134. package/dist/_chunks/App-jrh58sXY.mjs.map +0 -1
  135. package/dist/_chunks/PurchaseContentReleases-3tRbmbY3.mjs.map +0 -1
  136. package/dist/_chunks/PurchaseContentReleases-bpIYXOfu.js.map +0 -1
  137. package/dist/_chunks/en-HrREghh3.js.map +0 -1
  138. package/dist/_chunks/en-ltT1TlKQ.mjs.map +0 -1
  139. package/dist/_chunks/index-CVO0Rqdm.js +0 -1336
  140. package/dist/_chunks/index-CVO0Rqdm.js.map +0 -1
  141. package/dist/_chunks/index-PiOGBETy.mjs +0 -1315
  142. package/dist/_chunks/index-PiOGBETy.mjs.map +0 -1
  143. package/strapi-server.js +0 -3
@@ -0,0 +1,1404 @@
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-DyjVixKE.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-FsXF_FuJ.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-BJlgTIuR.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-CpTN5TdF.js.map