AddPanelPanel.tsx 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. import React from 'react';
  2. import _ from 'lodash';
  3. import config from 'app/core/config';
  4. import { PanelModel } from '../panel_model';
  5. import { DashboardModel } from '../dashboard_model';
  6. import ScrollBar from 'app/core/components/ScrollBar/ScrollBar';
  7. import store from 'app/core/store';
  8. import { LS_PANEL_COPY_KEY } from 'app/core/constants';
  9. import Highlighter from 'react-highlight-words';
  10. import { updateLocation } from 'app/core/actions';
  11. import { store as reduxStore } from 'app/store/store';
  12. export interface AddPanelPanelProps {
  13. panel: PanelModel;
  14. dashboard: DashboardModel;
  15. }
  16. export interface AddPanelPanelState {
  17. filter: string;
  18. panelPlugins: any[];
  19. copiedPanelPlugins: any[];
  20. tab: string;
  21. }
  22. export class AddPanelPanel extends React.Component<AddPanelPanelProps, AddPanelPanelState> {
  23. private scrollbar: ScrollBar;
  24. constructor(props) {
  25. super(props);
  26. this.handleCloseAddPanel = this.handleCloseAddPanel.bind(this);
  27. this.panelSizeChanged = this.panelSizeChanged.bind(this);
  28. this.state = {
  29. panelPlugins: this.getPanelPlugins(),
  30. copiedPanelPlugins: this.getCopiedPanelPlugins(),
  31. filter: '',
  32. tab: 'Add',
  33. };
  34. }
  35. componentDidMount() {
  36. this.props.panel.events.on('panel-size-changed', this.panelSizeChanged);
  37. }
  38. componentWillUnmount() {
  39. this.props.panel.events.off('panel-size-changed', this.panelSizeChanged);
  40. }
  41. panelSizeChanged() {
  42. setTimeout(() => {
  43. this.scrollbar.update();
  44. });
  45. }
  46. getPanelPlugins() {
  47. const panelsList = _.chain(config.panels)
  48. .filter({ hideFromList: false })
  49. .map(item => item)
  50. .value();
  51. const panels = [];
  52. for (let i = 0; i < panelsList.length; i++) {
  53. if (panelsList[i].id === 'graph') {
  54. panels.push(panelsList[i]);
  55. }
  56. }
  57. // add special row type
  58. panels.push({ id: 'row', name: 'Row', sort: 8, info: { logos: { small: 'public/img/icn-row.svg' } } });
  59. // add sort by sort property
  60. return panels;
  61. }
  62. getCopiedPanelPlugins() {
  63. const panels = _.chain(config.panels)
  64. .filter({ hideFromList: false })
  65. .map(item => item)
  66. .value();
  67. const copiedPanels = [];
  68. const copiedPanelJson = store.get(LS_PANEL_COPY_KEY);
  69. if (copiedPanelJson) {
  70. const copiedPanel = JSON.parse(copiedPanelJson);
  71. const pluginInfo = _.find(panels, { id: copiedPanel.type });
  72. if (pluginInfo) {
  73. const pluginCopy = _.cloneDeep(pluginInfo);
  74. pluginCopy.name = copiedPanel.title;
  75. pluginCopy.sort = -1;
  76. pluginCopy.defaults = copiedPanel;
  77. copiedPanels.push(pluginCopy);
  78. }
  79. }
  80. return _.sortBy(copiedPanels, 'sort');
  81. }
  82. handleCloseAddPanel(evt) {
  83. evt.preventDefault();
  84. this.props.dashboard.removePanel(this.props.dashboard.panels[0]);
  85. }
  86. renderText(text: string) {
  87. const searchWords = this.state.filter.split('');
  88. return <Highlighter highlightClassName="highlight-search-match" textToHighlight={text} searchWords={searchWords} />;
  89. }
  90. noCopiedPanelPlugins() {
  91. return <div className="add-panel__no-panels">No copied panels yet.</div>;
  92. }
  93. copyButton(panel) {
  94. return (
  95. <button className="btn-inverse btn" onClick={() => this.onPasteCopiedPanel(panel)} title={panel.name}>
  96. Paste copied Panel
  97. </button>
  98. );
  99. }
  100. moveToEdit(panel) {
  101. reduxStore.dispatch(
  102. updateLocation({
  103. query: {
  104. panelId: panel.id,
  105. edit: true,
  106. fullscreen: true,
  107. },
  108. partial: true,
  109. })
  110. );
  111. }
  112. onCreateNewPanel = panelPluginInfo => {
  113. const dashboard = this.props.dashboard;
  114. const { gridPos } = this.props.panel;
  115. const newPanel: any = {
  116. type: panelPluginInfo.id,
  117. title: 'Panel Title',
  118. gridPos: { x: gridPos.x, y: gridPos.y, w: gridPos.w, h: gridPos.h },
  119. };
  120. // apply panel template / defaults
  121. if (panelPluginInfo.defaults) {
  122. _.defaults(newPanel, panelPluginInfo.defaults);
  123. newPanel.gridPos.w = panelPluginInfo.defaults.gridPos.w;
  124. newPanel.gridPos.h = panelPluginInfo.defaults.gridPos.h;
  125. newPanel.title = panelPluginInfo.defaults.title;
  126. store.delete(LS_PANEL_COPY_KEY);
  127. }
  128. dashboard.addPanel(newPanel);
  129. this.moveToEdit(newPanel);
  130. dashboard.removePanel(this.props.panel);
  131. };
  132. onPasteCopiedPanel = panelPluginInfo => {
  133. const dashboard = this.props.dashboard;
  134. const { gridPos } = this.props.panel;
  135. const newPanel: any = {
  136. type: panelPluginInfo.id,
  137. title: 'Panel Title',
  138. gridPos: { x: gridPos.x, y: gridPos.y, w: gridPos.w, h: gridPos.h },
  139. };
  140. // apply panel template / defaults
  141. if (panelPluginInfo.defaults) {
  142. _.defaults(newPanel, panelPluginInfo.defaults);
  143. newPanel.gridPos.w = panelPluginInfo.defaults.gridPos.w;
  144. newPanel.gridPos.h = panelPluginInfo.defaults.gridPos.h;
  145. newPanel.title = panelPluginInfo.defaults.title;
  146. store.delete(LS_PANEL_COPY_KEY);
  147. }
  148. dashboard.addPanel(newPanel);
  149. dashboard.removePanel(this.props.panel);
  150. };
  151. onCreateNewRow = panelPluginInfo => {
  152. const dashboard = this.props.dashboard;
  153. const newRow: any = {
  154. type: panelPluginInfo.id,
  155. title: 'Row title',
  156. gridPos: { x: 0, y: 0 },
  157. };
  158. dashboard.addPanel(newRow);
  159. dashboard.removePanel(this.props.panel);
  160. };
  161. render() {
  162. const panel = this.state.panelPlugins[0];
  163. const row = this.state.panelPlugins[1];
  164. let addCopyButton;
  165. if (this.state.copiedPanelPlugins.length === 1) {
  166. addCopyButton = this.copyButton(this.state.copiedPanelPlugins[0]);
  167. }
  168. return (
  169. <div className="panel-container add-panel-container">
  170. <div className="add-panel">
  171. <div className="add-panel__header">
  172. <i className="gicon gicon-add-panel" />
  173. <button className="add-panel__close" onClick={this.handleCloseAddPanel}>
  174. <i className="fa fa-close" />
  175. </button>
  176. </div>
  177. <div className="add-panel-btn-container">
  178. <div className="gf-form-button-row">
  179. <button className="btn-success btn" onClick={() => this.onCreateNewPanel(panel)} title={panel.name}>
  180. Create new Panel
  181. </button>
  182. {addCopyButton}
  183. <button className="btn-inverse btn" onClick={() => this.onCreateNewRow(row)} title={row.name}>
  184. Add new Row
  185. </button>
  186. </div>
  187. </div>
  188. </div>
  189. </div>
  190. );
  191. }
  192. }