AddPanelPanel.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. }
  15. export class AddPanelPanel extends React.Component<AddPanelPanelProps, AddPanelPanelState> {
  16. constructor(props) {
  17. super(props);
  18. this.state = {
  19. panelPlugins: this.getPanelPlugins(),
  20. filter: '',
  21. };
  22. this.onPanelSelected = this.onPanelSelected.bind(this);
  23. }
  24. getPanelPlugins() {
  25. let panels = _.chain(config.panels)
  26. .filter({hideFromList: false})
  27. .map(item => item)
  28. .value();
  29. // add special row type
  30. panels.push({id: 'row', name: 'Row', sort: 8, info: {logos: {small: 'public/img/icn-row.svg'}}});
  31. // add sort by sort property
  32. return _.sortBy(panels, 'sort');
  33. }
  34. onPanelSelected(panelPluginInfo) {
  35. const panelContainer = this.props.getPanelContainer();
  36. const dashboard = panelContainer.getDashboard();
  37. const {gridPos} = this.props.panel;
  38. var newPanel: any = {
  39. type: panelPluginInfo.id,
  40. title: 'Panel Title',
  41. gridPos: {x: gridPos.x, y: gridPos.y, w: gridPos.w, h: gridPos.h}
  42. };
  43. if (panelPluginInfo.id === 'row') {
  44. newPanel.title = 'Row title';
  45. newPanel.gridPos = {x: 0, y: 0};
  46. }
  47. dashboard.addPanel(newPanel);
  48. dashboard.removePanel(this.props.panel);
  49. }
  50. renderPanelItem(panel) {
  51. return (
  52. <div key={panel.id} className="add-panel__item" onClick={() => this.onPanelSelected(panel)} title={panel.name}>
  53. <img className="add-panel__item-img" src={panel.info.logos.small} />
  54. <div className="add-panel__item-name">{panel.name}</div>
  55. </div>
  56. );
  57. }
  58. render() {
  59. return (
  60. <div className="panel-container">
  61. <div className="add-panel">
  62. <div className="add-panel__header">
  63. <i className="gicon gicon-add-panel"></i>
  64. <span className="add-panel__title">New Panel</span>
  65. <span className="add-panel__sub-title">Select a visualization</span>
  66. </div>
  67. <ScrollBar className="add-panel__items">
  68. {this.state.panelPlugins.map(this.renderPanelItem.bind(this))}
  69. </ScrollBar>
  70. </div>
  71. </div>
  72. );
  73. }
  74. }