@@ -133,9 +152,9 @@ function ActionsDropdownMenuGroup( { actions, item, setActiveModalAction } ) {
setActiveModalAction( action );
return;
}
- action.callback( [ item ], { registry } );
+ action.callback( items, { registry } );
} }
- items={ [ item ] }
+ items={ items }
/>
);
} ) }
diff --git a/packages/editor/src/components/post-card-panel/index.js b/packages/editor/src/components/post-card-panel/index.js
index e347d3c79fc521..7849f014ab49c8 100644
--- a/packages/editor/src/components/post-card-panel/index.js
+++ b/packages/editor/src/components/post-card-panel/index.js
@@ -4,11 +4,13 @@
import {
Icon,
__experimentalHStack as HStack,
+ __experimentalVStack as VStack,
__experimentalText as Text,
} from '@wordpress/components';
import { store as coreStore } from '@wordpress/core-data';
import { useSelect } from '@wordpress/data';
-import { __ } from '@wordpress/i18n';
+import { useMemo } from '@wordpress/element';
+import { __, sprintf } from '@wordpress/i18n';
import { decodeEntities } from '@wordpress/html-entities';
/**
@@ -24,50 +26,77 @@ import PostActions from '../post-actions';
import usePageTypeBadge from '../../utils/pageTypeBadge';
import { getTemplateInfo } from '../../utils/get-template-info';
+/**
+ * Renders a title of the post type and the available quick actions available within a 3-dot dropdown.
+ *
+ * @param {Object} props - Component props.
+ * @param {string} [props.postType] - The post type string.
+ * @param {string|string[]} [props.postId] - The post id or list of post ids.
+ * @param {Function} [props.onActionPerformed] - A callback function for when a quick action is performed.
+ * @return {React.ReactNode} The rendered component.
+ */
export default function PostCardPanel( {
postType,
postId,
onActionPerformed,
} ) {
- const { title, icon } = useSelect(
+ const postIds = useMemo(
+ () => ( Array.isArray( postId ) ? postId : [ postId ] ),
+ [ postId ]
+ );
+ const { postTitle, icon, labels } = useSelect(
( select ) => {
- const { getEditedEntityRecord } = select( coreStore );
+ const { getEditedEntityRecord, getEntityRecord, getPostType } =
+ select( coreStore );
+ const { getPostIcon } = unlock( select( editorStore ) );
+ let _title = '';
const _record = getEditedEntityRecord(
'postType',
postType,
- postId
+ postIds[ 0 ]
);
+ if ( postIds.length === 1 ) {
+ const { default_template_types: templateTypes = [] } =
+ getEntityRecord( 'root', '__unstableBase' ) ?? {};
- const { default_template_types: templateTypes = [] } =
- select( coreStore ).getEntityRecord(
- 'root',
- '__unstableBase'
- ) ?? {};
-
- const _templateInfo = [
- TEMPLATE_POST_TYPE,
- TEMPLATE_PART_POST_TYPE,
- ].includes( postType )
- ? getTemplateInfo( {
- template: _record,
- templateTypes,
- } )
- : {};
+ const _templateInfo = [
+ TEMPLATE_POST_TYPE,
+ TEMPLATE_PART_POST_TYPE,
+ ].includes( postType )
+ ? getTemplateInfo( {
+ template: _record,
+ templateTypes,
+ } )
+ : {};
+ _title = _templateInfo?.title || _record?.title;
+ }
return {
- title: _templateInfo?.title || _record?.title,
- icon: unlock( select( editorStore ) ).getPostIcon( postType, {
+ postTitle: _title,
+ icon: getPostIcon( postType, {
area: _record?.area,
} ),
+ labels: getPostType( postType )?.labels,
};
},
- [ postId, postType ]
+ [ postIds, postType ]
);
const pageTypeBadge = usePageTypeBadge( postId );
+ let title = __( 'No title' );
+ if ( labels?.name && postIds.length > 1 ) {
+ title = sprintf(
+ // translators: %i number of selected items %s: Name of the plural post type e.g: "Posts".
+ __( '%i %s' ),
+ postId.length,
+ labels?.name
+ );
+ } else if ( postTitle ) {
+ title = decodeEntities( postTitle );
+ }
return (
-
+
- { title ? decodeEntities( title ) : __( 'No title' ) }
- { pageTypeBadge && (
+ { title }
+ { pageTypeBadge && postIds.length === 1 && (
{ pageTypeBadge }
@@ -93,6 +122,15 @@ export default function PostCardPanel( {
onActionPerformed={ onActionPerformed }
/>
-
+ { postIds.length > 1 && (
+
+ { sprintf(
+ // translators: %s: Name of the plural post type e.g: "Posts".
+ __( 'Changes will be applied to all selected %s.' ),
+ labels?.name.toLowerCase()
+ ) }
+
+ ) }
+