Skip to content

Commit df2dad2

Browse files
committed
fix: multi select creatable integrated
1 parent 4f37dcb commit df2dad2

File tree

6 files changed

+59
-63
lines changed

6 files changed

+59
-63
lines changed

src/Form.jsx

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,6 @@ class Form extends React.Component {
5454
onSubmit = () => {
5555
this.props.onSubmit({ formData: this.state.data });
5656
}
57-
handleCreatableSelectChange = (value, actionMeta) => {
58-
console.group('Value Changed');
59-
console.log(value);
60-
console.log(`action: ${actionMeta.action}`);
61-
console.groupEnd();
62-
this.setState({ value }, this.notifyChange);
63-
};
6457
handleCreatableSelectInputChange = (inputValue) => {
6558
this.setState({ inputValue }, this.notifyChange);
6659
};
@@ -88,12 +81,7 @@ class Form extends React.Component {
8881
path={''}
8982
data={this.state.data}
9083
id={id}
91-
inputValue={this.state.inputValue}
92-
creatableSelectValue={this.state.value}
9384
onChange={this.onChange}
94-
onKeyDown={this.handleCreatableSelectKeyDown}
95-
onCreatableSelectChange={this.handleCreatableSelectChange}
96-
onInputChange={this.handleCreatableSelectInputChange}
9785
onSubmit={this.onSubmit}
9886
validation={validation}
9987
onMoveItemUp={this.onMoveItemUp}

src/demo/examples/simple/form-data.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@
33
"lastName": "Norris",
44
"age": 75,
55
"password": "noneed",
6+
"creatableSelectTest": "[{\"label\":\"hello\",\"value\":\"hello\"},{\"label\":\"yes\",\"value\":\"yes\"}]",
67
"selectTest": "[{\"key\":\"220\",\"value\":\"Vanaf 6 jaar\",\"allowableOptionValues\":{\"210\":\"Alle Leeftijden\",\"220\":\"Vanaf 6 jaar\",\"225\":\"Vanaf 9 jaar\",\"230\":\"Vanaf 12 jaar\",\"240\":\"Vanaf 16 jaar\",\"250\":\"Vanaf 18 jaar\"}},{\"key\":\"210\",\"value\":\"Alle Leeftijden\",\"allowableOptionValues\":{\"210\":\"Alle Leeftijden\",\"220\":\"Vanaf 6 jaar\",\"225\":\"Vanaf 9 jaar\",\"230\":\"Vanaf 12 jaar\",\"240\":\"Vanaf 16 jaar\",\"250\":\"Vanaf 18 jaar\"}},{\"key\":\"225\",\"value\":\"Vanaf 9 jaar\",\"allowableOptionValues\":{\"210\":\"Alle Leeftijden\",\"220\":\"Vanaf 6 jaar\",\"225\":\"Vanaf 9 jaar\",\"230\":\"Vanaf 12 jaar\",\"240\":\"Vanaf 16 jaar\",\"250\":\"Vanaf 18 jaar\"}}]"
78
}
Lines changed: 3 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,10 @@
11
import React from 'react';
22
import CreatableSelect from './lib/CreatableReactSelect';
33

4-
export default ({ type, value, creatableSelectValue, inputValue, options, label, nullOption, onChange, onKeyDown, onInputChange, ...rest }) => {
5-
console.log('value is', creatableSelectValue);
6-
let newVal = (creatableSelectValue) ? JSON.parse(creatableSelectValue) : [];
7-
let newInputVal = inputValue;
8-
console.log('onChange is', onChange);
9-
10-
const createOption = label => ({
11-
label,
12-
value: label,
13-
});
14-
15-
const handleCreatableSelectKeyDown = (event) => {
16-
if (!newInputVal) return;
17-
const finalVal = (value) ? [...JSON.parse(value), createOption(newInputVal)] : [createOption(newInputVal)];
18-
switch (event.key) {
19-
case 'Enter':
20-
case 'Tab':
21-
console.group('Value Added');
22-
console.log(finalVal);
23-
console.groupEnd();
24-
newVal = finalVal;
25-
newInputVal = '';
26-
event.preventDefault();
27-
break;
28-
default:
29-
break;
30-
}
31-
};
32-
return (
4+
export default ({ type, value, label, onChange, ...rest }) => (
335
<CreatableSelect
34-
value={newVal}
35-
inputValue={newInputVal}
6+
value={(value) ? JSON.parse(value) : []}
367
onChange={onChange}
37-
onKeyDown={handleCreatableSelectKeyDown}
38-
onInputChange={onInputChange}
398
label={label}
409
/>
41-
);
42-
};
10+
);

src/fields/components/Picker.jsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ import DatePicker from 'material-ui-pickers/DatePicker';
33
import TimePicker from 'material-ui-pickers/TimePicker';
44
import DateTimePicker from 'material-ui-pickers/DateTimePicker';
55

6-
const doOnChange = onChange => (e, checked) => onChange(checked);
7-
86
const renderPickerComp = (type) => {
97
switch (type) {
108
case 'material-date':

src/fields/components/lib/CreatableReactSelect.jsx

Lines changed: 54 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ const components = {
66
DropdownIndicator: null,
77
};
88

9+
const createOption = label => ({
10+
label,
11+
value: label,
12+
});
13+
914
const colourStyles = {
1015
control: styles => ({
1116
...styles,
@@ -26,7 +31,51 @@ const colourStyles = {
2631
};
2732

2833
export default class CreatableInputOnly extends Component {
34+
state = {
35+
inputValue: '',
36+
value: [],
37+
};
38+
39+
componentWillMount = () => {
40+
this.setState({
41+
value: this.props.value,
42+
});
43+
}
44+
45+
handleChange = (value, actionMeta) => {
46+
console.group('Value Changed');
47+
console.log(value);
48+
console.log(`action: ${actionMeta.action}`);
49+
console.groupEnd();
50+
this.props.onChange(value);
51+
this.setState({ value });
52+
};
53+
54+
handleInputChange = (inputValue) => {
55+
this.setState({ inputValue });
56+
};
57+
58+
handleKeyDown = (event) => {
59+
const { inputValue, value } = this.state;
60+
if (!inputValue) return;
61+
switch (event.key) {
62+
case 'Enter':
63+
case 'Tab':
64+
console.group('Value Added');
65+
console.log(value);
66+
console.groupEnd();
67+
const finalValue = [...value, createOption(inputValue)];
68+
this.props.onChange(finalValue);
69+
this.setState({
70+
inputValue: '',
71+
value: finalValue,
72+
});
73+
event.preventDefault();
74+
}
75+
};
76+
2977
render() {
78+
const { inputValue, value } = this.state;
3079
return (
3180
<div>
3281
<span style={{
@@ -40,16 +89,16 @@ export default class CreatableInputOnly extends Component {
4089
</span>
4190
<CreatableReactSelect
4291
components={components}
43-
inputValue={this.props.inputValue}
92+
inputValue={inputValue}
4493
isClearable
4594
isMulti
4695
menuIsOpen={false}
47-
onChange={this.props.onChange}
48-
onInputChange={this.props.onInputChange}
49-
onKeyDown={this.props.onKeyDown}
96+
onChange={this.handleChange}
97+
onInputChange={this.handleInputChange}
98+
onKeyDown={this.handleKeyDown}
5099
styles={colourStyles}
51100
placeholder={'Type something and press enter...'}
52-
value={this.props.value}
101+
value={value}
53102
/>
54103
</div>
55104
);

src/fields/configure/get-component-props.js

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ const coerceValue = (type, value) => {
2828
const onChangeHandler = (onChange, type, widget, options) => (e) => {
2929
const value = (type === 'material-date' || type === 'material-time' || type === 'material-datetime') ?
3030
e.format() :
31-
(widget === 'material-multiselect' || widget === 'material-select') ?
31+
(widget === 'material-multiselect' || widget === 'material-select' || widget === 'creatable-select') ?
3232
coerceValue(type, JSON.stringify(e))
3333
: (options === 'rich-text-editor') ? serializer.serialize(e) : coerceValue(type, e.target.value);
3434
if (value !== undefined) onChange(value);
@@ -89,14 +89,6 @@ export default ({ schema = {}, uiSchema = {}, inputValue, onChange, onKeyDown, c
8989
rv.rows = 5;
9090
}
9191

92-
if (widget === 'creatable-select') {
93-
rv.onKeyDown = onKeyDown;
94-
rv.onInputChange = onInputChange;
95-
rv.onChange = onCreatableSelectChange;
96-
rv.inputValue = inputValue;
97-
rv.creatableSelectValue = creatableSelectValue;
98-
}
99-
10092
if (options.disabled) {
10193
if (typeof options.disabled === 'boolean') {
10294
rv.disabled = options.disabled;

0 commit comments

Comments
 (0)