@strapi/i18n 0.0.0-experimental.dd3311938ac827f1fa8560c8840a9a394f5896c0 → 0.0.0-experimental.df298029ec6478763dcca7d59fafe8d2ae4ed60a

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 (56) hide show
  1. package/LICENSE +18 -3
  2. package/dist/_chunks/{SettingsPage-BWlXRGN7.mjs → SettingsPage-BHvunuIF.mjs} +95 -108
  3. package/dist/_chunks/SettingsPage-BHvunuIF.mjs.map +1 -0
  4. package/dist/_chunks/{SettingsPage-DjWupAff.js → SettingsPage-Bcj7380u.js} +93 -106
  5. package/dist/_chunks/SettingsPage-Bcj7380u.js.map +1 -0
  6. package/dist/_chunks/{en-Kv6y9zPQ.js → en-BKBz3tro.js} +12 -3
  7. package/dist/_chunks/en-BKBz3tro.js.map +1 -0
  8. package/dist/_chunks/{en-18tWw4P6.mjs → en-DlXfy6Gy.mjs} +12 -3
  9. package/dist/_chunks/en-DlXfy6Gy.mjs.map +1 -0
  10. package/dist/_chunks/{index-D--YX2ZY.js → index-BKZbxhpm.js} +453 -226
  11. package/dist/_chunks/index-BKZbxhpm.js.map +1 -0
  12. package/dist/_chunks/{index-DVTdCB4M.mjs → index-DUdrr5PR.mjs} +447 -220
  13. package/dist/_chunks/index-DUdrr5PR.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/EditLocale.d.ts +5 -4
  20. package/dist/admin/src/contentReleasesHooks/releaseDetailsView.d.ts +9 -5
  21. package/dist/admin/src/utils/clean.d.ts +4 -0
  22. package/dist/admin/src/utils/schemas.d.ts +1 -0
  23. package/dist/server/index.js +413 -480
  24. package/dist/server/index.js.map +1 -1
  25. package/dist/server/index.mjs +415 -482
  26. package/dist/server/index.mjs.map +1 -1
  27. package/dist/server/src/bootstrap.d.ts +1 -4
  28. package/dist/server/src/bootstrap.d.ts.map +1 -1
  29. package/dist/server/src/index.d.ts +21 -13
  30. package/dist/server/src/index.d.ts.map +1 -1
  31. package/dist/server/src/register.d.ts.map +1 -1
  32. package/dist/server/src/services/index.d.ts +20 -10
  33. package/dist/server/src/services/index.d.ts.map +1 -1
  34. package/dist/server/src/services/permissions/actions.d.ts +14 -2
  35. package/dist/server/src/services/permissions/actions.d.ts.map +1 -1
  36. package/dist/server/src/services/permissions.d.ts +14 -2
  37. package/dist/server/src/services/permissions.d.ts.map +1 -1
  38. package/dist/server/src/services/sanitize/index.d.ts +11 -0
  39. package/dist/server/src/services/sanitize/index.d.ts.map +1 -0
  40. package/dist/server/src/utils/index.d.ts +2 -2
  41. package/dist/server/src/utils/index.d.ts.map +1 -1
  42. package/package.json +10 -10
  43. package/dist/_chunks/SettingsPage-BWlXRGN7.mjs.map +0 -1
  44. package/dist/_chunks/SettingsPage-DjWupAff.js.map +0 -1
  45. package/dist/_chunks/en-18tWw4P6.mjs.map +0 -1
  46. package/dist/_chunks/en-Kv6y9zPQ.js.map +0 -1
  47. package/dist/_chunks/index-D--YX2ZY.js.map +0 -1
  48. package/dist/_chunks/index-DVTdCB4M.mjs.map +0 -1
  49. package/dist/admin/src/components/Initializer.d.ts +0 -5
  50. package/dist/server/src/migrations/content-type/disable/index.d.ts +0 -3
  51. package/dist/server/src/migrations/content-type/disable/index.d.ts.map +0 -1
  52. package/dist/server/src/migrations/content-type/enable/index.d.ts +0 -3
  53. package/dist/server/src/migrations/content-type/enable/index.d.ts.map +0 -1
  54. package/dist/server/src/services/entity-service-decorator.d.ts +0 -29
  55. package/dist/server/src/services/entity-service-decorator.d.ts.map +0 -1
  56. 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");
@@ -71,9 +72,7 @@ const CheckboxConfirmation = ({
71
72
  };
72
73
  const handleConfirm = () => {
73
74
  onChange({ target: { name, value: false, type: "checkbox" } });
74
- setIsOpen(false);
75
75
  };
76
- const handleToggle = () => setIsOpen((prev) => !prev);
77
76
  const label = intlLabel.id ? formatMessage(
78
77
  { id: intlLabel.id, defaultMessage: intlLabel.defaultMessage },
79
78
  { ...intlLabel.values }
@@ -82,35 +81,36 @@ const CheckboxConfirmation = ({
82
81
  { id: description.id, defaultMessage: description.defaultMessage },
83
82
  { ...description.values }
84
83
  ) : "";
85
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
84
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Root, { open: isOpen, onOpenChange: setIsOpen, children: [
86
85
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { hint, name, children: [
87
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Checkbox, { onValueChange: handleChange, value, type: "checkbox", children: label }),
86
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Checkbox, { onCheckedChange: handleChange, checked: value, children: label }),
88
87
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Hint, {})
89
88
  ] }),
90
- isOpen && /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog, { onClose: handleToggle, title: "Confirmation", isOpen, children: [
91
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.DialogBody, { icon: /* @__PURE__ */ jsxRuntime.jsx(icons.WarningCircle, {}), children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
92
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(TextAlignTypography, { id: "confirm-description", children: formatMessage({
89
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Content, { children: [
90
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Header, { children: formatMessage({
91
+ id: getTranslation("CheckboxConfirmation.Modal.title"),
92
+ defaultMessage: "Disable localization"
93
+ }) }),
94
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Body, { icon: /* @__PURE__ */ jsxRuntime.jsx(icons.WarningCircle, {}), children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
95
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(TextAlignTypography, { children: formatMessage({
93
96
  id: getTranslation("CheckboxConfirmation.Modal.content"),
94
97
  defaultMessage: "Disabling localization will engender the deletion of all your content but the one associated to your default locale (if existing)."
95
98
  }) }) }),
96
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontWeight: "semiBold", id: "confirm-description", children: formatMessage({
99
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontWeight: "semiBold", children: formatMessage({
97
100
  id: getTranslation("CheckboxConfirmation.Modal.body"),
98
101
  defaultMessage: "Do you want to disable it?"
99
102
  }) }) })
100
103
  ] }) }),
101
- /* @__PURE__ */ jsxRuntime.jsx(
102
- designSystem.DialogFooter,
103
- {
104
- startAction: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: handleToggle, variant: "tertiary", children: formatMessage({
105
- id: "components.popUpWarning.button.cancel",
106
- defaultMessage: "No, cancel"
107
- }) }),
108
- endAction: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { variant: "danger-light", onClick: handleConfirm, children: formatMessage({
109
- id: getTranslation("CheckboxConfirmation.Modal.button-confirm"),
110
- defaultMessage: "Yes, disable"
111
- }) })
112
- }
113
- )
104
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Footer, { children: [
105
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Cancel, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { variant: "tertiary", children: formatMessage({
106
+ id: "components.popUpWarning.button.cancel",
107
+ defaultMessage: "No, cancel"
108
+ }) }) }),
109
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Action, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { variant: "danger-light", onClick: handleConfirm, children: formatMessage({
110
+ id: getTranslation("CheckboxConfirmation.Modal.button-confirm"),
111
+ defaultMessage: "Yes, disable"
112
+ }) }) })
113
+ ] })
114
114
  ] })
115
115
  ] });
116
116
  };
@@ -161,7 +161,7 @@ const useI18n = () => {
161
161
  model: params.slug
162
162
  },
163
163
  {
164
- skip: !params.slug || !params.collectionType
164
+ skip: true
165
165
  }
166
166
  );
167
167
  if (doesPluginOptionsHaveI18nLocalized(schema?.pluginOptions)) {
@@ -241,10 +241,94 @@ const relationsApi = i18nApi.injectEndpoints({
241
241
  })
242
242
  });
243
243
  const { useGetManyDraftRelationCountQuery } = relationsApi;
244
+ const cleanData = (data, schema, components) => {
245
+ const cleanedData = removeFields(data, [
246
+ "createdAt",
247
+ "createdBy",
248
+ "updatedAt",
249
+ "updatedBy",
250
+ "id",
251
+ "documentId",
252
+ "publishedAt",
253
+ "strapi_stage",
254
+ "strapi_assignee",
255
+ "locale",
256
+ "status"
257
+ ]);
258
+ const cleanedDataWithoutPasswordAndRelation = recursiveRemoveFieldTypes(
259
+ cleanedData,
260
+ schema,
261
+ components,
262
+ ["relation", "password"]
263
+ );
264
+ return cleanedDataWithoutPasswordAndRelation;
265
+ };
266
+ const removeFields = (data, fields) => {
267
+ return Object.keys(data).reduce((acc, current) => {
268
+ if (fields.includes(current)) {
269
+ return acc;
270
+ }
271
+ acc[current] = data[current];
272
+ return acc;
273
+ }, {});
274
+ };
275
+ const recursiveRemoveFieldTypes = (data, schema, components, fields) => {
276
+ return Object.keys(data).reduce((acc, current) => {
277
+ const attribute = schema.attributes[current] ?? { type: void 0 };
278
+ if (fields.includes(attribute.type)) {
279
+ return acc;
280
+ }
281
+ if (attribute.type === "dynamiczone") {
282
+ acc[current] = data[current].map((componentValue, index2) => {
283
+ const { id: _, ...rest } = recursiveRemoveFieldTypes(
284
+ componentValue,
285
+ components[componentValue.__component],
286
+ components,
287
+ fields
288
+ );
289
+ return {
290
+ ...rest,
291
+ __temp_key__: index2 + 1
292
+ };
293
+ });
294
+ } else if (attribute.type === "component") {
295
+ const { repeatable, component } = attribute;
296
+ if (repeatable) {
297
+ acc[current] = (data[current] ?? []).map((compoData, index2) => {
298
+ const { id: _, ...rest } = recursiveRemoveFieldTypes(
299
+ compoData,
300
+ components[component],
301
+ components,
302
+ fields
303
+ );
304
+ return {
305
+ ...rest,
306
+ __temp_key__: index2 + 1
307
+ };
308
+ });
309
+ } else {
310
+ const { id: _, ...rest } = recursiveRemoveFieldTypes(
311
+ data[current] ?? {},
312
+ components[component],
313
+ components,
314
+ fields
315
+ );
316
+ acc[current] = rest;
317
+ }
318
+ } else {
319
+ acc[current] = data[current];
320
+ }
321
+ return acc;
322
+ }, {});
323
+ };
244
324
  const isErrorMessageDescriptor = (object) => {
245
325
  return typeof object === "object" && object !== null && "id" in object && "defaultMessage" in object;
246
326
  };
247
- const EntryValidationText = ({ status = "draft", validationErrors }) => {
327
+ const EntryValidationText = ({
328
+ status = "draft",
329
+ validationErrors,
330
+ action
331
+ }) => {
248
332
  const { formatMessage } = reactIntl.useIntl();
249
333
  const getErrorStr = (key, value) => {
250
334
  if (typeof value === "string") {
@@ -278,30 +362,63 @@ const EntryValidationText = ({ status = "draft", validationErrors }) => {
278
362
  ) })
279
363
  ] });
280
364
  }
281
- if (status === "published") {
282
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
283
- /* @__PURE__ */ jsxRuntime.jsx(icons.CheckCircle, { fill: "success600" }),
284
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
285
- id: "content-manager.bulk-publish.already-published",
286
- defaultMessage: "Already Published"
287
- }) })
288
- ] });
289
- }
290
- if (status === "modified") {
291
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
292
- /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowsCounterClockwise, { fill: "alternative600" }),
293
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: formatMessage({
294
- id: "app.utils.ready-to-publish-changes",
295
- defaultMessage: "Ready to publish changes"
296
- }) })
297
- ] });
298
- }
365
+ const getStatusMessage = () => {
366
+ if (action === "bulk-publish") {
367
+ if (status === "published") {
368
+ return {
369
+ icon: /* @__PURE__ */ jsxRuntime.jsx(icons.CheckCircle, { fill: "success600" }),
370
+ text: formatMessage({
371
+ id: "content-manager.bulk-publish.already-published",
372
+ defaultMessage: "Already Published"
373
+ }),
374
+ textColor: "success600",
375
+ fontWeight: "bold"
376
+ };
377
+ } else if (status === "modified") {
378
+ return {
379
+ icon: /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowsCounterClockwise, { fill: "alternative600" }),
380
+ text: formatMessage({
381
+ id: "app.utils.ready-to-publish-changes",
382
+ defaultMessage: "Ready to publish changes"
383
+ })
384
+ };
385
+ } else {
386
+ return {
387
+ icon: /* @__PURE__ */ jsxRuntime.jsx(icons.CheckCircle, { fill: "success600" }),
388
+ text: formatMessage({
389
+ id: "app.utils.ready-to-publish",
390
+ defaultMessage: "Ready to publish"
391
+ })
392
+ };
393
+ }
394
+ } else {
395
+ if (status === "draft") {
396
+ return {
397
+ icon: /* @__PURE__ */ jsxRuntime.jsx(icons.CheckCircle, { fill: "success600" }),
398
+ text: formatMessage({
399
+ id: "content-manager.bulk-unpublish.already-unpublished",
400
+ defaultMessage: "Already Unpublished"
401
+ }),
402
+ textColor: "success600",
403
+ fontWeight: "bold"
404
+ };
405
+ } else {
406
+ return {
407
+ icon: /* @__PURE__ */ jsxRuntime.jsx(icons.CheckCircle, { fill: "success600" }),
408
+ text: formatMessage({
409
+ id: "app.utils.ready-to-unpublish-changes",
410
+ defaultMessage: "Ready to unpublish"
411
+ }),
412
+ textColor: "success600",
413
+ fontWeight: "bold"
414
+ };
415
+ }
416
+ }
417
+ };
418
+ const { icon, text, textColor = "success600", fontWeight = "normal" } = getStatusMessage();
299
419
  return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
300
- /* @__PURE__ */ jsxRuntime.jsx(icons.CheckCircle, { fill: "success600" }),
301
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: formatMessage({
302
- id: "app.utils.ready-to-publish",
303
- defaultMessage: "Ready to publish"
304
- }) })
420
+ icon,
421
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor, fontWeight, children: text })
305
422
  ] });
306
423
  };
307
424
  const BoldChunk = (chunks) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontWeight: "bold", children: chunks });
@@ -309,7 +426,8 @@ const BulkLocaleActionModal = ({
309
426
  headers,
310
427
  rows,
311
428
  localesMetadata,
312
- validationErrors = {}
429
+ validationErrors = {},
430
+ action
313
431
  }) => {
314
432
  const { formatMessage } = reactIntl.useIntl();
315
433
  const selectedRows = strapiAdmin.useTable(
@@ -322,27 +440,29 @@ const BulkLocaleActionModal = ({
322
440
  return acc;
323
441
  }, {});
324
442
  const localesWithErrors = Object.keys(validationErrors);
325
- const alreadyPublishedCount = selectedRows.filter(
443
+ const publishedCount = selectedRows.filter(
326
444
  ({ locale }) => currentStatusByLocale[locale] === "published"
327
445
  ).length;
328
- const readyToPublishCount = selectedRows.filter(
446
+ const draftCount = selectedRows.filter(
329
447
  ({ locale }) => (currentStatusByLocale[locale] === "draft" || currentStatusByLocale[locale] === "modified") && !localesWithErrors.includes(locale)
330
448
  ).length;
331
449
  const withErrorsCount = localesWithErrors.length;
450
+ const messageId = action === "bulk-publish" ? "content-manager.containers.list.selectedEntriesModal.selectedCount.publish" : "content-manager.containers.list.selectedEntriesModal.selectedCount.unpublish";
451
+ const defaultMessage = action === "bulk-publish" ? "<b>{publishedCount}</b> {publishedCount, plural, =0 {entries} one {entry} other {entries}} already published. <b>{draftCount}</b> {draftCount, plural, =0 {entries} one {entry} other {entries}} ready to publish. <b>{withErrorsCount}</b> {withErrorsCount, plural, =0 {entries} one {entry} other {entries}} waiting for action." : "<b>{draftCount}</b> {draftCount, plural, =0 {entries} one {entry} other {entries}} already unpublished. <b>{publishedCount}</b> {publishedCount, plural, =0 {entries} one {entry} other {entries}} ready to unpublish.";
332
452
  return formatMessage(
333
453
  {
334
- id: "content-manager.containers.list.selectedEntriesModal.selectedCount",
335
- defaultMessage: "<b>{alreadyPublishedCount}</b> {alreadyPublishedCount, plural, =0 {entries} one {entry} other {entries}} already published. <b>{readyToPublishCount}</b> {readyToPublishCount, plural, =0 {entries} one {entry} other {entries}} ready to publish. <b>{withErrorsCount}</b> {withErrorsCount, plural, =0 {entries} one {entry} other {entries}} waiting for action."
454
+ id: messageId,
455
+ defaultMessage
336
456
  },
337
457
  {
338
458
  withErrorsCount,
339
- readyToPublishCount,
340
- alreadyPublishedCount,
459
+ draftCount,
460
+ publishedCount,
341
461
  b: BoldChunk
342
462
  }
343
463
  );
344
464
  };
345
- return /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
465
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Modal.Body, { children: [
346
466
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: getFormattedCountMessage() }),
347
467
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { marginTop: 5, children: /* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Table.Content, { children: [
348
468
  /* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Table.Head, { children: [
@@ -369,7 +489,7 @@ const BulkLocaleActionModal = ({
369
489
  children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { tag: "span", variant: "pi", fontWeight: "bold", children: capitalize(status) })
370
490
  }
371
491
  ) }) }),
372
- /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(EntryValidationText, { validationErrors: error, status }) }),
492
+ /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(EntryValidationText, { validationErrors: error, status, action }) }),
373
493
  /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(
374
494
  designSystem.IconButton,
375
495
  {
@@ -386,7 +506,7 @@ const BulkLocaleActionModal = ({
386
506
  name: locale
387
507
  }
388
508
  ),
389
- borderWidth: 0,
509
+ variant: "ghost",
390
510
  children: /* @__PURE__ */ jsxRuntime.jsx(icons.Pencil, {})
391
511
  }
392
512
  ) })
@@ -395,6 +515,48 @@ const BulkLocaleActionModal = ({
395
515
  ] }) })
396
516
  ] });
397
517
  };
518
+ const statusVariants = {
519
+ draft: "secondary",
520
+ published: "success",
521
+ modified: "alternative"
522
+ };
523
+ const LocaleOption = ({
524
+ isDraftAndPublishEnabled,
525
+ locale,
526
+ status,
527
+ entryExists
528
+ }) => {
529
+ const { formatMessage } = reactIntl.useIntl();
530
+ if (!entryExists) {
531
+ return formatMessage(
532
+ {
533
+ id: getTranslation("CMEditViewLocalePicker.locale.create"),
534
+ defaultMessage: "Create <bold>{locale}</bold> locale"
535
+ },
536
+ {
537
+ bold: (locale2) => /* @__PURE__ */ jsxRuntime.jsx("b", { children: locale2 }),
538
+ locale: locale.name
539
+ }
540
+ );
541
+ }
542
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { width: "100%", gap: 1, justifyContent: "space-between", children: [
543
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: locale.name }),
544
+ isDraftAndPublishEnabled ? /* @__PURE__ */ jsxRuntime.jsx(
545
+ designSystem.Status,
546
+ {
547
+ display: "flex",
548
+ paddingLeft: "6px",
549
+ paddingRight: "6px",
550
+ paddingTop: "2px",
551
+ paddingBottom: "2px",
552
+ showBullet: false,
553
+ size: "S",
554
+ variant: statusVariants[status],
555
+ children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { tag: "span", variant: "pi", fontWeight: "bold", children: capitalize(status) })
556
+ }
557
+ ) : null
558
+ ] });
559
+ };
398
560
  const LocalePickerAction = ({
399
561
  document,
400
562
  meta,
@@ -403,74 +565,74 @@ const LocalePickerAction = ({
403
565
  documentId
404
566
  }) => {
405
567
  const { formatMessage } = reactIntl.useIntl();
406
- const [{ query }, setQuery] = strapiAdmin.useQueryParams();
568
+ const [{ query: query2 }, setQuery] = strapiAdmin.useQueryParams();
407
569
  const { hasI18n, canCreate, canRead } = useI18n();
408
570
  const { data: locales = [] } = useGetLocalesQuery();
409
- const { schema } = strapiAdmin$1.unstable_useDocument({ model, collectionType, documentId });
571
+ const currentDesiredLocale = query2.plugins?.i18n?.locale;
572
+ const { schema } = strapiAdmin$1.unstable_useDocument({
573
+ model,
574
+ collectionType,
575
+ documentId,
576
+ params: { locale: currentDesiredLocale }
577
+ });
410
578
  const handleSelect = React__namespace.useCallback(
411
579
  (value) => {
412
580
  setQuery({
413
581
  plugins: {
414
- ...query.plugins,
582
+ ...query2.plugins,
415
583
  i18n: {
416
584
  locale: value
417
585
  }
418
586
  }
419
587
  });
420
588
  },
421
- [query.plugins, setQuery]
589
+ [query2.plugins, setQuery]
422
590
  );
423
591
  React__namespace.useEffect(() => {
424
592
  if (!Array.isArray(locales) || !hasI18n) {
425
593
  return;
426
594
  }
427
- const currentDesiredLocale = query.plugins?.i18n?.locale;
428
595
  const doesLocaleExist = locales.find((loc) => loc.code === currentDesiredLocale);
429
596
  const defaultLocale = locales.find((locale) => locale.isDefault);
430
597
  if (!doesLocaleExist && defaultLocale?.code) {
431
598
  handleSelect(defaultLocale.code);
432
599
  }
433
- }, [handleSelect, hasI18n, locales, query.plugins?.i18n?.locale]);
434
- if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {
435
- return null;
436
- }
437
- const currentLocale = query.plugins?.i18n?.locale || locales.find((loc) => loc.isDefault)?.code;
600
+ }, [handleSelect, hasI18n, locales, currentDesiredLocale]);
601
+ const currentLocale = Array.isArray(locales) ? locales.find((locale) => locale.code === currentDesiredLocale) : void 0;
438
602
  const allCurrentLocales = [
439
- { status: getDocumentStatus(document, meta), locale: currentLocale },
603
+ { status: getDocumentStatus(document, meta), locale: currentLocale?.code },
440
604
  ...meta?.availableLocales ?? []
441
605
  ];
606
+ if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {
607
+ return null;
608
+ }
442
609
  return {
443
610
  label: formatMessage({
444
611
  id: getTranslation("Settings.locales.modal.locales.label"),
445
612
  defaultMessage: "Locales"
446
613
  }),
447
614
  options: locales.map((locale) => {
615
+ const entryWithLocaleExists = allCurrentLocales.some((doc) => doc.locale === locale.code);
448
616
  const currentLocaleDoc = allCurrentLocales.find(
449
617
  (doc) => "locale" in doc ? doc.locale === locale.code : false
450
618
  );
451
- const status = currentLocaleDoc?.status ?? "draft";
452
- const permissionsToCheck = currentLocaleDoc ? canCreate : canRead;
453
- const statusVariant = status === "draft" ? "primary" : status === "published" ? "success" : "alternative";
619
+ const permissionsToCheck = currentLocaleDoc ? canRead : canCreate;
454
620
  return {
455
621
  disabled: !permissionsToCheck.includes(locale.code),
456
622
  value: locale.code,
457
- label: locale.name,
458
- startIcon: schema?.options?.draftAndPublish ? /* @__PURE__ */ jsxRuntime.jsx(
459
- designSystem.Status,
623
+ label: /* @__PURE__ */ jsxRuntime.jsx(
624
+ LocaleOption,
460
625
  {
461
- display: "flex",
462
- paddingLeft: "6px",
463
- paddingRight: "6px",
464
- paddingTop: "2px",
465
- paddingBottom: "2px",
466
- showBullet: false,
467
- size: "S",
468
- variant: statusVariant,
469
- children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { tag: "span", variant: "pi", fontWeight: "bold", children: capitalize(status) })
626
+ isDraftAndPublishEnabled: !!schema?.options?.draftAndPublish,
627
+ locale,
628
+ status: currentLocaleDoc?.status,
629
+ entryExists: entryWithLocaleExists
470
630
  }
471
- ) : null
631
+ ),
632
+ startIcon: !entryWithLocaleExists ? /* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}) : null
472
633
  };
473
634
  }),
635
+ customizeContent: () => currentLocale?.name,
474
636
  onSelect: handleSelect,
475
637
  value: currentLocale
476
638
  };
@@ -486,6 +648,99 @@ const getDocumentStatus = (document, meta) => {
486
648
  }
487
649
  return docStatus;
488
650
  };
651
+ const FillFromAnotherLocaleAction = ({
652
+ documentId,
653
+ meta,
654
+ model,
655
+ collectionType
656
+ }) => {
657
+ const { formatMessage } = reactIntl.useIntl();
658
+ const [{ query: query2 }] = strapiAdmin.useQueryParams();
659
+ const { hasI18n } = useI18n();
660
+ const currentDesiredLocale = query2.plugins?.i18n?.locale;
661
+ const [localeSelected, setLocaleSelected] = React__namespace.useState(null);
662
+ const setValues = strapiAdmin.useForm("FillFromAnotherLocale", (state) => state.setValues);
663
+ const { getDocument } = strapiAdmin$1.unstable_useDocumentActions();
664
+ const { schema, components } = strapiAdmin$1.unstable_useDocument({
665
+ model,
666
+ documentId,
667
+ collectionType,
668
+ params: { locale: currentDesiredLocale }
669
+ });
670
+ const { data: locales = [] } = useGetLocalesQuery();
671
+ const availableLocales = Array.isArray(locales) ? locales.filter((locale) => meta?.availableLocales.some((l) => l.locale === locale.code)) : [];
672
+ const fillFromLocale = (onClose) => async () => {
673
+ const response = await getDocument({
674
+ collectionType,
675
+ model,
676
+ documentId,
677
+ params: { locale: localeSelected }
678
+ });
679
+ if (!response || !schema) {
680
+ return;
681
+ }
682
+ const { data } = response;
683
+ const cleanedData = cleanData(data, schema, components);
684
+ setValues(cleanedData);
685
+ onClose();
686
+ };
687
+ if (!hasI18n) {
688
+ return null;
689
+ }
690
+ return {
691
+ type: "icon",
692
+ icon: /* @__PURE__ */ jsxRuntime.jsx(icons.Download, {}),
693
+ disabled: availableLocales.length === 0,
694
+ label: formatMessage({
695
+ id: getTranslation("CMEditViewCopyLocale.copy-text"),
696
+ defaultMessage: "Fill in from another locale"
697
+ }),
698
+ dialog: {
699
+ type: "dialog",
700
+ title: formatMessage({
701
+ id: getTranslation("CMEditViewCopyLocale.dialog.title"),
702
+ defaultMessage: "Confirmation"
703
+ }),
704
+ content: ({ onClose }) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
705
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Body, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 3, children: [
706
+ /* @__PURE__ */ jsxRuntime.jsx(icons.WarningCircle, { width: "24px", height: "24px", fill: "danger600" }),
707
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textAlign: "center", children: formatMessage({
708
+ id: getTranslation("CMEditViewCopyLocale.dialog.body"),
709
+ defaultMessage: "Your current content will be erased and filled by the content of the selected locale:"
710
+ }) }),
711
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { width: "100%", children: [
712
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
713
+ id: getTranslation("CMEditViewCopyLocale.dialog.field.label"),
714
+ defaultMessage: "Locale"
715
+ }) }),
716
+ /* @__PURE__ */ jsxRuntime.jsx(
717
+ designSystem.SingleSelect,
718
+ {
719
+ value: localeSelected,
720
+ placeholder: formatMessage({
721
+ id: getTranslation("CMEditViewCopyLocale.dialog.field.placeholder"),
722
+ defaultMessage: "Select one locale..."
723
+ }),
724
+ onChange: (value) => setLocaleSelected(value),
725
+ children: availableLocales.map((locale) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: locale.code, children: locale.name }, locale.code))
726
+ }
727
+ )
728
+ ] })
729
+ ] }) }),
730
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, width: "100%", children: [
731
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { flex: "auto", variant: "tertiary", onClick: onClose, children: formatMessage({
732
+ id: getTranslation("CMEditViewCopyLocale.cancel-text"),
733
+ defaultMessage: "No, cancel"
734
+ }) }),
735
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { flex: "auto", variant: "success", onClick: fillFromLocale(onClose), children: formatMessage({
736
+ id: getTranslation("CMEditViewCopyLocale.submit-text"),
737
+ defaultMessage: "Yes, fill in"
738
+ }) })
739
+ ] }) })
740
+ ] })
741
+ }
742
+ };
743
+ };
489
744
  const DeleteLocaleAction = ({
490
745
  document,
491
746
  documentId,
@@ -497,16 +752,23 @@ const DeleteLocaleAction = ({
497
752
  const { toggleNotification } = strapiAdmin.useNotification();
498
753
  const { delete: deleteAction } = strapiAdmin$1.unstable_useDocumentActions();
499
754
  const { hasI18n, canDelete } = useI18n();
755
+ const [{ query: query2 }] = strapiAdmin.useQueryParams();
756
+ const { data: locales = [] } = useGetLocalesQuery();
757
+ const currentDesiredLocale = query2.plugins?.i18n?.locale;
758
+ const locale = !("error" in locales) && locales.find((loc) => loc.code === currentDesiredLocale);
500
759
  if (!hasI18n) {
501
760
  return null;
502
761
  }
503
762
  return {
504
763
  disabled: document?.locale && !canDelete.includes(document.locale) || !document || !document.id,
505
764
  position: ["header", "table-row"],
506
- label: formatMessage({
507
- id: getTranslation("actions.delete.label"),
508
- defaultMessage: "Delete locale"
509
- }),
765
+ label: formatMessage(
766
+ {
767
+ id: getTranslation("actions.delete.label"),
768
+ defaultMessage: "Delete entry ({locale})"
769
+ },
770
+ { locale: locale && locale.name }
771
+ ),
510
772
  icon: /* @__PURE__ */ jsxRuntime.jsx(StyledTrash, {}),
511
773
  variant: "danger",
512
774
  dialog: {
@@ -523,7 +785,12 @@ const DeleteLocaleAction = ({
523
785
  }) })
524
786
  ] }),
525
787
  onConfirm: async () => {
526
- if (!documentId || !document?.locale) {
788
+ const unableToDelete = (
789
+ // We are unable to delete a collection type without a document ID
790
+ // & unable to delete generally if there is no document locale
791
+ collectionType !== "single-types" && !documentId || !document?.locale
792
+ );
793
+ if (unableToDelete) {
527
794
  console.error(
528
795
  "You're trying to delete a document without an id or locale, this is likely a bug with Strapi. Please open an issue."
529
796
  );
@@ -549,37 +816,43 @@ const DeleteLocaleAction = ({
549
816
  }
550
817
  };
551
818
  };
552
- const BulkLocalePublishAction = ({
819
+ const BulkLocaleAction = ({
553
820
  document: baseDocument,
554
821
  documentId,
555
822
  model,
556
- collectionType
823
+ collectionType,
824
+ action
557
825
  }) => {
558
826
  const baseLocale = baseDocument?.locale ?? null;
559
- const [{ query }] = strapiAdmin.useQueryParams();
560
- const params = React__namespace.useMemo(() => strapiAdmin$1.buildValidParams(query), [query]);
561
- const isPublishedTab = query.status === "published";
827
+ const [{ query: query$1 }] = strapiAdmin.useQueryParams();
828
+ const params = React__namespace.useMemo(() => strapiAdmin$1.buildValidParams(query$1), [query$1]);
829
+ const isOnPublishedTab = query$1.status === "published";
562
830
  const { formatMessage } = reactIntl.useIntl();
563
831
  const { hasI18n, canPublish } = useI18n();
564
832
  const { toggleNotification } = strapiAdmin.useNotification();
565
833
  const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler();
566
834
  const [selectedRows, setSelectedRows] = React__namespace.useState([]);
567
- const [isConfirmationOpen, setIsConfirmationOpen] = React__namespace.useState(false);
568
- const { publishMany: publishManyAction } = strapiAdmin$1.unstable_useDocumentActions();
835
+ const [isDraftRelationConfirmationOpen, setIsDraftRelationConfirmationOpen] = React__namespace.useState(false);
836
+ const { publishMany: publishManyAction, unpublishMany: unpublishManyAction } = strapiAdmin$1.unstable_useDocumentActions();
569
837
  const {
570
838
  document,
571
839
  meta: documentMeta,
572
840
  schema,
573
841
  validate
574
- } = strapiAdmin$1.unstable_useDocument({
575
- model,
576
- collectionType,
577
- documentId,
578
- params: {
579
- locale: baseLocale
842
+ } = strapiAdmin$1.unstable_useDocument(
843
+ {
844
+ model,
845
+ collectionType,
846
+ documentId,
847
+ params: {
848
+ locale: baseLocale
849
+ }
850
+ },
851
+ {
852
+ skip: !hasI18n || !baseLocale
580
853
  }
581
- });
582
- const { data: localesMetadata = [] } = useGetLocalesQuery();
854
+ );
855
+ const { data: localesMetadata = [] } = useGetLocalesQuery(hasI18n ? void 0 : query.skipToken);
583
856
  const headers = [
584
857
  {
585
858
  label: formatMessage({
@@ -628,12 +901,19 @@ const BulkLocalePublishAction = ({
628
901
  }, {});
629
902
  return [rowsFromMeta, errors];
630
903
  }, [document, documentMeta?.availableLocales, validate]);
631
- const localesToPublish = selectedRows.reduce((acc, selectedRow) => {
632
- if (selectedRow.status !== "published" && !Object.keys(validationErrors).includes(selectedRow.locale)) {
904
+ const isBulkPublish = action === "bulk-publish";
905
+ const localesForAction = selectedRows.reduce((acc, selectedRow) => {
906
+ const isValidLocale = (
907
+ // Validation errors are irrelevant if we are trying to unpublish
908
+ !isBulkPublish || !Object.keys(validationErrors).includes(selectedRow.locale)
909
+ );
910
+ const shouldAddLocale = isBulkPublish ? selectedRow.status !== "published" && isValidLocale : selectedRow.status !== "draft" && isValidLocale;
911
+ if (shouldAddLocale) {
633
912
  acc.push(selectedRow.locale);
634
913
  }
635
914
  return acc;
636
915
  }, []);
916
+ const enableDraftRelationsCount = false;
637
917
  const {
638
918
  data: draftRelationsCount = 0,
639
919
  isLoading: isDraftRelationsLoading,
@@ -642,10 +922,10 @@ const BulkLocalePublishAction = ({
642
922
  {
643
923
  model,
644
924
  documentIds: [documentId],
645
- locale: localesToPublish
925
+ locale: localesForAction
646
926
  },
647
927
  {
648
- skip: !documentId || localesToPublish.length === 0
928
+ skip: !enableDraftRelationsCount
649
929
  }
650
930
  );
651
931
  React__namespace.useEffect(() => {
@@ -671,23 +951,32 @@ const BulkLocalePublishAction = ({
671
951
  documentIds: [documentId],
672
952
  params: {
673
953
  ...params,
674
- locale: localesToPublish
954
+ locale: localesForAction
955
+ }
956
+ });
957
+ setSelectedRows([]);
958
+ };
959
+ const unpublish = async () => {
960
+ await unpublishManyAction({
961
+ model,
962
+ documentIds: [documentId],
963
+ params: {
964
+ ...params,
965
+ locale: localesForAction
675
966
  }
676
967
  });
677
968
  setSelectedRows([]);
678
969
  };
679
970
  const handleAction = async () => {
680
971
  if (draftRelationsCount > 0) {
681
- setIsConfirmationOpen(true);
682
- } else {
972
+ setIsDraftRelationConfirmationOpen(true);
973
+ } else if (isBulkPublish) {
683
974
  await publish();
975
+ } else {
976
+ await unpublish();
684
977
  }
685
978
  };
686
- const isUnpublish = document?.status === "published";
687
- if (isUnpublish) {
688
- console.warn(["I18N"], "Bulk locale unpublish modal not implemented");
689
- }
690
- if (isConfirmationOpen) {
979
+ if (isDraftRelationConfirmationOpen) {
691
980
  return {
692
981
  label: formatMessage({
693
982
  id: "app.components.ConfirmDialog.title",
@@ -696,11 +985,11 @@ const BulkLocalePublishAction = ({
696
985
  variant: "danger",
697
986
  dialog: {
698
987
  onCancel: () => {
699
- setIsConfirmationOpen(false);
988
+ setIsDraftRelationConfirmationOpen(false);
700
989
  },
701
990
  onConfirm: async () => {
702
991
  await publish();
703
- setIsConfirmationOpen(false);
992
+ setIsDraftRelationConfirmationOpen(false);
704
993
  },
705
994
  type: "dialog",
706
995
  title: formatMessage({
@@ -710,27 +999,32 @@ const BulkLocalePublishAction = ({
710
999
  content: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "center", gap: 2, children: [
711
1000
  /* @__PURE__ */ jsxRuntime.jsx(icons.WarningCircle, { width: "2.4rem", height: "2.4rem", fill: "danger600" }),
712
1001
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textAlign: "center", children: formatMessage({
713
- id: "content-manager.actions.discard.dialog.body",
714
- defaultMessage: "Are you sure you want to discard the changes? This action is irreversible."
1002
+ id: getTranslation("CMEditViewBulkLocale.draft-relation-warning"),
1003
+ defaultMessage: "Some locales are related to draft entries. Publishing them could leave broken links in your app."
1004
+ }) }),
1005
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textAlign: "center", children: formatMessage({
1006
+ id: getTranslation("CMEditViewBulkLocale.continue-confirmation"),
1007
+ defaultMessage: "Are you sure you want to continue?"
715
1008
  }) })
716
1009
  ] })
717
1010
  }
718
1011
  };
719
1012
  }
1013
+ const hasPermission = selectedRows.map(({ locale }) => locale).every((locale) => canPublish.includes(locale));
720
1014
  return {
721
1015
  label: formatMessage({
722
- id: getTranslation("CMEditViewBulkLocale.publish-title"),
723
- defaultMessage: "Publish Multiple Locales"
1016
+ id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? "publish" : "unpublish"}-title`),
1017
+ defaultMessage: `${isBulkPublish ? "Publish" : "Unpublish"} Multiple Locales`
724
1018
  }),
725
- icon: /* @__PURE__ */ jsxRuntime.jsx(icons.ListPlus, {}),
726
- disabled: isPublishedTab || !canPublish,
1019
+ variant: isBulkPublish ? "secondary" : "danger",
1020
+ icon: isBulkPublish ? /* @__PURE__ */ jsxRuntime.jsx(icons.ListPlus, {}) : /* @__PURE__ */ jsxRuntime.jsx(icons.Cross, {}),
1021
+ disabled: isOnPublishedTab || canPublish.length === 0,
727
1022
  position: ["panel"],
728
- variant: "secondary",
729
1023
  dialog: {
730
1024
  type: "modal",
731
1025
  title: formatMessage({
732
- id: getTranslation("CMEditViewBulkLocale.publish-title"),
733
- defaultMessage: "Publish Multiple Locales"
1026
+ id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? "publish" : "unpublish"}-title`),
1027
+ defaultMessage: `${isBulkPublish ? "Publish" : "Unpublish"} Multiple Locales`
734
1028
  }),
735
1029
  content: () => {
736
1030
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -749,28 +1043,35 @@ const BulkLocalePublishAction = ({
749
1043
  validationErrors,
750
1044
  headers,
751
1045
  rows,
752
- localesMetadata
1046
+ localesMetadata,
1047
+ action: action ?? "bulk-publish"
753
1048
  }
754
1049
  )
755
1050
  }
756
1051
  );
757
1052
  },
758
- footer: () => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxRuntime.jsx(
1053
+ footer: () => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Footer, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxRuntime.jsx(
759
1054
  designSystem.Button,
760
1055
  {
761
1056
  loading: isDraftRelationsLoading,
762
- disabled: localesToPublish.length === 0,
1057
+ disabled: !hasPermission || localesForAction.length === 0,
763
1058
  variant: "default",
764
1059
  onClick: handleAction,
765
1060
  children: formatMessage({
766
- id: "app.utils.publish",
767
- defaultMessage: "Publish"
1061
+ id: isBulkPublish ? "app.utils.publish" : "app.utils.unpublish",
1062
+ defaultMessage: isBulkPublish ? "Publish" : "Unpublish"
768
1063
  })
769
1064
  }
770
1065
  ) })
771
1066
  }
772
1067
  };
773
1068
  };
1069
+ const BulkLocalePublishAction = (props) => {
1070
+ return BulkLocaleAction({ action: "bulk-publish", ...props });
1071
+ };
1072
+ const BulkLocaleUnpublishAction = (props) => {
1073
+ return BulkLocaleAction({ action: "bulk-unpublish", ...props });
1074
+ };
774
1075
  const StyledTrash = styledComponents.styled(icons.Trash)`
775
1076
  path {
776
1077
  fill: currentColor;
@@ -827,16 +1128,9 @@ const UnpublishModalAdditionalInfo = () => {
827
1128
  }
828
1129
  ) });
829
1130
  };
830
- const Initializer = ({ setPlugin }) => {
831
- const setPluginRef = React__namespace.useRef(setPlugin);
832
- React__namespace.useEffect(() => {
833
- setPluginRef.current(pluginId);
834
- }, []);
835
- return null;
836
- };
837
1131
  const LocalePicker = () => {
838
1132
  const { formatMessage } = reactIntl.useIntl();
839
- const [{ query }, setQuery] = strapiAdmin.useQueryParams();
1133
+ const [{ query: query2 }, setQuery] = strapiAdmin.useQueryParams();
840
1134
  const { hasI18n, canRead, canCreate } = useI18n();
841
1135
  const { data: locales = [] } = useGetLocalesQuery(void 0, {
842
1136
  skip: !hasI18n
@@ -846,25 +1140,25 @@ const LocalePicker = () => {
846
1140
  setQuery(
847
1141
  {
848
1142
  page: 1,
849
- plugins: { ...query.plugins, i18n: { locale: code } }
1143
+ plugins: { ...query2.plugins, i18n: { locale: code } }
850
1144
  },
851
1145
  "push",
852
1146
  replace
853
1147
  );
854
1148
  },
855
- [query.plugins, setQuery]
1149
+ [query2.plugins, setQuery]
856
1150
  );
857
1151
  React__namespace.useEffect(() => {
858
1152
  if (!Array.isArray(locales) || !hasI18n) {
859
1153
  return;
860
1154
  }
861
- const currentDesiredLocale = query.plugins?.i18n?.locale;
1155
+ const currentDesiredLocale = query2.plugins?.i18n?.locale;
862
1156
  const doesLocaleExist = locales.find((loc) => loc.code === currentDesiredLocale);
863
1157
  const defaultLocale = locales.find((locale) => locale.isDefault);
864
1158
  if (!doesLocaleExist && defaultLocale?.code) {
865
1159
  handleChange(defaultLocale.code, true);
866
1160
  }
867
- }, [hasI18n, handleChange, locales, query.plugins?.i18n?.locale]);
1161
+ }, [hasI18n, handleChange, locales, query2.plugins?.i18n?.locale]);
868
1162
  if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {
869
1163
  return null;
870
1164
  }
@@ -879,7 +1173,7 @@ const LocalePicker = () => {
879
1173
  id: getTranslation("actions.select-locale"),
880
1174
  defaultMessage: "Select locale"
881
1175
  }),
882
- value: query.plugins?.i18n?.locale || locales.find((locale) => locale.isDefault)?.code,
1176
+ value: query2.plugins?.i18n?.locale || locales.find((locale) => locale.isDefault)?.code,
883
1177
  onChange: handleChange,
884
1178
  children: displayedLocales.map((locale) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: locale.code, children: locale.name }, locale.id))
885
1179
  }
@@ -974,13 +1268,7 @@ const LocaleListCell = ({
974
1268
  }
975
1269
  });
976
1270
  const { locale: language } = reactIntl.useIntl();
977
- const [visible, setVisible] = React__namespace.useState(false);
978
- const buttonRef = React__namespace.useRef(null);
979
1271
  const { data: locales = [] } = useGetLocalesQuery();
980
- const handleTogglePopover = (e) => {
981
- e.stopPropagation();
982
- setVisible((prev) => !prev);
983
- };
984
1272
  const formatter = designSystem.useCollator(language, {
985
1273
  sensitivity: "base"
986
1274
  });
@@ -1002,64 +1290,14 @@ const LocaleListCell = ({
1002
1290
  }
1003
1291
  return locale.name;
1004
1292
  }).toSorted((a, b) => formatter.compare(a, b));
1005
- return /* @__PURE__ */ jsxRuntime.jsxs(Button, { type: "button", onClick: handleTogglePopover, ref: buttonRef, children: [
1006
- /* @__PURE__ */ jsxRuntime.jsxs(
1007
- ActionWrapper,
1008
- {
1009
- minWidth: "100%",
1010
- alignItems: "center",
1011
- justifyContent: "center",
1012
- height: "3.2rem",
1013
- width: "3.2rem",
1014
- children: [
1015
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", ellipsis: true, children: localesForDocument.join(", ") }),
1016
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { children: /* @__PURE__ */ jsxRuntime.jsx(icons.CaretDown, {}) })
1017
- ]
1018
- }
1019
- ),
1020
- visible && /* @__PURE__ */ jsxRuntime.jsx(
1021
- designSystem.Popover,
1022
- {
1023
- onDismiss: () => setVisible(false),
1024
- source: buttonRef,
1025
- spacing: 16,
1026
- centered: true,
1027
- 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)) })
1028
- }
1029
- )
1293
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Popover.Root, { children: [
1294
+ /* @__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: [
1295
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", ellipsis: true, marginRight: 2, children: localesForDocument.join(", ") }),
1296
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { children: /* @__PURE__ */ jsxRuntime.jsx(icons.CaretDown, { width: "1.2rem", height: "1.2rem" }) })
1297
+ ] }) }) }),
1298
+ /* @__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)) }) })
1030
1299
  ] });
1031
1300
  };
1032
- const Button = styledComponents.styled.button`
1033
- width: 100%;
1034
-
1035
- svg {
1036
- > g,
1037
- path {
1038
- fill: ${({ theme }) => theme.colors.neutral500};
1039
- }
1040
- }
1041
- &:hover {
1042
- svg {
1043
- > g,
1044
- path {
1045
- fill: ${({ theme }) => theme.colors.neutral600};
1046
- }
1047
- }
1048
- }
1049
- &:active {
1050
- svg {
1051
- > g,
1052
- path {
1053
- fill: ${({ theme }) => theme.colors.neutral400};
1054
- }
1055
- }
1056
- }
1057
- `;
1058
- const ActionWrapper = styledComponents.styled(designSystem.Flex)`
1059
- svg {
1060
- height: 0.4rem;
1061
- }
1062
- `;
1063
1301
  const addColumnToTableHook = ({ displayedHeaders, layout }) => {
1064
1302
  const { options } = layout;
1065
1303
  const isFieldLocalized = doesPluginOptionsHaveI18nLocalized(options) ? options.i18n.localized : false;
@@ -1088,18 +1326,11 @@ const addColumnToTableHook = ({ displayedHeaders, layout }) => {
1088
1326
  const addLocaleToReleasesHook = ({ displayedHeaders = [] }) => {
1089
1327
  return {
1090
1328
  displayedHeaders: [
1091
- // TODO: Fix when migrating to v5
1092
- // ...displayedHeaders,
1329
+ ...displayedHeaders,
1093
1330
  {
1094
- key: "__locale__",
1095
- fieldSchema: { type: "string" },
1096
- metadatas: {
1097
- label: {
1098
- id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1099
- defaultMessage: "locale"
1100
- },
1101
- searchable: false,
1102
- sortable: false
1331
+ label: {
1332
+ id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1333
+ defaultMessage: "locale"
1103
1334
  },
1104
1335
  name: "locale"
1105
1336
  }
@@ -1192,9 +1423,6 @@ const localeMiddleware = (ctx) => (next) => (permissions) => {
1192
1423
  return next(revisedPermissions);
1193
1424
  };
1194
1425
  const prefixPluginTranslations = (trad, pluginId2) => {
1195
- if (!pluginId2) {
1196
- throw new TypeError("pluginId can't be empty");
1197
- }
1198
1426
  return Object.keys(trad).reduce((acc, current) => {
1199
1427
  acc[`${pluginId2}.${current}`] = trad[current];
1200
1428
  return acc;
@@ -1247,8 +1475,6 @@ const index = {
1247
1475
  app.addRBACMiddleware([localeMiddleware]);
1248
1476
  app.registerPlugin({
1249
1477
  id: pluginId,
1250
- initializer: Initializer,
1251
- isReady: false,
1252
1478
  name: pluginId
1253
1479
  });
1254
1480
  },
@@ -1266,11 +1492,11 @@ const index = {
1266
1492
  },
1267
1493
  id: "internationalization",
1268
1494
  to: "internationalization",
1269
- Component: () => Promise.resolve().then(() => require("./SettingsPage-DjWupAff.js")).then((mod) => ({ default: mod.ProtectedSettingsPage })),
1495
+ Component: () => Promise.resolve().then(() => require("./SettingsPage-Bcj7380u.js")).then((mod) => ({ default: mod.ProtectedSettingsPage })),
1270
1496
  permissions: PERMISSIONS.accessMain
1271
1497
  });
1272
1498
  const contentManager = app.getPlugin("content-manager");
1273
- contentManager.apis.addDocumentHeaderAction([LocalePickerAction]);
1499
+ contentManager.apis.addDocumentHeaderAction([LocalePickerAction, FillFromAnotherLocaleAction]);
1274
1500
  contentManager.apis.addDocumentAction((actions) => {
1275
1501
  const indexOfDeleteAction = actions.findIndex((action) => action.type === "delete");
1276
1502
  actions.splice(indexOfDeleteAction, 0, DeleteLocaleAction);
@@ -1278,6 +1504,7 @@ const index = {
1278
1504
  });
1279
1505
  contentManager.apis.addDocumentAction((actions) => {
1280
1506
  actions.splice(2, 0, BulkLocalePublishAction);
1507
+ actions.splice(5, 0, BulkLocaleUnpublishAction);
1281
1508
  return actions;
1282
1509
  });
1283
1510
  contentManager.injectComponent("listView", "actions", {
@@ -1383,7 +1610,7 @@ const index = {
1383
1610
  async registerTrads({ locales }) {
1384
1611
  const importedTrads = await Promise.all(
1385
1612
  locales.map((locale) => {
1386
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => Promise.resolve().then(() => require("./de-DtWiGdHl.js")), "./translations/dk.json": () => Promise.resolve().then(() => require("./dk-D8C-casx.js")), "./translations/en.json": () => Promise.resolve().then(() => require("./en-Kv6y9zPQ.js")), "./translations/es.json": () => Promise.resolve().then(() => require("./es-DS-XFGSw.js")), "./translations/fr.json": () => Promise.resolve().then(() => require("./fr-BTjekDpq.js")), "./translations/ko.json": () => Promise.resolve().then(() => require("./ko-DmcGUBQ3.js")), "./translations/pl.json": () => Promise.resolve().then(() => require("./pl-Cn5RYonZ.js")), "./translations/ru.json": () => Promise.resolve().then(() => require("./ru-BMBgVL3s.js")), "./translations/tr.json": () => Promise.resolve().then(() => require("./tr-CarUU76c.js")), "./translations/zh-Hans.json": () => Promise.resolve().then(() => require("./zh-Hans-DSHIXAa3.js")), "./translations/zh.json": () => Promise.resolve().then(() => require("./zh-CukOviB0.js")) }), `./translations/${locale}.json`).then(({ default: data }) => {
1613
+ 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`).then(({ default: data }) => {
1387
1614
  return {
1388
1615
  data: prefixPluginTranslations(data, pluginId),
1389
1616
  locale
@@ -1407,4 +1634,4 @@ exports.useDeleteLocaleMutation = useDeleteLocaleMutation;
1407
1634
  exports.useGetDefaultLocalesQuery = useGetDefaultLocalesQuery;
1408
1635
  exports.useGetLocalesQuery = useGetLocalesQuery;
1409
1636
  exports.useUpdateLocaleMutation = useUpdateLocaleMutation;
1410
- //# sourceMappingURL=index-D--YX2ZY.js.map
1637
+ //# sourceMappingURL=index-BKZbxhpm.js.map