@strapi/i18n 0.0.0-experimental.d53e940834bf72ddc725f1d2fd36dac9abec30cb → 0.0.0-experimental.d6bba97c7ed8309e57888e84d4788fa279d473fd

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 (55) hide show
  1. package/LICENSE +18 -3
  2. package/dist/_chunks/{SettingsPage-w9zz705o.mjs → SettingsPage-BAx9nmep.mjs} +8 -8
  3. package/dist/_chunks/SettingsPage-BAx9nmep.mjs.map +1 -0
  4. package/dist/_chunks/{SettingsPage-CxZ9qSb_.js → SettingsPage-BTgjb2KS.js} +9 -10
  5. package/dist/_chunks/SettingsPage-BTgjb2KS.js.map +1 -0
  6. package/dist/_chunks/{en-BsOU9o5z.js → en-BKBz3tro.js} +10 -3
  7. package/dist/_chunks/en-BKBz3tro.js.map +1 -0
  8. package/dist/_chunks/{en-CM6Pjfyv.mjs → en-DlXfy6Gy.mjs} +10 -3
  9. package/dist/_chunks/en-DlXfy6Gy.mjs.map +1 -0
  10. package/dist/_chunks/{index-CLtneDAv.js → index-3yyF237r.js} +433 -187
  11. package/dist/_chunks/index-3yyF237r.js.map +1 -0
  12. package/dist/_chunks/{index-jbI6Njjb.mjs → index-B0NijiBB.mjs} +428 -181
  13. package/dist/_chunks/index-B0NijiBB.mjs.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/components/CreateLocale.d.ts +6 -6
  19. package/dist/admin/src/contentReleasesHooks/releaseDetailsView.d.ts +9 -5
  20. package/dist/admin/src/utils/clean.d.ts +4 -0
  21. package/dist/admin/src/utils/schemas.d.ts +1 -0
  22. package/dist/server/index.js +414 -482
  23. package/dist/server/index.js.map +1 -1
  24. package/dist/server/index.mjs +415 -482
  25. package/dist/server/index.mjs.map +1 -1
  26. package/dist/server/src/bootstrap.d.ts +1 -4
  27. package/dist/server/src/bootstrap.d.ts.map +1 -1
  28. package/dist/server/src/index.d.ts +21 -13
  29. package/dist/server/src/index.d.ts.map +1 -1
  30. package/dist/server/src/register.d.ts.map +1 -1
  31. package/dist/server/src/services/index.d.ts +20 -10
  32. package/dist/server/src/services/index.d.ts.map +1 -1
  33. package/dist/server/src/services/permissions/actions.d.ts +14 -2
  34. package/dist/server/src/services/permissions/actions.d.ts.map +1 -1
  35. package/dist/server/src/services/permissions.d.ts +14 -2
  36. package/dist/server/src/services/permissions.d.ts.map +1 -1
  37. package/dist/server/src/services/sanitize/index.d.ts +11 -0
  38. package/dist/server/src/services/sanitize/index.d.ts.map +1 -0
  39. package/dist/server/src/utils/index.d.ts +2 -2
  40. package/dist/server/src/utils/index.d.ts.map +1 -1
  41. package/package.json +13 -13
  42. package/dist/_chunks/SettingsPage-CxZ9qSb_.js.map +0 -1
  43. package/dist/_chunks/SettingsPage-w9zz705o.mjs.map +0 -1
  44. package/dist/_chunks/en-BsOU9o5z.js.map +0 -1
  45. package/dist/_chunks/en-CM6Pjfyv.mjs.map +0 -1
  46. package/dist/_chunks/index-CLtneDAv.js.map +0 -1
  47. package/dist/_chunks/index-jbI6Njjb.mjs.map +0 -1
  48. package/dist/admin/src/components/Initializer.d.ts +0 -5
  49. package/dist/server/src/migrations/content-type/disable/index.d.ts +0 -3
  50. package/dist/server/src/migrations/content-type/disable/index.d.ts.map +0 -1
  51. package/dist/server/src/migrations/content-type/enable/index.d.ts +0 -3
  52. package/dist/server/src/migrations/content-type/enable/index.d.ts.map +0 -1
  53. package/dist/server/src/services/entity-service-decorator.d.ts +0 -29
  54. package/dist/server/src/services/entity-service-decorator.d.ts.map +0 -1
  55. 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");
@@ -14,8 +15,7 @@ const qs = require("qs");
14
15
  const omit = require("lodash/omit");
15
16
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
16
17
  function _interopNamespace(e) {
17
- if (e && e.__esModule)
18
- return e;
18
+ if (e && e.__esModule) return e;
19
19
  const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
20
20
  if (e) {
21
21
  for (const k in e) {
@@ -36,13 +36,20 @@ const yup__namespace = /* @__PURE__ */ _interopNamespace(yup);
36
36
  const React__namespace = /* @__PURE__ */ _interopNamespace(React);
37
37
  const qs__namespace = /* @__PURE__ */ _interopNamespace(qs);
38
38
  const omit__default = /* @__PURE__ */ _interopDefault(omit);
39
- const __variableDynamicImportRuntimeHelper = (glob, path) => {
39
+ const __variableDynamicImportRuntimeHelper = (glob, path, segs) => {
40
40
  const v = glob[path];
41
41
  if (v) {
42
42
  return typeof v === "function" ? v() : Promise.resolve(v);
43
43
  }
44
44
  return new Promise((_, reject) => {
45
- (typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(reject.bind(null, new Error("Unknown variable dynamic import: " + path)));
45
+ (typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
46
+ reject.bind(
47
+ null,
48
+ new Error(
49
+ "Unknown variable dynamic import: " + path + (path.split("/").length !== segs ? ". Note that variables only represent file names one level deep." : "")
50
+ )
51
+ )
52
+ );
46
53
  });
47
54
  };
48
55
  const pluginId = "i18n";
@@ -160,7 +167,7 @@ const useI18n = () => {
160
167
  model: params.slug
161
168
  },
162
169
  {
163
- skip: !params.slug || !params.collectionType
170
+ skip: true
164
171
  }
165
172
  );
166
173
  if (doesPluginOptionsHaveI18nLocalized(schema?.pluginOptions)) {
@@ -240,10 +247,94 @@ const relationsApi = i18nApi.injectEndpoints({
240
247
  })
241
248
  });
242
249
  const { useGetManyDraftRelationCountQuery } = relationsApi;
250
+ const cleanData = (data, schema, components) => {
251
+ const cleanedData = removeFields(data, [
252
+ "createdAt",
253
+ "createdBy",
254
+ "updatedAt",
255
+ "updatedBy",
256
+ "id",
257
+ "documentId",
258
+ "publishedAt",
259
+ "strapi_stage",
260
+ "strapi_assignee",
261
+ "locale",
262
+ "status"
263
+ ]);
264
+ const cleanedDataWithoutPasswordAndRelation = recursiveRemoveFieldTypes(
265
+ cleanedData,
266
+ schema,
267
+ components,
268
+ ["relation", "password"]
269
+ );
270
+ return cleanedDataWithoutPasswordAndRelation;
271
+ };
272
+ const removeFields = (data, fields) => {
273
+ return Object.keys(data).reduce((acc, current) => {
274
+ if (fields.includes(current)) {
275
+ return acc;
276
+ }
277
+ acc[current] = data[current];
278
+ return acc;
279
+ }, {});
280
+ };
281
+ const recursiveRemoveFieldTypes = (data, schema, components, fields) => {
282
+ return Object.keys(data).reduce((acc, current) => {
283
+ const attribute = schema.attributes[current] ?? { type: void 0 };
284
+ if (fields.includes(attribute.type)) {
285
+ return acc;
286
+ }
287
+ if (attribute.type === "dynamiczone") {
288
+ acc[current] = data[current].map((componentValue, index2) => {
289
+ const { id: _, ...rest } = recursiveRemoveFieldTypes(
290
+ componentValue,
291
+ components[componentValue.__component],
292
+ components,
293
+ fields
294
+ );
295
+ return {
296
+ ...rest,
297
+ __temp_key__: index2 + 1
298
+ };
299
+ });
300
+ } else if (attribute.type === "component") {
301
+ const { repeatable, component } = attribute;
302
+ if (repeatable) {
303
+ acc[current] = (data[current] ?? []).map((compoData, index2) => {
304
+ const { id: _, ...rest } = recursiveRemoveFieldTypes(
305
+ compoData,
306
+ components[component],
307
+ components,
308
+ fields
309
+ );
310
+ return {
311
+ ...rest,
312
+ __temp_key__: index2 + 1
313
+ };
314
+ });
315
+ } else {
316
+ const { id: _, ...rest } = recursiveRemoveFieldTypes(
317
+ data[current] ?? {},
318
+ components[component],
319
+ components,
320
+ fields
321
+ );
322
+ acc[current] = rest;
323
+ }
324
+ } else {
325
+ acc[current] = data[current];
326
+ }
327
+ return acc;
328
+ }, {});
329
+ };
243
330
  const isErrorMessageDescriptor = (object) => {
244
331
  return typeof object === "object" && object !== null && "id" in object && "defaultMessage" in object;
245
332
  };
246
- const EntryValidationText = ({ status = "draft", validationErrors }) => {
333
+ const EntryValidationText = ({
334
+ status = "draft",
335
+ validationErrors,
336
+ action
337
+ }) => {
247
338
  const { formatMessage } = reactIntl.useIntl();
248
339
  const getErrorStr = (key, value) => {
249
340
  if (typeof value === "string") {
@@ -277,30 +368,63 @@ const EntryValidationText = ({ status = "draft", validationErrors }) => {
277
368
  ) })
278
369
  ] });
279
370
  }
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
- }
371
+ const getStatusMessage = () => {
372
+ if (action === "bulk-publish") {
373
+ if (status === "published") {
374
+ return {
375
+ icon: /* @__PURE__ */ jsxRuntime.jsx(icons.CheckCircle, { fill: "success600" }),
376
+ text: formatMessage({
377
+ id: "content-manager.bulk-publish.already-published",
378
+ defaultMessage: "Already Published"
379
+ }),
380
+ textColor: "success600",
381
+ fontWeight: "bold"
382
+ };
383
+ } else if (status === "modified") {
384
+ return {
385
+ icon: /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowsCounterClockwise, { fill: "alternative600" }),
386
+ text: formatMessage({
387
+ id: "app.utils.ready-to-publish-changes",
388
+ defaultMessage: "Ready to publish changes"
389
+ })
390
+ };
391
+ } else {
392
+ return {
393
+ icon: /* @__PURE__ */ jsxRuntime.jsx(icons.CheckCircle, { fill: "success600" }),
394
+ text: formatMessage({
395
+ id: "app.utils.ready-to-publish",
396
+ defaultMessage: "Ready to publish"
397
+ })
398
+ };
399
+ }
400
+ } else {
401
+ if (status === "draft") {
402
+ return {
403
+ icon: /* @__PURE__ */ jsxRuntime.jsx(icons.CheckCircle, { fill: "success600" }),
404
+ text: formatMessage({
405
+ id: "content-manager.bulk-unpublish.already-unpublished",
406
+ defaultMessage: "Already Unpublished"
407
+ }),
408
+ textColor: "success600",
409
+ fontWeight: "bold"
410
+ };
411
+ } else {
412
+ return {
413
+ icon: /* @__PURE__ */ jsxRuntime.jsx(icons.CheckCircle, { fill: "success600" }),
414
+ text: formatMessage({
415
+ id: "app.utils.ready-to-unpublish-changes",
416
+ defaultMessage: "Ready to unpublish"
417
+ }),
418
+ textColor: "success600",
419
+ fontWeight: "bold"
420
+ };
421
+ }
422
+ }
423
+ };
424
+ const { icon, text, textColor = "success600", fontWeight = "normal" } = getStatusMessage();
298
425
  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
- }) })
426
+ icon,
427
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor, fontWeight, children: text })
304
428
  ] });
305
429
  };
306
430
  const BoldChunk = (chunks) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontWeight: "bold", children: chunks });
@@ -308,7 +432,8 @@ const BulkLocaleActionModal = ({
308
432
  headers,
309
433
  rows,
310
434
  localesMetadata,
311
- validationErrors = {}
435
+ validationErrors = {},
436
+ action
312
437
  }) => {
313
438
  const { formatMessage } = reactIntl.useIntl();
314
439
  const selectedRows = strapiAdmin.useTable(
@@ -321,27 +446,29 @@ const BulkLocaleActionModal = ({
321
446
  return acc;
322
447
  }, {});
323
448
  const localesWithErrors = Object.keys(validationErrors);
324
- const alreadyPublishedCount = selectedRows.filter(
449
+ const publishedCount = selectedRows.filter(
325
450
  ({ locale }) => currentStatusByLocale[locale] === "published"
326
451
  ).length;
327
- const readyToPublishCount = selectedRows.filter(
452
+ const draftCount = selectedRows.filter(
328
453
  ({ locale }) => (currentStatusByLocale[locale] === "draft" || currentStatusByLocale[locale] === "modified") && !localesWithErrors.includes(locale)
329
454
  ).length;
330
455
  const withErrorsCount = localesWithErrors.length;
456
+ const messageId = action === "bulk-publish" ? "content-manager.containers.list.selectedEntriesModal.selectedCount.publish" : "content-manager.containers.list.selectedEntriesModal.selectedCount.unpublish";
457
+ 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
458
  return formatMessage(
332
459
  {
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."
460
+ id: messageId,
461
+ defaultMessage
335
462
  },
336
463
  {
337
464
  withErrorsCount,
338
- readyToPublishCount,
339
- alreadyPublishedCount,
465
+ draftCount,
466
+ publishedCount,
340
467
  b: BoldChunk
341
468
  }
342
469
  );
343
470
  };
344
- return /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
471
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Modal.Body, { children: [
345
472
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: getFormattedCountMessage() }),
346
473
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { marginTop: 5, children: /* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Table.Content, { children: [
347
474
  /* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Table.Head, { children: [
@@ -362,13 +489,12 @@ const BulkLocaleActionModal = ({
362
489
  paddingRight: "6px",
363
490
  paddingTop: "2px",
364
491
  paddingBottom: "2px",
365
- showBullet: false,
366
492
  size: "S",
367
493
  variant: statusVariant,
368
494
  children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { tag: "span", variant: "pi", fontWeight: "bold", children: capitalize(status) })
369
495
  }
370
496
  ) }) }),
371
- /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(EntryValidationText, { validationErrors: error, status }) }),
497
+ /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(EntryValidationText, { validationErrors: error, status, action }) }),
372
498
  /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(
373
499
  designSystem.IconButton,
374
500
  {
@@ -385,7 +511,7 @@ const BulkLocaleActionModal = ({
385
511
  name: locale
386
512
  }
387
513
  ),
388
- borderWidth: 0,
514
+ variant: "ghost",
389
515
  children: /* @__PURE__ */ jsxRuntime.jsx(icons.Pencil, {})
390
516
  }
391
517
  ) })
@@ -394,6 +520,47 @@ const BulkLocaleActionModal = ({
394
520
  ] }) })
395
521
  ] });
396
522
  };
523
+ const statusVariants = {
524
+ draft: "secondary",
525
+ published: "success",
526
+ modified: "alternative"
527
+ };
528
+ const LocaleOption = ({
529
+ isDraftAndPublishEnabled,
530
+ locale,
531
+ status,
532
+ entryExists
533
+ }) => {
534
+ const { formatMessage } = reactIntl.useIntl();
535
+ if (!entryExists) {
536
+ return formatMessage(
537
+ {
538
+ id: getTranslation("CMEditViewLocalePicker.locale.create"),
539
+ defaultMessage: "Create <bold>{locale}</bold> locale"
540
+ },
541
+ {
542
+ bold: (locale2) => /* @__PURE__ */ jsxRuntime.jsx("b", { children: locale2 }),
543
+ locale: locale.name
544
+ }
545
+ );
546
+ }
547
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { width: "100%", gap: 1, justifyContent: "space-between", children: [
548
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: locale.name }),
549
+ isDraftAndPublishEnabled ? /* @__PURE__ */ jsxRuntime.jsx(
550
+ designSystem.Status,
551
+ {
552
+ display: "flex",
553
+ paddingLeft: "6px",
554
+ paddingRight: "6px",
555
+ paddingTop: "2px",
556
+ paddingBottom: "2px",
557
+ size: "S",
558
+ variant: statusVariants[status],
559
+ children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { tag: "span", variant: "pi", fontWeight: "bold", children: capitalize(status) })
560
+ }
561
+ ) : null
562
+ ] });
563
+ };
397
564
  const LocalePickerAction = ({
398
565
  document,
399
566
  meta,
@@ -402,74 +569,77 @@ const LocalePickerAction = ({
402
569
  documentId
403
570
  }) => {
404
571
  const { formatMessage } = reactIntl.useIntl();
405
- const [{ query }, setQuery] = strapiAdmin.useQueryParams();
572
+ const [{ query: query2 }, setQuery] = strapiAdmin.useQueryParams();
406
573
  const { hasI18n, canCreate, canRead } = useI18n();
407
574
  const { data: locales = [] } = useGetLocalesQuery();
408
- const { schema } = strapiAdmin$1.unstable_useDocument({ model, collectionType, documentId });
575
+ const currentDesiredLocale = query2.plugins?.i18n?.locale;
576
+ const { schema } = strapiAdmin$1.unstable_useDocument({
577
+ model,
578
+ collectionType,
579
+ documentId,
580
+ params: { locale: currentDesiredLocale }
581
+ });
409
582
  const handleSelect = React__namespace.useCallback(
410
583
  (value) => {
411
584
  setQuery({
412
585
  plugins: {
413
- ...query.plugins,
586
+ ...query2.plugins,
414
587
  i18n: {
415
588
  locale: value
416
589
  }
417
590
  }
418
591
  });
419
592
  },
420
- [query.plugins, setQuery]
593
+ [query2.plugins, setQuery]
421
594
  );
422
595
  React__namespace.useEffect(() => {
423
596
  if (!Array.isArray(locales) || !hasI18n) {
424
597
  return;
425
598
  }
426
- const currentDesiredLocale = query.plugins?.i18n?.locale;
427
599
  const doesLocaleExist = locales.find((loc) => loc.code === currentDesiredLocale);
428
600
  const defaultLocale = locales.find((locale) => locale.isDefault);
429
601
  if (!doesLocaleExist && defaultLocale?.code) {
430
602
  handleSelect(defaultLocale.code);
431
603
  }
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;
604
+ }, [handleSelect, hasI18n, locales, currentDesiredLocale]);
605
+ const currentLocale = Array.isArray(locales) ? locales.find((locale) => locale.code === currentDesiredLocale) : void 0;
437
606
  const allCurrentLocales = [
438
- { status: getDocumentStatus(document, meta), locale: currentLocale },
607
+ { status: getDocumentStatus(document, meta), locale: currentLocale?.code },
439
608
  ...meta?.availableLocales ?? []
440
609
  ];
610
+ if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {
611
+ return null;
612
+ }
613
+ const displayedLocales = locales.filter((locale) => {
614
+ return canRead.includes(locale.code);
615
+ });
441
616
  return {
442
617
  label: formatMessage({
443
618
  id: getTranslation("Settings.locales.modal.locales.label"),
444
619
  defaultMessage: "Locales"
445
620
  }),
446
- options: locales.map((locale) => {
621
+ options: displayedLocales.map((locale) => {
622
+ const entryWithLocaleExists = allCurrentLocales.some((doc) => doc.locale === locale.code);
447
623
  const currentLocaleDoc = allCurrentLocales.find(
448
624
  (doc) => "locale" in doc ? doc.locale === locale.code : false
449
625
  );
450
- const status = currentLocaleDoc?.status ?? "draft";
451
- const permissionsToCheck = currentLocaleDoc ? canCreate : canRead;
452
- const statusVariant = status === "draft" ? "primary" : status === "published" ? "success" : "alternative";
626
+ const permissionsToCheck = currentLocaleDoc ? canRead : canCreate;
453
627
  return {
454
628
  disabled: !permissionsToCheck.includes(locale.code),
455
629
  value: locale.code,
456
- label: locale.name,
457
- startIcon: schema?.options?.draftAndPublish ? /* @__PURE__ */ jsxRuntime.jsx(
458
- designSystem.Status,
630
+ label: /* @__PURE__ */ jsxRuntime.jsx(
631
+ LocaleOption,
459
632
  {
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) })
633
+ isDraftAndPublishEnabled: !!schema?.options?.draftAndPublish,
634
+ locale,
635
+ status: currentLocaleDoc?.status,
636
+ entryExists: entryWithLocaleExists
469
637
  }
470
- ) : null
638
+ ),
639
+ startIcon: !entryWithLocaleExists ? /* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}) : null
471
640
  };
472
641
  }),
642
+ customizeContent: () => currentLocale?.name,
473
643
  onSelect: handleSelect,
474
644
  value: currentLocale
475
645
  };
@@ -485,6 +655,99 @@ const getDocumentStatus = (document, meta) => {
485
655
  }
486
656
  return docStatus;
487
657
  };
658
+ const FillFromAnotherLocaleAction = ({
659
+ documentId,
660
+ meta,
661
+ model,
662
+ collectionType
663
+ }) => {
664
+ const { formatMessage } = reactIntl.useIntl();
665
+ const [{ query: query2 }] = strapiAdmin.useQueryParams();
666
+ const { hasI18n } = useI18n();
667
+ const currentDesiredLocale = query2.plugins?.i18n?.locale;
668
+ const [localeSelected, setLocaleSelected] = React__namespace.useState(null);
669
+ const setValues = strapiAdmin.useForm("FillFromAnotherLocale", (state) => state.setValues);
670
+ const { getDocument } = strapiAdmin$1.unstable_useDocumentActions();
671
+ const { schema, components } = strapiAdmin$1.unstable_useDocument({
672
+ model,
673
+ documentId,
674
+ collectionType,
675
+ params: { locale: currentDesiredLocale }
676
+ });
677
+ const { data: locales = [] } = useGetLocalesQuery();
678
+ const availableLocales = Array.isArray(locales) ? locales.filter((locale) => meta?.availableLocales.some((l) => l.locale === locale.code)) : [];
679
+ const fillFromLocale = (onClose) => async () => {
680
+ const response = await getDocument({
681
+ collectionType,
682
+ model,
683
+ documentId,
684
+ params: { locale: localeSelected }
685
+ });
686
+ if (!response || !schema) {
687
+ return;
688
+ }
689
+ const { data } = response;
690
+ const cleanedData = cleanData(data, schema, components);
691
+ setValues(cleanedData);
692
+ onClose();
693
+ };
694
+ if (!hasI18n) {
695
+ return null;
696
+ }
697
+ return {
698
+ type: "icon",
699
+ icon: /* @__PURE__ */ jsxRuntime.jsx(icons.Download, {}),
700
+ disabled: availableLocales.length === 0,
701
+ label: formatMessage({
702
+ id: getTranslation("CMEditViewCopyLocale.copy-text"),
703
+ defaultMessage: "Fill in from another locale"
704
+ }),
705
+ dialog: {
706
+ type: "dialog",
707
+ title: formatMessage({
708
+ id: getTranslation("CMEditViewCopyLocale.dialog.title"),
709
+ defaultMessage: "Confirmation"
710
+ }),
711
+ content: ({ onClose }) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
712
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Body, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 3, children: [
713
+ /* @__PURE__ */ jsxRuntime.jsx(icons.WarningCircle, { width: "24px", height: "24px", fill: "danger600" }),
714
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textAlign: "center", children: formatMessage({
715
+ id: getTranslation("CMEditViewCopyLocale.dialog.body"),
716
+ defaultMessage: "Your current content will be erased and filled by the content of the selected locale:"
717
+ }) }),
718
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { width: "100%", children: [
719
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
720
+ id: getTranslation("CMEditViewCopyLocale.dialog.field.label"),
721
+ defaultMessage: "Locale"
722
+ }) }),
723
+ /* @__PURE__ */ jsxRuntime.jsx(
724
+ designSystem.SingleSelect,
725
+ {
726
+ value: localeSelected,
727
+ placeholder: formatMessage({
728
+ id: getTranslation("CMEditViewCopyLocale.dialog.field.placeholder"),
729
+ defaultMessage: "Select one locale..."
730
+ }),
731
+ onChange: (value) => setLocaleSelected(value),
732
+ children: availableLocales.map((locale) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: locale.code, children: locale.name }, locale.code))
733
+ }
734
+ )
735
+ ] })
736
+ ] }) }),
737
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, width: "100%", children: [
738
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { flex: "auto", variant: "tertiary", onClick: onClose, children: formatMessage({
739
+ id: getTranslation("CMEditViewCopyLocale.cancel-text"),
740
+ defaultMessage: "No, cancel"
741
+ }) }),
742
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { flex: "auto", variant: "success", onClick: fillFromLocale(onClose), children: formatMessage({
743
+ id: getTranslation("CMEditViewCopyLocale.submit-text"),
744
+ defaultMessage: "Yes, fill in"
745
+ }) })
746
+ ] }) })
747
+ ] })
748
+ }
749
+ };
750
+ };
488
751
  const DeleteLocaleAction = ({
489
752
  document,
490
753
  documentId,
@@ -496,16 +759,23 @@ const DeleteLocaleAction = ({
496
759
  const { toggleNotification } = strapiAdmin.useNotification();
497
760
  const { delete: deleteAction } = strapiAdmin$1.unstable_useDocumentActions();
498
761
  const { hasI18n, canDelete } = useI18n();
762
+ const [{ query: query2 }] = strapiAdmin.useQueryParams();
763
+ const { data: locales = [] } = useGetLocalesQuery();
764
+ const currentDesiredLocale = query2.plugins?.i18n?.locale;
765
+ const locale = !("error" in locales) && locales.find((loc) => loc.code === currentDesiredLocale);
499
766
  if (!hasI18n) {
500
767
  return null;
501
768
  }
502
769
  return {
503
770
  disabled: document?.locale && !canDelete.includes(document.locale) || !document || !document.id,
504
771
  position: ["header", "table-row"],
505
- label: formatMessage({
506
- id: getTranslation("actions.delete.label"),
507
- defaultMessage: "Delete locale"
508
- }),
772
+ label: formatMessage(
773
+ {
774
+ id: getTranslation("actions.delete.label"),
775
+ defaultMessage: "Delete entry ({locale})"
776
+ },
777
+ { locale: locale && locale.name }
778
+ ),
509
779
  icon: /* @__PURE__ */ jsxRuntime.jsx(StyledTrash, {}),
510
780
  variant: "danger",
511
781
  dialog: {
@@ -522,7 +792,12 @@ const DeleteLocaleAction = ({
522
792
  }) })
523
793
  ] }),
524
794
  onConfirm: async () => {
525
- if (!documentId || !document?.locale) {
795
+ const unableToDelete = (
796
+ // We are unable to delete a collection type without a document ID
797
+ // & unable to delete generally if there is no document locale
798
+ collectionType !== "single-types" && !documentId || !document?.locale
799
+ );
800
+ if (unableToDelete) {
526
801
  console.error(
527
802
  "You're trying to delete a document without an id or locale, this is likely a bug with Strapi. Please open an issue."
528
803
  );
@@ -548,37 +823,43 @@ const DeleteLocaleAction = ({
548
823
  }
549
824
  };
550
825
  };
551
- const BulkLocalePublishAction = ({
826
+ const BulkLocaleAction = ({
552
827
  document: baseDocument,
553
828
  documentId,
554
829
  model,
555
- collectionType
830
+ collectionType,
831
+ action
556
832
  }) => {
557
833
  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";
834
+ const [{ query: query$1 }] = strapiAdmin.useQueryParams();
835
+ const params = React__namespace.useMemo(() => strapiAdmin$1.buildValidParams(query$1), [query$1]);
836
+ const isOnPublishedTab = query$1.status === "published";
561
837
  const { formatMessage } = reactIntl.useIntl();
562
838
  const { hasI18n, canPublish } = useI18n();
563
839
  const { toggleNotification } = strapiAdmin.useNotification();
564
840
  const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler();
565
841
  const [selectedRows, setSelectedRows] = React__namespace.useState([]);
566
842
  const [isDraftRelationConfirmationOpen, setIsDraftRelationConfirmationOpen] = React__namespace.useState(false);
567
- const { publishMany: publishManyAction } = strapiAdmin$1.unstable_useDocumentActions();
843
+ const { publishMany: publishManyAction, unpublishMany: unpublishManyAction } = strapiAdmin$1.unstable_useDocumentActions();
568
844
  const {
569
845
  document,
570
846
  meta: documentMeta,
571
847
  schema,
572
848
  validate
573
- } = strapiAdmin$1.unstable_useDocument({
574
- model,
575
- collectionType,
576
- documentId,
577
- params: {
578
- locale: baseLocale
849
+ } = strapiAdmin$1.unstable_useDocument(
850
+ {
851
+ model,
852
+ collectionType,
853
+ documentId,
854
+ params: {
855
+ locale: baseLocale
856
+ }
857
+ },
858
+ {
859
+ skip: !hasI18n || !baseLocale
579
860
  }
580
- });
581
- const { data: localesMetadata = [] } = useGetLocalesQuery();
861
+ );
862
+ const { data: localesMetadata = [] } = useGetLocalesQuery(hasI18n ? void 0 : query.skipToken);
582
863
  const headers = [
583
864
  {
584
865
  label: formatMessage({
@@ -627,12 +908,19 @@ const BulkLocalePublishAction = ({
627
908
  }, {});
628
909
  return [rowsFromMeta, errors];
629
910
  }, [document, documentMeta?.availableLocales, validate]);
630
- const localesToPublish = selectedRows.reduce((acc, selectedRow) => {
631
- if (selectedRow.status !== "published" && !Object.keys(validationErrors).includes(selectedRow.locale)) {
911
+ const isBulkPublish = action === "bulk-publish";
912
+ const localesForAction = selectedRows.reduce((acc, selectedRow) => {
913
+ const isValidLocale = (
914
+ // Validation errors are irrelevant if we are trying to unpublish
915
+ !isBulkPublish || !Object.keys(validationErrors).includes(selectedRow.locale)
916
+ );
917
+ const shouldAddLocale = isBulkPublish ? selectedRow.status !== "published" && isValidLocale : selectedRow.status !== "draft" && isValidLocale;
918
+ if (shouldAddLocale) {
632
919
  acc.push(selectedRow.locale);
633
920
  }
634
921
  return acc;
635
922
  }, []);
923
+ const enableDraftRelationsCount = false;
636
924
  const {
637
925
  data: draftRelationsCount = 0,
638
926
  isLoading: isDraftRelationsLoading,
@@ -641,10 +929,10 @@ const BulkLocalePublishAction = ({
641
929
  {
642
930
  model,
643
931
  documentIds: [documentId],
644
- locale: localesToPublish
932
+ locale: localesForAction
645
933
  },
646
934
  {
647
- skip: !documentId || localesToPublish.length === 0
935
+ skip: !enableDraftRelationsCount
648
936
  }
649
937
  );
650
938
  React__namespace.useEffect(() => {
@@ -670,7 +958,18 @@ const BulkLocalePublishAction = ({
670
958
  documentIds: [documentId],
671
959
  params: {
672
960
  ...params,
673
- locale: localesToPublish
961
+ locale: localesForAction
962
+ }
963
+ });
964
+ setSelectedRows([]);
965
+ };
966
+ const unpublish = async () => {
967
+ await unpublishManyAction({
968
+ model,
969
+ documentIds: [documentId],
970
+ params: {
971
+ ...params,
972
+ locale: localesForAction
674
973
  }
675
974
  });
676
975
  setSelectedRows([]);
@@ -678,14 +977,12 @@ const BulkLocalePublishAction = ({
678
977
  const handleAction = async () => {
679
978
  if (draftRelationsCount > 0) {
680
979
  setIsDraftRelationConfirmationOpen(true);
681
- } else {
980
+ } else if (isBulkPublish) {
682
981
  await publish();
982
+ } else {
983
+ await unpublish();
683
984
  }
684
985
  };
685
- const isUnpublish = document?.status === "published";
686
- if (isUnpublish) {
687
- console.warn(["I18N"], "Bulk locale unpublish modal not implemented");
688
- }
689
986
  if (isDraftRelationConfirmationOpen) {
690
987
  return {
691
988
  label: formatMessage({
@@ -720,20 +1017,21 @@ const BulkLocalePublishAction = ({
720
1017
  }
721
1018
  };
722
1019
  }
1020
+ const hasPermission = selectedRows.map(({ locale }) => locale).every((locale) => canPublish.includes(locale));
723
1021
  return {
724
1022
  label: formatMessage({
725
- id: getTranslation("CMEditViewBulkLocale.publish-title"),
726
- defaultMessage: "Publish Multiple Locales"
1023
+ id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? "publish" : "unpublish"}-title`),
1024
+ defaultMessage: `${isBulkPublish ? "Publish" : "Unpublish"} Multiple Locales`
727
1025
  }),
728
- icon: /* @__PURE__ */ jsxRuntime.jsx(icons.ListPlus, {}),
729
- disabled: isPublishedTab || !canPublish,
1026
+ variant: isBulkPublish ? "secondary" : "danger",
1027
+ icon: isBulkPublish ? /* @__PURE__ */ jsxRuntime.jsx(icons.ListPlus, {}) : /* @__PURE__ */ jsxRuntime.jsx(icons.Cross, {}),
1028
+ disabled: isOnPublishedTab || canPublish.length === 0,
730
1029
  position: ["panel"],
731
- variant: "secondary",
732
1030
  dialog: {
733
1031
  type: "modal",
734
1032
  title: formatMessage({
735
- id: getTranslation("CMEditViewBulkLocale.publish-title"),
736
- defaultMessage: "Publish Multiple Locales"
1033
+ id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? "publish" : "unpublish"}-title`),
1034
+ defaultMessage: `${isBulkPublish ? "Publish" : "Unpublish"} Multiple Locales`
737
1035
  }),
738
1036
  content: () => {
739
1037
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -752,28 +1050,35 @@ const BulkLocalePublishAction = ({
752
1050
  validationErrors,
753
1051
  headers,
754
1052
  rows,
755
- localesMetadata
1053
+ localesMetadata,
1054
+ action: action ?? "bulk-publish"
756
1055
  }
757
1056
  )
758
1057
  }
759
1058
  );
760
1059
  },
761
- footer: () => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxRuntime.jsx(
1060
+ footer: () => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Footer, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxRuntime.jsx(
762
1061
  designSystem.Button,
763
1062
  {
764
1063
  loading: isDraftRelationsLoading,
765
- disabled: localesToPublish.length === 0,
1064
+ disabled: !hasPermission || localesForAction.length === 0,
766
1065
  variant: "default",
767
1066
  onClick: handleAction,
768
1067
  children: formatMessage({
769
- id: "app.utils.publish",
770
- defaultMessage: "Publish"
1068
+ id: isBulkPublish ? "app.utils.publish" : "app.utils.unpublish",
1069
+ defaultMessage: isBulkPublish ? "Publish" : "Unpublish"
771
1070
  })
772
1071
  }
773
1072
  ) })
774
1073
  }
775
1074
  };
776
1075
  };
1076
+ const BulkLocalePublishAction = (props) => {
1077
+ return BulkLocaleAction({ action: "bulk-publish", ...props });
1078
+ };
1079
+ const BulkLocaleUnpublishAction = (props) => {
1080
+ return BulkLocaleAction({ action: "bulk-unpublish", ...props });
1081
+ };
777
1082
  const StyledTrash = styledComponents.styled(icons.Trash)`
778
1083
  path {
779
1084
  fill: currentColor;
@@ -830,16 +1135,9 @@ const UnpublishModalAdditionalInfo = () => {
830
1135
  }
831
1136
  ) });
832
1137
  };
833
- const Initializer = ({ setPlugin }) => {
834
- const setPluginRef = React__namespace.useRef(setPlugin);
835
- React__namespace.useEffect(() => {
836
- setPluginRef.current(pluginId);
837
- }, []);
838
- return null;
839
- };
840
1138
  const LocalePicker = () => {
841
1139
  const { formatMessage } = reactIntl.useIntl();
842
- const [{ query }, setQuery] = strapiAdmin.useQueryParams();
1140
+ const [{ query: query2 }, setQuery] = strapiAdmin.useQueryParams();
843
1141
  const { hasI18n, canRead, canCreate } = useI18n();
844
1142
  const { data: locales = [] } = useGetLocalesQuery(void 0, {
845
1143
  skip: !hasI18n
@@ -849,25 +1147,25 @@ const LocalePicker = () => {
849
1147
  setQuery(
850
1148
  {
851
1149
  page: 1,
852
- plugins: { ...query.plugins, i18n: { locale: code } }
1150
+ plugins: { ...query2.plugins, i18n: { locale: code } }
853
1151
  },
854
1152
  "push",
855
1153
  replace
856
1154
  );
857
1155
  },
858
- [query.plugins, setQuery]
1156
+ [query2.plugins, setQuery]
859
1157
  );
860
1158
  React__namespace.useEffect(() => {
861
1159
  if (!Array.isArray(locales) || !hasI18n) {
862
1160
  return;
863
1161
  }
864
- const currentDesiredLocale = query.plugins?.i18n?.locale;
1162
+ const currentDesiredLocale = query2.plugins?.i18n?.locale;
865
1163
  const doesLocaleExist = locales.find((loc) => loc.code === currentDesiredLocale);
866
1164
  const defaultLocale = locales.find((locale) => locale.isDefault);
867
1165
  if (!doesLocaleExist && defaultLocale?.code) {
868
1166
  handleChange(defaultLocale.code, true);
869
1167
  }
870
- }, [hasI18n, handleChange, locales, query.plugins?.i18n?.locale]);
1168
+ }, [hasI18n, handleChange, locales, query2.plugins?.i18n?.locale]);
871
1169
  if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {
872
1170
  return null;
873
1171
  }
@@ -882,7 +1180,7 @@ const LocalePicker = () => {
882
1180
  id: getTranslation("actions.select-locale"),
883
1181
  defaultMessage: "Select locale"
884
1182
  }),
885
- value: query.plugins?.i18n?.locale || locales.find((locale) => locale.isDefault)?.code,
1183
+ value: query2.plugins?.i18n?.locale || locales.find((locale) => locale.isDefault)?.code,
886
1184
  onChange: handleChange,
887
1185
  children: displayedLocales.map((locale) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: locale.code, children: locale.name }, locale.id))
888
1186
  }
@@ -1000,54 +1298,13 @@ const LocaleListCell = ({
1000
1298
  return locale.name;
1001
1299
  }).toSorted((a, b) => formatter.compare(a, b));
1002
1300
  return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Popover.Root, { children: [
1003
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Popover.Trigger, { children: /* @__PURE__ */ jsxRuntime.jsx(Button, { type: "button", onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsxRuntime.jsxs(
1004
- ActionWrapper,
1005
- {
1006
- minWidth: "100%",
1007
- alignItems: "center",
1008
- justifyContent: "center",
1009
- height: "3.2rem",
1010
- width: "3.2rem",
1011
- children: [
1012
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", ellipsis: true, children: localesForDocument.join(", ") }),
1013
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { children: /* @__PURE__ */ jsxRuntime.jsx(icons.CaretDown, {}) })
1014
- ]
1015
- }
1016
- ) }) }),
1301
+ /* @__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: [
1302
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", ellipsis: true, marginRight: 2, children: localesForDocument.join(", ") }),
1303
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { children: /* @__PURE__ */ jsxRuntime.jsx(icons.CaretDown, { width: "1.2rem", height: "1.2rem" }) })
1304
+ ] }) }) }),
1017
1305
  /* @__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)) }) })
1018
1306
  ] });
1019
1307
  };
1020
- const Button = styledComponents.styled.button`
1021
- width: 100%;
1022
-
1023
- svg {
1024
- > g,
1025
- path {
1026
- fill: ${({ theme }) => theme.colors.neutral500};
1027
- }
1028
- }
1029
- &:hover {
1030
- svg {
1031
- > g,
1032
- path {
1033
- fill: ${({ theme }) => theme.colors.neutral600};
1034
- }
1035
- }
1036
- }
1037
- &:active {
1038
- svg {
1039
- > g,
1040
- path {
1041
- fill: ${({ theme }) => theme.colors.neutral400};
1042
- }
1043
- }
1044
- }
1045
- `;
1046
- const ActionWrapper = styledComponents.styled(designSystem.Flex)`
1047
- svg {
1048
- height: 0.4rem;
1049
- }
1050
- `;
1051
1308
  const addColumnToTableHook = ({ displayedHeaders, layout }) => {
1052
1309
  const { options } = layout;
1053
1310
  const isFieldLocalized = doesPluginOptionsHaveI18nLocalized(options) ? options.i18n.localized : false;
@@ -1076,18 +1333,11 @@ const addColumnToTableHook = ({ displayedHeaders, layout }) => {
1076
1333
  const addLocaleToReleasesHook = ({ displayedHeaders = [] }) => {
1077
1334
  return {
1078
1335
  displayedHeaders: [
1079
- // TODO: Fix when migrating to v5
1080
- // ...displayedHeaders,
1336
+ ...displayedHeaders,
1081
1337
  {
1082
- key: "__locale__",
1083
- fieldSchema: { type: "string" },
1084
- metadatas: {
1085
- label: {
1086
- id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1087
- defaultMessage: "locale"
1088
- },
1089
- searchable: false,
1090
- sortable: false
1338
+ label: {
1339
+ id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1340
+ defaultMessage: "locale"
1091
1341
  },
1092
1342
  name: "locale"
1093
1343
  }
@@ -1180,9 +1430,6 @@ const localeMiddleware = (ctx) => (next) => (permissions) => {
1180
1430
  return next(revisedPermissions);
1181
1431
  };
1182
1432
  const prefixPluginTranslations = (trad, pluginId2) => {
1183
- if (!pluginId2) {
1184
- throw new TypeError("pluginId can't be empty");
1185
- }
1186
1433
  return Object.keys(trad).reduce((acc, current) => {
1187
1434
  acc[`${pluginId2}.${current}`] = trad[current];
1188
1435
  return acc;
@@ -1235,8 +1482,6 @@ const index = {
1235
1482
  app.addRBACMiddleware([localeMiddleware]);
1236
1483
  app.registerPlugin({
1237
1484
  id: pluginId,
1238
- initializer: Initializer,
1239
- isReady: false,
1240
1485
  name: pluginId
1241
1486
  });
1242
1487
  },
@@ -1254,11 +1499,11 @@ const index = {
1254
1499
  },
1255
1500
  id: "internationalization",
1256
1501
  to: "internationalization",
1257
- Component: () => Promise.resolve().then(() => require("./SettingsPage-CxZ9qSb_.js")).then((mod) => ({ default: mod.ProtectedSettingsPage })),
1502
+ Component: () => Promise.resolve().then(() => require("./SettingsPage-BTgjb2KS.js")).then((mod) => ({ default: mod.ProtectedSettingsPage })),
1258
1503
  permissions: PERMISSIONS.accessMain
1259
1504
  });
1260
1505
  const contentManager = app.getPlugin("content-manager");
1261
- contentManager.apis.addDocumentHeaderAction([LocalePickerAction]);
1506
+ contentManager.apis.addDocumentHeaderAction([LocalePickerAction, FillFromAnotherLocaleAction]);
1262
1507
  contentManager.apis.addDocumentAction((actions) => {
1263
1508
  const indexOfDeleteAction = actions.findIndex((action) => action.type === "delete");
1264
1509
  actions.splice(indexOfDeleteAction, 0, DeleteLocaleAction);
@@ -1266,6 +1511,7 @@ const index = {
1266
1511
  });
1267
1512
  contentManager.apis.addDocumentAction((actions) => {
1268
1513
  actions.splice(2, 0, BulkLocalePublishAction);
1514
+ actions.splice(5, 0, BulkLocaleUnpublishAction);
1269
1515
  return actions;
1270
1516
  });
1271
1517
  contentManager.injectComponent("listView", "actions", {
@@ -1371,7 +1617,7 @@ const index = {
1371
1617
  async registerTrads({ locales }) {
1372
1618
  const importedTrads = await Promise.all(
1373
1619
  locales.map((locale) => {
1374
- 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-BsOU9o5z.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 }) => {
1620
+ 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-BKBz3tro.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`, 3).then(({ default: data }) => {
1375
1621
  return {
1376
1622
  data: prefixPluginTranslations(data, pluginId),
1377
1623
  locale
@@ -1395,4 +1641,4 @@ exports.useDeleteLocaleMutation = useDeleteLocaleMutation;
1395
1641
  exports.useGetDefaultLocalesQuery = useGetDefaultLocalesQuery;
1396
1642
  exports.useGetLocalesQuery = useGetLocalesQuery;
1397
1643
  exports.useUpdateLocaleMutation = useUpdateLocaleMutation;
1398
- //# sourceMappingURL=index-CLtneDAv.js.map
1644
+ //# sourceMappingURL=index-3yyF237r.js.map