import { SceneComponentProps, SceneObjectBase, SceneObjectState, SceneObjectRef } from '@grafana/scenes'; import { Drawer, Tab, TabsBar } from '@grafana/ui'; import { SaveDashboardDiff } from 'app/features/dashboard/components/SaveDashboard/SaveDashboardDiff'; import { DashboardScene } from '../scene/DashboardScene'; import { SaveDashboardAsForm } from './SaveDashboardAsForm'; import { SaveDashboardForm } from './SaveDashboardForm'; import { SaveProvisionedDashboardForm } from './SaveProvisionedDashboardForm'; interface SaveDashboardDrawerState extends SceneObjectState { dashboardRef: SceneObjectRef; showDiff?: boolean; saveTimeRange?: boolean; saveVariables?: boolean; saveRefresh?: boolean; saveAsCopy?: boolean; onSaveSuccess?: () => void; } export class SaveDashboardDrawer extends SceneObjectBase { public onClose = () => { this.state.dashboardRef.resolve().setState({ overlay: undefined }); }; public onToggleSaveTimeRange = () => { this.setState({ saveTimeRange: !this.state.saveTimeRange }); }; public onToggleSaveVariables = () => { this.setState({ saveVariables: !this.state.saveVariables }); }; public onToggleSaveRefresh = () => { this.setState({ saveRefresh: !this.state.saveRefresh }); }; static Component = ({ model }: SceneComponentProps) => { const { showDiff, saveAsCopy, saveTimeRange, saveVariables, saveRefresh } = model.useState(); const changeInfo = model.state.dashboardRef .resolve() .getDashboardChanges(saveTimeRange, saveVariables, saveRefresh); const { changedSaveModel, initialSaveModel, diffs, diffCount, hasFolderChanges } = changeInfo; const changesCount = diffCount + (hasFolderChanges ? 1 : 0); const dashboard = model.state.dashboardRef.resolve(); const { meta } = dashboard.useState(); const { provisioned: isProvisioned, folderTitle } = meta; const tabs = ( model.setState({ showDiff: false })} /> {changesCount > 0 && ( model.setState({ showDiff: true })} counter={changesCount} /> )} ); let title = 'Save dashboard'; if (saveAsCopy) { title = 'Save dashboard copy'; } else if (isProvisioned) { title = 'Provisioned dashboard'; } const renderBody = () => { if (showDiff) { return ( ); } if (saveAsCopy || changeInfo.isNew) { return ; } if (isProvisioned) { return ; } return ; }; return ( {renderBody()} ); }; }