Skip to content

Commit a62e22a

Browse files
authored
Merge pull request #473 from rvsia/addSlider
Add slider components
2 parents 099c901 + 2c4078c commit a62e22a

File tree

27 files changed

+655
-23
lines changed

27 files changed

+655
-23
lines changed

packages/mui-component-mapper/src/files/component-mapper.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import Radio from './radio';
1313
import Wizard from './wizard';
1414
import FieldArray from './field-array';
1515
import DualListSelect from './dual-list-select';
16+
import Slider from './slider';
1617

1718
export const components = {
1819
TextField,
@@ -26,7 +27,8 @@ export const components = {
2627
PlainText,
2728
SubForm,
2829
Wizard,
29-
DualListSelect
30+
DualListSelect,
31+
Slider
3032
};
3133

3234
const componentMapper = {
@@ -43,7 +45,8 @@ const componentMapper = {
4345
[componentTypes.PLAIN_TEXT]: PlainText,
4446
[componentTypes.WIZARD]: Wizard,
4547
[componentTypes.FIELD_ARRAY]: FieldArray,
46-
[componentTypes.DUAL_LIST_SELECT]: DualListSelect
48+
[componentTypes.DUAL_LIST_SELECT]: DualListSelect,
49+
[componentTypes.SLIDER]: Slider
4750
};
4851

4952
export default componentMapper;
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import React from 'react';
2+
import PropTypes from 'prop-types';
3+
import { FormControl, FormGroup, FormHelperText, Slider as MUISlider, FormLabel, Grid } from '@material-ui/core';
4+
import { useFieldApi } from '@data-driven-forms/react-form-renderer';
5+
6+
import FormFieldGrid from '../common/form-field-grid';
7+
import { validationError } from '../common/helpers';
8+
9+
const Slider = (props) => {
10+
const {
11+
input,
12+
isReadOnly,
13+
isDisabled,
14+
isRequired,
15+
label,
16+
helperText,
17+
description,
18+
validateOnMount,
19+
meta,
20+
FormFieldGridProps,
21+
FormControlProps,
22+
FormGroupProps,
23+
FormLabelProps,
24+
FormHelperTextProps,
25+
before,
26+
after,
27+
InputGridProps,
28+
BeforeGridProps,
29+
SliderGridProps,
30+
AfterGridProps,
31+
...rest
32+
} = useFieldApi(props);
33+
34+
const invalid = validationError(meta, validateOnMount);
35+
const text = invalid || helperText || description;
36+
37+
return (
38+
<FormFieldGrid {...FormFieldGridProps}>
39+
<FormControl fullWidth required={isRequired} error={!!invalid} component="fieldset" {...FormControlProps}>
40+
<FormGroup {...FormGroupProps}>
41+
<FormLabel component="legend" {...FormLabelProps}>
42+
{label}
43+
</FormLabel>
44+
<Grid container spacing={2} alignItems="center" {...InputGridProps}>
45+
{before && (
46+
<Grid item {...BeforeGridProps}>
47+
{before}
48+
</Grid>
49+
)}
50+
<Grid item xs {...SliderGridProps}>
51+
<MUISlider {...input} {...rest} disabled={isDisabled || isReadOnly} onChange={(_e, value) => input.onChange(value)} />
52+
</Grid>
53+
{after && (
54+
<Grid item {...AfterGridProps}>
55+
{after}
56+
</Grid>
57+
)}
58+
</Grid>
59+
{(invalid || text) && <FormHelperText {...FormHelperTextProps}>{invalid || text}</FormHelperText>}
60+
</FormGroup>
61+
</FormControl>
62+
</FormFieldGrid>
63+
);
64+
};
65+
66+
Slider.propTypes = {
67+
isReadOnly: PropTypes.bool,
68+
isDisabled: PropTypes.bool,
69+
isRequired: PropTypes.bool,
70+
label: PropTypes.node,
71+
helperText: PropTypes.node,
72+
description: PropTypes.node,
73+
validateOnMount: PropTypes.bool,
74+
FormFieldGridProps: PropTypes.object,
75+
FormControlProps: PropTypes.object,
76+
FormGroupProps: PropTypes.object,
77+
FormLabelProps: PropTypes.object,
78+
FormHelperTextProps: PropTypes.object,
79+
before: PropTypes.node,
80+
after: PropTypes.node,
81+
InputGridProps: PropTypes.object,
82+
BeforeGridProps: PropTypes.object,
83+
SliderGridProps: PropTypes.object,
84+
AfterGridProps: PropTypes.object
85+
};
86+
87+
export default Slider;

packages/mui-component-mapper/src/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@ export { default as componentMapper, components } from './files/component-mapper
22
export { default as FormTemplate } from './files/form-template';
33
export { default as Checkbox } from './files/checkbox';
44
export { default as DatePicker } from './files/date-picker';
5+
export { default as DualListSelct } from './files/dual-list-select';
6+
export { default as FieldArray } from './files/field-array';
57
export { default as PlainText } from './files/plain-text';
68
export { default as Radio } from './files/radio';
79
export { default as Select } from './files/select';
10+
export { default as Slider } from './files/slider';
811
export { default as SubForm } from './files/sub-form';
912
export { default as Switch } from './files/switch';
1013
export { default as Tabs } from './files/tabs';

packages/mui-component-mapper/src/tests/form-fields.test.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ describe('formFields', () => {
4949
componentTypes.DATE_PICKER,
5050
componentTypes.TIME_PICKER,
5151
componentTypes.SWITCH,
52-
componentTypes.SELECT
52+
componentTypes.SELECT,
53+
componentTypes.SLIDER
5354
].forEach((component) => {
5455
describe(`Component type: ${component}`, () => {
5556
beforeEach(() => {
@@ -184,6 +185,8 @@ describe('formFields', () => {
184185
.first()
185186
.props().disabled
186187
).toEqual(true);
188+
} else if (component === componentTypes.SLIDER) {
189+
expect(wrapper.find('.Mui-disabled')).toHaveLength(2);
187190
} else {
188191
expect(
189192
wrapper
@@ -208,6 +211,8 @@ describe('formFields', () => {
208211
.first()
209212
.props().readOnly
210213
).toEqual(true);
214+
} else if (component === componentTypes.SLIDER) {
215+
expect(wrapper.find('.Mui-disabled')).toHaveLength(2);
211216
} else {
212217
expect(
213218
wrapper

packages/pf3-component-mapper/src/files/component-mapper.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import PlainText from './plain-text';
1313
import Radio from './radio';
1414
import Button from './button';
1515
import { InputAddonButtonGroup, InputAddonGroup } from './input-group-fields';
16+
import Slider from './slider';
1617

1718
const componentMapper = {
1819
[componentTypes.BUTTON]: Button,
@@ -29,7 +30,8 @@ const componentMapper = {
2930
[componentTypes.WIZARD]: Wizard,
3031
[componentTypes.PLAIN_TEXT]: PlainText,
3132
[componentTypes.INPUT_ADDON_BUTTON_GROUP]: InputAddonButtonGroup,
32-
[componentTypes.INPUT_ADDON_GROUP]: InputAddonGroup
33+
[componentTypes.INPUT_ADDON_GROUP]: InputAddonGroup,
34+
[componentTypes.SLIDER]: Slider
3335
};
3436

3537
export default componentMapper;
@@ -45,7 +47,8 @@ export const components = {
4547
DatePicker,
4648
Switch,
4749
Wizard,
48-
PlainText
50+
PlainText,
51+
Slider
4952
};
5053

5154
export const rawComponents = {

packages/pf3-component-mapper/src/files/form-template.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ import { Button as PF3Button, Form } from 'patternfly-react';
44
import './form-template.scss';
55
import FormTemplate from '@data-driven-forms/common/src/form-template';
66

7-
export const FormWrapper = ({ children, ...props }) => <Form {...props}>{children}</Form>;
7+
export const FormWrapper = ({ children, ...props }) => (
8+
<Form className="ddorg__pf3-layout-components__form-wrapper" {...props}>
9+
{children}
10+
</Form>
11+
);
812

913
FormWrapper.propTypes = {
1014
children: PropTypes.oneOfType([PropTypes.node, PropTypes.arrayOf(PropTypes.node)]).isRequired

packages/pf3-component-mapper/src/files/form-template.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,7 @@
88
}
99
}
1010
}
11+
12+
.ddorg__pf3-layout-components__form-wrapper {
13+
display: grid;
14+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import React from 'react';
2+
import PropTypes from 'prop-types';
3+
4+
import { useFieldApi } from '@data-driven-forms/react-form-renderer';
5+
6+
import { Slider as PF3Slider } from 'patternfly-react';
7+
8+
import FormGroup from '../common/form-wrapper';
9+
10+
const Slider = (props) => {
11+
const {
12+
meta,
13+
input,
14+
sliderInput,
15+
validateOnMount,
16+
label,
17+
sliderLabel,
18+
hideLabel,
19+
isRequired,
20+
helperText,
21+
description,
22+
inputAddon,
23+
...rest
24+
} = useFieldApi(props);
25+
26+
return (
27+
<FormGroup
28+
meta={meta}
29+
validateOnMount={validateOnMount}
30+
label={label}
31+
hideLabel={hideLabel}
32+
isRequired={isRequired}
33+
helperText={helperText}
34+
description={description}
35+
inputAddon={inputAddon}
36+
>
37+
<PF3Slider {...input} label={sliderLabel} input={sliderInput} {...rest} value={input.value || rest.min} onSlide={input.onChange} />
38+
</FormGroup>
39+
);
40+
};
41+
42+
Slider.propTypes = {
43+
validateOnMount: PropTypes.bool,
44+
label: PropTypes.node,
45+
hideLabel: PropTypes.bool,
46+
isRequired: PropTypes.bool,
47+
helperText: PropTypes.node,
48+
description: PropTypes.node,
49+
inputAddon: PropTypes.shape({ fields: PropTypes.array }),
50+
sliderLabel: PropTypes.node,
51+
sliderInput: PropTypes.bool
52+
};
53+
54+
export default Slider;

packages/pf3-component-mapper/src/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export { default as InputGroupFields } from './files/input-group-fields';
77
export { default as PlainText } from './files/plain-text';
88
export { default as Radio } from './files/radio';
99
export { default as Select } from './files/select';
10+
export { default as Slider } from './files/slider';
1011
export { default as SubForm } from './files/sub-form';
1112
export { default as Switch } from './files/switch';
1213
export { default as Tabs } from './files/tabs';

0 commit comments

Comments
 (0)