diff --git a/frontend/src/component/changeRequest/ChangeRequest/ChangeRequest.tsx b/frontend/src/component/changeRequest/ChangeRequest/ChangeRequest.tsx index 5bf6b40fc3..6c09095281 100644 --- a/frontend/src/component/changeRequest/ChangeRequest/ChangeRequest.tsx +++ b/frontend/src/component/changeRequest/ChangeRequest/ChangeRequest.tsx @@ -1,5 +1,5 @@ import { VFC } from 'react'; -import { Box } from '@mui/material'; +import { Alert, Box, styled } from '@mui/material'; import { ChangeRequestFeatureToggleChange } from '../ChangeRequestOverview/ChangeRequestFeatureToggleChange/ChangeRequestFeatureToggleChange'; import { objectId } from 'utils/objectId'; import { ToggleStatusChange } from '../ChangeRequestOverview/ChangeRequestFeatureToggleChange/ToggleStatusChange'; @@ -17,6 +17,7 @@ import { GetFeatureStrategyIcon, } from 'utils/strategyNames'; import { hasNameField } from '../changeRequest.types'; +import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender'; interface IChangeRequestProps { changeRequest: IChangeRequest; @@ -24,6 +25,38 @@ interface IChangeRequestProps { onNavigate?: () => void; } +const StyledSingleChangeBox = styled(Box)<{ + hasConflict: boolean; + isAfterWarning: boolean; + isLast: boolean; + inInConflictFeature: boolean; +}>(({ theme, hasConflict, inInConflictFeature, isAfterWarning, isLast }) => ({ + borderLeft: '1px solid', + borderRight: '1px solid', + borderTop: '1px solid', + borderBottom: isLast ? '1px solid' : 'none', + borderRadius: isLast + ? `0 0 + ${theme.shape.borderRadiusLarge}px ${theme.shape.borderRadiusLarge}px` + : 0, + borderColor: + hasConflict || inInConflictFeature + ? theme.palette.warning.border + : theme.palette.dividerAlternative, + borderTopColor: + (hasConflict || isAfterWarning) && !inInConflictFeature + ? theme.palette.warning.border + : theme.palette.dividerAlternative, +})); + +const StyledAlert = styled(Alert)(({ theme }) => ({ + borderRadius: 0, + padding: theme.spacing(0, 2), + '&.MuiAlert-standardWarning': { + borderStyle: 'none none solid none', + }, +})); + export const ChangeRequest: VFC = ({ changeRequest, onRefetch, @@ -56,63 +89,86 @@ export const ChangeRequest: VFC = ({ featureName={featureToggleChange.name} projectId={changeRequest.project} onNavigate={onNavigate} + conflict={featureToggleChange.conflict} > - {featureToggleChange.changes.map(change => ( - ( + ({ - padding: 2, - borderTop: '1px solid', - borderColor: theme => - theme.palette.dividerAlternative, - })} + hasConflict={Boolean(change.conflict)} + inInConflictFeature={Boolean( + featureToggleChange.conflict + )} + isAfterWarning={Boolean( + featureToggleChange.changes[index - 1]?.conflict + )} + isLast={ + index + 1 === featureToggleChange.changes.length + } > - {change.action === 'updateEnabled' && ( - - )} - {change.action === 'addStrategy' && ( - - + Conflict! This change + can’t be applied. {change.conflict}. + + } + /> + + {change.action === 'updateEnabled' && ( + + )} + {change.action === 'addStrategy' && ( + + - {formatStrategyName(change.payload.name)} - - )} - {change.action === 'deleteStrategy' && ( - - {hasNameField(change.payload) && ( - <> - + )} + {change.action === 'deleteStrategy' && ( + + {hasNameField(change.payload) && ( + <> + + {formatStrategyName( change.payload.name - } - /> - {formatStrategyName( - change.payload.name - )} - - )} - - )} - {change.action === 'updateStrategy' && ( - - - {formatStrategyName(change.payload.name)} - - )} - + )} + + )} + + )} + {change.action === 'updateStrategy' && ( + + + {formatStrategyName( + change.payload.name + )} + + )} + + ))} ))} diff --git a/frontend/src/component/changeRequest/ChangeRequestOverview/ChangeRequestFeatureToggleChange/ChangeRequestFeatureToggleChange.tsx b/frontend/src/component/changeRequest/ChangeRequestOverview/ChangeRequestFeatureToggleChange/ChangeRequestFeatureToggleChange.tsx index 6d718a63a3..b90d64a052 100644 --- a/frontend/src/component/changeRequest/ChangeRequestOverview/ChangeRequestFeatureToggleChange/ChangeRequestFeatureToggleChange.tsx +++ b/frontend/src/component/changeRequest/ChangeRequestOverview/ChangeRequestFeatureToggleChange/ChangeRequestFeatureToggleChange.tsx @@ -1,48 +1,79 @@ import { FC } from 'react'; import { Link } from 'react-router-dom'; -import { Box, Card, Typography } from '@mui/material'; +import { Alert, Box, Card, Typography } from '@mui/material'; import ToggleOnIcon from '@mui/icons-material/ToggleOn'; +import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender'; interface IChangeRequestToggleChange { featureName: string; projectId: string; + conflict?: string; onNavigate?: () => void; } export const ChangeRequestFeatureToggleChange: FC< IChangeRequestToggleChange -> = ({ featureName, projectId, onNavigate, children }) => { - return ( - = ({ featureName, projectId, conflict, onNavigate, children }) => ( + ({ + marginTop: theme.spacing(2), + overflow: 'hidden', + })} + > + ({ - marginTop: theme.spacing(2), - borderRadius: theme => `${theme.shape.borderRadiusLarge}px`, - overflow: 'hidden', + backgroundColor: Boolean(conflict) + ? theme.palette.warning.light + : theme.palette.tableHeaderBackground, + borderRadius: theme => + `${theme.shape.borderRadiusLarge}px ${theme.shape.borderRadiusLarge}px 0 0`, border: '1px solid', - borderColor: theme => theme.palette.dividerAlternative, + borderColor: theme => + conflict + ? theme.palette.warning.border + : theme.palette.dividerAlternative, + borderBottom: 'none', + overflow: 'hidden', })} > - ({ - backgroundColor: theme.palette.tableHeaderBackground, - padding: theme.spacing(3), - })} - > - - - - {featureName} - - + Conflict! {conflict}. + + } + /> + + + + {featureName} + - {children} - - ); -}; + + {children} + +); diff --git a/frontend/src/component/changeRequest/ChangeRequestOverview/ChangeRequestOverview.tsx b/frontend/src/component/changeRequest/ChangeRequestOverview/ChangeRequestOverview.tsx index 0d6eab7467..bab9d3359d 100644 --- a/frontend/src/component/changeRequest/ChangeRequestOverview/ChangeRequestOverview.tsx +++ b/frontend/src/component/changeRequest/ChangeRequestOverview/ChangeRequestOverview.tsx @@ -89,10 +89,10 @@ export const ChangeRequestOverview: FC = () => { 0} + condition={changeRequest.approvals?.length > 0} show={ - {changeRequest.approvals.map(approver => ( + {changeRequest.approvals?.map(approver => (