@pie-lib/config-ui 10.13.1 → 10.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,17 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [10.13.2](https://github.com/pie-framework/pie-lib/compare/@pie-lib/config-ui@10.13.1...@pie-lib/config-ui@10.13.2) (2022-05-30)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * unable to load items locally ([17ab686](https://github.com/pie-framework/pie-lib/commit/17ab6864557288aef6ec1d9a130cb508e2591562))
12
+
13
+
14
+
15
+
16
+
6
17
  ## [10.13.1](https://github.com/pie-framework/pie-lib/compare/@pie-lib/config-ui@10.13.0...@pie-lib/config-ui@10.13.1) (2022-05-24)
7
18
 
8
19
  **Note:** Version bump only for package @pie-lib/config-ui
@@ -98,16 +98,43 @@ var NumberTextFieldCustom = /*#__PURE__*/function (_React$Component) {
98
98
 
99
99
  _this = _super.call(this, props);
100
100
 
101
+ _defineProperty(_assertThisInitialized(_this), "getClosestValue", function (number) {
102
+ var customValues = _this.props.customValues;
103
+ return customValues.reduce(function (closest, value, index) {
104
+ return Math.abs(value - number) < Math.abs(closest.value - number) ? {
105
+ value: value,
106
+ index: index
107
+ } : closest;
108
+ }, {
109
+ value: customValues[0],
110
+ index: 0
111
+ });
112
+ });
113
+
101
114
  _defineProperty(_assertThisInitialized(_this), "onBlur", function (event) {
102
- var onlyIntegersAllowed = _this.props.onlyIntegersAllowed;
115
+ var _this$props = _this.props,
116
+ customValues = _this$props.customValues,
117
+ onlyIntegersAllowed = _this$props.onlyIntegersAllowed;
103
118
  var value = event.target.value;
104
119
  var rawNumber = onlyIntegersAllowed ? parseInt(value) : parseFloat(value);
105
120
 
106
121
  var number = _this.clamp(rawNumber);
107
122
 
123
+ var updatedIndex = (customValues || []).findIndex(function (val) {
124
+ return val === number;
125
+ });
126
+
127
+ if (customValues.length > 0 && updatedIndex === -1) {
128
+ var closestValue = _this.getClosestValue(number);
129
+
130
+ number = closestValue.value;
131
+ updatedIndex = closestValue.index;
132
+ }
133
+
108
134
  if (number !== _this.state.value) {
109
135
  _this.setState({
110
- value: number.toString()
136
+ value: number.toString(),
137
+ currentIndex: updatedIndex
111
138
  }, function () {
112
139
  return _this.props.onChange(event, number);
113
140
  });
@@ -116,8 +143,20 @@ var NumberTextFieldCustom = /*#__PURE__*/function (_React$Component) {
116
143
 
117
144
  var _value = _this.clamp(props.value);
118
145
 
146
+ var currentIndex = (props.customValues || []).findIndex(function (val) {
147
+ return val === _value;
148
+ });
149
+
150
+ if ((props.customValues || []).length > 0 && currentIndex === -1) {
151
+ var closestValue = _this.getClosestValue(_value);
152
+
153
+ _value = closestValue.value;
154
+ currentIndex = closestValue.index;
155
+ }
156
+
119
157
  _this.state = {
120
- value: _value
158
+ value: _value,
159
+ currentIndex: currentIndex
121
160
  };
122
161
 
123
162
  if (_value !== props.value) {
@@ -139,9 +178,14 @@ var NumberTextFieldCustom = /*#__PURE__*/function (_React$Component) {
139
178
  }, {
140
179
  key: "clamp",
141
180
  value: function clamp(value) {
142
- var _this$props = this.props,
143
- min = _this$props.min,
144
- max = _this$props.max;
181
+ var _this$props2 = this.props,
182
+ min = _this$props2.min,
183
+ max = _this$props2.max,
184
+ customValues = _this$props2.customValues;
185
+
186
+ if ((customValues || []).length > 0) {
187
+ return value;
188
+ }
145
189
 
146
190
  if (!(0, _isFinite["default"])(value)) {
147
191
  return fallbackNumber(min, max);
@@ -171,16 +215,32 @@ var NumberTextFieldCustom = /*#__PURE__*/function (_React$Component) {
171
215
  var sign = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
172
216
  var shouldUpdate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
173
217
  event.preventDefault();
174
- var _this$props2 = this.props,
175
- step = _this$props2.step,
176
- onlyIntegersAllowed = _this$props2.onlyIntegersAllowed,
177
- onChange = _this$props2.onChange;
178
- var value = this.state.value;
179
- var rawNumber = onlyIntegersAllowed ? parseInt(value) : parseFloat(value);
180
- var updatedValue = (rawNumber * 10000 + step * sign * 10000) / 10000;
181
- var number = this.clamp(updatedValue);
218
+ var _this$props3 = this.props,
219
+ customValues = _this$props3.customValues,
220
+ step = _this$props3.step,
221
+ onlyIntegersAllowed = _this$props3.onlyIntegersAllowed,
222
+ onChange = _this$props3.onChange;
223
+ var _this$state = this.state,
224
+ currentIndex = _this$state.currentIndex,
225
+ value = _this$state.value;
226
+ var updatedIndex = currentIndex + sign * 1;
227
+ var number;
228
+
229
+ if (customValues.length > 0) {
230
+ if (updatedIndex < 0 || updatedIndex >= customValues.length) {
231
+ return;
232
+ }
233
+
234
+ number = customValues[updatedIndex];
235
+ } else {
236
+ var rawNumber = onlyIntegersAllowed ? parseInt(value) : parseFloat(value);
237
+ var updatedValue = (rawNumber * 10000 + step * sign * 10000) / 10000;
238
+ number = this.clamp(updatedValue);
239
+ }
240
+
182
241
  this.setState({
183
- value: number.toString()
242
+ value: number.toString(),
243
+ currentIndex: updatedIndex
184
244
  }, function () {
185
245
  if (shouldUpdate) {
186
246
  onChange(event, number);
@@ -192,19 +252,19 @@ var NumberTextFieldCustom = /*#__PURE__*/function (_React$Component) {
192
252
  value: function render() {
193
253
  var _this2 = this;
194
254
 
195
- var _this$props3 = this.props,
196
- className = _this$props3.className,
197
- classes = _this$props3.classes,
198
- label = _this$props3.label,
199
- disabled = _this$props3.disabled,
200
- error = _this$props3.error,
201
- min = _this$props3.min,
202
- max = _this$props3.max,
203
- inputClassName = _this$props3.inputClassName,
204
- disableUnderline = _this$props3.disableUnderline,
205
- helperText = _this$props3.helperText,
206
- variant = _this$props3.variant,
207
- textAlign = _this$props3.textAlign;
255
+ var _this$props4 = this.props,
256
+ className = _this$props4.className,
257
+ classes = _this$props4.classes,
258
+ label = _this$props4.label,
259
+ disabled = _this$props4.disabled,
260
+ error = _this$props4.error,
261
+ min = _this$props4.min,
262
+ max = _this$props4.max,
263
+ inputClassName = _this$props4.inputClassName,
264
+ disableUnderline = _this$props4.disableUnderline,
265
+ helperText = _this$props4.helperText,
266
+ variant = _this$props4.variant,
267
+ textAlign = _this$props4.textAlign;
208
268
  var value = this.state.value;
209
269
  var names = (0, _classnames["default"])(className, classes.input);
210
270
  return /*#__PURE__*/_react["default"].createElement(_TextField["default"], {
@@ -281,6 +341,7 @@ exports.NumberTextFieldCustom = NumberTextFieldCustom;
281
341
  _defineProperty(NumberTextFieldCustom, "propTypes", {
282
342
  classes: _propTypes["default"].object.isRequired,
283
343
  className: _propTypes["default"].string,
344
+ customValues: _propTypes["default"].array,
284
345
  disabled: _propTypes["default"].bool,
285
346
  error: _propTypes["default"].bool,
286
347
  inputClassName: _propTypes["default"].string,
@@ -297,6 +358,7 @@ _defineProperty(NumberTextFieldCustom, "propTypes", {
297
358
 
298
359
  _defineProperty(NumberTextFieldCustom, "defaultProps", {
299
360
  step: 1,
361
+ customValues: [],
300
362
  textAlign: 'center',
301
363
  variant: 'standard',
302
364
  onlyIntegersAllowed: false
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/number-text-field-custom.jsx"],"names":["styles","theme","input","margin","iconButton","padding","fallbackNumber","min","max","NumberTextFieldCustom","props","event","onlyIntegersAllowed","value","target","rawNumber","parseInt","parseFloat","number","clamp","state","setState","toString","onChange","bind","Math","sign","shouldUpdate","preventDefault","step","updatedValue","className","classes","label","disabled","error","inputClassName","disableUnderline","helperText","variant","textAlign","names","ref","inputRef","onBlur","e","key","blur","changeValue","startAdornment","endAdornment","style","React","Component","PropTypes","object","isRequired","string","bool","func"],"mappings":"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","sourcesContent":["import PropTypes from 'prop-types';\nimport React from 'react';\nimport TextField from '@material-ui/core/TextField';\nimport classNames from 'classnames';\nimport { withStyles } from '@material-ui/core/styles';\nimport isFinite from 'lodash/isFinite';\nimport IconButton from '@material-ui/core/IconButton';\nimport InputAdornment from '@material-ui/core/InputAdornment';\nimport Remove from '@material-ui/icons/Remove';\nimport Add from '@material-ui/icons/Add';\n\nconst styles = theme => ({\n input: {\n '& input[type=number]': {\n '-moz-appearance': 'textfield'\n },\n '& input[type=number]::-webkit-outer-spin-button': {\n '-webkit-appearance': 'none',\n margin: 0\n },\n '& input[type=number]::-webkit-inner-spin-button': {\n '-webkit-appearance': 'none',\n margin: 0\n }\n },\n iconButton: {\n padding: '2px'\n }\n});\n\nconst fallbackNumber = (min, max) => {\n if (!isFinite(min) && !isFinite(max)) {\n return 0;\n }\n\n if (!isFinite(min) && isFinite(max)) {\n return max;\n }\n\n if (isFinite(min)) {\n return min;\n }\n};\n\nexport class NumberTextFieldCustom extends React.Component {\n static propTypes = {\n classes: PropTypes.object.isRequired,\n className: PropTypes.string,\n disabled: PropTypes.bool,\n error: PropTypes.bool,\n inputClassName: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n onlyIntegersAllowed: PropTypes.bool,\n value: PropTypes.number,\n min: PropTypes.number,\n max: PropTypes.number,\n step: PropTypes.number,\n label: PropTypes.string,\n disableUnderline: PropTypes.bool,\n variant: PropTypes.string\n };\n\n static defaultProps = {\n step: 1,\n textAlign: 'center',\n variant: 'standard',\n onlyIntegersAllowed: false\n };\n\n constructor(props) {\n super(props);\n\n const value = this.clamp(props.value);\n\n this.state = {\n value\n };\n\n if (value !== props.value) {\n this.props.onChange({}, value);\n }\n\n this.onChange = this.onChange.bind(this);\n }\n\n UNSAFE_componentWillReceiveProps(props) {\n const value = this.clamp(props.value);\n\n this.setState({ value });\n }\n\n clamp(value) {\n const { min, max } = this.props;\n\n if (!isFinite(value)) {\n return fallbackNumber(min, max);\n }\n\n if (isFinite(max)) {\n value = Math.min(value, max);\n }\n\n if (isFinite(min)) {\n value = Math.max(value, min);\n }\n\n return value;\n }\n\n onBlur = event => {\n const { onlyIntegersAllowed } = this.props;\n const { value } = event.target;\n const rawNumber = onlyIntegersAllowed ? parseInt(value) : parseFloat(value);\n const number = this.clamp(rawNumber);\n\n if (number !== this.state.value) {\n this.setState({ value: number.toString() }, () => this.props.onChange(event, number));\n }\n };\n\n onChange(event) {\n const { value } = event.target;\n\n this.setState({ value });\n }\n\n changeValue(event, sign = 1, shouldUpdate = false) {\n event.preventDefault();\n\n const { step, onlyIntegersAllowed, onChange } = this.props;\n const { value } = this.state;\n const rawNumber = onlyIntegersAllowed ? parseInt(value) : parseFloat(value);\n const updatedValue = (rawNumber * 10000 + step * sign * 10000) / 10000;\n const number = this.clamp(updatedValue);\n\n this.setState({ value: number.toString() }, () => {\n if (shouldUpdate) {\n onChange(event, number);\n }\n });\n }\n\n render() {\n const {\n className,\n classes,\n label,\n disabled,\n error,\n min,\n max,\n inputClassName,\n disableUnderline,\n helperText,\n variant,\n textAlign\n } = this.props;\n const { value } = this.state;\n const names = classNames(className, classes.input);\n\n return (\n <TextField\n variant={variant}\n inputRef={ref => (this.inputRef = ref)}\n disabled={disabled}\n label={label}\n value={value}\n error={error}\n helperText={helperText}\n onChange={this.onChange}\n onBlur={this.onBlur}\n onKeyPress={e => {\n // once the Enter key is pressed, we force input blur\n if (e.key === 'Enter' && this.inputRef) {\n this.inputRef.blur();\n }\n }}\n onKeyDown={e => {\n if (e.key === 'ArrowUp') {\n this.changeValue(e);\n }\n\n if (e.key === 'ArrowDown') {\n this.changeValue(e, -1);\n }\n }}\n type=\"number\"\n className={names}\n InputProps={{\n className: inputClassName,\n disableUnderline: disableUnderline,\n startAdornment: (\n <InputAdornment position=\"start\">\n <IconButton\n className={classes.iconButton}\n disabled={disabled}\n onClick={e => this.changeValue(e, -1, true)}\n >\n <Remove fontSize=\"small\" />\n </IconButton>\n </InputAdornment>\n ),\n endAdornment: (\n <InputAdornment position=\"end\">\n <IconButton\n className={classes.iconButton}\n disabled={disabled}\n onClick={e => this.changeValue(e, 1, true)}\n >\n <Add fontSize=\"small\" />\n </IconButton>\n </InputAdornment>\n )\n }}\n inputProps={{\n style: { textAlign },\n min,\n max\n }}\n />\n );\n }\n}\n\nexport default withStyles(styles)(NumberTextFieldCustom);\n"],"file":"number-text-field-custom.js"}
1
+ {"version":3,"sources":["../src/number-text-field-custom.jsx"],"names":["styles","theme","input","margin","iconButton","padding","fallbackNumber","min","max","NumberTextFieldCustom","props","number","customValues","reduce","closest","value","index","Math","abs","event","onlyIntegersAllowed","target","rawNumber","parseInt","parseFloat","clamp","updatedIndex","findIndex","val","length","closestValue","getClosestValue","state","setState","toString","currentIndex","onChange","bind","sign","shouldUpdate","preventDefault","step","updatedValue","className","classes","label","disabled","error","inputClassName","disableUnderline","helperText","variant","textAlign","names","ref","inputRef","onBlur","e","key","blur","changeValue","startAdornment","endAdornment","style","React","Component","PropTypes","object","isRequired","string","array","bool","func"],"mappings":"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","sourcesContent":["import PropTypes from 'prop-types';\nimport React from 'react';\nimport TextField from '@material-ui/core/TextField';\nimport classNames from 'classnames';\nimport { withStyles } from '@material-ui/core/styles';\nimport isFinite from 'lodash/isFinite';\nimport IconButton from '@material-ui/core/IconButton';\nimport InputAdornment from '@material-ui/core/InputAdornment';\nimport Remove from '@material-ui/icons/Remove';\nimport Add from '@material-ui/icons/Add';\n\nconst styles = theme => ({\n input: {\n '& input[type=number]': {\n '-moz-appearance': 'textfield'\n },\n '& input[type=number]::-webkit-outer-spin-button': {\n '-webkit-appearance': 'none',\n margin: 0\n },\n '& input[type=number]::-webkit-inner-spin-button': {\n '-webkit-appearance': 'none',\n margin: 0\n }\n },\n iconButton: {\n padding: '2px'\n }\n});\n\nconst fallbackNumber = (min, max) => {\n if (!isFinite(min) && !isFinite(max)) {\n return 0;\n }\n\n if (!isFinite(min) && isFinite(max)) {\n return max;\n }\n\n if (isFinite(min)) {\n return min;\n }\n};\n\nexport class NumberTextFieldCustom extends React.Component {\n static propTypes = {\n classes: PropTypes.object.isRequired,\n className: PropTypes.string,\n customValues: PropTypes.array,\n disabled: PropTypes.bool,\n error: PropTypes.bool,\n inputClassName: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n onlyIntegersAllowed: PropTypes.bool,\n value: PropTypes.number,\n min: PropTypes.number,\n max: PropTypes.number,\n step: PropTypes.number,\n label: PropTypes.string,\n disableUnderline: PropTypes.bool,\n variant: PropTypes.string\n };\n\n static defaultProps = {\n step: 1,\n customValues: [],\n textAlign: 'center',\n variant: 'standard',\n onlyIntegersAllowed: false\n };\n\n constructor(props) {\n super(props);\n\n let value = this.clamp(props.value);\n let currentIndex = (props.customValues || []).findIndex(val => val === value);\n\n if ((props.customValues || []).length > 0 && currentIndex === -1) {\n const closestValue = this.getClosestValue(value);\n value = closestValue.value;\n currentIndex = closestValue.index;\n }\n\n this.state = {\n value,\n currentIndex\n };\n\n if (value !== props.value) {\n this.props.onChange({}, value);\n }\n\n this.onChange = this.onChange.bind(this);\n }\n\n UNSAFE_componentWillReceiveProps(props) {\n const value = this.clamp(props.value);\n\n this.setState({ value });\n }\n\n clamp(value) {\n const { min, max, customValues } = this.props;\n\n if ((customValues || []).length > 0) {\n return value;\n }\n\n if (!isFinite(value)) {\n return fallbackNumber(min, max);\n }\n\n if (isFinite(max)) {\n value = Math.min(value, max);\n }\n\n if (isFinite(min)) {\n value = Math.max(value, min);\n }\n\n return value;\n }\n\n getClosestValue = number => {\n const { customValues } = this.props;\n\n return customValues.reduce(\n (closest, value, index) =>\n Math.abs(value - number) < Math.abs(closest.value - number) ? { value, index } : closest,\n { value: customValues[0], index: 0 }\n );\n };\n\n onBlur = event => {\n const { customValues, onlyIntegersAllowed } = this.props;\n const { value } = event.target;\n const rawNumber = onlyIntegersAllowed ? parseInt(value) : parseFloat(value);\n let number = this.clamp(rawNumber);\n let updatedIndex = (customValues || []).findIndex(val => val === number);\n\n if (customValues.length > 0 && updatedIndex === -1) {\n const closestValue = this.getClosestValue(number);\n number = closestValue.value;\n updatedIndex = closestValue.index;\n }\n\n if (number !== this.state.value) {\n this.setState(\n {\n value: number.toString(),\n currentIndex: updatedIndex\n },\n () => this.props.onChange(event, number)\n );\n }\n };\n\n onChange(event) {\n const { value } = event.target;\n\n this.setState({ value });\n }\n\n changeValue(event, sign = 1, shouldUpdate = false) {\n event.preventDefault();\n\n const { customValues, step, onlyIntegersAllowed, onChange } = this.props;\n const { currentIndex, value } = this.state;\n const updatedIndex = currentIndex + sign * 1;\n let number;\n\n if (customValues.length > 0) {\n if (updatedIndex < 0 || updatedIndex >= customValues.length) {\n return;\n }\n\n number = customValues[updatedIndex];\n } else {\n const rawNumber = onlyIntegersAllowed ? parseInt(value) : parseFloat(value);\n const updatedValue = (rawNumber * 10000 + step * sign * 10000) / 10000;\n number = this.clamp(updatedValue);\n }\n\n this.setState(\n {\n value: number.toString(),\n currentIndex: updatedIndex\n },\n () => {\n if (shouldUpdate) {\n onChange(event, number);\n }\n }\n );\n }\n\n render() {\n const {\n className,\n classes,\n label,\n disabled,\n error,\n min,\n max,\n inputClassName,\n disableUnderline,\n helperText,\n variant,\n textAlign\n } = this.props;\n const { value } = this.state;\n const names = classNames(className, classes.input);\n\n return (\n <TextField\n variant={variant}\n inputRef={ref => (this.inputRef = ref)}\n disabled={disabled}\n label={label}\n value={value}\n error={error}\n helperText={helperText}\n onChange={this.onChange}\n onBlur={this.onBlur}\n onKeyPress={e => {\n // once the Enter key is pressed, we force input blur\n if (e.key === 'Enter' && this.inputRef) {\n this.inputRef.blur();\n }\n }}\n onKeyDown={e => {\n if (e.key === 'ArrowUp') {\n this.changeValue(e);\n }\n\n if (e.key === 'ArrowDown') {\n this.changeValue(e, -1);\n }\n }}\n type=\"number\"\n className={names}\n InputProps={{\n className: inputClassName,\n disableUnderline: disableUnderline,\n startAdornment: (\n <InputAdornment position=\"start\">\n <IconButton\n className={classes.iconButton}\n disabled={disabled}\n onClick={e => this.changeValue(e, -1, true)}\n >\n <Remove fontSize=\"small\" />\n </IconButton>\n </InputAdornment>\n ),\n endAdornment: (\n <InputAdornment position=\"end\">\n <IconButton\n className={classes.iconButton}\n disabled={disabled}\n onClick={e => this.changeValue(e, 1, true)}\n >\n <Add fontSize=\"small\" />\n </IconButton>\n </InputAdornment>\n )\n }}\n inputProps={{\n style: { textAlign },\n min,\n max\n }}\n />\n );\n }\n}\n\nexport default withStyles(styles)(NumberTextFieldCustom);\n"],"file":"number-text-field-custom.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pie-lib/config-ui",
3
- "version": "10.13.1",
3
+ "version": "10.13.2",
4
4
  "main": "lib/index.js",
5
5
  "module": "src/index.js",
6
6
  "publishConfig": {
@@ -10,9 +10,9 @@
10
10
  "dependencies": {
11
11
  "@material-ui/core": "^3.8.3",
12
12
  "@material-ui/icons": "^3.0.2",
13
- "@pie-lib/editable-html": "^7.22.4",
13
+ "@pie-lib/editable-html": "^7.22.5",
14
14
  "@pie-lib/icons": "^2.4.25",
15
- "@pie-lib/render-ui": "^4.12.7",
15
+ "@pie-lib/render-ui": "^4.12.8",
16
16
  "classnames": "^2.2.6",
17
17
  "debug": "^4.1.1",
18
18
  "lodash": "^4.17.11",
@@ -26,5 +26,5 @@
26
26
  "peerDependencies": {
27
27
  "react": "^16.8.1"
28
28
  },
29
- "gitHead": "611d47d0ed9fb2591be8f26cc78a40049e5e70a5"
29
+ "gitHead": "debcaf764c62d97a1401f2898b062183847ce33b"
30
30
  }
@@ -46,6 +46,7 @@ export class NumberTextFieldCustom extends React.Component {
46
46
  static propTypes = {
47
47
  classes: PropTypes.object.isRequired,
48
48
  className: PropTypes.string,
49
+ customValues: PropTypes.array,
49
50
  disabled: PropTypes.bool,
50
51
  error: PropTypes.bool,
51
52
  inputClassName: PropTypes.string,
@@ -62,6 +63,7 @@ export class NumberTextFieldCustom extends React.Component {
62
63
 
63
64
  static defaultProps = {
64
65
  step: 1,
66
+ customValues: [],
65
67
  textAlign: 'center',
66
68
  variant: 'standard',
67
69
  onlyIntegersAllowed: false
@@ -70,10 +72,18 @@ export class NumberTextFieldCustom extends React.Component {
70
72
  constructor(props) {
71
73
  super(props);
72
74
 
73
- const value = this.clamp(props.value);
75
+ let value = this.clamp(props.value);
76
+ let currentIndex = (props.customValues || []).findIndex(val => val === value);
77
+
78
+ if ((props.customValues || []).length > 0 && currentIndex === -1) {
79
+ const closestValue = this.getClosestValue(value);
80
+ value = closestValue.value;
81
+ currentIndex = closestValue.index;
82
+ }
74
83
 
75
84
  this.state = {
76
- value
85
+ value,
86
+ currentIndex
77
87
  };
78
88
 
79
89
  if (value !== props.value) {
@@ -90,7 +100,11 @@ export class NumberTextFieldCustom extends React.Component {
90
100
  }
91
101
 
92
102
  clamp(value) {
93
- const { min, max } = this.props;
103
+ const { min, max, customValues } = this.props;
104
+
105
+ if ((customValues || []).length > 0) {
106
+ return value;
107
+ }
94
108
 
95
109
  if (!isFinite(value)) {
96
110
  return fallbackNumber(min, max);
@@ -107,14 +121,37 @@ export class NumberTextFieldCustom extends React.Component {
107
121
  return value;
108
122
  }
109
123
 
124
+ getClosestValue = number => {
125
+ const { customValues } = this.props;
126
+
127
+ return customValues.reduce(
128
+ (closest, value, index) =>
129
+ Math.abs(value - number) < Math.abs(closest.value - number) ? { value, index } : closest,
130
+ { value: customValues[0], index: 0 }
131
+ );
132
+ };
133
+
110
134
  onBlur = event => {
111
- const { onlyIntegersAllowed } = this.props;
135
+ const { customValues, onlyIntegersAllowed } = this.props;
112
136
  const { value } = event.target;
113
137
  const rawNumber = onlyIntegersAllowed ? parseInt(value) : parseFloat(value);
114
- const number = this.clamp(rawNumber);
138
+ let number = this.clamp(rawNumber);
139
+ let updatedIndex = (customValues || []).findIndex(val => val === number);
140
+
141
+ if (customValues.length > 0 && updatedIndex === -1) {
142
+ const closestValue = this.getClosestValue(number);
143
+ number = closestValue.value;
144
+ updatedIndex = closestValue.index;
145
+ }
115
146
 
116
147
  if (number !== this.state.value) {
117
- this.setState({ value: number.toString() }, () => this.props.onChange(event, number));
148
+ this.setState(
149
+ {
150
+ value: number.toString(),
151
+ currentIndex: updatedIndex
152
+ },
153
+ () => this.props.onChange(event, number)
154
+ );
118
155
  }
119
156
  };
120
157
 
@@ -127,17 +164,34 @@ export class NumberTextFieldCustom extends React.Component {
127
164
  changeValue(event, sign = 1, shouldUpdate = false) {
128
165
  event.preventDefault();
129
166
 
130
- const { step, onlyIntegersAllowed, onChange } = this.props;
131
- const { value } = this.state;
132
- const rawNumber = onlyIntegersAllowed ? parseInt(value) : parseFloat(value);
133
- const updatedValue = (rawNumber * 10000 + step * sign * 10000) / 10000;
134
- const number = this.clamp(updatedValue);
167
+ const { customValues, step, onlyIntegersAllowed, onChange } = this.props;
168
+ const { currentIndex, value } = this.state;
169
+ const updatedIndex = currentIndex + sign * 1;
170
+ let number;
135
171
 
136
- this.setState({ value: number.toString() }, () => {
137
- if (shouldUpdate) {
138
- onChange(event, number);
172
+ if (customValues.length > 0) {
173
+ if (updatedIndex < 0 || updatedIndex >= customValues.length) {
174
+ return;
139
175
  }
140
- });
176
+
177
+ number = customValues[updatedIndex];
178
+ } else {
179
+ const rawNumber = onlyIntegersAllowed ? parseInt(value) : parseFloat(value);
180
+ const updatedValue = (rawNumber * 10000 + step * sign * 10000) / 10000;
181
+ number = this.clamp(updatedValue);
182
+ }
183
+
184
+ this.setState(
185
+ {
186
+ value: number.toString(),
187
+ currentIndex: updatedIndex
188
+ },
189
+ () => {
190
+ if (shouldUpdate) {
191
+ onChange(event, number);
192
+ }
193
+ }
194
+ );
141
195
  }
142
196
 
143
197
  render() {