@strapi/i18n 0.0.0-experimental.9df68962083938acba06546a7901c68a63266aec → 0.0.0-experimental.9f812af47f0e9db3d5531382c836c2ac0776afdf

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-B5sTcP82.mjs → SettingsPage-B6QDUmu9.mjs} +8 -8
  3. package/dist/_chunks/SettingsPage-B6QDUmu9.mjs.map +1 -0
  4. package/dist/_chunks/{SettingsPage-DT1sxWa2.js → SettingsPage-BsHtr3lV.js} +9 -10
  5. package/dist/_chunks/SettingsPage-BsHtr3lV.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-jMrzaEb9.js → index-3XgwXL6T.js} +444 -207
  11. package/dist/_chunks/index-3XgwXL6T.js.map +1 -0
  12. package/dist/_chunks/{index-DsNqyQKx.mjs → index-iEQ79W05.mjs} +439 -201
  13. package/dist/_chunks/index-iEQ79W05.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/components/LocaleListCell.d.ts +4 -4
  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 +418 -478
  23. package/dist/server/index.js.map +1 -1
  24. package/dist/server/index.mjs +419 -478
  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-B5sTcP82.mjs.map +0 -1
  43. package/dist/_chunks/SettingsPage-DT1sxWa2.js.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-DsNqyQKx.mjs.map +0 -1
  47. package/dist/_chunks/index-jMrzaEb9.js.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]);
604
+ }, [handleSelect, hasI18n, locales, currentDesiredLocale]);
605
+ const currentLocale = Array.isArray(locales) ? locales.find((locale) => locale.code === currentDesiredLocale) : void 0;
606
+ const allCurrentLocales = [
607
+ { status: getDocumentStatus(document, meta), locale: currentLocale?.code },
608
+ ...document?.localizations ?? []
609
+ ];
433
610
  if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {
434
611
  return null;
435
612
  }
436
- const currentLocale = query.plugins?.i18n?.locale || locales.find((loc) => loc.isDefault)?.code;
437
- const allCurrentLocales = [
438
- { status: getDocumentStatus(document, meta), locale: currentLocale },
439
- ...meta?.availableLocales ?? []
440
- ];
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,39 @@ const DeleteLocaleAction = ({
548
823
  }
549
824
  };
550
825
  };
551
- const BulkLocalePublishAction = ({
552
- document: baseDocument,
826
+ const BulkLocaleAction = ({
827
+ document,
553
828
  documentId,
554
829
  model,
555
- collectionType
830
+ collectionType,
831
+ action
556
832
  }) => {
557
- 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";
833
+ const locale = document?.locale ?? null;
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();
568
- const {
569
- document,
570
- meta: documentMeta,
571
- schema,
572
- validate
573
- } = strapiAdmin$1.unstable_useDocument({
574
- model,
575
- collectionType,
576
- documentId,
577
- params: {
578
- locale: baseLocale
843
+ const { publishMany: publishManyAction, unpublishMany: unpublishManyAction } = strapiAdmin$1.unstable_useDocumentActions();
844
+ const { schema, validate } = strapiAdmin$1.unstable_useDocument(
845
+ {
846
+ model,
847
+ collectionType,
848
+ documentId,
849
+ params: {
850
+ locale
851
+ }
852
+ },
853
+ {
854
+ // No need to fetch the document, the data is already available in the `document` prop
855
+ skip: true
579
856
  }
580
- });
581
- const { data: localesMetadata = [] } = useGetLocalesQuery();
857
+ );
858
+ const { data: localesMetadata = [] } = useGetLocalesQuery(hasI18n ? void 0 : query.skipToken);
582
859
  const headers = [
583
860
  {
584
861
  label: formatMessage({
@@ -603,18 +880,19 @@ const BulkLocalePublishAction = ({
603
880
  }
604
881
  ];
605
882
  const [rows, validationErrors] = React__namespace.useMemo(() => {
606
- if (!document || !documentMeta?.availableLocales) {
883
+ if (!document) {
607
884
  return [[], {}];
608
885
  }
609
- const rowsFromMeta = documentMeta?.availableLocales.map((doc) => {
610
- const { locale, status } = doc;
611
- return { locale, status };
886
+ const localizations = document.localizations ?? [];
887
+ const locales = localizations.map((doc) => {
888
+ const { locale: locale2, status } = doc;
889
+ return { locale: locale2, status };
612
890
  });
613
- rowsFromMeta.unshift({
891
+ locales.unshift({
614
892
  locale: document.locale,
615
893
  status: document.status
616
894
  });
617
- const allDocuments = [document, ...documentMeta?.availableLocales ?? []];
895
+ const allDocuments = [document, ...localizations];
618
896
  const errors = allDocuments.reduce((errs, document2) => {
619
897
  if (!document2) {
620
898
  return errs;
@@ -625,14 +903,21 @@ const BulkLocalePublishAction = ({
625
903
  }
626
904
  return errs;
627
905
  }, {});
628
- return [rowsFromMeta, errors];
629
- }, [document, documentMeta?.availableLocales, validate]);
630
- const localesToPublish = selectedRows.reduce((acc, selectedRow) => {
631
- if (selectedRow.status !== "published" && !Object.keys(validationErrors).includes(selectedRow.locale)) {
906
+ return [locales, errors];
907
+ }, [document, validate]);
908
+ const isBulkPublish = action === "bulk-publish";
909
+ const localesForAction = selectedRows.reduce((acc, selectedRow) => {
910
+ const isValidLocale = (
911
+ // Validation errors are irrelevant if we are trying to unpublish
912
+ !isBulkPublish || !Object.keys(validationErrors).includes(selectedRow.locale)
913
+ );
914
+ const shouldAddLocale = isBulkPublish ? selectedRow.status !== "published" && isValidLocale : selectedRow.status !== "draft" && isValidLocale;
915
+ if (shouldAddLocale) {
632
916
  acc.push(selectedRow.locale);
633
917
  }
634
918
  return acc;
635
919
  }, []);
920
+ const enableDraftRelationsCount = false;
636
921
  const {
637
922
  data: draftRelationsCount = 0,
638
923
  isLoading: isDraftRelationsLoading,
@@ -641,10 +926,10 @@ const BulkLocalePublishAction = ({
641
926
  {
642
927
  model,
643
928
  documentIds: [documentId],
644
- locale: localesToPublish
929
+ locale: localesForAction
645
930
  },
646
931
  {
647
- skip: !documentId || localesToPublish.length === 0
932
+ skip: !enableDraftRelationsCount
648
933
  }
649
934
  );
650
935
  React__namespace.useEffect(() => {
@@ -670,7 +955,18 @@ const BulkLocalePublishAction = ({
670
955
  documentIds: [documentId],
671
956
  params: {
672
957
  ...params,
673
- locale: localesToPublish
958
+ locale: localesForAction
959
+ }
960
+ });
961
+ setSelectedRows([]);
962
+ };
963
+ const unpublish = async () => {
964
+ await unpublishManyAction({
965
+ model,
966
+ documentIds: [documentId],
967
+ params: {
968
+ ...params,
969
+ locale: localesForAction
674
970
  }
675
971
  });
676
972
  setSelectedRows([]);
@@ -678,14 +974,12 @@ const BulkLocalePublishAction = ({
678
974
  const handleAction = async () => {
679
975
  if (draftRelationsCount > 0) {
680
976
  setIsDraftRelationConfirmationOpen(true);
681
- } else {
977
+ } else if (isBulkPublish) {
682
978
  await publish();
979
+ } else {
980
+ await unpublish();
683
981
  }
684
982
  };
685
- const isUnpublish = document?.status === "published";
686
- if (isUnpublish) {
687
- console.warn(["I18N"], "Bulk locale unpublish modal not implemented");
688
- }
689
983
  if (isDraftRelationConfirmationOpen) {
690
984
  return {
691
985
  label: formatMessage({
@@ -720,20 +1014,21 @@ const BulkLocalePublishAction = ({
720
1014
  }
721
1015
  };
722
1016
  }
1017
+ const hasPermission = selectedRows.map(({ locale: locale2 }) => locale2).every((locale2) => canPublish.includes(locale2));
723
1018
  return {
724
1019
  label: formatMessage({
725
- id: getTranslation("CMEditViewBulkLocale.publish-title"),
726
- defaultMessage: "Publish Multiple Locales"
1020
+ id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? "publish" : "unpublish"}-title`),
1021
+ defaultMessage: `${isBulkPublish ? "Publish" : "Unpublish"} Multiple Locales`
727
1022
  }),
728
- icon: /* @__PURE__ */ jsxRuntime.jsx(icons.ListPlus, {}),
729
- disabled: isPublishedTab || !canPublish,
1023
+ variant: isBulkPublish ? "secondary" : "danger",
1024
+ icon: isBulkPublish ? /* @__PURE__ */ jsxRuntime.jsx(icons.ListPlus, {}) : /* @__PURE__ */ jsxRuntime.jsx(icons.Cross, {}),
1025
+ disabled: isOnPublishedTab || canPublish.length === 0,
730
1026
  position: ["panel"],
731
- variant: "secondary",
732
1027
  dialog: {
733
1028
  type: "modal",
734
1029
  title: formatMessage({
735
- id: getTranslation("CMEditViewBulkLocale.publish-title"),
736
- defaultMessage: "Publish Multiple Locales"
1030
+ id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? "publish" : "unpublish"}-title`),
1031
+ defaultMessage: `${isBulkPublish ? "Publish" : "Unpublish"} Multiple Locales`
737
1032
  }),
738
1033
  content: () => {
739
1034
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -752,28 +1047,35 @@ const BulkLocalePublishAction = ({
752
1047
  validationErrors,
753
1048
  headers,
754
1049
  rows,
755
- localesMetadata
1050
+ localesMetadata,
1051
+ action: action ?? "bulk-publish"
756
1052
  }
757
1053
  )
758
1054
  }
759
1055
  );
760
1056
  },
761
- footer: () => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxRuntime.jsx(
1057
+ footer: () => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Footer, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxRuntime.jsx(
762
1058
  designSystem.Button,
763
1059
  {
764
1060
  loading: isDraftRelationsLoading,
765
- disabled: localesToPublish.length === 0,
1061
+ disabled: !hasPermission || localesForAction.length === 0,
766
1062
  variant: "default",
767
1063
  onClick: handleAction,
768
1064
  children: formatMessage({
769
- id: "app.utils.publish",
770
- defaultMessage: "Publish"
1065
+ id: isBulkPublish ? "app.utils.publish" : "app.utils.unpublish",
1066
+ defaultMessage: isBulkPublish ? "Publish" : "Unpublish"
771
1067
  })
772
1068
  }
773
1069
  ) })
774
1070
  }
775
1071
  };
776
1072
  };
1073
+ const BulkLocalePublishAction = (props) => {
1074
+ return BulkLocaleAction({ action: "bulk-publish", ...props });
1075
+ };
1076
+ const BulkLocaleUnpublishAction = (props) => {
1077
+ return BulkLocaleAction({ action: "bulk-unpublish", ...props });
1078
+ };
777
1079
  const StyledTrash = styledComponents.styled(icons.Trash)`
778
1080
  path {
779
1081
  fill: currentColor;
@@ -830,16 +1132,9 @@ const UnpublishModalAdditionalInfo = () => {
830
1132
  }
831
1133
  ) });
832
1134
  };
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
1135
  const LocalePicker = () => {
841
1136
  const { formatMessage } = reactIntl.useIntl();
842
- const [{ query }, setQuery] = strapiAdmin.useQueryParams();
1137
+ const [{ query: query2 }, setQuery] = strapiAdmin.useQueryParams();
843
1138
  const { hasI18n, canRead, canCreate } = useI18n();
844
1139
  const { data: locales = [] } = useGetLocalesQuery(void 0, {
845
1140
  skip: !hasI18n
@@ -849,25 +1144,25 @@ const LocalePicker = () => {
849
1144
  setQuery(
850
1145
  {
851
1146
  page: 1,
852
- plugins: { ...query.plugins, i18n: { locale: code } }
1147
+ plugins: { ...query2.plugins, i18n: { locale: code } }
853
1148
  },
854
1149
  "push",
855
1150
  replace
856
1151
  );
857
1152
  },
858
- [query.plugins, setQuery]
1153
+ [query2.plugins, setQuery]
859
1154
  );
860
1155
  React__namespace.useEffect(() => {
861
1156
  if (!Array.isArray(locales) || !hasI18n) {
862
1157
  return;
863
1158
  }
864
- const currentDesiredLocale = query.plugins?.i18n?.locale;
1159
+ const currentDesiredLocale = query2.plugins?.i18n?.locale;
865
1160
  const doesLocaleExist = locales.find((loc) => loc.code === currentDesiredLocale);
866
1161
  const defaultLocale = locales.find((locale) => locale.isDefault);
867
1162
  if (!doesLocaleExist && defaultLocale?.code) {
868
1163
  handleChange(defaultLocale.code, true);
869
1164
  }
870
- }, [hasI18n, handleChange, locales, query.plugins?.i18n?.locale]);
1165
+ }, [hasI18n, handleChange, locales, query2.plugins?.i18n?.locale]);
871
1166
  if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {
872
1167
  return null;
873
1168
  }
@@ -882,7 +1177,7 @@ const LocalePicker = () => {
882
1177
  id: getTranslation("actions.select-locale"),
883
1178
  defaultMessage: "Select locale"
884
1179
  }),
885
- value: query.plugins?.i18n?.locale || locales.find((locale) => locale.isDefault)?.code,
1180
+ value: query2.plugins?.i18n?.locale || locales.find((locale) => locale.isDefault)?.code,
886
1181
  onChange: handleChange,
887
1182
  children: displayedLocales.map((locale) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: locale.code, children: locale.name }, locale.id))
888
1183
  }
@@ -962,29 +1257,16 @@ const Span = styledComponents.styled(designSystem.Flex)`
962
1257
  }
963
1258
  }
964
1259
  `;
965
- const LocaleListCell = ({
966
- documentId,
967
- locale: currentLocale,
968
- collectionType,
969
- model
970
- }) => {
971
- const { meta, isLoading } = strapiAdmin$1.unstable_useDocument({
972
- documentId,
973
- collectionType,
974
- model,
975
- params: {
976
- locale: currentLocale
977
- }
978
- });
1260
+ const LocaleListCell = ({ locale: currentLocale, localizations }) => {
979
1261
  const { locale: language } = reactIntl.useIntl();
980
1262
  const { data: locales = [] } = useGetLocalesQuery();
981
1263
  const formatter = designSystem.useCollator(language, {
982
1264
  sensitivity: "base"
983
1265
  });
984
- if (!Array.isArray(locales) || isLoading) {
1266
+ if (!Array.isArray(locales) || !localizations) {
985
1267
  return null;
986
1268
  }
987
- const availableLocales = meta?.availableLocales.map((doc) => doc.locale) ?? [];
1269
+ const availableLocales = localizations.map((loc) => loc.locale);
988
1270
  const localesForDocument = locales.reduce((acc, locale) => {
989
1271
  const createdLocale = [currentLocale, ...availableLocales].find((loc) => {
990
1272
  return loc === locale.code;
@@ -1000,54 +1282,13 @@ const LocaleListCell = ({
1000
1282
  return locale.name;
1001
1283
  }).toSorted((a, b) => formatter.compare(a, b));
1002
1284
  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
- ) }) }),
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
+ ] }) }) }),
1017
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)) }) })
1018
1290
  ] });
1019
1291
  };
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
1292
  const addColumnToTableHook = ({ displayedHeaders, layout }) => {
1052
1293
  const { options } = layout;
1053
1294
  const isFieldLocalized = doesPluginOptionsHaveI18nLocalized(options) ? options.i18n.localized : false;
@@ -1173,9 +1414,6 @@ const localeMiddleware = (ctx) => (next) => (permissions) => {
1173
1414
  return next(revisedPermissions);
1174
1415
  };
1175
1416
  const prefixPluginTranslations = (trad, pluginId2) => {
1176
- if (!pluginId2) {
1177
- throw new TypeError("pluginId can't be empty");
1178
- }
1179
1417
  return Object.keys(trad).reduce((acc, current) => {
1180
1418
  acc[`${pluginId2}.${current}`] = trad[current];
1181
1419
  return acc;
@@ -1228,8 +1466,6 @@ const index = {
1228
1466
  app.addRBACMiddleware([localeMiddleware]);
1229
1467
  app.registerPlugin({
1230
1468
  id: pluginId,
1231
- initializer: Initializer,
1232
- isReady: false,
1233
1469
  name: pluginId
1234
1470
  });
1235
1471
  },
@@ -1247,11 +1483,11 @@ const index = {
1247
1483
  },
1248
1484
  id: "internationalization",
1249
1485
  to: "internationalization",
1250
- Component: () => Promise.resolve().then(() => require("./SettingsPage-DT1sxWa2.js")).then((mod) => ({ default: mod.ProtectedSettingsPage })),
1486
+ Component: () => Promise.resolve().then(() => require("./SettingsPage-BsHtr3lV.js")).then((mod) => ({ default: mod.ProtectedSettingsPage })),
1251
1487
  permissions: PERMISSIONS.accessMain
1252
1488
  });
1253
1489
  const contentManager = app.getPlugin("content-manager");
1254
- contentManager.apis.addDocumentHeaderAction([LocalePickerAction]);
1490
+ contentManager.apis.addDocumentHeaderAction([LocalePickerAction, FillFromAnotherLocaleAction]);
1255
1491
  contentManager.apis.addDocumentAction((actions) => {
1256
1492
  const indexOfDeleteAction = actions.findIndex((action) => action.type === "delete");
1257
1493
  actions.splice(indexOfDeleteAction, 0, DeleteLocaleAction);
@@ -1259,6 +1495,7 @@ const index = {
1259
1495
  });
1260
1496
  contentManager.apis.addDocumentAction((actions) => {
1261
1497
  actions.splice(2, 0, BulkLocalePublishAction);
1498
+ actions.splice(5, 0, BulkLocaleUnpublishAction);
1262
1499
  return actions;
1263
1500
  });
1264
1501
  contentManager.injectComponent("listView", "actions", {
@@ -1364,7 +1601,7 @@ const index = {
1364
1601
  async registerTrads({ locales }) {
1365
1602
  const importedTrads = await Promise.all(
1366
1603
  locales.map((locale) => {
1367
- 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 }) => {
1604
+ 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 }) => {
1368
1605
  return {
1369
1606
  data: prefixPluginTranslations(data, pluginId),
1370
1607
  locale
@@ -1388,4 +1625,4 @@ exports.useDeleteLocaleMutation = useDeleteLocaleMutation;
1388
1625
  exports.useGetDefaultLocalesQuery = useGetDefaultLocalesQuery;
1389
1626
  exports.useGetLocalesQuery = useGetLocalesQuery;
1390
1627
  exports.useUpdateLocaleMutation = useUpdateLocaleMutation;
1391
- //# sourceMappingURL=index-jMrzaEb9.js.map
1628
+ //# sourceMappingURL=index-3XgwXL6T.js.map