6 changed files with 170 additions and 8 deletions
@ -0,0 +1,134 @@ |
|||
/* |
|||
* Copyright © 2016-2019 The Thingsboard Authors |
|||
* |
|||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|||
* you may not use this file except in compliance with the License. |
|||
* You may obtain a copy of the License at |
|||
* |
|||
* http://www.apache.org/licenses/LICENSE-2.0 |
|||
* |
|||
* Unless required by applicable law or agreed to in writing, software |
|||
* distributed under the License is distributed on an "AS IS" BASIS, |
|||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
* See the License for the specific language governing permissions and |
|||
* limitations under the License. |
|||
*/ |
|||
import $ from 'jquery'; |
|||
import React from 'react'; |
|||
import ReactDOM from 'react-dom'; |
|||
import ThingsboardBaseComponent from './json-form-base-component.jsx'; |
|||
import reactCSS from 'reactcss'; |
|||
import TextField from 'material-ui/TextField'; |
|||
import IconButton from 'material-ui/IconButton'; |
|||
|
|||
class ThingsboardIcon extends React.Component { |
|||
|
|||
constructor(props) { |
|||
super(props); |
|||
this.onValueChanged = this.onValueChanged.bind(this); |
|||
this.onIconClick = this.onIconClick.bind(this); |
|||
this.onClear = this.onClear.bind(this); |
|||
var icon = props.value ? props.value : ''; |
|||
this.state = { |
|||
icon: icon |
|||
}; |
|||
} |
|||
|
|||
componentDidMount() { |
|||
var node = ReactDOM.findDOMNode(this); |
|||
var iconContainer = $(node).children('#icon-container'); |
|||
iconContainer.click(this, function(event) { |
|||
event.data.onIconClick(event); |
|||
}); |
|||
} |
|||
|
|||
componentWillUnmount () { |
|||
var node = ReactDOM.findDOMNode(this); |
|||
var iconContainer = $(node).children('#icon-container'); |
|||
iconContainer.off( "click" ); |
|||
} |
|||
|
|||
onValueChanged(value) { |
|||
var icon = value; |
|||
|
|||
this.setState({ |
|||
icon: value |
|||
}) |
|||
this.props.onChange(this.props.form.key, value); |
|||
} |
|||
|
|||
onIconClick(event) { |
|||
this.props.onIconClick(event); |
|||
} |
|||
|
|||
onClear(event) { |
|||
if (event) { |
|||
event.stopPropagation(); |
|||
} |
|||
this.onValueChanged(''); |
|||
} |
|||
|
|||
render() { |
|||
|
|||
const styles = reactCSS({ |
|||
'default': { |
|||
clear: { |
|||
marginTop: '15px' |
|||
}, |
|||
container: { |
|||
display: 'flex' |
|||
}, |
|||
icon: { |
|||
display: 'inline-block', |
|||
marginRight: '10px', |
|||
marginTop: '16px', |
|||
marginBottom: 'auto', |
|||
cursor: 'pointer', |
|||
border: 'solid 1px rgba(0, 0, 0, .27)' |
|||
}, |
|||
iconContainer: { |
|||
display: 'flex', |
|||
width: '100%' |
|||
}, |
|||
iconText: { |
|||
display: 'inline-block', |
|||
width: '100%' |
|||
}, |
|||
}, |
|||
}); |
|||
|
|||
var fieldClass = "tb-field"; |
|||
if (this.props.form.required) { |
|||
fieldClass += " tb-required"; |
|||
} |
|||
if (this.state.focused) { |
|||
fieldClass += " tb-focused"; |
|||
} |
|||
|
|||
var pickedIcon = 'more_horiz'; |
|||
if (this.state.icon != '') { |
|||
pickedIcon = this.state.icon; |
|||
} |
|||
|
|||
return ( |
|||
<div style={ styles.container }> |
|||
<div id="icon-container" style={ styles.iconContainer }> |
|||
<IconButton iconClassName="material-icons" style={ styles.icon }> |
|||
{pickedIcon} |
|||
</IconButton> |
|||
<TextField |
|||
className={fieldClass} |
|||
floatingLabelText={this.props.form.title} |
|||
hintText={this.props.form.placeholder} |
|||
errorText={this.props.error} |
|||
value={this.state.icon} |
|||
disabled={this.props.form.readonly} |
|||
style={ styles.iconText } /> |
|||
</div> |
|||
<IconButton iconClassName="material-icons" tooltip="Clear" onTouchTap={this.onClear}>clear</IconButton> |
|||
</div> |
|||
); |
|||
} |
|||
} |
|||
|
|||
export default ThingsboardBaseComponent(ThingsboardIcon); |
|||
Loading…
Reference in new issue