1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-02-09 00:18:00 +01:00

feat: constraints values limit in a strategy UI (#7557)

This commit is contained in:
Mateusz Kwasniewski 2024-07-08 15:08:16 +02:00 committed by GitHub
parent 8f8ff13cc5
commit 46b1eedcc7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 47 additions and 8 deletions

View File

@ -10,7 +10,8 @@ import { ConditionallyRender } from '../ConditionallyRender/ConditionallyRender'
const StyledBox = styled(Box)(({ theme }) => ({
display: 'flex',
flexDirection: 'column',
border: `2px solid ${theme.palette.background.application}`,
backgroundColor: theme.palette.background.default,
border: `1px solid ${theme.palette.divider}`,
borderRadius: `${theme.shape.borderRadiusMedium}px`,
width: '100%',
}));
@ -33,7 +34,7 @@ const Header = styled(Box)(({ theme }) => ({
gap: theme.spacing(1),
alignItems: 'center',
fontWeight: 'bold',
borderBottom: `1px solid ${theme.palette.background.application}`,
borderBottom: `1px solid ${theme.palette.divider}`,
padding: theme.spacing(3, 4),
fontSize: theme.typography.h2.fontSize,
}));
@ -43,7 +44,7 @@ const Footer = styled(Box)(({ theme }) => ({
}));
const Main = styled(Box)(({ theme }) => ({
borderBottom: `1px solid ${theme.palette.background.application}`,
borderBottom: `1px solid ${theme.palette.divider}`,
padding: theme.spacing(3, 4),
}));
@ -68,7 +69,7 @@ export const Limit: FC<{
currentValue: number;
onClose?: () => void;
}> = ({ name, shortName, limit, currentValue, onClose }) => {
const percentageLimit = Math.round((currentValue / limit) * 100);
const percentageLimit = Math.floor((currentValue / limit) * 100);
const belowLimit = currentValue < limit;
const threshold = 80;

View File

@ -119,3 +119,20 @@ test('should set values', async () => {
expect(errors).toEqual(['']);
expect(values).toEqual(['1', '2', '3']);
});
test('should show limit reached indicator', async () => {
setupApi();
render(
<FreeTextInput
error=''
values={['1', '2', '3']}
setValues={(newValues) => {}}
setError={(newError: string) => {}}
removeValue={() => {}}
/>,
);
await screen.findByText(
'You have reached the limit for single constraint values',
);
});

View File

@ -1,4 +1,4 @@
import { Button, Chip } from '@mui/material';
import { Box, Button, Chip, styled } from '@mui/material';
import { makeStyles } from 'tss-react/mui';
import Input from 'component/common/Input/Input';
import StringTruncator from 'component/common/StringTruncator/StringTruncator';
@ -8,6 +8,8 @@ import { ConstraintFormHeader } from '../ConstraintFormHeader/ConstraintFormHead
import { parseParameterStrings } from 'utils/parseParameter';
import { useUiFlag } from 'hooks/useUiFlag';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
import { Limit } from 'component/common/Limit/Limit';
interface IFreeTextInputProps {
values: string[];
@ -53,6 +55,12 @@ const useStyles = makeStyles()((theme) => ({
valuesContainer: { marginTop: '1rem' },
}));
const LimitContainer = styled(Box)(({ theme }) => ({
'&:has(*)': {
marginTop: theme.spacing(2),
},
}));
const ENTER = 'Enter';
export const FreeTextInput = ({
@ -66,6 +74,7 @@ export const FreeTextInput = ({
const { classes: styles } = useStyles();
const resourceLimitsEnabled = useUiFlag('resourceLimits');
const { uiConfig, loading } = useUiConfig();
const constraintValuesLimit = uiConfig.resourceLimits.constraintValues;
const onKeyPress = (event: React.KeyboardEvent<HTMLInputElement>) => {
if (event.key === ENTER) {
@ -80,13 +89,12 @@ export const FreeTextInput = ({
...parseParameterStrings(inputValues),
]);
const limitReached = Boolean(
resourceLimitsEnabled &&
newValues.length > uiConfig.resourceLimits.constraintValues,
resourceLimitsEnabled && newValues.length > constraintValuesLimit,
);
if (limitReached) {
setError(
`constraints cannot have more than ${uiConfig.resourceLimits.constraintValues} values`,
`constraints cannot have more than ${constraintValuesLimit} values`,
);
} else if (newValues.length === 0) {
setError('values cannot be empty');
@ -139,6 +147,19 @@ export const FreeTextInput = ({
removeValue={removeValue}
/>
</div>
<LimitContainer>
<ConditionallyRender
condition={resourceLimitsEnabled}
show={
<Limit
name='single constraint values'
shortName='values'
currentValue={values.length}
limit={constraintValuesLimit}
/>
}
/>
</LimitContainer>
</>
);
};