Skip to content

Commit a0b73e7

Browse files
committed
Fix #43: Make multiselect work with other values than string
1 parent debb521 commit a0b73e7

File tree

3 files changed

+37
-14
lines changed

3 files changed

+37
-14
lines changed

src/components/form.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React from 'react';
22
import Button from './buttons';
33
import Loader from './loaders';
44
import {TimePicker} from './widgets';
5-
import {EditorContext, getCsrfCookie, capitalize} from '../util';
5+
import {EditorContext, getCsrfCookie, capitalize, convertType} from '../util';
66

77

88
export function FormInput({label, help_text, error, inputRef, ...props}) {
@@ -141,7 +141,11 @@ export class FormMultiSelectInput extends React.Component {
141141
if (e.target.checked) {
142142
value.push(e.target.value);
143143
} else {
144-
value = value.filter((item) => item !== e.target.value);
144+
value = value.filter((item) => {
145+
if (typeof item !== this.props.valueType)
146+
convertType(item, this.props.valueType);
147+
return item !== e.target.value;
148+
});
145149
}
146150

147151
let event = {

src/ui.js

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import {getBlankData} from './data';
22
import {Button, FormInput, FormCheckInput, FormRadioInput, FormSelectInput,
33
FormFileInput, FormRow, FormGroup, GroupTitle, FormRowControls, FormTextareaInput,
44
FormDateTimeInput, FormMultiSelectInput, FileUploader} from './components';
5-
import {getVerboseName} from './util';
5+
import {getVerboseName, convertType} from './util';
66

77

88
function handleChange(e, fieldType, callback) {
@@ -15,17 +15,10 @@ function handleChange(e, fieldType, callback) {
1515
value = e.target.value;
1616
}
1717

18-
if (fieldType === 'number' || fieldType === 'integer') {
19-
value = value.trim();
20-
if (value === '')
21-
value = null;
22-
else if (!isNaN(Number(value)))
23-
value = Number(value);
24-
} else if (fieldType === 'boolean') {
25-
if (value === 'false' || value === false)
26-
value = false;
27-
else
28-
value = true;
18+
if (Array.isArray(value)) { /* multiselect widget values are arrays */
19+
value = value.map((item) => convertType(item, fieldType));
20+
} else {
21+
value = convertType(value, fieldType);
2922
}
3023

3124
callback(e.target.name, value);
@@ -108,6 +101,7 @@ function FormField(props) {
108101
InputField = FormSelectInput;
109102
break;
110103
case 'multiselect':
104+
inputProps.valueType = props.schema.type;
111105
InputField = FormMultiSelectInput;
112106
break;
113107
case 'textarea':

src/util.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,31 @@ export function capitalize(string) {
1212
}
1313

1414

15+
export function convertType(value, to) {
16+
if (typeof value === to)
17+
return value;
18+
19+
if (to === 'number' || to === 'integer') {
20+
if (typeof value === 'string') {
21+
value = value.trim();
22+
if (value === '')
23+
value = null;
24+
else if (!isNaN(Number(value)))
25+
value = Number(value);
26+
} else if (typeof value === 'boolean') {
27+
value = value === true ? 1 : 0;
28+
}
29+
} else if (to === 'boolean') {
30+
if (value === 'false' || value === false)
31+
value = false;
32+
else
33+
value = true;
34+
}
35+
36+
return value;
37+
}
38+
39+
1540
export function getVerboseName(name) {
1641
if (name === undefined || name === null)
1742
return '';

0 commit comments

Comments
 (0)