2017-07-26 15:50:49 +03:00
|
|
|
import React from 'react';
|
2017-06-16 17:12:28 +03:00
|
|
|
import BaseInput, { Stylable } from './base/input';
|
2017-10-09 21:01:34 +03:00
|
|
|
import { Subscriber } from 'joy-react-broadcast';
|
2017-06-16 17:12:28 +03:00
|
|
|
import PropTypes from 'prop-types';
|
|
|
|
import styled from 'styled-components';
|
|
|
|
import unitcalc from 'unitcalc';
|
2017-10-09 21:01:34 +03:00
|
|
|
|
|
|
|
import Baseline from '../baseline';
|
2017-06-16 17:12:28 +03:00
|
|
|
import { PlusIcon, MinusIcon } from '../icons';
|
2017-10-09 21:01:34 +03:00
|
|
|
import IconButton from '../icon-button';
|
2017-06-16 17:12:28 +03:00
|
|
|
|
|
|
|
const StyledContainer = styled.div`
|
2017-09-27 17:44:57 +03:00
|
|
|
/* trick prettier */
|
2017-06-16 17:12:28 +03:00
|
|
|
margin-bottom: ${unitcalc(4)};
|
|
|
|
`;
|
|
|
|
|
2017-06-19 15:10:57 +03:00
|
|
|
const StyledNumberInput = styled(BaseInput(Stylable('input')))`
|
2017-06-16 17:12:28 +03:00
|
|
|
width: ${unitcalc(20)};
|
2017-07-17 14:41:26 +03:00
|
|
|
margin: 0 ${unitcalc(2)} 0 0;
|
2017-06-16 17:12:28 +03:00
|
|
|
vertical-align: middle;
|
|
|
|
`;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @example ./usage-number-input.md
|
|
|
|
*/
|
2017-06-19 15:10:57 +03:00
|
|
|
const NumberInput = BaseInput(props => {
|
|
|
|
const render = value => {
|
|
|
|
const handleMinusClick = evt => {
|
|
|
|
evt.preventDefault();
|
|
|
|
const nextValue = value.input.value - 1;
|
|
|
|
value.input.onChange(nextValue);
|
|
|
|
};
|
|
|
|
|
|
|
|
const handlePlusClick = evt => {
|
|
|
|
evt.preventDefault();
|
|
|
|
const nextValue = value.input.value + 1;
|
|
|
|
value.input.onChange(nextValue);
|
|
|
|
};
|
|
|
|
|
|
|
|
return (
|
|
|
|
<StyledContainer>
|
2017-07-26 15:50:49 +03:00
|
|
|
<StyledNumberInput {...props} marginRight={2} />
|
2017-06-19 15:10:57 +03:00
|
|
|
<IconButton onClick={handleMinusClick}>
|
|
|
|
<MinusIcon verticalAlign="middle" />
|
|
|
|
</IconButton>
|
2017-07-17 14:41:26 +03:00
|
|
|
<IconButton onClick={handlePlusClick} marginLeft={1}>
|
2017-06-19 15:10:57 +03:00
|
|
|
<PlusIcon verticalAlign="middle" />
|
|
|
|
</IconButton>
|
|
|
|
</StyledContainer>
|
|
|
|
);
|
|
|
|
};
|
2017-06-16 17:12:28 +03:00
|
|
|
|
2017-08-28 22:21:08 +03:00
|
|
|
return <Subscriber channel="input-group">{render}</Subscriber>;
|
2017-06-19 15:10:57 +03:00
|
|
|
});
|
2017-06-16 17:12:28 +03:00
|
|
|
|
|
|
|
NumberInput.propTypes = {
|
|
|
|
value: PropTypes.number,
|
|
|
|
minValue: PropTypes.number,
|
|
|
|
maxValue: PropTypes.number,
|
|
|
|
onChange: PropTypes.func
|
|
|
|
};
|
|
|
|
|
|
|
|
export default Baseline(NumberInput);
|
2017-06-19 15:10:57 +03:00
|
|
|
|
|
|
|
export const NumberInputNormalize = ({ minValue, maxValue }) => {
|
|
|
|
return value => {
|
|
|
|
if (value === '') {
|
|
|
|
return '';
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
!isNaN(value) &&
|
|
|
|
(isNaN(minValue) || value >= minValue) &&
|
|
|
|
(isNaN(maxValue) || value <= maxValue)
|
|
|
|
) {
|
|
|
|
return Number(value);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|