@strapi/content-releases 0.0.0-next.e9b6852d1c05518ff6e37d599321f7aa7aa0683b → 0.0.0-next.ec9b1b708d4d319f2b8b39d9397bd752d250d541

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