@strapi/content-releases 0.0.0-experimental.f2351bcfa3965c60f063a492da51faa2c636eee8 → 0.0.0-experimental.f28dba7c374eae9c02b95b4b77aba4c3ad41a841

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/dist/_chunks/App-dLXY5ei3.js +1353 -0
  2. package/dist/_chunks/App-dLXY5ei3.js.map +1 -0
  3. package/dist/_chunks/{App-JwN_xBnA.mjs → App-jrh58sXY.mjs} +558 -602
  4. package/dist/_chunks/App-jrh58sXY.mjs.map +1 -0
  5. package/dist/_chunks/{PurchaseContentReleases-_MxP6-Dt.mjs → PurchaseContentReleases-3tRbmbY3.mjs} +7 -8
  6. package/dist/_chunks/PurchaseContentReleases-3tRbmbY3.mjs.map +1 -0
  7. package/dist/_chunks/{PurchaseContentReleases-Be3acS2L.js → PurchaseContentReleases-bpIYXOfu.js} +6 -7
  8. package/dist/_chunks/PurchaseContentReleases-bpIYXOfu.js.map +1 -0
  9. package/dist/_chunks/{en-CmYoEnA7.js → en-HrREghh3.js} +2 -9
  10. package/dist/_chunks/en-HrREghh3.js.map +1 -0
  11. package/dist/_chunks/{en-D0yVZFqf.mjs → en-ltT1TlKQ.mjs} +2 -9
  12. package/dist/_chunks/en-ltT1TlKQ.mjs.map +1 -0
  13. package/dist/_chunks/index-CVO0Rqdm.js +1336 -0
  14. package/dist/_chunks/index-CVO0Rqdm.js.map +1 -0
  15. package/dist/_chunks/index-PiOGBETy.mjs +1315 -0
  16. package/dist/_chunks/index-PiOGBETy.mjs.map +1 -0
  17. package/dist/admin/index.js +15 -1
  18. package/dist/admin/index.js.map +1 -1
  19. package/dist/admin/index.mjs +16 -2
  20. package/dist/admin/index.mjs.map +1 -1
  21. package/dist/server/index.js +646 -809
  22. package/dist/server/index.js.map +1 -1
  23. package/dist/server/index.mjs +646 -810
  24. package/dist/server/index.mjs.map +1 -1
  25. package/package.json +37 -31
  26. package/dist/_chunks/App-BFo3ibui.js +0 -1395
  27. package/dist/_chunks/App-BFo3ibui.js.map +0 -1
  28. package/dist/_chunks/App-JwN_xBnA.mjs.map +0 -1
  29. package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +0 -1
  30. package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +0 -1
  31. package/dist/_chunks/ReleasesSettingsPage-BanjZwEc.js +0 -178
  32. package/dist/_chunks/ReleasesSettingsPage-BanjZwEc.js.map +0 -1
  33. package/dist/_chunks/ReleasesSettingsPage-CNMXGcZC.mjs +0 -178
  34. package/dist/_chunks/ReleasesSettingsPage-CNMXGcZC.mjs.map +0 -1
  35. package/dist/_chunks/en-CmYoEnA7.js.map +0 -1
  36. package/dist/_chunks/en-D0yVZFqf.mjs.map +0 -1
  37. package/dist/_chunks/index-C_e6DQb0.mjs +0 -1342
  38. package/dist/_chunks/index-C_e6DQb0.mjs.map +0 -1
  39. package/dist/_chunks/index-Em3KctMx.js +0 -1361
  40. package/dist/_chunks/index-Em3KctMx.js.map +0 -1
  41. package/dist/_chunks/schemas-63pFihNF.mjs +0 -44
  42. package/dist/_chunks/schemas-63pFihNF.mjs.map +0 -1
  43. package/dist/_chunks/schemas-z5zp-_Gd.js +0 -62
  44. package/dist/_chunks/schemas-z5zp-_Gd.js.map +0 -1
  45. package/dist/admin/src/components/RelativeTime.d.ts +0 -28
  46. package/dist/admin/src/components/ReleaseAction.d.ts +0 -3
  47. package/dist/admin/src/components/ReleaseActionMenu.d.ts +0 -26
  48. package/dist/admin/src/components/ReleaseActionModal.d.ts +0 -24
  49. package/dist/admin/src/components/ReleaseActionOptions.d.ts +0 -9
  50. package/dist/admin/src/components/ReleaseListCell.d.ts +0 -28
  51. package/dist/admin/src/components/ReleaseModal.d.ts +0 -17
  52. package/dist/admin/src/components/ReleasesPanel.d.ts +0 -3
  53. package/dist/admin/src/constants.d.ts +0 -76
  54. package/dist/admin/src/index.d.ts +0 -3
  55. package/dist/admin/src/modules/hooks.d.ts +0 -7
  56. package/dist/admin/src/pages/App.d.ts +0 -1
  57. package/dist/admin/src/pages/PurchaseContentReleases.d.ts +0 -2
  58. package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +0 -2
  59. package/dist/admin/src/pages/ReleasesPage.d.ts +0 -8
  60. package/dist/admin/src/pages/ReleasesSettingsPage.d.ts +0 -1
  61. package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +0 -181
  62. package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +0 -39
  63. package/dist/admin/src/pluginId.d.ts +0 -1
  64. package/dist/admin/src/services/release.d.ts +0 -112
  65. package/dist/admin/src/store/hooks.d.ts +0 -7
  66. package/dist/admin/src/utils/api.d.ts +0 -6
  67. package/dist/admin/src/utils/prefixPluginTranslations.d.ts +0 -3
  68. package/dist/admin/src/utils/time.d.ts +0 -10
  69. package/dist/admin/src/validation/schemas.d.ts +0 -6
  70. package/dist/server/src/bootstrap.d.ts +0 -5
  71. package/dist/server/src/bootstrap.d.ts.map +0 -1
  72. package/dist/server/src/constants.d.ts +0 -21
  73. package/dist/server/src/constants.d.ts.map +0 -1
  74. package/dist/server/src/content-types/index.d.ts +0 -97
  75. package/dist/server/src/content-types/index.d.ts.map +0 -1
  76. package/dist/server/src/content-types/release/index.d.ts +0 -48
  77. package/dist/server/src/content-types/release/index.d.ts.map +0 -1
  78. package/dist/server/src/content-types/release/schema.d.ts +0 -47
  79. package/dist/server/src/content-types/release/schema.d.ts.map +0 -1
  80. package/dist/server/src/content-types/release-action/index.d.ts +0 -48
  81. package/dist/server/src/content-types/release-action/index.d.ts.map +0 -1
  82. package/dist/server/src/content-types/release-action/schema.d.ts +0 -47
  83. package/dist/server/src/content-types/release-action/schema.d.ts.map +0 -1
  84. package/dist/server/src/controllers/index.d.ts +0 -25
  85. package/dist/server/src/controllers/index.d.ts.map +0 -1
  86. package/dist/server/src/controllers/release-action.d.ts +0 -10
  87. package/dist/server/src/controllers/release-action.d.ts.map +0 -1
  88. package/dist/server/src/controllers/release.d.ts +0 -18
  89. package/dist/server/src/controllers/release.d.ts.map +0 -1
  90. package/dist/server/src/controllers/settings.d.ts +0 -11
  91. package/dist/server/src/controllers/settings.d.ts.map +0 -1
  92. package/dist/server/src/controllers/validation/release-action.d.ts +0 -14
  93. package/dist/server/src/controllers/validation/release-action.d.ts.map +0 -1
  94. package/dist/server/src/controllers/validation/release.d.ts +0 -4
  95. package/dist/server/src/controllers/validation/release.d.ts.map +0 -1
  96. package/dist/server/src/controllers/validation/settings.d.ts +0 -3
  97. package/dist/server/src/controllers/validation/settings.d.ts.map +0 -1
  98. package/dist/server/src/destroy.d.ts +0 -5
  99. package/dist/server/src/destroy.d.ts.map +0 -1
  100. package/dist/server/src/index.d.ts +0 -2113
  101. package/dist/server/src/index.d.ts.map +0 -1
  102. package/dist/server/src/middlewares/documents.d.ts +0 -6
  103. package/dist/server/src/middlewares/documents.d.ts.map +0 -1
  104. package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts +0 -9
  105. package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts.map +0 -1
  106. package/dist/server/src/migrations/index.d.ts +0 -13
  107. package/dist/server/src/migrations/index.d.ts.map +0 -1
  108. package/dist/server/src/register.d.ts +0 -5
  109. package/dist/server/src/register.d.ts.map +0 -1
  110. package/dist/server/src/routes/index.d.ts +0 -51
  111. package/dist/server/src/routes/index.d.ts.map +0 -1
  112. package/dist/server/src/routes/release-action.d.ts +0 -18
  113. package/dist/server/src/routes/release-action.d.ts.map +0 -1
  114. package/dist/server/src/routes/release.d.ts +0 -18
  115. package/dist/server/src/routes/release.d.ts.map +0 -1
  116. package/dist/server/src/routes/settings.d.ts +0 -18
  117. package/dist/server/src/routes/settings.d.ts.map +0 -1
  118. package/dist/server/src/services/index.d.ts +0 -1826
  119. package/dist/server/src/services/index.d.ts.map +0 -1
  120. package/dist/server/src/services/release-action.d.ts +0 -36
  121. package/dist/server/src/services/release-action.d.ts.map +0 -1
  122. package/dist/server/src/services/release.d.ts +0 -31
  123. package/dist/server/src/services/release.d.ts.map +0 -1
  124. package/dist/server/src/services/scheduling.d.ts +0 -18
  125. package/dist/server/src/services/scheduling.d.ts.map +0 -1
  126. package/dist/server/src/services/settings.d.ts +0 -13
  127. package/dist/server/src/services/settings.d.ts.map +0 -1
  128. package/dist/server/src/services/validation.d.ts +0 -18
  129. package/dist/server/src/services/validation.d.ts.map +0 -1
  130. package/dist/server/src/utils/index.d.ts +0 -35
  131. package/dist/server/src/utils/index.d.ts.map +0 -1
  132. package/dist/shared/contracts/release-actions.d.ts +0 -130
  133. package/dist/shared/contracts/release-actions.d.ts.map +0 -1
  134. package/dist/shared/contracts/releases.d.ts +0 -184
  135. package/dist/shared/contracts/releases.d.ts.map +0 -1
  136. package/dist/shared/contracts/settings.d.ts +0 -39
  137. package/dist/shared/contracts/settings.d.ts.map +0 -1
  138. package/dist/shared/types.d.ts +0 -24
  139. package/dist/shared/types.d.ts.map +0 -1
@@ -1,1361 +0,0 @@
1
- "use strict";
2
- const icons = require("@strapi/icons");
3
- const jsxRuntime = require("react/jsx-runtime");
4
- const strapiAdmin = require("@strapi/admin/strapi-admin");
5
- const designSystem = require("@strapi/design-system");
6
- const formik = require("formik");
7
- const reactIntl = require("react-intl");
8
- const strapiAdmin$1 = require("@strapi/content-manager/strapi-admin");
9
- const symbols = require("@strapi/icons/symbols");
10
- const reactRouterDom = require("react-router-dom");
11
- const yup = require("yup");
12
- const styledComponents = require("styled-components");
13
- const React = require("react");
14
- function _interopNamespace(e) {
15
- if (e && e.__esModule)
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: [{ 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 getContentPermissions = (subject) => {
718
- const permissions = {
719
- publish: [
720
- {
721
- action: "plugin::content-manager.explorer.publish",
722
- subject,
723
- id: "",
724
- actionParameters: {},
725
- properties: {},
726
- conditions: []
727
- }
728
- ]
729
- };
730
- return permissions;
731
- };
732
- const ReleaseAction = ({ documents, model }) => {
733
- const { formatMessage } = reactIntl.useIntl();
734
- const { toggleNotification } = strapiAdmin.useNotification();
735
- const { formatAPIError } = strapiAdmin.useAPIErrorHandler();
736
- const [{ query }] = strapiAdmin.useQueryParams();
737
- const contentPermissions = getContentPermissions(model);
738
- const {
739
- allowedActions: { canPublish }
740
- } = strapiAdmin.useRBAC(contentPermissions);
741
- const {
742
- allowedActions: { canCreate }
743
- } = strapiAdmin.useRBAC(PERMISSIONS);
744
- const response = useGetReleasesQuery();
745
- const releases = response.data?.data;
746
- const [createManyReleaseActions, { isLoading }] = useCreateManyReleaseActionsMutation();
747
- const documentIds = documents.map((doc) => doc.documentId);
748
- const handleSubmit = async (values) => {
749
- const locale = query.plugins?.i18n?.locale;
750
- const releaseActionEntries = documentIds.map(
751
- (entryDocumentId) => ({
752
- type: values.type,
753
- contentType: model,
754
- entryDocumentId,
755
- locale
756
- })
757
- );
758
- const response2 = await createManyReleaseActions({
759
- body: releaseActionEntries,
760
- params: { releaseId: values.releaseId }
761
- });
762
- if ("data" in response2) {
763
- const notificationMessage = formatMessage(
764
- {
765
- id: "content-releases.content-manager-list-view.add-to-release.notification.success.message",
766
- defaultMessage: "{entriesAlreadyInRelease} out of {totalEntries} entries were already in the release."
767
- },
768
- {
769
- entriesAlreadyInRelease: response2.data.meta.entriesAlreadyInRelease,
770
- totalEntries: response2.data.meta.totalEntries
771
- }
772
- );
773
- const notification = {
774
- type: "success",
775
- title: formatMessage(
776
- {
777
- id: "content-releases.content-manager-list-view.add-to-release.notification.success.title",
778
- defaultMessage: "Successfully added to release."
779
- },
780
- {
781
- entriesAlreadyInRelease: response2.data.meta.entriesAlreadyInRelease,
782
- totalEntries: response2.data.meta.totalEntries
783
- }
784
- ),
785
- message: response2.data.meta.entriesAlreadyInRelease ? notificationMessage : ""
786
- };
787
- toggleNotification(notification);
788
- return true;
789
- }
790
- if ("error" in response2) {
791
- if (strapiAdmin.isFetchError(response2.error)) {
792
- toggleNotification({
793
- type: "warning",
794
- message: formatAPIError(response2.error)
795
- });
796
- } else {
797
- toggleNotification({
798
- type: "warning",
799
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
800
- });
801
- }
802
- }
803
- };
804
- if (!canCreate || !canPublish)
805
- return null;
806
- return {
807
- actionType: "release",
808
- variant: "tertiary",
809
- label: formatMessage({
810
- id: "content-manager-list-view.add-to-release",
811
- defaultMessage: "Add to Release"
812
- }),
813
- dialog: {
814
- type: "modal",
815
- title: formatMessage({
816
- id: "content-manager-list-view.add-to-release",
817
- defaultMessage: "Add to Release"
818
- }),
819
- content: ({ onClose }) => {
820
- return /* @__PURE__ */ jsxRuntime.jsx(
821
- formik.Formik,
822
- {
823
- onSubmit: async (values) => {
824
- const data = await handleSubmit(values);
825
- if (data) {
826
- return onClose();
827
- }
828
- },
829
- validationSchema: RELEASE_ACTION_FORM_SCHEMA,
830
- initialValues: INITIAL_VALUES,
831
- children: ({ values, setFieldValue }) => /* @__PURE__ */ jsxRuntime.jsxs(formik.Form, { children: [
832
- 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: [
833
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingBottom: 6, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { required: true, children: [
834
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
835
- id: "content-releases.content-manager-list-view.add-to-release.select-label",
836
- defaultMessage: "Select a release"
837
- }) }),
838
- /* @__PURE__ */ jsxRuntime.jsx(
839
- designSystem.SingleSelect,
840
- {
841
- placeholder: formatMessage({
842
- id: "content-releases.content-manager-list-view.add-to-release.select-placeholder",
843
- defaultMessage: "Select"
844
- }),
845
- onChange: (value) => setFieldValue("releaseId", value),
846
- value: values.releaseId,
847
- children: releases?.map((release) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: release.id, children: release.name }, release.id))
848
- }
849
- )
850
- ] }) }),
851
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
852
- id: "content-releases.content-manager-list-view.add-to-release.action-type-label",
853
- defaultMessage: "What do you want to do with these entries?"
854
- }) }),
855
- /* @__PURE__ */ jsxRuntime.jsx(
856
- ReleaseActionOptions,
857
- {
858
- selected: values.type,
859
- handleChange: (e) => setFieldValue("type", e.target.value),
860
- name: "type"
861
- }
862
- )
863
- ] }) }),
864
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Modal.Footer, { children: [
865
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: onClose, variant: "tertiary", name: "cancel", children: formatMessage({
866
- id: "content-releases.content-manager-list-view.add-to-release.cancel-button",
867
- defaultMessage: "Cancel"
868
- }) }),
869
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { type: "submit", disabled: !values.releaseId, loading: isLoading, children: formatMessage({
870
- id: "content-releases.content-manager-list-view.add-to-release.continue-button",
871
- defaultMessage: "Continue"
872
- }) })
873
- ] })
874
- ] })
875
- }
876
- );
877
- }
878
- }
879
- };
880
- };
881
- const useReleasesList = (contentTypeUid, documentId) => {
882
- const listViewData = strapiAdmin.useTable("ListView", (state) => state.rows);
883
- const documentIds = listViewData.map((entry) => entry.documentId);
884
- const [{ query }] = strapiAdmin.useQueryParams();
885
- const locale = query?.plugins?.i18n?.locale || void 0;
886
- const response = useGetMappedEntriesInReleasesQuery(
887
- { contentTypeUid, documentIds, locale },
888
- { skip: !documentIds || !contentTypeUid || documentIds.length === 0 }
889
- );
890
- const mappedEntriesInReleases = response.data || {};
891
- return mappedEntriesInReleases?.[documentId] || [];
892
- };
893
- const addColumnToTableHook = ({ displayedHeaders, layout }) => {
894
- const { options } = layout;
895
- if (!options?.draftAndPublish) {
896
- return { displayedHeaders, layout };
897
- }
898
- return {
899
- displayedHeaders: [
900
- ...displayedHeaders,
901
- {
902
- searchable: false,
903
- sortable: false,
904
- name: "releases",
905
- label: {
906
- id: "content-releases.content-manager.list-view.releases.header",
907
- defaultMessage: "To be released in"
908
- },
909
- cellFormatter: (props, _, { model }) => /* @__PURE__ */ jsxRuntime.jsx(ReleaseListCell, { ...props, model })
910
- }
911
- ],
912
- layout
913
- };
914
- };
915
- const ReleaseListCell = ({ documentId, model }) => {
916
- const releases = useReleasesList(model, documentId);
917
- const { formatMessage } = reactIntl.useIntl();
918
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Popover.Root, { children: [
919
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Popover.Trigger, { children: /* @__PURE__ */ jsxRuntime.jsx(
920
- designSystem.Button,
921
- {
922
- variant: "ghost",
923
- onClick: (e) => e.stopPropagation(),
924
- endIcon: releases.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(icons.CaretDown, { width: "1.2rem", height: "1.2rem" }) : null,
925
- children: /* @__PURE__ */ jsxRuntime.jsx(
926
- designSystem.Typography,
927
- {
928
- style: { maxWidth: "252px", cursor: "pointer" },
929
- textColor: "neutral800",
930
- fontWeight: "regular",
931
- children: releases.length > 0 ? formatMessage(
932
- {
933
- id: "content-releases.content-manager.list-view.releases-number",
934
- defaultMessage: "{number} {number, plural, one {release} other {releases}}"
935
- },
936
- {
937
- number: releases.length
938
- }
939
- ) : "-"
940
- }
941
- )
942
- }
943
- ) }),
944
- /* @__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)) }) })
945
- ] });
946
- };
947
- const getTimezoneOffset = (timezone, date) => {
948
- try {
949
- const offsetPart = new Intl.DateTimeFormat("en", {
950
- timeZone: timezone,
951
- timeZoneName: "longOffset"
952
- }).formatToParts(date).find((part) => part.type === "timeZoneName");
953
- const offset = offsetPart ? offsetPart.value : "";
954
- let utcOffset = offset.replace("GMT", "UTC");
955
- if (!utcOffset.includes("+") && !utcOffset.includes("-")) {
956
- utcOffset = `${utcOffset}+00:00`;
957
- }
958
- return utcOffset;
959
- } catch (error) {
960
- return "";
961
- }
962
- };
963
- const getTimezones = (selectedDate) => {
964
- const timezoneList = Intl.supportedValuesOf("timeZone").map((timezone) => {
965
- const utcOffset = getTimezoneOffset(timezone, selectedDate);
966
- return { offset: utcOffset, value: `${utcOffset}&${timezone}` };
967
- });
968
- const systemTimezone = timezoneList.find(
969
- (timezone) => timezone.value.split("&")[1] === Intl.DateTimeFormat().resolvedOptions().timeZone
970
- );
971
- return { timezoneList, systemTimezone };
972
- };
973
- const StyledMenuItem = styledComponents.styled(designSystem.Menu.Item)`
974
- &:hover {
975
- background: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}100`]};
976
-
977
- svg {
978
- fill: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}600`]};
979
- }
980
-
981
- a {
982
- color: ${({ theme }) => theme.colors.neutral800};
983
- }
984
- }
985
-
986
- svg {
987
- color: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}500`]};
988
- }
989
-
990
- span {
991
- color: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}800`]};
992
- }
993
-
994
- span,
995
- a {
996
- width: 100%;
997
- }
998
- `;
999
- const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
1000
- const { formatMessage } = reactIntl.useIntl();
1001
- const { toggleNotification } = strapiAdmin.useNotification();
1002
- const { formatAPIError } = strapiAdmin.useAPIErrorHandler();
1003
- const [deleteReleaseAction] = useDeleteReleaseActionMutation();
1004
- const {
1005
- allowedActions: { canDeleteAction }
1006
- } = strapiAdmin.useRBAC(PERMISSIONS);
1007
- const handleDeleteAction = async () => {
1008
- const response = await deleteReleaseAction({
1009
- params: { releaseId, actionId }
1010
- });
1011
- if ("data" in response) {
1012
- toggleNotification({
1013
- type: "success",
1014
- message: formatMessage({
1015
- id: "content-releases.content-manager-edit-view.remove-from-release.notification.success",
1016
- defaultMessage: "Entry removed from release"
1017
- })
1018
- });
1019
- return;
1020
- }
1021
- if ("error" in response) {
1022
- if (strapiAdmin.isFetchError(response.error)) {
1023
- toggleNotification({
1024
- type: "danger",
1025
- message: formatAPIError(response.error)
1026
- });
1027
- } else {
1028
- toggleNotification({
1029
- type: "danger",
1030
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1031
- });
1032
- }
1033
- }
1034
- };
1035
- if (!canDeleteAction) {
1036
- return null;
1037
- }
1038
- return /* @__PURE__ */ jsxRuntime.jsx(StyledMenuItem, { $variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
1039
- /* @__PURE__ */ jsxRuntime.jsx(icons.Cross, { width: "1.6rem", height: "1.6rem" }),
1040
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
1041
- id: "content-releases.content-manager-edit-view.remove-from-release",
1042
- defaultMessage: "Remove from release"
1043
- }) })
1044
- ] }) });
1045
- };
1046
- const ReleaseActionEntryLinkItem = ({
1047
- contentTypeUid,
1048
- documentId,
1049
- locale
1050
- }) => {
1051
- const { formatMessage } = reactIntl.useIntl();
1052
- const userPermissions = strapiAdmin.useAuth("ReleaseActionEntryLinkItem", (state) => state.permissions);
1053
- const canUpdateEntryForLocale = React__namespace.useMemo(() => {
1054
- const updatePermissions = userPermissions.find(
1055
- (permission) => permission.subject === contentTypeUid && permission.action === "plugin::content-manager.explorer.update"
1056
- );
1057
- if (!updatePermissions) {
1058
- return false;
1059
- }
1060
- return Boolean(!locale || updatePermissions.properties?.locales?.includes(locale));
1061
- }, [contentTypeUid, locale, userPermissions]);
1062
- const {
1063
- allowedActions: { canUpdate: canUpdateContentType }
1064
- } = strapiAdmin.useRBAC({
1065
- updateContentType: [
1066
- {
1067
- action: "plugin::content-manager.explorer.update",
1068
- subject: contentTypeUid
1069
- }
1070
- ]
1071
- });
1072
- if (!canUpdateContentType || !canUpdateEntryForLocale) {
1073
- return null;
1074
- }
1075
- return /* @__PURE__ */ jsxRuntime.jsx(
1076
- StyledMenuItem,
1077
- {
1078
- tag: reactRouterDom.NavLink,
1079
- isLink: true,
1080
- to: {
1081
- pathname: `/content-manager/collection-types/${contentTypeUid}/${documentId}`,
1082
- search: locale && `?plugins[i18n][locale]=${locale}`
1083
- },
1084
- children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
1085
- /* @__PURE__ */ jsxRuntime.jsx(icons.Pencil, { width: "1.6rem", height: "1.6rem" }),
1086
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", children: formatMessage({
1087
- id: "content-releases.content-manager-edit-view.edit-entry",
1088
- defaultMessage: "Edit entry"
1089
- }) })
1090
- ] })
1091
- }
1092
- );
1093
- };
1094
- const EditReleaseItem = ({ releaseId }) => {
1095
- const { formatMessage } = reactIntl.useIntl();
1096
- return (
1097
- /* @ts-expect-error inference isn't working in DS */
1098
- /* @__PURE__ */ jsxRuntime.jsx(StyledMenuItem, { tag: reactRouterDom.NavLink, isLink: true, to: `/plugins/content-releases/${releaseId}`, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
1099
- /* @__PURE__ */ jsxRuntime.jsx(icons.Pencil, { width: "1.6rem", height: "1.6rem" }),
1100
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", variant: "omega", children: formatMessage({
1101
- id: "content-releases.content-manager-edit-view.edit-release",
1102
- defaultMessage: "Edit release"
1103
- }) })
1104
- ] }) })
1105
- );
1106
- };
1107
- const Root = ({ children }) => {
1108
- const { formatMessage } = reactIntl.useIntl();
1109
- const { allowedActions } = strapiAdmin.useRBAC(PERMISSIONS);
1110
- return (
1111
- // A user can access the dropdown if they have permissions to delete a release-action OR update a release
1112
- allowedActions.canDeleteAction || allowedActions.canUpdate ? /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Root, { children: [
1113
- /* @__PURE__ */ jsxRuntime.jsx(StyledMoreButton, { variant: "tertiary", endIcon: null, paddingLeft: "7px", paddingRight: "7px", children: /* @__PURE__ */ jsxRuntime.jsx(
1114
- designSystem.AccessibleIcon,
1115
- {
1116
- label: formatMessage({
1117
- id: "content-releases.content-manager-edit-view.release-action-menu",
1118
- defaultMessage: "Release action options"
1119
- }),
1120
- children: /* @__PURE__ */ jsxRuntime.jsx(icons.More, {})
1121
- }
1122
- ) }),
1123
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Content, { top: 1, popoverPlacement: "bottom-end", children })
1124
- ] }) : null
1125
- );
1126
- };
1127
- const StyledMoreButton = styledComponents.styled(designSystem.Menu.Trigger)`
1128
- & > span {
1129
- display: flex;
1130
- }
1131
- `;
1132
- const ReleaseActionMenu = {
1133
- Root,
1134
- EditReleaseItem,
1135
- DeleteReleaseActionItem,
1136
- ReleaseActionEntryLinkItem
1137
- };
1138
- const Panel = ({ model, documentId, collectionType }) => {
1139
- const [{ query }] = strapiAdmin.useQueryParams();
1140
- const locale = query.plugins?.i18n?.locale;
1141
- const {
1142
- edit: { options }
1143
- } = strapiAdmin$1.unstable_useDocumentLayout(model);
1144
- const { formatMessage, formatDate, formatTime } = reactIntl.useIntl();
1145
- const { allowedActions } = strapiAdmin.useRBAC(PERMISSIONS);
1146
- const { canRead, canDeleteAction } = allowedActions;
1147
- const response = useGetReleasesForEntryQuery({
1148
- contentType: model,
1149
- entryDocumentId: documentId,
1150
- locale,
1151
- hasEntryAttached: true
1152
- });
1153
- const releases = response.data?.data;
1154
- const getReleaseColorVariant = (actionType, shade) => {
1155
- if (actionType === "unpublish") {
1156
- return `secondary${shade}`;
1157
- }
1158
- return `success${shade}`;
1159
- };
1160
- if (!window.strapi.isEE || !options?.draftAndPublish || !canRead) {
1161
- return null;
1162
- }
1163
- if (collectionType === "collection-types" && (!documentId || documentId === "create")) {
1164
- return null;
1165
- }
1166
- if (releases && releases.length === 0) {
1167
- return null;
1168
- }
1169
- return {
1170
- title: formatMessage({
1171
- id: "content-releases.plugin.name",
1172
- defaultMessage: "Releases"
1173
- }),
1174
- content: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 3, width: "100%", children: releases?.map((release) => /* @__PURE__ */ jsxRuntime.jsxs(
1175
- designSystem.Flex,
1176
- {
1177
- direction: "column",
1178
- alignItems: "start",
1179
- borderWidth: "1px",
1180
- borderStyle: "solid",
1181
- borderColor: getReleaseColorVariant(release.actions[0].type, "200"),
1182
- overflow: "hidden",
1183
- hasRadius: true,
1184
- children: [
1185
- /* @__PURE__ */ jsxRuntime.jsx(
1186
- designSystem.Box,
1187
- {
1188
- paddingTop: 3,
1189
- paddingBottom: 3,
1190
- paddingLeft: 4,
1191
- paddingRight: 4,
1192
- background: getReleaseColorVariant(release.actions[0].type, "100"),
1193
- width: "100%",
1194
- children: /* @__PURE__ */ jsxRuntime.jsx(
1195
- designSystem.Typography,
1196
- {
1197
- fontSize: 1,
1198
- variant: "pi",
1199
- textColor: getReleaseColorVariant(release.actions[0].type, "600"),
1200
- children: formatMessage(
1201
- {
1202
- id: "content-releases.content-manager-edit-view.list-releases.title",
1203
- defaultMessage: "{isPublish, select, true {Will be published in} other {Will be unpublished in}}"
1204
- },
1205
- { isPublish: release.actions[0].type === "publish" }
1206
- )
1207
- }
1208
- )
1209
- }
1210
- ),
1211
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { padding: 4, direction: "column", gap: 2, width: "100%", alignItems: "flex-start", children: [
1212
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
1213
- release.scheduledAt && release.timezone && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", textColor: "neutral600", children: formatMessage(
1214
- {
1215
- id: "content-releases.content-manager-edit-view.scheduled.date",
1216
- defaultMessage: "{date} at {time} ({offset})"
1217
- },
1218
- {
1219
- date: formatDate(new Date(release.scheduledAt), {
1220
- day: "2-digit",
1221
- month: "2-digit",
1222
- year: "numeric",
1223
- timeZone: release.timezone
1224
- }),
1225
- time: formatTime(new Date(release.scheduledAt), {
1226
- hourCycle: "h23",
1227
- timeZone: release.timezone
1228
- }),
1229
- offset: getTimezoneOffset(release.timezone, new Date(release.scheduledAt))
1230
- }
1231
- ) }),
1232
- canDeleteAction ? /* @__PURE__ */ jsxRuntime.jsxs(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: [
1233
- /* @__PURE__ */ jsxRuntime.jsx(ReleaseActionMenu.EditReleaseItem, { releaseId: release.id }),
1234
- /* @__PURE__ */ jsxRuntime.jsx(
1235
- ReleaseActionMenu.DeleteReleaseActionItem,
1236
- {
1237
- releaseId: release.id,
1238
- actionId: release.actions[0].id
1239
- }
1240
- )
1241
- ] }) : null
1242
- ] })
1243
- ]
1244
- },
1245
- release.id
1246
- )) })
1247
- };
1248
- };
1249
- const pluginId = "content-releases";
1250
- const prefixPluginTranslations = (trad, pluginId2) => {
1251
- if (!pluginId2) {
1252
- throw new TypeError("pluginId can't be empty");
1253
- }
1254
- return Object.keys(trad).reduce((acc, current) => {
1255
- acc[`${pluginId2}.${current}`] = trad[current];
1256
- return acc;
1257
- }, {});
1258
- };
1259
- const admin = {
1260
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1261
- register(app) {
1262
- app.createHook("ContentReleases/pages/ReleaseDetails/add-locale-in-releases");
1263
- if (window.strapi.features.isEnabled("cms-content-releases")) {
1264
- app.addMenuLink({
1265
- to: `plugins/${pluginId}`,
1266
- icon: icons.PaperPlane,
1267
- intlLabel: {
1268
- id: `${pluginId}.plugin.name`,
1269
- defaultMessage: "Releases"
1270
- },
1271
- Component: () => Promise.resolve().then(() => require("./App-BFo3ibui.js")).then((mod) => ({ default: mod.App })),
1272
- permissions: PERMISSIONS.main,
1273
- position: 2
1274
- });
1275
- const contentManagerPluginApis = app.getPlugin("content-manager").apis;
1276
- if ("addEditViewSidePanel" in contentManagerPluginApis && typeof contentManagerPluginApis.addEditViewSidePanel === "function") {
1277
- contentManagerPluginApis.addEditViewSidePanel([Panel]);
1278
- }
1279
- if ("addDocumentAction" in contentManagerPluginApis && typeof contentManagerPluginApis.addDocumentAction === "function") {
1280
- contentManagerPluginApis.addDocumentAction((actions) => {
1281
- const indexOfDeleteAction = actions.findIndex((action) => action.type === "unpublish");
1282
- actions.splice(indexOfDeleteAction, 0, ReleaseActionModalForm);
1283
- return actions;
1284
- });
1285
- }
1286
- app.addSettingsLink("global", {
1287
- id: pluginId,
1288
- to: "releases",
1289
- intlLabel: {
1290
- id: `${pluginId}.plugin.name`,
1291
- defaultMessage: "Releases"
1292
- },
1293
- permissions: [],
1294
- async Component() {
1295
- const { ProtectedReleasesSettingsPage } = await Promise.resolve().then(() => require("./ReleasesSettingsPage-BanjZwEc.js"));
1296
- return { default: ProtectedReleasesSettingsPage };
1297
- }
1298
- });
1299
- if ("addBulkAction" in contentManagerPluginApis && typeof contentManagerPluginApis.addBulkAction === "function") {
1300
- contentManagerPluginApis.addBulkAction((actions) => {
1301
- const deleteActionIndex = actions.findIndex((action) => action.type === "delete");
1302
- actions.splice(deleteActionIndex, 0, ReleaseAction);
1303
- return actions;
1304
- });
1305
- }
1306
- app.registerHook("Admin/CM/pages/ListView/inject-column-in-table", addColumnToTableHook);
1307
- } else if (!window.strapi.features.isEnabled("cms-content-releases") && window.strapi?.flags?.promoteEE) {
1308
- app.addSettingsLink("global", {
1309
- id: pluginId,
1310
- to: "/plugins/purchase-content-releases",
1311
- intlLabel: {
1312
- id: `${pluginId}.plugin.name`,
1313
- defaultMessage: "Releases"
1314
- },
1315
- permissions: [],
1316
- async Component() {
1317
- const { PurchaseContentReleases } = await Promise.resolve().then(() => require("./PurchaseContentReleases-Be3acS2L.js"));
1318
- return { default: PurchaseContentReleases };
1319
- },
1320
- licenseOnly: true
1321
- });
1322
- }
1323
- },
1324
- async registerTrads({ locales }) {
1325
- const importedTrads = await Promise.all(
1326
- locales.map((locale) => {
1327
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => Promise.resolve().then(() => require("./en-CmYoEnA7.js")) }), `./translations/${locale}.json`).then(({ default: data }) => {
1328
- return {
1329
- data: prefixPluginTranslations(data, "content-releases"),
1330
- locale
1331
- };
1332
- }).catch(() => {
1333
- return {
1334
- data: {},
1335
- locale
1336
- };
1337
- });
1338
- })
1339
- );
1340
- return Promise.resolve(importedTrads);
1341
- }
1342
- };
1343
- exports.PERMISSIONS = PERMISSIONS;
1344
- exports.ReleaseActionMenu = ReleaseActionMenu;
1345
- exports.ReleaseActionOptions = ReleaseActionOptions;
1346
- exports.admin = admin;
1347
- exports.getTimezoneOffset = getTimezoneOffset;
1348
- exports.getTimezones = getTimezones;
1349
- exports.pluginId = pluginId;
1350
- exports.releaseApi = releaseApi;
1351
- exports.useCreateReleaseMutation = useCreateReleaseMutation;
1352
- exports.useDeleteReleaseMutation = useDeleteReleaseMutation;
1353
- exports.useGetReleaseActionsQuery = useGetReleaseActionsQuery;
1354
- exports.useGetReleaseQuery = useGetReleaseQuery;
1355
- exports.useGetReleaseSettingsQuery = useGetReleaseSettingsQuery;
1356
- exports.useGetReleasesQuery = useGetReleasesQuery;
1357
- exports.usePublishReleaseMutation = usePublishReleaseMutation;
1358
- exports.useUpdateReleaseActionMutation = useUpdateReleaseActionMutation;
1359
- exports.useUpdateReleaseMutation = useUpdateReleaseMutation;
1360
- exports.useUpdateReleaseSettingsMutation = useUpdateReleaseSettingsMutation;
1361
- //# sourceMappingURL=index-Em3KctMx.js.map