162 lines
4.5 KiB
TypeScript
162 lines
4.5 KiB
TypeScript
import { Button, TextField, Typography } from "@mui/material";
|
|
import React, { FC } from "react";
|
|
import { Preprocessor, WhereWhatPair } from "maxun-core";
|
|
|
|
interface PairProps {
|
|
index: string;
|
|
id?: string;
|
|
where: string | null;
|
|
what: string | null;
|
|
}
|
|
|
|
interface PairEditFormProps {
|
|
onSubmitOfPair: (value: WhereWhatPair, index: number) => void;
|
|
numberOfPairs: number;
|
|
index?: string;
|
|
where?: string;
|
|
what?: string;
|
|
id?: string;
|
|
}
|
|
|
|
export const PairEditForm: FC<PairEditFormProps> = (
|
|
{
|
|
onSubmitOfPair,
|
|
numberOfPairs,
|
|
index,
|
|
where,
|
|
what,
|
|
id,
|
|
}) => {
|
|
const [pairProps, setPairProps] = React.useState<PairProps>({
|
|
where: where || null,
|
|
what: what || null,
|
|
index: index || "1",
|
|
id: id || '',
|
|
});
|
|
const [errors, setErrors] = React.useState<PairProps>({
|
|
where: null,
|
|
what: null,
|
|
index: '',
|
|
});
|
|
|
|
const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {
|
|
const { id, value } = event.target;
|
|
if (id === 'index') {
|
|
if (parseInt(value, 10) < 1) {
|
|
setErrors({ ...errors, index: 'Index must be greater than 0' });
|
|
return;
|
|
} else {
|
|
setErrors({ ...errors, index: '' });
|
|
}
|
|
}
|
|
setPairProps({ ...pairProps, [id]: value });
|
|
};
|
|
|
|
const validateAndSubmit = (event: React.SyntheticEvent) => {
|
|
event.preventDefault();
|
|
let whereFromPair, whatFromPair;
|
|
// validate where
|
|
whereFromPair = {
|
|
where: pairProps.where && pairProps.where !== '{"url":"","selectors":[""] }'
|
|
? JSON.parse(pairProps.where)
|
|
: {},
|
|
what: [],
|
|
};
|
|
const validationError = Preprocessor.validateWorkflow({ workflow: [whereFromPair] });
|
|
setErrors({ ...errors, where: null });
|
|
if (validationError) {
|
|
setErrors({ ...errors, where: validationError.message });
|
|
return;
|
|
}
|
|
// validate what
|
|
whatFromPair = {
|
|
where: {},
|
|
what: pairProps.what && pairProps.what !== '[{"action":"","args":[""] }]'
|
|
? JSON.parse(pairProps.what) : [],
|
|
};
|
|
const validationErrorWhat = Preprocessor.validateWorkflow({ workflow: [whatFromPair] });
|
|
setErrors({ ...errors, "what": null });
|
|
if (validationErrorWhat) {
|
|
setErrors({ ...errors, what: validationErrorWhat.message });
|
|
return;
|
|
}
|
|
//validate index
|
|
const index = parseInt(pairProps?.index, 10);
|
|
if (index > (numberOfPairs + 1)) {
|
|
if (numberOfPairs === 0) {
|
|
setErrors(prevState => ({
|
|
...prevState,
|
|
index: 'Index of the first pair must be 1'
|
|
}));
|
|
return;
|
|
} else {
|
|
setErrors(prevState => ({
|
|
...prevState,
|
|
index: `Index must be in the range 1-${numberOfPairs + 1}`
|
|
}));
|
|
return;
|
|
}
|
|
} else {
|
|
setErrors({ ...errors, index: '' });
|
|
}
|
|
// submit the pair
|
|
onSubmitOfPair(pairProps.id
|
|
? {
|
|
id: pairProps.id,
|
|
where: whereFromPair?.where || {},
|
|
what: whatFromPair?.what || [],
|
|
}
|
|
: {
|
|
where: whereFromPair?.where || {},
|
|
what: whatFromPair?.what || [],
|
|
}
|
|
, index);
|
|
};
|
|
|
|
return (
|
|
<form
|
|
onSubmit={validateAndSubmit}
|
|
style={{
|
|
display: "grid",
|
|
padding: "0px 30px 0px 30px",
|
|
marginTop: "36px",
|
|
}}
|
|
>
|
|
<Typography sx={{ marginBottom: '30px' }} variant='h5'>Raw pair edit form:</Typography>
|
|
<TextField sx={{
|
|
display: "block",
|
|
marginBottom: "20px"
|
|
}} id="index" label="Index" type="number"
|
|
InputProps={{ inputProps: { min: 1 } }}
|
|
InputLabelProps={{
|
|
shrink: true,
|
|
}} defaultValue={pairProps.index}
|
|
onChange={handleInputChange}
|
|
error={!!errors.index} helperText={errors.index}
|
|
required
|
|
/>
|
|
<TextField sx={{
|
|
marginBottom: "20px"
|
|
}} id="id" label="Id" type="string"
|
|
defaultValue={pairProps.id}
|
|
onChange={handleInputChange}
|
|
/>
|
|
<TextField multiline sx={{ marginBottom: "20px" }}
|
|
id="where" label="Where" variant="outlined" onChange={handleInputChange}
|
|
defaultValue={where || '{"url":"","selectors":[""]}'}
|
|
error={!!errors.where} helperText={errors.where} />
|
|
<TextField multiline sx={{ marginBottom: "20px" }}
|
|
id="what" label="What" variant="outlined" onChange={handleInputChange}
|
|
defaultValue={what || '[{"action":"","args":[""]}]'}
|
|
error={!!errors.what} helperText={errors.what} />
|
|
<Button
|
|
type="submit"
|
|
variant="contained"
|
|
sx={{ padding: "8px 20px", }}
|
|
>
|
|
Save
|
|
</Button>
|
|
</form>
|
|
);
|
|
};
|