@strapi/content-releases 0.0.0-experimental.check-license → 0.0.0-next.09b9d36b22a205d90c9303f2e37134938cf76c90

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.
@@ -0,0 +1,967 @@
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-7250b0a5.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-8384e404.js.map