@snack-uikit/fields 0.18.2-preview-734de100.0 → 0.18.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 +9 -0
- package/dist/components/FieldSlider/FieldSlider.js +18 -52
- package/dist/components/FieldSlider/helpers/getClosestMark.d.ts +2 -2
- package/dist/components/FieldSlider/helpers/getClosestMark.js +3 -3
- package/package.json +4 -4
- package/src/components/FieldSlider/FieldSlider.tsx +18 -63
- package/src/components/FieldSlider/helpers/getClosestMark.ts +3 -7
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,15 @@
|
|
|
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
|
+
## 0.18.2 (2024-04-22)
|
|
7
|
+
|
|
8
|
+
### Only dependencies have been changed
|
|
9
|
+
* [@snack-uikit/list@0.11.0](https://github.com/cloud-ru-tech/snack-uikit/blob/master/packages/list/CHANGELOG.md)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
6
15
|
## 0.18.1 (2024-04-18)
|
|
7
16
|
|
|
8
17
|
|
|
@@ -11,7 +11,7 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
11
11
|
};
|
|
12
12
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
13
13
|
import mergeRefs from 'merge-refs';
|
|
14
|
-
import { forwardRef, useEffect,
|
|
14
|
+
import { forwardRef, useEffect, useRef, useState } from 'react';
|
|
15
15
|
import { InputPrivate, SIZE } from '@snack-uikit/input-private';
|
|
16
16
|
import { Slider } from '@snack-uikit/slider';
|
|
17
17
|
import { extractSupportProps } from '@snack-uikit/utils';
|
|
@@ -32,7 +32,6 @@ const getDefaultValue = (range, min, max, value) => {
|
|
|
32
32
|
};
|
|
33
33
|
export const FieldSlider = forwardRef((_a, ref) => {
|
|
34
34
|
var { id, name, min, max, step, marks, showScaleBar = true, value: valueProp, range = false, disabled = false, readonly = false, onChange: onChangeProp, onFocus, onBlur, className, label, labelTooltip, labelTooltipPlacement, required, hint, showHintIcon, size = SIZE.S, postfixIcon, textInputFormatter } = _a, rest = __rest(_a, ["id", "name", "min", "max", "step", "marks", "showScaleBar", "value", "range", "disabled", "readonly", "onChange", "onFocus", "onBlur", "className", "label", "labelTooltip", "labelTooltipPlacement", "required", "hint", "showHintIcon", "size", "postfixIcon", "textInputFormatter"]);
|
|
35
|
-
const hasMarksEqualToValues = useMemo(() => Object.entries(marks).every(([key, value]) => key === value), [marks]);
|
|
36
35
|
const [value = getDefaultValue(range, min, max, valueProp), onChange] = useValueControl({
|
|
37
36
|
value: valueProp,
|
|
38
37
|
defaultValue: getDefaultValue(range, min, max, valueProp),
|
|
@@ -41,79 +40,46 @@ export const FieldSlider = forwardRef((_a, ref) => {
|
|
|
41
40
|
const [textFieldInputValue, setTextFieldInputValue] = useState(getTextFieldValue(value, textInputFormatter));
|
|
42
41
|
const localRef = useRef(null);
|
|
43
42
|
const onTextFieldChange = (textFieldValue) => {
|
|
44
|
-
const numValue =
|
|
45
|
-
if (
|
|
43
|
+
const numValue = Number(textFieldValue);
|
|
44
|
+
if (Number.isNaN(numValue)) {
|
|
46
45
|
return;
|
|
47
46
|
}
|
|
48
47
|
setTextFieldInputValue(textFieldValue);
|
|
49
48
|
};
|
|
50
|
-
const
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
onChange(Number(key));
|
|
54
|
-
};
|
|
55
|
-
const allowedValues = Object.entries(marks).map(([key, value]) => ({ key, value: parseInt(String(value)) }));
|
|
56
|
-
const suitableEntry = allowedValues.find(entry => entry.value === textFieldNumValue);
|
|
57
|
-
if (suitableEntry) {
|
|
58
|
-
handleChange(suitableEntry.key);
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
const actualMin = parseInt(String(marks[min]));
|
|
62
|
-
const actualMax = parseInt(String(marks[max]));
|
|
63
|
-
if (textFieldNumValue < actualMin) {
|
|
64
|
-
handleChange(min);
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
if (textFieldNumValue > actualMax) {
|
|
68
|
-
handleChange(max);
|
|
49
|
+
const handleTextValueChange = () => {
|
|
50
|
+
const textFieldNumValue = Number(textFieldInputValue);
|
|
51
|
+
if (Number.isNaN(textFieldNumValue)) {
|
|
69
52
|
return;
|
|
70
53
|
}
|
|
71
|
-
const { mark } = getClosestMark(textFieldNumValue, allowedValues, mark => mark.value);
|
|
72
|
-
handleChange(mark.key);
|
|
73
|
-
};
|
|
74
|
-
const handleEqualMarksSliderChange = (textFieldNumValue) => {
|
|
75
|
-
const handleChange = (value) => {
|
|
76
|
-
setTextFieldInputValue(String(value));
|
|
77
|
-
onChange(value);
|
|
78
|
-
};
|
|
79
54
|
if (textFieldNumValue < min) {
|
|
80
|
-
|
|
55
|
+
setTextFieldInputValue(String(min));
|
|
56
|
+
onChange(min);
|
|
81
57
|
return;
|
|
82
58
|
}
|
|
83
59
|
if (textFieldNumValue > max) {
|
|
84
|
-
|
|
60
|
+
setTextFieldInputValue(String(max));
|
|
61
|
+
onChange(max);
|
|
85
62
|
return;
|
|
86
63
|
}
|
|
87
64
|
if (step === null) {
|
|
88
65
|
const allowedValues = Object.keys(marks).map(Number);
|
|
89
66
|
if (allowedValues.includes(textFieldNumValue)) {
|
|
90
|
-
|
|
91
|
-
handleChange(textFieldNumValue);
|
|
67
|
+
onChange(textFieldNumValue);
|
|
92
68
|
return;
|
|
93
69
|
}
|
|
94
|
-
const { mark } = getClosestMark(textFieldNumValue, allowedValues
|
|
95
|
-
|
|
70
|
+
const { mark } = getClosestMark(textFieldNumValue, allowedValues);
|
|
71
|
+
setTextFieldInputValue(String(mark));
|
|
72
|
+
onChange(mark);
|
|
96
73
|
return;
|
|
97
74
|
}
|
|
98
75
|
const allowedValues = generateAllowedValues(min, max, step);
|
|
99
76
|
if (allowedValues.includes(textFieldNumValue)) {
|
|
100
|
-
|
|
77
|
+
onChange(textFieldNumValue);
|
|
101
78
|
return;
|
|
102
79
|
}
|
|
103
|
-
const { mark } = getClosestMark(textFieldNumValue, allowedValues
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
const handleTextValueChange = () => {
|
|
107
|
-
const textFieldNumValue = parseInt(textFieldInputValue);
|
|
108
|
-
if (Number.isNaN(textFieldNumValue)) {
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
if (hasMarksEqualToValues) {
|
|
112
|
-
handleEqualMarksSliderChange(textFieldNumValue);
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
handleNonEqualMarksSliderChange(textFieldNumValue);
|
|
116
|
-
}
|
|
80
|
+
const { mark } = getClosestMark(textFieldNumValue, allowedValues);
|
|
81
|
+
setTextFieldInputValue(String(mark));
|
|
82
|
+
onChange(mark);
|
|
117
83
|
};
|
|
118
84
|
const onTextFieldBlur = (e) => {
|
|
119
85
|
onBlur === null || onBlur === void 0 ? void 0 : onBlur(e);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const getDiff = (value, mark) => Math.abs(mark - value);
|
|
2
|
-
export const getClosestMark = (value, marks
|
|
3
|
-
const diff = getDiff(value,
|
|
2
|
+
export const getClosestMark = (value, marks) => marks.reduce((accResult, mark) => {
|
|
3
|
+
const diff = getDiff(value, mark);
|
|
4
4
|
if (diff < accResult.lowestDiff) {
|
|
5
5
|
return {
|
|
6
6
|
lowestDiff: diff,
|
|
@@ -9,6 +9,6 @@ export const getClosestMark = (value, marks, getMarkValue) => marks.reduce((accR
|
|
|
9
9
|
}
|
|
10
10
|
return accResult;
|
|
11
11
|
}, {
|
|
12
|
-
lowestDiff: getDiff(value,
|
|
12
|
+
lowestDiff: getDiff(value, marks[0]),
|
|
13
13
|
mark: marks[0],
|
|
14
14
|
});
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
6
|
"title": "Fields",
|
|
7
|
-
"version": "0.18.2
|
|
7
|
+
"version": "0.18.2",
|
|
8
8
|
"sideEffects": [
|
|
9
9
|
"*.css",
|
|
10
10
|
"*.woff",
|
|
@@ -37,9 +37,9 @@
|
|
|
37
37
|
"@snack-uikit/droplist": "0.13.14",
|
|
38
38
|
"@snack-uikit/icons": "0.20.1",
|
|
39
39
|
"@snack-uikit/input-private": "3.1.1",
|
|
40
|
-
"@snack-uikit/list": "0.
|
|
40
|
+
"@snack-uikit/list": "0.11.0",
|
|
41
41
|
"@snack-uikit/scroll": "0.5.2",
|
|
42
|
-
"@snack-uikit/slider": "0.1.
|
|
42
|
+
"@snack-uikit/slider": "0.1.7",
|
|
43
43
|
"@snack-uikit/tag": "0.8.2",
|
|
44
44
|
"@snack-uikit/tooltip": "0.13.1",
|
|
45
45
|
"@snack-uikit/truncate-string": "0.4.12",
|
|
@@ -56,5 +56,5 @@
|
|
|
56
56
|
"peerDependencies": {
|
|
57
57
|
"@snack-uikit/locale": "*"
|
|
58
58
|
},
|
|
59
|
-
"gitHead": "
|
|
59
|
+
"gitHead": "082743508cd64cdc90ed11d2ea51280b5cab19de"
|
|
60
60
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import mergeRefs from 'merge-refs';
|
|
2
|
-
import { FocusEvent, forwardRef, KeyboardEvent, ReactElement, useEffect,
|
|
2
|
+
import { FocusEvent, forwardRef, KeyboardEvent, ReactElement, useEffect, useRef, useState } from 'react';
|
|
3
3
|
|
|
4
4
|
import { InputPrivate, InputPrivateProps, SIZE } from '@snack-uikit/input-private';
|
|
5
5
|
import { Slider, SliderProps as SliderComponentProps } from '@snack-uikit/slider';
|
|
@@ -81,8 +81,6 @@ export const FieldSlider = forwardRef<HTMLInputElement, FieldSliderProps>(
|
|
|
81
81
|
},
|
|
82
82
|
ref,
|
|
83
83
|
) => {
|
|
84
|
-
const hasMarksEqualToValues = useMemo(() => Object.entries(marks).every(([key, value]) => key === value), [marks]);
|
|
85
|
-
|
|
86
84
|
const [value = getDefaultValue(range, min, max, valueProp), onChange] = useValueControl<number | number[]>({
|
|
87
85
|
value: valueProp,
|
|
88
86
|
defaultValue: getDefaultValue(range, min, max, valueProp),
|
|
@@ -95,97 +93,54 @@ export const FieldSlider = forwardRef<HTMLInputElement, FieldSliderProps>(
|
|
|
95
93
|
const localRef = useRef<HTMLInputElement>(null);
|
|
96
94
|
|
|
97
95
|
const onTextFieldChange = (textFieldValue: string) => {
|
|
98
|
-
const numValue =
|
|
99
|
-
|
|
100
|
-
if (textFieldValue && Number.isNaN(numValue)) {
|
|
96
|
+
const numValue = Number(textFieldValue);
|
|
97
|
+
if (Number.isNaN(numValue)) {
|
|
101
98
|
return;
|
|
102
99
|
}
|
|
103
100
|
|
|
104
101
|
setTextFieldInputValue(textFieldValue);
|
|
105
102
|
};
|
|
106
103
|
|
|
107
|
-
const
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
onChange(Number(key));
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
const allowedValues = Object.entries(marks).map(([key, value]) => ({ key, value: parseInt(String(value)) }));
|
|
114
|
-
const suitableEntry = allowedValues.find(entry => entry.value === textFieldNumValue);
|
|
115
|
-
|
|
116
|
-
if (suitableEntry) {
|
|
117
|
-
handleChange(suitableEntry.key);
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
const actualMin = parseInt(String(marks[min]));
|
|
122
|
-
const actualMax = parseInt(String(marks[max]));
|
|
123
|
-
|
|
124
|
-
if (textFieldNumValue < actualMin) {
|
|
125
|
-
handleChange(min);
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
if (textFieldNumValue > actualMax) {
|
|
130
|
-
handleChange(max);
|
|
104
|
+
const handleTextValueChange = () => {
|
|
105
|
+
const textFieldNumValue = Number(textFieldInputValue);
|
|
106
|
+
if (Number.isNaN(textFieldNumValue)) {
|
|
131
107
|
return;
|
|
132
108
|
}
|
|
133
109
|
|
|
134
|
-
const { mark } = getClosestMark(textFieldNumValue, allowedValues, mark => mark.value);
|
|
135
|
-
handleChange(mark.key);
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
const handleEqualMarksSliderChange = (textFieldNumValue: number) => {
|
|
139
|
-
const handleChange = (value: number) => {
|
|
140
|
-
setTextFieldInputValue(String(value));
|
|
141
|
-
onChange(value);
|
|
142
|
-
};
|
|
143
|
-
|
|
144
110
|
if (textFieldNumValue < min) {
|
|
145
|
-
|
|
111
|
+
setTextFieldInputValue(String(min));
|
|
112
|
+
onChange(min);
|
|
146
113
|
return;
|
|
147
114
|
}
|
|
148
115
|
|
|
149
116
|
if (textFieldNumValue > max) {
|
|
150
|
-
|
|
117
|
+
setTextFieldInputValue(String(max));
|
|
118
|
+
onChange(max);
|
|
151
119
|
return;
|
|
152
120
|
}
|
|
153
121
|
|
|
154
122
|
if (step === null) {
|
|
155
123
|
const allowedValues = Object.keys(marks).map(Number);
|
|
156
124
|
if (allowedValues.includes(textFieldNumValue)) {
|
|
157
|
-
|
|
158
|
-
handleChange(textFieldNumValue);
|
|
125
|
+
onChange(textFieldNumValue);
|
|
159
126
|
return;
|
|
160
127
|
}
|
|
161
128
|
|
|
162
|
-
const { mark } = getClosestMark(textFieldNumValue, allowedValues
|
|
163
|
-
|
|
129
|
+
const { mark } = getClosestMark(textFieldNumValue, allowedValues);
|
|
130
|
+
setTextFieldInputValue(String(mark));
|
|
131
|
+
onChange(mark);
|
|
164
132
|
return;
|
|
165
133
|
}
|
|
166
134
|
|
|
167
135
|
const allowedValues = generateAllowedValues(min, max, step);
|
|
168
136
|
if (allowedValues.includes(textFieldNumValue)) {
|
|
169
|
-
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
const { mark } = getClosestMark(textFieldNumValue, allowedValues, mark => mark);
|
|
174
|
-
handleChange(mark);
|
|
175
|
-
};
|
|
176
|
-
|
|
177
|
-
const handleTextValueChange = () => {
|
|
178
|
-
const textFieldNumValue = parseInt(textFieldInputValue);
|
|
179
|
-
|
|
180
|
-
if (Number.isNaN(textFieldNumValue)) {
|
|
137
|
+
onChange(textFieldNumValue);
|
|
181
138
|
return;
|
|
182
139
|
}
|
|
183
140
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
handleNonEqualMarksSliderChange(textFieldNumValue);
|
|
188
|
-
}
|
|
141
|
+
const { mark } = getClosestMark(textFieldNumValue, allowedValues);
|
|
142
|
+
setTextFieldInputValue(String(mark));
|
|
143
|
+
onChange(mark);
|
|
189
144
|
};
|
|
190
145
|
|
|
191
146
|
const onTextFieldBlur = (e: FocusEvent<HTMLInputElement, Element>) => {
|
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
const getDiff = (value: number, mark: number): number => Math.abs(mark - value);
|
|
2
2
|
|
|
3
|
-
export const getClosestMark =
|
|
4
|
-
value: number,
|
|
5
|
-
marks: T[],
|
|
6
|
-
getMarkValue: (value: T) => number,
|
|
7
|
-
): { lowestDiff: number; mark: T } =>
|
|
3
|
+
export const getClosestMark = (value: number, marks: number[]): { lowestDiff: number; mark: number } =>
|
|
8
4
|
marks.reduce(
|
|
9
5
|
(accResult, mark) => {
|
|
10
|
-
const diff = getDiff(value,
|
|
6
|
+
const diff = getDiff(value, mark);
|
|
11
7
|
if (diff < accResult.lowestDiff) {
|
|
12
8
|
return {
|
|
13
9
|
lowestDiff: diff,
|
|
@@ -18,7 +14,7 @@ export const getClosestMark = <T>(
|
|
|
18
14
|
return accResult;
|
|
19
15
|
},
|
|
20
16
|
{
|
|
21
|
-
lowestDiff: getDiff(value,
|
|
17
|
+
lowestDiff: getDiff(value, marks[0]),
|
|
22
18
|
mark: marks[0],
|
|
23
19
|
},
|
|
24
20
|
);
|