1
0
Fork 0
mirror of https://git.rwth-aachen.de/acs/public/villas/web/ synced 2025-03-09 00:00:01 +01:00

Included slider library. Slider adapts to orientation changes

This commit is contained in:
Ricardo Hernandez-Montoya 2017-04-19 15:46:23 +02:00
parent 3c60a4800c
commit 02011d6067
5 changed files with 108 additions and 59 deletions

View file

@ -21,7 +21,8 @@
"react-router": "^3.0.2",
"superagent": "^3.5.0",
"gaugeJS": "^1.3.2",
"d3-scale": "^1.0.5"
"d3-scale": "^1.0.5",
"rc-slider": "^7.0.1"
},
"devDependencies": {
"react-scripts": "0.9.3"

View file

@ -9,6 +9,8 @@
import React, { Component } from 'react';
import classNames from 'classnames';
import Slider from 'rc-slider';
import 'rc-slider/assets/index.css';
class WidgetSlider extends Component {
@ -27,43 +29,68 @@ class WidgetSlider extends Component {
};
}
valueChanged(e) {
this.setState({ value: e.target.value });
componentWillReceiveProps(nextProps) {
// Update value
if (nextProps.widget.value && this.state.value !== nextProps.widget.value) {
this.setState({ value: nextProps.widget.value })
}
// Check if the orientation changed, update the size if it did
if (this.props.widget.orientation !== nextProps.widget.orientation) {
let baseWidget = nextProps.widget;
// Exchange dimensions and constraints
let newWidget = Object.assign({}, baseWidget, {
width: baseWidget.height,
height: baseWidget.width,
minWidth: baseWidget.minHeight,
minHeight: baseWidget.minWidth,
maxWidth: baseWidget.maxHeight,
maxHeight: baseWidget.maxWidth
});
nextProps.onWidgetChange(newWidget);
}
}
valueIsChanging(newValue) {
this.setState({ value: newValue });
}
valueChanged(newValue) {
// Enable to propagate action
// let newWidget = Object.assign({}, this.props.widget, {
// value: newValue
// });
// this.props.onWidgetChange(newWidget);
}
render() {
let isVertical = this.props.widget.orientation === WidgetSlider.OrientationTypes.VERTICAL.value;
let fields = {
'name': this.props.widget.name,
'control': <input type="range" min="0" max="100" disabled={ this.props.editing } onChange={ (e) => this.valueChanged(e) } defaultValue={ this.state.value }/>,
'control': <Slider min={0} max={100} value={ this.state.value } step={ 0.1 } disabled={ this.props.editing } vertical={ isVertical } onChange={ (v) => this.valueIsChanging(v) } onAfterChange={ (v) => this.valueChanged(v) }/>,
'value': this.state.value
}
let vertical = this.props.widget.orientation === WidgetSlider.OrientationTypes.VERTICAL.value;
var widgetClasses = classNames({
'slider-widget': true,
'full': true,
'vertical': vertical,
'horizontal': !vertical
'vertical': isVertical,
'horizontal': !isVertical
});
return (
this.props.widget.orientation === WidgetSlider.OrientationTypes.HORIZONTAL.value? (
<div className={widgetClasses}>
<div>
<label>{ fields.name }</label>
</div>
<div>
{ fields.control }
<span>{ fields.value }</span>
</div>
<label>{ fields.name }</label>
<div className='slider'>{ fields.control }</div>
<span>{ fields.value }</span>
</div>
) : (
<div className={widgetClasses}>
<div>
<label>{ fields.name }</label>
<span>{ fields.value }</span>
</div>
<div>{ fields.control }</div>
<label>{ fields.name }</label>
{ fields.control }
<span>{ fields.value }</span>
</div>
)
);

View file

@ -192,8 +192,11 @@ class Visualization extends Component {
widget.width = 200;
widget.height = 50;
} else if (item.name === 'Slider') {
widget.minWidth = 380;
widget.minHeight = 30;
// Set dimensions and constraints as Horizontal
widget.minWidth = 150;
widget.minHeight = 50;
widget.maxHeight = 51;
widget.maxWidth = 1000;
widget.width = 400;
widget.height = 50;
widget.orientation = WidgetSlider.OrientationTypes.HORIZONTAL.value; // Assign default orientation

View file

@ -143,7 +143,7 @@ class Widget extends Component {
} else if (widget.type === 'NumberInput') {
element = <WidgetNumberInput widget={widget} editing={this.props.editing} />
} else if (widget.type === 'Slider') {
element = <WidgetSlider widget={widget} editing={this.props.editing} />
element = <WidgetSlider widget={widget} editing={this.props.editing} onWidgetChange={(w) => this.props.onWidgetStatusChange(w, this.props.index) } />
} else if (widget.type === 'Gauge') {
element = <WidgetGauge widget={widget} data={this.state.simulatorData} editing={this.props.editing} simulation={this.props.simulation} />
}

View file

@ -288,52 +288,70 @@ div[class*="-widget"] label {
}
/* End number input widget */
/* Slider widget */
.slider-widget.vertical input[type="range"] {
position: absolute;
top: 40%;
left: 50%;
transform: rotate(270deg);
/*margin-left: 20px;*/
width: 150px;
}
input[type=range]::-moz-range-thumb {
background: #ffffff;
}
input[type=range]::-webkit-slider-thumb {
background: #ffffff;
}
input[type=range]::-ms-thumb {
background: #ffffff;
}
.slider-widget.horizontal div {
width: 50%;
display: inline-block;
text-align: center;
vertical-align: top;
}
.slider-widget.horizontal span {
display: block;
margin: 5px;
}
.slider-widget.vertical div {
width: 50%;
/* Begin Slider widget */
.slider-widget {
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-around;
}
.slider-widget label {
flex: 0 0 auto;
text-align: center;
}
.slider-widget span {
text-align: center;
font-size: 1.5em;
font-weight: 600;
}
.slider-widget.horizontal .slider {
flex: 1 1 auto;
}
.slider-widget.horizontal span {
flex: 0 0 50pt;
}
.slider-widget.horizontal label {
padding-right: 10px;
}
.slider-widget.vertical {
flex-direction: column;
}
.slider-widget.vertical span {
padding-top: 10px;
}
.slider-widget.vertical label {
padding-bottom: 10px;
}
/* Begin Slider customization */
.rc-slider-track {
background-color: #6EA2B0;
}
.rc-slider-handle, .rc-slider-handle:hover {
border-color: #6EA2B0;
}
.rc-slider-disabled {
background-color: inherit;
}
.rc-slider-disabled .rc-slider-handle {
cursor: inherit;
}
.rc-slider-disabled .rc-slider-handle:hover {
border-color:#ccc;
}
/* End Slider customization */
/* End slider widget */
/* Gauge widget */