AddPanelPanel.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import React from 'react';
  2. import _ from 'lodash';
  3. import config from 'app/core/config';
  4. import { PanelModel } from '../panel_model';
  5. import { PanelContainer } from './PanelContainer';
  6. import ScrollBar from 'app/core/components/ScrollBar/ScrollBar';
  7. export interface AddPanelPanelProps {
  8. panel: PanelModel;
  9. getPanelContainer: () => PanelContainer;
  10. }
  11. export interface AddPanelPanelState {
  12. filter: string;
  13. panelPlugins: any[];
  14. clipboardPanel: any;
  15. }
  16. export class AddPanelPanel extends React.Component<AddPanelPanelProps, AddPanelPanelState> {
  17. constructor(props) {
  18. super(props);
  19. this.state = {
  20. panelPlugins: this.getPanelPlugins(),
  21. clipboardPanel: this.getClipboardPanel(),
  22. filter: '',
  23. };
  24. this.onPanelSelected = this.onPanelSelected.bind(this);
  25. this.onClipboardPanelSelected = this.onClipboardPanelSelected.bind(this);
  26. }
  27. getPanelPlugins() {
  28. let panels = _.chain(config.panels)
  29. .filter({ hideFromList: false })
  30. .map(item => item)
  31. .value();
  32. // add special row type
  33. panels.push({ id: 'row', name: 'Row', sort: 8, info: { logos: { small: 'public/img/icn-row.svg' } } });
  34. // add sort by sort property
  35. return _.sortBy(panels, 'sort');
  36. }
  37. getClipboardPanel() {
  38. return this.props.getPanelContainer().getClipboardPanel();
  39. }
  40. onPanelSelected(panelPluginInfo) {
  41. const panelContainer = this.props.getPanelContainer();
  42. const dashboard = panelContainer.getDashboard();
  43. const { gridPos } = this.props.panel;
  44. var newPanel: any = {
  45. type: panelPluginInfo.id,
  46. title: 'Panel Title',
  47. gridPos: { x: gridPos.x, y: gridPos.y, w: gridPos.w, h: gridPos.h },
  48. };
  49. if (panelPluginInfo.id === 'row') {
  50. newPanel.title = 'Row title';
  51. newPanel.gridPos = { x: 0, y: 0 };
  52. }
  53. dashboard.addPanel(newPanel);
  54. dashboard.removePanel(this.props.panel);
  55. }
  56. onClipboardPanelSelected(panel) {
  57. const panelContainer = this.props.getPanelContainer();
  58. const dashboard = panelContainer.getDashboard();
  59. const { gridPos } = this.props.panel;
  60. panel.gridPos.x = gridPos.x;
  61. panel.gridPos.y = gridPos.y;
  62. dashboard.addPanel(panel);
  63. dashboard.removePanel(this.props.panel);
  64. }
  65. renderClipboardPanel(copiedPanel) {
  66. const panel = copiedPanel.panel;
  67. const title = `Paste copied panel '${panel.title}' from '${copiedPanel.dashboard}'`;
  68. return (
  69. <div className="add-panel__item" onClick={() => this.onClipboardPanelSelected(panel)} title={title}>
  70. <div className="add-panel__item-icon">
  71. <i className="fa fa-paste fa-2x fa-fw" />
  72. </div>
  73. <div className="add-panel__item-name">Paste copied panel</div>
  74. </div>
  75. );
  76. }
  77. renderPanelItem(panel) {
  78. return (
  79. <div key={panel.id} className="add-panel__item" onClick={() => this.onPanelSelected(panel)} title={panel.name}>
  80. <img className="add-panel__item-img" src={panel.info.logos.small} />
  81. <div className="add-panel__item-name">{panel.name}</div>
  82. </div>
  83. );
  84. }
  85. render() {
  86. return (
  87. <div className="panel-container">
  88. <div className="add-panel">
  89. <div className="add-panel__header">
  90. <i className="gicon gicon-add-panel" />
  91. <span className="add-panel__title">New Panel</span>
  92. <span className="add-panel__sub-title">Select a visualization</span>
  93. </div>
  94. <ScrollBar className="add-panel__items">
  95. {this.state.clipboardPanel && this.renderClipboardPanel(this.state.clipboardPanel)}
  96. {this.state.panelPlugins.map(this.renderPanelItem.bind(this))}
  97. </ScrollBar>
  98. </div>
  99. </div>
  100. );
  101. }
  102. }