/** @format */ /** * External dependencies */ import { __ } from '@wordpress/i18n'; import classNames from 'classnames'; import { Component, Fragment } from '@wordpress/element'; import { compose } from '@wordpress/compose'; import Gridicon from 'gridicons'; import PropTypes from 'prop-types'; import { IconButton, NavigableMenu, SelectControl } from '@wordpress/components'; import { withDispatch } from '@wordpress/data'; /** * WooCommerce dependencies */ import { EllipsisMenu, MenuItem, MenuTitle, SectionHeader } from '@woocommerce/components'; import { getAllowedIntervalsForQuery } from '@woocommerce/date'; /** * Internal dependencies */ import ChartBlock from './block'; import { uniqCharts } from './config'; import withSelect from 'wc-api/with-select'; import { recordEvent } from 'lib/tracks'; import './style.scss'; class DashboardCharts extends Component { constructor( props ) { super( ...arguments ); this.state = { chartType: props.userPrefChartType || 'line', interval: props.userPrefChartInterval || 'day', }; } handleTypeToggle( chartType ) { return () => { this.setState( { chartType } ); const userDataFields = { [ 'dashboard_chart_type' ]: chartType, }; this.props.updateCurrentUserData( userDataFields ); recordEvent( 'dash_charts_type_toggle', { chart_type: chartType } ); }; } renderMenu() { const { hiddenBlocks, isFirst, isLast, onMove, onRemove, onTitleBlur, onTitleChange, onToggleHiddenBlock, titleInput, controls: Controls, } = this.props; return ( ( { __( 'Charts', 'woocommerce-admin' ) } { uniqCharts.map( chart => { const key = chart.endpoint + '_' + chart.key; const checked = ! hiddenBlocks.includes( key ); return ( { onToggleHiddenBlock( key )(); recordEvent( 'dash_charts_chart_toggle', { status: checked ? 'off' : 'on', key, } ); } } > { chart.label } ); } ) } { window.wcAdminFeatures[ 'analytics-dashboard/customizable' ] && ( ) } ) } /> ); } renderIntervalSelector() { const allowedIntervals = getAllowedIntervalsForQuery( this.props.query ); if ( ! allowedIntervals || allowedIntervals.length < 1 ) { return null; } const intervalLabels = { hour: __( 'By hour', 'woocommerce-admin' ), day: __( 'By day', 'woocommerce-admin' ), week: __( 'By week', 'woocommerce-admin' ), month: __( 'By month', 'woocommerce-admin' ), quarter: __( 'By quarter', 'woocommerce-admin' ), year: __( 'By year', 'woocommerce-admin' ), }; return ( ( { value: allowedInterval, label: intervalLabels[ allowedInterval ], } ) ) } onChange={ this.setInterval } /> ); } setInterval = interval => { this.setState( { interval }, () => { const userDataFields = { [ 'dashboard_chart_interval' ]: this.state.interval, }; this.props.updateCurrentUserData( userDataFields ); recordEvent( 'dash_charts_interval', { interval } ); } ); }; render() { const { hiddenBlocks, path, title } = this.props; const { chartType, interval } = this.state; const query = { ...this.props.query, chartType, interval }; return (
{ this.renderIntervalSelector() } } title={ __( 'Line chart', 'woocommerce-admin' ) } aria-checked={ query.chartType === 'line' } role="menuitemradio" tabIndex={ query.chartType === 'line' ? 0 : -1 } onClick={ this.handleTypeToggle( 'line' ) } /> } title={ __( 'Bar chart', 'woocommerce-admin' ) } aria-checked={ query.chartType === 'bar' } role="menuitemradio" tabIndex={ query.chartType === 'bar' ? 0 : -1 } onClick={ this.handleTypeToggle( 'bar' ) } />
{ uniqCharts.map( chart => { return hiddenBlocks.includes( chart.endpoint + '_' + chart.key ) ? null : ( ); } ) }
); } } DashboardCharts.propTypes = { path: PropTypes.string.isRequired, query: PropTypes.object.isRequired, }; export default compose( withSelect( select => { const { getCurrentUserData } = select( 'wc-api' ); const userData = getCurrentUserData(); return { userPrefChartType: userData.dashboard_chart_type, userPrefChartInterval: userData.dashboard_chart_interval, }; } ), withDispatch( dispatch => { const { updateCurrentUserData } = dispatch( 'wc-api' ); return { updateCurrentUserData, }; } ) )( DashboardCharts );