diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicTable/BulkActionsBar/index.js b/packages/core/admin/admin/src/content-manager/components/DynamicTable/BulkActionsBar/index.js
index b163a2e598..529c7748d4 100644
--- a/packages/core/admin/admin/src/content-manager/components/DynamicTable/BulkActionsBar/index.js
+++ b/packages/core/admin/admin/src/content-manager/components/DynamicTable/BulkActionsBar/index.js
@@ -4,20 +4,22 @@ import { Button } from '@strapi/design-system';
import { useIntl } from 'react-intl';
import { useTracking } from '@strapi/helper-plugin';
import ConfirmDialogDeleteAll from '../ConfirmDialogDeleteAll';
+import ConfirmDialogPublishAll from '../ConfirmDialogPublishAll';
const BulkActionsBar = ({
showPublish,
showDelete,
onConfirmDeleteAll,
+ onConfirmPublishAll,
selectedEntries,
clearSelectedEntries,
}) => {
const { formatMessage } = useIntl();
const { trackUsage } = useTracking();
-
const [isConfirmButtonLoading, setIsConfirmButtonLoading] = useState(false);
- const [showConfirmDeleteAll, setShowConfirmDeleteAll] = useState(false);
+ // Bulk delete
+ const [showConfirmDeleteAll, setShowConfirmDeleteAll] = useState(false);
const handleToggleShowDeleteAllModal = () => {
if (!showConfirmDeleteAll) {
trackUsage('willBulkDeleteEntries');
@@ -39,16 +41,45 @@ const BulkActionsBar = ({
}
};
+ // Bulk publish
+ const [showConfirmPublishAll, setShowConfirmPublishAll] = useState(false);
+ const handleToggleShowPublishAllModal = () => {
+ if (!showConfirmPublishAll) {
+ trackUsage('willBulkPublishEntries');
+ }
+
+ setShowConfirmPublishAll((prev) => !prev);
+ };
+
+ const handleConfirmPublishAll = async () => {
+ try {
+ setIsConfirmButtonLoading(true);
+ await onConfirmPublishAll(selectedEntries);
+ handleToggleShowPublishAllModal();
+ clearSelectedEntries();
+ setIsConfirmButtonLoading(false);
+ } catch (err) {
+ setIsConfirmButtonLoading(false);
+ handleToggleShowPublishAllModal();
+ }
+ };
+
return (
<>
{showPublish && (
<>
-
+ }
+ endAction={
+ }
+ id="confirm-publish"
+ loading={isConfirmButtonLoading}
+ >
+ {formatMessage({
+ id: 'app.utils.publish',
+ defaultMessage: 'Publish',
+ })}
+
+ }
+ />
+
+ );
+};
+
+ConfirmDialogPublishAll.propTypes = {
+ isConfirmButtonLoading: PropTypes.bool.isRequired,
+ isOpen: PropTypes.bool.isRequired,
+ onConfirm: PropTypes.func.isRequired,
+ onToggleDialog: PropTypes.func.isRequired,
+};
+
+export default ConfirmDialogPublishAll;
diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicTable/index.js b/packages/core/admin/admin/src/content-manager/components/DynamicTable/index.js
index 15f439be18..d23aa0f857 100644
--- a/packages/core/admin/admin/src/content-manager/components/DynamicTable/index.js
+++ b/packages/core/admin/admin/src/content-manager/components/DynamicTable/index.js
@@ -23,6 +23,7 @@ const DynamicTable = ({
isLoading,
onConfirmDelete,
onConfirmDeleteAll,
+ onConfirmPublishAll,
layout,
rows,
}) => {
@@ -105,6 +106,7 @@ const DynamicTable = ({
showPublish={canPublish && hasDraftAndPublish}
showDelete={canDelete}
onConfirmDeleteAll={onConfirmDeleteAll}
+ onConfirmPublishAll={onConfirmPublishAll}
selectedEntries={selectedEntries}
clearSelectedEntries={clearSelectedEntries}
/>
@@ -149,6 +151,7 @@ DynamicTable.propTypes = {
}).isRequired,
onConfirmDelete: PropTypes.func.isRequired,
onConfirmDeleteAll: PropTypes.func.isRequired,
+ onConfirmPublishAll: PropTypes.func.isRequired,
rows: PropTypes.array.isRequired,
};
diff --git a/packages/core/admin/admin/src/content-manager/pages/ListView/index.js b/packages/core/admin/admin/src/content-manager/pages/ListView/index.js
index 0ab7b436dd..f1ae66a3f6 100644
--- a/packages/core/admin/admin/src/content-manager/pages/ListView/index.js
+++ b/packages/core/admin/admin/src/content-manager/pages/ListView/index.js
@@ -179,6 +179,11 @@ function ListView({
[fetchData, params, slug, toggleNotification, formatAPIError, post]
);
+ const handleConfirmPublishAllData = (ids) => {
+ // TODO make a request to the API and refetch the data
+ console.log('Publishing all data', ids);
+ };
+
const handleConfirmDeleteData = useCallback(
async (idToDelete) => {
try {
@@ -334,8 +339,9 @@ function ListView({
canDelete={canDelete}
canPublish={canPublish}
contentTypeName={headerLayoutTitle}
- onConfirmDeleteAll={handleConfirmDeleteAllData}
onConfirmDelete={handleConfirmDeleteData}
+ onConfirmDeleteAll={handleConfirmDeleteAllData}
+ onConfirmPublishAll={handleConfirmPublishAllData}
isBulkable={isBulkable}
isLoading={isLoading}
// FIXME: remove the layout props drilling
diff --git a/packages/core/admin/admin/src/injectionZones.js b/packages/core/admin/admin/src/injectionZones.js
index 533e29132b..600964780c 100644
--- a/packages/core/admin/admin/src/injectionZones.js
+++ b/packages/core/admin/admin/src/injectionZones.js
@@ -13,7 +13,11 @@ const injectionZones = {
},
contentManager: {
editView: { informations: [], 'right-links': [] },
- listView: { actions: [], deleteModalAdditionalInfos: [] },
+ listView: {
+ actions: [],
+ deleteModalAdditionalInfos: [],
+ publishModalAdditionalInfos: [],
+ },
},
};
diff --git a/packages/core/admin/admin/src/translations/en.json b/packages/core/admin/admin/src/translations/en.json
index 8c86484b0c..02fc116da4 100644
--- a/packages/core/admin/admin/src/translations/en.json
+++ b/packages/core/admin/admin/src/translations/en.json
@@ -792,7 +792,8 @@
"content-manager.plugin.description.long": "Quick way to see, edit and delete the data in your database.",
"content-manager.plugin.description.short": "Quick way to see, edit and delete the data in your database.",
"content-manager.popUpWarning.bodyMessage.contentType.delete": "Are you sure to delete Content-Type?",
- "content-manager.popUpWarning.bodyMessage.contentType.delete.all": "Are you sure to delete all Content-Types?",
+ "content-manager.popUpWarning.bodyMessage.contentType.delete.all": "Are you sure you want to delete these entries?",
+ "content-manager.popUpWarning.bodyMessage.contentType.publish.all": "Are you sure you want to publish these entries?",
"content-manager.popUpWarning.warning.has-draft-relations.title": "Confirmation",
"content-manager.popUpWarning.warning.publish-question": "Do you still want to publish?",
"content-manager.popUpWarning.warning.unpublish": "If you don't publish this content, it will automatically turn into a Draft.",
diff --git a/packages/plugins/i18n/admin/src/components/CMListViewInjectedComponents/DeleteModalAdditionalInfos/index.js b/packages/plugins/i18n/admin/src/components/CMListViewInjectedComponents/DeleteModalAdditionalInfos/index.js
index f71e2972e5..615c152b51 100644
--- a/packages/plugins/i18n/admin/src/components/CMListViewInjectedComponents/DeleteModalAdditionalInfos/index.js
+++ b/packages/plugins/i18n/admin/src/components/CMListViewInjectedComponents/DeleteModalAdditionalInfos/index.js
@@ -4,6 +4,14 @@ import { Typography } from '@strapi/design-system';
import { getTrad } from '../../../utils';
import useHasI18n from '../../../hooks/useHasI18n';
+const Emphasis = (chunks) => {
+ return (
+
+ {chunks}
+
+ );
+};
+
const DeleteModalAdditionalInfos = () => {
const hasI18nEnabled = useHasI18n();
const { formatMessage } = useIntl();
@@ -21,11 +29,7 @@ const DeleteModalAdditionalInfos = () => {
'This will delete the active locale versions (from Internationalization)',
},
{
- em: (chunks) => (
-
- {chunks}
-
- ),
+ em: Emphasis,
}
)}
diff --git a/packages/plugins/i18n/admin/src/components/CMListViewInjectedComponents/PublishModalAdditionalInfos/index.js b/packages/plugins/i18n/admin/src/components/CMListViewInjectedComponents/PublishModalAdditionalInfos/index.js
new file mode 100644
index 0000000000..cd7d32f1ff
--- /dev/null
+++ b/packages/plugins/i18n/admin/src/components/CMListViewInjectedComponents/PublishModalAdditionalInfos/index.js
@@ -0,0 +1,39 @@
+import React from 'react';
+import { useIntl } from 'react-intl';
+import { Typography } from '@strapi/design-system';
+import { getTrad } from '../../../utils';
+import useHasI18n from '../../../hooks/useHasI18n';
+
+const Emphasis = (chunks) => {
+ return (
+
+ {chunks}
+
+ );
+};
+
+const PublishModalAdditionalInfos = () => {
+ const hasI18nEnabled = useHasI18n();
+ const { formatMessage } = useIntl();
+
+ if (!hasI18nEnabled) {
+ return null;
+ }
+
+ return (
+
+ {formatMessage(
+ {
+ id: getTrad('Settings.list.actions.publishAdditionalInfos'),
+ defaultMessage:
+ 'This will publish the active locale versions (from Internationalization)',
+ },
+ {
+ em: Emphasis,
+ }
+ )}
+
+ );
+};
+
+export default PublishModalAdditionalInfos;
diff --git a/packages/plugins/i18n/admin/src/index.js b/packages/plugins/i18n/admin/src/index.js
index 0d6a0ae0b7..42fca5b7d7 100644
--- a/packages/plugins/i18n/admin/src/index.js
+++ b/packages/plugins/i18n/admin/src/index.js
@@ -14,6 +14,7 @@ import mutateCTBContentTypeSchema from './utils/mutateCTBContentTypeSchema';
import LOCALIZED_FIELDS from './utils/localizedFields';
import i18nReducers from './hooks/reducers';
import DeleteModalAdditionalInfos from './components/CMListViewInjectedComponents/DeleteModalAdditionalInfos';
+import PublishModalAdditionalInfos from './components/CMListViewInjectedComponents/PublishModalAdditionalInfos';
import addLocaleToCollectionTypesLinksHook from './contentManagerHooks/addLocaleToCollectionTypesLinks';
import addLocaleToSingleTypesLinksHook from './contentManagerHooks/addLocaleToSingleTypesLinks';
import addColumnToTableHook from './contentManagerHooks/addColumnToTable';
@@ -82,6 +83,11 @@ export default {
Component: DeleteModalAdditionalInfos,
});
+ app.injectContentManagerComponent('listView', 'publishModalAdditionalInfos', {
+ name: 'i18n-delete-bullets-in-modal',
+ Component: PublishModalAdditionalInfos,
+ });
+
const ctbPlugin = app.getPlugin('content-type-builder');
if (ctbPlugin) {
diff --git a/packages/plugins/i18n/admin/src/translations/en.json b/packages/plugins/i18n/admin/src/translations/en.json
index b6fe6472db..3cb235f4af 100644
--- a/packages/plugins/i18n/admin/src/translations/en.json
+++ b/packages/plugins/i18n/admin/src/translations/en.json
@@ -12,6 +12,7 @@
"Settings.list.actions.add": "Add new locale",
"Settings.list.actions.delete": "Delete a locale",
"Settings.list.actions.deleteAdditionalInfos": "This will delete the active locale versions (from Internationalization)",
+ "Settings.list.actions.publishAdditionalInfos": "This will publish only the active locale versions (from Internationalization)",
"Settings.list.actions.edit": "Edit a locale",
"Settings.list.description": "Configure the settings for the Internationalization plugin",
"Settings.list.empty.description": "This is not a usual behavior, meaning that you have eventually modified the database manually. Make sure to have at least one locale saved in your database in order to be able to use Strapi correctly.",