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