Add Tasklist extensibility and WooOnboardingTaskListHeader SlotFill (#36519)

* Add experimental onboarding_tasklist PHP filter

* Add WooOnboardingTaskListHeader and woocommerce_onboarding_task_list_header Slot to task list

* Changelog

* Fix header task logic

* Remove React FC types

* Update changelog

* Fix comment
This commit is contained in:
Ilyas Foo 2023-01-21 15:19:20 +08:00 committed by GitHub
parent 39cd780e18
commit 30a4bdefd8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 77 additions and 3 deletions

View File

@ -0,0 +1,4 @@
Significance: minor
Type: add
Add WooOnboardingTaskListHeader component

View File

@ -0,0 +1,37 @@
/**
* External dependencies
*/
import { createElement } from '@wordpress/element';
import { Slot, Fill } from '@wordpress/components';
type WooOnboardingTaskListHeaderProps = {
id: string;
};
/**
* A Fill for adding Onboarding Task List headers.
*
* @slotFill WooOnboardingTaskListHeader
* @scope woocommerce-tasks
* @param {Object} props React props.
* @param {string} props.id Task id.
*/
export const WooOnboardingTaskListHeader = ( {
id,
...props
}: WooOnboardingTaskListHeaderProps & Slot.Props ) => (
<Fill
name={ 'woocommerce_onboarding_task_list_header_' + id }
{ ...props }
/>
);
WooOnboardingTaskListHeader.Slot = ( {
id,
fillProps,
}: WooOnboardingTaskListHeaderProps & Slot.Props ) => (
<Slot
name={ 'woocommerce_onboarding_task_list_header_' + id }
fillProps={ fillProps }
/>
);

View File

@ -0,0 +1 @@
export * from './WooOnboardingTaskListHeader';

View File

@ -13,4 +13,5 @@ export { default as WCPayLogo } from './images/wcpay-logo';
export { WooPaymentGatewaySetup } from './components/WooPaymentGatewaySetup'; export { WooPaymentGatewaySetup } from './components/WooPaymentGatewaySetup';
export { WooPaymentGatewayConfigure } from './components/WooPaymentGatewayConfigure'; export { WooPaymentGatewayConfigure } from './components/WooPaymentGatewayConfigure';
export { WooOnboardingTaskListItem } from './components/WooOnboardingTaskListItem'; export { WooOnboardingTaskListItem } from './components/WooOnboardingTaskListItem';
export { WooOnboardingTaskListHeader } from './components/WooOnboardingTaskListHeader';
export { WooOnboardingTask } from './components/WooOnboardingTask'; export { WooOnboardingTask } from './components/WooOnboardingTask';

View File

@ -13,6 +13,7 @@ import { Button, Card } from '@wordpress/components';
import { useSelect, useDispatch } from '@wordpress/data'; import { useSelect, useDispatch } from '@wordpress/data';
import { EllipsisMenu } from '@woocommerce/components'; import { EllipsisMenu } from '@woocommerce/components';
import { navigateTo, getNewPath } from '@woocommerce/navigation'; import { navigateTo, getNewPath } from '@woocommerce/navigation';
import { WooOnboardingTaskListHeader } from '@woocommerce/onboarding';
import { import {
ONBOARDING_STORE_NAME, ONBOARDING_STORE_NAME,
TaskType, TaskType,
@ -169,6 +170,15 @@ export const TaskList: React.FC< TaskListProps > = ( {
selectedHeaderCard = visibleTasks[ visibleTasks.length - 1 ]; selectedHeaderCard = visibleTasks[ visibleTasks.length - 1 ];
} }
const taskListHeaderSlot = useSlot(
`woocommerce_onboarding_task_list_header_${
headerData?.task?.id ?? selectedHeaderCard?.id
}`
);
const hasTaskListHeaderSlotFills = Boolean(
taskListHeaderSlot?.fills?.length
);
const getTaskStartedCount = ( taskId: string ) => { const getTaskStartedCount = ( taskId: string ) => {
const trackedStartedTasks = const trackedStartedTasks =
userPreferences.task_list_tracked_started_tasks; userPreferences.task_list_tracked_started_tasks;
@ -217,7 +227,7 @@ export const TaskList: React.FC< TaskListProps > = ( {
}; };
const showTaskHeader = ( task: TaskType ) => { const showTaskHeader = ( task: TaskType ) => {
if ( taskHeaders[ task.id ] ) { if ( taskHeaders[ task.id ] || hasTaskListHeaderSlotFills ) {
setHeaderData( { setHeaderData( {
task, task,
goToTask: () => goToTask( task ), goToTask: () => goToTask( task ),
@ -296,10 +306,17 @@ export const TaskList: React.FC< TaskListProps > = ( {
> >
<div className="wooocommerce-task-card__header-container"> <div className="wooocommerce-task-card__header-container">
<div className="wooocommerce-task-card__header"> <div className="wooocommerce-task-card__header">
{ headerData?.task && { hasTaskListHeaderSlotFills ? (
<WooOnboardingTaskListHeader.Slot
id={ selectedHeaderCard?.id }
fillProps={ headerData }
/>
) : (
headerData?.task &&
createElement( createElement(
taskHeaders[ headerData.task.id ], taskHeaders[ headerData.task.id ],
headerData headerData
)
) } ) }
</div> </div>
{ ! displayProgressHeader && renderMenu() } { ! displayProgressHeader && renderMenu() }

View File

@ -0,0 +1,4 @@
Significance: minor
Type: add
Add WooOnboardingTaskListHeader, woocommerce_admin_experimental_onboarding_tasklists filter, and woocommerce_onboarding_task_list_header Slot to task list

View File

@ -227,6 +227,16 @@ class TaskLists {
self::add_task( 'extended', $tour_task ); self::add_task( 'extended', $tour_task );
self::add_task( 'extended_two_column', $tour_task ); self::add_task( 'extended_two_column', $tour_task );
} }
if ( has_filter( 'woocommerce_admin_experimental_onboarding_tasklists' ) ) {
/**
* Filter to override default task lists.
*
* @since 7.4
* @param array $lists Array of tasklists.
*/
self::$lists = apply_filters( 'woocommerce_admin_experimental_onboarding_tasklists', self::$lists );
}
} }
/** /**