1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-09-24 17:51:14 +02:00
unleash.unleash/frontend/src/component/strategies/StrategyForm/StrategyForm.tsx
olav 35262e404b refactor: clean up strategy parameter types (#944)
* refactor: fix splash page button background color

* refactor: regenerate OpenAPI client

* refactor: clean up strategy parameter types

* refactor: remove index signature from IConstraint

* refactor: fix never-seen status in features list
2022-05-04 15:16:34 +02:00

114 lines
3.8 KiB
TypeScript

import Input from 'component/common/Input/Input';
import { Button } from '@mui/material';
import { useStyles } from './StrategyForm.styles';
import { Add } from '@mui/icons-material';
import { trim } from 'component/common/util';
import { StrategyParameters } from './StrategyParameters/StrategyParameters';
import { IStrategyParameter } from 'interfaces/strategy';
import React from 'react';
interface IStrategyFormProps {
strategyName: string;
strategyDesc: string;
params: IStrategyParameter[];
setStrategyName: React.Dispatch<React.SetStateAction<string>>;
setStrategyDesc: React.Dispatch<React.SetStateAction<string>>;
setParams: React.Dispatch<React.SetStateAction<IStrategyParameter[]>>;
handleSubmit: (e: React.FormEvent<HTMLFormElement>) => void;
handleCancel: () => void;
errors: { [key: string]: string };
mode: 'Create' | 'Edit';
clearErrors: () => void;
setErrors: React.Dispatch<React.SetStateAction<Record<string, string>>>;
}
export const StrategyForm: React.FC<IStrategyFormProps> = ({
children,
handleSubmit,
handleCancel,
strategyName,
strategyDesc,
params,
setParams,
setStrategyName,
setStrategyDesc,
errors,
mode,
clearErrors,
}) => {
const { classes: styles } = useStyles();
const updateParameter = (index: number, updated: object) => {
let item = { ...params[index] };
params[index] = Object.assign({}, item, updated);
setParams(prev => [...prev]);
};
const appParameter = () => {
setParams(prev => [
...prev,
{ name: '', type: 'string', description: '', required: false },
]);
};
return (
<form onSubmit={handleSubmit} className={styles.form}>
<div className={styles.container}>
<p className={styles.inputDescription}>
What would you like to call your strategy?
</p>
<Input
disabled={mode === 'Edit'}
autoFocus
className={styles.input}
label="Strategy name*"
value={strategyName}
onChange={e => setStrategyName(trim(e.target.value))}
error={Boolean(errors.name)}
errorText={errors.name}
onFocus={() => clearErrors()}
/>
<p className={styles.inputDescription}>
What is your strategy description?
</p>
<Input
className={styles.input}
label="Strategy description"
value={strategyDesc}
onChange={e => setStrategyDesc(e.target.value)}
rows={2}
multiline
/>
<StrategyParameters
input={params}
updateParameter={updateParameter}
setParams={setParams}
errors={errors}
/>
<Button
onClick={e => {
e.preventDefault();
appParameter();
}}
variant="outlined"
color="secondary"
className={styles.paramButton}
startIcon={<Add />}
>
Add parameter
</Button>
</div>
<div className={styles.buttonContainer}>
{children}
<Button
type="button"
onClick={handleCancel}
className={styles.cancelButton}
>
Cancel
</Button>
</div>
</form>
);
};