diff --git a/frontend/src/component/common/ConstraintsList/ConstraintItemHeader/ConstraintItemHeader.tsx b/frontend/src/component/common/ConstraintsList/ConstraintItemHeader/ConstraintItemHeader.tsx index 4d84dead7f..8bbe4ca9eb 100644 --- a/frontend/src/component/common/ConstraintsList/ConstraintItemHeader/ConstraintItemHeader.tsx +++ b/frontend/src/component/common/ConstraintsList/ConstraintItemHeader/ConstraintItemHeader.tsx @@ -1,4 +1,4 @@ -import type { ComponentProps, FC } from 'react'; +import type { ComponentProps, FC, ReactNode } from 'react'; import { StrategyEvaluationItem } from '../StrategyEvaluationItem/StrategyEvaluationItem'; import type { ConstraintSchema } from 'openapi'; import { formatOperatorDescription } from 'component/common/ConstraintAccordion/ConstraintOperator/formatOperatorDescription'; @@ -48,6 +48,13 @@ const CaseSensitive: FC = () => { ); }; +const StyledConstraintContainer = styled('div')(({ theme }) => ({ + display: 'grid', + gridTemplateColumns: 'repeat(3, auto)', + gap: theme.spacing(2), + placeItems: 'center', +})); + const StyledOperatorGroup = styled('div')(({ theme }) => ({ display: 'flex', alignItems: 'center', @@ -60,9 +67,15 @@ const StyledConstraintName = styled('div')(({ theme }) => ({ overflow: 'hidden', })); -export const ConstraintItemHeader: FC< - ConstraintSchema & Pick, 'onSetTruncated'> -> = ({ onSetTruncated, ...constraint }) => { +type ConstraintItemHeaderProps = ConstraintSchema & { + viewMore?: ReactNode; +} & Pick, 'onSetTruncated'>; + +export const ConstraintItemHeader: FC = ({ + onSetTruncated, + viewMore, + ...constraint +}) => { const { caseInsensitive, contextName, inverted, operator, value, values } = constraint; const { locationSettings } = useLocationSettings(); @@ -77,22 +90,29 @@ export const ConstraintItemHeader: FC< return ( - - - {contextName} - - - - - {isCaseSensitive(operator, caseInsensitive) ? ( - - ) : null} - - + + + + {contextName} + + + + + {isCaseSensitive(operator, caseInsensitive) ? ( + + ) : null} + +
+
+ + {viewMore} +
+
+
); }; diff --git a/frontend/src/component/common/ConstraintsList/ValuesList/ValuesList.tsx b/frontend/src/component/common/ConstraintsList/ValuesList/ValuesList.tsx index 394cd1302d..f2a8f2a921 100644 --- a/frontend/src/component/common/ConstraintsList/ValuesList/ValuesList.tsx +++ b/frontend/src/component/common/ConstraintsList/ValuesList/ValuesList.tsx @@ -1,9 +1,10 @@ import type { FC } from 'react'; -import { styled, Tooltip } from '@mui/material'; +import { styled } from '@mui/material'; import { Truncator, type TruncatorProps, } from 'component/common/Truncator/Truncator'; +import { TooltipResolver } from 'component/common/TooltipResolver/TooltipResolver'; export type ValuesListProps = { values?: string[]; @@ -14,7 +15,12 @@ const StyledValuesContainer = styled('div')({ flex: '1 1 0', }); -const StyledValueItem = styled('span')(({ theme }) => ({ +const StyledTruncator = styled(Truncator)({ + padding: 0, + margin: 0, +}); + +const StyledValueItem = styled('li')(({ theme }) => ({ padding: theme.spacing(0.25), display: 'inline-block', span: { @@ -45,22 +51,30 @@ export const ValuesList: FC = ({ lines={2} onSetTruncated={() => onSetTruncated?.(false)} > - + {values[0]} - + ) : null} {values && values?.length > 1 ? ( - + {values.map((value) => ( - + {value} - + ))} - + ) : null} ); diff --git a/frontend/src/component/common/NewConstraintAccordion/ConstraintAccordionView/ConstraintAccordionView.tsx b/frontend/src/component/common/NewConstraintAccordion/ConstraintAccordionView/ConstraintAccordionView.tsx index c52b33e5c8..6e6b734a91 100644 --- a/frontend/src/component/common/NewConstraintAccordion/ConstraintAccordionView/ConstraintAccordionView.tsx +++ b/frontend/src/component/common/NewConstraintAccordion/ConstraintAccordionView/ConstraintAccordionView.tsx @@ -30,7 +30,6 @@ interface IConstraintAccordionViewProps { const StyledAccordion = styled(Accordion)(({ theme }) => ({ border: `1px solid ${theme.palette.divider}`, borderRadius: theme.shape.borderRadiusMedium, - backgroundColor: 'transparent', boxShadow: 'none', margin: 0, '&:before': { diff --git a/frontend/src/component/common/NewConstraintAccordion/ConstraintAccordionView/ConstraintAccordionViewBody/ConstraintAccordionViewBody.tsx b/frontend/src/component/common/NewConstraintAccordion/ConstraintAccordionView/ConstraintAccordionViewBody/ConstraintAccordionViewBody.tsx index 83be015934..ea0fc6cb9a 100644 --- a/frontend/src/component/common/NewConstraintAccordion/ConstraintAccordionView/ConstraintAccordionViewBody/ConstraintAccordionViewBody.tsx +++ b/frontend/src/component/common/NewConstraintAccordion/ConstraintAccordionView/ConstraintAccordionViewBody/ConstraintAccordionViewBody.tsx @@ -10,7 +10,7 @@ interface IConstraintAccordionViewBodyProps { } const StyledValueContainer = styled('div')(({ theme }) => ({ - padding: theme.spacing(2, 0), + padding: theme.spacing(1, 0), maxHeight: '400px', overflowY: 'auto', })); diff --git a/frontend/src/component/common/NewConstraintAccordion/ConstraintAccordionView/ConstraintAccordionViewHeader/ConstraintAccordionViewHeader.tsx b/frontend/src/component/common/NewConstraintAccordion/ConstraintAccordionView/ConstraintAccordionViewHeader/ConstraintAccordionViewHeader.tsx index f22ccecc24..d4dce610eb 100644 --- a/frontend/src/component/common/NewConstraintAccordion/ConstraintAccordionView/ConstraintAccordionViewHeader/ConstraintAccordionViewHeader.tsx +++ b/frontend/src/component/common/NewConstraintAccordion/ConstraintAccordionView/ConstraintAccordionViewHeader/ConstraintAccordionViewHeader.tsx @@ -55,7 +55,6 @@ export const ConstraintAccordionViewHeader = ({ {flagOverviewRedesign ? ( ({ display: 'flex', @@ -24,9 +22,14 @@ const StyledHeaderMetaInfo = styled('div')(({ theme }) => ({ }, })); +const StyledExpandItem = styled('div')(({ theme }) => ({ + color: theme.palette.text.secondary, + margin: theme.spacing(0.25, 0, 0, 0.75), + fontSize: theme.fontSizes.smallerBody, +})); + interface ConstraintAccordionViewHeaderMetaInfoProps { constraint: IConstraint; - singleValue: boolean; expanded: boolean; allowExpand: (shouldExpand: boolean) => void; disabled?: boolean; @@ -49,12 +52,16 @@ export const ConstraintAccordionViewHeaderInfo = ({ setExpandable(state); allowExpand(state); }} + viewMore={ + expandable ? ( + + {expanded + ? 'View less' + : `View all (${constraint.values?.length})`} + + ) : null + } /> - {expandable ? ( - - {expanded ? : } - - ) : null} ); diff --git a/frontend/src/component/common/NewConstraintAccordion/ConstraintValueSearch/ConstraintValueSearch.tsx b/frontend/src/component/common/NewConstraintAccordion/ConstraintValueSearch/ConstraintValueSearch.tsx index 47d688e493..85c0d12702 100644 --- a/frontend/src/component/common/NewConstraintAccordion/ConstraintValueSearch/ConstraintValueSearch.tsx +++ b/frontend/src/component/common/NewConstraintAccordion/ConstraintValueSearch/ConstraintValueSearch.tsx @@ -20,10 +20,10 @@ export const ConstraintValueSearch = ({ value={filter} onChange={(e) => setFilter(e.target.value)} placeholder='Filter values' - style={{ + sx={(theme) => ({ width: '100%', - margin: '1rem 0', - }} + margin: theme.spacing(1, 0, 2), + })} variant='outlined' size='small' InputProps={{ diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/StrategyDraggableItem/StrategyItem/StrategyExecution/StrategyExecution.tsx b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/StrategyDraggableItem/StrategyItem/StrategyExecution/StrategyExecution.tsx index 1fe7bfce9e..97d60875e0 100644 --- a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/StrategyDraggableItem/StrategyItem/StrategyExecution/StrategyExecution.tsx +++ b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/StrategyDraggableItem/StrategyItem/StrategyExecution/StrategyExecution.tsx @@ -3,7 +3,7 @@ import type { FeatureStrategySchema } from 'openapi'; import type { IFeatureStrategyPayload } from 'interfaces/strategy'; import { useUiFlag } from 'hooks/useUiFlag'; import { StrategyExecution as LegacyStrategyExecution } from './LegacyStrategyExecution'; -import { ConstraintItemHeader } from 'component/common/ConstraintsList/ConstraintItemHeader/ConstraintItemHeader'; +import { ConstraintAccordionView } from 'component/common/NewConstraintAccordion/ConstraintAccordionView/ConstraintAccordionView'; import { useStrategies } from 'hooks/api/getters/useStrategies/useStrategies'; import { objectId } from 'utils/objectId'; import { useCustomStrategyParameters } from './hooks/useCustomStrategyParameters'; @@ -53,10 +53,10 @@ export const StrategyExecution: FC = ({ ))} {constraints?.map((constraint, index) => ( - - {/* FIXME: use constraint accordion */} - - + ))} {(isCustomStrategy ? customStrategyItems : strategyParameters).map( (item, index) => (