@strapi/content-releases 0.0.0-experimental.ec073775440bb4757efb5a5d846535ae950fe4a6 → 0.0.0-experimental.edc24aaa3bb5a90fa5fd4fee208167dd4e2e38d4

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 (139) hide show
  1. package/LICENSE +17 -1
  2. package/dist/_chunks/App-D-lWdVb2.js +1372 -0
  3. package/dist/_chunks/App-D-lWdVb2.js.map +1 -0
  4. package/dist/_chunks/App-UQxgTJY5.mjs +1351 -0
  5. package/dist/_chunks/App-UQxgTJY5.mjs.map +1 -0
  6. package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js +52 -0
  7. package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +1 -0
  8. package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs +52 -0
  9. package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +1 -0
  10. package/dist/_chunks/ReleasesSettingsPage-CuUXvABk.mjs +178 -0
  11. package/dist/_chunks/ReleasesSettingsPage-CuUXvABk.mjs.map +1 -0
  12. package/dist/_chunks/ReleasesSettingsPage-xfAoY8N3.js +178 -0
  13. package/dist/_chunks/ReleasesSettingsPage-xfAoY8N3.js.map +1 -0
  14. package/dist/_chunks/{en-gYDqKYFd.js → en-BCDLTJn3.js} +36 -7
  15. package/dist/_chunks/en-BCDLTJn3.js.map +1 -0
  16. package/dist/_chunks/{en-MyLPoISH.mjs → en-CGXIF4vQ.mjs} +36 -7
  17. package/dist/_chunks/en-CGXIF4vQ.mjs.map +1 -0
  18. package/dist/_chunks/index-b3Ej95H7.mjs +1099 -0
  19. package/dist/_chunks/index-b3Ej95H7.mjs.map +1 -0
  20. package/dist/_chunks/index-jnv9zdcE.js +1118 -0
  21. package/dist/_chunks/index-jnv9zdcE.js.map +1 -0
  22. package/dist/_chunks/schemas-63pFihNF.mjs +44 -0
  23. package/dist/_chunks/schemas-63pFihNF.mjs.map +1 -0
  24. package/dist/_chunks/schemas-z5zp-_Gd.js +62 -0
  25. package/dist/_chunks/schemas-z5zp-_Gd.js.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/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 +0 -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 +110 -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 +1328 -497
  56. package/dist/server/index.js.map +1 -1
  57. package/dist/server/index.mjs +1328 -497
  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 +23 -0
  74. package/dist/server/src/controllers/index.d.ts.map +1 -0
  75. package/dist/server/src/controllers/release-action.d.ts +9 -0
  76. package/dist/server/src/controllers/release-action.d.ts.map +1 -0
  77. package/dist/server/src/controllers/release.d.ts +17 -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 +1826 -0
  108. package/dist/server/src/services/index.d.ts.map +1 -0
  109. package/dist/server/src/services/release-action.d.ts +36 -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 +132 -0
  122. package/dist/shared/contracts/release-actions.d.ts.map +1 -0
  123. package/dist/shared/contracts/releases.d.ts +183 -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 +32 -35
  130. package/dist/_chunks/App-L1jSxCiL.mjs +0 -1015
  131. package/dist/_chunks/App-L1jSxCiL.mjs.map +0 -1
  132. package/dist/_chunks/App-_20W9dYa.js +0 -1037
  133. package/dist/_chunks/App-_20W9dYa.js.map +0 -1
  134. package/dist/_chunks/en-MyLPoISH.mjs.map +0 -1
  135. package/dist/_chunks/en-gYDqKYFd.js.map +0 -1
  136. package/dist/_chunks/index-KJa1Rb5F.js +0 -908
  137. package/dist/_chunks/index-KJa1Rb5F.js.map +0 -1
  138. package/dist/_chunks/index-c4zRX_sg.mjs +0 -887
  139. package/dist/_chunks/index-c4zRX_sg.mjs.map +0 -1
@@ -0,0 +1,1118 @@
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 strapiAdmin$1 = require("@strapi/content-manager/strapi-admin");
6
+ const designSystem = require("@strapi/design-system");
7
+ const symbols = require("@strapi/icons/symbols");
8
+ const formik = require("formik");
9
+ const reactIntl = require("react-intl");
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"],
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
+ }
154
+ }).injectEndpoints({
155
+ endpoints: (build) => {
156
+ return {
157
+ getReleasesForEntry: build.query({
158
+ query(params) {
159
+ return {
160
+ url: "/content-releases/getByDocumentAttached",
161
+ method: "GET",
162
+ config: {
163
+ params
164
+ }
165
+ };
166
+ },
167
+ providesTags: (result) => result ? [
168
+ ...result.data.map(({ id }) => ({ type: "Release", id })),
169
+ { type: "Release", id: "LIST" }
170
+ ] : []
171
+ }),
172
+ getReleases: build.query({
173
+ query({ page, pageSize, filters } = {
174
+ page: 1,
175
+ pageSize: 16,
176
+ filters: {
177
+ releasedAt: {
178
+ $notNull: false
179
+ }
180
+ }
181
+ }) {
182
+ return {
183
+ url: "/content-releases",
184
+ method: "GET",
185
+ config: {
186
+ params: {
187
+ page: page || 1,
188
+ pageSize: pageSize || 16,
189
+ filters: filters || {
190
+ releasedAt: {
191
+ $notNull: false
192
+ }
193
+ }
194
+ }
195
+ }
196
+ };
197
+ },
198
+ transformResponse(response, meta, arg) {
199
+ const releasedAtValue = arg?.filters?.releasedAt?.$notNull;
200
+ const isActiveDoneTab = releasedAtValue === "true";
201
+ const newResponse = {
202
+ ...response,
203
+ meta: {
204
+ ...response.meta,
205
+ activeTab: isActiveDoneTab ? "done" : "pending"
206
+ }
207
+ };
208
+ return newResponse;
209
+ },
210
+ providesTags: (result) => result ? [
211
+ ...result.data.map(({ id }) => ({ type: "Release", id })),
212
+ { type: "Release", id: "LIST" }
213
+ ] : [{ type: "Release", id: "LIST" }]
214
+ }),
215
+ getRelease: build.query({
216
+ query({ id }) {
217
+ return {
218
+ url: `/content-releases/${id}`,
219
+ method: "GET"
220
+ };
221
+ },
222
+ providesTags: (result, error, arg) => [{ type: "Release", id: arg.id }]
223
+ }),
224
+ getReleaseActions: build.query({
225
+ query({ releaseId, ...params }) {
226
+ return {
227
+ url: `/content-releases/${releaseId}/actions`,
228
+ method: "GET",
229
+ config: {
230
+ params
231
+ }
232
+ };
233
+ },
234
+ providesTags: [{ type: "ReleaseAction", id: "LIST" }]
235
+ }),
236
+ createRelease: build.mutation({
237
+ query(data) {
238
+ return {
239
+ url: "/content-releases",
240
+ method: "POST",
241
+ data
242
+ };
243
+ },
244
+ invalidatesTags: [{ type: "Release", id: "LIST" }]
245
+ }),
246
+ updateRelease: build.mutation({
247
+ query({ id, ...data }) {
248
+ return {
249
+ url: `/content-releases/${id}`,
250
+ method: "PUT",
251
+ data
252
+ };
253
+ },
254
+ invalidatesTags: (result, error, arg) => [{ type: "Release", id: arg.id }]
255
+ }),
256
+ createReleaseAction: build.mutation({
257
+ query({ body, params }) {
258
+ return {
259
+ url: `/content-releases/${params.releaseId}/actions`,
260
+ method: "POST",
261
+ data: body
262
+ };
263
+ },
264
+ invalidatesTags: [
265
+ { type: "Release", id: "LIST" },
266
+ { type: "ReleaseAction", id: "LIST" }
267
+ ]
268
+ }),
269
+ createManyReleaseActions: build.mutation({
270
+ query({ body, params }) {
271
+ return {
272
+ url: `/content-releases/${params.releaseId}/actions/bulk`,
273
+ method: "POST",
274
+ data: body
275
+ };
276
+ },
277
+ invalidatesTags: [
278
+ { type: "Release", id: "LIST" },
279
+ { type: "ReleaseAction", id: "LIST" },
280
+ { type: "EntriesInRelease" }
281
+ ]
282
+ }),
283
+ updateReleaseAction: build.mutation({
284
+ query({ body, params }) {
285
+ return {
286
+ url: `/content-releases/${params.releaseId}/actions/${params.actionId}`,
287
+ method: "PUT",
288
+ data: body
289
+ };
290
+ },
291
+ invalidatesTags: () => [{ type: "ReleaseAction", id: "LIST" }],
292
+ async onQueryStarted({ body, params, query, actionPath }, { dispatch, queryFulfilled }) {
293
+ const paramsWithoutActionId = {
294
+ releaseId: params.releaseId,
295
+ ...query
296
+ };
297
+ const patchResult = dispatch(
298
+ releaseApi.util.updateQueryData(
299
+ "getReleaseActions",
300
+ paramsWithoutActionId,
301
+ (draft) => {
302
+ const [key, index] = actionPath;
303
+ const action = draft.data[key][index];
304
+ if (action) {
305
+ action.type = body.type;
306
+ }
307
+ }
308
+ )
309
+ );
310
+ try {
311
+ await queryFulfilled;
312
+ } catch {
313
+ patchResult.undo();
314
+ }
315
+ }
316
+ }),
317
+ deleteReleaseAction: build.mutation({
318
+ query({ params }) {
319
+ return {
320
+ url: `/content-releases/${params.releaseId}/actions/${params.actionId}`,
321
+ method: "DELETE"
322
+ };
323
+ },
324
+ invalidatesTags: (result, error, arg) => [
325
+ { type: "Release", id: "LIST" },
326
+ { type: "Release", id: arg.params.releaseId },
327
+ { type: "ReleaseAction", id: "LIST" },
328
+ { type: "EntriesInRelease" }
329
+ ]
330
+ }),
331
+ publishRelease: build.mutation({
332
+ query({ id }) {
333
+ return {
334
+ url: `/content-releases/${id}/publish`,
335
+ method: "POST"
336
+ };
337
+ },
338
+ invalidatesTags: (result, error, arg) => [{ type: "Release", id: arg.id }]
339
+ }),
340
+ deleteRelease: build.mutation({
341
+ query({ id }) {
342
+ return {
343
+ url: `/content-releases/${id}`,
344
+ method: "DELETE"
345
+ };
346
+ },
347
+ invalidatesTags: () => [{ type: "Release", id: "LIST" }, { type: "EntriesInRelease" }]
348
+ }),
349
+ getMappedEntriesInReleases: build.query({
350
+ query(params) {
351
+ return {
352
+ url: "/content-releases/mapEntriesToReleases",
353
+ method: "GET",
354
+ config: {
355
+ params
356
+ }
357
+ };
358
+ },
359
+ transformResponse(response) {
360
+ return response.data;
361
+ },
362
+ providesTags: [{ type: "EntriesInRelease" }]
363
+ }),
364
+ getReleaseSettings: build.query({
365
+ query: () => "/content-releases/settings",
366
+ providesTags: [{ type: "ReleaseSettings" }]
367
+ }),
368
+ updateReleaseSettings: build.mutation({
369
+ query(data) {
370
+ return {
371
+ url: "/content-releases/settings",
372
+ method: "PUT",
373
+ data
374
+ };
375
+ },
376
+ invalidatesTags: (result, error, arg) => [{ type: "ReleaseSettings" }]
377
+ })
378
+ };
379
+ }
380
+ });
381
+ const {
382
+ useGetReleasesQuery,
383
+ useGetReleasesForEntryQuery,
384
+ useGetReleaseQuery,
385
+ useGetReleaseActionsQuery,
386
+ useCreateReleaseMutation,
387
+ useCreateReleaseActionMutation,
388
+ useCreateManyReleaseActionsMutation,
389
+ useUpdateReleaseMutation,
390
+ useUpdateReleaseActionMutation,
391
+ usePublishReleaseMutation,
392
+ useDeleteReleaseActionMutation,
393
+ useDeleteReleaseMutation,
394
+ useGetMappedEntriesInReleasesQuery,
395
+ useGetReleaseSettingsQuery,
396
+ useUpdateReleaseSettingsMutation
397
+ } = releaseApi;
398
+ const getBorderLeftRadiusValue = (actionType) => {
399
+ return actionType === "publish" ? 1 : 0;
400
+ };
401
+ const getBorderRightRadiusValue = (actionType) => {
402
+ return actionType === "publish" ? 0 : 1;
403
+ };
404
+ const FieldWrapper = styledComponents.styled(designSystem.Field.Root)`
405
+ border-top-left-radius: ${({ $actionType, theme }) => theme.spaces[getBorderLeftRadiusValue($actionType)]};
406
+ border-bottom-left-radius: ${({ $actionType, theme }) => theme.spaces[getBorderLeftRadiusValue($actionType)]};
407
+ border-top-right-radius: ${({ $actionType, theme }) => theme.spaces[getBorderRightRadiusValue($actionType)]};
408
+ border-bottom-right-radius: ${({ $actionType, theme }) => theme.spaces[getBorderRightRadiusValue($actionType)]};
409
+
410
+ > label {
411
+ color: inherit;
412
+ padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[3]}`};
413
+ text-align: center;
414
+ vertical-align: middle;
415
+ text-transform: capitalize;
416
+ }
417
+
418
+ &[data-checked='true'] {
419
+ color: ${({ theme, $actionType }) => $actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
420
+ background-color: ${({ theme, $actionType }) => $actionType === "publish" ? theme.colors.primary100 : theme.colors.danger100};
421
+ border-color: ${({ theme, $actionType }) => $actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
422
+ }
423
+
424
+ &[data-checked='false'] {
425
+ border-left: ${({ $actionType }) => $actionType === "unpublish" && "none"};
426
+ border-right: ${({ $actionType }) => $actionType === "publish" && "none"};
427
+ }
428
+
429
+ &[data-checked='false'][data-disabled='false']:hover {
430
+ color: ${({ theme }) => theme.colors.neutral700};
431
+ background-color: ${({ theme }) => theme.colors.neutral100};
432
+ border-color: ${({ theme }) => theme.colors.neutral200};
433
+
434
+ & > label {
435
+ cursor: pointer;
436
+ }
437
+ }
438
+
439
+ &[data-disabled='true'] {
440
+ color: ${({ theme }) => theme.colors.neutral600};
441
+ background-color: ${({ theme }) => theme.colors.neutral150};
442
+ border-color: ${({ theme }) => theme.colors.neutral300};
443
+ }
444
+ `;
445
+ const ActionOption = ({
446
+ selected,
447
+ actionType,
448
+ handleChange,
449
+ name,
450
+ disabled = false
451
+ }) => {
452
+ return /* @__PURE__ */ jsxRuntime.jsx(
453
+ FieldWrapper,
454
+ {
455
+ $actionType: actionType,
456
+ background: "primary0",
457
+ borderColor: "neutral200",
458
+ color: selected === actionType ? "primary600" : "neutral600",
459
+ position: "relative",
460
+ cursor: "pointer",
461
+ "data-checked": selected === actionType,
462
+ "data-disabled": disabled && selected !== actionType,
463
+ children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Label, { children: [
464
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { children: /* @__PURE__ */ jsxRuntime.jsx(
465
+ designSystem.Field.Input,
466
+ {
467
+ type: "radio",
468
+ name,
469
+ checked: selected === actionType,
470
+ onChange: handleChange,
471
+ value: actionType,
472
+ disabled
473
+ }
474
+ ) }),
475
+ actionType
476
+ ] })
477
+ }
478
+ );
479
+ };
480
+ const ReleaseActionOptions = ({
481
+ selected,
482
+ handleChange,
483
+ name,
484
+ disabled = false
485
+ }) => {
486
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { children: [
487
+ /* @__PURE__ */ jsxRuntime.jsx(
488
+ ActionOption,
489
+ {
490
+ actionType: "publish",
491
+ selected,
492
+ handleChange,
493
+ name,
494
+ disabled
495
+ }
496
+ ),
497
+ /* @__PURE__ */ jsxRuntime.jsx(
498
+ ActionOption,
499
+ {
500
+ actionType: "unpublish",
501
+ selected,
502
+ handleChange,
503
+ name,
504
+ disabled
505
+ }
506
+ )
507
+ ] });
508
+ };
509
+ const RELEASE_ACTION_FORM_SCHEMA = yup__namespace.object().shape({
510
+ type: yup__namespace.string().oneOf(["publish", "unpublish"]).required(),
511
+ releaseId: yup__namespace.string().required()
512
+ });
513
+ const INITIAL_VALUES = {
514
+ type: "publish",
515
+ releaseId: ""
516
+ };
517
+ const NoReleases = () => {
518
+ const { formatMessage } = reactIntl.useIntl();
519
+ return /* @__PURE__ */ jsxRuntime.jsx(
520
+ designSystem.EmptyStateLayout,
521
+ {
522
+ icon: /* @__PURE__ */ jsxRuntime.jsx(symbols.EmptyDocuments, { width: "16rem" }),
523
+ content: formatMessage({
524
+ id: "content-releases.content-manager-edit-view.add-to-release.no-releases-message",
525
+ defaultMessage: "No available releases. Open the list of releases and create a new one from there."
526
+ }),
527
+ action: /* @__PURE__ */ jsxRuntime.jsx(
528
+ designSystem.LinkButton,
529
+ {
530
+ to: {
531
+ pathname: "/plugins/content-releases"
532
+ },
533
+ tag: reactRouterDom.Link,
534
+ variant: "secondary",
535
+ children: formatMessage({
536
+ id: "content-releases.content-manager-edit-view.add-to-release.redirect-button",
537
+ defaultMessage: "Open the list of releases"
538
+ })
539
+ }
540
+ ),
541
+ shadow: "none"
542
+ }
543
+ );
544
+ };
545
+ const AddActionToReleaseModal = ({
546
+ contentType,
547
+ documentId,
548
+ onInputChange,
549
+ values
550
+ }) => {
551
+ const { formatMessage } = reactIntl.useIntl();
552
+ const [{ query }] = strapiAdmin.useQueryParams();
553
+ const locale = query.plugins?.i18n?.locale;
554
+ const response = useGetReleasesForEntryQuery({
555
+ contentType,
556
+ entryDocumentId: documentId,
557
+ hasEntryAttached: false,
558
+ locale
559
+ });
560
+ const releases = response.data?.data;
561
+ if (releases?.length === 0) {
562
+ return /* @__PURE__ */ jsxRuntime.jsx(NoReleases, {});
563
+ }
564
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
565
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingBottom: 6, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { required: true, children: [
566
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
567
+ id: "content-releases.content-manager-edit-view.add-to-release.select-label",
568
+ defaultMessage: "Select a release"
569
+ }) }),
570
+ /* @__PURE__ */ jsxRuntime.jsx(
571
+ designSystem.SingleSelect,
572
+ {
573
+ required: true,
574
+ placeholder: formatMessage({
575
+ id: "content-releases.content-manager-edit-view.add-to-release.select-placeholder",
576
+ defaultMessage: "Select"
577
+ }),
578
+ name: "releaseId",
579
+ onChange: (value) => onInputChange("releaseId", value),
580
+ value: values.releaseId,
581
+ children: releases?.map((release) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: release.id, children: release.name }, release.id))
582
+ }
583
+ )
584
+ ] }) }),
585
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
586
+ id: "content-releases.content-manager-edit-view.add-to-release.action-type-label",
587
+ defaultMessage: "What do you want to do with this entry?"
588
+ }) }),
589
+ /* @__PURE__ */ jsxRuntime.jsx(
590
+ ReleaseActionOptions,
591
+ {
592
+ selected: values.type,
593
+ handleChange: (e) => onInputChange("type", e.target.value),
594
+ name: "type"
595
+ }
596
+ )
597
+ ] });
598
+ };
599
+ const ReleaseActionModalForm = ({
600
+ documentId,
601
+ model,
602
+ collectionType
603
+ }) => {
604
+ const { formatMessage } = reactIntl.useIntl();
605
+ const { allowedActions } = strapiAdmin.useRBAC(PERMISSIONS);
606
+ const { canCreateAction } = allowedActions;
607
+ const [createReleaseAction, { isLoading }] = useCreateReleaseActionMutation();
608
+ const { toggleNotification } = strapiAdmin.useNotification();
609
+ const { formatAPIError } = strapiAdmin.useAPIErrorHandler();
610
+ const [{ query }] = strapiAdmin.useQueryParams();
611
+ const locale = query.plugins?.i18n?.locale;
612
+ const handleSubmit = async (e, onClose) => {
613
+ try {
614
+ await formik$1.handleSubmit(e);
615
+ onClose();
616
+ } catch (error) {
617
+ if (strapiAdmin.isFetchError(error)) {
618
+ toggleNotification({
619
+ type: "danger",
620
+ message: formatAPIError(error)
621
+ });
622
+ } else {
623
+ toggleNotification({
624
+ type: "danger",
625
+ message: formatMessage({
626
+ id: "notification.error",
627
+ defaultMessage: "An error occurred"
628
+ })
629
+ });
630
+ }
631
+ }
632
+ };
633
+ const formik$1 = formik.useFormik({
634
+ initialValues: INITIAL_VALUES,
635
+ validationSchema: RELEASE_ACTION_FORM_SCHEMA,
636
+ onSubmit: async (values) => {
637
+ if (collectionType === "collection-types" && !documentId) {
638
+ throw new Error("Document id is required");
639
+ }
640
+ const response = await createReleaseAction({
641
+ body: {
642
+ type: values.type,
643
+ contentType: model,
644
+ entryDocumentId: documentId,
645
+ locale
646
+ },
647
+ params: { releaseId: values.releaseId }
648
+ });
649
+ if ("data" in response) {
650
+ toggleNotification({
651
+ type: "success",
652
+ message: formatMessage({
653
+ id: "content-releases.content-manager-edit-view.add-to-release.notification.success",
654
+ defaultMessage: "Entry added to release"
655
+ })
656
+ });
657
+ return;
658
+ }
659
+ if ("error" in response) {
660
+ throw response.error;
661
+ }
662
+ }
663
+ });
664
+ const {
665
+ edit: { options }
666
+ } = strapiAdmin$1.unstable_useDocumentLayout(model);
667
+ if (!window.strapi.isEE || !options?.draftAndPublish || !canCreateAction) {
668
+ return null;
669
+ }
670
+ if (collectionType === "collection-types" && (!documentId || documentId === "create")) {
671
+ return null;
672
+ }
673
+ return {
674
+ label: formatMessage({
675
+ id: "content-releases.content-manager-edit-view.add-to-release",
676
+ defaultMessage: "Add to release"
677
+ }),
678
+ icon: /* @__PURE__ */ jsxRuntime.jsx(icons.PaperPlane, {}),
679
+ position: ["panel", "table-row"],
680
+ dialog: {
681
+ type: "modal",
682
+ title: formatMessage({
683
+ id: "content-releases.content-manager-edit-view.add-to-release",
684
+ defaultMessage: "Add to release"
685
+ }),
686
+ content: /* @__PURE__ */ jsxRuntime.jsx(
687
+ AddActionToReleaseModal,
688
+ {
689
+ contentType: model,
690
+ documentId,
691
+ onInputChange: formik$1.setFieldValue,
692
+ values: formik$1.values
693
+ }
694
+ ),
695
+ footer: ({ onClose }) => /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Modal.Footer, { children: [
696
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: onClose, variant: "tertiary", name: "cancel", children: formatMessage({
697
+ id: "content-releases.content-manager-edit-view.add-to-release.cancel-button",
698
+ defaultMessage: "Cancel"
699
+ }) }),
700
+ /* @__PURE__ */ jsxRuntime.jsx(
701
+ designSystem.Button,
702
+ {
703
+ type: "submit",
704
+ onClick: (e) => handleSubmit(e, onClose),
705
+ disabled: !formik$1.values.releaseId,
706
+ loading: isLoading,
707
+ children: formatMessage({
708
+ id: "content-releases.content-manager-edit-view.add-to-release.continue-button",
709
+ defaultMessage: "Continue"
710
+ })
711
+ }
712
+ )
713
+ ] })
714
+ }
715
+ };
716
+ };
717
+ const getTimezoneOffset = (timezone, date) => {
718
+ try {
719
+ const offsetPart = new Intl.DateTimeFormat("en", {
720
+ timeZone: timezone,
721
+ timeZoneName: "longOffset"
722
+ }).formatToParts(date).find((part) => part.type === "timeZoneName");
723
+ const offset = offsetPart ? offsetPart.value : "";
724
+ let utcOffset = offset.replace("GMT", "UTC");
725
+ if (!utcOffset.includes("+") && !utcOffset.includes("-")) {
726
+ utcOffset = `${utcOffset}+00:00`;
727
+ }
728
+ return utcOffset;
729
+ } catch (error) {
730
+ return "";
731
+ }
732
+ };
733
+ const getTimezones = (selectedDate) => {
734
+ const timezoneList = Intl.supportedValuesOf("timeZone").map((timezone) => {
735
+ const utcOffset = getTimezoneOffset(timezone, selectedDate);
736
+ return { offset: utcOffset, value: `${utcOffset}&${timezone}` };
737
+ });
738
+ const systemTimezone = timezoneList.find(
739
+ (timezone) => timezone.value.split("&")[1] === Intl.DateTimeFormat().resolvedOptions().timeZone
740
+ );
741
+ return { timezoneList, systemTimezone };
742
+ };
743
+ const StyledMenuItem = styledComponents.styled(designSystem.Menu.Item)`
744
+ &:hover {
745
+ background: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}100`]};
746
+
747
+ svg {
748
+ fill: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}600`]};
749
+ }
750
+
751
+ a {
752
+ color: ${({ theme }) => theme.colors.neutral800};
753
+ }
754
+ }
755
+
756
+ svg {
757
+ color: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}500`]};
758
+ }
759
+
760
+ span {
761
+ color: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}800`]};
762
+ }
763
+
764
+ span,
765
+ a {
766
+ width: 100%;
767
+ }
768
+ `;
769
+ const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
770
+ const { formatMessage } = reactIntl.useIntl();
771
+ const { toggleNotification } = strapiAdmin.useNotification();
772
+ const { formatAPIError } = strapiAdmin.useAPIErrorHandler();
773
+ const [deleteReleaseAction] = useDeleteReleaseActionMutation();
774
+ const {
775
+ allowedActions: { canDeleteAction }
776
+ } = strapiAdmin.useRBAC(PERMISSIONS);
777
+ const handleDeleteAction = async () => {
778
+ const response = await deleteReleaseAction({
779
+ params: { releaseId, actionId }
780
+ });
781
+ if ("data" in response) {
782
+ toggleNotification({
783
+ type: "success",
784
+ message: formatMessage({
785
+ id: "content-releases.content-manager-edit-view.remove-from-release.notification.success",
786
+ defaultMessage: "Entry removed from release"
787
+ })
788
+ });
789
+ return;
790
+ }
791
+ if ("error" in response) {
792
+ if (strapiAdmin.isFetchError(response.error)) {
793
+ toggleNotification({
794
+ type: "danger",
795
+ message: formatAPIError(response.error)
796
+ });
797
+ } else {
798
+ toggleNotification({
799
+ type: "danger",
800
+ message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
801
+ });
802
+ }
803
+ }
804
+ };
805
+ if (!canDeleteAction) {
806
+ return null;
807
+ }
808
+ return /* @__PURE__ */ jsxRuntime.jsx(StyledMenuItem, { $variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
809
+ /* @__PURE__ */ jsxRuntime.jsx(icons.Cross, { width: "1.6rem", height: "1.6rem" }),
810
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
811
+ id: "content-releases.content-manager-edit-view.remove-from-release",
812
+ defaultMessage: "Remove from release"
813
+ }) })
814
+ ] }) });
815
+ };
816
+ const ReleaseActionEntryLinkItem = ({
817
+ contentTypeUid,
818
+ documentId,
819
+ locale
820
+ }) => {
821
+ const { formatMessage } = reactIntl.useIntl();
822
+ const userPermissions = strapiAdmin.useAuth("ReleaseActionEntryLinkItem", (state) => state.permissions);
823
+ const canUpdateEntryForLocale = React__namespace.useMemo(() => {
824
+ const updatePermissions = userPermissions.find(
825
+ (permission) => permission.subject === contentTypeUid && permission.action === "plugin::content-manager.explorer.update"
826
+ );
827
+ if (!updatePermissions) {
828
+ return false;
829
+ }
830
+ return Boolean(!locale || updatePermissions.properties?.locales?.includes(locale));
831
+ }, [contentTypeUid, locale, userPermissions]);
832
+ const {
833
+ allowedActions: { canUpdate: canUpdateContentType }
834
+ } = strapiAdmin.useRBAC({
835
+ updateContentType: [
836
+ {
837
+ action: "plugin::content-manager.explorer.update",
838
+ subject: contentTypeUid
839
+ }
840
+ ]
841
+ });
842
+ if (!canUpdateContentType || !canUpdateEntryForLocale) {
843
+ return null;
844
+ }
845
+ return /* @__PURE__ */ jsxRuntime.jsx(
846
+ StyledMenuItem,
847
+ {
848
+ tag: reactRouterDom.NavLink,
849
+ isLink: true,
850
+ to: {
851
+ pathname: `/content-manager/collection-types/${contentTypeUid}/${documentId}`,
852
+ search: locale && `?plugins[i18n][locale]=${locale}`
853
+ },
854
+ children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
855
+ /* @__PURE__ */ jsxRuntime.jsx(icons.Pencil, { width: "1.6rem", height: "1.6rem" }),
856
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", children: formatMessage({
857
+ id: "content-releases.content-manager-edit-view.edit-entry",
858
+ defaultMessage: "Edit entry"
859
+ }) })
860
+ ] })
861
+ }
862
+ );
863
+ };
864
+ const EditReleaseItem = ({ releaseId }) => {
865
+ const { formatMessage } = reactIntl.useIntl();
866
+ return (
867
+ /* @ts-expect-error inference isn't working in DS */
868
+ /* @__PURE__ */ jsxRuntime.jsx(StyledMenuItem, { tag: reactRouterDom.NavLink, isLink: true, to: `/plugins/content-releases/${releaseId}`, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
869
+ /* @__PURE__ */ jsxRuntime.jsx(icons.Pencil, { width: "1.6rem", height: "1.6rem" }),
870
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", variant: "omega", children: formatMessage({
871
+ id: "content-releases.content-manager-edit-view.edit-release",
872
+ defaultMessage: "Edit release"
873
+ }) })
874
+ ] }) })
875
+ );
876
+ };
877
+ const Root = ({ children }) => {
878
+ const { formatMessage } = reactIntl.useIntl();
879
+ const { allowedActions } = strapiAdmin.useRBAC(PERMISSIONS);
880
+ return (
881
+ // A user can access the dropdown if they have permissions to delete a release-action OR update a release
882
+ allowedActions.canDeleteAction || allowedActions.canUpdate ? /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Root, { children: [
883
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Trigger, { variant: "tertiary", endIcon: null, paddingLeft: 2, paddingRight: 2, children: /* @__PURE__ */ jsxRuntime.jsx(
884
+ designSystem.AccessibleIcon,
885
+ {
886
+ label: formatMessage({
887
+ id: "content-releases.content-manager-edit-view.release-action-menu",
888
+ defaultMessage: "Release action options"
889
+ }),
890
+ children: /* @__PURE__ */ jsxRuntime.jsx(icons.More, {})
891
+ }
892
+ ) }),
893
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Content, { top: 1, popoverPlacement: "bottom-end", children })
894
+ ] }) : null
895
+ );
896
+ };
897
+ const ReleaseActionMenu = {
898
+ Root,
899
+ EditReleaseItem,
900
+ DeleteReleaseActionItem,
901
+ ReleaseActionEntryLinkItem
902
+ };
903
+ const Panel = ({ model, documentId, collectionType }) => {
904
+ const [{ query }] = strapiAdmin.useQueryParams();
905
+ const locale = query.plugins?.i18n?.locale;
906
+ const {
907
+ edit: { options }
908
+ } = strapiAdmin$1.unstable_useDocumentLayout(model);
909
+ const { formatMessage, formatDate, formatTime } = reactIntl.useIntl();
910
+ const { allowedActions } = strapiAdmin.useRBAC(PERMISSIONS);
911
+ const { canRead, canDeleteAction } = allowedActions;
912
+ const response = useGetReleasesForEntryQuery({
913
+ contentType: model,
914
+ entryDocumentId: documentId,
915
+ locale,
916
+ hasEntryAttached: true
917
+ });
918
+ const releases = response.data?.data;
919
+ const getReleaseColorVariant = (actionType, shade) => {
920
+ if (actionType === "unpublish") {
921
+ return `secondary${shade}`;
922
+ }
923
+ return `success${shade}`;
924
+ };
925
+ if (!window.strapi.isEE || !options?.draftAndPublish || !canRead) {
926
+ return null;
927
+ }
928
+ if (collectionType === "collection-types" && (!documentId || documentId === "create")) {
929
+ return null;
930
+ }
931
+ if (releases && releases.length === 0) {
932
+ return null;
933
+ }
934
+ return {
935
+ title: formatMessage({
936
+ id: "content-releases.plugin.name",
937
+ defaultMessage: "Releases"
938
+ }),
939
+ content: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 3, width: "100%", children: releases?.map((release) => /* @__PURE__ */ jsxRuntime.jsxs(
940
+ designSystem.Flex,
941
+ {
942
+ direction: "column",
943
+ alignItems: "start",
944
+ borderWidth: "1px",
945
+ borderStyle: "solid",
946
+ borderColor: getReleaseColorVariant(release.actions[0].type, "200"),
947
+ overflow: "hidden",
948
+ hasRadius: true,
949
+ children: [
950
+ /* @__PURE__ */ jsxRuntime.jsx(
951
+ designSystem.Box,
952
+ {
953
+ paddingTop: 3,
954
+ paddingBottom: 3,
955
+ paddingLeft: 4,
956
+ paddingRight: 4,
957
+ background: getReleaseColorVariant(release.actions[0].type, "100"),
958
+ width: "100%",
959
+ children: /* @__PURE__ */ jsxRuntime.jsx(
960
+ designSystem.Typography,
961
+ {
962
+ fontSize: 1,
963
+ variant: "pi",
964
+ textColor: getReleaseColorVariant(release.actions[0].type, "600"),
965
+ children: formatMessage(
966
+ {
967
+ id: "content-releases.content-manager-edit-view.list-releases.title",
968
+ defaultMessage: "{isPublish, select, true {Will be published in} other {Will be unpublished in}}"
969
+ },
970
+ { isPublish: release.actions[0].type === "publish" }
971
+ )
972
+ }
973
+ )
974
+ }
975
+ ),
976
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { padding: 4, direction: "column", gap: 2, width: "100%", alignItems: "flex-start", children: [
977
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
978
+ release.scheduledAt && release.timezone && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", textColor: "neutral600", children: formatMessage(
979
+ {
980
+ id: "content-releases.content-manager-edit-view.scheduled.date",
981
+ defaultMessage: "{date} at {time} ({offset})"
982
+ },
983
+ {
984
+ date: formatDate(new Date(release.scheduledAt), {
985
+ day: "2-digit",
986
+ month: "2-digit",
987
+ year: "numeric",
988
+ timeZone: release.timezone
989
+ }),
990
+ time: formatTime(new Date(release.scheduledAt), {
991
+ hourCycle: "h23",
992
+ timeZone: release.timezone
993
+ }),
994
+ offset: getTimezoneOffset(release.timezone, new Date(release.scheduledAt))
995
+ }
996
+ ) }),
997
+ canDeleteAction ? /* @__PURE__ */ jsxRuntime.jsxs(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: [
998
+ /* @__PURE__ */ jsxRuntime.jsx(ReleaseActionMenu.EditReleaseItem, { releaseId: release.id }),
999
+ /* @__PURE__ */ jsxRuntime.jsx(
1000
+ ReleaseActionMenu.DeleteReleaseActionItem,
1001
+ {
1002
+ releaseId: release.id,
1003
+ actionId: release.actions[0].id
1004
+ }
1005
+ )
1006
+ ] }) : null
1007
+ ] })
1008
+ ]
1009
+ },
1010
+ release.id
1011
+ )) })
1012
+ };
1013
+ };
1014
+ const pluginId = "content-releases";
1015
+ const prefixPluginTranslations = (trad, pluginId2) => {
1016
+ if (!pluginId2) {
1017
+ throw new TypeError("pluginId can't be empty");
1018
+ }
1019
+ return Object.keys(trad).reduce((acc, current) => {
1020
+ acc[`${pluginId2}.${current}`] = trad[current];
1021
+ return acc;
1022
+ }, {});
1023
+ };
1024
+ const admin = {
1025
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1026
+ register(app) {
1027
+ app.createHook("ContentReleases/pages/ReleaseDetails/add-locale-in-releases");
1028
+ if (window.strapi.features.isEnabled("cms-content-releases")) {
1029
+ app.addMenuLink({
1030
+ to: `plugins/${pluginId}`,
1031
+ icon: icons.PaperPlane,
1032
+ intlLabel: {
1033
+ id: `${pluginId}.plugin.name`,
1034
+ defaultMessage: "Releases"
1035
+ },
1036
+ Component: () => Promise.resolve().then(() => require("./App-D-lWdVb2.js")).then((mod) => ({ default: mod.App })),
1037
+ permissions: PERMISSIONS.main,
1038
+ position: 2
1039
+ });
1040
+ const contentManagerPluginApis = app.getPlugin("content-manager").apis;
1041
+ if ("addEditViewSidePanel" in contentManagerPluginApis && typeof contentManagerPluginApis.addEditViewSidePanel === "function") {
1042
+ contentManagerPluginApis.addEditViewSidePanel([Panel]);
1043
+ }
1044
+ if ("addDocumentAction" in contentManagerPluginApis && typeof contentManagerPluginApis.addDocumentAction === "function") {
1045
+ contentManagerPluginApis.addDocumentAction((actions) => {
1046
+ const indexOfDeleteAction = actions.findIndex((action) => action.type === "unpublish");
1047
+ actions.splice(indexOfDeleteAction, 0, ReleaseActionModalForm);
1048
+ return actions;
1049
+ });
1050
+ }
1051
+ app.addSettingsLink("global", {
1052
+ id: pluginId,
1053
+ to: "releases",
1054
+ intlLabel: {
1055
+ id: `${pluginId}.plugin.name`,
1056
+ defaultMessage: "Releases"
1057
+ },
1058
+ permissions: [],
1059
+ async Component() {
1060
+ const { ProtectedReleasesSettingsPage } = await Promise.resolve().then(() => require("./ReleasesSettingsPage-xfAoY8N3.js"));
1061
+ return { default: ProtectedReleasesSettingsPage };
1062
+ }
1063
+ });
1064
+ } else if (!window.strapi.features.isEnabled("cms-content-releases") && window.strapi?.flags?.promoteEE) {
1065
+ app.addSettingsLink("global", {
1066
+ id: pluginId,
1067
+ to: "/plugins/purchase-content-releases",
1068
+ intlLabel: {
1069
+ id: `${pluginId}.plugin.name`,
1070
+ defaultMessage: "Releases"
1071
+ },
1072
+ permissions: [],
1073
+ async Component() {
1074
+ const { PurchaseContentReleases } = await Promise.resolve().then(() => require("./PurchaseContentReleases-Be3acS2L.js"));
1075
+ return { default: PurchaseContentReleases };
1076
+ },
1077
+ licenseOnly: true
1078
+ });
1079
+ }
1080
+ },
1081
+ async registerTrads({ locales }) {
1082
+ const importedTrads = await Promise.all(
1083
+ locales.map((locale) => {
1084
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => Promise.resolve().then(() => require("./en-BCDLTJn3.js")) }), `./translations/${locale}.json`).then(({ default: data }) => {
1085
+ return {
1086
+ data: prefixPluginTranslations(data, "content-releases"),
1087
+ locale
1088
+ };
1089
+ }).catch(() => {
1090
+ return {
1091
+ data: {},
1092
+ locale
1093
+ };
1094
+ });
1095
+ })
1096
+ );
1097
+ return Promise.resolve(importedTrads);
1098
+ }
1099
+ };
1100
+ exports.PERMISSIONS = PERMISSIONS;
1101
+ exports.ReleaseActionMenu = ReleaseActionMenu;
1102
+ exports.ReleaseActionOptions = ReleaseActionOptions;
1103
+ exports.admin = admin;
1104
+ exports.getTimezoneOffset = getTimezoneOffset;
1105
+ exports.getTimezones = getTimezones;
1106
+ exports.pluginId = pluginId;
1107
+ exports.releaseApi = releaseApi;
1108
+ exports.useCreateReleaseMutation = useCreateReleaseMutation;
1109
+ exports.useDeleteReleaseMutation = useDeleteReleaseMutation;
1110
+ exports.useGetReleaseActionsQuery = useGetReleaseActionsQuery;
1111
+ exports.useGetReleaseQuery = useGetReleaseQuery;
1112
+ exports.useGetReleaseSettingsQuery = useGetReleaseSettingsQuery;
1113
+ exports.useGetReleasesQuery = useGetReleasesQuery;
1114
+ exports.usePublishReleaseMutation = usePublishReleaseMutation;
1115
+ exports.useUpdateReleaseActionMutation = useUpdateReleaseActionMutation;
1116
+ exports.useUpdateReleaseMutation = useUpdateReleaseMutation;
1117
+ exports.useUpdateReleaseSettingsMutation = useUpdateReleaseSettingsMutation;
1118
+ //# sourceMappingURL=index-jnv9zdcE.js.map