From b8aa7eb1fe70b35d6ab61505a6eaa2065ad6bf0a Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Thu, 18 May 2023 11:21:53 +0800 Subject: [PATCH] Update task list documentation and example (#38245) * Update woocommerce task list examples * Update onboarding-tasks.md * Add changelog * Update changelog * Update task list doc * Update onboarding-tasks.md * Update examples readme * Fix lint * Update onboarding-tasks.md * Fix build wca example cmd * Update plugins/woocommerce-admin/docs/features/onboarding-tasks.md Co-authored-by: Ilyas Foo * Update plugins/woocommerce-admin/docs/features/onboarding-tasks.md Co-authored-by: Ilyas Foo * Update plugins/woocommerce-admin/docs/features/onboarding-tasks.md Co-authored-by: Ilyas Foo * Update plugins/woocommerce-admin/docs/features/onboarding-tasks.md Co-authored-by: Ilyas Foo * Update task list image --------- Co-authored-by: Ilyas Foo --- .../docs/examples/extensions/README.md | 6 +- .../extensions/add-task/class-mytask.php | 49 +++ .../examples/extensions/add-task/js/index.js | 36 +- .../woocommerce-admin-add-task-example.php | 25 +- .../docs/features/images/task-list.png | Bin 0 -> 74479 bytes .../docs/features/onboarding-tasks.md | 375 +++++++++++++----- .../dev-update-task-list-docs-example | 4 + 7 files changed, 361 insertions(+), 134 deletions(-) create mode 100644 plugins/woocommerce-admin/docs/examples/extensions/add-task/class-mytask.php create mode 100644 plugins/woocommerce-admin/docs/features/images/task-list.png create mode 100644 plugins/woocommerce/changelog/dev-update-task-list-docs-example diff --git a/plugins/woocommerce-admin/docs/examples/extensions/README.md b/plugins/woocommerce-admin/docs/examples/extensions/README.md index 3141c7c7fd3..26689221298 100644 --- a/plugins/woocommerce-admin/docs/examples/extensions/README.md +++ b/plugins/woocommerce-admin/docs/examples/extensions/README.md @@ -12,11 +12,12 @@ pnpm install Build the example extension by running the pnpm script and passing the example name. + ```bash -WC_EXT= pnpm example --filter=woocommerce/client/admin +WC_EXT= pnpm --filter=woocommerce/client/admin example ``` -Include the output plugin in your `.wp-env.json` and `.wp-env.override.json` and restart the WordPress instance. WooCommerce Analytics reports will now reflect the changes made by the example extension. +You should see a new directory in `./woocommerce/plugins/{example} path.` Include the output plugin in your `.wp-env.json` or `.wp-env.override.json` and restart the WordPress instance. WooCommerce will now reflect the changes made by the example extension. You can make changes to Javascript and PHP files in the example and see changes reflected upon refresh. @@ -27,3 +28,4 @@ You can make changes to Javascript and PHP files in the example and see changes - `dashboard-section` - Adding a custom "section" to the new dashboard area. - `table-column` - An example of how to add column(s) to any report. - `sql-modification` - An example of how to modify SQL statements. +- `payment-gateway-suggestions` - An example of how to add a new payment gateway suggestion diff --git a/plugins/woocommerce-admin/docs/examples/extensions/add-task/class-mytask.php b/plugins/woocommerce-admin/docs/examples/extensions/add-task/class-mytask.php new file mode 100644 index 00000000000..62555ce82ca --- /dev/null +++ b/plugins/woocommerce-admin/docs/examples/extensions/add-task/class-mytask.php @@ -0,0 +1,49 @@ + { const { actionTask } = useDispatch( ONBOARDING_STORE_NAME ); @@ -46,10 +50,32 @@ const Task = ( { onComplete, task } ) => { registerPlugin( 'add-task-content', { render: () => ( - { ( { onComplete, query, task } ) => ( - - ) } + { ( { + onComplete, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + query, + task, + } ) => } ), scope: 'woocommerce-tasks', } ); + +registerPlugin( 'my-task-list-item-plugin', { + scope: 'woocommerce-tasks', + render: () => ( + + { ( { defaultTaskItem: DefaultTaskItem } ) => ( + // Add a custom wrapper around the default task item. +
+ +
+ ) } +
+ ), +} ); diff --git a/plugins/woocommerce-admin/docs/examples/extensions/add-task/woocommerce-admin-add-task-example.php b/plugins/woocommerce-admin/docs/examples/extensions/add-task/woocommerce-admin-add-task-example.php index 552ff2a841a..f8ed4e6ace7 100644 --- a/plugins/woocommerce-admin/docs/examples/extensions/add-task/woocommerce-admin-add-task-example.php +++ b/plugins/woocommerce-admin/docs/examples/extensions/add-task/woocommerce-admin-add-task-example.php @@ -5,29 +5,18 @@ * @package WooCommerce\Admin */ -use Automattic\WooCommerce\Internal\Admin\Onboarding; -use Automattic\WooCommerce\Admin\Features\OnboardingTasks\Task; -use Automattic\WooCommerce\Admin\Features\OnboardingTasks\TaskLists; - /** * Register the task. */ function add_task_my_task() { - TaskLists::add_task( + require_once __DIR__ . '/class-mytask.php'; + $task_lists = \Automattic\WooCommerce\Admin\Features\OnboardingTasks\TaskLists::instance(); + + // Add the task to the extended list. + $task_lists::add_task( 'extended', - array( - 'id' => 'my-task', - 'title' => __( 'My task', 'woocommerce-admin' ), - 'content' => __( - 'Add your task description here for display in the task list.', - 'woocommerce-admin' - ), - 'action_label' => __( 'Do action', 'woocommerce-admin' ), - 'is_complete' => Task::is_task_actioned( 'my-task' ), - 'can_view' => 'US' === WC()->countries->get_base_country(), - 'time' => __( '2 minutes', 'woocommerce-admin' ), - 'is_dismissable' => true, - 'is_snoozeable' => true, + new MyTask( + $task_lists::get_list( 'extended' ), ) ); } diff --git a/plugins/woocommerce-admin/docs/features/images/task-list.png b/plugins/woocommerce-admin/docs/features/images/task-list.png new file mode 100644 index 0000000000000000000000000000000000000000..858ce48675126ad57d5f61da7952e3aeae5b56f3 GIT binary patch literal 74479 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

WMR2+{p0GP&IH@1!Ye5-wm{2tM_EaaJwD|QB_a& z5T5m|BDj^}CTERj8>fi<%mwahz}R4Tn5GKOYU|-tk zEM@K%)}bnqO9#6jchceR;p^KW=TkV)g+t_;gY#ZKBfXQhHz}}VRxMUhb+2I6LEa-) zTBh=R07smJO+B(W`7@BGseEr{h}gz&RoIud=w^f4(?eDenxbKKQu1!xPv>38{DJ!_+t(>}o1F5I*8Nr$603 z-u6<-np?%XzF9M{0TB}5cQ4;b+pp>=v_A>ze>SSN6T-v zVU;AYTdD5%@TIL89#6B)O7wNH&_+guvK$aOt3`1!X|xZxpp#tSwhIpQslx<$V*)G; zvgByYz+roXKSb^vOObPFnH#XA*9JM+>;bn{T=_C}9GrIiE~CBZC_(c2E= zx1<0ch5AUy7_n21r{Bp8*O3Da(+eD*Mj~XG%7?GK9Oeglm**9A%F+bIX36E*;7cjL zg`-53E!<(LTHl8(DX~s25<@%_Cb&@OML`mw4YkCKLpkC+=izVbP~`aziv-NTNm z&26WEuKEOm`?@i&afQ0Ve7rx5Lv%wnCa(A#Voi|C`q-g^;vvd08gtP8sNAxYsZM6C z8*el5O4Gz)n&D^;oTyHcXHbqf`l0p)XBJxqLO|%#npOr(^29p72l{%M^S@7aeLp z*W_LybBqw&+_XM07w?XnW3*|NU)&?1t#~r)w?DQv5JL*eGRKal?L#DHP$l4#v@%S7 zsI$Jc&JJLPhd%Kr1W{jP?8k9HdVwOV^ZXaGTzzWHZvqT_QhjICVC*_w@=?H!8r2^Y zdO;Va7C`WPn14gP`E7s=Gf4n|U8R=qTuVu(fqXZx8*OJNNKZNL0LCBH*RXW%rcaov zOlhE43W$YZu6p}geS7u4>m+H(Dvdvg&h*OrKs3)D|2ZX}u!DaDvb2Kf3Ys=;S)rJ2 zaSh@lPMTc_y;isjf8+=GrIWN76aTmxc^9WEtI0^yqDyXZ)Z032tB;L=@H9&&0PR)q zO{{~duK@EAJ6AC2TgDBd6`n!g+Kqdeaa-nEpc=Tre^9F0+AQVXzyqfU<~-KGFSv+)QJ^QD zIcRjU)85V_$epvx^XChAl3=)^+2ls2fz6B*t{e+G0QT$!g>|3(<-l!%kGv{??iG1d z!F>Z(;nmy8N~a8UYN8|q=G(+YJlTppZ>aI=c=68;=(`l}#mcP^sV&sNL5^?N&Sk-7rQ z6N#8Ni|6Sh5$anWBy!)$-Ck=R8Lf7y2VK%YI0+ED)r<%wPA`(%wM?3kUAne@t45vJLbGL@TXjDZQ4WI|| zTp&(7V0g0fqvhrB7@Ea3I~96{G12BWtZjYO3ou$4WzkrwXMNdWw6yyCVO)P=Ny&o| zLnTQbp!b8lk|<*PRTb`w&eJ2uHOL|1YcA@wHU|M~2{KnWQhx(N5lZAFPt?HJk#V3v zVP@Clw>+n&Og^O+SxS&lJ8?8IcM%!A69Dzqi8W-dQgSzn*bxgx7ne8?+s`%4OwOr* z!x{^kk@_*)o^Y{(3Fc?WDK_UZcZE7fQawM2=S_|E#T9OFsWQ|{t`(Z0*F81BX4doq zdFTo(yM%~IN#H0-4ogkG4(Yre@(0$jOF%FQJ^LQn%Y9*^sQaNgPsJeA9!BD3b0?(i zhs8*T4yYDjMlv8&Eq36hTInT!b-(ASHHsAev6uex*bG5%0DEE+CPPZy= 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 literal 0 HcmV?d00001 diff --git a/plugins/woocommerce-admin/docs/features/onboarding-tasks.md b/plugins/woocommerce-admin/docs/features/onboarding-tasks.md index c7748cbb694..76cba59f669 100644 --- a/plugins/woocommerce-admin/docs/features/onboarding-tasks.md +++ b/plugins/woocommerce-admin/docs/features/onboarding-tasks.md @@ -4,78 +4,127 @@ The onboarding tasks provides a way to help store owners get their sites quickly The task list is easily extensible to allow inserting custom tasks around plugin setup that benefits store owners. -### Models and classes +Onboarding Task List -#### TaskLists +## Adding a custom task -The `TaskLists` class acts as a data store for tasks and provides a way to add or retrieve tasks and lists. +### Step 1: Add your task in PHP -* `TaskLists::get_lists()` - Get all registered task lists -* `TaskLists::get_visible()` - Get visible task lists -* `TaskLists::get_list( $id )` - Get a list by ID -* `TaskLists::get_task( $id )` - Get a task by ID -* `TaskLists::add_list( $args )` - Add a list with the given arguments -* `TaskLists::add_task( $list_id, $args )` - Add a task to a given list ID - -#### Task - -**Arguments** +To add a custom task, you first need to create a new class that extends the `Task` class. ```php -$args = array( - 'id' => 'my-task', // A unique task ID. - 'title' => 'My Task', // Task title. - 'content' => 'Task explanation and instructions', // Content shown in the task list item. - 'action_label' => __( "Do the task!", 'woocommerce' ), // Text used for the action button. - 'action_url' => 'http://wordpress.com/my/task', // URL used when clicking the task item in lieu of SlotFill. - 'is_complete' => get_option( 'my-task-option', false ), // Determine if the task is complete. - 'can_view' => 'US:CA' === wc_get_base_location(), - 'level' => 3, // Priority level shown for extended tasks. - 'time' => __( '2 minutes', 'plugin-text-domain' ), // Time string for time to complete the task. - 'is_dismissable' => false, // Determine if the task is dismissable. - 'is_snoozeable' => true, // Determine if the task is snoozeable. - 'additional_info' => array( 'apples', 'oranges', 'bananas' ), // Additional info passed to the task. -) -$task = new Task( $args ); +use Automattic\WooCommerce\Admin\Features\OnboardingTasks\Task; + +class MyTask extends Task { + public function get_id() { + return 'my-task'; + } + + public function get_title() { + return __( 'My task', 'woocommerce' ); + } + + public function get_content() { + return __( 'Add your task description here for display in the task list.', 'woocommerce'); + } + + public function get_time() { + return __( '2 minutes', 'woocommerce' ); + } +} ``` -**Methods** +You can then add the task to the task list by calling the `add_task` method on the `TaskLists` class. -* `$task->dismiss()` - Dismiss the task -* `$task->undo_dismiss()` - Undo dismissal of a task -* `$task->is_dismissed()` - Check if a task is dismissed -* `$task->snooze()` - Snooze a task for later -* `$task->undo_snooze()` - Undo snoozing of a task -* `$task->is_snoozed()` - Check if a task has been snoozed -* `$task->mark_actioned()` - Mark a task as actioned. Optional to help determine completion -* `$task->is_actioned()` - Check if a task has been actioned -* `$task->get_json()` - Get the camelcase JSON for use in the client - * `id` (int) - Task ID. - * `title` (string) - Task title. - * `canView` (bool) - If a task should be viewable on a given store. - * `content` (string) - Task content. - * `additionalInfo` (object) - Additional extensible information about the task. - * `actionLabel` (string) - The label used for the action button. - * `actionUrl` (string) - The URL used when clicking the task if no task card is required. - * `isComplete` (bool) - If the task has been completed or not. - * `time` (string) - Length of time to complete the task. - * `level` (integer) - A priority for task list sorting. - * `isActioned` (bool) - If a task has been actioned. - * `isDismissed` (bool) - If a task has been dismissed. - * `isDismissable` (bool) - Whether or not a task is dismissable. - * `isSnoozed` (bool) - If a task has been snoozed. - * `isSnoozeable` (bool) - Whether or not a task can be snoozed. - * `snoozedUntil` (int) - Timestamp in milliseconds that the task has been snoozed until. +```php +use Automattic\WooCommerce\Admin\Features\OnboardingTasks\TaskLists; -#### TaskList +TaskLists::add_task( + 'extended', // The task list ID. See the TaskList section below for more information. + new MyTask( + $task_lists::get_list( 'extended' ), // The task list object. + ) +); +``` -**Arguments** +### Step 2 – Register the task in JavaScript. + +Next, you have to add your task to the tasks list in JavaScript. + +```jsx +import { __ } from '@wordpress/i18n'; +import { + WooOnboardingTask, + WooOnboardingTaskListItem, +} from '@woocommerce/onboarding'; + +const Task = ( { onComplete, task, query } ) => { + // Implement your task UI/feature here. + return ( +

+
+ ); +}; + +registerPlugin( 'add-task-content', { + render: () => ( + + { ( { + onComplete, + query, + task, + } ) => } + + ) +``` + +### Example + +You can find a complete example of how to add a custom task as a WordPress plugin in the [examples directory](../examples/extensions/add-task/). + +## Models and classes + +### TaskLists + +The `TaskLists` class serves as a data store for tasks, providing functionality to create, initialize, add tasks, retrieve task lists, and perform other task management operations. + +#### Methods + +- `TaskLists::instance()`: Returns the class instance of the `TaskLists` interface. +- `TaskLists::init()`: Initializes the task lists. This method should be called to set up the necessary configurations and hooks for task management. +- `TaskLists::is_experiment_treatment($name)`: Checks if an experiment is the treatment or control. This is internally used by Woo. +- `TaskLists::init_default_lists()`: Initializes the default task lists. This method adds predefined task lists with their properties and tasks. +- `TaskLists::init_tasks()`: Initializes the tasks. This method should be called to initialize the tasks associated with the task lists. +- `TaskLists::set_active_task()`: Temporarily stores the active task to persist across page loads when necessary. This method is used to manage active tasks. +- `TaskLists::add_list($args)`: Adds a task list with the specified properties. +- `TaskLists::add_task($list_id, $args)`: Adds a task to the specified task list. +- `TaskLists::maybe_add_extended_tasks($extended_tasks)`: Adds default extended task lists. +- `TaskLists::get_lists()`: Returns an array of all task lists. +- `TaskLists::get_lists_by_ids($ids)`: Returns an array of task lists filtered by the specified list IDs. +- `TaskLists::get_list_ids()`: Returns an array of all task list IDs. +- `TaskLists::clear_lists()`: Clears all task lists. +- `TaskLists::get_visible()`: Returns an array of visible task lists. +- `TaskLists::get_list($id)`: Retrieves a task list by its ID. +- `TaskLists::get_task($id, $task_list_id = null)`: Retrieves a single task. +- `TaskLists::setup_tasks_remaining()`: Return the number of setup tasks remaining. +- `TaskLists::menu_task_count()`: Adds a badge to the homescreen menu item for remaining tasks. +- `TaskLists::task_list_preloaded_settings($settings)`: Adds visible list IDs to component settings. + +### TaskList + +The `TaskList` class represents a task list. It contains properties and methods for managing task list. We currently have three predefined task lists + +- `setup`: The default task list +- `extended`: The "Things to do next" task list +- `secret_tasklist`: The "Secret" task list that is used for having tasks that are accessed by other means. + +#### Example & Arguments ```php $args = array( - 'id' => 'my-list', // A unique task list ID. - 'title' => 'My List', // Task list title. - 'sort_by' => array( // An array of keys to sort the tasks by. + 'id' => 'my-list', // A unique task list ID. + 'title' => 'My List', // Task list title. + 'sort_by' => array( // An array of keys to sort the tasks by. array( 'key' => 'is_complete', 'order' => 'asc', @@ -85,29 +134,138 @@ $args = array( 'order' => 'asc', ), ), -) -$list = new TaskList( $args ); + 'tasks' => array( /* Array of Task objects */ ), // Optional: Initialize with pre-existing tasks. + 'display_progress_header' => true, // Optional: Whether to display the progress header. + 'event_prefix' => 'tasklist_', // Optional: Event prefix for task-related events. + 'options' => array( + 'use_completed_title' => true, // Optional: Whether to use a completed title for the task list. + ), + 'visible' => true, // Optional: Whether the task list is visible. +); + +$task_list = new TaskList($args); ``` -**Methods** +#### Methods -* `$task_list->is_hidden()` - Check if a task list is hidden -* `$task_list->is_visible()` - Check if a task list is visible (opposite value of `is_hidden()`) -* `$task_list->hide()` - Hide a task list -* `$task_list->unhide()` - Undo hiding of a task list -* `$task_list->is_complete()` - Check if a task list is complete -* `$task_list->add_task( $args )` - Add a task to a task list -* `$task_list->get_viewable_tasks()` - Get tasks that are marked as `can_view` for the store -* `$task_list->sort_tasks( $sort_by )` - Sort the tasks by the provided `sort_by` value or the task list `sort_by` property if no argument is passed. -* `$task_list->get_json()` - Get the camelcase JSON for use in the client - * `id` (int) - Task list ID. - * `title` (string) - Task list title. - * `isHidden` (bool) - If a task has been hidden. - * `isVisible` (bool) - If a task list is visible. - * `isComplete` (bool) - Whether or not all viewable tasks have been completed. - * `tasks` (array) - An array of `Task` objects. +- `$task_list::get_list_id()`: Returns the ID of the task list. +- `$task_list::get_title()`: Returns the title of the task list. +- `$task_list::get_tasks()`: Returns an array of tasks associated with the task list. +- `$task_list::add_task($task)`: Adds a task to the task list. +- `$task_list::remove_task($task_id)`: Removes a task from the task list based on its ID. +- `$task_list::has_task($task_id)`: Checks if the task list contains a task with the specified ID. +- `$task_list::get_task($task_id)`: Retrieves a task from the task list based on its ID. +- `$task_list::get_viewable_tasks()`: Returns an array of viewable tasks within the task list. +- `$task_list::is_visible()`: Checks if the task list is visible. +- `$task_list::is_hidden()`: Checks if the task list is hidden. +- `$task_list::is_complete()`: Checks if all tasks in the task list are complete. +- `$task_list::get_completed_count()`: Returns the count of completed tasks in the task list. +- `$task_list::get_total_count()`: Returns the total count of tasks in the task list. +- `$task_list::get_progress_percentage()`: Returns the progress percentage of the task list. +- `$task_list::get_sorted_tasks($sort_by)`: Returns the tasks sorted based on the specified sorting criteria. +- `$task_list::get_json()`: Returns the JSON representation of the task list. +- `$task_list->get_json()` - Get the camelcase JSON for use in the client + - `id` (int) - Task list ID. + - `title` (string) - Task list title. + - `isHidden` (bool) - If a task has been hidden. + - `isVisible` (bool) - If a task list is visible. + - `isComplete` (bool) - Whether or not all viewable tasks have been completed. + - `tasks` (array) - An array of `Task` objects. -#### Data store actions +### Task + +The `Task` class represents a task. It contains properties and methods for managing tasks. You can see the predefined tasks in [this directory](https://github.com/woocommerce/woocommerce/tree/trunk/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks). + +Please note that the `Task` class is abstract and intended to be extended by custom task classes. + +#### Example + +```php +get_id(): string`: Returns the ID of the task. +- `$task->get_title(): string`: Returns the title of the task. +- `$task->get_content(): string`: Returns the content of the task. +- `$task->get_time(): string`: Returns the estimated time to complete the task. +- `$task->get_parent_id(): string`: Returns the ID of the parent task list. +- `$task->get_parent_options(): array`: Returns the options of the parent task list. +- `$task->get_parent_option($option_name): mixed|null`: Returns the value of a specific option from the parent task list. +- `$task->prefix_event($event_name): string`: Returns the event name prefixed with the task list's event prefix. +- `$task->get_additional_info(): string`: Returns additional information about the task. Typically includes details, notes, or instructions related to the task itself. +- `$task->get_additional_data(): mixed|null`: Returns additional data associated with the task. It can be any type of data, such as arrays, objects, or simple values. +- `$task->get_action_label(): string`: Returns the label for the action button of the task. +- `$task->get_action_url(): string|null`: Returns the URL associated with the task's action. +- `$task->is_dismissable(): bool`: Checks if the task is dismissable. +- `$task->is_dismissed(): bool`: Checks if the task is dismissed. +- `$task->dismiss(): bool`: Dismisses the task. +- `$task->undo_dismiss(): bool`: Undoes the dismissal of the task. +- `$task->has_previously_completed(): bool`: Checks if the task has been completed in the past. +- `$task->possibly_track_completion(): void`: Tracks the completion of the task if necessary. +- `$task->set_active(): void`: Sets the task as the active task. +- `$task->is_active(): bool`: Checks if the task is the active task. +- `$task->can_view(): bool`: Checks if the task can be viewed based on store capabilities. +- `$task->is_complete(): bool`: Checks if the task is complete. +- `$task->is_visited(): bool`: Checks if the task has been visited. +- `$task->get_record_view_event(): bool`: Checks if the task view event should be recorded. +- `$task->convert_object_to_camelcase($data): object`: Converts an array's keys to camel case. +- `$task->mark_actioned(): bool`: Marks the task as actioned. +- `$task->is_actioned(): bool`: Checks if the task has been actioned. +- `$task->is_task_actioned($id): bool`: Checks if a specific task has been actioned. +- `$task->sort($a, $b, $sort_by): int`: Sorts tasks based on given sort criteria. +- `$task->get_json(): array`: Returns the task data as a JSON-formatted array. + - `id` (int) - Task ID. + - `title` (string) - Task title. + - `canView` (bool) - If a task should be viewable on a given store. + - `content` (string) - Task content. + - `additionalInfo` (object) - Additional extensible information about the task. + - `actionLabel` (string) - The label used for the action button. + - `actionUrl` (string) - The URL used when clicking the task if no task card is required. + - `isComplete` (bool) - If the task has been completed or not. + - `time` (string) - Length of time to complete the task. + - `level` (integer) - A priority for task list sorting. + - `isActioned` (bool) - If a task has been actioned. + - `isDismissed` (bool) - If a task has been dismissed. + - `isDismissable` (bool) - Whether or not a task is dismissable. + - `isSnoozed` (bool) - If a task has been snoozed. + - `isSnoozeable` (bool) - Whether or not a task can be snoozed. + - `snoozedUntil` (int) - Timestamp in milliseconds that the task has been snoozed until. + +## Frontend + +We use the `@woocommerce/onboarding` package to render the onboarding task lists on the frontend and use the `@woocommerce/data` package to interact with the onboarding store. + +### Data store actions Using the `@woocommerce/data` package, the following selectors and actions are available to interact with the task lists under the onboarding store. @@ -125,64 +283,63 @@ const { taskLists } = useSelect( ( select ) => { } ); ``` +- `getTaskLists` - (select) Resolve any registered task lists with their nested tasks +- `hideTaskList( id )` - (dispatch) Hide a task list +- `actionTask( id )` - (dispatch) Mark a task as actioned +- `dismissTask( id )` - (dispatch) Dismiss a task +- `undoDismissTask( id )` - (dispatch) Undo task dismiss +- `optimisticallyCompleteTask( id )` - (dispatch) Optimistically mark a task as complete -* `getTaskLists` - (select) Resolve any registered task lists with their nested tasks -* `hideTaskList( id )` - (dispatch) Hide a task list -* `actionTask( id )` - (dispatch) Mark a task as actioned -* `snoozeTask( id )` - (dispatch) Snooze a task -* `dismissTask( id )` - (dispatch) Dismiss a task -* `optimisticallyCompleteTask( id )` - (dispatch) Optimistically mark a task as complete +### API Endpoints +The following REST endpoints are available to interact with tasks. For ease of use, we recommend using the data store actions above to interact with these endpoints. + +- `/wc-admin/onboarding/tasks` (GET) - Retrieve all tasks and their statuses +- `/wc-admin/onboarding/tasks/{list_id}/hide` (POST) - Hide a given task list +- `/wc-admin/onboarding/tasks/{task_id}/unhide` (POST) - Un-hide a given task list +- `/wc-admin/onboarding/tasks/{task_id}/dismiss` (POST) - Dismiss a task +- `/wc-admin/onboarding/tasks/{task_id}/undo_dismiss` (POST) - Undo dismissal of a task +- `/wc-admin/onboarding/tasks/{task_id}/action` (POST) - Mark a task as actioned ### SlotFills -The task UI can be supplemented by registering plugins that fill the provided task slots. +The task UI can be supplemented by registering plugins that fill the provided task slots. Learn more about slot fills in the [SlotFill documentation](https://developer.wordpress.org/block-editor/reference-guides/slotfills/) and [here](https://developer.wordpress.org/block-editor/reference-guides/components/slot-fill/). -#### Task content +### Task content -A task list fill is required if no `action_url` is provided for the task. This is the content shown after a task list item has been clicked. +A task list fill is required if no `action_url` is provided for the task. This is the content shown after a task list item has been clicked. ```js +import { registerPlugin } from '@wordpress/plugins'; import { WooOnboardingTask } from '@woocommerce/onboarding'; registerPlugin( 'my-task-plugin', { - scope: 'woocommerce-tasks', - render: () => ( + scope: 'woocommerce-tasks', + render: () => ( - { ( { onComplete, query } ) => ( - + { ( { onComplete, query, task } ) => ( + ) } - ), + ), } ); ``` -#### Task list item -The items shown in the list can be customized beyond the default task list item. This can allow for custom appearance or specific `onClick` behavior for your task. +### Task list item + +The items shown in the list can be customized beyond the default task list item. This can allow for custom appearance or specific `onClick` behavior for your task. For example, we're using this to install and activate WooCommerce Payments when clicking on the WooCommerce Payment task ```js import { WooOnboardingTaskListItem } from '@woocommerce/onboarding'; registerPlugin( 'my-task-list-item-plugin', { - scope: 'woocommerce-tasks', - render: () => ( + scope: 'woocommerce-tasks', + render: () => ( { ( { defaultTaskItem, onComplete } ) => ( ) } - ), + ), } ); ``` - -### Endpoints - -The following REST endpoints are available to interact with tasks. For ease of use, we recommend using the data store actions above to interact with these endpoints. - -* `/wc-admin/onboarding/tasks` (GET) - Retrieve all tasks and their statuses -* `/wc-admin/onboarding/tasks/{list_id}/hide` (POST) - Hide a given task list -* `/wc-admin/onboarding/tasks/{task_id}/dismiss` (POST) - Dismiss a task -* `/wc-admin/onboarding/tasks/{task_id}/undo_dismiss` (POST) - Undo dismissal of a task -* `/wc-admin/onboarding/tasks/{task_id}/snooze` (POST) - Snooze a task for later -* `/wc-admin/onboarding/tasks/{task_id}/undo_snooze` (POST) - Undo snoozing of a task -* `/wc-admin/onboarding/tasks/{task_id}/action` (POST) - Mark a task as actioned \ No newline at end of file diff --git a/plugins/woocommerce/changelog/dev-update-task-list-docs-example b/plugins/woocommerce/changelog/dev-update-task-list-docs-example new file mode 100644 index 00000000000..6921ff5bbbe --- /dev/null +++ b/plugins/woocommerce/changelog/dev-update-task-list-docs-example @@ -0,0 +1,4 @@ +Significance: patch +Type: dev + +Update tasklist documentation/example