@strapi/i18n 0.0.0-experimental.17b4116f461a49b8ce5386f7c8d79c511d40fb3b → 0.0.0-experimental.7afdc9b682bc83a53ce599c4fb7c9e4506b31fff

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 (29) hide show
  1. package/dist/_chunks/{SettingsPage-Djqsdrzs.js → SettingsPage-CG_qq0Tx.js} +32 -30
  2. package/dist/_chunks/SettingsPage-CG_qq0Tx.js.map +1 -0
  3. package/dist/_chunks/{SettingsPage-CeqfDjsb.mjs → SettingsPage-DNucKxbi.mjs} +31 -29
  4. package/dist/_chunks/SettingsPage-DNucKxbi.mjs.map +1 -0
  5. package/dist/_chunks/{en-CnrTsjWS.mjs → en-18tWw4P6.mjs} +4 -1
  6. package/dist/_chunks/en-18tWw4P6.mjs.map +1 -0
  7. package/dist/_chunks/{en-BuBc6LKZ.js → en-Kv6y9zPQ.js} +4 -1
  8. package/dist/_chunks/en-Kv6y9zPQ.js.map +1 -0
  9. package/dist/_chunks/{index-BDU1w_fd.mjs → index-BYDzOiHE.mjs} +425 -102
  10. package/dist/_chunks/index-BYDzOiHE.mjs.map +1 -0
  11. package/dist/_chunks/{index-DMXJeGjN.js → index-DWAqdQ--.js} +420 -99
  12. package/dist/_chunks/index-DWAqdQ--.js.map +1 -0
  13. package/dist/admin/index.js +1 -1
  14. package/dist/admin/index.mjs +2 -2
  15. package/dist/admin/src/components/BulkLocaleActionModal.d.ts +15 -0
  16. package/dist/admin/src/components/CMHeaderActions.d.ts +7 -1
  17. package/dist/admin/src/contentReleasesHooks/releaseDetailsView.d.ts +9 -5
  18. package/dist/admin/src/services/api.d.ts +2 -3
  19. package/dist/admin/src/services/locales.d.ts +1 -1
  20. package/dist/admin/src/services/relations.d.ts +7 -0
  21. package/dist/admin/src/utils/baseQuery.d.ts +4 -19
  22. package/dist/shared/contracts/content-manager.d.ts +20 -1
  23. package/package.json +15 -16
  24. package/dist/_chunks/SettingsPage-CeqfDjsb.mjs.map +0 -1
  25. package/dist/_chunks/SettingsPage-Djqsdrzs.js.map +0 -1
  26. package/dist/_chunks/en-BuBc6LKZ.js.map +0 -1
  27. package/dist/_chunks/en-CnrTsjWS.mjs.map +0 -1
  28. package/dist/_chunks/index-BDU1w_fd.mjs.map +0 -1
  29. package/dist/_chunks/index-DMXJeGjN.js.map +0 -1
@@ -2,16 +2,15 @@ import get from "lodash/get";
2
2
  import * as yup from "yup";
3
3
  import { jsxs, Fragment, jsx } from "react/jsx-runtime";
4
4
  import * as React from "react";
5
- import { Typography, Checkbox, Dialog, DialogBody, Flex, DialogFooter, Button as Button$1, Status, SingleSelect, SingleSelectOption, VisuallyHidden, useCollator, Popover, Box } from "@strapi/design-system";
6
- import { WarningCircle, Trash, Earth, EarthStriked, CaretDown } from "@strapi/icons";
5
+ import { Typography, Field, Checkbox, Dialog, DialogBody, Flex, DialogFooter, Button as Button$1, Box, Status, IconButton, Tooltip, SingleSelect, SingleSelectOption, VisuallyHidden, useCollator, Popover } from "@strapi/design-system";
6
+ import { WarningCircle, Pencil, CrossCircle, CheckCircle, ArrowsCounterClockwise, Trash, ListPlus, Earth, EarthStriked, CaretDown } from "@strapi/icons";
7
7
  import { useIntl } from "react-intl";
8
- import styled from "styled-components";
9
- import { useAuth, getFetchClient, useQueryParams, useNotification } from "@strapi/admin/strapi-admin";
10
- import { unstable_useDocument, unstable_useDocumentActions } from "@strapi/content-manager/strapi-admin";
11
- import { useParams, useNavigate, matchPath } from "react-router-dom";
12
- import { createApi } from "@reduxjs/toolkit/query/react";
13
- import { isAxiosError } from "axios";
8
+ import { styled } from "styled-components";
9
+ import { useAuth, adminApi, useTable, Table, useQueryParams, useNotification, useAPIErrorHandler } from "@strapi/admin/strapi-admin";
10
+ import { unstable_useDocument, unstable_useDocumentActions, buildValidParams } from "@strapi/content-manager/strapi-admin";
11
+ import { useParams, Link, useNavigate, matchPath } from "react-router-dom";
14
12
  import * as qs from "qs";
13
+ import { stringify } from "qs";
15
14
  import omit from "lodash/omit";
16
15
  const __variableDynamicImportRuntimeHelper = (glob, path) => {
17
16
  const v = glob[path];
@@ -60,18 +59,10 @@ const CheckboxConfirmation = ({
60
59
  { ...description.values }
61
60
  ) : "";
62
61
  return /* @__PURE__ */ jsxs(Fragment, { children: [
63
- /* @__PURE__ */ jsx(
64
- Checkbox,
65
- {
66
- hint,
67
- id: name,
68
- name,
69
- onValueChange: handleChange,
70
- value,
71
- type: "checkbox",
72
- children: label
73
- }
74
- ),
62
+ /* @__PURE__ */ jsxs(Field.Root, { hint, name, children: [
63
+ /* @__PURE__ */ jsx(Checkbox, { onValueChange: handleChange, value, type: "checkbox", children: label }),
64
+ /* @__PURE__ */ jsx(Field.Hint, {})
65
+ ] }),
75
66
  isOpen && /* @__PURE__ */ jsxs(Dialog, { onClose: handleToggle, title: "Confirmation", isOpen, children: [
76
67
  /* @__PURE__ */ jsx(DialogBody, { icon: /* @__PURE__ */ jsx(WarningCircle, {}), children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
77
68
  /* @__PURE__ */ jsx(Flex, { justifyContent: "center", children: /* @__PURE__ */ jsx(TextAlignTypography, { id: "confirm-description", children: formatMessage({
@@ -160,64 +151,8 @@ const useI18n = () => {
160
151
  ...actions
161
152
  };
162
153
  };
163
- const axiosBaseQuery = () => async (query, { signal }) => {
164
- try {
165
- const { get: get2, post, del, put } = getFetchClient();
166
- if (typeof query === "string") {
167
- const result = await get2(query, { signal });
168
- return { data: result.data };
169
- } else {
170
- const { url, method = "GET", data, config } = query;
171
- if (method === "POST") {
172
- const result2 = await post(url, data, { ...config, signal });
173
- return { data: result2.data };
174
- }
175
- if (method === "DELETE") {
176
- const result2 = await del(url, { ...config, signal });
177
- return { data: result2.data };
178
- }
179
- if (method === "PUT") {
180
- const result2 = await put(url, data, { ...config, signal });
181
- return { data: result2.data };
182
- }
183
- const result = await get2(url, { ...config, signal });
184
- return { data: result.data };
185
- }
186
- } catch (err) {
187
- if (isAxiosError(err)) {
188
- if (typeof err.response?.data === "object" && err.response?.data !== null && "error" in err.response?.data) {
189
- return { data: void 0, error: err.response?.data.error };
190
- } else {
191
- return {
192
- data: void 0,
193
- error: {
194
- name: "UnknownError",
195
- message: "There was an unknown error response from the API",
196
- details: err.response?.data,
197
- status: err.response?.status
198
- }
199
- };
200
- }
201
- }
202
- const error = err;
203
- return {
204
- data: void 0,
205
- error: {
206
- name: error.name,
207
- message: error.message,
208
- stack: error.stack
209
- }
210
- };
211
- }
212
- };
213
- const isBaseQueryError = (error) => {
214
- return error.name !== void 0;
215
- };
216
- const i18nApi = createApi({
217
- reducerPath: "i18nApi",
218
- baseQuery: axiosBaseQuery(),
219
- tagTypes: ["Locale"],
220
- endpoints: () => ({})
154
+ const i18nApi = adminApi.enhanceEndpoints({
155
+ addTagTypes: ["Locale"]
221
156
  });
222
157
  const localesApi = i18nApi.injectEndpoints({
223
158
  endpoints: (builder) => ({
@@ -266,6 +201,176 @@ const {
266
201
  useGetDefaultLocalesQuery,
267
202
  useUpdateLocaleMutation
268
203
  } = localesApi;
204
+ const relationsApi = i18nApi.injectEndpoints({
205
+ overrideExisting: true,
206
+ endpoints: (builder) => ({
207
+ getManyDraftRelationCount: builder.query({
208
+ query: ({ model, ...params }) => ({
209
+ url: `/content-manager/collection-types/${model}/actions/countManyEntriesDraftRelations`,
210
+ method: "GET",
211
+ config: {
212
+ params
213
+ }
214
+ }),
215
+ transformResponse: (response) => response.data
216
+ })
217
+ })
218
+ });
219
+ const { useGetManyDraftRelationCountQuery } = relationsApi;
220
+ const isErrorMessageDescriptor = (object) => {
221
+ return typeof object === "object" && object !== null && "id" in object && "defaultMessage" in object;
222
+ };
223
+ const EntryValidationText = ({ status = "draft", validationErrors }) => {
224
+ const { formatMessage } = useIntl();
225
+ const getErrorStr = (key, value) => {
226
+ if (typeof value === "string") {
227
+ return `${key}: ${value}`;
228
+ } else if (isErrorMessageDescriptor(value)) {
229
+ return `${key}: ${formatMessage(value)}`;
230
+ } else if (Array.isArray(value)) {
231
+ return value.map((v) => getErrorStr(key, v)).join(" ");
232
+ } else if (typeof value === "object" && !Array.isArray(value)) {
233
+ return Object.entries(value).map(([k, v]) => getErrorStr(k, v)).join(" ");
234
+ } else {
235
+ return "";
236
+ }
237
+ };
238
+ if (validationErrors) {
239
+ const validationErrorsMessages = Object.entries(validationErrors).map(([key, value]) => {
240
+ return getErrorStr(key, value);
241
+ }).join(" ");
242
+ return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
243
+ /* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" }),
244
+ /* @__PURE__ */ jsx(Tooltip, { label: validationErrorsMessages, children: /* @__PURE__ */ jsx(
245
+ Typography,
246
+ {
247
+ maxWidth: "30rem",
248
+ textColor: "danger600",
249
+ variant: "omega",
250
+ fontWeight: "semiBold",
251
+ ellipsis: true,
252
+ children: validationErrorsMessages
253
+ }
254
+ ) })
255
+ ] });
256
+ }
257
+ if (status === "published") {
258
+ return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
259
+ /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
260
+ /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
261
+ id: "content-manager.bulk-publish.already-published",
262
+ defaultMessage: "Already Published"
263
+ }) })
264
+ ] });
265
+ }
266
+ if (status === "modified") {
267
+ return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
268
+ /* @__PURE__ */ jsx(ArrowsCounterClockwise, { fill: "alternative600" }),
269
+ /* @__PURE__ */ jsx(Typography, { children: formatMessage({
270
+ id: "app.utils.ready-to-publish-changes",
271
+ defaultMessage: "Ready to publish changes"
272
+ }) })
273
+ ] });
274
+ }
275
+ return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
276
+ /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
277
+ /* @__PURE__ */ jsx(Typography, { children: formatMessage({
278
+ id: "app.utils.ready-to-publish",
279
+ defaultMessage: "Ready to publish"
280
+ }) })
281
+ ] });
282
+ };
283
+ const BoldChunk = (chunks) => /* @__PURE__ */ jsx(Typography, { fontWeight: "bold", children: chunks });
284
+ const BulkLocaleActionModal = ({
285
+ headers,
286
+ rows,
287
+ localesMetadata,
288
+ validationErrors = {}
289
+ }) => {
290
+ const { formatMessage } = useIntl();
291
+ const selectedRows = useTable(
292
+ "BulkLocaleActionModal",
293
+ (state) => state.selectedRows
294
+ );
295
+ const getFormattedCountMessage = () => {
296
+ const currentStatusByLocale = rows.reduce((acc, { locale, status }) => {
297
+ acc[locale] = status;
298
+ return acc;
299
+ }, {});
300
+ const localesWithErrors = Object.keys(validationErrors);
301
+ const alreadyPublishedCount = selectedRows.filter(
302
+ ({ locale }) => currentStatusByLocale[locale] === "published"
303
+ ).length;
304
+ const readyToPublishCount = selectedRows.filter(
305
+ ({ locale }) => (currentStatusByLocale[locale] === "draft" || currentStatusByLocale[locale] === "modified") && !localesWithErrors.includes(locale)
306
+ ).length;
307
+ const withErrorsCount = localesWithErrors.length;
308
+ return formatMessage(
309
+ {
310
+ id: "content-manager.containers.list.selectedEntriesModal.selectedCount",
311
+ defaultMessage: "<b>{alreadyPublishedCount}</b> {alreadyPublishedCount, plural, =0 {entries} one {entry} other {entries}} already published. <b>{readyToPublishCount}</b> {readyToPublishCount, plural, =0 {entries} one {entry} other {entries}} ready to publish. <b>{withErrorsCount}</b> {withErrorsCount, plural, =0 {entries} one {entry} other {entries}} waiting for action."
312
+ },
313
+ {
314
+ withErrorsCount,
315
+ readyToPublishCount,
316
+ alreadyPublishedCount,
317
+ b: BoldChunk
318
+ }
319
+ );
320
+ };
321
+ return /* @__PURE__ */ jsxs(React.Fragment, { children: [
322
+ /* @__PURE__ */ jsx(Typography, { children: getFormattedCountMessage() }),
323
+ /* @__PURE__ */ jsx(Box, { marginTop: 5, children: /* @__PURE__ */ jsxs(Table.Content, { children: [
324
+ /* @__PURE__ */ jsxs(Table.Head, { children: [
325
+ /* @__PURE__ */ jsx(Table.HeaderCheckboxCell, {}),
326
+ headers.map((head) => /* @__PURE__ */ jsx(Table.HeaderCell, { ...head }, head.name))
327
+ ] }),
328
+ /* @__PURE__ */ jsx(Table.Body, { children: rows.map(({ locale, status }, index2) => {
329
+ const error = validationErrors?.[locale] ?? null;
330
+ const statusVariant = status === "draft" ? "primary" : status === "published" ? "success" : "alternative";
331
+ return /* @__PURE__ */ jsxs(Table.Row, { children: [
332
+ /* @__PURE__ */ jsx(Table.CheckboxCell, { id: locale, "aria-label": `Select ${locale}` }),
333
+ /* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(Typography, { variant: "sigma", textColor: "neutral600", children: Array.isArray(localesMetadata) ? localesMetadata.find((localeEntry) => localeEntry.code === locale)?.name : locale }) }),
334
+ /* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(Box, { display: "flex", children: /* @__PURE__ */ jsx(
335
+ Status,
336
+ {
337
+ display: "flex",
338
+ paddingLeft: "6px",
339
+ paddingRight: "6px",
340
+ paddingTop: "2px",
341
+ paddingBottom: "2px",
342
+ showBullet: false,
343
+ size: "S",
344
+ variant: statusVariant,
345
+ children: /* @__PURE__ */ jsx(Typography, { tag: "span", variant: "pi", fontWeight: "bold", children: capitalize(status) })
346
+ }
347
+ ) }) }),
348
+ /* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(EntryValidationText, { validationErrors: error, status }) }),
349
+ /* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(
350
+ IconButton,
351
+ {
352
+ tag: Link,
353
+ to: {
354
+ search: stringify({ plugins: { i18n: { locale } } })
355
+ },
356
+ label: formatMessage(
357
+ {
358
+ id: getTranslation("Settings.list.actions.edit"),
359
+ defaultMessage: "Edit {name} locale"
360
+ },
361
+ {
362
+ name: locale
363
+ }
364
+ ),
365
+ borderWidth: 0,
366
+ children: /* @__PURE__ */ jsx(Pencil, {})
367
+ }
368
+ ) })
369
+ ] }, index2);
370
+ }) })
371
+ ] }) })
372
+ ] });
373
+ };
269
374
  const LocalePickerAction = ({
270
375
  document,
271
376
  meta,
@@ -337,7 +442,7 @@ const LocalePickerAction = ({
337
442
  showBullet: false,
338
443
  size: "S",
339
444
  variant: statusVariant,
340
- children: /* @__PURE__ */ jsx(Typography, { as: "span", variant: "pi", fontWeight: "bold", children: capitalize(status) })
445
+ children: /* @__PURE__ */ jsx(Typography, { tag: "span", variant: "pi", fontWeight: "bold", children: capitalize(status) })
341
446
  }
342
447
  ) : null
343
448
  };
@@ -388,7 +493,7 @@ const DeleteLocaleAction = ({
388
493
  }),
389
494
  content: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 2, children: [
390
495
  /* @__PURE__ */ jsx(WarningCircle, { width: "24px", height: "24px", fill: "danger600" }),
391
- /* @__PURE__ */ jsx(Typography, { as: "p", variant: "omega", textAlign: "center", children: formatMessage({
496
+ /* @__PURE__ */ jsx(Typography, { tag: "p", variant: "omega", textAlign: "center", children: formatMessage({
392
497
  id: getTranslation("actions.delete.dialog.body"),
393
498
  defaultMessage: "Are you sure?"
394
499
  }) })
@@ -420,6 +525,228 @@ const DeleteLocaleAction = ({
420
525
  }
421
526
  };
422
527
  };
528
+ const BulkLocalePublishAction = ({
529
+ document: baseDocument,
530
+ documentId,
531
+ model,
532
+ collectionType
533
+ }) => {
534
+ const baseLocale = baseDocument?.locale ?? null;
535
+ const [{ query }] = useQueryParams();
536
+ const params = React.useMemo(() => buildValidParams(query), [query]);
537
+ const isPublishedTab = query.status === "published";
538
+ const { formatMessage } = useIntl();
539
+ const { hasI18n, canPublish } = useI18n();
540
+ const { toggleNotification } = useNotification();
541
+ const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
542
+ const [selectedRows, setSelectedRows] = React.useState([]);
543
+ const [isConfirmationOpen, setIsConfirmationOpen] = React.useState(false);
544
+ const { publishMany: publishManyAction } = unstable_useDocumentActions();
545
+ const {
546
+ document,
547
+ meta: documentMeta,
548
+ schema,
549
+ validate
550
+ } = unstable_useDocument({
551
+ model,
552
+ collectionType,
553
+ documentId,
554
+ params: {
555
+ locale: baseLocale
556
+ }
557
+ });
558
+ const { data: localesMetadata = [] } = useGetLocalesQuery();
559
+ const headers = [
560
+ {
561
+ label: formatMessage({
562
+ id: "global.name",
563
+ defaultMessage: "Name"
564
+ }),
565
+ name: "name"
566
+ },
567
+ {
568
+ label: formatMessage({
569
+ id: getTranslation("CMEditViewBulkLocale.status"),
570
+ defaultMessage: "Status"
571
+ }),
572
+ name: "status"
573
+ },
574
+ {
575
+ label: formatMessage({
576
+ id: getTranslation("CMEditViewBulkLocale.publication-status"),
577
+ defaultMessage: "Publication Status"
578
+ }),
579
+ name: "publication-status"
580
+ }
581
+ ];
582
+ const [rows, validationErrors] = React.useMemo(() => {
583
+ if (!document || !documentMeta?.availableLocales) {
584
+ return [[], {}];
585
+ }
586
+ const rowsFromMeta = documentMeta?.availableLocales.map((doc) => {
587
+ const { locale, status } = doc;
588
+ return { locale, status };
589
+ });
590
+ rowsFromMeta.unshift({
591
+ locale: document.locale,
592
+ status: document.status
593
+ });
594
+ const allDocuments = [document, ...documentMeta?.availableLocales ?? []];
595
+ const errors = allDocuments.reduce((errs, document2) => {
596
+ if (!document2) {
597
+ return errs;
598
+ }
599
+ const validation = validate(document2);
600
+ if (validation !== null) {
601
+ errs[document2.locale] = validation;
602
+ }
603
+ return errs;
604
+ }, {});
605
+ return [rowsFromMeta, errors];
606
+ }, [document, documentMeta?.availableLocales, validate]);
607
+ const localesToPublish = selectedRows.reduce((acc, selectedRow) => {
608
+ if (selectedRow.status !== "published" && !Object.keys(validationErrors).includes(selectedRow.locale)) {
609
+ acc.push(selectedRow.locale);
610
+ }
611
+ return acc;
612
+ }, []);
613
+ const {
614
+ data: draftRelationsCount = 0,
615
+ isLoading: isDraftRelationsLoading,
616
+ error: isDraftRelationsError
617
+ } = useGetManyDraftRelationCountQuery(
618
+ {
619
+ model,
620
+ documentIds: [documentId],
621
+ locale: localesToPublish
622
+ },
623
+ {
624
+ skip: !documentId || localesToPublish.length === 0
625
+ }
626
+ );
627
+ React.useEffect(() => {
628
+ if (isDraftRelationsError) {
629
+ toggleNotification({
630
+ type: "danger",
631
+ message: formatAPIError(isDraftRelationsError)
632
+ });
633
+ }
634
+ }, [isDraftRelationsError, toggleNotification, formatAPIError]);
635
+ if (!schema?.options?.draftAndPublish) {
636
+ return null;
637
+ }
638
+ if (!hasI18n) {
639
+ return null;
640
+ }
641
+ if (!documentId) {
642
+ return null;
643
+ }
644
+ const publish = async () => {
645
+ await publishManyAction({
646
+ model,
647
+ documentIds: [documentId],
648
+ params: {
649
+ ...params,
650
+ locale: localesToPublish
651
+ }
652
+ });
653
+ setSelectedRows([]);
654
+ };
655
+ const handleAction = async () => {
656
+ if (draftRelationsCount > 0) {
657
+ setIsConfirmationOpen(true);
658
+ } else {
659
+ await publish();
660
+ }
661
+ };
662
+ const isUnpublish = document?.status === "published";
663
+ if (isUnpublish) {
664
+ console.warn(["I18N"], "Bulk locale unpublish modal not implemented");
665
+ }
666
+ if (isConfirmationOpen) {
667
+ return {
668
+ label: formatMessage({
669
+ id: "app.components.ConfirmDialog.title",
670
+ defaultMessage: "Confirmation"
671
+ }),
672
+ variant: "danger",
673
+ dialog: {
674
+ onCancel: () => {
675
+ setIsConfirmationOpen(false);
676
+ },
677
+ onConfirm: async () => {
678
+ await publish();
679
+ setIsConfirmationOpen(false);
680
+ },
681
+ type: "dialog",
682
+ title: formatMessage({
683
+ id: getTranslation("actions.publish.dialog.title"),
684
+ defaultMessage: "Confirmation"
685
+ }),
686
+ content: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "center", gap: 2, children: [
687
+ /* @__PURE__ */ jsx(WarningCircle, { width: "2.4rem", height: "2.4rem", fill: "danger600" }),
688
+ /* @__PURE__ */ jsx(Typography, { textAlign: "center", children: formatMessage({
689
+ id: "content-manager.actions.discard.dialog.body",
690
+ defaultMessage: "Are you sure you want to discard the changes? This action is irreversible."
691
+ }) })
692
+ ] })
693
+ }
694
+ };
695
+ }
696
+ return {
697
+ label: formatMessage({
698
+ id: getTranslation("CMEditViewBulkLocale.publish-title"),
699
+ defaultMessage: "Publish Multiple Locales"
700
+ }),
701
+ icon: /* @__PURE__ */ jsx(ListPlus, {}),
702
+ disabled: isPublishedTab || !canPublish,
703
+ position: ["panel"],
704
+ variant: "secondary",
705
+ dialog: {
706
+ type: "modal",
707
+ title: formatMessage({
708
+ id: getTranslation("CMEditViewBulkLocale.publish-title"),
709
+ defaultMessage: "Publish Multiple Locales"
710
+ }),
711
+ content: () => {
712
+ return /* @__PURE__ */ jsx(
713
+ Table.Root,
714
+ {
715
+ headers,
716
+ rows: rows.map((row) => ({
717
+ ...row,
718
+ id: row.locale
719
+ })),
720
+ selectedRows,
721
+ onSelectedRowsChange: (tableSelectedRows) => setSelectedRows(tableSelectedRows),
722
+ children: /* @__PURE__ */ jsx(
723
+ BulkLocaleActionModal,
724
+ {
725
+ validationErrors,
726
+ headers,
727
+ rows,
728
+ localesMetadata
729
+ }
730
+ )
731
+ }
732
+ );
733
+ },
734
+ footer: () => /* @__PURE__ */ jsx(Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsx(
735
+ Button$1,
736
+ {
737
+ loading: isDraftRelationsLoading,
738
+ disabled: localesToPublish.length === 0,
739
+ variant: "default",
740
+ onClick: handleAction,
741
+ children: formatMessage({
742
+ id: "app.utils.publish",
743
+ defaultMessage: "Publish"
744
+ })
745
+ }
746
+ ) })
747
+ }
748
+ };
749
+ };
423
750
  const StyledTrash = styled(Trash)`
424
751
  path {
425
752
  fill: currentColor;
@@ -587,8 +914,8 @@ const doesFieldHaveI18nPluginOpt = (pluginOpts) => {
587
914
  };
588
915
  const LabelAction = ({ title, icon }) => {
589
916
  const { formatMessage } = useIntl();
590
- return /* @__PURE__ */ jsxs(Span, { as: "span", children: [
591
- /* @__PURE__ */ jsx(VisuallyHidden, { as: "span", children: `(${formatMessage(title)})` }),
917
+ return /* @__PURE__ */ jsxs(Span, { tag: "span", children: [
918
+ /* @__PURE__ */ jsx(VisuallyHidden, { tag: "span", children: `(${formatMessage(title)})` }),
592
919
  React.cloneElement(icon, {
593
920
  "aria-hidden": true,
594
921
  focusable: false
@@ -673,7 +1000,7 @@ const LocaleListCell = ({
673
1000
  source: buttonRef,
674
1001
  spacing: 16,
675
1002
  centered: true,
676
- children: /* @__PURE__ */ jsx("ul", { children: localesForDocument.map((name) => /* @__PURE__ */ jsx(Box, { padding: 3, as: "li", children: /* @__PURE__ */ jsx(Typography, { children: name }) }, name)) })
1003
+ children: /* @__PURE__ */ jsx("ul", { children: localesForDocument.map((name) => /* @__PURE__ */ jsx(Box, { padding: 3, tag: "li", children: /* @__PURE__ */ jsx(Typography, { children: name }) }, name)) })
677
1004
  }
678
1005
  )
679
1006
  ] });
@@ -737,18 +1064,11 @@ const addColumnToTableHook = ({ displayedHeaders, layout }) => {
737
1064
  const addLocaleToReleasesHook = ({ displayedHeaders = [] }) => {
738
1065
  return {
739
1066
  displayedHeaders: [
740
- // TODO: Fix when migrating to v5
741
- // ...displayedHeaders,
1067
+ ...displayedHeaders,
742
1068
  {
743
- key: "__locale__",
744
- fieldSchema: { type: "string" },
745
- metadatas: {
746
- label: {
747
- id: "content-releases.page.ReleaseDetails.table.header.label.locale",
748
- defaultMessage: "locale"
749
- },
750
- searchable: false,
751
- sortable: false
1069
+ label: {
1070
+ id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1071
+ defaultMessage: "locale"
752
1072
  },
753
1073
  name: "locale"
754
1074
  }
@@ -915,7 +1235,7 @@ const index = {
915
1235
  },
916
1236
  id: "internationalization",
917
1237
  to: "internationalization",
918
- Component: () => import("./SettingsPage-CeqfDjsb.mjs").then((mod) => ({ default: mod.ProtectedSettingsPage })),
1238
+ Component: () => import("./SettingsPage-DNucKxbi.mjs").then((mod) => ({ default: mod.ProtectedSettingsPage })),
919
1239
  permissions: PERMISSIONS.accessMain
920
1240
  });
921
1241
  const contentManager = app.getPlugin("content-manager");
@@ -925,6 +1245,10 @@ const index = {
925
1245
  actions.splice(indexOfDeleteAction, 0, DeleteLocaleAction);
926
1246
  return actions;
927
1247
  });
1248
+ contentManager.apis.addDocumentAction((actions) => {
1249
+ actions.splice(2, 0, BulkLocalePublishAction);
1250
+ return actions;
1251
+ });
928
1252
  contentManager.injectComponent("listView", "actions", {
929
1253
  name: "i18n-locale-filter",
930
1254
  Component: LocalePicker
@@ -1028,7 +1352,7 @@ const index = {
1028
1352
  async registerTrads({ locales }) {
1029
1353
  const importedTrads = await Promise.all(
1030
1354
  locales.map((locale) => {
1031
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => import("./de-9eCAqqrB.mjs"), "./translations/dk.json": () => import("./dk-2qBjxt-P.mjs"), "./translations/en.json": () => import("./en-CnrTsjWS.mjs"), "./translations/es.json": () => import("./es-DlmMVaBG.mjs"), "./translations/fr.json": () => import("./fr-3S6ke71d.mjs"), "./translations/ko.json": () => import("./ko-qTjQ8IMw.mjs"), "./translations/pl.json": () => import("./pl-B67TSHqT.mjs"), "./translations/ru.json": () => import("./ru-hagMa57T.mjs"), "./translations/tr.json": () => import("./tr-Dw_jmkG-.mjs"), "./translations/zh-Hans.json": () => import("./zh-Hans-Dyc-aR-h.mjs"), "./translations/zh.json": () => import("./zh-57YM4amO.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
1355
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => import("./de-9eCAqqrB.mjs"), "./translations/dk.json": () => import("./dk-2qBjxt-P.mjs"), "./translations/en.json": () => import("./en-18tWw4P6.mjs"), "./translations/es.json": () => import("./es-DlmMVaBG.mjs"), "./translations/fr.json": () => import("./fr-3S6ke71d.mjs"), "./translations/ko.json": () => import("./ko-qTjQ8IMw.mjs"), "./translations/pl.json": () => import("./pl-B67TSHqT.mjs"), "./translations/ru.json": () => import("./ru-hagMa57T.mjs"), "./translations/tr.json": () => import("./tr-Dw_jmkG-.mjs"), "./translations/zh-Hans.json": () => import("./zh-Hans-Dyc-aR-h.mjs"), "./translations/zh.json": () => import("./zh-57YM4amO.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
1032
1356
  return {
1033
1357
  data: prefixPluginTranslations(data, pluginId),
1034
1358
  locale
@@ -1047,12 +1371,11 @@ const index = {
1047
1371
  export {
1048
1372
  PERMISSIONS as P,
1049
1373
  useGetDefaultLocalesQuery as a,
1050
- useGetLocalesQuery as b,
1051
- useDeleteLocaleMutation as c,
1052
- useUpdateLocaleMutation as d,
1053
- index as e,
1374
+ useDeleteLocaleMutation as b,
1375
+ useUpdateLocaleMutation as c,
1376
+ useGetLocalesQuery as d,
1054
1377
  getTranslation as g,
1055
- isBaseQueryError as i,
1378
+ index as i,
1056
1379
  useCreateLocaleMutation as u
1057
1380
  };
1058
- //# sourceMappingURL=index-BDU1w_fd.mjs.map
1381
+ //# sourceMappingURL=index-BYDzOiHE.mjs.map