import { isEmpty } from 'lodash'; import React from 'react'; import { Modal } from 'react-bootstrap'; import { DiffSummary } from './DiffSummary'; import type { IPipeline } from '../../../../domain'; import { ModalClose } from '../../../../modal'; import type { IModalComponentProps } from '../../../../presentation'; import { FormField, ReactSelectInput, useData } from '../../../../presentation'; import { PipelineConfigService } from '../../services/PipelineConfigService'; import type { IJsonDiff } from '../../../../utils'; import { DiffView, JsonUtils, timestamp } from '../../../../utils'; import { Spinner } from '../../../../widgets'; import './showHistory.less'; export interface IShowHistoryModalProps extends IModalComponentProps { currentConfig: IPipeline; isStrategy: boolean; pipelineConfigId: string; } interface IHistoryContents { timestamp: string; contents: string; json: IPipeline; index: number; } const emptyDiff: IJsonDiff = { changeBlocks: [], details: [], summary: { additions: 0, removals: 0, total: 0, unchanged: 0, }, }; export function ShowPipelineHistoryModal(props: IShowHistoryModalProps) { const compareOptions = ['previous version', 'current']; const [compareTo, setCompareTo] = React.useState(compareOptions[0]); const [diff, setDiff] = React.useState(emptyDiff); const [version, setVersion] = React.useState(0); const { closeModal, currentConfig, dismissModal, isStrategy, pipelineConfigId } = props; const { result: history, status, error } = useData( () => { return PipelineConfigService.getHistory(pipelineConfigId, isStrategy, 100).then(historyLoaded); }, [], [], ); React.useEffect(() => updateDiff(history, version, compareTo), [history, compareTo, version]); function historyLoaded(loadedPipelines: IPipeline[]): IHistoryContents[] { const historyToBeProcessed = currentConfig ? [currentConfig].concat(loadedPipelines) : loadedPipelines; const pipelineHistory: IHistoryContents[] = historyToBeProcessed.map((h, index) => { const ts = h.updateTs; delete h.updateTs; return { timestamp: timestamp(ts), contents: JSON.stringify(h, null, 2), json: h, index: index, }; }); pipelineHistory[0].timestamp += ' (current)'; if (currentConfig) { pipelineHistory[0].timestamp = 'Current config (not saved)'; pipelineHistory[1].timestamp += ' (last saved)'; } return pipelineHistory; } function restoreVersion(): void { closeModal(history[version].json); } function updateDiff(h: IHistoryContents[], v: number, c: string): void { if (h.length > 0) { const right = h[v].contents; let left; if (c === compareOptions[1]) { left = h[0].contents; } else { left = right; if (v < h.length - 1) { left = h[v + 1].contents; } } setDiff(JsonUtils.diff(left, right, true)); } } return ( <> {}}> Pipeline Revision History {status === 'PENDING' && (
)} {status === 'REJECTED' && (

There was an error loading the history for this pipeline.

{error}
)} {status === 'RESOLVED' && history.length <= 0 && (

Sorry, we couldn't find any history for this pipeline.

)} {status === 'RESOLVED' && history.length > 0 && ( <>
(
{label}
{input}
)} input={(inputProps) => ( ({ label: h.timestamp, value: h.index }))} {...inputProps} /> )} onChange={(e) => setVersion(e.target.value)} value={version} />
{version > 0 && ( )}
( )} onChange={(e) => setCompareTo(e.target.value)} value={compareTo} />
{!isEmpty(history) && (
)}
)}
); }