-
-
Notifications
You must be signed in to change notification settings - Fork 5.3k
/
Copy pathBooleanInput.tsx
123 lines (115 loc) · 3.41 KB
/
BooleanInput.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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import * as React from 'react';
import { useCallback } from 'react';
import PropTypes from 'prop-types';
import clsx from 'clsx';
import FormControlLabel from '@mui/material/FormControlLabel';
import FormHelperText from '@mui/material/FormHelperText';
import FormGroup, { FormGroupProps } from '@mui/material/FormGroup';
import Switch, { SwitchProps } from '@mui/material/Switch';
import { FieldTitle, useInput } from 'ra-core';
import { CommonInputProps } from './CommonInputProps';
import { sanitizeInputRestProps } from './sanitizeInputRestProps';
import { InputHelperText } from './InputHelperText';
import { InputPropTypes } from './InputPropTypes';
export const BooleanInput = (props: BooleanInputProps) => {
const {
className,
row = false,
defaultValue = false,
format,
label,
fullWidth,
helperText,
onBlur,
onChange,
onFocus,
disabled,
parse,
resource,
source,
validate,
options = defaultOptions,
sx,
...rest
} = props;
const {
id,
field,
isRequired,
fieldState: { error, invalid, isTouched },
formState: { isSubmitted },
} = useInput({
defaultValue,
format,
parse,
resource,
source,
onBlur,
onChange,
type: 'checkbox',
validate,
...rest,
});
const handleChange = useCallback(
event => {
field.onChange(event);
// Ensure field is considered as touched
field.onBlur();
},
[field]
);
const renderHelperText =
helperText !== false || ((isTouched || isSubmitted) && invalid);
return (
<FormGroup
className={clsx('ra-input', `ra-input-${source}`, className)}
row={row}
sx={sx}
>
<FormControlLabel
inputRef={field.ref}
control={
<Switch
id={id}
name={field.name}
onChange={handleChange}
onFocus={onFocus}
checked={Boolean(field.value)}
{...sanitizeInputRestProps(rest)}
{...options}
disabled={disabled}
/>
}
label={
<FieldTitle
label={label}
source={source}
resource={resource}
isRequired={isRequired}
/>
}
/>
{renderHelperText ? (
<FormHelperText error={(isTouched || isSubmitted) && invalid}>
<InputHelperText
touched={isTouched || isSubmitted}
error={error?.message}
helperText={helperText}
/>
</FormHelperText>
) : null}
</FormGroup>
);
};
BooleanInput.propTypes = {
...InputPropTypes,
// @ts-ignore
options: PropTypes.shape(Switch.propTypes),
disabled: PropTypes.bool,
};
export type BooleanInputProps = CommonInputProps &
SwitchProps &
Omit<FormGroupProps, 'defaultValue' | 'onChange' | 'onBlur' | 'onFocus'> & {
options?: SwitchProps;
};
const defaultOptions = {};