DashboardRow.tsx 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import React from 'react';
  2. import classNames from 'classnames';
  3. import { PanelModel } from '../panel_model';
  4. import { PanelContainer } from './PanelContainer';
  5. import appEvents from 'app/core/app_events';
  6. export interface DashboardRowProps {
  7. panel: PanelModel;
  8. getPanelContainer: () => PanelContainer;
  9. }
  10. export class DashboardRow extends React.Component<DashboardRowProps, any> {
  11. constructor(props) {
  12. super(props);
  13. this.state = {
  14. collapsed: this.props.panel.collapsed,
  15. };
  16. this.toggle = this.toggle.bind(this);
  17. this.openSettings = this.openSettings.bind(this);
  18. }
  19. toggle() {
  20. const panelContainer = this.props.getPanelContainer();
  21. const dashboard = panelContainer.getDashboard();
  22. dashboard.toggleRow(this.props.panel);
  23. this.setState(prevState => {
  24. return { collapsed: !prevState.collapsed };
  25. });
  26. }
  27. openSettings() {
  28. appEvents.emit('show-modal', {
  29. templateHtml: `<row-options row="model.row" on-updated="model.onUpdated()" on-delete="model.onDelete()" dismiss="dismiss()"></row-options>`,
  30. modalClass: 'modal--narrow',
  31. model: {
  32. row: this.props.panel,
  33. onUpdated: this.forceUpdate.bind(this),
  34. onDelete: this.onDelete.bind(this),
  35. },
  36. });
  37. }
  38. onDelete() {
  39. let text2 = '';
  40. if (this.props.panel.panels.length) {
  41. text2 = 'This will also remove ' + this.props.panel.panels.length + ' panels';
  42. }
  43. appEvents.emit('confirm-modal', {
  44. title: 'Delete Row',
  45. text: 'Are you sure you want to remove this row?',
  46. text2: text2,
  47. icon: 'fa-trash',
  48. onConfirm: () => {
  49. const panelContainer = this.props.getPanelContainer();
  50. const dashboard = panelContainer.getDashboard();
  51. dashboard.removePanel(this.props.panel);
  52. },
  53. });
  54. }
  55. render() {
  56. const classes = classNames({ 'dashboard-row': true, 'dashboard-row--collapsed': this.state.collapsed });
  57. const chevronClass = classNames({
  58. fa: true,
  59. 'fa-chevron-down': !this.state.collapsed,
  60. 'fa-chevron-right': this.state.collapsed,
  61. });
  62. const hiddenPanels = this.props.panel.panels ? this.props.panel.panels.length : 0;
  63. return (
  64. <div className={classes}>
  65. <a className="dashboard-row__title pointer" onClick={this.toggle}>
  66. <i className={chevronClass} />
  67. {this.props.panel.title}
  68. <span className="dashboard-row__panel_count">({hiddenPanels} hidden panels)</span>
  69. </a>
  70. <div className="dashboard-row__actions">
  71. <a className="pointer" onClick={this.openSettings}>
  72. <i className="fa fa-cog" />
  73. </a>
  74. </div>
  75. <div className="dashboard-row__drag grid-drag-handle" />
  76. </div>
  77. );
  78. }
  79. }