import React from 'react'; import _ from 'lodash'; import config from 'app/core/config'; import { PanelModel } from '../panel_model'; import { PanelContainer } from './PanelContainer'; import ScrollBar from 'app/core/components/ScrollBar/ScrollBar'; export interface AddPanelPanelProps { panel: PanelModel; getPanelContainer: () => PanelContainer; } export interface AddPanelPanelState { filter: string; panelPlugins: any[]; clipboardPanel: any; } export class AddPanelPanel extends React.Component { constructor(props) { super(props); this.state = { panelPlugins: this.getPanelPlugins(), clipboardPanel: this.getClipboardPanel(), filter: '', }; this.onPanelSelected = this.onPanelSelected.bind(this); this.onClipboardPanelSelected = this.onClipboardPanelSelected.bind(this); } getPanelPlugins() { let panels = _.chain(config.panels) .filter({ hideFromList: false }) .map(item => item) .value(); // add special row type panels.push({ id: 'row', name: 'Row', sort: 8, info: { logos: { small: 'public/img/icn-row.svg' } } }); // add sort by sort property return _.sortBy(panels, 'sort'); } getClipboardPanel() { return this.props.getPanelContainer().getClipboardPanel(); } onPanelSelected(panelPluginInfo) { const panelContainer = this.props.getPanelContainer(); const dashboard = panelContainer.getDashboard(); const { gridPos } = this.props.panel; var newPanel: any = { type: panelPluginInfo.id, title: 'Panel Title', gridPos: { x: gridPos.x, y: gridPos.y, w: gridPos.w, h: gridPos.h }, }; if (panelPluginInfo.id === 'row') { newPanel.title = 'Row title'; newPanel.gridPos = { x: 0, y: 0 }; } dashboard.addPanel(newPanel); dashboard.removePanel(this.props.panel); } onClipboardPanelSelected(panel) { const panelContainer = this.props.getPanelContainer(); const dashboard = panelContainer.getDashboard(); const { gridPos } = this.props.panel; panel.gridPos.x = gridPos.x; panel.gridPos.y = gridPos.y; dashboard.addPanel(panel); dashboard.removePanel(this.props.panel); } renderClipboardPanel(copiedPanel) { const panel = copiedPanel.panel; const title = `Paste copied panel '${panel.title}' from '${copiedPanel.dashboard}'`; return (
this.onClipboardPanelSelected(panel)} title={title}>
Paste copied panel
); } renderPanelItem(panel) { return (
this.onPanelSelected(panel)} title={panel.name}>
{panel.name}
); } render() { return (
New Panel Select a visualization
{this.state.clipboardPanel && this.renderClipboardPanel(this.state.clipboardPanel)} {this.state.panelPlugins.map(this.renderPanelItem.bind(this))}
); } }