diff --git a/src/components/ExploreButton/ExploreButton.tsx b/src/components/ExploreButton/ExploreButton.tsx new file mode 100644 index 0000000..76af292 --- /dev/null +++ b/src/components/ExploreButton/ExploreButton.tsx @@ -0,0 +1,89 @@ +import React, { FC } from 'react'; +import { cx, css } from 'emotion'; +import { stylesFactory, useTheme } from '@grafana/ui'; +import { GrafanaTheme, GrafanaThemeType } from '@grafana/data'; +import { getLocationSrv } from '@grafana/runtime'; +import { MODE_METRICS, MODE_ITEMID } from '../../datasource-zabbix/constants'; +import { renderUrl } from '../../panel-triggers/utils'; +import { FAIcon } from '../FAIcon/FAIcon'; +import { ProblemDTO } from '../../datasource-zabbix/types'; + +interface Props { + problem: ProblemDTO; + panelId: number; +} + +export const ExploreButton: FC = ({ problem, panelId }) => { + const theme = useTheme(); + const styles = getStyles(theme); + const buttonClass = cx('btn', styles.button); + + return ( + + ); +}; + +const openInExplore = (problem: ProblemDTO, panelId: number) => { + console.log(problem, panelId); + let query: any = {}; + + if (problem.items?.length === 1 && problem.hosts?.length === 1) { + const item = problem.items[0]; + const host = problem.hosts[0]; + query = { + queryType: MODE_METRICS, + group: { filter: '/.*/' }, + application: { filter: '' }, + host: { filter: host.name }, + item: { filter: item.name }, + }; + } else { + const itemids = problem.items?.map(p => p.itemid).join(','); + query = { + queryType: MODE_ITEMID, + itemids: itemids, + }; + } + + const state: any = { + datasource: problem.datasource, + context: 'explore', + originPanelId: panelId, + queries: [query], + }; + + const exploreState = JSON.stringify(state); + const url = renderUrl('/explore', { left: exploreState }); + console.log(url); + getLocationSrv().update({ path: url, query: {} }); +}; + +const getStyles = stylesFactory((theme: GrafanaTheme) => { + const actionBlue = theme.type === GrafanaThemeType.Light ? '#497dc0' : '#005f81'; + return { + button: css` + width: 6rem; + height: 2rem; + background-image: none; + background-color: ${actionBlue}; + border: 1px solid darken(${actionBlue}, 6%); + border-radius: 1px; + margin-right: 1.6rem; + + i { + vertical-align: middle; + } + + &:hover { + background-color: darken(${actionBlue}, 4%); + } + `, + icon: css` + i { + color: ${theme.colors.text}; + } + `, + }; +}); diff --git a/src/components/FAIcon/FAIcon.tsx b/src/components/FAIcon/FAIcon.tsx index 6dadcaa..04e03d1 100644 --- a/src/components/FAIcon/FAIcon.tsx +++ b/src/components/FAIcon/FAIcon.tsx @@ -7,7 +7,7 @@ interface Props { } export const FAIcon: FC = ({ icon, customClass }) => { - const wrapperClass = cx('fa-icon-container', customClass); + const wrapperClass = cx(customClass, 'fa-icon-container'); return ( diff --git a/src/components/index.ts b/src/components/index.ts index ec905c1..6a2d516 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -1,4 +1,5 @@ export { GFHeartIcon } from './GFHeartIcon/GFHeartIcon'; export { FAIcon } from './FAIcon/FAIcon'; +export { ExploreButton } from './ExploreButton/ExploreButton'; export { Tooltip } from './Tooltip/Tooltip'; export { ModalController } from './Modal/ModalController'; diff --git a/src/panel-triggers/components/Problems/ProblemDetails.tsx b/src/panel-triggers/components/Problems/ProblemDetails.tsx index c7b384c..01cf92e 100644 --- a/src/panel-triggers/components/Problems/ProblemDetails.tsx +++ b/src/panel-triggers/components/Problems/ProblemDetails.tsx @@ -1,7 +1,6 @@ import React, { PureComponent } from 'react'; import moment from 'moment'; import * as utils from '../../../datasource-zabbix/utils'; -import { MODE_ITEMID, MODE_METRICS } from '../../../datasource-zabbix/constants'; import { ProblemDTO, ZBXHost, ZBXGroup, ZBXEvent, ZBXTag, ZBXAlert } from '../../../datasource-zabbix/types'; import { ZBXItem, GFTimeRange, RTRow } from '../../types'; import { AckModal, AckProblemData } from '../AckModal'; @@ -9,9 +8,7 @@ import EventTag from '../EventTag'; import ProblemStatusBar from './ProblemStatusBar'; import AcknowledgesList from './AcknowledgesList'; import ProblemTimeline from './ProblemTimeline'; -import { FAIcon, Tooltip, ModalController } from '../../../components'; -import { renderUrl } from '../../utils'; -import { getLocationSrv } from '@grafana/runtime'; +import { FAIcon, ExploreButton, Tooltip, ModalController } from '../../../components'; interface ProblemDetailsProps extends RTRow { rootWidth: number; @@ -77,40 +74,6 @@ export class ProblemDetails extends PureComponent { - const problem = this.props.original as ProblemDTO; - let query: any = {}; - - if (problem.items?.length === 1 && problem.hosts?.length === 1) { - const item = problem.items[0]; - const host = problem.hosts[0]; - query = { - queryType: MODE_METRICS, - group: { filter: '/.*/' }, - application: { filter: '' }, - host: { filter: host.name }, - item: { filter: item.name }, - }; - } else { - const itemids = problem.items?.map(p => p.itemid).join(','); - query = { - queryType: MODE_ITEMID, - itemids: itemids, - }; - } - - const state: any = { - datasource: problem.datasource, - context: 'explore', - originPanelId: this.props.panelId, - queries: [query], - }; - - const exploreState = JSON.stringify(state); - const url = renderUrl('/explore', { left: exploreState }); - getLocationSrv().update({ path: url, query: {} }); - }; - render() { const problem = this.props.original as ProblemDTO; const alerts = this.state.alerts; @@ -133,7 +96,7 @@ export class ProblemDetails extends PureComponent {problem.items && } - + {problem.showAckButton &&
@@ -308,15 +271,3 @@ class ProblemActionButton extends PureComponent { return button; } } - -interface ExploreButtonProps { - onClick: (event?) => void; -} - -const ExploreButton: React.FC = ({ onClick }) => { - return ( - - ); -};