diff --git a/frontend/src/component/changeRequest/ChangeRequestOverview/ChangeRequestOverview.tsx b/frontend/src/component/changeRequest/ChangeRequestOverview/ChangeRequestOverview.tsx index b0a8fbec67..265b35aa3f 100644 --- a/frontend/src/component/changeRequest/ChangeRequestOverview/ChangeRequestOverview.tsx +++ b/frontend/src/component/changeRequest/ChangeRequestOverview/ChangeRequestOverview.tsx @@ -111,7 +111,7 @@ export const ChangeRequestOverview: FC = () => { changeRequest.environment, ); - const hasSchedule = Boolean(changeRequest.schedule?.scheduledAt); + const hasSchedule = Boolean('schedule' in changeRequest && changeRequest.schedule?.scheduledAt); const onApplyChanges = async () => { try { @@ -266,8 +266,7 @@ export const ChangeRequestOverview: FC = () => { diff --git a/frontend/src/component/changeRequest/ChangeRequestOverview/ChangeRequestTimeline/ChangeRequestTimeline.tsx b/frontend/src/component/changeRequest/ChangeRequestOverview/ChangeRequestTimeline/ChangeRequestTimeline.tsx index 72582e23eb..d557f7b186 100644 --- a/frontend/src/component/changeRequest/ChangeRequestOverview/ChangeRequestTimeline/ChangeRequestTimeline.tsx +++ b/frontend/src/component/changeRequest/ChangeRequestOverview/ChangeRequestTimeline/ChangeRequestTimeline.tsx @@ -6,18 +6,25 @@ import TimelineSeparator from '@mui/lab/TimelineSeparator'; import TimelineDot from '@mui/lab/TimelineDot'; import TimelineConnector from '@mui/lab/TimelineConnector'; import TimelineContent from '@mui/lab/TimelineContent'; -import { ChangeRequestState } from '../../changeRequest.types'; +import { + ChangeRequestSchedule, + ChangeRequestState, +} from '../../changeRequest.types'; import { ConditionallyRender } from '../../../common/ConditionallyRender/ConditionallyRender'; import { HtmlTooltip } from '../../../common/HtmlTooltip/HtmlTooltip'; import { Error as ErrorIcon } from '@mui/icons-material'; import { useLocationSettings } from 'hooks/useLocationSettings'; import { formatDateYMDHMS } from 'utils/formatDate'; -interface ISuggestChangeTimelineProps { - state: ChangeRequestState; - scheduledAt?: string; - failureReason?: string; -} +type ISuggestChangeTimelineProps = + | { + state: Exclude; + schedule: undefined; + } + | { + state: 'Scheduled'; + schedule: ChangeRequestSchedule; + }; const StyledPaper = styled(Paper)(({ theme }) => ({ marginTop: theme.spacing(2), @@ -90,8 +97,7 @@ export const determineColor = ( export const ChangeRequestTimeline: FC = ({ state, - scheduledAt, - failureReason, + schedule, }) => { let data; switch (state) { @@ -106,28 +112,39 @@ export const ChangeRequestTimeline: FC = ({ } const activeIndex = data.findIndex((item) => item === state); - const { locationSettings } = useLocationSettings(); - return ( {data.map((title, index) => { - const subtitle = - scheduledAt && - state === 'Scheduled' && - state === title - ? formatDateYMDHMS( - new Date(scheduledAt), - locationSettings?.locale, - ) - : undefined; + console.log('title and state ++', title, state); + if (schedule && title === 'Scheduled') { + console.log('Title for scheduled is', title, state); + + return createTimelineScheduleItem( + schedule, + // color, + // title, + // index < data.length - 1, + // timelineDotProps, + ); + } + + // const subtitle = + // scheduledAt && + // state === 'Scheduled' && + // state === title + // ? formatDateYMDHMS( + // new Date(scheduledAt), + // locationSettings?.locale, + // ) + // : undefined; const color = determineColor( state, activeIndex, title, index, - failureReason, + // failureReason, ); let timelineDotProps = {}; @@ -142,8 +159,6 @@ export const ChangeRequestTimeline: FC = ({ return createTimelineItem( color, title, - subtitle, - failureReason, index < data.length - 1, timelineDotProps, ); @@ -154,11 +169,96 @@ export const ChangeRequestTimeline: FC = ({ ); }; +const createTimelineScheduleItem = ( + schedule: ChangeRequestSchedule, + // color: 'primary' | 'success' | 'grey' | 'error' | 'warning', + // title: string, + // subtitle: string | undefined, + // failureReason: string | undefined, + // shouldConnectToNextItem: boolean, + // timelineDotProps: { [key: string]: string | undefined } = {}, +) => { + const { locationSettings } = useLocationSettings(); + + const time = formatDateYMDHMS( + new Date(schedule.scheduledAt), + locationSettings?.locale, + ); + + const color = (() => { + switch (schedule.status) { + case 'suspended': + return 'grey'; + case 'failed': + return 'error'; + case 'pending': + default: + return 'warning'; + } + })(); + + const title = `Schedule ${schedule.status}`; + + const subtitle = (() => { + switch (schedule.status) { + case 'suspended': + return `was ${time}`; + case 'failed': + return `at ${time}`; + case 'pending': + default: + return `for ${time}`; + } + })(); + + const reason = (() => { + switch (schedule.status) { + case 'suspended': + return ( + + + + ); + case 'failed': + return ( + + + + ); + case 'pending': + default: + return <>; + } + })(); + + return ( + + + + + + + {title} + + {`(${subtitle})`} + {reason} + + + + ); +}; + const createTimelineItem = ( color: 'primary' | 'success' | 'grey' | 'error' | 'warning', title: string, - subtitle: string | undefined, - failureReason: string | undefined, shouldConnectToNextItem: boolean, timelineDotProps: { [key: string]: string | undefined } = {}, ) => ( @@ -167,33 +267,6 @@ const createTimelineItem = ( {shouldConnectToNextItem && } - - {title} - - {`(for ${subtitle})`} - - - - } - /> - - } - /> - + {title} );