@etsoo/materialui 1.1.84 → 1.1.86
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/lib/IntInputField.d.ts +2 -2
- package/lib/IntInputField.js +28 -16
- package/package.json +1 -1
- package/src/IntInputField.tsx +34 -18
package/lib/IntInputField.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { InputFieldProps } from "./InputField";
|
|
|
3
3
|
/**
|
|
4
4
|
* Integer input field props
|
|
5
5
|
*/
|
|
6
|
-
export type IntInputFieldProps = Omit<InputFieldProps, "type" | "inputProps" | "value"> & {
|
|
6
|
+
export type IntInputFieldProps = Omit<InputFieldProps, "type" | "inputProps" | "value" | "defaultValue"> & {
|
|
7
7
|
/**
|
|
8
8
|
* Minimum value
|
|
9
9
|
*/
|
|
@@ -42,7 +42,7 @@ export type IntInputFieldProps = Omit<InputFieldProps, "type" | "inputProps" | "
|
|
|
42
42
|
* @param source Source value
|
|
43
43
|
* @param init Initial action
|
|
44
44
|
*/
|
|
45
|
-
onValueChange?: (value: number | undefined, source: unknown, init: boolean) => number |
|
|
45
|
+
onValueChange?: (value: number | undefined, source: unknown, init: boolean) => number | boolean | null | void;
|
|
46
46
|
};
|
|
47
47
|
/**
|
|
48
48
|
* Integer input field
|
package/lib/IntInputField.js
CHANGED
|
@@ -2,33 +2,34 @@ import { Box, IconButton, InputAdornment } from "@mui/material";
|
|
|
2
2
|
import AddIcon from "@mui/icons-material/Add";
|
|
3
3
|
import RemoveIcon from "@mui/icons-material/Remove";
|
|
4
4
|
import React from "react";
|
|
5
|
+
import { NumberUtils } from "@etsoo/shared";
|
|
5
6
|
import { InputField } from "./InputField";
|
|
6
7
|
/**
|
|
7
8
|
* Integer input field
|
|
8
9
|
*/
|
|
9
10
|
export const IntInputField = React.forwardRef((props, ref) => {
|
|
10
11
|
// Destruct
|
|
11
|
-
const { min = 0, step = 1, max = 9999999, inputStyle = { textAlign: "right" }, buttons, endSymbol, symbol, value,
|
|
12
|
+
const { min = 0, step = 1, max = 9999999, inputStyle = { textAlign: "right" }, buttons, endSymbol, symbol, value, changeDelay = 600, onChangeDelay, onChange, onValueChange, required, ...rest } = props;
|
|
12
13
|
// State
|
|
13
14
|
const [localValue, setLocalValue] = React.useState();
|
|
14
15
|
const setValue = (value, source, init = false) => {
|
|
15
16
|
if (onValueChange) {
|
|
16
17
|
const newValue = onValueChange(value, source, init);
|
|
17
|
-
|
|
18
|
+
if (newValue === false)
|
|
19
|
+
return;
|
|
20
|
+
if (newValue === null) {
|
|
21
|
+
setLocalValue(undefined);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (newValue === true || newValue === undefined)
|
|
25
|
+
setLocalValue(value);
|
|
26
|
+
else
|
|
27
|
+
setLocalValue(newValue);
|
|
18
28
|
}
|
|
19
29
|
};
|
|
20
30
|
React.useEffect(() => {
|
|
21
31
|
setValue(value, undefined, true);
|
|
22
32
|
}, [value]);
|
|
23
|
-
React.useEffect(() => {
|
|
24
|
-
if (defaultValue == null)
|
|
25
|
-
return;
|
|
26
|
-
const value = typeof defaultValue === "number"
|
|
27
|
-
? defaultValue
|
|
28
|
-
: parseFloat(`${defaultValue}`);
|
|
29
|
-
if (!isNaN(value))
|
|
30
|
-
setValue(value, defaultValue, true);
|
|
31
|
-
}, [defaultValue]);
|
|
32
33
|
// Layout
|
|
33
34
|
const layout = (React.createElement(InputField, { ref: ref, type: "number", value: localValue == null ? (required ? min : "") : localValue, inputProps: {
|
|
34
35
|
min,
|
|
@@ -49,7 +50,12 @@ export const IntInputField = React.forwardRef((props, ref) => {
|
|
|
49
50
|
WebkitAppearance: "none",
|
|
50
51
|
margin: 0
|
|
51
52
|
}
|
|
52
|
-
},
|
|
53
|
+
}, onChange: (event) => {
|
|
54
|
+
const source = event.target.value;
|
|
55
|
+
setLocalValue(source);
|
|
56
|
+
if (onChange)
|
|
57
|
+
onChange(event);
|
|
58
|
+
}, changeDelay: changeDelay, onChangeDelay: (event) => {
|
|
53
59
|
const source = event.target.value;
|
|
54
60
|
const value = parseFloat(source);
|
|
55
61
|
if (isNaN(value))
|
|
@@ -69,10 +75,13 @@ export const IntInputField = React.forwardRef((props, ref) => {
|
|
|
69
75
|
React.createElement(IconButton, { size: "small", onClick: () => {
|
|
70
76
|
if (localValue == null)
|
|
71
77
|
return;
|
|
72
|
-
|
|
78
|
+
const value = NumberUtils.parse(localValue);
|
|
79
|
+
if (isNaN(value))
|
|
80
|
+
return;
|
|
81
|
+
if (value <= min)
|
|
73
82
|
setValue(undefined, "SUB");
|
|
74
83
|
else
|
|
75
|
-
setValue(
|
|
84
|
+
setValue(value - step, "SUB");
|
|
76
85
|
} },
|
|
77
86
|
React.createElement(RemoveIcon, null)),
|
|
78
87
|
layout,
|
|
@@ -81,10 +90,13 @@ export const IntInputField = React.forwardRef((props, ref) => {
|
|
|
81
90
|
setValue(min, "ADD");
|
|
82
91
|
return;
|
|
83
92
|
}
|
|
84
|
-
|
|
93
|
+
const value = NumberUtils.parse(localValue);
|
|
94
|
+
if (isNaN(value))
|
|
95
|
+
return;
|
|
96
|
+
if (value >= max)
|
|
85
97
|
return;
|
|
86
98
|
else
|
|
87
|
-
setValue(
|
|
99
|
+
setValue(value + step, "ADD");
|
|
88
100
|
} },
|
|
89
101
|
React.createElement(AddIcon, { color: localValue == null ? undefined : "primary" }))));
|
|
90
102
|
else
|
package/package.json
CHANGED
package/src/IntInputField.tsx
CHANGED
|
@@ -2,6 +2,7 @@ import { Box, IconButton, InputAdornment } from "@mui/material";
|
|
|
2
2
|
import AddIcon from "@mui/icons-material/Add";
|
|
3
3
|
import RemoveIcon from "@mui/icons-material/Remove";
|
|
4
4
|
import React from "react";
|
|
5
|
+
import { NumberUtils } from "@etsoo/shared";
|
|
5
6
|
import { InputField, InputFieldProps } from "./InputField";
|
|
6
7
|
|
|
7
8
|
/**
|
|
@@ -9,7 +10,7 @@ import { InputField, InputFieldProps } from "./InputField";
|
|
|
9
10
|
*/
|
|
10
11
|
export type IntInputFieldProps = Omit<
|
|
11
12
|
InputFieldProps,
|
|
12
|
-
"type" | "inputProps" | "value"
|
|
13
|
+
"type" | "inputProps" | "value" | "defaultValue"
|
|
13
14
|
> & {
|
|
14
15
|
/**
|
|
15
16
|
* Minimum value
|
|
@@ -61,7 +62,7 @@ export type IntInputFieldProps = Omit<
|
|
|
61
62
|
value: number | undefined,
|
|
62
63
|
source: unknown,
|
|
63
64
|
init: boolean
|
|
64
|
-
) => number |
|
|
65
|
+
) => number | boolean | null | void;
|
|
65
66
|
};
|
|
66
67
|
|
|
67
68
|
/**
|
|
@@ -81,15 +82,16 @@ export const IntInputField = React.forwardRef<
|
|
|
81
82
|
endSymbol,
|
|
82
83
|
symbol,
|
|
83
84
|
value,
|
|
84
|
-
|
|
85
|
+
changeDelay = 600,
|
|
85
86
|
onChangeDelay,
|
|
87
|
+
onChange,
|
|
86
88
|
onValueChange,
|
|
87
89
|
required,
|
|
88
90
|
...rest
|
|
89
91
|
} = props;
|
|
90
92
|
|
|
91
93
|
// State
|
|
92
|
-
const [localValue, setLocalValue] = React.useState<number>();
|
|
94
|
+
const [localValue, setLocalValue] = React.useState<number | string>();
|
|
93
95
|
|
|
94
96
|
const setValue = (
|
|
95
97
|
value: number | undefined,
|
|
@@ -98,7 +100,15 @@ export const IntInputField = React.forwardRef<
|
|
|
98
100
|
) => {
|
|
99
101
|
if (onValueChange) {
|
|
100
102
|
const newValue = onValueChange(value, source, init);
|
|
101
|
-
|
|
103
|
+
if (newValue === false) return;
|
|
104
|
+
|
|
105
|
+
if (newValue === null) {
|
|
106
|
+
setLocalValue(undefined);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (newValue === true || newValue === undefined) setLocalValue(value);
|
|
111
|
+
else setLocalValue(newValue);
|
|
102
112
|
}
|
|
103
113
|
};
|
|
104
114
|
|
|
@@ -106,15 +116,6 @@ export const IntInputField = React.forwardRef<
|
|
|
106
116
|
setValue(value, undefined, true);
|
|
107
117
|
}, [value]);
|
|
108
118
|
|
|
109
|
-
React.useEffect(() => {
|
|
110
|
-
if (defaultValue == null) return;
|
|
111
|
-
const value =
|
|
112
|
-
typeof defaultValue === "number"
|
|
113
|
-
? defaultValue
|
|
114
|
-
: parseFloat(`${defaultValue}`);
|
|
115
|
-
if (!isNaN(value)) setValue(value, defaultValue, true);
|
|
116
|
-
}, [defaultValue]);
|
|
117
|
-
|
|
118
119
|
// Layout
|
|
119
120
|
const layout = (
|
|
120
121
|
<InputField
|
|
@@ -148,6 +149,13 @@ export const IntInputField = React.forwardRef<
|
|
|
148
149
|
margin: 0
|
|
149
150
|
}
|
|
150
151
|
}}
|
|
152
|
+
onChange={(event) => {
|
|
153
|
+
const source = event.target.value;
|
|
154
|
+
setLocalValue(source);
|
|
155
|
+
|
|
156
|
+
if (onChange) onChange(event);
|
|
157
|
+
}}
|
|
158
|
+
changeDelay={changeDelay}
|
|
151
159
|
onChangeDelay={(event) => {
|
|
152
160
|
const source = event.target.value;
|
|
153
161
|
const value = parseFloat(source);
|
|
@@ -170,8 +178,12 @@ export const IntInputField = React.forwardRef<
|
|
|
170
178
|
size="small"
|
|
171
179
|
onClick={() => {
|
|
172
180
|
if (localValue == null) return;
|
|
173
|
-
|
|
174
|
-
|
|
181
|
+
|
|
182
|
+
const value = NumberUtils.parse(localValue);
|
|
183
|
+
if (isNaN(value)) return;
|
|
184
|
+
|
|
185
|
+
if (value <= min) setValue(undefined, "SUB");
|
|
186
|
+
else setValue(value - step, "SUB");
|
|
175
187
|
}}
|
|
176
188
|
>
|
|
177
189
|
<RemoveIcon />
|
|
@@ -184,8 +196,12 @@ export const IntInputField = React.forwardRef<
|
|
|
184
196
|
setValue(min, "ADD");
|
|
185
197
|
return;
|
|
186
198
|
}
|
|
187
|
-
|
|
188
|
-
|
|
199
|
+
|
|
200
|
+
const value = NumberUtils.parse(localValue);
|
|
201
|
+
if (isNaN(value)) return;
|
|
202
|
+
|
|
203
|
+
if (value >= max) return;
|
|
204
|
+
else setValue(value + step, "ADD");
|
|
189
205
|
}}
|
|
190
206
|
>
|
|
191
207
|
<AddIcon color={localValue == null ? undefined : "primary"} />
|