AlertRuleItem.tsx 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import React, { PureComponent } from 'react';
  2. import { connect } from 'react-redux';
  3. import Highlighter from 'react-highlight-words';
  4. import classNames from 'classnames/bind';
  5. import { togglePauseAlertRule } from './state/actions';
  6. import { AlertRule } from '../../types';
  7. export interface Props {
  8. rule: AlertRule;
  9. search: string;
  10. togglePauseAlertRule: typeof togglePauseAlertRule;
  11. }
  12. class AlertRuleItem extends PureComponent<Props, any> {
  13. togglePaused = () => {
  14. const { rule } = this.props;
  15. this.props.togglePauseAlertRule(rule.id, { paused: rule.state !== 'paused' });
  16. };
  17. renderText(text: string) {
  18. return (
  19. <Highlighter
  20. highlightClassName="highlight-search-match"
  21. textToHighlight={text}
  22. searchWords={[this.props.search]}
  23. />
  24. );
  25. }
  26. render() {
  27. const { rule } = this.props;
  28. const stateClass = classNames({
  29. fa: true,
  30. 'fa-play': rule.state === 'paused',
  31. 'fa-pause': rule.state !== 'paused',
  32. });
  33. const ruleUrl = `${rule.url}?panelId=${rule.panelId}&fullscreen=true&edit=true&tab=alert`;
  34. return (
  35. <li className="alert-rule-item">
  36. <span className={`alert-rule-item__icon ${rule.stateClass}`}>
  37. <i className={rule.stateIcon} />
  38. </span>
  39. <div className="alert-rule-item__body">
  40. <div className="alert-rule-item__header">
  41. <div className="alert-rule-item__name">
  42. <a href={ruleUrl}>{this.renderText(rule.name)}</a>
  43. </div>
  44. <div className="alert-rule-item__text">
  45. <span className={`${rule.stateClass}`}>{this.renderText(rule.stateText)}</span>
  46. <span className="alert-rule-item__time"> for {rule.stateAge}</span>
  47. </div>
  48. </div>
  49. {rule.info && <div className="small muted alert-rule-item__info">{this.renderText(rule.info)}</div>}
  50. </div>
  51. <div className="alert-rule-item__actions">
  52. <button
  53. className="btn btn-small btn-inverse alert-list__btn width-2"
  54. title="Pausing an alert rule prevents it from executing"
  55. onClick={this.togglePaused}
  56. >
  57. <i className={stateClass} />
  58. </button>
  59. <a className="btn btn-small btn-inverse alert-list__btn width-2" href={ruleUrl} title="Edit alert rule">
  60. <i className="icon-gf icon-gf-settings" />
  61. </a>
  62. </div>
  63. </li>
  64. );
  65. }
  66. }
  67. export default connect(null, {
  68. togglePauseAlertRule,
  69. })(AlertRuleItem);