aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/ui/Slider.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/ui/Slider.tsx')
-rw-r--r--src/components/ui/Slider.tsx69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/components/ui/Slider.tsx b/src/components/ui/Slider.tsx
new file mode 100644
index 000000000..ed9fe9073
--- /dev/null
+++ b/src/components/ui/Slider.tsx
@@ -0,0 +1,69 @@
1import { ChangeEvent, Component, ReactElement } from 'react';
2import { observer } from 'mobx-react';
3import classnames from 'classnames';
4import { noop } from 'lodash';
5
6interface IProps {
7 field: any;
8 className?: string;
9 showLabel?: boolean;
10 disabled?: boolean;
11 type?: 'range' | 'number';
12 onSliderChange?: (e: ChangeEvent) => void;
13}
14
15// TODO - [TS DEBT] Should this file be converted into the coding style similar to './toggle/index.tsx'?
16@observer
17class Slider extends Component<IProps> {
18 onChange(e: ChangeEvent<HTMLInputElement>): void {
19 const { field, onSliderChange = noop } = this.props;
20 field.onChange(e);
21 onSliderChange(e);
22 }
23
24 render(): ReactElement {
25 const {
26 field,
27 className = '',
28 showLabel = true,
29 disabled = false,
30 type = 'range',
31 } = this.props;
32
33 if (field.value === '' && field.default !== '') {
34 field.value = field.default;
35 }
36
37 return (
38 <div
39 className={classnames([
40 'franz-form__field',
41 'franz-form__slider-wrapper',
42 className,
43 ])}
44 >
45 <div className="slider-container">
46 <input
47 className="slider"
48 type={type}
49 id={field.id}
50 name={field.name}
51 value={field.value}
52 min="1"
53 max="100"
54 onChange={e => (!disabled ? this.onChange(e) : null)}
55 />
56 </div>
57
58 {field.error && <div className={field.error}>{field.error}</div>}
59 {field.label && showLabel && (
60 <label className="franz-form__label" htmlFor={field.id}>
61 {field.label}
62 </label>
63 )}
64 </div>
65 );
66 }
67}
68
69export default Slider;