DashboardRow.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import React from 'react';
  2. import classNames from 'classnames';
  3. import { PanelModel } from '../../state/PanelModel';
  4. import { DashboardModel } from '../../state/DashboardModel';
  5. import templateSrv from 'app/features/templating/template_srv';
  6. import appEvents from 'app/core/app_events';
  7. export interface DashboardRowProps {
  8. panel: PanelModel;
  9. dashboard: DashboardModel;
  10. }
  11. export class DashboardRow extends React.Component<DashboardRowProps, any> {
  12. constructor(props) {
  13. super(props);
  14. this.state = {
  15. collapsed: this.props.panel.collapsed,
  16. };
  17. appEvents.on('template-variable-value-updated', this.onVariableUpdated);
  18. }
  19. componentWillUnmount() {
  20. appEvents.off('template-variable-value-updated', this.onVariableUpdated);
  21. }
  22. onVariableUpdated = () => {
  23. this.forceUpdate();
  24. }
  25. onToggle = () => {
  26. this.props.dashboard.toggleRow(this.props.panel);
  27. this.setState(prevState => {
  28. return { collapsed: !prevState.collapsed };
  29. });
  30. }
  31. onUpdate = () => {
  32. this.props.dashboard.processRepeats();
  33. this.forceUpdate();
  34. }
  35. onOpenSettings = () => {
  36. appEvents.emit('show-modal', {
  37. templateHtml: `<row-options row="model.row" on-updated="model.onUpdated()" dismiss="dismiss()"></row-options>`,
  38. modalClass: 'modal--narrow',
  39. model: {
  40. row: this.props.panel,
  41. onUpdated: this.onUpdate,
  42. },
  43. });
  44. }
  45. onDelete = () => {
  46. appEvents.emit('confirm-modal', {
  47. title: 'Delete Row',
  48. text: 'Are you sure you want to remove this row and all its panels?',
  49. altActionText: 'Delete row only',
  50. icon: 'fa-trash',
  51. onConfirm: () => {
  52. this.props.dashboard.removeRow(this.props.panel, true);
  53. },
  54. onAltAction: () => {
  55. this.props.dashboard.removeRow(this.props.panel, false);
  56. },
  57. });
  58. }
  59. render() {
  60. const classes = classNames({
  61. 'dashboard-row': true,
  62. 'dashboard-row--collapsed': this.state.collapsed,
  63. });
  64. const chevronClass = classNames({
  65. fa: true,
  66. 'fa-chevron-down': !this.state.collapsed,
  67. 'fa-chevron-right': this.state.collapsed,
  68. });
  69. const title = templateSrv.replaceWithText(this.props.panel.title, this.props.panel.scopedVars);
  70. const count = this.props.panel.panels ? this.props.panel.panels.length : 0;
  71. const panels = count === 1 ? 'panel' : 'panels';
  72. const canEdit = this.props.dashboard.meta.canEdit === true;
  73. return (
  74. <div className={classes}>
  75. <a className="dashboard-row__title pointer" onClick={this.onToggle}>
  76. <i className={chevronClass} />
  77. {title}
  78. <span className="dashboard-row__panel_count">
  79. ({count} {panels})
  80. </span>
  81. </a>
  82. {canEdit && (
  83. <div className="dashboard-row__actions">
  84. <a className="pointer" onClick={this.onOpenSettings}>
  85. <i className="fa fa-cog" />
  86. </a>
  87. <a className="pointer" onClick={this.onDelete}>
  88. <i className="fa fa-trash" />
  89. </a>
  90. </div>
  91. )}
  92. {this.state.collapsed === true && (
  93. <div className="dashboard-row__toggle-target" onClick={this.onToggle}>
  94. &nbsp;
  95. </div>
  96. )}
  97. {canEdit && <div className="dashboard-row__drag grid-drag-handle" />}
  98. </div>
  99. );
  100. }
  101. }