/*
* Copyright © 2016-2018 European Support Limited
*
* 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 React from 'react';
import ReactDOM from 'react-dom';
import classNames from 'classnames';
import Checkbox from 'react-bootstrap/lib/Checkbox.js';
import Radio from 'sdc-ui/lib/react/Radio.js';
import FormGroup from 'react-bootstrap/lib/FormGroup.js';
import FormControl from 'react-bootstrap/lib/FormControl.js';
import Overlay from 'react-bootstrap/lib/Overlay.js';
import Tooltip from 'react-bootstrap/lib/Tooltip.js';
import Datepicker from 'nfvo-components/datepicker/Datepicker.jsx';
class Input extends React.Component {
state = {
value: this.props.value,
checked: this.props.checked,
selectedValues: []
};
render() {
/* eslint-disable no-unused-vars */
const {
label,
isReadOnlyMode,
value,
onBlur,
onKeyDown,
type,
disabled,
checked,
name
} = this.props;
const {
groupClassName,
isValid = true,
errorText,
isRequired,
overlayPos,
...inputProps
} = this.props;
const {
dateFormat,
startDate,
endDate,
selectsStart,
selectsEnd
} = this.props; // Date Props
/* eslint-enable no-unused-vars */
let wrapperClassName =
type !== 'radio'
? 'validation-input-wrapper'
: 'validation-radio-wrapper';
if (disabled) {
wrapperClassName += ' disabled';
}
return (
{label &&
(type !== 'checkbox' && type !== 'radio') && (
)}
{type === 'text' && (
this.onChange(e)}
disabled={isReadOnlyMode || Boolean(disabled)}
onBlur={onBlur}
onKeyDown={onKeyDown}
value={value || ''}
inputRef={input => (this.input = input)}
type={type}
data-test-id={this.props['data-test-id']}
/>
)}
{type === 'number' && (
this.onChange(e)}
disabled={isReadOnlyMode || Boolean(disabled)}
onBlur={onBlur}
onKeyDown={onKeyDown}
value={value !== undefined ? value : ''}
inputRef={input => (this.input = input)}
type={type}
data-test-id={this.props['data-test-id']}
/>
)}
{type === 'textarea' && (
this.onChange(e)}
inputRef={input => (this.input = input)}
data-test-id={this.props['data-test-id']}
/>
)}
{type === 'checkbox' && (
this.onChangeCheckBox(e)}
disabled={isReadOnlyMode || Boolean(disabled)}
checked={checked}
data-test-id={this.props['data-test-id']}>
{label}
)}
{type === 'radio' && (
this.onChangeRadio(isChecked)
}
inputRef={input => (this.input = input)}
label={label}
data-test-id={this.props['data-test-id']}
/>
)}
{type === 'select' && (
this.optionSelect(e)}
className="custom-select"
componentClass={type}
inputRef={input => (this.input = input)}
name={name}
{...inputProps}
data-test-id={this.props['data-test-id']}
/>
)}
{type === 'date' && (
(this.input = input)}
onChange={this.props.onChange}
disabled={isReadOnlyMode || Boolean(disabled)}
data-test-id={this.props['data-test-id']}
selectsStart={selectsStart}
selectsEnd={selectsEnd}
/>
)}
{this.renderErrorOverlay()}
);
}
getValue() {
return this.props.type !== 'select'
? this.state.value
: this.state.selectedValues;
}
getChecked() {
return this.state.checked;
}
optionSelect(e) {
let selectedValues = [];
if (e.target.value) {
selectedValues.push(e.target.value);
}
this.setState({
selectedValues
});
}
static getDerivedStateFromProps(props, state) {
if (state.value === props.value) {
return null;
} else {
return { value: props.value, ...state };
}
}
onChange(e) {
const { onChange, type } = this.props;
let value = e.target.value;
if (type === 'number') {
if (value === '') {
value = undefined;
} else {
value = Number(value);
}
}
onChange(value);
}
onChangeCheckBox(e) {
let { onChange } = this.props;
let checked = e.target.checked;
this.setState({
checked
});
onChange(checked);
}
onChangeRadio(isChecked) {
let { onChange } = this.props;
this.setState({
checked: isChecked
});
onChange(this.state.value);
}
focus() {
ReactDOM.findDOMNode(this.input).focus();
}
renderErrorOverlay() {
let position = 'right';
const { errorText = '', isValid = true, type, overlayPos } = this.props;
if (overlayPos) {
position = overlayPos;
} else if (
type === 'text' ||
type === 'email' ||
type === 'number' ||
type === 'radio' ||
type === 'password' ||
type === 'date'
) {
position = 'bottom';
}
return (
{
let target = ReactDOM.findDOMNode(this.input);
return target.offsetParent ? target : undefined;
}}
container={this}>
{errorText}
);
}
}
export default Input;