import { ReactElement } from 'react'; import { useAsync } from 'react-use'; import { Box, Spinner, Stack } from '@grafana/ui'; import { Diffs } from 'app/features/dashboard-scene/settings/version-history/utils'; import { DiffGroup } from '../../../dashboard-scene/settings/version-history/DiffGroup'; import { DiffViewer } from '../../../dashboard-scene/settings/version-history/DiffViewer'; interface SaveDashboardDiffProps { oldValue?: unknown; newValue?: unknown; // calculated by parent so we can see summary in tabs diff?: Diffs; hasFolderChanges?: boolean; oldFolder?: string; newFolder?: string; } export const SaveDashboardDiff = ({ diff, oldValue, newValue, hasFolderChanges, oldFolder, newFolder, }: SaveDashboardDiffProps) => { const loader = useAsync(async () => { const oldJSON = JSON.stringify(oldValue ?? {}, null, 2); const newJSON = JSON.stringify(newValue ?? {}, null, 2); // Schema changes will have MANY changes that the user will not understand let schemaChange: ReactElement | undefined = undefined; const diffs: ReactElement[] = []; let count = 0; if (diff) { for (const [key, changes] of Object.entries(diff)) { // this takes a long time for large diffs (so this is async) const g = ; if (key === 'schemaVersion') { schemaChange = g; } else { diffs.push(g); } count += changes.length; } } return { schemaChange, diffs, count, showDiffs: count < 15, // overwhelming if too many changes jsonView: , }; }, [diff, oldValue, newValue]); const { value } = loader; return ( {hasFolderChanges && ( )} {(!value || !oldValue) && } {value && value.count >= 1 ? ( <> {value && value.schemaChange && value.schemaChange} {value && value.showDiffs && value.diffs}

Full JSON diff

{value.jsonView}
) : ( No changes in the dashboard JSON )}
); };