// Libraries import React, { PureComponent, SFC } from 'react'; // Services & Utils import { AngularComponent, getAngularLoader } from 'app/core/services/AngularLoader'; import appEvents from 'app/core/app_events'; // Components import { EditorTabBody, EditorToolbarView } from '../dashboard/dashgrid/EditorTabBody'; import EmptyListCTA from 'app/core/components/EmptyListCTA/EmptyListCTA'; import StateHistory from './StateHistory'; import 'app/features/alerting/AlertTabCtrl'; // Types import { DashboardModel } from '../dashboard/dashboard_model'; import { PanelModel } from '../dashboard/panel_model'; import { TestRuleButton } from './TestRuleButton'; interface Props { angularPanel?: AngularComponent; dashboard: DashboardModel; panel: PanelModel; } interface LoadingPlaceholderProps { text: string; } const LoadingPlaceholder: SFC = ({ text }) => (
{text}
); export class AlertTab extends PureComponent { element: any; component: AngularComponent; panelCtrl: any; componentDidMount() { if (this.shouldLoadAlertTab()) { this.loadAlertTab(); } } componentDidUpdate(prevProps: Props) { if (this.shouldLoadAlertTab()) { this.loadAlertTab(); } } shouldLoadAlertTab() { return this.props.angularPanel && this.element && !this.component; } componentWillUnmount() { if (this.component) { this.component.destroy(); } } loadAlertTab() { const { angularPanel } = this.props; const scope = angularPanel.getScope(); // When full page reloading in edit mode the angular panel has on fully compiled & instantiated yet if (!scope.$$childHead) { setTimeout(() => { this.forceUpdate(); }); return; } this.panelCtrl = scope.$$childHead.ctrl; const loader = getAngularLoader(); const template = ''; const scopeProps = { ctrl: this.panelCtrl }; this.component = loader.load(this.element, scopeProps, template); } stateHistory = (): EditorToolbarView => { return { title: 'State history', render: () => { return ( ); }, }; }; deleteAlert = (): EditorToolbarView => { const { panel } = this.props; return { title: 'Delete', btnType: 'danger', onClick: () => { appEvents.emit('confirm-modal', { title: 'Delete Alert', text: 'Are you sure you want to delete this alert rule?', text2: 'You need to save dashboard for the delete to take effect', icon: 'fa-trash', yesText: 'Delete', onConfirm: () => { delete panel.alert; panel.thresholds = []; this.panelCtrl.alertState = null; this.panelCtrl.render(); this.forceUpdate(); }, }); }, }; }; renderTestRuleButton = () => { const { panel, dashboard } = this.props; return ; }; testRule = (): EditorToolbarView => ({ title: 'Test Rule', render: () => this.renderTestRuleButton(), }); onAddAlert = () => { this.panelCtrl._enableAlert(); this.component.digest(); this.forceUpdate(); }; render() { const { alert } = this.props.panel; const toolbarItems = alert ? [this.stateHistory(), this.testRule(), this.deleteAlert()] : []; const model = { title: 'Panel has no alert rule defined', icon: 'icon-gf icon-gf-alert', onClick: this.onAddAlert, buttonTitle: 'Create Alert', }; return ( <>
(this.element = element)} /> {!alert && } ); } }