2025-04-01 10:38:02 +09:00

113 lines
4.2 KiB
TypeScript

import { useLocation } from 'react-router-dom-v5-compat';
import { locationUtil, NavModelItem } from '@grafana/data';
import { SceneObject, SceneObjectState } from '@grafana/scenes';
import { contextSrv } from 'app/core/core';
import { t } from 'app/core/internationalization';
import { getNavModel } from 'app/core/selectors/navModel';
import { AccessControlAction, useSelector } from 'app/types';
import { DashboardScene } from '../scene/DashboardScene';
import { AnnotationsEditView } from './AnnotationsEditView';
import { DashboardLinksEditView } from './DashboardLinksEditView';
import { GeneralSettingsEditView } from './GeneralSettingsEditView';
import { JsonModelEditView } from './JsonModelEditView';
import { PermissionsEditView } from './PermissionsEditView';
import { VariablesEditView } from './VariablesEditView';
import { VersionsEditView } from './VersionsEditView';
export interface DashboardEditViewState extends SceneObjectState {}
export interface DashboardEditListViewState extends DashboardEditViewState {
/** Index of the list item to edit */
editIndex?: number;
}
export interface DashboardEditView extends SceneObject {
getUrlKey(): string;
}
export function useDashboardEditPageNav(dashboard: DashboardScene, currentEditView: string) {
const location = useLocation();
const navIndex = useSelector((state) => state.navIndex);
const navModel = getNavModel(navIndex, 'dashboards/browse');
const dashboardPageNav = dashboard.getPageNav(location, navIndex);
const pageNav: NavModelItem = {
text: 'Settings',
url: locationUtil.getUrlForPartial(location, { editview: 'settings', editIndex: null }),
children: [],
parentItem: dashboardPageNav,
};
if (dashboard.state.meta.canEdit) {
pageNav.children!.push({
text: t('dashboard-settings.general.title', 'General'),
url: locationUtil.getUrlForPartial(location, { editview: 'settings', editIndex: null }),
active: currentEditView === 'settings',
});
pageNav.children!.push({
text: t('dashboard-settings.annotations.title', 'Annotations'),
url: locationUtil.getUrlForPartial(location, { editview: 'annotations', editIndex: null }),
active: currentEditView === 'annotations',
});
pageNav.children!.push({
text: t('dashboard-settings.variables.title', 'Variables'),
url: locationUtil.getUrlForPartial(location, { editview: 'variables', editIndex: null }),
active: currentEditView === 'variables',
});
pageNav.children!.push({
text: t('dashboard-settings.links.title', 'Links'),
url: locationUtil.getUrlForPartial(location, { editview: 'links', editIndex: null }),
active: currentEditView === 'links',
});
}
if (dashboard.state.uid && dashboard.state.meta.canSave) {
pageNav.children!.push({
text: t('dashboard-settings.versions.title', 'Versions'),
url: locationUtil.getUrlForPartial(location, { editview: 'versions', editIndex: null }),
active: currentEditView === 'versions',
});
}
if (dashboard.state.uid && dashboard.state.meta.canAdmin) {
if (contextSrv.hasPermission(AccessControlAction.DashboardsPermissionsRead)) {
pageNav.children!.push({
text: t('dashboard-settings.permissions.title', 'Permissions'),
url: locationUtil.getUrlForPartial(location, { editview: 'permissions', editIndex: null }),
active: currentEditView === 'permissions',
});
}
}
pageNav.children!.push({
text: t('dashboard-settings.json-editor.title', 'JSON Model'),
url: locationUtil.getUrlForPartial(location, { editview: 'json-model', editIndex: null }),
active: currentEditView === 'json-model',
});
return { navModel, pageNav };
}
export function createDashboardEditViewFor(editview: string): DashboardEditView {
switch (editview) {
case 'annotations':
return new AnnotationsEditView({});
case 'variables':
return new VariablesEditView({});
case 'links':
return new DashboardLinksEditView({});
case 'versions':
return new VersionsEditView({});
case 'json-model':
return new JsonModelEditView({});
case 'permissions':
return new PermissionsEditView({});
case 'settings':
default:
return new GeneralSettingsEditView({});
}
}