/* global wdp_analytics_ajax, wdpI18n */ import React from 'react'; import PagesRow from './views/rows/pages' import SitesRow from './views/rows/sites' import eventBus from './helpers/event-bus' import ajaxRequest from './helpers/request' import AuthorsRow from './views/rows/authors' import ContentList from './views/content-list' import HeaderTabs from './components/header-tabs' import ContentOverview from './views/content-overview' export default class WidgetBody extends React.Component { constructor(props) { super(props); this.state = { overall: wdp_analytics_ajax.overall_data, overview: wdp_analytics_ajax.current_data, pages: wdp_analytics_ajax.pages, authors: wdp_analytics_ajax.authors, sites: wdp_analytics_ajax.sites, autocomplete: wdp_analytics_ajax.autocomplete, currentTab: 'overview', currentPeriod: 7, currentFilter: '', currentFilterType: '', periodLoading: false, period: { current: 7, loading: false } } } componentDidMount() { /** * Handle autocomplete clear event. * * @param {object} data Data. * @since 4.11.4 */ eventBus.on('AnalyticsFilterClear', (data) => this.setState({ overview: this.state.overall, currentFilter: '', currentFilterType: '', }) ); /** * Handle period change event. * * @param {string} period * @since 4.11.4 */ eventBus.on('AnalyticsPeriodChange', (data) => this.getPeriodStats(data.period)); /** * Handle analytics filter change. * * @param {object} data Data. * @since 4.11.4 */ eventBus.on('AnalyticsApplyFilter', (data) => { if ('autocomplete' === data.type) { this.setState({ overview: data.stats, currentFilter: data.filter.filter, currentFilterType: data.filter.type }) } else { this.setState({ currentTab: 'overview', overview: data.stats, currentFilter: data.filter.filter, currentFilterType: data.filter.type }) } } ); } componentWillUnmount() { // Remove custom events. eventBus.remove('AnalyticsPeriodChange'); eventBus.remove('AnalyticsApplyFilter'); eventBus.remove('AnalyticsFilterClear'); } /** * Get overall stats for period changes. * * Make sure to update all stats. Keep all active * filters. * * @param {int} period Period. * @since 4.11.4 */ async getPeriodStats(period) { this.setState({ period: { ...this.state.period, loading: true } }) await ajaxRequest( 'wdp-analytics', { type: 'full', range: period, filter_value: this.state.currentFilter, filter_type: this.state.currentFilterType } ).then(response => { if (response.success) { this.setState({ period: { ...this.state.period, current: period }, overview: response.data.current_data, overall: response.data.overall_data, pages: response.data.pages, authors: response.data.authors, sites: response.data.sites, autocomplete: response.data.autocomplete }) } }); this.setState({ period: { ...this.state.period, loading: false } }) } /** * Get available tabs for header. * * @since 4.11.5 * @return {{overview: string, pages: string, sites: string, authors: string}} */ getTabs() { let items = wdpI18n.tabs; Object.keys(items).forEach((tab) => { if ('overview' !== tab && this.state[tab].length <= 0) { delete items[tab] } }) return items; } render() { return ( <> this.setState({ currentTab: tab })} />
{this.state.pages.length > 0 && } {this.state.authors.length > 0 && } {this.state.sites.length > 0 && }
); } }