RRule: sanitize byday/month before using.

It was crashing when they were not array, so this change makes sure they are.
Additionally, since we don't support the number prefixes for by day (e.g.
3SA) at least sanitize the ones we can handle which are the ones
prefixed by 1 such as 1SA, and turn them into the equivalent SA.
master
Tom Hacohen 2020-03-10 10:10:01 +02:00
parent c9aefdec4c
commit 7efb185caf
1 changed files with 26 additions and 2 deletions

View File

@ -83,6 +83,30 @@ const menuItemsWeekDays = weekdays.map((day) => {
);
});
function makeArray<T>(item: T) {
if (item === undefined) {
return item;
} else if (Array.isArray(item)) {
return item;
} else {
return [item];
}
}
function sanitizeByDay(item: string | string[] | undefined) {
const ret = makeArray(item);
if (Array.isArray(ret)) {
return (ret as string[]).map((value) => {
if (parseInt(value) === 1) {
return value.substr(1);
}
return value;
});
} else {
return ret;
}
}
const styles = {
multiSelect: { minWidth: 120, maxWidth: '100%' },
width: { width: 120 },
@ -152,7 +176,7 @@ export default function RRule(props: PropsType) {
<FormControl>
<InputLabel>Weekdays</InputLabel>
<Select
value={options.byday ? options.byday : []}
value={sanitizeByDay(options.byday)}
multiple
style={styles.multiSelect}
onChange={(event: React.ChangeEvent<{ value: unknown }>) => {
@ -221,7 +245,7 @@ export default function RRule(props: PropsType) {
<InputLabel>Months</InputLabel>
<Select
style={styles.multiSelect}
value={options.bymonth ? options.bymonth : []}
value={makeArray(options.bymonth)}
multiple
onChange={(event: React.ChangeEvent<{ value: unknown }>) => {
const value = event.target.value as string[];