@strapi/i18n 0.0.0-experimental.25e22c6cc9bc6b35392bb55d09f641a0a65e7403 → 0.0.0-experimental.2bad311ac375d1115d085a9cee4fdbe11a455caf

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 (47) hide show
  1. package/LICENSE +18 -3
  2. package/dist/_chunks/{SettingsPage-VN7sTzkb.js → SettingsPage-CJOMVQv5.js} +15 -10
  3. package/dist/_chunks/SettingsPage-CJOMVQv5.js.map +1 -0
  4. package/dist/_chunks/{SettingsPage-Dsi2qGtq.mjs → SettingsPage-CnBFTsrq.mjs} +15 -10
  5. package/dist/_chunks/SettingsPage-CnBFTsrq.mjs.map +1 -0
  6. package/dist/_chunks/{en-18tWw4P6.mjs → en-BYRZFDBV.mjs} +11 -2
  7. package/dist/_chunks/en-BYRZFDBV.mjs.map +1 -0
  8. package/dist/_chunks/{en-Kv6y9zPQ.js → en-Dk9At9_Z.js} +11 -2
  9. package/dist/_chunks/en-Dk9At9_Z.js.map +1 -0
  10. package/dist/_chunks/{index-DhtjJYrx.mjs → index-BFk3nfTb.mjs} +416 -179
  11. package/dist/_chunks/index-BFk3nfTb.mjs.map +1 -0
  12. package/dist/_chunks/{index-kedPlCo6.js → index-C5SImSYG.js} +420 -183
  13. package/dist/_chunks/index-C5SImSYG.js.map +1 -0
  14. package/dist/admin/index.js +1 -1
  15. package/dist/admin/index.mjs +1 -1
  16. package/dist/admin/src/components/BulkLocaleActionModal.d.ts +2 -1
  17. package/dist/admin/src/components/CMHeaderActions.d.ts +29 -3
  18. package/dist/admin/src/contentReleasesHooks/releaseDetailsView.d.ts +9 -5
  19. package/dist/admin/src/utils/clean.d.ts +4 -0
  20. package/dist/admin/src/utils/schemas.d.ts +1 -0
  21. package/dist/server/index.js +62 -98
  22. package/dist/server/index.js.map +1 -1
  23. package/dist/server/index.mjs +63 -99
  24. package/dist/server/index.mjs.map +1 -1
  25. package/dist/server/src/bootstrap.d.ts +1 -4
  26. package/dist/server/src/bootstrap.d.ts.map +1 -1
  27. package/dist/server/src/index.d.ts +15 -13
  28. package/dist/server/src/index.d.ts.map +1 -1
  29. package/dist/server/src/services/index.d.ts +14 -10
  30. package/dist/server/src/services/index.d.ts.map +1 -1
  31. package/dist/server/src/services/permissions/actions.d.ts +14 -2
  32. package/dist/server/src/services/permissions/actions.d.ts.map +1 -1
  33. package/dist/server/src/services/permissions.d.ts +14 -2
  34. package/dist/server/src/services/permissions.d.ts.map +1 -1
  35. package/dist/server/src/utils/index.d.ts +0 -2
  36. package/dist/server/src/utils/index.d.ts.map +1 -1
  37. package/package.json +9 -9
  38. package/dist/_chunks/SettingsPage-Dsi2qGtq.mjs.map +0 -1
  39. package/dist/_chunks/SettingsPage-VN7sTzkb.js.map +0 -1
  40. package/dist/_chunks/en-18tWw4P6.mjs.map +0 -1
  41. package/dist/_chunks/en-Kv6y9zPQ.js.map +0 -1
  42. package/dist/_chunks/index-DhtjJYrx.mjs.map +0 -1
  43. package/dist/_chunks/index-kedPlCo6.js.map +0 -1
  44. package/dist/admin/src/components/Initializer.d.ts +0 -5
  45. package/dist/server/src/services/entity-service-decorator.d.ts +0 -29
  46. package/dist/server/src/services/entity-service-decorator.d.ts.map +0 -1
  47. package/strapi-server.js +0 -3
@@ -7,6 +7,7 @@ const designSystem = require("@strapi/design-system");
7
7
  const icons = require("@strapi/icons");
8
8
  const reactIntl = require("react-intl");
9
9
  const styledComponents = require("styled-components");
10
+ const query = require("@reduxjs/toolkit/query");
10
11
  const strapiAdmin = require("@strapi/admin/strapi-admin");
11
12
  const strapiAdmin$1 = require("@strapi/content-manager/strapi-admin");
12
13
  const reactRouterDom = require("react-router-dom");
@@ -160,7 +161,7 @@ const useI18n = () => {
160
161
  model: params.slug
161
162
  },
162
163
  {
163
- skip: !params.slug || !params.collectionType
164
+ skip: true
164
165
  }
165
166
  );
166
167
  if (doesPluginOptionsHaveI18nLocalized(schema?.pluginOptions)) {
@@ -240,10 +241,94 @@ const relationsApi = i18nApi.injectEndpoints({
240
241
  })
241
242
  });
242
243
  const { useGetManyDraftRelationCountQuery } = relationsApi;
244
+ const cleanData = (data, schema, components) => {
245
+ const cleanedData = removeFields(data, [
246
+ "createdAt",
247
+ "createdBy",
248
+ "updatedAt",
249
+ "updatedBy",
250
+ "id",
251
+ "documentId",
252
+ "publishedAt",
253
+ "strapi_stage",
254
+ "strapi_assignee",
255
+ "locale",
256
+ "status"
257
+ ]);
258
+ const cleanedDataWithoutPasswordAndRelation = recursiveRemoveFieldTypes(
259
+ cleanedData,
260
+ schema,
261
+ components,
262
+ ["relation", "password"]
263
+ );
264
+ return cleanedDataWithoutPasswordAndRelation;
265
+ };
266
+ const removeFields = (data, fields) => {
267
+ return Object.keys(data).reduce((acc, current) => {
268
+ if (fields.includes(current)) {
269
+ return acc;
270
+ }
271
+ acc[current] = data[current];
272
+ return acc;
273
+ }, {});
274
+ };
275
+ const recursiveRemoveFieldTypes = (data, schema, components, fields) => {
276
+ return Object.keys(data).reduce((acc, current) => {
277
+ const attribute = schema.attributes[current] ?? { type: void 0 };
278
+ if (fields.includes(attribute.type)) {
279
+ return acc;
280
+ }
281
+ if (attribute.type === "dynamiczone") {
282
+ acc[current] = data[current].map((componentValue, index2) => {
283
+ const { id: _, ...rest } = recursiveRemoveFieldTypes(
284
+ componentValue,
285
+ components[componentValue.__component],
286
+ components,
287
+ fields
288
+ );
289
+ return {
290
+ ...rest,
291
+ __temp_key__: index2 + 1
292
+ };
293
+ });
294
+ } else if (attribute.type === "component") {
295
+ const { repeatable, component } = attribute;
296
+ if (repeatable) {
297
+ acc[current] = (data[current] ?? []).map((compoData, index2) => {
298
+ const { id: _, ...rest } = recursiveRemoveFieldTypes(
299
+ compoData,
300
+ components[component],
301
+ components,
302
+ fields
303
+ );
304
+ return {
305
+ ...rest,
306
+ __temp_key__: index2 + 1
307
+ };
308
+ });
309
+ } else {
310
+ const { id: _, ...rest } = recursiveRemoveFieldTypes(
311
+ data[current] ?? {},
312
+ components[component],
313
+ components,
314
+ fields
315
+ );
316
+ acc[current] = rest;
317
+ }
318
+ } else {
319
+ acc[current] = data[current];
320
+ }
321
+ return acc;
322
+ }, {});
323
+ };
243
324
  const isErrorMessageDescriptor = (object) => {
244
325
  return typeof object === "object" && object !== null && "id" in object && "defaultMessage" in object;
245
326
  };
246
- const EntryValidationText = ({ status = "draft", validationErrors }) => {
327
+ const EntryValidationText = ({
328
+ status = "draft",
329
+ validationErrors,
330
+ action
331
+ }) => {
247
332
  const { formatMessage } = reactIntl.useIntl();
248
333
  const getErrorStr = (key, value) => {
249
334
  if (typeof value === "string") {
@@ -277,30 +362,63 @@ const EntryValidationText = ({ status = "draft", validationErrors }) => {
277
362
  ) })
278
363
  ] });
279
364
  }
280
- if (status === "published") {
281
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
282
- /* @__PURE__ */ jsxRuntime.jsx(icons.CheckCircle, { fill: "success600" }),
283
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
284
- id: "content-manager.bulk-publish.already-published",
285
- defaultMessage: "Already Published"
286
- }) })
287
- ] });
288
- }
289
- if (status === "modified") {
290
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
291
- /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowsCounterClockwise, { fill: "alternative600" }),
292
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: formatMessage({
293
- id: "app.utils.ready-to-publish-changes",
294
- defaultMessage: "Ready to publish changes"
295
- }) })
296
- ] });
297
- }
365
+ const getStatusMessage = () => {
366
+ if (action === "bulk-publish") {
367
+ if (status === "published") {
368
+ return {
369
+ icon: /* @__PURE__ */ jsxRuntime.jsx(icons.CheckCircle, { fill: "success600" }),
370
+ text: formatMessage({
371
+ id: "content-manager.bulk-publish.already-published",
372
+ defaultMessage: "Already Published"
373
+ }),
374
+ textColor: "success600",
375
+ fontWeight: "bold"
376
+ };
377
+ } else if (status === "modified") {
378
+ return {
379
+ icon: /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowsCounterClockwise, { fill: "alternative600" }),
380
+ text: formatMessage({
381
+ id: "app.utils.ready-to-publish-changes",
382
+ defaultMessage: "Ready to publish changes"
383
+ })
384
+ };
385
+ } else {
386
+ return {
387
+ icon: /* @__PURE__ */ jsxRuntime.jsx(icons.CheckCircle, { fill: "success600" }),
388
+ text: formatMessage({
389
+ id: "app.utils.ready-to-publish",
390
+ defaultMessage: "Ready to publish"
391
+ })
392
+ };
393
+ }
394
+ } else {
395
+ if (status === "draft") {
396
+ return {
397
+ icon: /* @__PURE__ */ jsxRuntime.jsx(icons.CheckCircle, { fill: "success600" }),
398
+ text: formatMessage({
399
+ id: "content-manager.bulk-unpublish.already-unpublished",
400
+ defaultMessage: "Already Unpublished"
401
+ }),
402
+ textColor: "success600",
403
+ fontWeight: "bold"
404
+ };
405
+ } else {
406
+ return {
407
+ icon: /* @__PURE__ */ jsxRuntime.jsx(icons.CheckCircle, { fill: "success600" }),
408
+ text: formatMessage({
409
+ id: "app.utils.ready-to-unpublish-changes",
410
+ defaultMessage: "Ready to unpublish"
411
+ }),
412
+ textColor: "success600",
413
+ fontWeight: "bold"
414
+ };
415
+ }
416
+ }
417
+ };
418
+ const { icon, text, textColor = "success600", fontWeight = "normal" } = getStatusMessage();
298
419
  return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
299
- /* @__PURE__ */ jsxRuntime.jsx(icons.CheckCircle, { fill: "success600" }),
300
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: formatMessage({
301
- id: "app.utils.ready-to-publish",
302
- defaultMessage: "Ready to publish"
303
- }) })
420
+ icon,
421
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor, fontWeight, children: text })
304
422
  ] });
305
423
  };
306
424
  const BoldChunk = (chunks) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontWeight: "bold", children: chunks });
@@ -308,7 +426,8 @@ const BulkLocaleActionModal = ({
308
426
  headers,
309
427
  rows,
310
428
  localesMetadata,
311
- validationErrors = {}
429
+ validationErrors = {},
430
+ action
312
431
  }) => {
313
432
  const { formatMessage } = reactIntl.useIntl();
314
433
  const selectedRows = strapiAdmin.useTable(
@@ -321,27 +440,29 @@ const BulkLocaleActionModal = ({
321
440
  return acc;
322
441
  }, {});
323
442
  const localesWithErrors = Object.keys(validationErrors);
324
- const alreadyPublishedCount = selectedRows.filter(
443
+ const publishedCount = selectedRows.filter(
325
444
  ({ locale }) => currentStatusByLocale[locale] === "published"
326
445
  ).length;
327
- const readyToPublishCount = selectedRows.filter(
446
+ const draftCount = selectedRows.filter(
328
447
  ({ locale }) => (currentStatusByLocale[locale] === "draft" || currentStatusByLocale[locale] === "modified") && !localesWithErrors.includes(locale)
329
448
  ).length;
330
449
  const withErrorsCount = localesWithErrors.length;
450
+ const messageId = action === "bulk-publish" ? "content-manager.containers.list.selectedEntriesModal.selectedCount.publish" : "content-manager.containers.list.selectedEntriesModal.selectedCount.unpublish";
451
+ const defaultMessage = action === "bulk-publish" ? "<b>{publishedCount}</b> {publishedCount, plural, =0 {entries} one {entry} other {entries}} already published. <b>{draftCount}</b> {draftCount, plural, =0 {entries} one {entry} other {entries}} ready to publish. <b>{withErrorsCount}</b> {withErrorsCount, plural, =0 {entries} one {entry} other {entries}} waiting for action." : "<b>{draftCount}</b> {draftCount, plural, =0 {entries} one {entry} other {entries}} already unpublished. <b>{publishedCount}</b> {publishedCount, plural, =0 {entries} one {entry} other {entries}} ready to unpublish.";
331
452
  return formatMessage(
332
453
  {
333
- id: "content-manager.containers.list.selectedEntriesModal.selectedCount",
334
- 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."
454
+ id: messageId,
455
+ defaultMessage
335
456
  },
336
457
  {
337
458
  withErrorsCount,
338
- readyToPublishCount,
339
- alreadyPublishedCount,
459
+ draftCount,
460
+ publishedCount,
340
461
  b: BoldChunk
341
462
  }
342
463
  );
343
464
  };
344
- return /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
465
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Modal.Body, { children: [
345
466
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: getFormattedCountMessage() }),
346
467
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { marginTop: 5, children: /* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Table.Content, { children: [
347
468
  /* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Table.Head, { children: [
@@ -368,7 +489,7 @@ const BulkLocaleActionModal = ({
368
489
  children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { tag: "span", variant: "pi", fontWeight: "bold", children: capitalize(status) })
369
490
  }
370
491
  ) }) }),
371
- /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(EntryValidationText, { validationErrors: error, status }) }),
492
+ /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(EntryValidationText, { validationErrors: error, status, action }) }),
372
493
  /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(
373
494
  designSystem.IconButton,
374
495
  {
@@ -385,7 +506,7 @@ const BulkLocaleActionModal = ({
385
506
  name: locale
386
507
  }
387
508
  ),
388
- borderWidth: 0,
509
+ variant: "ghost",
389
510
  children: /* @__PURE__ */ jsxRuntime.jsx(icons.Pencil, {})
390
511
  }
391
512
  ) })
@@ -394,6 +515,48 @@ const BulkLocaleActionModal = ({
394
515
  ] }) })
395
516
  ] });
396
517
  };
518
+ const statusVariants = {
519
+ draft: "secondary",
520
+ published: "success",
521
+ modified: "alternative"
522
+ };
523
+ const LocaleOption = ({
524
+ isDraftAndPublishEnabled,
525
+ locale,
526
+ status,
527
+ entryExists
528
+ }) => {
529
+ const { formatMessage } = reactIntl.useIntl();
530
+ if (!entryExists) {
531
+ return formatMessage(
532
+ {
533
+ id: getTranslation("CMEditViewLocalePicker.locale.create"),
534
+ defaultMessage: "Create <bold>{locale}</bold> locale"
535
+ },
536
+ {
537
+ bold: (locale2) => /* @__PURE__ */ jsxRuntime.jsx("b", { children: locale2 }),
538
+ locale: locale.name
539
+ }
540
+ );
541
+ }
542
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { width: "100%", gap: 1, justifyContent: "space-between", children: [
543
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: locale.name }),
544
+ isDraftAndPublishEnabled ? /* @__PURE__ */ jsxRuntime.jsx(
545
+ designSystem.Status,
546
+ {
547
+ display: "flex",
548
+ paddingLeft: "6px",
549
+ paddingRight: "6px",
550
+ paddingTop: "2px",
551
+ paddingBottom: "2px",
552
+ showBullet: false,
553
+ size: "S",
554
+ variant: statusVariants[status],
555
+ children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { tag: "span", variant: "pi", fontWeight: "bold", children: capitalize(status) })
556
+ }
557
+ ) : null
558
+ ] });
559
+ };
397
560
  const LocalePickerAction = ({
398
561
  document,
399
562
  meta,
@@ -402,74 +565,74 @@ const LocalePickerAction = ({
402
565
  documentId
403
566
  }) => {
404
567
  const { formatMessage } = reactIntl.useIntl();
405
- const [{ query }, setQuery] = strapiAdmin.useQueryParams();
568
+ const [{ query: query2 }, setQuery] = strapiAdmin.useQueryParams();
406
569
  const { hasI18n, canCreate, canRead } = useI18n();
407
570
  const { data: locales = [] } = useGetLocalesQuery();
408
- const { schema } = strapiAdmin$1.unstable_useDocument({ model, collectionType, documentId });
571
+ const currentDesiredLocale = query2.plugins?.i18n?.locale;
572
+ const { schema } = strapiAdmin$1.unstable_useDocument({
573
+ model,
574
+ collectionType,
575
+ documentId,
576
+ params: { locale: currentDesiredLocale }
577
+ });
409
578
  const handleSelect = React__namespace.useCallback(
410
579
  (value) => {
411
580
  setQuery({
412
581
  plugins: {
413
- ...query.plugins,
582
+ ...query2.plugins,
414
583
  i18n: {
415
584
  locale: value
416
585
  }
417
586
  }
418
587
  });
419
588
  },
420
- [query.plugins, setQuery]
589
+ [query2.plugins, setQuery]
421
590
  );
422
591
  React__namespace.useEffect(() => {
423
592
  if (!Array.isArray(locales) || !hasI18n) {
424
593
  return;
425
594
  }
426
- const currentDesiredLocale = query.plugins?.i18n?.locale;
427
595
  const doesLocaleExist = locales.find((loc) => loc.code === currentDesiredLocale);
428
596
  const defaultLocale = locales.find((locale) => locale.isDefault);
429
597
  if (!doesLocaleExist && defaultLocale?.code) {
430
598
  handleSelect(defaultLocale.code);
431
599
  }
432
- }, [handleSelect, hasI18n, locales, query.plugins?.i18n?.locale]);
433
- if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {
434
- return null;
435
- }
436
- const currentLocale = query.plugins?.i18n?.locale || locales.find((loc) => loc.isDefault)?.code;
600
+ }, [handleSelect, hasI18n, locales, currentDesiredLocale]);
601
+ const currentLocale = Array.isArray(locales) ? locales.find((locale) => locale.code === currentDesiredLocale) : void 0;
437
602
  const allCurrentLocales = [
438
- { status: getDocumentStatus(document, meta), locale: currentLocale },
603
+ { status: getDocumentStatus(document, meta), locale: currentLocale?.code },
439
604
  ...meta?.availableLocales ?? []
440
605
  ];
606
+ if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {
607
+ return null;
608
+ }
441
609
  return {
442
610
  label: formatMessage({
443
611
  id: getTranslation("Settings.locales.modal.locales.label"),
444
612
  defaultMessage: "Locales"
445
613
  }),
446
614
  options: locales.map((locale) => {
615
+ const entryWithLocaleExists = allCurrentLocales.some((doc) => doc.locale === locale.code);
447
616
  const currentLocaleDoc = allCurrentLocales.find(
448
617
  (doc) => "locale" in doc ? doc.locale === locale.code : false
449
618
  );
450
- const status = currentLocaleDoc?.status ?? "draft";
451
619
  const permissionsToCheck = currentLocaleDoc ? canCreate : canRead;
452
- const statusVariant = status === "draft" ? "primary" : status === "published" ? "success" : "alternative";
453
620
  return {
454
621
  disabled: !permissionsToCheck.includes(locale.code),
455
622
  value: locale.code,
456
- label: locale.name,
457
- startIcon: schema?.options?.draftAndPublish ? /* @__PURE__ */ jsxRuntime.jsx(
458
- designSystem.Status,
623
+ label: /* @__PURE__ */ jsxRuntime.jsx(
624
+ LocaleOption,
459
625
  {
460
- display: "flex",
461
- paddingLeft: "6px",
462
- paddingRight: "6px",
463
- paddingTop: "2px",
464
- paddingBottom: "2px",
465
- showBullet: false,
466
- size: "S",
467
- variant: statusVariant,
468
- children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { tag: "span", variant: "pi", fontWeight: "bold", children: capitalize(status) })
626
+ isDraftAndPublishEnabled: !!schema?.options?.draftAndPublish,
627
+ locale,
628
+ status: currentLocaleDoc?.status,
629
+ entryExists: entryWithLocaleExists
469
630
  }
470
- ) : null
631
+ ),
632
+ startIcon: !entryWithLocaleExists ? /* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}) : null
471
633
  };
472
634
  }),
635
+ customizeContent: () => currentLocale?.name,
473
636
  onSelect: handleSelect,
474
637
  value: currentLocale
475
638
  };
@@ -485,6 +648,95 @@ const getDocumentStatus = (document, meta) => {
485
648
  }
486
649
  return docStatus;
487
650
  };
651
+ const FillFromAnotherLocaleAction = ({
652
+ documentId,
653
+ meta,
654
+ model,
655
+ collectionType
656
+ }) => {
657
+ const { formatMessage } = reactIntl.useIntl();
658
+ const [{ query: query2 }] = strapiAdmin.useQueryParams();
659
+ const currentDesiredLocale = query2.plugins?.i18n?.locale;
660
+ const [localeSelected, setLocaleSelected] = React__namespace.useState(null);
661
+ const setValues = strapiAdmin.useForm("FillFromAnotherLocale", (state) => state.setValues);
662
+ const { getDocument } = strapiAdmin$1.unstable_useDocumentActions();
663
+ const { schema, components } = strapiAdmin$1.unstable_useDocument({
664
+ model,
665
+ documentId,
666
+ collectionType,
667
+ params: { locale: currentDesiredLocale }
668
+ });
669
+ const { data: locales = [] } = useGetLocalesQuery();
670
+ const availableLocales = Array.isArray(locales) ? locales.filter((locale) => meta?.availableLocales.some((l) => l.locale === locale.code)) : [];
671
+ const fillFromLocale = (onClose) => async () => {
672
+ const response = await getDocument({
673
+ collectionType,
674
+ model,
675
+ documentId,
676
+ params: { locale: localeSelected }
677
+ });
678
+ if (!response || !schema) {
679
+ return;
680
+ }
681
+ const { data } = response;
682
+ const cleanedData = cleanData(data, schema, components);
683
+ setValues(cleanedData);
684
+ onClose();
685
+ };
686
+ return {
687
+ type: "icon",
688
+ icon: /* @__PURE__ */ jsxRuntime.jsx(icons.Download, {}),
689
+ disabled: availableLocales.length === 0,
690
+ label: formatMessage({
691
+ id: getTranslation("CMEditViewCopyLocale.copy-text"),
692
+ defaultMessage: "Fill in from another locale"
693
+ }),
694
+ dialog: {
695
+ type: "dialog",
696
+ title: formatMessage({
697
+ id: getTranslation("CMEditViewCopyLocale.dialog.title"),
698
+ defaultMessage: "Confirmation"
699
+ }),
700
+ content: ({ onClose }) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
701
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Body, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 3, children: [
702
+ /* @__PURE__ */ jsxRuntime.jsx(icons.WarningCircle, { width: "24px", height: "24px", fill: "danger600" }),
703
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textAlign: "center", children: formatMessage({
704
+ id: getTranslation("CMEditViewCopyLocale.dialog.body"),
705
+ defaultMessage: "Your current content will be erased and filled by the content of the selected locale:"
706
+ }) }),
707
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { width: "100%", children: [
708
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
709
+ id: getTranslation("CMEditViewCopyLocale.dialog.field.label"),
710
+ defaultMessage: "Locale"
711
+ }) }),
712
+ /* @__PURE__ */ jsxRuntime.jsx(
713
+ designSystem.SingleSelect,
714
+ {
715
+ value: localeSelected,
716
+ placeholder: formatMessage({
717
+ id: getTranslation("CMEditViewCopyLocale.dialog.field.placeholder"),
718
+ defaultMessage: "Select one locale..."
719
+ }),
720
+ onChange: (value) => setLocaleSelected(value),
721
+ children: availableLocales.map((locale) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: locale.code, children: locale.name }, locale.code))
722
+ }
723
+ )
724
+ ] })
725
+ ] }) }),
726
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, width: "100%", children: [
727
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { flex: "auto", variant: "tertiary", onClick: onClose, children: formatMessage({
728
+ id: getTranslation("CMEditViewCopyLocale.cancel-text"),
729
+ defaultMessage: "No, cancel"
730
+ }) }),
731
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { flex: "auto", variant: "success", onClick: fillFromLocale(onClose), children: formatMessage({
732
+ id: getTranslation("CMEditViewCopyLocale.submit-text"),
733
+ defaultMessage: "Yes, fill in"
734
+ }) })
735
+ ] }) })
736
+ ] })
737
+ }
738
+ };
739
+ };
488
740
  const DeleteLocaleAction = ({
489
741
  document,
490
742
  documentId,
@@ -496,16 +748,23 @@ const DeleteLocaleAction = ({
496
748
  const { toggleNotification } = strapiAdmin.useNotification();
497
749
  const { delete: deleteAction } = strapiAdmin$1.unstable_useDocumentActions();
498
750
  const { hasI18n, canDelete } = useI18n();
751
+ const [{ query: query2 }] = strapiAdmin.useQueryParams();
752
+ const { data: locales = [] } = useGetLocalesQuery();
753
+ const currentDesiredLocale = query2.plugins?.i18n?.locale;
754
+ const locale = !("error" in locales) && locales.find((loc) => loc.code === currentDesiredLocale);
499
755
  if (!hasI18n) {
500
756
  return null;
501
757
  }
502
758
  return {
503
759
  disabled: document?.locale && !canDelete.includes(document.locale) || !document || !document.id,
504
760
  position: ["header", "table-row"],
505
- label: formatMessage({
506
- id: getTranslation("actions.delete.label"),
507
- defaultMessage: "Delete locale"
508
- }),
761
+ label: formatMessage(
762
+ {
763
+ id: getTranslation("actions.delete.label"),
764
+ defaultMessage: "Delete entry ({locale})"
765
+ },
766
+ { locale: locale && locale.name }
767
+ ),
509
768
  icon: /* @__PURE__ */ jsxRuntime.jsx(StyledTrash, {}),
510
769
  variant: "danger",
511
770
  dialog: {
@@ -548,37 +807,43 @@ const DeleteLocaleAction = ({
548
807
  }
549
808
  };
550
809
  };
551
- const BulkLocalePublishAction = ({
810
+ const BulkLocaleAction = ({
552
811
  document: baseDocument,
553
812
  documentId,
554
813
  model,
555
- collectionType
814
+ collectionType,
815
+ action
556
816
  }) => {
557
817
  const baseLocale = baseDocument?.locale ?? null;
558
- const [{ query }] = strapiAdmin.useQueryParams();
559
- const params = React__namespace.useMemo(() => strapiAdmin$1.buildValidParams(query), [query]);
560
- const isPublishedTab = query.status === "published";
818
+ const [{ query: query$1 }] = strapiAdmin.useQueryParams();
819
+ const params = React__namespace.useMemo(() => strapiAdmin$1.buildValidParams(query$1), [query$1]);
820
+ const isOnPublishedTab = query$1.status === "published";
561
821
  const { formatMessage } = reactIntl.useIntl();
562
822
  const { hasI18n, canPublish } = useI18n();
563
823
  const { toggleNotification } = strapiAdmin.useNotification();
564
824
  const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler();
565
825
  const [selectedRows, setSelectedRows] = React__namespace.useState([]);
566
- const [isConfirmationOpen, setIsConfirmationOpen] = React__namespace.useState(false);
567
- const { publishMany: publishManyAction } = strapiAdmin$1.unstable_useDocumentActions();
826
+ const [isDraftRelationConfirmationOpen, setIsDraftRelationConfirmationOpen] = React__namespace.useState(false);
827
+ const { publishMany: publishManyAction, unpublishMany: unpublishManyAction } = strapiAdmin$1.unstable_useDocumentActions();
568
828
  const {
569
829
  document,
570
830
  meta: documentMeta,
571
831
  schema,
572
832
  validate
573
- } = strapiAdmin$1.unstable_useDocument({
574
- model,
575
- collectionType,
576
- documentId,
577
- params: {
578
- locale: baseLocale
833
+ } = strapiAdmin$1.unstable_useDocument(
834
+ {
835
+ model,
836
+ collectionType,
837
+ documentId,
838
+ params: {
839
+ locale: baseLocale
840
+ }
841
+ },
842
+ {
843
+ skip: !hasI18n || !baseLocale
579
844
  }
580
- });
581
- const { data: localesMetadata = [] } = useGetLocalesQuery();
845
+ );
846
+ const { data: localesMetadata = [] } = useGetLocalesQuery(hasI18n ? void 0 : query.skipToken);
582
847
  const headers = [
583
848
  {
584
849
  label: formatMessage({
@@ -627,12 +892,19 @@ const BulkLocalePublishAction = ({
627
892
  }, {});
628
893
  return [rowsFromMeta, errors];
629
894
  }, [document, documentMeta?.availableLocales, validate]);
630
- const localesToPublish = selectedRows.reduce((acc, selectedRow) => {
631
- if (selectedRow.status !== "published" && !Object.keys(validationErrors).includes(selectedRow.locale)) {
895
+ const isBulkPublish = action === "bulk-publish";
896
+ const localesForAction = selectedRows.reduce((acc, selectedRow) => {
897
+ const isValidLocale = (
898
+ // Validation errors are irrelevant if we are trying to unpublish
899
+ !isBulkPublish || !Object.keys(validationErrors).includes(selectedRow.locale)
900
+ );
901
+ const shouldAddLocale = isBulkPublish ? selectedRow.status !== "published" && isValidLocale : selectedRow.status !== "draft" && isValidLocale;
902
+ if (shouldAddLocale) {
632
903
  acc.push(selectedRow.locale);
633
904
  }
634
905
  return acc;
635
906
  }, []);
907
+ const enableDraftRelationsCount = false;
636
908
  const {
637
909
  data: draftRelationsCount = 0,
638
910
  isLoading: isDraftRelationsLoading,
@@ -641,10 +913,10 @@ const BulkLocalePublishAction = ({
641
913
  {
642
914
  model,
643
915
  documentIds: [documentId],
644
- locale: localesToPublish
916
+ locale: localesForAction
645
917
  },
646
918
  {
647
- skip: !documentId || localesToPublish.length === 0
919
+ skip: !enableDraftRelationsCount
648
920
  }
649
921
  );
650
922
  React__namespace.useEffect(() => {
@@ -670,23 +942,32 @@ const BulkLocalePublishAction = ({
670
942
  documentIds: [documentId],
671
943
  params: {
672
944
  ...params,
673
- locale: localesToPublish
945
+ locale: localesForAction
946
+ }
947
+ });
948
+ setSelectedRows([]);
949
+ };
950
+ const unpublish = async () => {
951
+ await unpublishManyAction({
952
+ model,
953
+ documentIds: [documentId],
954
+ params: {
955
+ ...params,
956
+ locale: localesForAction
674
957
  }
675
958
  });
676
959
  setSelectedRows([]);
677
960
  };
678
961
  const handleAction = async () => {
679
962
  if (draftRelationsCount > 0) {
680
- setIsConfirmationOpen(true);
681
- } else {
963
+ setIsDraftRelationConfirmationOpen(true);
964
+ } else if (isBulkPublish) {
682
965
  await publish();
966
+ } else {
967
+ await unpublish();
683
968
  }
684
969
  };
685
- const isUnpublish = document?.status === "published";
686
- if (isUnpublish) {
687
- console.warn(["I18N"], "Bulk locale unpublish modal not implemented");
688
- }
689
- if (isConfirmationOpen) {
970
+ if (isDraftRelationConfirmationOpen) {
690
971
  return {
691
972
  label: formatMessage({
692
973
  id: "app.components.ConfirmDialog.title",
@@ -695,11 +976,11 @@ const BulkLocalePublishAction = ({
695
976
  variant: "danger",
696
977
  dialog: {
697
978
  onCancel: () => {
698
- setIsConfirmationOpen(false);
979
+ setIsDraftRelationConfirmationOpen(false);
699
980
  },
700
981
  onConfirm: async () => {
701
982
  await publish();
702
- setIsConfirmationOpen(false);
983
+ setIsDraftRelationConfirmationOpen(false);
703
984
  },
704
985
  type: "dialog",
705
986
  title: formatMessage({
@@ -709,27 +990,32 @@ const BulkLocalePublishAction = ({
709
990
  content: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "center", gap: 2, children: [
710
991
  /* @__PURE__ */ jsxRuntime.jsx(icons.WarningCircle, { width: "2.4rem", height: "2.4rem", fill: "danger600" }),
711
992
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textAlign: "center", children: formatMessage({
712
- id: "content-manager.actions.discard.dialog.body",
713
- defaultMessage: "Are you sure you want to discard the changes? This action is irreversible."
993
+ id: getTranslation("CMEditViewBulkLocale.draft-relation-warning"),
994
+ defaultMessage: "Some locales are related to draft entries. Publishing them could leave broken links in your app."
995
+ }) }),
996
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textAlign: "center", children: formatMessage({
997
+ id: getTranslation("CMEditViewBulkLocale.continue-confirmation"),
998
+ defaultMessage: "Are you sure you want to continue?"
714
999
  }) })
715
1000
  ] })
716
1001
  }
717
1002
  };
718
1003
  }
1004
+ const hasPermission = selectedRows.map(({ locale }) => locale).every((locale) => canPublish.includes(locale));
719
1005
  return {
720
1006
  label: formatMessage({
721
- id: getTranslation("CMEditViewBulkLocale.publish-title"),
722
- defaultMessage: "Publish Multiple Locales"
1007
+ id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? "publish" : "unpublish"}-title`),
1008
+ defaultMessage: `${isBulkPublish ? "Publish" : "Unpublish"} Multiple Locales`
723
1009
  }),
724
- icon: /* @__PURE__ */ jsxRuntime.jsx(icons.ListPlus, {}),
725
- disabled: isPublishedTab || !canPublish,
1010
+ variant: isBulkPublish ? "secondary" : "danger",
1011
+ icon: isBulkPublish ? /* @__PURE__ */ jsxRuntime.jsx(icons.ListPlus, {}) : /* @__PURE__ */ jsxRuntime.jsx(icons.Cross, {}),
1012
+ disabled: isOnPublishedTab || canPublish.length === 0,
726
1013
  position: ["panel"],
727
- variant: "secondary",
728
1014
  dialog: {
729
1015
  type: "modal",
730
1016
  title: formatMessage({
731
- id: getTranslation("CMEditViewBulkLocale.publish-title"),
732
- defaultMessage: "Publish Multiple Locales"
1017
+ id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? "publish" : "unpublish"}-title`),
1018
+ defaultMessage: `${isBulkPublish ? "Publish" : "Unpublish"} Multiple Locales`
733
1019
  }),
734
1020
  content: () => {
735
1021
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -748,28 +1034,35 @@ const BulkLocalePublishAction = ({
748
1034
  validationErrors,
749
1035
  headers,
750
1036
  rows,
751
- localesMetadata
1037
+ localesMetadata,
1038
+ action: action ?? "bulk-publish"
752
1039
  }
753
1040
  )
754
1041
  }
755
1042
  );
756
1043
  },
757
- footer: () => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxRuntime.jsx(
1044
+ footer: () => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Footer, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxRuntime.jsx(
758
1045
  designSystem.Button,
759
1046
  {
760
1047
  loading: isDraftRelationsLoading,
761
- disabled: localesToPublish.length === 0,
1048
+ disabled: !hasPermission || localesForAction.length === 0,
762
1049
  variant: "default",
763
1050
  onClick: handleAction,
764
1051
  children: formatMessage({
765
- id: "app.utils.publish",
766
- defaultMessage: "Publish"
1052
+ id: isBulkPublish ? "app.utils.publish" : "app.utils.unpublish",
1053
+ defaultMessage: isBulkPublish ? "Publish" : "Unpublish"
767
1054
  })
768
1055
  }
769
1056
  ) })
770
1057
  }
771
1058
  };
772
1059
  };
1060
+ const BulkLocalePublishAction = (props) => {
1061
+ return BulkLocaleAction({ action: "bulk-publish", ...props });
1062
+ };
1063
+ const BulkLocaleUnpublishAction = (props) => {
1064
+ return BulkLocaleAction({ action: "bulk-unpublish", ...props });
1065
+ };
773
1066
  const StyledTrash = styledComponents.styled(icons.Trash)`
774
1067
  path {
775
1068
  fill: currentColor;
@@ -826,16 +1119,9 @@ const UnpublishModalAdditionalInfo = () => {
826
1119
  }
827
1120
  ) });
828
1121
  };
829
- const Initializer = ({ setPlugin }) => {
830
- const setPluginRef = React__namespace.useRef(setPlugin);
831
- React__namespace.useEffect(() => {
832
- setPluginRef.current(pluginId);
833
- }, []);
834
- return null;
835
- };
836
1122
  const LocalePicker = () => {
837
1123
  const { formatMessage } = reactIntl.useIntl();
838
- const [{ query }, setQuery] = strapiAdmin.useQueryParams();
1124
+ const [{ query: query2 }, setQuery] = strapiAdmin.useQueryParams();
839
1125
  const { hasI18n, canRead, canCreate } = useI18n();
840
1126
  const { data: locales = [] } = useGetLocalesQuery(void 0, {
841
1127
  skip: !hasI18n
@@ -845,25 +1131,25 @@ const LocalePicker = () => {
845
1131
  setQuery(
846
1132
  {
847
1133
  page: 1,
848
- plugins: { ...query.plugins, i18n: { locale: code } }
1134
+ plugins: { ...query2.plugins, i18n: { locale: code } }
849
1135
  },
850
1136
  "push",
851
1137
  replace
852
1138
  );
853
1139
  },
854
- [query.plugins, setQuery]
1140
+ [query2.plugins, setQuery]
855
1141
  );
856
1142
  React__namespace.useEffect(() => {
857
1143
  if (!Array.isArray(locales) || !hasI18n) {
858
1144
  return;
859
1145
  }
860
- const currentDesiredLocale = query.plugins?.i18n?.locale;
1146
+ const currentDesiredLocale = query2.plugins?.i18n?.locale;
861
1147
  const doesLocaleExist = locales.find((loc) => loc.code === currentDesiredLocale);
862
1148
  const defaultLocale = locales.find((locale) => locale.isDefault);
863
1149
  if (!doesLocaleExist && defaultLocale?.code) {
864
1150
  handleChange(defaultLocale.code, true);
865
1151
  }
866
- }, [hasI18n, handleChange, locales, query.plugins?.i18n?.locale]);
1152
+ }, [hasI18n, handleChange, locales, query2.plugins?.i18n?.locale]);
867
1153
  if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {
868
1154
  return null;
869
1155
  }
@@ -878,7 +1164,7 @@ const LocalePicker = () => {
878
1164
  id: getTranslation("actions.select-locale"),
879
1165
  defaultMessage: "Select locale"
880
1166
  }),
881
- value: query.plugins?.i18n?.locale || locales.find((locale) => locale.isDefault)?.code,
1167
+ value: query2.plugins?.i18n?.locale || locales.find((locale) => locale.isDefault)?.code,
882
1168
  onChange: handleChange,
883
1169
  children: displayedLocales.map((locale) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: locale.code, children: locale.name }, locale.id))
884
1170
  }
@@ -996,54 +1282,13 @@ const LocaleListCell = ({
996
1282
  return locale.name;
997
1283
  }).toSorted((a, b) => formatter.compare(a, b));
998
1284
  return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Popover.Root, { children: [
999
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Popover.Trigger, { children: /* @__PURE__ */ jsxRuntime.jsx(Button, { type: "button", onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsxRuntime.jsxs(
1000
- ActionWrapper,
1001
- {
1002
- minWidth: "100%",
1003
- alignItems: "center",
1004
- justifyContent: "center",
1005
- height: "3.2rem",
1006
- width: "3.2rem",
1007
- children: [
1008
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", ellipsis: true, children: localesForDocument.join(", ") }),
1009
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { children: /* @__PURE__ */ jsxRuntime.jsx(icons.CaretDown, {}) })
1010
- ]
1011
- }
1012
- ) }) }),
1285
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Popover.Trigger, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { variant: "ghost", type: "button", onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { minWidth: "100%", alignItems: "center", justifyContent: "center", fontWeight: "regular", children: [
1286
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", ellipsis: true, marginRight: 2, children: localesForDocument.join(", ") }),
1287
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { children: /* @__PURE__ */ jsxRuntime.jsx(icons.CaretDown, { width: "1.2rem", height: "1.2rem" }) })
1288
+ ] }) }) }),
1013
1289
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Popover.Content, { sideOffset: 16, children: /* @__PURE__ */ jsxRuntime.jsx("ul", { children: localesForDocument.map((name) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { padding: 3, tag: "li", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: name }) }, name)) }) })
1014
1290
  ] });
1015
1291
  };
1016
- const Button = styledComponents.styled.button`
1017
- width: 100%;
1018
-
1019
- svg {
1020
- > g,
1021
- path {
1022
- fill: ${({ theme }) => theme.colors.neutral500};
1023
- }
1024
- }
1025
- &:hover {
1026
- svg {
1027
- > g,
1028
- path {
1029
- fill: ${({ theme }) => theme.colors.neutral600};
1030
- }
1031
- }
1032
- }
1033
- &:active {
1034
- svg {
1035
- > g,
1036
- path {
1037
- fill: ${({ theme }) => theme.colors.neutral400};
1038
- }
1039
- }
1040
- }
1041
- `;
1042
- const ActionWrapper = styledComponents.styled(designSystem.Flex)`
1043
- svg {
1044
- height: 0.4rem;
1045
- }
1046
- `;
1047
1292
  const addColumnToTableHook = ({ displayedHeaders, layout }) => {
1048
1293
  const { options } = layout;
1049
1294
  const isFieldLocalized = doesPluginOptionsHaveI18nLocalized(options) ? options.i18n.localized : false;
@@ -1072,18 +1317,11 @@ const addColumnToTableHook = ({ displayedHeaders, layout }) => {
1072
1317
  const addLocaleToReleasesHook = ({ displayedHeaders = [] }) => {
1073
1318
  return {
1074
1319
  displayedHeaders: [
1075
- // TODO: Fix when migrating to v5
1076
- // ...displayedHeaders,
1320
+ ...displayedHeaders,
1077
1321
  {
1078
- key: "__locale__",
1079
- fieldSchema: { type: "string" },
1080
- metadatas: {
1081
- label: {
1082
- id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1083
- defaultMessage: "locale"
1084
- },
1085
- searchable: false,
1086
- sortable: false
1322
+ label: {
1323
+ id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1324
+ defaultMessage: "locale"
1087
1325
  },
1088
1326
  name: "locale"
1089
1327
  }
@@ -1231,8 +1469,6 @@ const index = {
1231
1469
  app.addRBACMiddleware([localeMiddleware]);
1232
1470
  app.registerPlugin({
1233
1471
  id: pluginId,
1234
- initializer: Initializer,
1235
- isReady: false,
1236
1472
  name: pluginId
1237
1473
  });
1238
1474
  },
@@ -1250,11 +1486,11 @@ const index = {
1250
1486
  },
1251
1487
  id: "internationalization",
1252
1488
  to: "internationalization",
1253
- Component: () => Promise.resolve().then(() => require("./SettingsPage-VN7sTzkb.js")).then((mod) => ({ default: mod.ProtectedSettingsPage })),
1489
+ Component: () => Promise.resolve().then(() => require("./SettingsPage-CJOMVQv5.js")).then((mod) => ({ default: mod.ProtectedSettingsPage })),
1254
1490
  permissions: PERMISSIONS.accessMain
1255
1491
  });
1256
1492
  const contentManager = app.getPlugin("content-manager");
1257
- contentManager.apis.addDocumentHeaderAction([LocalePickerAction]);
1493
+ contentManager.apis.addDocumentHeaderAction([LocalePickerAction, FillFromAnotherLocaleAction]);
1258
1494
  contentManager.apis.addDocumentAction((actions) => {
1259
1495
  const indexOfDeleteAction = actions.findIndex((action) => action.type === "delete");
1260
1496
  actions.splice(indexOfDeleteAction, 0, DeleteLocaleAction);
@@ -1262,6 +1498,7 @@ const index = {
1262
1498
  });
1263
1499
  contentManager.apis.addDocumentAction((actions) => {
1264
1500
  actions.splice(2, 0, BulkLocalePublishAction);
1501
+ actions.splice(5, 0, BulkLocaleUnpublishAction);
1265
1502
  return actions;
1266
1503
  });
1267
1504
  contentManager.injectComponent("listView", "actions", {
@@ -1367,7 +1604,7 @@ const index = {
1367
1604
  async registerTrads({ locales }) {
1368
1605
  const importedTrads = await Promise.all(
1369
1606
  locales.map((locale) => {
1370
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => Promise.resolve().then(() => require("./de-DtWiGdHl.js")), "./translations/dk.json": () => Promise.resolve().then(() => require("./dk-D8C-casx.js")), "./translations/en.json": () => Promise.resolve().then(() => require("./en-Kv6y9zPQ.js")), "./translations/es.json": () => Promise.resolve().then(() => require("./es-DS-XFGSw.js")), "./translations/fr.json": () => Promise.resolve().then(() => require("./fr-BTjekDpq.js")), "./translations/ko.json": () => Promise.resolve().then(() => require("./ko-DmcGUBQ3.js")), "./translations/pl.json": () => Promise.resolve().then(() => require("./pl-Cn5RYonZ.js")), "./translations/ru.json": () => Promise.resolve().then(() => require("./ru-BMBgVL3s.js")), "./translations/tr.json": () => Promise.resolve().then(() => require("./tr-CarUU76c.js")), "./translations/zh-Hans.json": () => Promise.resolve().then(() => require("./zh-Hans-DSHIXAa3.js")), "./translations/zh.json": () => Promise.resolve().then(() => require("./zh-CukOviB0.js")) }), `./translations/${locale}.json`).then(({ default: data }) => {
1607
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => Promise.resolve().then(() => require("./de-DtWiGdHl.js")), "./translations/dk.json": () => Promise.resolve().then(() => require("./dk-D8C-casx.js")), "./translations/en.json": () => Promise.resolve().then(() => require("./en-Dk9At9_Z.js")), "./translations/es.json": () => Promise.resolve().then(() => require("./es-DS-XFGSw.js")), "./translations/fr.json": () => Promise.resolve().then(() => require("./fr-BTjekDpq.js")), "./translations/ko.json": () => Promise.resolve().then(() => require("./ko-DmcGUBQ3.js")), "./translations/pl.json": () => Promise.resolve().then(() => require("./pl-Cn5RYonZ.js")), "./translations/ru.json": () => Promise.resolve().then(() => require("./ru-BMBgVL3s.js")), "./translations/tr.json": () => Promise.resolve().then(() => require("./tr-CarUU76c.js")), "./translations/zh-Hans.json": () => Promise.resolve().then(() => require("./zh-Hans-DSHIXAa3.js")), "./translations/zh.json": () => Promise.resolve().then(() => require("./zh-CukOviB0.js")) }), `./translations/${locale}.json`).then(({ default: data }) => {
1371
1608
  return {
1372
1609
  data: prefixPluginTranslations(data, pluginId),
1373
1610
  locale
@@ -1391,4 +1628,4 @@ exports.useDeleteLocaleMutation = useDeleteLocaleMutation;
1391
1628
  exports.useGetDefaultLocalesQuery = useGetDefaultLocalesQuery;
1392
1629
  exports.useGetLocalesQuery = useGetLocalesQuery;
1393
1630
  exports.useUpdateLocaleMutation = useUpdateLocaleMutation;
1394
- //# sourceMappingURL=index-kedPlCo6.js.map
1631
+ //# sourceMappingURL=index-C5SImSYG.js.map