import React, { useState, useEffect } from 'react'; import { css } from '@emotion/css'; // eslint-disable-next-line import moment from 'moment'; import { TimeRange, DataSourceRef, GrafanaTheme2 } from '@grafana/data'; import { Tooltip, useStyles2 } from '@grafana/ui'; import { getDataSourceSrv } from '@grafana/runtime'; import { ProblemDTO, ZBXAlert, ZBXEvent, ZBXTag } from '../../../datasource/types'; import { APIExecuteScriptResponse, ZBXScript } from '../../../datasource/zabbix/connectors/zabbix_api/types'; import { AckModal, AckProblemData } from '../AckModal'; import { EventTag } from '../EventTag'; import AcknowledgesList from './AcknowledgesList'; import ProblemTimeline from './ProblemTimeline'; import { AckButton, ExecScriptButton, ExploreButton, FAIcon, ModalController } from '../../../components'; import { ExecScriptData, ExecScriptModal } from '../ExecScriptModal'; import ProblemStatusBar from './ProblemStatusBar'; import { RTRow } from '../../types'; import { ProblemItems } from './ProblemItems'; import { ProblemHosts, ProblemHostsDescription } from './ProblemHosts'; import { ProblemGroups } from './ProblemGroups'; import { ProblemExpression } from './ProblemExpression'; interface Props extends RTRow { rootWidth: number; timeRange: TimeRange; showTimeline?: boolean; panelId?: number; getProblemEvents: (problem: ProblemDTO) => Promise; getProblemAlerts: (problem: ProblemDTO) => Promise; getScripts: (problem: ProblemDTO) => Promise; onExecuteScript(problem: ProblemDTO, scriptid: string): Promise; onProblemAck?: (problem: ProblemDTO, data: AckProblemData) => Promise | any; onTagClick?: (tag: ZBXTag, datasource: DataSourceRef | string, ctrlKey?: boolean, shiftKey?: boolean) => void; } export const ProblemDetails = ({ original, rootWidth, timeRange, showTimeline, panelId, getProblemAlerts, getProblemEvents, getScripts, onExecuteScript, onProblemAck, onTagClick, }: Props) => { const [events, setEvents] = useState([]); const [alerts, setAletrs] = useState([]); const [show, setShow] = useState(false); useEffect(() => { if (showTimeline) { fetchProblemEvents(); } fetchProblemAlerts(); requestAnimationFrame(() => { setShow(true); }); }, []); const fetchProblemEvents = async () => { const problem = original; const events = await getProblemEvents(problem); setEvents(events); }; const fetchProblemAlerts = async () => { const problem = original; const alerts = await getProblemAlerts(problem); setAletrs(alerts); }; const handleTagClick = (tag: ZBXTag, datasource: DataSourceRef | string, ctrlKey?: boolean, shiftKey?: boolean) => { if (onTagClick) { onTagClick(tag, datasource, ctrlKey, shiftKey); } }; const ackProblem = (data: AckProblemData) => { const problem = original as ProblemDTO; return onProblemAck(problem, data); }; const getScriptsInternal = () => { const problem = original as ProblemDTO; return getScripts(problem); }; const onExecuteScriptInternal = (data: ExecScriptData) => { const problem = original as ProblemDTO; return onExecuteScript(problem, data.scriptid); }; const problem = original as ProblemDTO; const displayClass = show ? 'show' : ''; const wideLayout = rootWidth > 1200; const compactStatusBar = rootWidth < 800 || (problem.acknowledges && wideLayout && rootWidth < 1400); const age = moment.unix(problem.timestamp).fromNow(true); const showAcknowledges = problem.acknowledges && problem.acknowledges.length !== 0; const problemSeverity = Number(problem.severity); let dsName: string = original.datasource as string; if ((original.datasource as DataSourceRef)?.uid) { const dsInstance = getDataSourceSrv().getInstanceSettings((original.datasource as DataSourceRef).uid); dsName = dsInstance.name; } const styles = useStyles2(getStyles); return (
{problem.showAckButton && (
{({ showModal, hideModal }) => ( { showModal(ExecScriptModal, { getScripts: getScriptsInternal, onSubmit: onExecuteScriptInternal, onDismiss: hideModal, }); }} /> )} {({ showModal, hideModal }) => ( { showModal(AckModal, { canClose: problem.manual_close === '1', severity: problemSeverity, onSubmit: ackProblem, onDismiss: hideModal, }); }} /> )}
)}
{age}
{problem.items && }
{problem.comments && (
}> Description:  {/* {problem.comments} */}
)} {problem.items && (
)} {problem.hosts && (
)} {problem.tags && problem.tags.length > 0 && (
{problem.tags && problem.tags.map((tag) => ( ))}
)} {showTimeline && events.length > 0 && } {showAcknowledges && !wideLayout && (
Acknowledges
)}
{showAcknowledges && wideLayout && (
Acknowledges
)}
{dsName}
{problem.proxy && (
{problem.proxy}
)} {problem.groups && } {problem.hosts && }
); }; const getStyles = (theme: GrafanaTheme2) => ({ problemDetails: css` position: relative; flex: 10 1 auto; // padding: 0.5rem 1rem 0.5rem 1.2rem; padding: ${theme.spacing(0.5)} ${theme.spacing(1)} ${theme.spacing(0.5)} ${theme.spacing(1.2)} display: flex; flex-direction: column; // white-space: pre-line; `, });