@strapi/i18n 5.57.0 → 5.59.0

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 (43) hide show
  1. package/dist/admin/components/BulkLocaleActionModal.js +4 -3
  2. package/dist/admin/components/BulkLocaleActionModal.js.map +1 -1
  3. package/dist/admin/components/BulkLocaleActionModal.mjs +4 -3
  4. package/dist/admin/components/BulkLocaleActionModal.mjs.map +1 -1
  5. package/dist/admin/components/CMHeaderActions.js +1 -1
  6. package/dist/admin/components/CMHeaderActions.js.map +1 -1
  7. package/dist/admin/components/CMHeaderActions.mjs +1 -1
  8. package/dist/admin/components/CMHeaderActions.mjs.map +1 -1
  9. package/dist/admin/components/LocaleTable.js +2 -1
  10. package/dist/admin/components/LocaleTable.js.map +1 -1
  11. package/dist/admin/components/LocaleTable.mjs +2 -1
  12. package/dist/admin/components/LocaleTable.mjs.map +1 -1
  13. package/dist/admin/middlewares/rbac-middleware.js.map +1 -1
  14. package/dist/admin/middlewares/rbac-middleware.mjs.map +1 -1
  15. package/dist/admin/translations/da.json.js +2 -2
  16. package/dist/admin/translations/da.json.mjs +2 -2
  17. package/dist/admin/translations/de.json.js +2 -2
  18. package/dist/admin/translations/de.json.mjs +2 -2
  19. package/dist/admin/translations/es.json.js +2 -2
  20. package/dist/admin/translations/es.json.mjs +2 -2
  21. package/dist/admin/translations/fr.json.js +2 -2
  22. package/dist/admin/translations/fr.json.mjs +2 -2
  23. package/dist/admin/translations/ko.json.js +2 -2
  24. package/dist/admin/translations/ko.json.mjs +2 -2
  25. package/dist/admin/translations/pl.json.js +2 -2
  26. package/dist/admin/translations/pl.json.mjs +2 -2
  27. package/dist/admin/translations/ru.json.js +1 -1
  28. package/dist/admin/translations/ru.json.mjs +1 -1
  29. package/dist/admin/translations/tr.json.js +2 -2
  30. package/dist/admin/translations/tr.json.mjs +2 -2
  31. package/dist/admin/translations/zh-Hans.json.js +2 -2
  32. package/dist/admin/translations/zh-Hans.json.mjs +2 -2
  33. package/dist/admin/translations/zh.json.js +2 -2
  34. package/dist/admin/translations/zh.json.mjs +2 -2
  35. package/dist/server/services/ai-localizations.js +9 -9
  36. package/dist/server/services/ai-localizations.js.map +1 -1
  37. package/dist/server/services/ai-localizations.mjs +9 -9
  38. package/dist/server/services/ai-localizations.mjs.map +1 -1
  39. package/dist/server/services/sanitize/index.js +3 -3
  40. package/dist/server/services/sanitize/index.js.map +1 -1
  41. package/dist/server/services/sanitize/index.mjs +3 -3
  42. package/dist/server/services/sanitize/index.mjs.map +1 -1
  43. package/package.json +7 -7
@@ -11,6 +11,7 @@ var reactRouterDom = require('react-router-dom');
11
11
  var getTranslation = require('../utils/getTranslation.js');
12
12
  var strings = require('../utils/strings.js');
13
13
 
14
+ const EMPTY_VALIDATION_ERRORS = {};
14
15
  const isErrorMessageDescriptor = (object)=>{
15
16
  return typeof object === 'object' && object !== null && 'id' in object && 'defaultMessage' in object;
16
17
  };
@@ -140,7 +141,7 @@ const EntryValidationText = ({ status = 'draft', validationErrors, action })=>{
140
141
  fontWeight: "bold",
141
142
  children: chunks
142
143
  });
143
- const BulkLocaleActionModal = ({ headers, rows, localesMetadata, validationErrors = {}, action })=>{
144
+ const BulkLocaleActionModal = ({ headers, rows, localesMetadata, validationErrors = EMPTY_VALIDATION_ERRORS, action })=>{
144
145
  const { formatMessage } = reactIntl.useIntl();
145
146
  const selectedRows = strapiAdmin.useTable('BulkLocaleActionModal', (state)=>state.selectedRows);
146
147
  const getFormattedCountMessage = ()=>{
@@ -182,7 +183,7 @@ const BulkLocaleActionModal = ({ headers, rows, localesMetadata, validationError
182
183
  ]
183
184
  }),
184
185
  /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Table.Body, {
185
- children: rows.map(({ locale, status }, index)=>{
186
+ children: rows.map(({ locale, status })=>{
186
187
  const error = validationErrors?.[locale] ?? null;
187
188
  const statusVariant = status === 'draft' ? 'primary' : status === 'published' ? 'success' : 'alternative';
188
189
  return status && locale ? /*#__PURE__*/ jsxRuntime.jsxs(strapiAdmin.Table.Row, {
@@ -248,7 +249,7 @@ const BulkLocaleActionModal = ({ headers, rows, localesMetadata, validationError
248
249
  })
249
250
  })
250
251
  ]
251
- }, index) : null;
252
+ }, locale) : null;
252
253
  })
253
254
  })
254
255
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"BulkLocaleActionModal.js","sources":["../../../admin/src/components/BulkLocaleActionModal.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { FormErrors, Table, useTable } from '@strapi/admin/strapi-admin';\nimport { Box, Typography, IconButton, Flex, Tooltip, Status, Modal } from '@strapi/design-system';\nimport { Pencil, CheckCircle, CrossCircle, ArrowsCounterClockwise } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { type MessageDescriptor, useIntl, PrimitiveType } from 'react-intl';\nimport { Link } from 'react-router-dom';\n\nimport { Locale } from '../../../shared/contracts/locales';\nimport { getTranslation } from '../utils/getTranslation';\nimport { capitalize } from '../utils/strings';\n\nimport { LocaleStatus } from './CMHeaderActions';\n\nimport type { Modules } from '@strapi/types';\n\ntype Status = Modules.Documents.Params.PublicationStatus.Kind | 'modified';\n\n/* -------------------------------------------------------------------------------------------------\n * EntryValidationText\n * -----------------------------------------------------------------------------------------------*/\n\ninterface EntryValidationTextProps {\n status: Status;\n validationErrors: FormErrors | null;\n action: 'bulk-publish' | 'bulk-unpublish';\n}\n\ninterface TranslationMessage extends MessageDescriptor {\n values?: Record<string, PrimitiveType>;\n}\n\ntype ValidationErrorValue =\n | string\n | TranslationMessage\n | ValidationErrorValue[]\n | { [key: string]: ValidationErrorValue | undefined };\n\ntype ValidationErrorRecord = Record<string, ValidationErrorValue | undefined>;\n\ntype LocaleValidationErrors = Partial<Record<string, FormErrors>>;\ntype LocaleTableRow = LocaleStatus & { id: string };\n\nconst isErrorMessageDescriptor = (object?: string | object): object is TranslationMessage => {\n return (\n typeof object === 'object' && object !== null && 'id' in object && 'defaultMessage' in object\n );\n};\n\nconst EntryValidationText = ({\n status = 'draft',\n validationErrors,\n action,\n}: EntryValidationTextProps) => {\n const { formatMessage } = useIntl();\n\n /**\n * TODO: Should this be extracted an made into a factory to recursively get\n * error messages??\n */\n const getErrorStr = (key: string, value?: ValidationErrorValue): string => {\n if (typeof value === 'string') {\n return `${key}: ${value}`;\n } else if (isErrorMessageDescriptor(value)) {\n return `${key}: ${formatMessage(value)}`;\n } else if (Array.isArray(value)) {\n return value.map((v) => getErrorStr(key, v)).join(' ');\n } else if (typeof value === 'object' && !Array.isArray(value)) {\n return Object.entries(value)\n .map(([k, v]) => getErrorStr(k, v))\n .join(' ');\n } else {\n /**\n * unlikely to happen, but we need to return something\n */\n return '';\n }\n };\n\n if (validationErrors !== null) {\n const validationErrorsMessages = Object.entries(validationErrors as ValidationErrorRecord)\n .map(([key, value]) => {\n return getErrorStr(key, value);\n })\n .join(' ');\n\n return (\n <Flex gap={2}>\n <CrossCircle fill=\"danger600\" />\n <Tooltip label={validationErrorsMessages}>\n <Typography\n maxWidth={'30rem'}\n textColor=\"danger600\"\n variant=\"omega\"\n fontWeight=\"semiBold\"\n ellipsis\n >\n {validationErrorsMessages}\n </Typography>\n </Tooltip>\n </Flex>\n );\n }\n\n const getStatusMessage = () => {\n if (action === 'bulk-publish') {\n if (status === 'published') {\n return {\n icon: <CheckCircle fill=\"success600\" />,\n text: formatMessage({\n id: 'content-manager.bulk-publish.already-published',\n defaultMessage: 'Already Published',\n }),\n textColor: 'success600',\n fontWeight: 'bold',\n };\n } else if (status === 'modified') {\n return {\n icon: <ArrowsCounterClockwise fill=\"alternative600\" />,\n text: formatMessage({\n id: 'app.utils.ready-to-publish-changes',\n defaultMessage: 'Ready to publish changes',\n }),\n };\n } else {\n return {\n icon: <CheckCircle fill=\"success600\" />,\n text: formatMessage({\n id: 'app.utils.ready-to-publish',\n defaultMessage: 'Ready to publish',\n }),\n };\n }\n } else {\n if (status === 'draft') {\n return {\n icon: <CheckCircle fill=\"success600\" />,\n text: formatMessage({\n id: 'content-manager.bulk-unpublish.already-unpublished',\n defaultMessage: 'Already Unpublished',\n }),\n textColor: 'success600',\n fontWeight: 'bold',\n };\n } else {\n return {\n icon: <CheckCircle fill=\"success600\" />,\n text: formatMessage({\n id: 'app.utils.ready-to-unpublish-changes',\n defaultMessage: 'Ready to unpublish',\n }),\n textColor: 'success600',\n fontWeight: 'bold',\n };\n }\n }\n };\n\n const { icon, text, textColor = 'success600', fontWeight = 'normal' } = getStatusMessage();\n\n return (\n <Flex gap={2}>\n {icon}\n <Typography textColor={textColor} fontWeight={fontWeight}>\n {text}\n </Typography>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * BoldChunk\n * -----------------------------------------------------------------------------------------------*/\n\nconst BoldChunk = (chunks: React.ReactNode) => <Typography fontWeight=\"bold\">{chunks}</Typography>;\n\n/* -------------------------------------------------------------------------------------------------\n * BulkLocaleActionModal\n * -----------------------------------------------------------------------------------------------*/\n\ninterface BulkLocaleActionModalProps {\n rows: LocaleStatus[];\n headers: {\n label: string;\n name: string;\n }[];\n localesMetadata: Locale[];\n validationErrors?: LocaleValidationErrors;\n action: 'bulk-publish' | 'bulk-unpublish';\n}\n\nconst BulkLocaleActionModal = ({\n headers,\n rows,\n localesMetadata,\n validationErrors = {},\n action,\n}: BulkLocaleActionModalProps) => {\n const { formatMessage } = useIntl();\n\n const selectedRows = useTable(\n 'BulkLocaleActionModal',\n (state) => state.selectedRows\n ) as LocaleTableRow[];\n\n const getFormattedCountMessage = () => {\n const currentStatusByLocale = rows.reduce<Record<string, string>>((acc, { locale, status }) => {\n acc[locale] = status;\n return acc;\n }, {});\n const localesWithErrors = Object.keys(validationErrors);\n\n const publishedCount = selectedRows.filter(\n ({ locale }) => currentStatusByLocale[locale] === 'published'\n ).length;\n\n const draftCount = selectedRows.filter(\n ({ locale }) =>\n (currentStatusByLocale[locale] === 'draft' ||\n currentStatusByLocale[locale] === 'modified') &&\n !localesWithErrors.includes(locale)\n ).length;\n\n const withErrorsCount = localesWithErrors.length;\n const messageId =\n action === 'bulk-publish'\n ? 'content-manager.containers.list.selectedEntriesModal.selectedCount.publish'\n : 'content-manager.containers.list.selectedEntriesModal.selectedCount.unpublish';\n\n const defaultMessage =\n action === 'bulk-publish'\n ? '<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.'\n : '<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.';\n\n return formatMessage(\n {\n id: messageId,\n defaultMessage,\n },\n {\n withErrorsCount,\n draftCount,\n publishedCount,\n b: BoldChunk,\n }\n );\n };\n\n return (\n <Modal.Body>\n <Typography>{getFormattedCountMessage()}</Typography>\n <Box marginTop={5}>\n <Table.Content>\n <Table.Head>\n <Table.HeaderCheckboxCell />\n {headers.map((head) => (\n <Table.HeaderCell key={head.name} {...head} />\n ))}\n </Table.Head>\n <Table.Body>\n {rows.map(({ locale, status }, index) => {\n const error = validationErrors?.[locale] ?? null;\n\n const statusVariant =\n status === 'draft' ? 'primary' : status === 'published' ? 'success' : 'alternative';\n\n return status && locale ? (\n <Table.Row key={index}>\n <Table.CheckboxCell id={locale} aria-label={`Select ${locale}`} />\n <Table.Cell>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {Array.isArray(localesMetadata)\n ? localesMetadata.find((localeEntry) => localeEntry.code === locale)?.name\n : locale}\n </Typography>\n </Table.Cell>\n <Table.Cell>\n <Box display=\"flex\">\n <Status\n display=\"flex\"\n paddingLeft=\"6px\"\n paddingRight=\"6px\"\n paddingTop=\"2px\"\n paddingBottom=\"2px\"\n size={'S'}\n variant={statusVariant}\n >\n <Typography tag=\"span\" variant=\"pi\" fontWeight=\"bold\">\n {capitalize(status)}\n </Typography>\n </Status>\n </Box>\n </Table.Cell>\n <Table.Cell>\n <EntryValidationText validationErrors={error} status={status} action={action} />\n </Table.Cell>\n <Table.Cell>\n <IconButton\n tag={Link}\n to={{\n search: stringify({ plugins: { i18n: { locale } } }),\n }}\n label={formatMessage(\n {\n id: getTranslation('Settings.list.actions.edit'),\n defaultMessage: 'Edit {name} locale',\n },\n {\n name: locale,\n }\n )}\n variant=\"ghost\"\n >\n <Pencil />\n </IconButton>\n </Table.Cell>\n </Table.Row>\n ) : null;\n })}\n </Table.Body>\n </Table.Content>\n </Box>\n </Modal.Body>\n );\n};\n\nexport { BulkLocaleActionModal };\nexport type { BulkLocaleActionModalProps, LocaleValidationErrors };\n"],"names":["isErrorMessageDescriptor","object","EntryValidationText","status","validationErrors","action","formatMessage","useIntl","getErrorStr","key","value","Array","isArray","map","v","join","Object","entries","k","validationErrorsMessages","_jsxs","Flex","gap","_jsx","CrossCircle","fill","Tooltip","label","Typography","maxWidth","textColor","variant","fontWeight","ellipsis","getStatusMessage","icon","CheckCircle","text","id","defaultMessage","ArrowsCounterClockwise","BoldChunk","chunks","BulkLocaleActionModal","headers","rows","localesMetadata","selectedRows","useTable","state","getFormattedCountMessage","currentStatusByLocale","reduce","acc","locale","localesWithErrors","keys","publishedCount","filter","length","draftCount","includes","withErrorsCount","messageId","b","Modal","Body","Box","marginTop","Table","Content","Head","HeaderCheckboxCell","head","HeaderCell","name","index","error","statusVariant","Row","CheckboxCell","aria-label","Cell","find","localeEntry","code","display","Status","paddingLeft","paddingRight","paddingTop","paddingBottom","size","tag","capitalize","IconButton","Link","to","search","stringify","plugins","i18n","getTranslation","Pencil"],"mappings":"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"}
1
+ {"version":3,"file":"BulkLocaleActionModal.js","sources":["../../../admin/src/components/BulkLocaleActionModal.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { FormErrors, Table, useTable } from '@strapi/admin/strapi-admin';\nimport { Box, Typography, IconButton, Flex, Tooltip, Status, Modal } from '@strapi/design-system';\nimport { Pencil, CheckCircle, CrossCircle, ArrowsCounterClockwise } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { type MessageDescriptor, useIntl, PrimitiveType } from 'react-intl';\nimport { Link } from 'react-router-dom';\n\nimport { Locale } from '../../../shared/contracts/locales';\nimport { getTranslation } from '../utils/getTranslation';\nimport { capitalize } from '../utils/strings';\n\nimport { LocaleStatus } from './CMHeaderActions';\n\nimport type { Modules } from '@strapi/types';\n\nconst EMPTY_VALIDATION_ERRORS: NonNullable<BulkLocaleActionModalProps['validationErrors']> = {};\n\ntype Status = Modules.Documents.Params.PublicationStatus.Kind | 'modified';\n\n/* -------------------------------------------------------------------------------------------------\n * EntryValidationText\n * -----------------------------------------------------------------------------------------------*/\n\ninterface EntryValidationTextProps {\n status: Status;\n validationErrors: FormErrors | null;\n action: 'bulk-publish' | 'bulk-unpublish';\n}\n\ninterface TranslationMessage extends MessageDescriptor {\n values?: Record<string, PrimitiveType>;\n}\n\ntype ValidationErrorValue =\n | string\n | TranslationMessage\n | ValidationErrorValue[]\n | { [key: string]: ValidationErrorValue | undefined };\n\ntype ValidationErrorRecord = Record<string, ValidationErrorValue | undefined>;\n\ntype LocaleValidationErrors = Partial<Record<string, FormErrors>>;\ntype LocaleTableRow = LocaleStatus & { id: string };\n\nconst isErrorMessageDescriptor = (object?: string | object): object is TranslationMessage => {\n return (\n typeof object === 'object' && object !== null && 'id' in object && 'defaultMessage' in object\n );\n};\n\nconst EntryValidationText = ({\n status = 'draft',\n validationErrors,\n action,\n}: EntryValidationTextProps) => {\n const { formatMessage } = useIntl();\n\n /**\n * TODO: Should this be extracted an made into a factory to recursively get\n * error messages??\n */\n const getErrorStr = (key: string, value?: ValidationErrorValue): string => {\n if (typeof value === 'string') {\n return `${key}: ${value}`;\n } else if (isErrorMessageDescriptor(value)) {\n return `${key}: ${formatMessage(value)}`;\n } else if (Array.isArray(value)) {\n return value.map((v) => getErrorStr(key, v)).join(' ');\n } else if (typeof value === 'object' && !Array.isArray(value)) {\n return Object.entries(value)\n .map(([k, v]) => getErrorStr(k, v))\n .join(' ');\n } else {\n /**\n * unlikely to happen, but we need to return something\n */\n return '';\n }\n };\n\n if (validationErrors !== null) {\n const validationErrorsMessages = Object.entries(validationErrors as ValidationErrorRecord)\n .map(([key, value]) => {\n return getErrorStr(key, value);\n })\n .join(' ');\n\n return (\n <Flex gap={2}>\n <CrossCircle fill=\"danger600\" />\n <Tooltip label={validationErrorsMessages}>\n <Typography\n maxWidth={'30rem'}\n textColor=\"danger600\"\n variant=\"omega\"\n fontWeight=\"semiBold\"\n ellipsis\n >\n {validationErrorsMessages}\n </Typography>\n </Tooltip>\n </Flex>\n );\n }\n\n const getStatusMessage = () => {\n if (action === 'bulk-publish') {\n if (status === 'published') {\n return {\n icon: <CheckCircle fill=\"success600\" />,\n text: formatMessage({\n id: 'content-manager.bulk-publish.already-published',\n defaultMessage: 'Already Published',\n }),\n textColor: 'success600',\n fontWeight: 'bold',\n };\n } else if (status === 'modified') {\n return {\n icon: <ArrowsCounterClockwise fill=\"alternative600\" />,\n text: formatMessage({\n id: 'app.utils.ready-to-publish-changes',\n defaultMessage: 'Ready to publish changes',\n }),\n };\n } else {\n return {\n icon: <CheckCircle fill=\"success600\" />,\n text: formatMessage({\n id: 'app.utils.ready-to-publish',\n defaultMessage: 'Ready to publish',\n }),\n };\n }\n } else {\n if (status === 'draft') {\n return {\n icon: <CheckCircle fill=\"success600\" />,\n text: formatMessage({\n id: 'content-manager.bulk-unpublish.already-unpublished',\n defaultMessage: 'Already Unpublished',\n }),\n textColor: 'success600',\n fontWeight: 'bold',\n };\n } else {\n return {\n icon: <CheckCircle fill=\"success600\" />,\n text: formatMessage({\n id: 'app.utils.ready-to-unpublish-changes',\n defaultMessage: 'Ready to unpublish',\n }),\n textColor: 'success600',\n fontWeight: 'bold',\n };\n }\n }\n };\n\n const { icon, text, textColor = 'success600', fontWeight = 'normal' } = getStatusMessage();\n\n return (\n <Flex gap={2}>\n {icon}\n <Typography textColor={textColor} fontWeight={fontWeight}>\n {text}\n </Typography>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * BoldChunk\n * -----------------------------------------------------------------------------------------------*/\n\nconst BoldChunk = (chunks: React.ReactNode) => <Typography fontWeight=\"bold\">{chunks}</Typography>;\n\n/* -------------------------------------------------------------------------------------------------\n * BulkLocaleActionModal\n * -----------------------------------------------------------------------------------------------*/\n\ninterface BulkLocaleActionModalProps {\n rows: LocaleStatus[];\n headers: {\n label: string;\n name: string;\n }[];\n localesMetadata: Locale[];\n validationErrors?: LocaleValidationErrors;\n action: 'bulk-publish' | 'bulk-unpublish';\n}\n\nconst BulkLocaleActionModal = ({\n headers,\n rows,\n localesMetadata,\n validationErrors = EMPTY_VALIDATION_ERRORS,\n action,\n}: BulkLocaleActionModalProps) => {\n const { formatMessage } = useIntl();\n\n const selectedRows = useTable(\n 'BulkLocaleActionModal',\n (state) => state.selectedRows\n ) as LocaleTableRow[];\n\n const getFormattedCountMessage = () => {\n const currentStatusByLocale = rows.reduce<Record<string, string>>((acc, { locale, status }) => {\n acc[locale] = status;\n return acc;\n }, {});\n const localesWithErrors = Object.keys(validationErrors);\n\n const publishedCount = selectedRows.filter(\n ({ locale }) => currentStatusByLocale[locale] === 'published'\n ).length;\n\n const draftCount = selectedRows.filter(\n ({ locale }) =>\n (currentStatusByLocale[locale] === 'draft' ||\n currentStatusByLocale[locale] === 'modified') &&\n !localesWithErrors.includes(locale)\n ).length;\n\n const withErrorsCount = localesWithErrors.length;\n const messageId =\n action === 'bulk-publish'\n ? 'content-manager.containers.list.selectedEntriesModal.selectedCount.publish'\n : 'content-manager.containers.list.selectedEntriesModal.selectedCount.unpublish';\n\n const defaultMessage =\n action === 'bulk-publish'\n ? '<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.'\n : '<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.';\n\n return formatMessage(\n {\n id: messageId,\n defaultMessage,\n },\n {\n withErrorsCount,\n draftCount,\n publishedCount,\n b: BoldChunk,\n }\n );\n };\n\n return (\n <Modal.Body>\n <Typography>{getFormattedCountMessage()}</Typography>\n <Box marginTop={5}>\n <Table.Content>\n <Table.Head>\n <Table.HeaderCheckboxCell />\n {headers.map((head) => (\n <Table.HeaderCell key={head.name} {...head} />\n ))}\n </Table.Head>\n <Table.Body>\n {rows.map(({ locale, status }) => {\n const error = validationErrors?.[locale] ?? null;\n\n const statusVariant =\n status === 'draft' ? 'primary' : status === 'published' ? 'success' : 'alternative';\n\n return status && locale ? (\n <Table.Row key={locale}>\n <Table.CheckboxCell id={locale} aria-label={`Select ${locale}`} />\n <Table.Cell>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {Array.isArray(localesMetadata)\n ? localesMetadata.find((localeEntry) => localeEntry.code === locale)?.name\n : locale}\n </Typography>\n </Table.Cell>\n <Table.Cell>\n <Box display=\"flex\">\n <Status\n display=\"flex\"\n paddingLeft=\"6px\"\n paddingRight=\"6px\"\n paddingTop=\"2px\"\n paddingBottom=\"2px\"\n size={'S'}\n variant={statusVariant}\n >\n <Typography tag=\"span\" variant=\"pi\" fontWeight=\"bold\">\n {capitalize(status)}\n </Typography>\n </Status>\n </Box>\n </Table.Cell>\n <Table.Cell>\n <EntryValidationText validationErrors={error} status={status} action={action} />\n </Table.Cell>\n <Table.Cell>\n <IconButton\n tag={Link}\n to={{\n search: stringify({ plugins: { i18n: { locale } } }),\n }}\n label={formatMessage(\n {\n id: getTranslation('Settings.list.actions.edit'),\n defaultMessage: 'Edit {name} locale',\n },\n {\n name: locale,\n }\n )}\n variant=\"ghost\"\n >\n <Pencil />\n </IconButton>\n </Table.Cell>\n </Table.Row>\n ) : null;\n })}\n </Table.Body>\n </Table.Content>\n </Box>\n </Modal.Body>\n );\n};\n\nexport { BulkLocaleActionModal };\nexport type { BulkLocaleActionModalProps, LocaleValidationErrors };\n"],"names":["EMPTY_VALIDATION_ERRORS","isErrorMessageDescriptor","object","EntryValidationText","status","validationErrors","action","formatMessage","useIntl","getErrorStr","key","value","Array","isArray","map","v","join","Object","entries","k","validationErrorsMessages","_jsxs","Flex","gap","_jsx","CrossCircle","fill","Tooltip","label","Typography","maxWidth","textColor","variant","fontWeight","ellipsis","getStatusMessage","icon","CheckCircle","text","id","defaultMessage","ArrowsCounterClockwise","BoldChunk","chunks","BulkLocaleActionModal","headers","rows","localesMetadata","selectedRows","useTable","state","getFormattedCountMessage","currentStatusByLocale","reduce","acc","locale","localesWithErrors","keys","publishedCount","filter","length","draftCount","includes","withErrorsCount","messageId","b","Modal","Body","Box","marginTop","Table","Content","Head","HeaderCheckboxCell","head","HeaderCell","name","error","statusVariant","Row","CheckboxCell","aria-label","Cell","find","localeEntry","code","display","Status","paddingLeft","paddingRight","paddingTop","paddingBottom","size","tag","capitalize","IconButton","Link","to","search","stringify","plugins","i18n","getTranslation","Pencil"],"mappings":"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"}
@@ -9,6 +9,7 @@ import { Link } from 'react-router-dom';
9
9
  import { getTranslation } from '../utils/getTranslation.mjs';
10
10
  import { capitalize } from '../utils/strings.mjs';
11
11
 
12
+ const EMPTY_VALIDATION_ERRORS = {};
12
13
  const isErrorMessageDescriptor = (object)=>{
13
14
  return typeof object === 'object' && object !== null && 'id' in object && 'defaultMessage' in object;
14
15
  };
@@ -138,7 +139,7 @@ const EntryValidationText = ({ status = 'draft', validationErrors, action })=>{
138
139
  fontWeight: "bold",
139
140
  children: chunks
140
141
  });
141
- const BulkLocaleActionModal = ({ headers, rows, localesMetadata, validationErrors = {}, action })=>{
142
+ const BulkLocaleActionModal = ({ headers, rows, localesMetadata, validationErrors = EMPTY_VALIDATION_ERRORS, action })=>{
142
143
  const { formatMessage } = useIntl();
143
144
  const selectedRows = useTable('BulkLocaleActionModal', (state)=>state.selectedRows);
144
145
  const getFormattedCountMessage = ()=>{
@@ -180,7 +181,7 @@ const BulkLocaleActionModal = ({ headers, rows, localesMetadata, validationError
180
181
  ]
181
182
  }),
182
183
  /*#__PURE__*/ jsx(Table.Body, {
183
- children: rows.map(({ locale, status }, index)=>{
184
+ children: rows.map(({ locale, status })=>{
184
185
  const error = validationErrors?.[locale] ?? null;
185
186
  const statusVariant = status === 'draft' ? 'primary' : status === 'published' ? 'success' : 'alternative';
186
187
  return status && locale ? /*#__PURE__*/ jsxs(Table.Row, {
@@ -246,7 +247,7 @@ const BulkLocaleActionModal = ({ headers, rows, localesMetadata, validationError
246
247
  })
247
248
  })
248
249
  ]
249
- }, index) : null;
250
+ }, locale) : null;
250
251
  })
251
252
  })
252
253
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"BulkLocaleActionModal.mjs","sources":["../../../admin/src/components/BulkLocaleActionModal.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { FormErrors, Table, useTable } from '@strapi/admin/strapi-admin';\nimport { Box, Typography, IconButton, Flex, Tooltip, Status, Modal } from '@strapi/design-system';\nimport { Pencil, CheckCircle, CrossCircle, ArrowsCounterClockwise } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { type MessageDescriptor, useIntl, PrimitiveType } from 'react-intl';\nimport { Link } from 'react-router-dom';\n\nimport { Locale } from '../../../shared/contracts/locales';\nimport { getTranslation } from '../utils/getTranslation';\nimport { capitalize } from '../utils/strings';\n\nimport { LocaleStatus } from './CMHeaderActions';\n\nimport type { Modules } from '@strapi/types';\n\ntype Status = Modules.Documents.Params.PublicationStatus.Kind | 'modified';\n\n/* -------------------------------------------------------------------------------------------------\n * EntryValidationText\n * -----------------------------------------------------------------------------------------------*/\n\ninterface EntryValidationTextProps {\n status: Status;\n validationErrors: FormErrors | null;\n action: 'bulk-publish' | 'bulk-unpublish';\n}\n\ninterface TranslationMessage extends MessageDescriptor {\n values?: Record<string, PrimitiveType>;\n}\n\ntype ValidationErrorValue =\n | string\n | TranslationMessage\n | ValidationErrorValue[]\n | { [key: string]: ValidationErrorValue | undefined };\n\ntype ValidationErrorRecord = Record<string, ValidationErrorValue | undefined>;\n\ntype LocaleValidationErrors = Partial<Record<string, FormErrors>>;\ntype LocaleTableRow = LocaleStatus & { id: string };\n\nconst isErrorMessageDescriptor = (object?: string | object): object is TranslationMessage => {\n return (\n typeof object === 'object' && object !== null && 'id' in object && 'defaultMessage' in object\n );\n};\n\nconst EntryValidationText = ({\n status = 'draft',\n validationErrors,\n action,\n}: EntryValidationTextProps) => {\n const { formatMessage } = useIntl();\n\n /**\n * TODO: Should this be extracted an made into a factory to recursively get\n * error messages??\n */\n const getErrorStr = (key: string, value?: ValidationErrorValue): string => {\n if (typeof value === 'string') {\n return `${key}: ${value}`;\n } else if (isErrorMessageDescriptor(value)) {\n return `${key}: ${formatMessage(value)}`;\n } else if (Array.isArray(value)) {\n return value.map((v) => getErrorStr(key, v)).join(' ');\n } else if (typeof value === 'object' && !Array.isArray(value)) {\n return Object.entries(value)\n .map(([k, v]) => getErrorStr(k, v))\n .join(' ');\n } else {\n /**\n * unlikely to happen, but we need to return something\n */\n return '';\n }\n };\n\n if (validationErrors !== null) {\n const validationErrorsMessages = Object.entries(validationErrors as ValidationErrorRecord)\n .map(([key, value]) => {\n return getErrorStr(key, value);\n })\n .join(' ');\n\n return (\n <Flex gap={2}>\n <CrossCircle fill=\"danger600\" />\n <Tooltip label={validationErrorsMessages}>\n <Typography\n maxWidth={'30rem'}\n textColor=\"danger600\"\n variant=\"omega\"\n fontWeight=\"semiBold\"\n ellipsis\n >\n {validationErrorsMessages}\n </Typography>\n </Tooltip>\n </Flex>\n );\n }\n\n const getStatusMessage = () => {\n if (action === 'bulk-publish') {\n if (status === 'published') {\n return {\n icon: <CheckCircle fill=\"success600\" />,\n text: formatMessage({\n id: 'content-manager.bulk-publish.already-published',\n defaultMessage: 'Already Published',\n }),\n textColor: 'success600',\n fontWeight: 'bold',\n };\n } else if (status === 'modified') {\n return {\n icon: <ArrowsCounterClockwise fill=\"alternative600\" />,\n text: formatMessage({\n id: 'app.utils.ready-to-publish-changes',\n defaultMessage: 'Ready to publish changes',\n }),\n };\n } else {\n return {\n icon: <CheckCircle fill=\"success600\" />,\n text: formatMessage({\n id: 'app.utils.ready-to-publish',\n defaultMessage: 'Ready to publish',\n }),\n };\n }\n } else {\n if (status === 'draft') {\n return {\n icon: <CheckCircle fill=\"success600\" />,\n text: formatMessage({\n id: 'content-manager.bulk-unpublish.already-unpublished',\n defaultMessage: 'Already Unpublished',\n }),\n textColor: 'success600',\n fontWeight: 'bold',\n };\n } else {\n return {\n icon: <CheckCircle fill=\"success600\" />,\n text: formatMessage({\n id: 'app.utils.ready-to-unpublish-changes',\n defaultMessage: 'Ready to unpublish',\n }),\n textColor: 'success600',\n fontWeight: 'bold',\n };\n }\n }\n };\n\n const { icon, text, textColor = 'success600', fontWeight = 'normal' } = getStatusMessage();\n\n return (\n <Flex gap={2}>\n {icon}\n <Typography textColor={textColor} fontWeight={fontWeight}>\n {text}\n </Typography>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * BoldChunk\n * -----------------------------------------------------------------------------------------------*/\n\nconst BoldChunk = (chunks: React.ReactNode) => <Typography fontWeight=\"bold\">{chunks}</Typography>;\n\n/* -------------------------------------------------------------------------------------------------\n * BulkLocaleActionModal\n * -----------------------------------------------------------------------------------------------*/\n\ninterface BulkLocaleActionModalProps {\n rows: LocaleStatus[];\n headers: {\n label: string;\n name: string;\n }[];\n localesMetadata: Locale[];\n validationErrors?: LocaleValidationErrors;\n action: 'bulk-publish' | 'bulk-unpublish';\n}\n\nconst BulkLocaleActionModal = ({\n headers,\n rows,\n localesMetadata,\n validationErrors = {},\n action,\n}: BulkLocaleActionModalProps) => {\n const { formatMessage } = useIntl();\n\n const selectedRows = useTable(\n 'BulkLocaleActionModal',\n (state) => state.selectedRows\n ) as LocaleTableRow[];\n\n const getFormattedCountMessage = () => {\n const currentStatusByLocale = rows.reduce<Record<string, string>>((acc, { locale, status }) => {\n acc[locale] = status;\n return acc;\n }, {});\n const localesWithErrors = Object.keys(validationErrors);\n\n const publishedCount = selectedRows.filter(\n ({ locale }) => currentStatusByLocale[locale] === 'published'\n ).length;\n\n const draftCount = selectedRows.filter(\n ({ locale }) =>\n (currentStatusByLocale[locale] === 'draft' ||\n currentStatusByLocale[locale] === 'modified') &&\n !localesWithErrors.includes(locale)\n ).length;\n\n const withErrorsCount = localesWithErrors.length;\n const messageId =\n action === 'bulk-publish'\n ? 'content-manager.containers.list.selectedEntriesModal.selectedCount.publish'\n : 'content-manager.containers.list.selectedEntriesModal.selectedCount.unpublish';\n\n const defaultMessage =\n action === 'bulk-publish'\n ? '<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.'\n : '<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.';\n\n return formatMessage(\n {\n id: messageId,\n defaultMessage,\n },\n {\n withErrorsCount,\n draftCount,\n publishedCount,\n b: BoldChunk,\n }\n );\n };\n\n return (\n <Modal.Body>\n <Typography>{getFormattedCountMessage()}</Typography>\n <Box marginTop={5}>\n <Table.Content>\n <Table.Head>\n <Table.HeaderCheckboxCell />\n {headers.map((head) => (\n <Table.HeaderCell key={head.name} {...head} />\n ))}\n </Table.Head>\n <Table.Body>\n {rows.map(({ locale, status }, index) => {\n const error = validationErrors?.[locale] ?? null;\n\n const statusVariant =\n status === 'draft' ? 'primary' : status === 'published' ? 'success' : 'alternative';\n\n return status && locale ? (\n <Table.Row key={index}>\n <Table.CheckboxCell id={locale} aria-label={`Select ${locale}`} />\n <Table.Cell>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {Array.isArray(localesMetadata)\n ? localesMetadata.find((localeEntry) => localeEntry.code === locale)?.name\n : locale}\n </Typography>\n </Table.Cell>\n <Table.Cell>\n <Box display=\"flex\">\n <Status\n display=\"flex\"\n paddingLeft=\"6px\"\n paddingRight=\"6px\"\n paddingTop=\"2px\"\n paddingBottom=\"2px\"\n size={'S'}\n variant={statusVariant}\n >\n <Typography tag=\"span\" variant=\"pi\" fontWeight=\"bold\">\n {capitalize(status)}\n </Typography>\n </Status>\n </Box>\n </Table.Cell>\n <Table.Cell>\n <EntryValidationText validationErrors={error} status={status} action={action} />\n </Table.Cell>\n <Table.Cell>\n <IconButton\n tag={Link}\n to={{\n search: stringify({ plugins: { i18n: { locale } } }),\n }}\n label={formatMessage(\n {\n id: getTranslation('Settings.list.actions.edit'),\n defaultMessage: 'Edit {name} locale',\n },\n {\n name: locale,\n }\n )}\n variant=\"ghost\"\n >\n <Pencil />\n </IconButton>\n </Table.Cell>\n </Table.Row>\n ) : null;\n })}\n </Table.Body>\n </Table.Content>\n </Box>\n </Modal.Body>\n );\n};\n\nexport { BulkLocaleActionModal };\nexport type { BulkLocaleActionModalProps, LocaleValidationErrors };\n"],"names":["isErrorMessageDescriptor","object","EntryValidationText","status","validationErrors","action","formatMessage","useIntl","getErrorStr","key","value","Array","isArray","map","v","join","Object","entries","k","validationErrorsMessages","_jsxs","Flex","gap","_jsx","CrossCircle","fill","Tooltip","label","Typography","maxWidth","textColor","variant","fontWeight","ellipsis","getStatusMessage","icon","CheckCircle","text","id","defaultMessage","ArrowsCounterClockwise","BoldChunk","chunks","BulkLocaleActionModal","headers","rows","localesMetadata","selectedRows","useTable","state","getFormattedCountMessage","currentStatusByLocale","reduce","acc","locale","localesWithErrors","keys","publishedCount","filter","length","draftCount","includes","withErrorsCount","messageId","b","Modal","Body","Box","marginTop","Table","Content","Head","HeaderCheckboxCell","head","HeaderCell","name","index","error","statusVariant","Row","CheckboxCell","aria-label","Cell","find","localeEntry","code","display","Status","paddingLeft","paddingRight","paddingTop","paddingBottom","size","tag","capitalize","IconButton","Link","to","search","stringify","plugins","i18n","getTranslation","Pencil"],"mappings":"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"}
1
+ {"version":3,"file":"BulkLocaleActionModal.mjs","sources":["../../../admin/src/components/BulkLocaleActionModal.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { FormErrors, Table, useTable } from '@strapi/admin/strapi-admin';\nimport { Box, Typography, IconButton, Flex, Tooltip, Status, Modal } from '@strapi/design-system';\nimport { Pencil, CheckCircle, CrossCircle, ArrowsCounterClockwise } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { type MessageDescriptor, useIntl, PrimitiveType } from 'react-intl';\nimport { Link } from 'react-router-dom';\n\nimport { Locale } from '../../../shared/contracts/locales';\nimport { getTranslation } from '../utils/getTranslation';\nimport { capitalize } from '../utils/strings';\n\nimport { LocaleStatus } from './CMHeaderActions';\n\nimport type { Modules } from '@strapi/types';\n\nconst EMPTY_VALIDATION_ERRORS: NonNullable<BulkLocaleActionModalProps['validationErrors']> = {};\n\ntype Status = Modules.Documents.Params.PublicationStatus.Kind | 'modified';\n\n/* -------------------------------------------------------------------------------------------------\n * EntryValidationText\n * -----------------------------------------------------------------------------------------------*/\n\ninterface EntryValidationTextProps {\n status: Status;\n validationErrors: FormErrors | null;\n action: 'bulk-publish' | 'bulk-unpublish';\n}\n\ninterface TranslationMessage extends MessageDescriptor {\n values?: Record<string, PrimitiveType>;\n}\n\ntype ValidationErrorValue =\n | string\n | TranslationMessage\n | ValidationErrorValue[]\n | { [key: string]: ValidationErrorValue | undefined };\n\ntype ValidationErrorRecord = Record<string, ValidationErrorValue | undefined>;\n\ntype LocaleValidationErrors = Partial<Record<string, FormErrors>>;\ntype LocaleTableRow = LocaleStatus & { id: string };\n\nconst isErrorMessageDescriptor = (object?: string | object): object is TranslationMessage => {\n return (\n typeof object === 'object' && object !== null && 'id' in object && 'defaultMessage' in object\n );\n};\n\nconst EntryValidationText = ({\n status = 'draft',\n validationErrors,\n action,\n}: EntryValidationTextProps) => {\n const { formatMessage } = useIntl();\n\n /**\n * TODO: Should this be extracted an made into a factory to recursively get\n * error messages??\n */\n const getErrorStr = (key: string, value?: ValidationErrorValue): string => {\n if (typeof value === 'string') {\n return `${key}: ${value}`;\n } else if (isErrorMessageDescriptor(value)) {\n return `${key}: ${formatMessage(value)}`;\n } else if (Array.isArray(value)) {\n return value.map((v) => getErrorStr(key, v)).join(' ');\n } else if (typeof value === 'object' && !Array.isArray(value)) {\n return Object.entries(value)\n .map(([k, v]) => getErrorStr(k, v))\n .join(' ');\n } else {\n /**\n * unlikely to happen, but we need to return something\n */\n return '';\n }\n };\n\n if (validationErrors !== null) {\n const validationErrorsMessages = Object.entries(validationErrors as ValidationErrorRecord)\n .map(([key, value]) => {\n return getErrorStr(key, value);\n })\n .join(' ');\n\n return (\n <Flex gap={2}>\n <CrossCircle fill=\"danger600\" />\n <Tooltip label={validationErrorsMessages}>\n <Typography\n maxWidth={'30rem'}\n textColor=\"danger600\"\n variant=\"omega\"\n fontWeight=\"semiBold\"\n ellipsis\n >\n {validationErrorsMessages}\n </Typography>\n </Tooltip>\n </Flex>\n );\n }\n\n const getStatusMessage = () => {\n if (action === 'bulk-publish') {\n if (status === 'published') {\n return {\n icon: <CheckCircle fill=\"success600\" />,\n text: formatMessage({\n id: 'content-manager.bulk-publish.already-published',\n defaultMessage: 'Already Published',\n }),\n textColor: 'success600',\n fontWeight: 'bold',\n };\n } else if (status === 'modified') {\n return {\n icon: <ArrowsCounterClockwise fill=\"alternative600\" />,\n text: formatMessage({\n id: 'app.utils.ready-to-publish-changes',\n defaultMessage: 'Ready to publish changes',\n }),\n };\n } else {\n return {\n icon: <CheckCircle fill=\"success600\" />,\n text: formatMessage({\n id: 'app.utils.ready-to-publish',\n defaultMessage: 'Ready to publish',\n }),\n };\n }\n } else {\n if (status === 'draft') {\n return {\n icon: <CheckCircle fill=\"success600\" />,\n text: formatMessage({\n id: 'content-manager.bulk-unpublish.already-unpublished',\n defaultMessage: 'Already Unpublished',\n }),\n textColor: 'success600',\n fontWeight: 'bold',\n };\n } else {\n return {\n icon: <CheckCircle fill=\"success600\" />,\n text: formatMessage({\n id: 'app.utils.ready-to-unpublish-changes',\n defaultMessage: 'Ready to unpublish',\n }),\n textColor: 'success600',\n fontWeight: 'bold',\n };\n }\n }\n };\n\n const { icon, text, textColor = 'success600', fontWeight = 'normal' } = getStatusMessage();\n\n return (\n <Flex gap={2}>\n {icon}\n <Typography textColor={textColor} fontWeight={fontWeight}>\n {text}\n </Typography>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * BoldChunk\n * -----------------------------------------------------------------------------------------------*/\n\nconst BoldChunk = (chunks: React.ReactNode) => <Typography fontWeight=\"bold\">{chunks}</Typography>;\n\n/* -------------------------------------------------------------------------------------------------\n * BulkLocaleActionModal\n * -----------------------------------------------------------------------------------------------*/\n\ninterface BulkLocaleActionModalProps {\n rows: LocaleStatus[];\n headers: {\n label: string;\n name: string;\n }[];\n localesMetadata: Locale[];\n validationErrors?: LocaleValidationErrors;\n action: 'bulk-publish' | 'bulk-unpublish';\n}\n\nconst BulkLocaleActionModal = ({\n headers,\n rows,\n localesMetadata,\n validationErrors = EMPTY_VALIDATION_ERRORS,\n action,\n}: BulkLocaleActionModalProps) => {\n const { formatMessage } = useIntl();\n\n const selectedRows = useTable(\n 'BulkLocaleActionModal',\n (state) => state.selectedRows\n ) as LocaleTableRow[];\n\n const getFormattedCountMessage = () => {\n const currentStatusByLocale = rows.reduce<Record<string, string>>((acc, { locale, status }) => {\n acc[locale] = status;\n return acc;\n }, {});\n const localesWithErrors = Object.keys(validationErrors);\n\n const publishedCount = selectedRows.filter(\n ({ locale }) => currentStatusByLocale[locale] === 'published'\n ).length;\n\n const draftCount = selectedRows.filter(\n ({ locale }) =>\n (currentStatusByLocale[locale] === 'draft' ||\n currentStatusByLocale[locale] === 'modified') &&\n !localesWithErrors.includes(locale)\n ).length;\n\n const withErrorsCount = localesWithErrors.length;\n const messageId =\n action === 'bulk-publish'\n ? 'content-manager.containers.list.selectedEntriesModal.selectedCount.publish'\n : 'content-manager.containers.list.selectedEntriesModal.selectedCount.unpublish';\n\n const defaultMessage =\n action === 'bulk-publish'\n ? '<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.'\n : '<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.';\n\n return formatMessage(\n {\n id: messageId,\n defaultMessage,\n },\n {\n withErrorsCount,\n draftCount,\n publishedCount,\n b: BoldChunk,\n }\n );\n };\n\n return (\n <Modal.Body>\n <Typography>{getFormattedCountMessage()}</Typography>\n <Box marginTop={5}>\n <Table.Content>\n <Table.Head>\n <Table.HeaderCheckboxCell />\n {headers.map((head) => (\n <Table.HeaderCell key={head.name} {...head} />\n ))}\n </Table.Head>\n <Table.Body>\n {rows.map(({ locale, status }) => {\n const error = validationErrors?.[locale] ?? null;\n\n const statusVariant =\n status === 'draft' ? 'primary' : status === 'published' ? 'success' : 'alternative';\n\n return status && locale ? (\n <Table.Row key={locale}>\n <Table.CheckboxCell id={locale} aria-label={`Select ${locale}`} />\n <Table.Cell>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {Array.isArray(localesMetadata)\n ? localesMetadata.find((localeEntry) => localeEntry.code === locale)?.name\n : locale}\n </Typography>\n </Table.Cell>\n <Table.Cell>\n <Box display=\"flex\">\n <Status\n display=\"flex\"\n paddingLeft=\"6px\"\n paddingRight=\"6px\"\n paddingTop=\"2px\"\n paddingBottom=\"2px\"\n size={'S'}\n variant={statusVariant}\n >\n <Typography tag=\"span\" variant=\"pi\" fontWeight=\"bold\">\n {capitalize(status)}\n </Typography>\n </Status>\n </Box>\n </Table.Cell>\n <Table.Cell>\n <EntryValidationText validationErrors={error} status={status} action={action} />\n </Table.Cell>\n <Table.Cell>\n <IconButton\n tag={Link}\n to={{\n search: stringify({ plugins: { i18n: { locale } } }),\n }}\n label={formatMessage(\n {\n id: getTranslation('Settings.list.actions.edit'),\n defaultMessage: 'Edit {name} locale',\n },\n {\n name: locale,\n }\n )}\n variant=\"ghost\"\n >\n <Pencil />\n </IconButton>\n </Table.Cell>\n </Table.Row>\n ) : null;\n })}\n </Table.Body>\n </Table.Content>\n </Box>\n </Modal.Body>\n );\n};\n\nexport { BulkLocaleActionModal };\nexport type { BulkLocaleActionModalProps, LocaleValidationErrors };\n"],"names":["EMPTY_VALIDATION_ERRORS","isErrorMessageDescriptor","object","EntryValidationText","status","validationErrors","action","formatMessage","useIntl","getErrorStr","key","value","Array","isArray","map","v","join","Object","entries","k","validationErrorsMessages","_jsxs","Flex","gap","_jsx","CrossCircle","fill","Tooltip","label","Typography","maxWidth","textColor","variant","fontWeight","ellipsis","getStatusMessage","icon","CheckCircle","text","id","defaultMessage","ArrowsCounterClockwise","BoldChunk","chunks","BulkLocaleActionModal","headers","rows","localesMetadata","selectedRows","useTable","state","getFormattedCountMessage","currentStatusByLocale","reduce","acc","locale","localesWithErrors","keys","publishedCount","filter","length","draftCount","includes","withErrorsCount","messageId","b","Modal","Body","Box","marginTop","Table","Content","Head","HeaderCheckboxCell","head","HeaderCell","name","error","statusVariant","Row","CheckboxCell","aria-label","Cell","find","localeEntry","code","display","Status","paddingLeft","paddingRight","paddingTop","paddingBottom","size","tag","capitalize","IconButton","Link","to","search","stringify","plugins","i18n","getTranslation","Pencil"],"mappings":"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"}
@@ -222,7 +222,7 @@ const LocalePickerAction = ({ document, meta, model, collectionType, documentId
222
222
  })
223
223
  })
224
224
  ]
225
- }, index)
225
+ }, locale.code)
226
226
  };
227
227
  }
228
228
  return {