import React from 'react'; import {ItemUrgency, TypeIcon} from 'apps/search/components'; import {TimeElem} from 'apps/search/components/TimeElem'; import {IDesk, IStage} from 'superdesk-api'; import {gettext} from 'core/utils'; import {dataApi} from 'core/helpers/CrudManager'; import {CardComponent} from './CardComponent'; import {CardListComponent} from './CardListComponent'; interface IProps { desks: Array; stages: Array; deskFilter: string; filters: object; onFilterChange(filters: any): void; } interface IState { stagesCount: Array; filteredDesks: Array; view: 'card' | 'detailed'; } export class OverviewComponent extends React.Component { private hashColors: Array = ['#FF9800', '#028AC7', '#E91E63', '#4CAF50', '#607D8B', '#B09E00', '#00BBD4', '#9C27B0', '#B6C423', '#006A78', '#009688', '#402471']; constructor(props) { super(props); this.state = { stagesCount: null, filteredDesks: [], view: 'card', }; } componentDidMount() { dataApi.query('desks/all/overview/stages', 1, {field: '_id', direction: 'ascending'}, {}) .then((res) => this.setState({ stagesCount: res._items, filteredDesks: this.props.desks, })); } componentDidUpdate(prevProps: IProps) { const hasFilters = Object.keys(this.props.filters).some((item: any) => this.props.filters[item] && this.props.filters[item].length); if (hasFilters) { if (this.props.filters === prevProps.filters) { return; } dataApi.create('desks/all/overview/stages', { filters: this.props.filters, }).then((res) => { this.setState({stagesCount: res['_items'], view: 'detailed'}); }); } else if (this.state.view === 'detailed') { // eslint-disable-next-line react/no-did-update-set-state this.setState({view: 'card'}); } // Filter items by desk name if (this.props.deskFilter !== prevProps.deskFilter) { let desks = this.props.desks; this.props.deskFilter ? desks = desks.filter((item) => item.name.toLowerCase().indexOf( this.props.deskFilter.toLowerCase(), ) !== -1) : desks = this.props.desks; // eslint-disable-next-line react/no-did-update-set-state this.setState({filteredDesks: desks}); } if (this.props.desks !== prevProps.desks) { // eslint-disable-next-line react/no-did-update-set-state this.setState({filteredDesks: this.props.desks}); } } componentWillUnmount() { this.props.onFilterChange([]); } getDeskTotal(desk: IDesk) { let totalItemsInDesk = 0; (this.props.stages?.[desk._id] ?? []).map((item: IStage) => totalItemsInDesk += this.getStageTotal(item)); return totalItemsInDesk; } getStageTotal(stage: IStage) { if (!this.state.stagesCount) { return 0; } let findStage = this.state.stagesCount.find((count) => count.stage === stage._id); return findStage ? findStage.count : 0; } getStageItems(stage: IStage) { if (!this.state.stagesCount) { return 0; } let findStage = this.state.stagesCount.find((count) => count.stage === stage._id); return findStage ? findStage.docs : []; } getDonutData(desk: IDesk) { let labels = []; let dataSet = { data: [], backgroundColor: [], }; (this.props.stages?.[desk._id] ?? []).map((item: IStage, i: number) => { labels.push(item.name); dataSet.data.push(this.getStageTotal(item)); dataSet.backgroundColor.push(this.hashColors[i]); return dataSet; }); return { labels: labels, datasets: [dataSet], }; } render() { if (this.state.view === 'detailed') { return (
{this.state.filteredDesks.map((desk, index) => this.getDeskTotal(desk) > 0 ? (

{desk.name}

{(this.props.stages?.[desk._id] ?? []).map((stage) => ( this.getStageItems(stage).length ? (
{stage.name}
    {this.getStageItems(stage).map((item, key) => (
  • {item.slugline} {item.headline}
  • ), )}
) : null ))}
) : null, )}
); } else { return (
{this.state.filteredDesks.map((desk, index) => ( { (this.props.stages?.[desk._id] ?? []).map((item, i) => ( )) } ))}
); } } }