HIDDEN_OPTION, array_unique( $hidden ) ); } /** * Sets the default homepage layout to two_columns if "setup" tasklist is completed or hidden. * * @param array $completed_or_hidden_tasklist_ids Array of tasklist ids. */ public function maybe_set_default_layout( $completed_or_hidden_tasklist_ids ) { if ( in_array( 'setup', $completed_or_hidden_tasklist_ids, true ) ) { update_option( 'woocommerce_default_homepage_layout', 'two_columns' ); } } /** * Undo hiding of the task list. * * @return bool */ public function unhide() { $hidden = get_option( self::HIDDEN_OPTION, array() ); $hidden = array_diff( $hidden, array( $this->hidden_id ? $this->hidden_id : $this->id ) ); return update_option( self::HIDDEN_OPTION, $hidden ); } /** * Check if all viewable tasks are complete. * * @return bool */ public function is_complete() { foreach ( $this->get_viewable_tasks() as $viewable_task ) { if ( $viewable_task->is_complete() === false ) { return false; } } return true; } /** * Check if a task list has previously been marked as complete. * * @return bool */ public function has_previously_completed() { $complete = get_option( self::COMPLETED_OPTION, array() ); return in_array( $this->get_list_id(), $complete, true ); } /** * Add task to the task list. * * @param Task $task Task class. */ public function add_task( $task ) { if ( ! is_subclass_of( $task, 'Automattic\WooCommerce\Admin\Features\OnboardingTasks\Task' ) ) { return new \WP_Error( 'woocommerce_task_list_invalid_task', __( 'Task is not a subclass of `Task`', 'woocommerce' ) ); } if ( array_search( $task, $this->tasks, true ) ) { return; } $this->tasks[] = $task; } /** * Get only visible tasks in list. * * @param string $task_id id of task. * @return Task */ public function get_task( $task_id ) { return current( array_filter( $this->tasks, function( $task ) use ( $task_id ) { return $task->get_id() === $task_id; } ) ); } /** * Get only visible tasks in list. * * @return array */ public function get_viewable_tasks() { return array_values( array_filter( $this->tasks, function( $task ) { return $task->can_view(); } ) ); } /** * Get task list sections. * * @deprecated 7.2.0 * * @return array */ public function get_sections() { wc_deprecated_function( __CLASS__ . '::' . __FUNCTION__, '7.2.0' ); return $this->sections; } /** * Track list completion of viewable tasks. */ public function possibly_track_completion() { if ( ! $this->is_complete() ) { return; } if ( $this->has_previously_completed() ) { return; } $completed_lists = get_option( self::COMPLETED_OPTION, array() ); $completed_lists[] = $this->get_list_id(); update_option( self::COMPLETED_OPTION, $completed_lists ); $this->maybe_set_default_layout( $completed_lists ); $this->record_tracks_event( 'tasks_completed' ); } /** * Sorts the attached tasks array. * * @param array $sort_by list of columns with sort order. * @return TaskList returns $this, for chaining. */ public function sort_tasks( $sort_by = array() ) { $sort_by = count( $sort_by ) > 0 ? $sort_by : $this->sort_by; if ( 0 !== count( $sort_by ) ) { usort( $this->tasks, function( $a, $b ) use ( $sort_by ) { return Task::sort( $a, $b, $sort_by ); } ); } return $this; } /** * Prefix event for track event naming. * * @param string $event_name Event name. * @return string */ public function prefix_event( $event_name ) { if ( null !== $this->event_prefix ) { return $this->event_prefix . $event_name; } return $this->get_list_id() . '_tasklist_' . $event_name; } /** * Returns option to keep completed task list. * * @return string */ public function get_keep_completed_task_list() { return get_option( 'woocommerce_task_list_keep_completed', 'no' ); } /** * Remove reminder bar four weeks after store creation. */ public static function possibly_remove_reminder_bar() { $bar_hidden = get_option( self::REMINDER_BAR_HIDDEN_OPTION, 'no' ); $active_for_four_weeks = WCAdminHelper::is_wc_admin_active_for( WEEK_IN_SECONDS * 4 ); if ( 'yes' === $bar_hidden || ! $active_for_four_weeks ) { return; } update_option( self::REMINDER_BAR_HIDDEN_OPTION, 'yes' ); } /** * Get the list for use in JSON. * * @return array */ public function get_json() { $this->possibly_track_completion(); $tasks_json = array(); foreach ( $this->tasks as $task ) { $json = $task->get_json(); if ( $json['canView'] ) { $tasks_json[] = $json; } } return array( 'id' => $this->get_list_id(), 'title' => $this->title, 'isHidden' => $this->is_hidden(), 'isVisible' => $this->is_visible(), 'isComplete' => $this->is_complete(), 'tasks' => $tasks_json, 'eventPrefix' => $this->prefix_event( '' ), 'displayProgressHeader' => $this->display_progress_header, 'keepCompletedTaskList' => $this->get_keep_completed_task_list(), ); } }