/* global wdpI18n */
import React from 'react'
import eventBus from './../helpers/event-bus'
import ajaxRequest from './../helpers/request'
export default class ContentOverview extends React.Component {
constructor(props) {
super(props);
this.state = {
loading: false,
currentFilter: '',
currentOption: 'pageviews'
}
this.input = React.createRef();
// Bind events.
this.handleChange = this.handleChange.bind(this)
}
/**
* After component is rendered.
*
* @since 4.11.6
*/
componentDidMount() {
// Init auto complete.
this.initAutocomplete()
/**
* Handle analytics filter change.
*
* @param {object} data Data.
* @since 4.11.6
*/
eventBus.on('AnalyticsApplyFilter', (data) => {
if ('autocomplete' !== data.type) {
this.setState({
currentFilter: data.label,
})
this.initAutocomplete()
}
}
);
}
/**
* Set new value on filter value change.
*
* @param {object} prevProps Previous props.
* @param {object} prevState Previous state.
*
* @since 4.11.6
*/
componentDidUpdate(prevProps, prevState) {
if (prevState.currentFilter !== this.state.currentFilter) {
jQuery(this.input.current).val(this.state.currentFilter)
}
}
/**
* Initialize autocomplete.
*
* Initialize jQuery autocomplete with posts, authors and sites
* data source.
*
* @since 4.11.6
*/
initAutocomplete() {
const self = this
jQuery(self.input.current).autocomplete({
minLength: 2,
source: this.props.source,
select: async function (e, ui) {
jQuery('.wpmudui-search-form .wpmudui-icon').remove();
jQuery(self.input.current).before('')
.css('text-indent', '10px');
// Get filtered stats.
let response = await self.getFilteredStats({
filter: ui.item.filter,
type: ui.item.type,
})
// Process response.
self.processResponse(response, {
type: ui.item.type,
filter: ui.item.filter,
})
e.preventDefault();
}
})
.autocomplete('widget')
.addClass('wpmudui-autocomplete-list');
}
/**
* Handle table row click event.
*
* Send an wp-ajax request and get the filtered content
* for the applied filters.
*
* @param {object} data Row data.
* @since 4.11.6
* @return {object}
*/
async getFilteredStats(data) {
let response = {
success: false,
data: {}
}
await ajaxRequest(
'wdp-analytics',
{
type: 'filtered',
filter_type: data.type,
filter_value: data.filter,
range: this.props.period,
}
).then(json => {
response = json
})
return response
}
/**
* Process the ajax request response.
*
* Show and hide icons based on the response.
*
* @param {object} response Response data.
* @param {object} filter Filter data.
* @since 4.11.6
*/
processResponse(response, filter) {
let self = this
// If request was success remove loader.
if (response.success) {
// Dispatch filter apply event.
eventBus.dispatch('AnalyticsApplyFilter', {
stats: response.data,
type: 'autocomplete',
filter: filter
});
// Hide loading icon.
jQuery('.wpmudui-search-form .wpmudui-icon').fadeOut(400, function () {
jQuery(self.input.current).css('text-indent', '0px');
});
} else {
// Remove existing icon.
jQuery('.wpmudui-search-form .wpmudui-icon').remove();
// Show warning icon.
jQuery(self.input.current)
.before('')
.css('text-indent', '10px');
// Hide warning icon.
jQuery('.wpmudui-search-form .wpmudui-icon').fadeOut(2000, function () {
jQuery(self.input.current).css('text-indent', '0px');
});
}
}
/**
* Handle change event.
*
* This is used only for clearing filter.
*
* @param {object} ev Event
* @since 4.11.6
*/
handleChange(ev) {
this.setState({
currentFilter: ev.target.value
})
if (ev.target.value === '') {
// Dispatch event.
eventBus.dispatch('AnalyticsFilterClear', {});
}
}
render() {
return (
<>
>
);
}
}