@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.
@@ -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 | undefined;
45
+ onValueChange?: (value: number | undefined, source: unknown, init: boolean) => number | boolean | null | void;
46
46
  };
47
47
  /**
48
48
  * Integer input field
@@ -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, defaultValue, onChangeDelay, onValueChange, required, ...rest } = props;
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
- setLocalValue(newValue);
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
- }, onChangeDelay: (event) => {
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
- if (localValue <= min)
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(localValue - step, "SUB");
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
- if (localValue >= max)
93
+ const value = NumberUtils.parse(localValue);
94
+ if (isNaN(value))
95
+ return;
96
+ if (value >= max)
85
97
  return;
86
98
  else
87
- setValue(localValue + step, "ADD");
99
+ setValue(value + step, "ADD");
88
100
  } },
89
101
  React.createElement(AddIcon, { color: localValue == null ? undefined : "primary" }))));
90
102
  else
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@etsoo/materialui",
3
- "version": "1.1.84",
3
+ "version": "1.1.86",
4
4
  "description": "TypeScript Material-UI Implementation",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -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 | undefined;
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
- defaultValue,
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
- setLocalValue(newValue);
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
- if (localValue <= min) setValue(undefined, "SUB");
174
- else setValue(localValue - step, "SUB");
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
- if (localValue >= max) return;
188
- else setValue(localValue + step, "ADD");
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"} />