Skip to content

Commit 06693e7

Browse files
authored
Merge pull request #634 from data-driven-forms/add-slider-ant
fix(ant): Added slider component.
2 parents 6fedfd1 + 868aee8 commit 06693e7

File tree

4 files changed

+155
-3
lines changed

4 files changed

+155
-3
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import React from 'react';
2+
import componentTypes from '@data-driven-forms/react-form-renderer/dist/cjs/component-types';
3+
import validatorTypes from '@data-driven-forms/react-form-renderer/dist/cjs/validator-types';
4+
5+
const schema = {
6+
fields: [
7+
{
8+
component: componentTypes.SLIDER,
9+
name: 'simple-slider',
10+
label: 'Slider'
11+
},
12+
{
13+
component: componentTypes.SLIDER,
14+
name: 'required-slider',
15+
label: 'Slider required',
16+
isRequired: true,
17+
validate: [{ type: validatorTypes.REQUIRED }]
18+
},
19+
{
20+
component: componentTypes.SLIDER,
21+
name: 'range-custom-slider',
22+
label: 'Slider custom range',
23+
min: 10,
24+
max: 132,
25+
tooltipVisible: true
26+
},
27+
{
28+
component: componentTypes.SLIDER,
29+
name: 'range-slider',
30+
label: 'Slider range',
31+
range: true
32+
},
33+
{
34+
component: componentTypes.SLIDER,
35+
name: 'dost-slider',
36+
label: 'Slider dots',
37+
dots: true
38+
},
39+
{
40+
component: componentTypes.SLIDER,
41+
name: 'included-slider',
42+
label: 'Slider included',
43+
included: false
44+
},
45+
{
46+
component: componentTypes.SLIDER,
47+
name: 'marks-slider',
48+
label: 'Slider marks',
49+
marks: {
50+
25: {
51+
label: <h1>25 mark</h1>
52+
}
53+
}
54+
},
55+
{
56+
component: componentTypes.SLIDER,
57+
name: 'reverse-slider',
58+
label: 'Slider reverse',
59+
reverse: true
60+
}
61+
]
62+
};
63+
64+
export default schema;

packages/ant-component-mapper/demo/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import demoSchema from '@data-driven-forms/common/src/demoschema';
88
import dualListSelectSchema from './demo-schemas/dual-list-select-schema'
99
import { componentMapper, FormTemplate } from '../src';
1010
import wizardSchema from './demo-schemas/wizard-schema';
11+
import sliderSchema from './demo-schemas/slider-schema';
1112

1213
const style = {
1314
position: 'relative',
@@ -21,7 +22,7 @@ const App = () => (
2122
componentMapper={componentMapper}
2223
FormTemplate={(props) => <FormTemplate layout='vertical' {...props} />}
2324
onSubmit={console.log}
24-
schema={dualListSelectSchema}
25+
schema={sliderSchema}
2526
/>
2627
</div>
2728
);
Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,51 @@
1-
import React from 'react';
1+
import React, { useEffect } from 'react';
2+
import { Slider as AntSlider } from 'antd';
3+
import { useFieldApi } from '@data-driven-forms/react-form-renderer';
4+
import AntForm from '../common/form-wrapper';
25

3-
export default () => <div>not implemented</div>;
6+
const Slider = (props) => {
7+
const {
8+
input: { value, onChange, ...input },
9+
meta,
10+
label,
11+
validateOnMount,
12+
helperText,
13+
description,
14+
FormItemProps,
15+
isRequired,
16+
range,
17+
min = 0,
18+
max = 100,
19+
isDisabled,
20+
...rest
21+
} = useFieldApi(props);
22+
useEffect(() => {
23+
if (range === true && (!value || !Array.isArray(value))) {
24+
onChange([min, max]);
25+
}
26+
}, [min, max, range, value, onChange]);
27+
return (
28+
<AntForm
29+
label={label}
30+
meta={meta}
31+
validateOnMount={validateOnMount}
32+
helperText={helperText}
33+
description={description}
34+
FormItemProps={FormItemProps}
35+
isRequired={isRequired}
36+
>
37+
<AntSlider
38+
disabled={isDisabled}
39+
onChange={onChange}
40+
{...input}
41+
value={range === true && !Array.isArray(value) ? [min, max] : value}
42+
range={range}
43+
min={min}
44+
max={max}
45+
{...rest}
46+
/>
47+
</AntForm>
48+
);
49+
};
50+
51+
export default Slider;
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import React from 'react';
2+
import { Form as DDFForm } from '@data-driven-forms/react-form-renderer';
3+
import { mount } from 'enzyme';
4+
import { Slider as AntSlider } from 'antd';
5+
import Slider from '../files/slider';
6+
import AntForm from '../common/form-wrapper';
7+
8+
const Form = (props) => <DDFForm onSubmit={jest.fn()} {...props} />;
9+
10+
describe('<Slider />', () => {
11+
const initialProps = {
12+
label: 'Slider',
13+
name: 'slider'
14+
};
15+
16+
it('should render default slider with label', () => {
17+
const wrapper = mount(<Form>{() => <Slider {...initialProps} />}</Form>);
18+
expect(wrapper.find(AntSlider)).toHaveLength(1);
19+
expect(wrapper.find(AntForm)).toHaveLength(1);
20+
});
21+
22+
it('should have disabled prop when isDisabled is passed', () => {
23+
const wrapper = mount(<Form>{() => <Slider {...initialProps} isDisabled />}</Form>);
24+
expect(wrapper.find(AntSlider).prop('disabled')).toBe(true);
25+
});
26+
27+
it('should set value to array after first render if range propery is true', () => {
28+
const wrapper = mount(<Form>{() => <Slider {...initialProps} range isDisabled />}</Form>);
29+
wrapper.update();
30+
expect(wrapper.find(AntSlider).prop('value')).toEqual([0, 100]);
31+
});
32+
33+
it('min/max should default to 0/100', () => {
34+
const wrapper = mount(<Form>{() => <Slider {...initialProps} />}</Form>);
35+
wrapper.update();
36+
expect(wrapper.find(AntSlider).prop('min')).toBe(0);
37+
expect(wrapper.find(AntSlider).prop('max')).toBe(100);
38+
});
39+
});

0 commit comments

Comments
 (0)