2020-05-04 22:58:39 +00:00
|
|
|
/**
|
|
|
|
* External dependencies
|
|
|
|
*/
|
|
|
|
import { __ } from '@wordpress/i18n';
|
|
|
|
import { compose } from '@wordpress/compose';
|
|
|
|
import { Fragment } from '@wordpress/element';
|
2020-05-14 03:23:03 +00:00
|
|
|
import { TabPanel } from '@wordpress/components';
|
2020-05-04 22:58:39 +00:00
|
|
|
import { xor } from 'lodash';
|
|
|
|
import { withDispatch } from '@wordpress/data';
|
|
|
|
import PropTypes from 'prop-types';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* WooCommerce dependencies
|
|
|
|
*/
|
|
|
|
import {
|
|
|
|
Card,
|
|
|
|
EllipsisMenu,
|
|
|
|
MenuItem,
|
|
|
|
MenuTitle,
|
2020-05-14 03:23:03 +00:00
|
|
|
Link,
|
2020-05-04 22:58:39 +00:00
|
|
|
} from '@woocommerce/components';
|
|
|
|
import { getSetting } from '@woocommerce/wc-admin-settings';
|
2020-05-14 03:23:03 +00:00
|
|
|
import { getNewPath } from '@woocommerce/navigation';
|
2020-05-04 22:58:39 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Internal dependencies
|
|
|
|
*/
|
2020-05-14 03:23:03 +00:00
|
|
|
import './style.scss';
|
2020-05-04 22:58:39 +00:00
|
|
|
import withSelect from 'wc-api/with-select';
|
|
|
|
import { DEFAULT_STATS, DEFAULT_HIDDEN_STATS } from './defaults';
|
2020-05-14 03:23:03 +00:00
|
|
|
import StatsList from './stats-list';
|
|
|
|
import { recordEvent } from 'lib/tracks';
|
2020-05-27 02:38:57 +00:00
|
|
|
import InstallJetpackCta from './install-jetpack-cta';
|
2020-05-04 22:58:39 +00:00
|
|
|
|
|
|
|
const { performanceIndicators } = getSetting( 'dataEndpoints', {
|
|
|
|
performanceIndicators: [],
|
|
|
|
} );
|
|
|
|
const stats = performanceIndicators.filter( ( indicator ) => {
|
|
|
|
return DEFAULT_STATS.includes( indicator.stat );
|
|
|
|
} );
|
|
|
|
|
|
|
|
export const StatsOverview = ( { userPrefs, updateCurrentUserData } ) => {
|
|
|
|
const userHiddenStats = userPrefs.hiddenStats;
|
|
|
|
const hiddenStats = userHiddenStats
|
|
|
|
? userHiddenStats
|
|
|
|
: DEFAULT_HIDDEN_STATS;
|
|
|
|
|
|
|
|
const toggleStat = ( stat ) => {
|
|
|
|
const nextHiddenStats = xor( hiddenStats, [ stat ] );
|
2020-05-27 02:38:57 +00:00
|
|
|
userPrefs.hiddenStats = nextHiddenStats;
|
2020-05-04 22:58:39 +00:00
|
|
|
updateCurrentUserData( {
|
2020-05-27 02:38:57 +00:00
|
|
|
homepage_stats: userPrefs,
|
2020-05-04 22:58:39 +00:00
|
|
|
} );
|
|
|
|
recordEvent( 'statsoverview_indicators_toggle', {
|
|
|
|
indicator_name: stat,
|
|
|
|
status: nextHiddenStats.includes( stat ) ? 'off' : 'on',
|
|
|
|
} );
|
|
|
|
};
|
|
|
|
|
2020-05-14 03:23:03 +00:00
|
|
|
const activeStats = stats.filter(
|
|
|
|
( item ) => ! hiddenStats.includes( item.stat )
|
|
|
|
);
|
|
|
|
|
2020-05-04 22:58:39 +00:00
|
|
|
return (
|
|
|
|
<Card
|
2020-05-14 03:23:03 +00:00
|
|
|
className="woocommerce-analytics__card woocommerce-stats-overview"
|
2020-05-04 22:58:39 +00:00
|
|
|
title={ __( 'Stats overview', 'woocommerce-admin' ) }
|
|
|
|
menu={
|
|
|
|
<EllipsisMenu
|
|
|
|
label={ __(
|
|
|
|
'Choose which values to display',
|
|
|
|
'woocommerce-admin'
|
|
|
|
) }
|
|
|
|
renderContent={ () => (
|
|
|
|
<Fragment>
|
|
|
|
<MenuTitle>
|
|
|
|
{ __( 'Display stats:', 'woocommerce-admin' ) }
|
|
|
|
</MenuTitle>
|
|
|
|
{ stats.map( ( item ) => {
|
|
|
|
const checked = ! hiddenStats.includes(
|
|
|
|
item.stat
|
|
|
|
);
|
|
|
|
|
|
|
|
return (
|
|
|
|
<MenuItem
|
|
|
|
checked={ checked }
|
|
|
|
isCheckbox
|
|
|
|
isClickable
|
|
|
|
key={ item.stat }
|
|
|
|
onInvoke={ () =>
|
|
|
|
toggleStat( item.stat )
|
|
|
|
}
|
|
|
|
>
|
|
|
|
{ item.label }
|
|
|
|
</MenuItem>
|
|
|
|
);
|
|
|
|
} ) }
|
|
|
|
</Fragment>
|
|
|
|
) }
|
|
|
|
/>
|
|
|
|
}
|
|
|
|
>
|
2020-05-14 03:23:03 +00:00
|
|
|
<TabPanel
|
|
|
|
className="woocommerce-stats-overview__tabs"
|
|
|
|
tabs={ [
|
|
|
|
{
|
|
|
|
title: __( 'Today', 'woocommerce-admin' ),
|
|
|
|
name: 'today',
|
|
|
|
},
|
|
|
|
{
|
|
|
|
title: __( 'Week to date', 'woocommerce-admin' ),
|
|
|
|
name: 'week',
|
|
|
|
},
|
|
|
|
{
|
|
|
|
title: __( 'Month to date', 'woocommerce-admin' ),
|
|
|
|
name: 'month',
|
|
|
|
},
|
|
|
|
] }
|
|
|
|
>
|
|
|
|
{ ( tab ) => (
|
2020-05-27 02:38:57 +00:00
|
|
|
<Fragment>
|
|
|
|
<InstallJetpackCta />
|
|
|
|
<StatsList
|
|
|
|
query={ {
|
|
|
|
period: tab.name,
|
|
|
|
compare: 'previous_period',
|
|
|
|
} }
|
|
|
|
stats={ activeStats }
|
|
|
|
/>
|
|
|
|
</Fragment>
|
2020-05-14 03:23:03 +00:00
|
|
|
) }
|
|
|
|
</TabPanel>
|
2020-05-20 22:15:18 +00:00
|
|
|
<div className="woocommerce-stats-overview__footer">
|
|
|
|
<Link
|
|
|
|
className="woocommerce-stats-overview__more-btn"
|
|
|
|
href={ getNewPath( {}, '/analytics/overview' ) }
|
|
|
|
type="wc-admin"
|
|
|
|
onClick={ () => {
|
|
|
|
recordEvent( 'statsoverview_indicators_click', {
|
|
|
|
key: 'view_detailed_stats',
|
|
|
|
} );
|
|
|
|
} }
|
|
|
|
>
|
|
|
|
{ __( 'View detailed stats' ) }
|
|
|
|
</Link>
|
|
|
|
</div>
|
2020-05-04 22:58:39 +00:00
|
|
|
</Card>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
StatsOverview.propTypes = {
|
|
|
|
/**
|
|
|
|
* Homepage user preferences.
|
|
|
|
*/
|
|
|
|
userPrefs: PropTypes.object.isRequired,
|
|
|
|
/**
|
|
|
|
* A method to update user meta.
|
|
|
|
*/
|
|
|
|
updateCurrentUserData: PropTypes.func.isRequired,
|
|
|
|
};
|
|
|
|
|
|
|
|
export default compose(
|
|
|
|
withSelect( ( select ) => {
|
|
|
|
const { getCurrentUserData } = select( 'wc-api' );
|
|
|
|
|
|
|
|
return {
|
|
|
|
userPrefs: getCurrentUserData().homepage_stats || {},
|
|
|
|
};
|
|
|
|
} ),
|
|
|
|
withDispatch( ( dispatch ) => {
|
|
|
|
const { updateCurrentUserData } = dispatch( 'wc-api' );
|
|
|
|
|
|
|
|
return {
|
|
|
|
updateCurrentUserData,
|
|
|
|
};
|
|
|
|
} )
|
|
|
|
)( StatsOverview );
|