Backpack nudger component.
npm install bpk-component-nudger --save-dev
import React, { Component } from 'react';
import BpkLabel from 'bpk-component-label';
import BpkNudger from 'bpk-component-nudger';
class App extends Component {
constructor() {
super();
this.state = {
value: 1,
};
}
handleChange = value => {
this.setState({ value });
};
render() {
return (
<div>
<BpkLabel htmlFor="my-nudger">Number of passengers</BpkLabel>
<BpkNudger
id="my-nudger"
min={1}
max={10}
value={this.state.value}
onChange={this.handleChange}
decreaseButtonLabel="Decrease"
increaseButtonLabel="Increase"
/>
</div>
);
}
}
import React, { Component } from 'react';
import BpkLabel from 'bpk-component-label';
import { BpkConfigurableNudger } from 'bpk-component-nudger';
const options = ['economy', 'premium', 'business', 'first'];
const compareValues = (value1, value2) => {
const [aIndex, bIndex] = [options.indexOf(value1), options.indexOf(value2)];
return aIndex - bIndex;
};
const incrementValue = currentValue => {
const [aIndex] = [options.indexOf(currentValue) + 1];
return options[aIndex];
};
const decrementValue = currentValue => {
const [aIndex] = [options.indexOf(currentValue) - 1];
return options[aIndex];
};
const formatValue = currentValue => currentValue.toString();
class App extends Component {
constructor() {
super();
this.state = {
value: 1,
};
}
handleChange = value => {
this.setState({ value });
};
render() {
return (
<div>
<BpkLabel htmlFor="nudger">Number of passengers</BpkLabel>
<BpkConfigurableNudger
id="nudger"
min="economy"
max="first"
value={this.state.value}
onChange={this.handleChange}
decreaseButtonLabel="Decrease"
increaseButtonLabel="Increase"
compareValues={compareValues}
incrementValue={incrementValue}
decrementValue={decrementValue}
formatValue={formatValue}
/>
</div>
);
}
}
Property | PropType | Required | Default Value |
---|---|---|---|
id | string | true | - |
decreaseButtonLabel | string | true | - |
increaseButtonLabel | string | true | - |
max | number | true | - |
min | number | true | - |
onChange | func | true | - |
value | number | true | - |
className | string | false | null |
buttonType | oneOf('secondary', 'secondaryOnDark') | false | secondary |
Property | PropType | Required | Default Value |
---|---|---|---|
id | string | true | - |
decreaseButtonLabel | string | true | - |
increaseButtonLabel | string | true | - |
max | number | true | - |
min | number | true | - |
onChange | func | true | - |
value | number | true | - |
compareValues | func | true | - |
incrementValue | func | true | - |
decrementValue | func | true | - |
formatValue | func | true | - |
className | string | false | null |
inputClassName | string | false | null |
buttonType | oneOf('secondary', 'secondaryOnDark') | false | secondary |
Given a
and b
:
- If
a
is less thanb
thencompareValues(a, b)
should return a value less than0
- If
a
andb
are equal thencompareValues(a, b)
should return exactly0
- If
a
is greater thanb
thencompareValues(a, b)
should return a value greater than0
We use this along with the min
and max
values to determine when we should disable the increment and decrement buttons. This is inspired by the compareFunction
in Array.prototype.sort
For integer numbers the following is a correct implementation const compareValues = (a: number, b: number): number => a - b;
Functions that handle the incrementing or decrementing of the current selected value.
A simple function that will allow you to set the format of the display value e.g. local dates or times.
Same as secondary button