UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

112 lines (96 loc) 3.3 kB
// Copyright (c) 2018 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import React, {Component} from 'react'; import PropTypes from 'prop-types'; import styled from 'styled-components'; import pick from 'lodash.pick'; function noop() {} const StyledSwitchInput = styled.label` ${props => props.secondary ? props.theme.secondarySwitch : props.theme.inputSwitch}; `; const StyledCheckboxInput = styled.label` ${props => props.theme.inputCheckbox} `; const HiddenInput = styled.input` position: absolute; display: none; `; const StyledCheckbox = styled.div` line-height: 0; height: ${props => props.theme.switchBtnHeight}; margin-left: ${props => props.theme.switchLabelMargin}px; `; export default class Checkbox extends Component { static propTypes = { id: PropTypes.string.isRequired, label: PropTypes.node, value: PropTypes.oneOf([true, false, 'indeterminate']), checked: PropTypes.bool, disabled: PropTypes.bool, error: PropTypes.string, switch: PropTypes.bool, activeColor: PropTypes.string, secondary: PropTypes.bool, onBlur: PropTypes.func, onChange: PropTypes.func, onFocus: PropTypes.func }; static defaultProps = { disabled: false, checked: false, onBlur: noop, onChange: noop, onFocus: noop, label: '' }; state = { focused: false }; handleFocus = args => { this.setState({focused: true}); this.props.onFocus(args); }; handleBlur = args => { this.setState({focused: false}); this.props.onBlur(args); }; render() { const inputProps = { ...pick(this.props, ['checked', 'disabled', 'id', 'onChange', 'value']), type: 'checkbox', onFocus: this.handleFocus, onBlur: this.handleBlur }; const labelProps = { ...pick(this.props, ['checked', 'disabled', 'secondary']), htmlFor: this.props.id }; const LabelElement = this.props.type === 'checkbox' ? StyledCheckboxInput : StyledSwitchInput; return ( <StyledCheckbox className="kg-checkbox"> <HiddenInput {...inputProps} /> <LabelElement className="kg-checkbox__label" {...labelProps}> {this.props.label} </LabelElement> </StyledCheckbox> ); } }