PanelEditor.tsx 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import React from 'react';
  2. import { PanelModel } from '../panel_model';
  3. import { DashboardModel } from '../dashboard_model';
  4. import { store } from 'app/stores/store';
  5. import { observer } from 'mobx-react';
  6. import { QueriesTab } from './QueriesTab';
  7. import classNames from 'classnames';
  8. interface PanelEditorProps {
  9. panel: PanelModel;
  10. dashboard: DashboardModel;
  11. }
  12. interface PanelEditorTab {
  13. id: string;
  14. text: string;
  15. icon: string;
  16. }
  17. @observer
  18. export class PanelEditor extends React.Component<PanelEditorProps, any> {
  19. tabs: PanelEditorTab[];
  20. constructor(props) {
  21. super(props);
  22. this.tabs = [
  23. { id: 'queries', text: 'Queries', icon: 'fa fa-database' },
  24. { id: 'viz', text: 'Visualization', icon: 'fa fa-line-chart' },
  25. ];
  26. }
  27. renderQueriesTab() {
  28. return <QueriesTab panel={this.props.panel} dashboard={this.props.dashboard} />;
  29. }
  30. renderVizTab() {
  31. return <h2>Visualizations</h2>;
  32. }
  33. onChangeTab = (tab: PanelEditorTab) => {
  34. store.view.updateQuery({ tab: tab.id }, false);
  35. };
  36. render() {
  37. const activeTab: string = store.view.query.get('tab') || 'queries';
  38. return (
  39. <div className="tabbed-view tabbed-view--panel-edit-new">
  40. <div className="tabbed-view-header">
  41. <ul className="gf-tabs">
  42. {this.tabs.map(tab => {
  43. return <TabItem tab={tab} activeTab={activeTab} onClick={this.onChangeTab} key={tab.id} />;
  44. })}
  45. </ul>
  46. <button className="tabbed-view-close-btn" ng-click="ctrl.exitFullscreen();">
  47. <i className="fa fa-remove" />
  48. </button>
  49. </div>
  50. <div className="tabbed-view-body">
  51. {activeTab === 'queries' && this.renderQueriesTab()}
  52. {activeTab === 'viz' && this.renderVizTab()}
  53. </div>
  54. </div>
  55. );
  56. }
  57. }
  58. interface TabItemParams {
  59. tab: PanelEditorTab;
  60. activeTab: string;
  61. onClick: (tab: PanelEditorTab) => void;
  62. }
  63. function TabItem({ tab, activeTab, onClick }: TabItemParams) {
  64. const tabClasses = classNames({
  65. 'gf-tabs-link': true,
  66. active: activeTab === tab.id,
  67. });
  68. return (
  69. <li className="gf-tabs-item" key={tab.id}>
  70. <a className={tabClasses} onClick={() => onClick(tab)}>
  71. <i className={tab.icon} />
  72. {tab.text}
  73. </a>
  74. </li>
  75. );
  76. }