diff --git a/frontend/src/component/common/PercentageCircle/PercentageCircle.tsx b/frontend/src/component/common/PercentageCircle/PercentageCircle.tsx index 0a21250267..60b7ea86bf 100644 --- a/frontend/src/component/common/PercentageCircle/PercentageCircle.tsx +++ b/frontend/src/component/common/PercentageCircle/PercentageCircle.tsx @@ -1,51 +1,45 @@ import { useTheme } from '@mui/material'; +import { CSSProperties } from 'react'; interface IPercentageCircleProps { - styles?: object; percentage: number; - secondaryPieColor?: string; - className?: string; - hideNumber?: boolean; + size?: `${number}rem`; } const PercentageCircle = ({ - styles, percentage, - secondaryPieColor, - hideNumber, - ...rest + size = '4rem', }: IPercentageCircleProps) => { const theme = useTheme(); - let circle = { - height: '65px', - width: '65px', - borderRadius: '50%', - color: '#fff', - backgroundColor: theme.palette.grey[200], - backgroundImage: `conic-gradient(${ - theme.palette.primary.light - } ${percentage}%, ${secondaryPieColor || theme.palette.grey[200]} 1%)`, + const style: CSSProperties = { + display: 'block', + borderRadius: '100%', + transform: 'rotate(-90deg)', + height: size, + width: size, + background: theme.palette.grey[200], }; - if (percentage === 100) { - return ( -
- {hideNumber ? null : '100%'} -
- ); - } + // The percentage circle used to be drawn by CSS with a conic-gradient, + // but the result was either jagged or blurry. SVG seems to look better. + // See https://stackoverflow.com/a/70659532. + const r = 100 / (2 * Math.PI); + const d = 2 * r; - return
; + return ( + + + + ); }; export default PercentageCircle; diff --git a/frontend/src/component/feature/FeatureStrategy/FeatureStrategyIcons/FeatureStrategyIcons.tsx b/frontend/src/component/feature/FeatureStrategy/FeatureStrategyIcons/FeatureStrategyIcons.tsx index 4ce4395677..89aadafacf 100644 --- a/frontend/src/component/feature/FeatureStrategy/FeatureStrategyIcons/FeatureStrategyIcons.tsx +++ b/frontend/src/component/feature/FeatureStrategy/FeatureStrategyIcons/FeatureStrategyIcons.tsx @@ -13,24 +13,17 @@ export const FeatureStrategyIcons = ({ return null; } - const strategyNames = strategies.map(strategy => strategy.name); - const uniqueStrategyNames = uniqueValues(strategyNames); - return ( - {uniqueStrategyNames.map(strategyName => ( - - + {strategies.map(strategy => ( + + ))} ); }; -const uniqueValues = (values: T[]): T[] => { - return [...new Set(values)]; -}; - const StyledList = styled('ul')(() => ({ all: 'unset', display: 'flex', 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 380ba8c3c4..7618d0fae4 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 @@ -43,29 +43,25 @@ export const StrategyExecution = ({ strategy }: IStrategyExecutionProps) => { switch (key) { case 'rollout': case 'Rollout': + const percentage = parseParameterNumber(parameters[key]); return ( - + + +
{' '} of your base{' '} {constraints.length > 0 diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironmentMetrics/FeatureOverviewEnvironmentMetrics.styles.ts b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironmentMetrics/FeatureOverviewEnvironmentMetrics.styles.ts index c44e909ede..47e985190a 100644 --- a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironmentMetrics/FeatureOverviewEnvironmentMetrics.styles.ts +++ b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironmentMetrics/FeatureOverviewEnvironmentMetrics.styles.ts @@ -23,6 +23,7 @@ export const useStyles = makeStyles()(theme => ({ maxWidth: '270px', marginTop: '0.25rem', fontSize: theme.fontSizes.smallBody, + textAlign: 'right', [theme.breakpoints.down(700)]: { display: 'none', }, @@ -33,7 +34,7 @@ export const useStyles = makeStyles()(theme => ({ fontSize: theme.fontSizes.subHeader, }, percentageCircle: { - transform: 'scale(0.85)', + margin: '0 1rem', [theme.breakpoints.down(500)]: { display: 'none', }, diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironmentMetrics/FeatureOverviewEnvironmentMetrics.tsx b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironmentMetrics/FeatureOverviewEnvironmentMetrics.tsx index c3ec160435..3e542e350a 100644 --- a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironmentMetrics/FeatureOverviewEnvironmentMetrics.tsx +++ b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironmentMetrics/FeatureOverviewEnvironmentMetrics.tsx @@ -73,11 +73,9 @@ const FeatureOverviewEnvironmentMetrics = ({ hour

- +
+ +
); }; diff --git a/frontend/src/component/feature/StrategyTypes/StrategyInputList/StrategyInputList.tsx b/frontend/src/component/feature/StrategyTypes/StrategyInputList/StrategyInputList.tsx index 27aa56b41e..51b0529684 100644 --- a/frontend/src/component/feature/StrategyTypes/StrategyInputList/StrategyInputList.tsx +++ b/frontend/src/component/feature/StrategyTypes/StrategyInputList/StrategyInputList.tsx @@ -97,7 +97,13 @@ const StrategyInputList = ({ +
} > diff --git a/frontend/src/component/strategies/CreateStrategy/CreateStrategy.tsx b/frontend/src/component/strategies/CreateStrategy/CreateStrategy.tsx index 71143c4aae..69e44a8e32 100644 --- a/frontend/src/component/strategies/CreateStrategy/CreateStrategy.tsx +++ b/frontend/src/component/strategies/CreateStrategy/CreateStrategy.tsx @@ -83,6 +83,7 @@ export const CreateStrategy = () => { handleCancel={handleCancel} strategyName={strategyName} setStrategyName={setStrategyName} + validateStrategyName={validateStrategyName} strategyDesc={strategyDesc} setStrategyDesc={setStrategyDesc} params={params} diff --git a/frontend/src/component/strategies/StrategyForm/StrategyForm.tsx b/frontend/src/component/strategies/StrategyForm/StrategyForm.tsx index 6c856591f9..5dd95d56bc 100644 --- a/frontend/src/component/strategies/StrategyForm/StrategyForm.tsx +++ b/frontend/src/component/strategies/StrategyForm/StrategyForm.tsx @@ -12,6 +12,7 @@ interface IStrategyFormProps { strategyDesc: string; params: IStrategyParameter[]; setStrategyName: React.Dispatch>; + validateStrategyName?: () => void; setStrategyDesc: React.Dispatch>; setParams: React.Dispatch>; handleSubmit: (e: React.FormEvent) => void; @@ -31,6 +32,7 @@ export const StrategyForm: React.FC = ({ params, setParams, setStrategyName, + validateStrategyName, setStrategyDesc, errors, mode, @@ -65,7 +67,8 @@ export const StrategyForm: React.FC = ({ onChange={e => setStrategyName(trim(e.target.value))} error={Boolean(errors.name)} errorText={errors.name} - onFocus={() => clearErrors()} + onFocus={clearErrors} + onBlur={validateStrategyName} />

What is your strategy description? diff --git a/frontend/src/component/strategies/StrategyForm/StrategyParameters/StrategyParameter/StrategyParameter.styles.ts b/frontend/src/component/strategies/StrategyForm/StrategyParameters/StrategyParameter/StrategyParameter.styles.ts index 9010162939..b09cfcb296 100644 --- a/frontend/src/component/strategies/StrategyForm/StrategyParameters/StrategyParameter/StrategyParameter.styles.ts +++ b/frontend/src/component/strategies/StrategyForm/StrategyParameters/StrategyParameter/StrategyParameter.styles.ts @@ -29,12 +29,6 @@ export const useStyles = makeStyles()(theme => ({ inputDescription: { marginBottom: '0.5rem', }, - typeDescription: { - fontSize: theme.fontSizes.smallBody, - color: theme.palette.grey[600], - top: '-13px', - position: 'relative', - }, errorMessage: { fontSize: theme.fontSizes.smallBody, color: theme.palette.error.main, diff --git a/frontend/src/component/strategies/StrategyForm/StrategyParameters/StrategyParameter/StrategyParameter.tsx b/frontend/src/component/strategies/StrategyForm/StrategyParameters/StrategyParameter/StrategyParameter.tsx index 55fc0ec9c0..940c4d6b0c 100644 --- a/frontend/src/component/strategies/StrategyForm/StrategyParameters/StrategyParameter/StrategyParameter.tsx +++ b/frontend/src/component/strategies/StrategyForm/StrategyParameters/StrategyParameter/StrategyParameter.tsx @@ -17,31 +17,22 @@ const paramTypesOptions = [ { key: 'string', label: 'string', - description: 'A string is a collection of characters', }, { key: 'percentage', label: 'percentage', - description: - 'Percentage is used when you want to make your feature visible to a process part of your customers', }, { key: 'list', label: 'list', - description: - 'A list is used when you want to define several parameters that must be met before your feature becomes visible to your customers', }, { key: 'number', label: 'number', - description: - 'Number is used when you have one or more digits that must be met for your feature to be visible to your customers', }, { key: 'boolean', label: 'boolean', - description: - 'A boolean value represents a truth value, which is either true or false', }, ]; @@ -68,11 +59,6 @@ export const StrategyParameter = ({ set({ type }); }; - const renderParamTypeDescription = () => { - return paramTypesOptions.find(param => param.key === input.type) - ?.description; - }; - return (

@@ -80,7 +66,16 @@ export const StrategyParameter = ({ condition={index === 0} show={

- The parameters define what the strategy will look like. + Parameters let you provide arguments to your strategy + that it can access for evaluation. Read more in the{' '} + + parameter types documentation + + .

} /> @@ -114,9 +109,6 @@ export const StrategyParameter = ({ id={`prop-type-${index}-select`} className={styles.input} /> -

- {renderParamTypeDescription()} -