import React, { PureComponent } from 'react'; import { css, cx } from 'emotion'; import { selectors } from '@grafana/e2e-selectors'; import { Button, CustomScrollbar, Icon, IconName, PageToolbar, stylesFactory } from '@grafana/ui'; import config from 'app/core/config'; import { contextSrv } from 'app/core/services/context_srv'; import { dashboardWatcher } from 'app/features/live/dashboard/dashboardWatcher'; import { updateLocation } from 'app/core/actions'; import { DashboardModel } from '../../state/DashboardModel'; import { SaveDashboardButton, SaveDashboardAsButton } from '../SaveDashboard/SaveDashboardButton'; import { VariableEditorContainer } from '../../../variables/editor/VariableEditorContainer'; import { DashboardPermissions } from '../DashboardPermissions/DashboardPermissions'; import { GeneralSettings } from './GeneralSettings'; import { AnnotationsSettings } from './AnnotationsSettings'; import { LinksSettings } from './LinksSettings'; import { VersionsSettings } from './VersionsSettings'; import { JsonEditorSettings } from './JsonEditorSettings'; import { GrafanaTheme } from '@grafana/data'; export interface Props { dashboard: DashboardModel; updateLocation: typeof updateLocation; editview: string; } export interface SettingsPage { id: string; title: string; icon: IconName; render: () => React.ReactNode; } export class DashboardSettings extends PureComponent { onClose = () => { this.props.updateLocation({ query: { editview: null }, partial: true, }); }; onChangePage = (id: string) => { this.props.updateLocation({ query: { editview: id }, partial: true, }); }; getPages(): SettingsPage[] { const { dashboard } = this.props; const pages: SettingsPage[] = []; if (dashboard.meta.canEdit) { pages.push(this.getGeneralPage()); pages.push({ title: 'Annotations', id: 'annotations', icon: 'comment-alt', render: () => , }); pages.push({ title: 'Variables', id: 'templating', icon: 'calculator-alt', render: () => , }); pages.push({ title: 'Links', id: 'links', icon: 'link', render: () => , }); } if (dashboard.meta.canMakeEditable) { pages.push({ title: 'General', icon: 'sliders-v-alt', id: 'settings', render: () => this.renderMakeEditable(), }); } if (dashboard.id && dashboard.meta.canSave) { pages.push({ title: 'Versions', id: 'versions', icon: 'history', render: () => , }); } if (dashboard.id && dashboard.meta.canAdmin) { pages.push({ title: 'Permissions', id: 'permissions', icon: 'lock', render: () => , }); } pages.push({ title: 'JSON Model', id: 'dashboard_json', icon: 'arrow', render: () => , }); return pages; } onMakeEditable = () => { const { dashboard } = this.props; dashboard.editable = true; dashboard.meta.canMakeEditable = false; dashboard.meta.canEdit = true; dashboard.meta.canSave = true; this.forceUpdate(); }; onPostSave = () => { this.props.dashboard.meta.hasUnsavedFolderChange = false; dashboardWatcher.reloadPage(); }; renderMakeEditable(): React.ReactNode { return (
Dashboard not editable
); } getGeneralPage(): SettingsPage { return { title: 'General', id: 'settings', icon: 'sliders-v-alt', render: () => , }; } render() { const { dashboard, editview } = this.props; const folderTitle = dashboard.meta.folderTitle; const pages = this.getPages(); const currentPage = pages.find((page) => page.id === editview) ?? pages[0]; const canSaveAs = contextSrv.hasEditPermissionInFolders; const canSave = dashboard.meta.canSave; const styles = getStyles(config.theme); return (
{currentPage.render()}
); } } const getStyles = stylesFactory((theme: GrafanaTheme) => ({ scrollInner: css` min-width: 100%; min-height: 100%; `, settingsWrapper: css` background: ${theme.colors.bg1}; display: flex; min-height: 100%; width: 100%; `, }));