diff --git a/packages/js/data/src/onboarding/utils.ts b/packages/js/data/src/onboarding/utils.ts
index 11f44817f72..9623eeff560 100644
--- a/packages/js/data/src/onboarding/utils.ts
+++ b/packages/js/data/src/onboarding/utils.ts
@@ -6,11 +6,9 @@ import { TaskType } from './types';
/**
* Filters tasks to only visible tasks, taking in account snoozed tasks.
*/
-export function getVisibleTasks( tasks: TaskType[] ) {
- const nowTimestamp = Date.now();
- return tasks.filter(
+export const getVisibleTasks = ( tasks: TaskType[] ) =>
+ tasks.filter(
( task ) =>
! task.isDismissed &&
- ( ! task.isSnoozed || task.snoozedUntil < nowTimestamp )
+ ( ! task.isSnoozed || task.snoozedUntil < Date.now() )
);
-}
diff --git a/plugins/woocommerce-admin/client/activity-panel/activity-panel.js b/plugins/woocommerce-admin/client/activity-panel/activity-panel.js
index 4f3bef88584..dd8dea3d837 100644
--- a/plugins/woocommerce-admin/client/activity-panel/activity-panel.js
+++ b/plugins/woocommerce-admin/client/activity-panel/activity-panel.js
@@ -2,7 +2,7 @@
* External dependencies
*/
import { __ } from '@wordpress/i18n';
-import { lazy, useState } from '@wordpress/element';
+import { lazy, useState, useContext, useMemo } from '@wordpress/element';
import { useSelect } from '@wordpress/data';
import { uniqueId, find } from 'lodash';
import { Icon, help as helpIcon, external } from '@wordpress/icons';
@@ -12,6 +12,7 @@ import {
OPTIONS_STORE_NAME,
useUser,
useUserPreferences,
+ getVisibleTasks,
} from '@woocommerce/data';
import { getHistory } from '@woocommerce/navigation';
import { recordEvent } from '@woocommerce/tracks';
@@ -36,6 +37,8 @@ import {
import { getUnapprovedReviews } from '../homescreen/activity-panel/reviews/utils';
import { ABBREVIATED_NOTIFICATION_SLOT_NAME } from './panels/inbox/abbreviated-notifications-panel';
import { getAdminSetting } from '~/utils/admin-settings';
+import { useActiveSetupTasklist } from '~/tasks';
+import { LayoutContext } from '~/layout';
const HelpPanel = lazy( () =>
import( /* webpackChunkName: "activity-panels-help" */ './panels/help' )
@@ -61,6 +64,12 @@ export const ActivityPanel = ( { isEmbedded, query } ) => {
const { fills } = useSlot( ABBREVIATED_NOTIFICATION_SLOT_NAME );
const hasExtendedNotifications = Boolean( fills?.length );
const { updateUserPreferences, ...userData } = useUserPreferences();
+ const activeSetupList = useActiveSetupTasklist();
+ const layoutContext = useContext( LayoutContext );
+ const updatedLayoutContext = useMemo(
+ () => layoutContext.getExtendedContext( 'activity-panel' ),
+ [ layoutContext ]
+ );
const getPreviewSiteBtnTrackData = ( select, getOption ) => {
let trackData = {};
@@ -137,6 +146,8 @@ export const ActivityPanel = ( { isEmbedded, query } ) => {
requestingTaskListOptions,
setupTaskListComplete,
setupTaskListHidden,
+ setupTasksCompleteCount,
+ setupTasksCount,
previewSiteBtnTrackData,
} = useSelect( ( select ) => {
const { getOption } = select( OPTIONS_STORE_NAME );
@@ -144,7 +155,10 @@ export const ActivityPanel = ( { isEmbedded, query } ) => {
ONBOARDING_STORE_NAME
);
- const isSetupTaskListHidden = getTaskList( 'setup' )?.isHidden;
+ const setupList = getTaskList( activeSetupList );
+
+ const isSetupTaskListHidden = setupList?.isHidden;
+ const setupVisibleTasks = getVisibleTasks( setupList?.tasks || [] );
const extendedTaskList = getTaskList( 'extended' );
const thingsToDoCount = getThingsToDoNextCount( extendedTaskList );
@@ -160,8 +174,12 @@ export const ActivityPanel = ( { isEmbedded, query } ) => {
requestingTaskListOptions: ! hasFinishedResolution(
'getTaskLists'
),
- setupTaskListComplete: getTaskList( 'setup' )?.isComplete,
+ setupTaskListComplete: setupList?.isComplete,
setupTaskListHidden: isSetupTaskListHidden,
+ setupTasksCount: setupVisibleTasks.length,
+ setupTasksCompleteCount: setupVisibleTasks.filter(
+ ( task ) => task.isComplete
+ ).length,
isCompletedTask: Boolean(
query.task && getTask( query.task )?.isComplete
),
@@ -230,7 +248,14 @@ export const ActivityPanel = ( { isEmbedded, query } ) => {
const setup = {
name: 'setup',
title: __( 'Finish setup', 'woocommerce' ),
- icon: ,
+ icon: (
+
+ ),
visible:
currentUserCan( 'manage_woocommerce' ) &&
! requestingTaskListOptions &&
@@ -349,55 +374,57 @@ export const ActivityPanel = ( { isEmbedded, query } ) => {
const showHelpHighlightTooltip = shouldShowHelpTooltip();
return (
-
-
- { __( 'Store Activity', 'woocommerce' ) }
-
-
- {
- if ( tab.onClick ) {
- tab.onClick();
- return;
- }
+
+
+
+ { __( 'Store Activity', 'woocommerce' ) }
+
+
+ {
+ if ( tab.onClick ) {
+ tab.onClick();
+ return;
+ }
- togglePanel( tab, tabOpen );
- } }
- />
- closePanel() }
- clearPanel={ () => clearPanel() }
- />
-
- { showHelpHighlightTooltip ? (
-
closedHelpPanelHighlight() }
- onShow={ () => recordEvent( 'help_tooltip_view' ) }
- />
- ) : null }
-
+ togglePanel( tab, tabOpen );
+ } }
+ />
+ closePanel() }
+ clearPanel={ () => clearPanel() }
+ />
+
+ { showHelpHighlightTooltip ? (
+
closedHelpPanelHighlight() }
+ onShow={ () => recordEvent( 'help_tooltip_view' ) }
+ />
+ ) : null }
+
+
);
};
diff --git a/plugins/woocommerce-admin/client/activity-panel/panels/setup-tasks/setup-tasks-panel.tsx b/plugins/woocommerce-admin/client/activity-panel/panels/setup-tasks/setup-tasks-panel.tsx
index eb62c02d863..492e8759ee4 100644
--- a/plugins/woocommerce-admin/client/activity-panel/panels/setup-tasks/setup-tasks-panel.tsx
+++ b/plugins/woocommerce-admin/client/activity-panel/panels/setup-tasks/setup-tasks-panel.tsx
@@ -1,7 +1,7 @@
/**
* Internal dependencies
*/
-import Tasks from '~/tasks';
+import { Tasks } from '~/tasks';
type QueryTypeProps = {
query: {
diff --git a/plugins/woocommerce-admin/client/activity-panel/setup-progress.js b/plugins/woocommerce-admin/client/activity-panel/setup-progress.js
index 9f242a81f1c..d4de5291a23 100644
--- a/plugins/woocommerce-admin/client/activity-panel/setup-progress.js
+++ b/plugins/woocommerce-admin/client/activity-panel/setup-progress.js
@@ -1,21 +1,38 @@
-export const SetupProgress = () => (
+export const SetupProgress = ( {
+ setupTasksComplete,
+ setupCompletePercent,
+} ) => (
);
diff --git a/plugins/woocommerce-admin/client/activity-panel/style.scss b/plugins/woocommerce-admin/client/activity-panel/style.scss
index ffaada568b5..79fb9eaca73 100644
--- a/plugins/woocommerce-admin/client/activity-panel/style.scss
+++ b/plugins/woocommerce-admin/client/activity-panel/style.scss
@@ -29,11 +29,12 @@
}
}
- // custom progress icon, requires specific coloring
- &.setup-progress {
- path:first-child {
- stroke: '#DCDCDE';
- }
+ .setup-progress-slice {
+ stroke: none;
+ }
+
+ .setup-progress-ring {
+ stroke-width: 2px;
}
}
@@ -69,8 +70,6 @@
outline: none;
cursor: pointer;
background-color: $studio-white;
- max-width: min-content;
- min-width: 80px;
width: 100%;
height: $header-height;
color: $gray-700;
@@ -204,16 +203,15 @@
}
transform: translateX(100%);
@include activity-panel-slide();
- position: fixed;
+ position: absolute;
right: 0;
- top: #{$header-height + $adminbar-height-mobile};
+ top: 100%;
z-index: 1000;
overflow-x: hidden;
overflow-y: auto;
@include breakpoint( '>782px' ) {
height: calc(100vh - #{$header-height + $adminbar-height});
- top: #{$header-height + $adminbar-height};
}
.has-woocommerce-navigation & {
height: calc(100vh - #{$header-height});
diff --git a/plugins/woocommerce-admin/client/homescreen/layout.js b/plugins/woocommerce-admin/client/homescreen/layout.js
index 813f417a112..df1f31137d5 100644
--- a/plugins/woocommerce-admin/client/homescreen/layout.js
+++ b/plugins/woocommerce-admin/client/homescreen/layout.js
@@ -44,7 +44,9 @@ import { getAdminSetting } from '~/utils/admin-settings';
import { ProgressTitle } from '../task-lists';
const Tasks = lazy( () =>
- import( /* webpackChunkName: "tasks" */ '../tasks' )
+ import( /* webpackChunkName: "tasks" */ '../tasks' ).then( ( module ) => ( {
+ default: module.Tasks,
+ } ) )
);
const TwoColumnTasks = lazy( () =>
diff --git a/plugins/woocommerce-admin/client/layout/index.js b/plugins/woocommerce-admin/client/layout/index.js
index 53df9bff39a..62d9d54db81 100644
--- a/plugins/woocommerce-admin/client/layout/index.js
+++ b/plugins/woocommerce-admin/client/layout/index.js
@@ -4,7 +4,7 @@
import { SlotFillProvider } from '@wordpress/components';
import { compose } from '@wordpress/compose';
import { withSelect } from '@wordpress/data';
-import { Component, lazy, Suspense } from '@wordpress/element';
+import { Component, lazy, Suspense, createContext } from '@wordpress/element';
import {
unstable_HistoryRouter as HistoryRouter,
Route,
@@ -15,7 +15,7 @@ import {
} from 'react-router-dom';
import { Children, cloneElement } from 'react';
import PropTypes from 'prop-types';
-import { get, isFunction, identity } from 'lodash';
+import { get, isFunction, identity, memoize } from 'lodash';
import { parse } from 'qs';
import { getHistory, getQuery } from '@woocommerce/navigation';
import {
@@ -51,6 +51,20 @@ const WCPayUsageModal = lazy( () =>
)
);
+const LayoutContextPrototype = {
+ getExtendedContext( newItem ) {
+ return { ...this, path: [ ...this.path, newItem ] };
+ },
+ toString() {
+ return this.path.join( '/' );
+ },
+ path: [],
+};
+
+export const LayoutContext = createContext(
+ LayoutContextPrototype.getExtendedContext( 'root' )
+);
+
export class PrimaryLayout extends Component {
render() {
const { children } = this.props;
@@ -111,6 +125,13 @@ const LayoutSwitchWrapper = ( props ) => {
};
class _Layout extends Component {
+ memoizedLayoutContext = memoize( ( page ) =>
+ LayoutContextPrototype.getExtendedContext(
+ page?.breadcrumbs[ page.breadcrumbs.length - 1 ]?.toLowerCase() ||
+ 'page'
+ )
+ );
+
componentDidMount() {
this.recordPageViewTrack();
}
@@ -195,38 +216,45 @@ class _Layout extends Component {
const query = this.getQuery( location && location.search );
return (
-
-
-
-
- { ! isEmbedded && (
-
-
-
-
-
- ) }
+
+
+
+
+
+ { ! isEmbedded && (
+
+
+
+
+
+ ) }
- { isEmbedded && this.isWCPaySettingsPage() && (
-
-
-
+ { isEmbedded && this.isWCPaySettingsPage() && (
+
+
+
+ ) }
+
+
+ { window.wcAdminFeatures.navigation && (
+
) }
-
-
- { window.wcAdminFeatures.navigation && (
-
- ) }
-
-
+
+
+
);
}
}
diff --git a/plugins/woocommerce-admin/client/tasks/index.ts b/plugins/woocommerce-admin/client/tasks/index.ts
index b168df10bb5..965ee2d89d9 100644
--- a/plugins/woocommerce-admin/client/tasks/index.ts
+++ b/plugins/woocommerce-admin/client/tasks/index.ts
@@ -1,11 +1,10 @@
/**
* Internal dependencies
*/
-import { Tasks } from './tasks';
import './fills';
import './deprecated-tasks';
+export * from './tasks';
export * from './placeholder';
export * from './reminder-bar';
export * from './hooks/useActiveSetupList';
-export default Tasks;
diff --git a/plugins/woocommerce-admin/client/tasks/reminder-bar/reminder-bar.tsx b/plugins/woocommerce-admin/client/tasks/reminder-bar/reminder-bar.tsx
index fa0ab892f51..1a96b202e3c 100644
--- a/plugins/woocommerce-admin/client/tasks/reminder-bar/reminder-bar.tsx
+++ b/plugins/woocommerce-admin/client/tasks/reminder-bar/reminder-bar.tsx
@@ -6,7 +6,8 @@ import { useSelect, useDispatch } from '@wordpress/data';
import {
ONBOARDING_STORE_NAME,
OPTIONS_STORE_NAME,
- TaskListType,
+ TaskType,
+ getVisibleTasks,
} from '@woocommerce/data';
import { Button } from '@wordpress/components';
import { Link } from '@woocommerce/components';
@@ -112,15 +113,10 @@ export const TasksReminderBar: React.FC< ReminderBarProps > = ( {
REMINDER_BAR_HIDDEN_OPTION,
] );
- const visibleTasks =
- taskList?.tasks.filter(
- ( task ) =>
- ! task.isDismissed &&
- ( ! task.isSnoozed || task.snoozedUntil < Date.now() )
- ) || [];
+ const visibleTasks = getVisibleTasks( taskList?.tasks || [] );
const completedTasks =
- visibleTasks?.filter( ( task ) => task.isComplete ) || [];
+ visibleTasks.filter( ( task: TaskType ) => task.isComplete ) || [];
const isResolved = taskListIsResolved && optionIsResolved;
diff --git a/plugins/woocommerce-admin/client/tasks/task-list-item.tsx b/plugins/woocommerce-admin/client/tasks/task-list-item.tsx
index 4026a3a9535..854c9e2e9cf 100644
--- a/plugins/woocommerce-admin/client/tasks/task-list-item.tsx
+++ b/plugins/woocommerce-admin/client/tasks/task-list-item.tsx
@@ -10,13 +10,14 @@ import {
} from '@woocommerce/data';
import { recordEvent } from '@woocommerce/tracks';
import { TaskItem, useSlot } from '@woocommerce/experimental';
-import { useCallback } from '@wordpress/element';
+import { useCallback, useContext } from '@wordpress/element';
import { useDispatch } from '@wordpress/data';
import { WooOnboardingTaskListItem } from '@woocommerce/onboarding';
/**
* Internal dependencies
*/
+import { LayoutContext } from '~/layout';
import './task-list.scss';
export type TaskListItemProps = {
@@ -35,6 +36,7 @@ export const TaskListItem: React.FC< TaskListItemProps > = ( {
task,
} ) => {
const { createNotice } = useDispatch( 'core/notices' );
+ const layoutContext = useContext( LayoutContext );
const {
dismissTask,
@@ -117,6 +119,7 @@ export const TaskListItem: React.FC< TaskListItemProps > = ( {
const trackClick = () => {
recordEvent( 'tasklist_click', {
task_name: id,
+ context: layoutContext.toString(),
} );
if ( ! isComplete ) {
diff --git a/plugins/woocommerce-admin/client/tasks/task-list.tsx b/plugins/woocommerce-admin/client/tasks/task-list.tsx
index 170834fa92f..a8f9f86e925 100644
--- a/plugins/woocommerce-admin/client/tasks/task-list.tsx
+++ b/plugins/woocommerce-admin/client/tasks/task-list.tsx
@@ -2,7 +2,7 @@
* External dependencies
*/
import { __, _n, sprintf } from '@wordpress/i18n';
-import { useEffect, useRef, useState } from '@wordpress/element';
+import { useEffect, useRef, useState, useContext } from '@wordpress/element';
import { Card, CardHeader } from '@wordpress/components';
import { useSelect } from '@wordpress/data';
import { Badge } from '@woocommerce/components';
@@ -21,6 +21,7 @@ import { TaskListItem } from './task-list-item';
import { TaskListMenu } from './task-list-menu';
import './task-list.scss';
import { ProgressHeader } from '~/task-lists/progress-header';
+import { LayoutContext } from '~/layout';
export type TaskListProps = TaskListType & {
query: {
@@ -51,6 +52,7 @@ export const TaskList: React.FC< TaskListProps > = ( {
} );
const prevQueryRef = useRef( query );
const visibleTasks = getVisibleTasks( tasks );
+ const layoutContext = useContext( LayoutContext );
const incompleteTasks = tasks.filter(
( task ) => ! task.isComplete && ! task.isDismissed
@@ -64,6 +66,7 @@ export const TaskList: React.FC< TaskListProps > = ( {
recordEvent( eventPrefix + 'view', {
number_tasks: visibleTasks.length,
store_connected: profileItems.wccom_connected,
+ context: layoutContext.toString(),
} );
};
diff --git a/plugins/woocommerce-admin/client/tasks/tasks.tsx b/plugins/woocommerce-admin/client/tasks/tasks.tsx
index 2f3a4198ccf..bd02be07688 100644
--- a/plugins/woocommerce-admin/client/tasks/tasks.tsx
+++ b/plugins/woocommerce-admin/client/tasks/tasks.tsx
@@ -4,7 +4,7 @@
import { __ } from '@wordpress/i18n';
import { MenuGroup, MenuItem } from '@wordpress/components';
import { check } from '@wordpress/icons';
-import { Fragment, useEffect } from '@wordpress/element';
+import { Fragment, useEffect, useState } from '@wordpress/element';
import { useDispatch, useSelect } from '@wordpress/data';
import {
ONBOARDING_STORE_NAME,
@@ -33,6 +33,7 @@ import { SectionedTaskListPlaceholder } from '~/two-column-tasks/sectioned-task-
export type TasksProps = {
query: { task?: string };
+ context?: string;
};
function getTaskListComponent( taskListId: string ) {
@@ -155,12 +156,9 @@ export const Tasks: React.FC< TasksProps > = ( { query } ) => {
? id.endsWith( 'two_column' )
: ! id.endsWith( 'two_column' )
)
+ .filter( ( { isVisible }: TaskListType ) => isVisible )
.map( ( taskList: TaskListType ) => {
- const { id, isHidden, isVisible, isToggleable } = taskList;
-
- if ( ! isVisible ) {
- return null;
- }
+ const { id, isHidden, isToggleable } = taskList;
const TaskListComponent = getTaskListComponent( id );
return (
diff --git a/plugins/woocommerce-admin/client/tasks/test/task-list.test.tsx b/plugins/woocommerce-admin/client/tasks/test/task-list.test.tsx
index 4f5516b67d0..fe6cd2e29b7 100644
--- a/plugins/woocommerce-admin/client/tasks/test/task-list.test.tsx
+++ b/plugins/woocommerce-admin/client/tasks/test/task-list.test.tsx
@@ -144,6 +144,7 @@ describe( 'TaskList', () => {
);
expect( recordEvent ).toHaveBeenCalledTimes( 1 );
expect( recordEvent ).toHaveBeenCalledWith( 'tasklist_view', {
+ context: 'root',
number_tasks: 0,
store_connected: null,
} );
@@ -166,6 +167,7 @@ describe( 'TaskList', () => {
);
expect( recordEvent ).toHaveBeenCalledTimes( 1 );
expect( recordEvent ).toHaveBeenCalledWith( 'extended_tasklist_view', {
+ context: 'root',
number_tasks: 0,
store_connected: null,
} );
diff --git a/plugins/woocommerce-admin/client/two-column-tasks/sectioned-task-list.tsx b/plugins/woocommerce-admin/client/two-column-tasks/sectioned-task-list.tsx
index a7de9d247fc..b69ea01cd8a 100644
--- a/plugins/woocommerce-admin/client/two-column-tasks/sectioned-task-list.tsx
+++ b/plugins/woocommerce-admin/client/two-column-tasks/sectioned-task-list.tsx
@@ -1,7 +1,7 @@
/**
* External dependencies
*/
-import { useEffect, useRef, useState } from '@wordpress/element';
+import { useEffect, useRef, useState, useContext } from '@wordpress/element';
import { Panel, PanelBody, PanelRow } from '@wordpress/components';
import { useSelect, useDispatch } from '@wordpress/data';
import { ONBOARDING_STORE_NAME, getVisibleTasks } from '@woocommerce/data';
@@ -20,6 +20,7 @@ import { ProgressHeader } from '~/task-lists/progress-header';
import { SectionPanelTitle } from './section-panel-title';
import { TaskListItem } from './task-list-item';
import { TaskListCompletedHeader } from './completed-header';
+import { LayoutContext } from '~/layout';
type PanelBodyProps = Omit< PanelBody.Props, 'title' | 'onToggle' > & {
title: string | React.ReactNode | undefined;
@@ -51,6 +52,7 @@ export const SectionedTaskList: React.FC< TaskListProps > = ( {
const [ openPanel, setOpenPanel ] = useState< string | null >(
sections?.find( ( section ) => ! section.isComplete )?.id || null
);
+ const layoutContext = useContext( LayoutContext );
const prevQueryRef = useRef( query );
@@ -64,6 +66,7 @@ export const SectionedTaskList: React.FC< TaskListProps > = ( {
recordEvent( `${ eventPrefix }view`, {
number_tasks: visibleTasks.length,
store_connected: profileItems.wccom_connected,
+ context: layoutContext.toString(),
} );
};
diff --git a/plugins/woocommerce-admin/client/two-column-tasks/task-list-item.tsx b/plugins/woocommerce-admin/client/two-column-tasks/task-list-item.tsx
index 39c64907e85..a92f0e9a25d 100644
--- a/plugins/woocommerce-admin/client/two-column-tasks/task-list-item.tsx
+++ b/plugins/woocommerce-admin/client/two-column-tasks/task-list-item.tsx
@@ -5,17 +5,21 @@ import { __ } from '@wordpress/i18n';
import { getNewPath, navigateTo } from '@woocommerce/navigation';
import {
ONBOARDING_STORE_NAME,
- OPTIONS_STORE_NAME,
TaskType,
useUserPreferences,
} from '@woocommerce/data';
import { recordEvent } from '@woocommerce/tracks';
import { TaskItem, useSlot } from '@woocommerce/experimental';
-import { useCallback } from '@wordpress/element';
+import { useCallback, useContext } from '@wordpress/element';
import { useDispatch } from '@wordpress/data';
import { WooOnboardingTaskListItem } from '@woocommerce/onboarding';
import classnames from 'classnames';
+/**
+ * Internal dependencies
+ */
+import { LayoutContext } from '~/layout';
+
export type TaskListItemProps = {
task: TaskType;
eventPrefix?: string;
@@ -35,6 +39,8 @@ export const TaskListItem: React.FC< TaskListItemProps > = ( {
undoSnoozeTask,
} = useDispatch( ONBOARDING_STORE_NAME );
+ const layoutContext = useContext( LayoutContext );
+
const slot = useSlot(
`woocommerce_onboarding_task_list_item_${ task.id }`
);
@@ -68,6 +74,7 @@ export const TaskListItem: React.FC< TaskListItemProps > = ( {
const trackClick = () => {
recordEvent( `${ eventPrefix }click`, {
task_name: task.id,
+ context: layoutContext.toString(),
} );
if ( ! task.isComplete ) {
diff --git a/plugins/woocommerce-admin/client/two-column-tasks/task-list.tsx b/plugins/woocommerce-admin/client/two-column-tasks/task-list.tsx
index b37ec2ec225..0745563cac7 100644
--- a/plugins/woocommerce-admin/client/two-column-tasks/task-list.tsx
+++ b/plugins/woocommerce-admin/client/two-column-tasks/task-list.tsx
@@ -2,7 +2,13 @@
* External dependencies
*/
import { __ } from '@wordpress/i18n';
-import { useEffect, useRef, useState, createElement } from '@wordpress/element';
+import {
+ useEffect,
+ useRef,
+ useState,
+ createElement,
+ useContext,
+} from '@wordpress/element';
import { Button, Card } from '@wordpress/components';
import { useSelect, useDispatch } from '@wordpress/data';
import { EllipsisMenu } from '@woocommerce/components';
@@ -29,6 +35,7 @@ import TaskListCompleted from './completed';
import { ProgressHeader } from '~/task-lists/progress-header';
import { TaskListItemTwoColumn } from './task-list-item-two-column';
import { TaskListCompletedHeader } from './completed-header';
+import { LayoutContext } from '~/layout';
export type TaskListProps = TaskListType & {
eventName?: string;
@@ -71,6 +78,7 @@ export const TaskList: React.FC< TaskListProps > = ( {
} >( {} );
const [ activeTaskId, setActiveTaskId ] = useState( '' );
const [ showDismissModal, setShowDismissModal ] = useState( false );
+ const layoutContext = useContext( LayoutContext );
const prevQueryRef = useRef( query );
@@ -83,6 +91,7 @@ export const TaskList: React.FC< TaskListProps > = ( {
recordEvent( `${ listEventPrefix }view`, {
number_tasks: visibleTasks.length,
store_connected: profileItems.wccom_connected,
+ context: layoutContext.toString(),
} );
};
@@ -179,6 +188,7 @@ export const TaskList: React.FC< TaskListProps > = ( {
const trackClick = ( task: TaskType ) => {
recordEvent( `${ listEventPrefix }click`, {
task_name: task.id,
+ context: layoutContext.toString(),
} );
};
diff --git a/plugins/woocommerce-admin/client/two-column-tasks/test/task-list.test.tsx b/plugins/woocommerce-admin/client/two-column-tasks/test/task-list.test.tsx
index 7b392e02d0a..1f7b5d69d7a 100644
--- a/plugins/woocommerce-admin/client/two-column-tasks/test/task-list.test.tsx
+++ b/plugins/woocommerce-admin/client/two-column-tasks/test/task-list.test.tsx
@@ -148,6 +148,7 @@ describe( 'TaskList', () => {
);
expect( recordEvent ).toHaveBeenCalledTimes( 1 );
expect( recordEvent ).toHaveBeenCalledWith( 'tasklist_view', {
+ context: 'root',
number_tasks: 0,
store_connected: null,
} );
@@ -170,6 +171,7 @@ describe( 'TaskList', () => {
);
expect( recordEvent ).toHaveBeenCalledTimes( 1 );
expect( recordEvent ).toHaveBeenCalledWith( 'tasklist_view', {
+ context: 'root',
number_tasks: 0,
store_connected: null,
} );
@@ -193,6 +195,7 @@ describe( 'TaskList', () => {
);
expect( recordEvent ).toHaveBeenCalledTimes( 1 );
expect( recordEvent ).toHaveBeenCalledWith( 'extended_tasklist_view', {
+ context: 'root',
number_tasks: 0,
store_connected: null,
} );
diff --git a/plugins/woocommerce/changelog/add-33284-task-sidebar-tracks b/plugins/woocommerce/changelog/add-33284-task-sidebar-tracks
new file mode 100644
index 00000000000..ff7f64c9c3a
--- /dev/null
+++ b/plugins/woocommerce/changelog/add-33284-task-sidebar-tracks
@@ -0,0 +1,4 @@
+Significance: minor
+Type: add
+
+Adding property to tasks tracks events to indicate context.
diff --git a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/TaskList.php b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/TaskList.php
index 4053546fc9a..bd87b730fca 100644
--- a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/TaskList.php
+++ b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/TaskList.php
@@ -171,7 +171,7 @@ class TaskList {
* @return bool
*/
public function is_visible() {
- if ( ! $this->visible ) {
+ if ( ! $this->visible || ! count( $this->get_viewable_tasks() ) > 0 ) {
return false;
}
return ! $this->is_hidden();
diff --git a/plugins/woocommerce/tests/legacy/unit-tests/payment-tokens/payment-tokens.php b/plugins/woocommerce/tests/legacy/unit-tests/payment-tokens/payment-tokens.php
index 92f607d6df2..ab7c75cf4ef 100644
--- a/plugins/woocommerce/tests/legacy/unit-tests/payment-tokens/payment-tokens.php
+++ b/plugins/woocommerce/tests/legacy/unit-tests/payment-tokens/payment-tokens.php
@@ -104,7 +104,6 @@ class WC_Tests_Payment_Tokens extends WC_Unit_Test_Case {
* Test getting a customers default token, when there no token is expictly set.
* This should be the "first created".
* @see WC_Payment_Token::create()
- * @group failing
* @since 2.6.0
*/
public function test_wc_get_customer_default_token_returns_first_created_when_no_default_token_set() {
diff --git a/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/features/onboarding-tasks/task-list.php b/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/features/onboarding-tasks/task-list.php
index ede67db4f55..9822ea6df13 100644
--- a/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/features/onboarding-tasks/task-list.php
+++ b/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/features/onboarding-tasks/task-list.php
@@ -8,6 +8,7 @@
require_once __DIR__ . '/test-task.php';
use Automattic\WooCommerce\Admin\Features\OnboardingTasks\TaskList;
+use Automattic\WooCommerce\Admin\Features\OnboardingTasks\Task;
/**
* class WC_Admin_Tests_OnboardingTasks_TaskList
@@ -89,6 +90,13 @@ class WC_Admin_Tests_OnboardingTasks_TaskList extends WC_Unit_Test_Case {
* Tests that lists can be hidden.
*/
public function test_visible() {
+ $this->assertFalse( $this->list->is_visible() );
+ $this->list->add_task(
+ new TestTask(
+ new TaskList(),
+ array( 'id' => 'my-task' )
+ )
+ );
$this->assertTrue( $this->list->is_visible() );
}