import React, { PureComponent } from 'react'; import moment from 'moment'; import * as utils from '../../../datasource-zabbix/utils'; import { ZBXTrigger, ZBXItem, ZBXAcknowledge, ZBXHost, ZBXGroup, ZBXEvent, GFTimeRange, RTRow, ZBXTag } from '../../types'; import { Modal, AckProblemData } from '../Modal'; import EventTag from '../EventTag'; import Tooltip from '../Tooltip/Tooltip'; import ProblemStatusBar from './ProblemStatusBar'; import AcknowledgesList from './AcknowledgesList'; import ProblemTimeline from './ProblemTimeline'; import FAIcon from '../FAIcon'; interface ProblemDetailsProps extends RTRow { rootWidth: number; timeRange: GFTimeRange; getProblemEvents: (problem: ZBXTrigger) => Promise; onProblemAck?: (problem: ZBXTrigger, data: AckProblemData) => Promise | any; onTagClick?: (tag: ZBXTag, datasource: string, ctrlKey?: boolean, shiftKey?: boolean) => void; } interface ProblemDetailsState { events: ZBXEvent[]; show: boolean; showAckDialog: boolean; } export default class ProblemDetails extends PureComponent { constructor(props) { super(props); this.state = { events: [], show: false, showAckDialog: false, }; } componentDidMount() { this.fetchProblemEvents(); requestAnimationFrame(() => { this.setState({ show: true }); }); } handleTagClick = (tag: ZBXTag, ctrlKey?: boolean, shiftKey?: boolean) => { if (this.props.onTagClick) { this.props.onTagClick(tag, this.props.original.datasource, ctrlKey, shiftKey); } } fetchProblemEvents() { const problem = this.props.original; this.props.getProblemEvents(problem) .then(events => { this.setState({ events }); }); } ackProblem = (data: AckProblemData) => { const problem = this.props.original as ZBXTrigger; console.log('acknowledge: ', problem.lastEvent && problem.lastEvent.eventid, data); return this.props.onProblemAck(problem, data).then(result => { this.closeAckDialog(); }).catch(err => { console.log(err); this.closeAckDialog(); }); } showAckDialog = () => { this.setState({ showAckDialog: true }); } closeAckDialog = () => { this.setState({ showAckDialog: false }); } render() { const problem = this.props.original as ZBXTrigger; const rootWidth = this.props.rootWidth; const displayClass = this.state.show ? 'show' : ''; const wideLayout = rootWidth > 1200; const compactStatusBar = rootWidth < 800 || problem.acknowledges && wideLayout && rootWidth < 1400; const age = moment.unix(problem.lastchangeUnix).fromNow(true); const showAcknowledges = problem.acknowledges && problem.acknowledges.length !== 0; return (
{age}
{problem.items && }
{problem.comments &&
Description:  {problem.comments}
} {problem.tags && problem.tags.length > 0 &&
{problem.tags && problem.tags.map(tag => ) }
} {this.state.events.length > 0 && } {showAcknowledges && !wideLayout &&
Acknowledges
}
{showAcknowledges && wideLayout &&
Acknowledges
}
{problem.datasource}
{problem.proxy &&
{problem.proxy}
} {problem.groups && } {problem.hosts && }
); } } interface ProblemItemProps { item: ZBXItem; showName?: boolean; } function ProblemItem(props: ProblemItemProps) { const { item, showName } = props; const itemName = utils.expandItemName(item.name, item.key_); return (
{showName && {item.name}: } {item.lastvalue}
); } interface ProblemItemsProps { items: ZBXItem[]; } class ProblemItems extends PureComponent { render() { const { items } = this.props; return (items.length > 1 ? items.map(item => ) : ); } } interface ProblemGroupsProps { groups: ZBXGroup[]; className?: string; } class ProblemGroups extends PureComponent { render() { return this.props.groups.map(g => (
{g.name}
)); } } interface ProblemHostsProps { hosts: ZBXHost[]; className?: string; } class ProblemHosts extends PureComponent { render() { return this.props.hosts.map(h => (
{h.name}
)); } } interface ProblemActionButtonProps { icon: string; tooltip?: string; className?: string; onClick?: (event?) => void; } class ProblemActionButton extends PureComponent { handleClick = (event) => { this.props.onClick(event); } render() { const { icon, tooltip, className } = this.props; let button = ( ); if (tooltip) { button = ( {button} ); } return button; } }