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

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 (33) 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-jrh58sXY.mjs +1330 -0
  4. package/dist/_chunks/App-jrh58sXY.mjs.map +1 -0
  5. package/dist/_chunks/PurchaseContentReleases-3tRbmbY3.mjs +51 -0
  6. package/dist/_chunks/PurchaseContentReleases-3tRbmbY3.mjs.map +1 -0
  7. package/dist/_chunks/PurchaseContentReleases-bpIYXOfu.js +51 -0
  8. package/dist/_chunks/PurchaseContentReleases-bpIYXOfu.js.map +1 -0
  9. package/dist/_chunks/{en-haKSQIo8.js → en-HrREghh3.js} +31 -7
  10. package/dist/_chunks/en-HrREghh3.js.map +1 -0
  11. package/dist/_chunks/{en-ngTk74JV.mjs → en-ltT1TlKQ.mjs} +31 -7
  12. package/dist/_chunks/en-ltT1TlKQ.mjs.map +1 -0
  13. package/dist/_chunks/{index-EdBmRHRU.js → index-CVO0Rqdm.js} +551 -64
  14. package/dist/_chunks/index-CVO0Rqdm.js.map +1 -0
  15. package/dist/_chunks/{index-XAQOX_IB.mjs → index-PiOGBETy.mjs} +570 -83
  16. package/dist/_chunks/index-PiOGBETy.mjs.map +1 -0
  17. package/dist/admin/index.js +2 -1
  18. package/dist/admin/index.js.map +1 -1
  19. package/dist/admin/index.mjs +3 -2
  20. package/dist/admin/index.mjs.map +1 -1
  21. package/dist/server/index.js +1192 -299
  22. package/dist/server/index.js.map +1 -1
  23. package/dist/server/index.mjs +1191 -300
  24. package/dist/server/index.mjs.map +1 -1
  25. package/package.json +16 -12
  26. package/dist/_chunks/App-g2P5kbSm.mjs +0 -945
  27. package/dist/_chunks/App-g2P5kbSm.mjs.map +0 -1
  28. package/dist/_chunks/App-o5_WfqR-.js +0 -967
  29. package/dist/_chunks/App-o5_WfqR-.js.map +0 -1
  30. package/dist/_chunks/en-haKSQIo8.js.map +0 -1
  31. package/dist/_chunks/en-ngTk74JV.mjs.map +0 -1
  32. package/dist/_chunks/index-EdBmRHRU.js.map +0 -1
  33. package/dist/_chunks/index-XAQOX_IB.mjs.map +0 -1
@@ -1,967 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const jsxRuntime = require("react/jsx-runtime");
4
- const helperPlugin = require("@strapi/helper-plugin");
5
- const reactRouterDom = require("react-router-dom");
6
- const index = require("./index-EdBmRHRU.js");
7
- const React = require("react");
8
- const designSystem = require("@strapi/design-system");
9
- const v2 = require("@strapi/design-system/v2");
10
- const icons = require("@strapi/icons");
11
- const reactIntl = require("react-intl");
12
- const styled = require("styled-components");
13
- const formik = require("formik");
14
- const yup = require("yup");
15
- require("@reduxjs/toolkit/query");
16
- require("axios");
17
- require("@reduxjs/toolkit/query/react");
18
- const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
19
- function _interopNamespace(e) {
20
- if (e && e.__esModule)
21
- return e;
22
- const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
23
- if (e) {
24
- for (const k in e) {
25
- if (k !== "default") {
26
- const d = Object.getOwnPropertyDescriptor(e, k);
27
- Object.defineProperty(n, k, d.get ? d : {
28
- enumerable: true,
29
- get: () => e[k]
30
- });
31
- }
32
- }
33
- }
34
- n.default = e;
35
- return Object.freeze(n);
36
- }
37
- const React__namespace = /* @__PURE__ */ _interopNamespace(React);
38
- const styled__default = /* @__PURE__ */ _interopDefault(styled);
39
- const yup__namespace = /* @__PURE__ */ _interopNamespace(yup);
40
- const RELEASE_SCHEMA = yup__namespace.object().shape({
41
- name: yup__namespace.string().trim().required()
42
- }).required().noUnknown();
43
- const ReleaseModal = ({
44
- handleClose,
45
- handleSubmit,
46
- initialValues,
47
- isLoading = false
48
- }) => {
49
- const { formatMessage } = reactIntl.useIntl();
50
- const { pathname } = reactRouterDom.useLocation();
51
- const isCreatingRelease = pathname === `/plugins/${index.pluginId}`;
52
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.ModalLayout, { onClose: handleClose, labelledBy: "title", children: [
53
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.ModalHeader, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { id: "title", fontWeight: "bold", textColor: "neutral800", children: formatMessage(
54
- {
55
- id: "content-releases.modal.title",
56
- defaultMessage: "{isCreatingRelease, select, true {New release} other {Edit release}}"
57
- },
58
- { isCreatingRelease }
59
- ) }) }),
60
- /* @__PURE__ */ jsxRuntime.jsx(
61
- formik.Formik,
62
- {
63
- validateOnChange: false,
64
- onSubmit: handleSubmit,
65
- initialValues,
66
- validationSchema: RELEASE_SCHEMA,
67
- children: ({ values, errors, handleChange }) => /* @__PURE__ */ jsxRuntime.jsxs(formik.Form, { children: [
68
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.ModalBody, { children: /* @__PURE__ */ jsxRuntime.jsx(
69
- designSystem.TextInput,
70
- {
71
- label: formatMessage({
72
- id: "content-releases.modal.form.input.label.release-name",
73
- defaultMessage: "Name"
74
- }),
75
- name: "name",
76
- value: values.name,
77
- error: errors.name,
78
- onChange: handleChange,
79
- required: true
80
- }
81
- ) }),
82
- /* @__PURE__ */ jsxRuntime.jsx(
83
- designSystem.ModalFooter,
84
- {
85
- startActions: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: handleClose, variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }),
86
- endActions: /* @__PURE__ */ jsxRuntime.jsx(
87
- designSystem.Button,
88
- {
89
- name: "submit",
90
- loading: isLoading,
91
- disabled: !values.name || values.name === initialValues.name,
92
- type: "submit",
93
- children: formatMessage(
94
- {
95
- id: "content-releases.modal.form.button.submit",
96
- defaultMessage: "{isCreatingRelease, select, true {Continue} other {Save}}"
97
- },
98
- { isCreatingRelease }
99
- )
100
- }
101
- )
102
- }
103
- )
104
- ] })
105
- }
106
- )
107
- ] });
108
- };
109
- const ReleaseInfoWrapper = styled__default.default(designSystem.Flex)`
110
- align-self: stretch;
111
- border-bottom-right-radius: ${({ theme }) => theme.borderRadius};
112
- border-bottom-left-radius: ${({ theme }) => theme.borderRadius};
113
- border-top: 1px solid ${({ theme }) => theme.colors.neutral150};
114
- `;
115
- const StyledFlex = styled__default.default(designSystem.Flex)`
116
- align-self: stretch;
117
- cursor: ${({ disabled }) => disabled ? "not-allowed" : "pointer"};
118
-
119
- svg path {
120
- fill: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
121
- }
122
- span {
123
- color: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
124
- }
125
- `;
126
- const PencilIcon = styled__default.default(icons.Pencil)`
127
- width: ${({ theme }) => theme.spaces[4]};
128
- height: ${({ theme }) => theme.spaces[4]};
129
- path {
130
- fill: ${({ theme }) => theme.colors.neutral600};
131
- }
132
- `;
133
- const TrashIcon = styled__default.default(icons.Trash)`
134
- width: ${({ theme }) => theme.spaces[4]};
135
- height: ${({ theme }) => theme.spaces[4]};
136
- path {
137
- fill: ${({ theme }) => theme.colors.danger600};
138
- }
139
- `;
140
- const PopoverButton = ({ onClick, disabled, children }) => {
141
- return /* @__PURE__ */ jsxRuntime.jsx(
142
- StyledFlex,
143
- {
144
- paddingTop: 2,
145
- paddingBottom: 2,
146
- paddingLeft: 4,
147
- paddingRight: 4,
148
- alignItems: "center",
149
- gap: 2,
150
- as: "button",
151
- hasRadius: true,
152
- onClick,
153
- disabled,
154
- children
155
- }
156
- );
157
- };
158
- const EntryValidationText = ({ status, action }) => {
159
- const { formatMessage } = reactIntl.useIntl();
160
- if (action == "publish") {
161
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
162
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Icon, { color: "success600", as: icons.CheckCircle }),
163
- status === "published" ? /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
164
- id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
165
- defaultMessage: "Already published"
166
- }) }) : /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: formatMessage({
167
- id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish",
168
- defaultMessage: "Ready to publish"
169
- }) })
170
- ] });
171
- }
172
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
173
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Icon, { color: "success600", as: icons.CheckCircle }),
174
- status === "draft" ? /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
175
- id: "content-releases.pages.ReleaseDetails.entry-validation.already-unpublished",
176
- defaultMessage: "Already unpublished"
177
- }) }) : /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: formatMessage({
178
- id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-unpublish",
179
- defaultMessage: "Ready to unpublish"
180
- }) })
181
- ] });
182
- };
183
- const ReleaseDetailsLayout = ({
184
- toggleEditReleaseModal,
185
- toggleWarningSubmit,
186
- children
187
- }) => {
188
- const { formatMessage } = reactIntl.useIntl();
189
- const { releaseId } = reactRouterDom.useParams();
190
- const [isPopoverVisible, setIsPopoverVisible] = React__namespace.useState(false);
191
- const moreButtonRef = React__namespace.useRef(null);
192
- const {
193
- data,
194
- isLoading: isLoadingDetails,
195
- isError,
196
- error
197
- } = index.useGetReleaseQuery({ id: releaseId });
198
- const [publishRelease, { isLoading: isPublishing }] = index.usePublishReleaseMutation();
199
- const toggleNotification = helperPlugin.useNotification();
200
- const { formatAPIError } = helperPlugin.useAPIErrorHandler();
201
- const {
202
- allowedActions: { canUpdate, canDelete }
203
- } = helperPlugin.useRBAC(index.PERMISSIONS);
204
- const release = data?.data;
205
- const handleTogglePopover = () => {
206
- setIsPopoverVisible((prev) => !prev);
207
- };
208
- const openReleaseModal = () => {
209
- toggleEditReleaseModal();
210
- handleTogglePopover();
211
- };
212
- const handlePublishRelease = async () => {
213
- const response = await publishRelease({ id: releaseId });
214
- if ("data" in response) {
215
- toggleNotification({
216
- type: "success",
217
- message: formatMessage({
218
- id: "content-releases.pages.ReleaseDetails.publish-notification-success",
219
- defaultMessage: "Release was published successfully."
220
- })
221
- });
222
- } else if (index.isAxiosError(response.error)) {
223
- toggleNotification({
224
- type: "warning",
225
- message: formatAPIError(response.error)
226
- });
227
- } else {
228
- toggleNotification({
229
- type: "warning",
230
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
231
- });
232
- }
233
- };
234
- const openWarningConfirmDialog = () => {
235
- toggleWarningSubmit();
236
- handleTogglePopover();
237
- };
238
- if (isLoadingDetails) {
239
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Main, { "aria-busy": isLoadingDetails, children: /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.LoadingIndicatorPage, {}) });
240
- }
241
- if (isError || !release) {
242
- return /* @__PURE__ */ jsxRuntime.jsx(
243
- reactRouterDom.Redirect,
244
- {
245
- to: {
246
- pathname: "/plugins/content-releases",
247
- state: {
248
- errors: [
249
- {
250
- code: error?.code
251
- }
252
- ]
253
- }
254
- }
255
- }
256
- );
257
- }
258
- const totalEntries = release.actions.meta.count || 0;
259
- const createdBy = release.createdBy.lastname ? `${release.createdBy.firstname} ${release.createdBy.lastname}` : `${release.createdBy.firstname}`;
260
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Main, { "aria-busy": isLoadingDetails, children: [
261
- /* @__PURE__ */ jsxRuntime.jsx(
262
- designSystem.HeaderLayout,
263
- {
264
- title: release.name,
265
- subtitle: formatMessage(
266
- {
267
- id: "content-releases.pages.Details.header-subtitle",
268
- defaultMessage: "{number, plural, =0 {No entries} one {# entry} other {# entries}}"
269
- },
270
- { number: totalEntries }
271
- ),
272
- navigationAction: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Link, { startIcon: /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowLeft, {}), to: "/plugins/content-releases", children: formatMessage({
273
- id: "global.back",
274
- defaultMessage: "Back"
275
- }) }),
276
- primaryAction: !release.releasedAt && /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
277
- /* @__PURE__ */ jsxRuntime.jsx(
278
- designSystem.IconButton,
279
- {
280
- label: formatMessage({
281
- id: "content-releases.header.actions.open-release-actions",
282
- defaultMessage: "Release actions"
283
- }),
284
- ref: moreButtonRef,
285
- onClick: handleTogglePopover,
286
- children: /* @__PURE__ */ jsxRuntime.jsx(icons.More, {})
287
- }
288
- ),
289
- isPopoverVisible && /* @__PURE__ */ jsxRuntime.jsxs(
290
- designSystem.Popover,
291
- {
292
- source: moreButtonRef,
293
- placement: "bottom-end",
294
- onDismiss: handleTogglePopover,
295
- spacing: 4,
296
- minWidth: "242px",
297
- children: [
298
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { alignItems: "center", justifyContent: "center", direction: "column", padding: 1, children: [
299
- /* @__PURE__ */ jsxRuntime.jsxs(PopoverButton, { disabled: !canUpdate, onClick: openReleaseModal, children: [
300
- /* @__PURE__ */ jsxRuntime.jsx(PencilIcon, {}),
301
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { ellipsis: true, children: formatMessage({
302
- id: "content-releases.header.actions.edit",
303
- defaultMessage: "Edit"
304
- }) })
305
- ] }),
306
- /* @__PURE__ */ jsxRuntime.jsxs(PopoverButton, { disabled: !canDelete, onClick: openWarningConfirmDialog, children: [
307
- /* @__PURE__ */ jsxRuntime.jsx(TrashIcon, {}),
308
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
309
- id: "content-releases.header.actions.delete",
310
- defaultMessage: "Delete"
311
- }) })
312
- ] })
313
- ] }),
314
- /* @__PURE__ */ jsxRuntime.jsxs(
315
- ReleaseInfoWrapper,
316
- {
317
- direction: "column",
318
- justifyContent: "center",
319
- alignItems: "flex-start",
320
- gap: 1,
321
- padding: 5,
322
- children: [
323
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", fontWeight: "bold", children: formatMessage({
324
- id: "content-releases.header.actions.created",
325
- defaultMessage: "Created"
326
- }) }),
327
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { variant: "pi", color: "neutral300", children: [
328
- /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.RelativeTime, { timestamp: new Date(release.createdAt) }),
329
- formatMessage(
330
- {
331
- id: "content-releases.header.actions.created.description",
332
- defaultMessage: " by {createdBy}"
333
- },
334
- { createdBy }
335
- )
336
- ] })
337
- ]
338
- }
339
- )
340
- ]
341
- }
342
- ),
343
- /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: index.PERMISSIONS.publish, children: /* @__PURE__ */ jsxRuntime.jsx(
344
- designSystem.Button,
345
- {
346
- size: "S",
347
- variant: "default",
348
- onClick: handlePublishRelease,
349
- loading: isPublishing,
350
- disabled: release.actions.meta.count === 0,
351
- children: formatMessage({
352
- id: "content-releases.header.actions.publish",
353
- defaultMessage: "Publish"
354
- })
355
- }
356
- ) })
357
- ] })
358
- }
359
- ),
360
- children
361
- ] });
362
- };
363
- const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
364
- const getGroupByOptionLabel = (value) => {
365
- if (value === "locale") {
366
- return {
367
- id: "content-releases.pages.ReleaseDetails.groupBy.option.locales",
368
- defaultMessage: "Locales"
369
- };
370
- }
371
- if (value === "action") {
372
- return {
373
- id: "content-releases.pages.ReleaseDetails.groupBy.option.actions",
374
- defaultMessage: "Actions"
375
- };
376
- }
377
- return {
378
- id: "content-releases.pages.ReleaseDetails.groupBy.option.content-type",
379
- defaultMessage: "Content-Types"
380
- };
381
- };
382
- const ReleaseDetailsBody = () => {
383
- const { formatMessage } = reactIntl.useIntl();
384
- const { releaseId } = reactRouterDom.useParams();
385
- const [{ query }, setQuery] = helperPlugin.useQueryParams();
386
- const toggleNotification = helperPlugin.useNotification();
387
- const { formatAPIError } = helperPlugin.useAPIErrorHandler();
388
- const {
389
- data: releaseData,
390
- isLoading: isReleaseLoading,
391
- isError: isReleaseError,
392
- error: releaseError
393
- } = index.useGetReleaseQuery({ id: releaseId });
394
- const release = releaseData?.data;
395
- const selectedGroupBy = query?.groupBy || "contentType";
396
- const {
397
- isLoading,
398
- isFetching,
399
- isError,
400
- data,
401
- error: releaseActionsError
402
- } = index.useGetReleaseActionsQuery({
403
- ...query,
404
- releaseId
405
- });
406
- const [updateReleaseAction] = index.useUpdateReleaseActionMutation();
407
- const handleChangeType = async (e, actionId) => {
408
- const response = await updateReleaseAction({
409
- params: {
410
- releaseId,
411
- actionId
412
- },
413
- body: {
414
- type: e.target.value
415
- }
416
- });
417
- if ("error" in response) {
418
- if (index.isAxiosError(response.error)) {
419
- toggleNotification({
420
- type: "warning",
421
- message: formatAPIError(response.error)
422
- });
423
- } else {
424
- toggleNotification({
425
- type: "warning",
426
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
427
- });
428
- }
429
- }
430
- };
431
- if (isLoading || isReleaseLoading) {
432
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.ContentLayout, { children: /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.LoadingIndicatorPage, {}) });
433
- }
434
- const releaseActions = data?.data;
435
- const releaseMeta = data?.meta;
436
- if (isError || isReleaseError || !release || !releaseActions) {
437
- const errorsArray = [];
438
- if (releaseError) {
439
- errorsArray.push({
440
- code: releaseError.code
441
- });
442
- }
443
- if (releaseActionsError) {
444
- errorsArray.push({
445
- code: releaseActionsError.code
446
- });
447
- }
448
- return /* @__PURE__ */ jsxRuntime.jsx(
449
- reactRouterDom.Redirect,
450
- {
451
- to: {
452
- pathname: "/plugins/content-releases",
453
- state: {
454
- errors: errorsArray
455
- }
456
- }
457
- }
458
- );
459
- }
460
- if (Object.keys(releaseActions).length === 0) {
461
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.ContentLayout, { children: /* @__PURE__ */ jsxRuntime.jsx(
462
- helperPlugin.NoContent,
463
- {
464
- content: {
465
- id: "content-releases.pages.Details.tab.emptyEntries",
466
- defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
467
- },
468
- action: /* @__PURE__ */ jsxRuntime.jsx(
469
- v2.LinkButton,
470
- {
471
- as: reactRouterDom.Link,
472
- to: {
473
- pathname: "/content-manager"
474
- },
475
- style: { textDecoration: "none" },
476
- variant: "secondary",
477
- children: formatMessage({
478
- id: "content-releases.page.Details.button.openContentManager",
479
- defaultMessage: "Open the Content Manager"
480
- })
481
- }
482
- )
483
- }
484
- ) });
485
- }
486
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.ContentLayout, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
487
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { children: /* @__PURE__ */ jsxRuntime.jsx(
488
- designSystem.SingleSelect,
489
- {
490
- "aria-label": formatMessage({
491
- id: "content-releases.pages.ReleaseDetails.groupBy.label",
492
- defaultMessage: "Group by"
493
- }),
494
- customizeContent: (value) => formatMessage(
495
- {
496
- id: `content-releases.pages.ReleaseDetails.groupBy.label`,
497
- defaultMessage: `Group by {groupBy}`
498
- },
499
- {
500
- groupBy: value
501
- }
502
- ),
503
- value: formatMessage(getGroupByOptionLabel(selectedGroupBy)),
504
- onChange: (value) => setQuery({ groupBy: value }),
505
- children: GROUP_BY_OPTIONS.map((option) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: option, children: formatMessage(getGroupByOptionLabel(option)) }, option))
506
- }
507
- ) }),
508
- Object.keys(releaseActions).map((key) => /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 4, direction: "column", alignItems: "stretch", children: [
509
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Badge, { children: key }) }),
510
- /* @__PURE__ */ jsxRuntime.jsx(
511
- helperPlugin.Table.Root,
512
- {
513
- rows: releaseActions[key].map((item) => ({
514
- ...item,
515
- id: Number(item.entry.id)
516
- })),
517
- colCount: releaseActions[key].length,
518
- isLoading,
519
- isFetching,
520
- children: /* @__PURE__ */ jsxRuntime.jsxs(helperPlugin.Table.Content, { children: [
521
- /* @__PURE__ */ jsxRuntime.jsxs(helperPlugin.Table.Head, { children: [
522
- /* @__PURE__ */ jsxRuntime.jsx(
523
- helperPlugin.Table.HeaderCell,
524
- {
525
- fieldSchemaType: "string",
526
- label: formatMessage({
527
- id: "content-releases.page.ReleaseDetails.table.header.label.name",
528
- defaultMessage: "name"
529
- }),
530
- name: "name"
531
- }
532
- ),
533
- /* @__PURE__ */ jsxRuntime.jsx(
534
- helperPlugin.Table.HeaderCell,
535
- {
536
- fieldSchemaType: "string",
537
- label: formatMessage({
538
- id: "content-releases.page.ReleaseDetails.table.header.label.locale",
539
- defaultMessage: "locale"
540
- }),
541
- name: "locale"
542
- }
543
- ),
544
- /* @__PURE__ */ jsxRuntime.jsx(
545
- helperPlugin.Table.HeaderCell,
546
- {
547
- fieldSchemaType: "string",
548
- label: formatMessage({
549
- id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
550
- defaultMessage: "content-type"
551
- }),
552
- name: "content-type"
553
- }
554
- ),
555
- /* @__PURE__ */ jsxRuntime.jsx(
556
- helperPlugin.Table.HeaderCell,
557
- {
558
- fieldSchemaType: "string",
559
- label: formatMessage({
560
- id: "content-releases.page.ReleaseDetails.table.header.label.action",
561
- defaultMessage: "action"
562
- }),
563
- name: "action"
564
- }
565
- ),
566
- !release.releasedAt && /* @__PURE__ */ jsxRuntime.jsx(
567
- helperPlugin.Table.HeaderCell,
568
- {
569
- fieldSchemaType: "string",
570
- label: formatMessage({
571
- id: "content-releases.page.ReleaseDetails.table.header.label.status",
572
- defaultMessage: "status"
573
- }),
574
- name: "status"
575
- }
576
- )
577
- ] }),
578
- /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.Table.LoadingBody, {}),
579
- /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.Table.Body, { children: releaseActions[key].map(({ id, type, entry }) => /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Tr, { children: [
580
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { width: "25%", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { ellipsis: true, children: `${entry.contentType.mainFieldValue || entry.id}` }) }),
581
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: `${entry?.locale?.name ? entry.locale.name : "-"}` }) }),
582
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: entry.contentType.displayName || "" }) }),
583
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: release.releasedAt ? /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: formatMessage(
584
- {
585
- id: "content-releases.page.ReleaseDetails.table.action-published",
586
- defaultMessage: "This entry was <b>{isPublish, select, true {published} other {unpublished}}</b>."
587
- },
588
- {
589
- isPublish: type === "publish",
590
- b: (children) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontWeight: "bold", children })
591
- }
592
- ) }) : /* @__PURE__ */ jsxRuntime.jsx(
593
- index.ReleaseActionOptions,
594
- {
595
- selected: type,
596
- handleChange: (e) => handleChangeType(e, id),
597
- name: `release-action-${id}-type`
598
- }
599
- ) }),
600
- !release.releasedAt && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(EntryValidationText, { status: entry.status, action: type }) }),
601
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxRuntime.jsx(index.ReleaseActionMenu, { releaseId, actionId: id }) }) })
602
- ] }, id)) })
603
- ] })
604
- }
605
- )
606
- ] }, `releases-group-${key}`)),
607
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
608
- /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.PageSizeURLQuery, { defaultValue: releaseMeta?.pagination?.pageSize.toString() }),
609
- /* @__PURE__ */ jsxRuntime.jsx(
610
- helperPlugin.PaginationURLQuery,
611
- {
612
- pagination: {
613
- pageCount: releaseMeta?.pagination?.pageCount || 0
614
- }
615
- }
616
- )
617
- ] })
618
- ] }) });
619
- };
620
- const ReleaseDetailsPage = () => {
621
- const { formatMessage } = reactIntl.useIntl();
622
- const { releaseId } = reactRouterDom.useParams();
623
- const toggleNotification = helperPlugin.useNotification();
624
- const { formatAPIError } = helperPlugin.useAPIErrorHandler();
625
- const { push } = reactRouterDom.useHistory();
626
- const [releaseModalShown, setReleaseModalShown] = React__namespace.useState(false);
627
- const [showWarningSubmit, setWarningSubmit] = React__namespace.useState(false);
628
- const {
629
- isLoading: isLoadingDetails,
630
- data,
631
- isSuccess: isSuccessDetails
632
- } = index.useGetReleaseQuery({ id: releaseId });
633
- const [updateRelease, { isLoading: isSubmittingForm }] = index.useUpdateReleaseMutation();
634
- const [deleteRelease, { isLoading: isDeletingRelease }] = index.useDeleteReleaseMutation();
635
- const toggleEditReleaseModal = () => {
636
- setReleaseModalShown((prev) => !prev);
637
- };
638
- const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);
639
- if (isLoadingDetails) {
640
- return /* @__PURE__ */ jsxRuntime.jsx(
641
- ReleaseDetailsLayout,
642
- {
643
- toggleEditReleaseModal,
644
- toggleWarningSubmit,
645
- children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.ContentLayout, { children: /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.LoadingIndicatorPage, {}) })
646
- }
647
- );
648
- }
649
- const title = isSuccessDetails && data?.data?.name || "";
650
- const handleEditRelease = async (values) => {
651
- const response = await updateRelease({
652
- id: releaseId,
653
- name: values.name
654
- });
655
- if ("data" in response) {
656
- toggleNotification({
657
- type: "success",
658
- message: formatMessage({
659
- id: "content-releases.modal.release-updated-notification-success",
660
- defaultMessage: "Release updated."
661
- })
662
- });
663
- } else if (index.isAxiosError(response.error)) {
664
- toggleNotification({
665
- type: "warning",
666
- message: formatAPIError(response.error)
667
- });
668
- } else {
669
- toggleNotification({
670
- type: "warning",
671
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
672
- });
673
- }
674
- toggleEditReleaseModal();
675
- };
676
- const handleDeleteRelease = async () => {
677
- const response = await deleteRelease({
678
- id: releaseId
679
- });
680
- if ("data" in response) {
681
- push("/plugins/content-releases");
682
- } else if (index.isAxiosError(response.error)) {
683
- toggleNotification({
684
- type: "warning",
685
- message: formatAPIError(response.error)
686
- });
687
- } else {
688
- toggleNotification({
689
- type: "warning",
690
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
691
- });
692
- }
693
- };
694
- return /* @__PURE__ */ jsxRuntime.jsxs(
695
- ReleaseDetailsLayout,
696
- {
697
- toggleEditReleaseModal,
698
- toggleWarningSubmit,
699
- children: [
700
- /* @__PURE__ */ jsxRuntime.jsx(ReleaseDetailsBody, {}),
701
- releaseModalShown && /* @__PURE__ */ jsxRuntime.jsx(
702
- ReleaseModal,
703
- {
704
- handleClose: toggleEditReleaseModal,
705
- handleSubmit: handleEditRelease,
706
- isLoading: isLoadingDetails || isSubmittingForm,
707
- initialValues: { name: title || "" }
708
- }
709
- ),
710
- /* @__PURE__ */ jsxRuntime.jsx(
711
- helperPlugin.ConfirmDialog,
712
- {
713
- bodyText: {
714
- id: "content-releases.dialog.confirmation-message",
715
- defaultMessage: "Are you sure you want to delete this release?"
716
- },
717
- isOpen: showWarningSubmit,
718
- isConfirmButtonLoading: isDeletingRelease,
719
- onToggleDialog: toggleWarningSubmit,
720
- onConfirm: handleDeleteRelease
721
- }
722
- )
723
- ]
724
- }
725
- );
726
- };
727
- const ReleasesLayout = ({
728
- isLoading,
729
- totalReleases,
730
- onClickAddRelease,
731
- children
732
- }) => {
733
- const { formatMessage } = reactIntl.useIntl();
734
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Main, { "aria-busy": isLoading, children: [
735
- /* @__PURE__ */ jsxRuntime.jsx(
736
- designSystem.HeaderLayout,
737
- {
738
- title: formatMessage({
739
- id: "content-releases.pages.Releases.title",
740
- defaultMessage: "Releases"
741
- }),
742
- subtitle: !isLoading && formatMessage(
743
- {
744
- id: "content-releases.pages.Releases.header-subtitle",
745
- defaultMessage: "{number, plural, =0 {No releases} one {# release} other {# releases}}"
746
- },
747
- { number: totalReleases }
748
- ),
749
- primaryAction: /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: index.PERMISSIONS.create, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { startIcon: /* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}), onClick: onClickAddRelease, children: formatMessage({
750
- id: "content-releases.header.actions.add-release",
751
- defaultMessage: "New release"
752
- }) }) })
753
- }
754
- ),
755
- children
756
- ] });
757
- };
758
- const LinkCard = styled__default.default(v2.Link)`
759
- display: block;
760
- `;
761
- const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
762
- const { formatMessage } = reactIntl.useIntl();
763
- if (isError) {
764
- return /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.AnErrorOccurred, {});
765
- }
766
- if (releases?.length === 0) {
767
- return /* @__PURE__ */ jsxRuntime.jsx(
768
- designSystem.EmptyStateLayout,
769
- {
770
- content: formatMessage(
771
- {
772
- id: "content-releases.page.Releases.tab.emptyEntries",
773
- defaultMessage: "No releases"
774
- },
775
- {
776
- target: sectionTitle
777
- }
778
- ),
779
- icon: /* @__PURE__ */ jsxRuntime.jsx(icons.EmptyDocuments, { width: "10rem" })
780
- }
781
- );
782
- }
783
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid, { gap: 4, children: releases.map(({ id, name, actions }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.GridItem, { col: 3, s: 6, xs: 12, children: /* @__PURE__ */ jsxRuntime.jsx(LinkCard, { href: `content-releases/${id}`, isExternal: false, children: /* @__PURE__ */ jsxRuntime.jsxs(
784
- designSystem.Flex,
785
- {
786
- direction: "column",
787
- justifyContent: "space-between",
788
- padding: 4,
789
- hasRadius: true,
790
- background: "neutral0",
791
- shadow: "tableShadow",
792
- height: "100%",
793
- width: "100%",
794
- alignItems: "start",
795
- gap: 2,
796
- children: [
797
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { as: "h3", variant: "delta", fontWeight: "bold", children: name }),
798
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", children: formatMessage(
799
- {
800
- id: "content-releases.page.Releases.release-item.entries",
801
- defaultMessage: "{number, plural, =0 {No entries} one {# entry} other {# entries}}"
802
- },
803
- { number: actions.meta.count }
804
- ) })
805
- ]
806
- }
807
- ) }) }, id)) });
808
- };
809
- const INITIAL_FORM_VALUES = {
810
- name: ""
811
- };
812
- const ReleasesPage = () => {
813
- const location = reactRouterDom.useLocation();
814
- const [releaseModalShown, setReleaseModalShown] = React__namespace.useState(false);
815
- const toggleNotification = helperPlugin.useNotification();
816
- const { formatMessage } = reactIntl.useIntl();
817
- const { push, replace } = reactRouterDom.useHistory();
818
- const { formatAPIError } = helperPlugin.useAPIErrorHandler();
819
- const [{ query }, setQuery] = helperPlugin.useQueryParams();
820
- const response = index.useGetReleasesQuery(query);
821
- const [createRelease, { isLoading: isSubmittingForm }] = index.useCreateReleaseMutation();
822
- const { isLoading, isSuccess, isError } = response;
823
- React__namespace.useEffect(() => {
824
- if (location?.state?.errors) {
825
- toggleNotification({
826
- type: "warning",
827
- title: formatMessage({
828
- id: "content-releases.pages.Releases.notification.error.title",
829
- defaultMessage: "Your request could not be processed."
830
- }),
831
- message: formatMessage({
832
- id: "content-releases.pages.Releases.notification.error.message",
833
- defaultMessage: "Please try again or open another release."
834
- })
835
- });
836
- replace({ state: null });
837
- }
838
- }, [formatMessage, location?.state?.errors, replace, toggleNotification]);
839
- const toggleAddReleaseModal = () => {
840
- setReleaseModalShown((prev) => !prev);
841
- };
842
- if (isLoading) {
843
- return /* @__PURE__ */ jsxRuntime.jsx(ReleasesLayout, { onClickAddRelease: toggleAddReleaseModal, isLoading: true, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.ContentLayout, { children: /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.LoadingIndicatorPage, {}) }) });
844
- }
845
- const totalReleases = isSuccess && response.currentData?.meta?.pagination?.total || 0;
846
- const handleTabChange = (index2) => {
847
- setQuery({
848
- ...query,
849
- page: 1,
850
- pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,
851
- filters: {
852
- releasedAt: {
853
- $notNull: index2 === 0 ? false : true
854
- }
855
- }
856
- });
857
- };
858
- const activeTab = response?.currentData?.meta?.activeTab || "pending";
859
- const handleAddRelease = async (values) => {
860
- const response2 = await createRelease({
861
- name: values.name
862
- });
863
- if ("data" in response2) {
864
- toggleNotification({
865
- type: "success",
866
- message: formatMessage({
867
- id: "content-releases.modal.release-created-notification-success",
868
- defaultMessage: "Release created."
869
- })
870
- });
871
- push(`/plugins/content-releases/${response2.data.data.id}`);
872
- } else if (index.isAxiosError(response2.error)) {
873
- toggleNotification({
874
- type: "warning",
875
- message: formatAPIError(response2.error)
876
- });
877
- } else {
878
- toggleNotification({
879
- type: "warning",
880
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
881
- });
882
- }
883
- };
884
- return /* @__PURE__ */ jsxRuntime.jsxs(ReleasesLayout, { onClickAddRelease: toggleAddReleaseModal, totalReleases, children: [
885
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.ContentLayout, { children: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
886
- /* @__PURE__ */ jsxRuntime.jsxs(
887
- designSystem.TabGroup,
888
- {
889
- label: formatMessage({
890
- id: "content-releases.pages.Releases.tab-group.label",
891
- defaultMessage: "Releases list"
892
- }),
893
- variant: "simple",
894
- initialSelectedTabIndex: ["pending", "done"].indexOf(activeTab),
895
- onTabChange: handleTabChange,
896
- children: [
897
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { paddingBottom: 8, children: [
898
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Tabs, { children: [
899
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tab, { children: formatMessage({
900
- id: "content-releases.pages.Releases.tab.pending",
901
- defaultMessage: "Pending"
902
- }) }),
903
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tab, { children: formatMessage({
904
- id: "content-releases.pages.Releases.tab.done",
905
- defaultMessage: "Done"
906
- }) })
907
- ] }),
908
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Divider, {})
909
- ] }),
910
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.TabPanels, { children: [
911
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.TabPanel, { children: /* @__PURE__ */ jsxRuntime.jsx(
912
- ReleasesGrid,
913
- {
914
- sectionTitle: "pending",
915
- releases: response?.currentData?.data,
916
- isError
917
- }
918
- ) }),
919
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.TabPanel, { children: /* @__PURE__ */ jsxRuntime.jsx(
920
- ReleasesGrid,
921
- {
922
- sectionTitle: "done",
923
- releases: response?.currentData?.data,
924
- isError
925
- }
926
- ) })
927
- ] })
928
- ]
929
- }
930
- ),
931
- totalReleases > 0 && /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
932
- /* @__PURE__ */ jsxRuntime.jsx(
933
- helperPlugin.PageSizeURLQuery,
934
- {
935
- options: ["8", "16", "32", "64"],
936
- defaultValue: response?.currentData?.meta?.pagination?.pageSize.toString()
937
- }
938
- ),
939
- /* @__PURE__ */ jsxRuntime.jsx(
940
- helperPlugin.PaginationURLQuery,
941
- {
942
- pagination: {
943
- pageCount: response?.currentData?.meta?.pagination?.pageCount || 0
944
- }
945
- }
946
- )
947
- ] })
948
- ] }) }),
949
- releaseModalShown && /* @__PURE__ */ jsxRuntime.jsx(
950
- ReleaseModal,
951
- {
952
- handleClose: toggleAddReleaseModal,
953
- handleSubmit: handleAddRelease,
954
- isLoading: isSubmittingForm,
955
- initialValues: INITIAL_FORM_VALUES
956
- }
957
- )
958
- ] });
959
- };
960
- const App = () => {
961
- return /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPagePermissions, { permissions: index.PERMISSIONS.main, children: /* @__PURE__ */ jsxRuntime.jsxs(reactRouterDom.Switch, { children: [
962
- /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Route, { exact: true, path: `/plugins/${index.pluginId}`, component: ReleasesPage }),
963
- /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Route, { exact: true, path: `/plugins/${index.pluginId}/:releaseId`, component: ReleaseDetailsPage })
964
- ] }) });
965
- };
966
- exports.App = App;
967
- //# sourceMappingURL=App-o5_WfqR-.js.map