in public/src/components/channelManagement/campaigns/CampaignsEditor.tsx [119:262]
function CampaignsEditor({ campaign, updateCampaign }: CampaignsEditorProps): React.ReactElement {
const classes = useStyles();
const [testData, setTestData] = useState<Test[]>([]);
const [editMode, setEditMode] = useState(false);
const [showArchivedTests, setShowArchivedTests] = useState(false);
const { name, nickname, description, notes, isActive } = campaign;
const doDataFetch = (name: string) => {
fetchCampaignTests(name).then(tests => {
// sort by test priority; each channel sets its own priority list
const sortedTests = tests.sort((a: Test, b: Test) => {
if (a.priority != null && b.priority != null) {
return a.priority - b.priority;
}
return 0;
});
setTestData(sortedTests);
});
};
const defaultValues = {
description: description ?? '',
notes: notes ?? [],
isActive: isActive ?? true,
};
useEffect(() => {
doDataFetch(name);
}, [name]);
const updatePage = () => doDataFetch(name);
const { register, handleSubmit, errors, trigger, control } = useForm<FormData>({
mode: 'onChange',
defaultValues,
});
useEffect(() => {
trigger();
}, []);
const filterTests = (channel: string) => {
if (showArchivedTests) {
return testData.filter(test => test.channel === channel);
} else {
const filteredTests = testData.filter(test => test.channel === channel);
return filteredTests.filter(test => test.status !== 'Archived');
}
};
const onSubmit = ({ description, notes, isActive }: FormData): void => {
updateCampaign({ ...campaign, description, notes, isActive });
};
return (
<div className={classes.testEditorContainer}>
<StickyTopBar
name={name}
nickname={nickname}
tests={testData}
showArchivedTests={showArchivedTests}
setShowArchivedTests={setShowArchivedTests}
updatePage={updatePage}
/>
<div className={classes.scrollableContainer}>
{name !== unassignedCampaign.name && (
<div className={classes.formContainer}>
<div className={classes.notesContainer}>
<div className={classes.notesHeaderLine}>
<Typography className={classes.notesHeader}>
Campaign metadata and notes:
</Typography>
<Button variant="contained" onClick={() => setEditMode(!editMode)}>
<Typography>{editMode ? 'Save' : 'Edit'}</Typography>
</Button>
</div>
<TextField
inputRef={register()}
error={errors.description !== undefined}
helperText={errors.description ? errors.description.message : ''}
onBlur={handleSubmit(onSubmit)}
name="description"
label="Description"
margin="normal"
variant="outlined"
disabled={!editMode}
fullWidth
/>
<Controller
name="isActive"
control={control}
render={data => (
<FormControlLabel
control={
<Switch
inputRef={register()}
name="isActive"
onChange={e => {
data.onChange(e.target.checked);
handleSubmit(onSubmit)();
}}
checked={data.value}
disabled={!editMode}
/>
}
label={'Include this campaign in Channel Test campaign selectors'}
/>
)}
/>
<Controller
name="notes"
control={control}
render={data => {
return (
<RichTextEditor
error={errors.notes !== undefined}
copyData={data.value}
updateCopy={pars => {
data.onChange(pars);
handleSubmit(onSubmit)();
}}
name="notes"
label="Notes and links"
disabled={!editMode}
rteMenuConstraints={{
noCurrencyTemplate: true,
noCountryNameTemplate: true,
noArticleCountTemplate: true,
noPriceTemplates: true,
noDateTemplate: true,
noDayTemplate: true,
}}
/>
);
}}
/>
</div>
</div>
)}