-
Notifications
You must be signed in to change notification settings - Fork 27
/
Copy pathFormsyCheckbox.tsx
106 lines (95 loc) · 2.57 KB
/
FormsyCheckbox.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import { FormsyInjectedProps, withFormsy } from 'formsy-react';
import React, { cloneElement, Component, createElement } from 'react';
import {
Checkbox,
Form,
Radio,
StrictFormFieldProps,
StrictRadioProps,
} from 'semantic-ui-react';
import { filterSuirElementProps } from './utils';
type CheckboxRadioValueType = boolean | number | string;
export interface IFormsyCheckboxProps
extends FormsyInjectedProps<CheckboxRadioValueType>,
Pick<
StrictFormFieldProps,
'as' | 'className' | 'error' | 'width' | 'inline' | 'disabled'
>,
Omit<StrictRadioProps, 'value' | 'name' | 'onChange'> {
inputClassName?: string;
passRequiredToField?: boolean;
inputAs?:
| typeof Form.Checkbox
| typeof Form.Radio
| typeof Checkbox
| typeof Radio;
defaultChecked?: boolean;
errorLabel?: React.ReactElement;
label?: string | React.ReactNode;
onChange?(
event: React.FormEvent<HTMLInputElement>,
data: Omit<StrictRadioProps, 'value'> & { value: CheckboxRadioValueType }
): void;
}
class FormsyCheckbox extends Component<IFormsyCheckboxProps> {
componentDidMount() {
const { defaultChecked, setValue } = this.props;
setValue(!!defaultChecked, false);
}
handleChange = (
e: React.FormEvent<HTMLInputElement>,
data: Omit<StrictRadioProps, 'value' | 'checked'> & {
value: CheckboxRadioValueType;
checked: boolean;
}
) => {
const { checked } = data;
this.props.setValue(checked);
if (this.props.onChange) {
this.props.onChange(e, data);
}
};
render() {
const {
inputAs = Checkbox,
required,
isValid,
isPristine,
errorLabel,
errorMessage,
value,
// Form.Field props
as,
width,
className,
disabled,
inline,
passRequiredToField,
} = this.props;
const error = !isPristine && !isValid;
const checkboxProps: Record<string, any> = {
...filterSuirElementProps(this.props),
label: this.props.label,
checked: !!value,
onChange: this.handleChange,
};
if (inputAs === Checkbox || inputAs === Radio) {
checkboxProps.error = undefined;
}
return (
<Form.Field
as={as}
className={className}
required={required && passRequiredToField}
error={error}
width={width}
inline={inline}
disabled={disabled}
>
{createElement(inputAs as any, { ...checkboxProps })}
{error && errorLabel && cloneElement(errorLabel, {}, errorMessage)}
</Form.Field>
);
}
}
export default withFormsy(FormsyCheckbox);