Files
Airframe-React/app/routes/Forms/Sliders/Sliders.js
2019-08-15 00:54:44 +02:00

501 lines
21 KiB
JavaScript
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React from 'react';
import PropTypes from 'prop-types';
import Slider, { Range } from 'rc-slider';
import colors from './../../../colors';
import {
Form,
FormGroup,
Card,
CardBody,
CardTitle,
Label,
Input,
Button,
Row,
Col,
Container
} from './../../../components';
import { HeaderMain } from "../../components/HeaderMain";
import { HeaderDemo } from "../../components/HeaderDemo";
import classes from './Sliders.scss';
const marks = {
'-10': '-10°C',
0: <strong>0°C</strong>,
26: '26°C',
37: '37°C',
50: '50°C',
100: {
style: {
color: colors['danger'],
},
label: <strong>100°C</strong>,
},
}
class CustomizedRange extends React.Component {
constructor(props) {
super(props);
this.state = {
lowerBound: 20,
upperBound: 40,
value: [20, 40]
};
}
onLowerBoundChange(e) {
this.setState({ lowerBound: +e.target.value });
}
onUpperBoundChange(e) {
this.setState({ upperBound: +e.target.value });
}
onSliderChange(value) {
this.setState({
value,
});
}
handleApply() {
const { lowerBound, upperBound } = this.state;
this.setState({ value: [lowerBound, upperBound] });
}
render() {
return (
<div>
<Form inline className='mb-3 d-flex justify-content-between'>
<div className="d-flex">
<FormGroup className='mr-3'>
<Label>
Lower Bound
</Label>
<Input
type="number"
bsSize="sm"
className={ classes.inlineInput }
value={this.state.lowerBound}
onChange={this.onLowerBoundChange.bind(this)}
/>
</FormGroup>
<FormGroup>
<Label>
Upper Bound
</Label>
<Input
type="number"
bsSize="sm"
className={ classes.inlineInput }
value={this.state.upperBound}
onChange={this.onUpperBoundChange.bind(this)}
/>
</FormGroup>
</div>
<FormGroup>
<Button
onClick={this.handleApply.bind(this)}
type="button"
color="primary"
size="sm"
block
>
Apply
</Button>
</FormGroup>
</Form>
<div className={ classes.sliderWrap }>
<Range allowCross={false} value={this.state.value} onChange={this.onSliderChange.bind(this)} />
</div>
</div>
);
}
}
class DynamicBounds extends React.Component {
static propTypes = {
children: PropTypes.node.isRequired
}
constructor(props) {
super(props);
this.state = {
min: 0,
max: 100,
};
}
onMinChange(e) {
this.setState({
min: +e.target.value || 0,
});
}
onMaxChange(e) {
this.setState({
max: +e.target.value || 100,
});
}
render() {
const { children } = this.props;
const updatedChild = React.cloneElement(React.Children.only(children), {
min: this.state.min,
max: this.state.max
});
return (
<div>
<Form inline className="mb-3">
<FormGroup className="mr-3">
<Label>
Min
</Label>
<Input
className={ classes.inlineInput }
type="number"
value={this.state.min}
onChange={this.onMinChange.bind(this)}
bsSize="sm"
/>
</FormGroup>
<FormGroup>
<Label>
Max
</Label>
<Input
className={ classes.inlineInput }
type="number"
value={this.state.max}
onChange={this.onMaxChange.bind(this)}
bsSize="sm"
/>
</FormGroup>
</Form>
<div className={ classes.sliderWrap }>
{ updatedChild }
</div>
</div>
);
}
}
class ControlledRange extends React.Component {
constructor(props) {
super(props);
this.state = {
value: [20, 40, 60, 80],
};
}
handleChange = (value) => {
this.setState({
value,
});
}
render() {
return (
<Range value={this.state.value} onChange={this.handleChange}/>
);
}
}
class CustomizedSlider extends React.Component {
constructor() {
super();
this.state = {
value: 50
}
}
onSliderChange(value) {
this.setState({
value
});
}
render() {
return(
<Slider value={this.state.value} onChange={this.onSliderChange.bind(this)} />
)
}
}
export class Sliders extends React.Component {
render() {
return (
<Container>
<HeaderMain
title="Sliders"
className="mb-5 mt-4"
/>
<Row>
<Col>
{ /* START Header 1 */}
<HeaderDemo
no={1}
title="Marks"
subTitle={(
<React.Fragment>
See 6 examples below:
</React.Fragment>
)}
/>
{ /* END Header 1 */}
{ /* START Card Example */}
<Card>
<CardBody>
<Row>
<Col lg={ 6 }>
<p>Slider with marks, <code>step=null</code></p>
<div className={ classes.markedSliderWrap }>
<Slider min={-10} marks={marks} step={null} defaultValue={20} />
</div>
</Col>
<Col lg={ 6 }>
<p>Slider with marks, <code>included=false</code></p>
<div className={ classes.markedSliderWrap }>
<Slider min={-10} marks={marks} included={false} defaultValue={20} />
</div>
</Col>
<Col lg={ 6 }>
<p>Slider with marks and steps</p>
<div className={ classes.markedSliderWrap }>
<Slider dots min={-10} marks={marks} step={10} defaultValue={20} />
</div>
</Col>
<Col lg={ 6 }>
<p>Slider with marks and steps, <code>included=false</code></p>
<div className={ classes.markedSliderWrap }>
<Slider min={-10} marks={marks} step={10} included={false} defaultValue={20} />
</div>
</Col>
<Col lg={ 6 }>
<p>Range with marks</p>
<div className={ classes.markedSliderWrap }>
<Range min={-10} marks={marks} defaultValue={[20, 40]} />
</div>
</Col>
<Col lg={ 6 }>
<p>Range with marks and steps</p>
<div className={ classes.markedSliderWrap }>
<Range min={-10} marks={marks} step={10} defaultValue={[20, 40]} />
</div>
</Col>
</Row>
</CardBody>
</Card>
{ /* END Card Example */}
{ /* START Header 2 */}
<HeaderDemo
no={2}
title="Range"
className="mt-5"
subTitle={(
<React.Fragment>
See 8 examples below:
</React.Fragment>
)}
/>
{ /* END Header 2 */}
{ /* START Card Example */}
<Card>
<CardBody>
<Row>
<Col lg={ 6 }>
<p>Basic Range<code>allowCross=false</code></p>
<div className={ classes.rangeSliderWrap }>
<Range allowCross={false} defaultValue={[0, 20]} />
</div>
</Col>
<Col lg={ 6 }>
<p>Basic Range<code>disabled</code></p>
<div className={ classes.rangeSliderWrap }>
<Range allowCross={false} defaultValue={[0, 20]} disabled />
</div>
</Col>
<Col lg={ 6 }>
<p>Basic Range<code>step=20</code> </p>
<div className={ classes.rangeSliderWrap }>
<Range step={20} defaultValue={[20, 20]} />
</div>
</Col>
<Col lg={ 6 }>
<p>Basic Range<code>step=20, dots</code> </p>
<div className={ classes.rangeSliderWrap }>
<Range dots step={20} defaultValue={[20, 40]} />
</div>
</Col>
<Col lg={ 6 }>
<p>Controlled Range</p>
<div className={ classes.rangeSliderWrap }>
<ControlledRange />
</div>
</Col>
<Col lg={ 6 }>
<p>Multi Range</p>
<div className={ classes.rangeSliderWrap }>
<Range count={3} defaultValue={[20, 40, 60, 80]} pushable />
</div>
</Col>
<Col lg={ 6 }>
<p>Customized Range</p>
<div className={ classes.rangeSliderWrap }>
<CustomizedRange />
</div>
</Col>
<Col lg={ 6 }>
<p>Range with dynamic <code>max</code> <code>min</code></p>
<div className={ classes.rangeSliderWrap }>
<DynamicBounds>
<Range defaultValue={[20, 50]} />
</DynamicBounds>
</div>
</Col>
</Row>
</CardBody>
</Card>
{ /* END Card Example */}
{ /* START Header 3 */}
<HeaderDemo
no={3}
title="Sliders"
className="mt-5"
subTitle={(
<React.Fragment>
See 7 examples below:
</React.Fragment>
)}
/>
{ /* END Header 3 */}
{ /* START Card Example */}
<Card>
<CardBody>
<Row>
<Col lg={ 6 }>
<p>Basic Slider</p>
<div className={ classes.rangeSliderWrap }>
<Slider tipTransitionName="rc-slider-tooltip-zoom-down" />
</div>
</Col>
<Col lg={ 6 }>
<p>Basic Slider, <code>disabled</code></p>
<div className={ classes.rangeSliderWrap }>
<Slider tipTransitionName="rc-slider-tooltip-zoom-down" disabled />
</div>
</Col>
<Col lg={ 6 }>
<p>Basic Slider<code>step=20</code></p>
<div className={ classes.rangeSliderWrap }>
<Slider step={20} defaultValue={50} />
</div>
</Col>
<Col lg={ 6 }>
<p>Basic Slider<code>step=20, dots</code></p>
<div className={ classes.rangeSliderWrap }>
<Slider dots step={20} defaultValue={100} />
</div>
</Col>
<Col lg={ 6 }>
<p>Controlled Slider</p>
<div className={ classes.rangeSliderWrap }>
<Slider value={50} />
</div>
</Col>
<Col lg={ 6 }>
<p>Customized Slider</p>
<div className={ classes.rangeSliderWrap }>
<CustomizedSlider />
</div>
</Col>
<Col lg={ 6 }>
<p>Slider with dynamic <code>min</code>, <code>max</code></p>
<div className={ classes.rangeSliderWrap }>
<DynamicBounds>
<Slider defaultValue={50} />
</DynamicBounds>
</div>
</Col>
</Row>
</CardBody>
</Card>
{ /* START Header 4 */}
<HeaderDemo
no={4}
title="Vertical Sliders"
className="mt-5"
subTitle={(
<React.Fragment>
See 6 examples below:
</React.Fragment>
)}
/>
{ /* END Header 4 */}
{ /* START Card Example */}
<Card>
<CardBody>
<Row>
<Col lg={ 3 }>
<p>Slider with marks, <code>step=null</code></p>
<div className={ classes.markedSliderVerticalWrap }>
<Slider vertical min={-10} marks={marks} step={null} defaultValue={20} />
</div>
</Col>
<Col lg={ 3 }>
<p>Slider with marks and steps</p>
<div className={ classes.markedSliderVerticalWrap }>
<Slider vertical dots min={-10} marks={marks} step={10} defaultValue={20} />
</div>
</Col>
<Col lg={ 3 }>
<p>Slider with marks, <code>included=false</code></p>
<div className={ classes.markedSliderVerticalWrap }>
<Slider vertical min={-10} marks={marks} included={false} defaultValue={20} />
</div>
</Col>
<Col lg={ 3 }>
<p>Slider with marks and steps, <code>included=false</code></p>
<div className={ classes.markedSliderVerticalWrap }>
<Slider vertical min={-10} marks={marks} step={10} included={false} defaultValue={20} />
</div>
</Col>
<Col lg={ 3 }>
<p>Range with marks</p>
<div className={ classes.markedSliderVerticalWrap }>
<Range vertical min={-10} marks={marks} defaultValue={[20, 40]} />
</div>
</Col>
<Col lg={ 3 }>
<p>Range with marks and steps</p>
<div className={ classes.markedSliderVerticalWrap }>
<Range vertical min={-10} marks={marks} step={10}
defaultValue={[20, 40]}
/>
</div>
</Col>
</Row>
</CardBody>
</Card>
{ /* END Card Example */}
</Col>
</Row>
</Container>
);
}
}