aio-range 1.0.1 → 2.0.1
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/index.css +23 -24
- package/index.d.ts +49 -8
- package/index.js +192 -190
- package/package.json +1 -1
package/index.css
CHANGED
|
@@ -4,42 +4,39 @@
|
|
|
4
4
|
user-select: none;
|
|
5
5
|
}
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
.aio-input-range-value {
|
|
9
|
-
width: 100%;
|
|
10
|
-
overflow: visible;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
.ai-range-horizontal {
|
|
7
|
+
.ai-slider-horizontal {
|
|
14
8
|
height: 48px;
|
|
15
9
|
align-items: center;
|
|
16
10
|
width: 100%;
|
|
17
11
|
}
|
|
18
12
|
|
|
19
|
-
.ai-
|
|
13
|
+
.ai-slider-horizontal .ai-slider-groove {
|
|
20
14
|
height: 1px;
|
|
21
15
|
width: 100%;
|
|
22
16
|
background: #ddd;
|
|
23
17
|
}
|
|
24
18
|
|
|
25
|
-
.ai-
|
|
19
|
+
.ai-slider-vertical {
|
|
26
20
|
width: 48px;
|
|
27
21
|
height: 240px;
|
|
28
22
|
justify-content: center;
|
|
29
23
|
margin: 12px 0;
|
|
30
24
|
}
|
|
31
25
|
|
|
32
|
-
.ai-
|
|
26
|
+
.ai-slider-vertical .ai-slider-groove {
|
|
33
27
|
width: 1px;
|
|
34
28
|
height: 100%;
|
|
35
29
|
background: #ddd;
|
|
36
30
|
}
|
|
37
31
|
|
|
38
|
-
.ai-
|
|
32
|
+
.ai-slider-reverse {
|
|
33
|
+
direction: rtl;
|
|
34
|
+
}
|
|
35
|
+
.ai-spinner-reverse {
|
|
39
36
|
direction: rtl;
|
|
40
37
|
}
|
|
41
38
|
|
|
42
|
-
.ai-
|
|
39
|
+
.ai-spinner {
|
|
43
40
|
border-radius: 100%;
|
|
44
41
|
justify-content: center;
|
|
45
42
|
align-items: center;
|
|
@@ -57,11 +54,11 @@
|
|
|
57
54
|
z-index: 10;
|
|
58
55
|
}
|
|
59
56
|
|
|
60
|
-
.ai-
|
|
57
|
+
.ai-spinner .ai-range-value-container {
|
|
61
58
|
justify-content: flex-end;
|
|
62
59
|
}
|
|
63
60
|
|
|
64
|
-
.
|
|
61
|
+
.ai-spinner-handle {
|
|
65
62
|
position: absolute;
|
|
66
63
|
width: 0;
|
|
67
64
|
height: 0;
|
|
@@ -76,7 +73,7 @@
|
|
|
76
73
|
height: 0;
|
|
77
74
|
}
|
|
78
75
|
|
|
79
|
-
.ai-
|
|
76
|
+
.ai-spinner .ai-range-label-container {
|
|
80
77
|
justify-content: flex-end;
|
|
81
78
|
}
|
|
82
79
|
|
|
@@ -84,12 +81,12 @@
|
|
|
84
81
|
position: absolute;
|
|
85
82
|
}
|
|
86
83
|
|
|
87
|
-
.ai-
|
|
84
|
+
.ai-slider-horizontal .ai-range-labels {
|
|
88
85
|
width: 100%;
|
|
89
86
|
height: 100%;
|
|
90
87
|
}
|
|
91
88
|
|
|
92
|
-
.ai-
|
|
89
|
+
.ai-slider-vertical .ai-range-labels {
|
|
93
90
|
width: 100%;
|
|
94
91
|
height: 100%;
|
|
95
92
|
}
|
|
@@ -100,6 +97,8 @@
|
|
|
100
97
|
align-items: center;
|
|
101
98
|
justify-content: center;
|
|
102
99
|
font-size: 12px;
|
|
100
|
+
width: 0;
|
|
101
|
+
height:0;
|
|
103
102
|
}
|
|
104
103
|
|
|
105
104
|
.ai-range-label>* {
|
|
@@ -135,7 +134,7 @@
|
|
|
135
134
|
justify-content: center;
|
|
136
135
|
}
|
|
137
136
|
|
|
138
|
-
.ai-
|
|
137
|
+
.ai-slider-range {
|
|
139
138
|
position: absolute;
|
|
140
139
|
}
|
|
141
140
|
|
|
@@ -148,7 +147,7 @@
|
|
|
148
147
|
height: 0;
|
|
149
148
|
}
|
|
150
149
|
|
|
151
|
-
.ai-
|
|
150
|
+
.ai-spinner .ai-range-scale-container {
|
|
152
151
|
justify-content: flex-end;
|
|
153
152
|
}
|
|
154
153
|
|
|
@@ -164,27 +163,27 @@
|
|
|
164
163
|
|
|
165
164
|
}
|
|
166
165
|
|
|
167
|
-
.ai-
|
|
166
|
+
.ai-spinner .ai-range-scale {
|
|
168
167
|
height: 2px;
|
|
169
168
|
width: 6px;
|
|
170
169
|
left: 6px;
|
|
171
170
|
}
|
|
172
171
|
|
|
173
|
-
.ai-
|
|
172
|
+
.ai-slider-vertical .ai-range-scale {
|
|
174
173
|
height: 2px;
|
|
175
174
|
width: 6px;
|
|
176
175
|
}
|
|
177
176
|
|
|
178
|
-
.ai-
|
|
177
|
+
.ai-slider-fill {
|
|
179
178
|
background: #0069ff;
|
|
180
179
|
position: absolute;
|
|
181
180
|
z-index: 10;
|
|
182
181
|
}
|
|
183
182
|
|
|
184
|
-
.ai-
|
|
183
|
+
.ai-slider-horizontal .ai-slider-fill {
|
|
185
184
|
height: 4px;
|
|
186
185
|
}
|
|
187
186
|
|
|
188
|
-
.ai-
|
|
187
|
+
.ai-slider-vertical .ai-slider-fill {
|
|
189
188
|
width: 4px;
|
|
190
189
|
}
|
package/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FC, ReactNode } from "react";
|
|
1
|
+
import { type FC, type ReactNode } from "react";
|
|
2
2
|
import './index.css';
|
|
3
3
|
export type AI_RangeContext = {
|
|
4
4
|
rangeHook: ReturnType<typeof useRange>;
|
|
@@ -24,6 +24,7 @@ export type AI_label = {
|
|
|
24
24
|
setting: (value: number, p: {
|
|
25
25
|
angle: number;
|
|
26
26
|
disabled: boolean;
|
|
27
|
+
index: number;
|
|
27
28
|
}) => AI_labelItem;
|
|
28
29
|
};
|
|
29
30
|
export type AI_labelItem = {
|
|
@@ -78,6 +79,12 @@ export type I_Range = {
|
|
|
78
79
|
disabled: boolean;
|
|
79
80
|
angle: number;
|
|
80
81
|
}) => ReactNode | false | undefined;
|
|
82
|
+
pointContent?: (p: {
|
|
83
|
+
index: number;
|
|
84
|
+
value: number;
|
|
85
|
+
disabled: boolean;
|
|
86
|
+
angle: number;
|
|
87
|
+
}) => ReactNode;
|
|
81
88
|
pointOffset?: (p: {
|
|
82
89
|
index: number;
|
|
83
90
|
value: number;
|
|
@@ -122,13 +129,15 @@ type I_Range_default = I_Range & {
|
|
|
122
129
|
rotate: number;
|
|
123
130
|
ranges: I_range[];
|
|
124
131
|
};
|
|
125
|
-
declare const
|
|
126
|
-
export
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
132
|
+
export declare const AIOSlider: FC<I_Range>;
|
|
133
|
+
export declare const AIOSpinner: FC<I_Range>;
|
|
134
|
+
type I_RangeValue = {
|
|
135
|
+
value: number;
|
|
136
|
+
disabled: boolean;
|
|
137
|
+
angle: number;
|
|
138
|
+
index: number;
|
|
130
139
|
};
|
|
131
|
-
declare const useRange: (PROPS: I_Range) => {
|
|
140
|
+
declare const useRange: (PROPS: I_Range, type: 'slider' | 'spinner') => {
|
|
132
141
|
values: number[];
|
|
133
142
|
getValues: (value: any) => number[];
|
|
134
143
|
getSide: () => "left" | "right" | "bottom" | "top";
|
|
@@ -137,6 +146,8 @@ declare const useRange: (PROPS: I_Range) => {
|
|
|
137
146
|
mainDom: any;
|
|
138
147
|
isValueDisabled: (value: number) => boolean;
|
|
139
148
|
rootProps: I_Range_default;
|
|
149
|
+
getRootProps: (props: I_Range, type: 'slider' | 'spinner') => any;
|
|
150
|
+
getLabelList: (label: AI_label) => number[];
|
|
140
151
|
getArc: (rc: I_range) => {
|
|
141
152
|
thickness: number;
|
|
142
153
|
color: string;
|
|
@@ -153,5 +164,35 @@ declare const useRange: (PROPS: I_Range) => {
|
|
|
153
164
|
getXPByValue: (value: number) => number;
|
|
154
165
|
getValueByXP: (xp: number) => number;
|
|
155
166
|
getXPByX: (x: number) => number;
|
|
156
|
-
|
|
167
|
+
handleZIndex: (index: number) => void;
|
|
168
|
+
getSpinnerLabel: (labelItem: AI_labelItem, itemValue: number) => import("react/jsx-runtime").JSX.Element;
|
|
169
|
+
getSliderPointContainerStyle: (rangeValue: I_RangeValue) => {
|
|
170
|
+
[x: string]: number;
|
|
171
|
+
};
|
|
172
|
+
getSpinnerPointContainerStyle: (rangeValue: I_RangeValue) => {
|
|
173
|
+
left: number;
|
|
174
|
+
transform: string;
|
|
175
|
+
};
|
|
176
|
+
getSliderValueProps: (rangeValue: I_RangeValue) => {
|
|
177
|
+
className: string;
|
|
178
|
+
draggable: boolean;
|
|
179
|
+
style: {
|
|
180
|
+
[x: string]: string;
|
|
181
|
+
};
|
|
182
|
+
};
|
|
183
|
+
getSpinnerValueProps: (rangeValue: I_RangeValue) => {
|
|
184
|
+
className: string;
|
|
185
|
+
draggable: boolean;
|
|
186
|
+
style: {
|
|
187
|
+
transform: string;
|
|
188
|
+
};
|
|
189
|
+
};
|
|
190
|
+
getRangeValue: (itemValue: number, index: number) => {
|
|
191
|
+
disabled: boolean;
|
|
192
|
+
value: number;
|
|
193
|
+
index: number;
|
|
194
|
+
angle: number;
|
|
195
|
+
};
|
|
196
|
+
getSliderLabel: (labelItem: AI_labelItem, itemValue: number) => import("react/jsx-runtime").JSX.Element;
|
|
157
197
|
};
|
|
198
|
+
export {};
|
package/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createElement as _createElement } from "react";
|
|
2
|
-
import { jsx as _jsx,
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import { createContext, createRef, useContext, useEffect, useRef, useState } from "react";
|
|
4
4
|
import * as UT from 'aio-utils';
|
|
5
5
|
import { $ } from 'aio-deps';
|
|
@@ -7,90 +7,59 @@ import './index.css';
|
|
|
7
7
|
const RangeContext = createContext({});
|
|
8
8
|
const RangeProvider = ({ value, children }) => _jsx(RangeContext.Provider, { value: value, children: children });
|
|
9
9
|
const useRangeProvider = () => useContext(RangeContext);
|
|
10
|
-
const
|
|
11
|
-
const rangeHook = useRange(props);
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
c += ` ai-range-reverse`;
|
|
25
|
-
}
|
|
26
|
-
return c;
|
|
27
|
-
}
|
|
28
|
-
function getRootStyle() {
|
|
29
|
-
let { style } = props;
|
|
30
|
-
let res;
|
|
31
|
-
if (props.round) {
|
|
32
|
-
res = { width: props.size, height: props.size };
|
|
33
|
-
}
|
|
34
|
-
return Object.assign(Object.assign({}, res), style);
|
|
35
|
-
}
|
|
36
|
-
function getRootProps() {
|
|
37
|
-
let { attrs = {} } = props;
|
|
38
|
-
let rootStyle = getRootStyle();
|
|
39
|
-
return UT.AddToAttrs(attrs, { className: getRootClassName(), style: rootStyle, attrs: { ref: rangeHook.mainDom } });
|
|
40
|
-
}
|
|
41
|
-
function root_node() {
|
|
42
|
-
const { labels } = rangeHook.rootProps;
|
|
43
|
-
return (_jsxs("div", Object.assign({}, getRootProps(), { children: [rangeHook.getGroove(), props.text !== undefined && _jsx("div", { className: 'ai-range-text', children: props.text }, 'rangetext'), !props.round &&
|
|
44
|
-
_jsxs(_Fragment, { children: [_jsx(AIRangeRects, {}, 'rangeRects'), _jsx(RangeFills, {}, 'rangeFills')] }), _jsx(RangeSvg, {}), labels.map((label, i) => _jsx(RangeLabel, { label: label }, i)), _jsx(RangeValues, {})] })));
|
|
10
|
+
export const AIOSlider = (props) => {
|
|
11
|
+
const rangeHook = useRange(props, 'slider');
|
|
12
|
+
return (_jsx(RangeProvider, { value: { rangeHook }, children: _jsxs("div", Object.assign({}, rangeHook.getRootProps(props, 'slider'), { children: [_jsx(SliderGroove, { grooveAttrs: props.grooveAttrs }), _jsx(SliderRects, { ranges: props.ranges }), _jsx(SliderFills, {}), _jsx(RangeLabels, { type: 'slider' }), _jsx(RangeValues, { type: 'slider' })] })) }));
|
|
13
|
+
};
|
|
14
|
+
export const AIOSpinner = (props) => {
|
|
15
|
+
const rangeHook = useRange(props, 'spinner');
|
|
16
|
+
return (_jsx(RangeProvider, { value: { rangeHook }, children: _jsxs("div", Object.assign({}, rangeHook.getRootProps(props, 'spinner'), { children: [_jsx(SpinnerText, { text: props.text }), _jsx(SpinnerSvg, {}), _jsx(RangeLabels, { type: 'spinner' }), _jsx(RangeValues, { type: 'spinner' })] })) }));
|
|
17
|
+
};
|
|
18
|
+
const SliderGroove = ({ grooveAttrs }) => {
|
|
19
|
+
return _jsx("div", Object.assign({}, UT.AddToAttrs(grooveAttrs, { className: 'ai-slider-groove' })));
|
|
20
|
+
};
|
|
21
|
+
const SpinnerText = ({ text }) => {
|
|
22
|
+
if (text === undefined || text === null) {
|
|
23
|
+
return null;
|
|
45
24
|
}
|
|
46
|
-
return
|
|
25
|
+
return _jsx("div", { className: 'ai-range-text', children: text });
|
|
47
26
|
};
|
|
48
|
-
|
|
49
|
-
const
|
|
27
|
+
const RangeLabels = ({ type }) => {
|
|
28
|
+
const { rangeHook } = useRangeProvider();
|
|
29
|
+
const { labels } = rangeHook.rootProps;
|
|
30
|
+
return (_jsx(_Fragment, { children: labels.map((label, i) => _jsx(RangeLabel, { label: label, type: type }, i)) }));
|
|
31
|
+
};
|
|
32
|
+
const RangeValues = ({ type }) => {
|
|
50
33
|
const { rangeHook } = useRangeProvider();
|
|
51
34
|
return (_jsx(_Fragment, { children: rangeHook.values.map((itemValue, i) => {
|
|
52
|
-
return _jsx(RangeValue, { index: i, itemValue: itemValue }, 'rangecontainervalue' + i);
|
|
35
|
+
return _jsx(RangeValue, { index: i, itemValue: itemValue, type: type }, 'rangecontainervalue' + i);
|
|
53
36
|
}) }));
|
|
54
37
|
};
|
|
55
|
-
const RangeValue = (
|
|
38
|
+
const RangeValue = ({ itemValue, index, type }) => {
|
|
56
39
|
let { rangeHook } = useRangeProvider();
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
function containerProps() {
|
|
61
|
-
let style;
|
|
62
|
-
if (!round) {
|
|
63
|
-
style = { [rangeHook.getSide()]: rangeHook.getXPByValue(itemValue) + '%' };
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
style = { transform: `rotate(${angle}deg)` };
|
|
67
|
-
}
|
|
68
|
-
return { className: 'ai-range-value-container', draggable: false, style };
|
|
69
|
-
}
|
|
70
|
-
const disabled = rangeHook.isValueDisabled(itemValue);
|
|
71
|
-
return (_jsxs("div", Object.assign({}, containerProps(), { children: [_jsx(RangeHandle, { disabled: disabled, value: itemValue, index: index, angle: angle }), _jsx(AIRangePoint, { disabled: disabled, value: itemValue, index: index, angle: angle })] })));
|
|
40
|
+
const rangeValue = rangeHook.getRangeValue(itemValue, index);
|
|
41
|
+
const props = type === 'spinner' ? rangeHook.getSpinnerValueProps(rangeValue) : rangeHook.getSliderValueProps(rangeValue);
|
|
42
|
+
return (_jsxs("div", Object.assign({}, props, { children: [_jsx(SpinnerHandle, { rangeValue: rangeValue }), _jsx(AIRangePoint, { rangeValue: rangeValue, type: type })] })));
|
|
72
43
|
};
|
|
73
|
-
const
|
|
44
|
+
const SpinnerSvg = () => {
|
|
74
45
|
const { rangeHook } = useRangeProvider();
|
|
75
|
-
const {
|
|
76
|
-
if (!
|
|
46
|
+
const { ranges, size } = rangeHook.rootProps;
|
|
47
|
+
if (!ranges.length) {
|
|
77
48
|
return null;
|
|
78
49
|
}
|
|
79
|
-
return (_jsx("svg", { style: { position: 'absolute', left: 0, top: 0 }, width: size, height: size, children: ranges.map((range, i) => _jsx(
|
|
50
|
+
return (_jsx("svg", { style: { position: 'absolute', left: 0, top: 0 }, width: size, height: size, children: ranges.map((range, i) => _jsx(SpinnerArc, { range: range }, 'rangecirclearc' + i)) }));
|
|
80
51
|
};
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
const { ranges = [] } = rangeHook.rootProps;
|
|
84
|
-
return (_jsx(_Fragment, { children: ranges.map((range, i) => _jsx(RangeRect, { range: range }, 'range' + i)) }));
|
|
85
|
-
};
|
|
86
|
-
const RangeFills = () => {
|
|
87
|
-
let { rangeHook } = useRangeProvider();
|
|
88
|
-
let { start, round, rangeOption = {} } = rangeHook.rootProps;
|
|
89
|
-
if (round) {
|
|
52
|
+
const SliderRects = ({ ranges = [] }) => {
|
|
53
|
+
if (!ranges.length) {
|
|
90
54
|
return null;
|
|
91
55
|
}
|
|
56
|
+
return (_jsx(_Fragment, { children: ranges.map((range, i) => _jsx(SliderRect, { range: range }, 'range' + i)) }));
|
|
57
|
+
};
|
|
58
|
+
const SliderFills = () => {
|
|
59
|
+
const { rangeHook } = useRangeProvider();
|
|
60
|
+
const { rootProps, values } = rangeHook;
|
|
61
|
+
const { rangeOption = {}, start } = rootProps;
|
|
92
62
|
const { fill } = rangeOption;
|
|
93
|
-
const values = rangeHook.values;
|
|
94
63
|
let limit = values.length === 1 ? [start, values[0]] : [...values];
|
|
95
64
|
const fillHtmls = [];
|
|
96
65
|
for (let i = 1; i < limit.length; i++) {
|
|
@@ -104,24 +73,24 @@ const RangeFills = () => {
|
|
|
104
73
|
const { thickness = 4, style, className: fillClassName, color } = res;
|
|
105
74
|
let from = limit[startPoint.index];
|
|
106
75
|
let to = limit[endPoint.index];
|
|
107
|
-
let className = 'ai-
|
|
76
|
+
let className = 'ai-slider-fill';
|
|
108
77
|
if (fillClassName) {
|
|
109
78
|
className += ' ' + fillClassName;
|
|
110
79
|
}
|
|
111
|
-
fillHtmls.push(_jsx(
|
|
80
|
+
fillHtmls.push(_jsx(SliderRect, { range: { thickness, color, from, to, className, style, offset: 0 } }, 'fill' + i));
|
|
112
81
|
}
|
|
113
82
|
return _jsx(_Fragment, { children: fillHtmls });
|
|
114
83
|
};
|
|
115
|
-
const
|
|
84
|
+
const SliderRect = ({ range }) => {
|
|
116
85
|
let { rangeHook } = useRangeProvider();
|
|
117
86
|
let { color, from, to, className, style, offset, thickness, roundCap } = range;
|
|
118
|
-
className = UT.classListToString(['ai-
|
|
87
|
+
className = UT.classListToString(['ai-slider-range', range.className]);
|
|
119
88
|
const { vertical, reverse } = rangeHook.rootProps;
|
|
120
89
|
let startSide = rangeHook.getXPByValue(from), endSide = rangeHook.getXPByValue(to);
|
|
121
90
|
let Style = Object.assign({ [vertical ? 'height' : 'width']: (endSide - startSide) + '%', [vertical ? 'width' : 'height']: range.thickness, [vertical ? (reverse ? 'bottom' : 'top') : (reverse ? 'right' : 'left')]: startSide + '%', [vertical ? 'left' : 'top']: `calc(50% - ${(thickness / 2) + offset}px)`, borderRadius: roundCap ? 48 : 0, background: color }, style);
|
|
122
91
|
return _jsx("div", { className: className, style: Style });
|
|
123
92
|
};
|
|
124
|
-
const
|
|
93
|
+
const SpinnerArc = ({ range }) => {
|
|
125
94
|
let { rangeHook } = useRangeProvider();
|
|
126
95
|
let { size, reverse } = rangeHook.rootProps;
|
|
127
96
|
const { thickness, color, radius, roundCap, full, from, to } = rangeHook.getArc(range);
|
|
@@ -146,15 +115,14 @@ const RangeArc = ({ range }) => {
|
|
|
146
115
|
}
|
|
147
116
|
return _jsx("path", { d: UT.svgArc(x, y, radius, a, b), stroke: color, strokeWidth: thickness, fill: 'transparent', strokeLinecap: roundCap ? 'round' : undefined, className: range.className }, `from${from}to${to}`);
|
|
148
117
|
};
|
|
149
|
-
const
|
|
118
|
+
const SpinnerHandle = ({ rangeValue }) => {
|
|
150
119
|
let { rangeHook } = useRangeProvider();
|
|
151
|
-
let {
|
|
152
|
-
|
|
153
|
-
if (!round || !rangeOption.handle) {
|
|
120
|
+
let { rangeOption = {} } = rangeHook.rootProps;
|
|
121
|
+
if (!rangeOption.handle) {
|
|
154
122
|
return null;
|
|
155
123
|
}
|
|
156
124
|
const { handle: handleFn } = rangeOption;
|
|
157
|
-
const handle = handleFn(
|
|
125
|
+
const handle = handleFn(rangeValue);
|
|
158
126
|
if (!handle) {
|
|
159
127
|
return null;
|
|
160
128
|
}
|
|
@@ -174,33 +142,18 @@ const RangeHandle = (props) => {
|
|
|
174
142
|
return { width, height, left: offset, background: color };
|
|
175
143
|
}
|
|
176
144
|
}
|
|
177
|
-
let PROPS = UT.AddToAttrs({}, { className: '
|
|
178
|
-
return (_createElement("div", Object.assign({}, PROPS, { key: 'rangehandle' + index })));
|
|
145
|
+
let PROPS = UT.AddToAttrs({}, { className: 'ai-spinner-handle', style: getStyle(), attrs: { draggable: false } });
|
|
146
|
+
return (_createElement("div", Object.assign({}, PROPS, { key: 'rangehandle' + rangeValue.index })));
|
|
179
147
|
};
|
|
180
148
|
const RangeLabel = (props) => {
|
|
181
149
|
let { rangeHook } = useRangeProvider();
|
|
182
150
|
let { label } = props;
|
|
183
|
-
let { zIndex, dynamic
|
|
184
|
-
let {
|
|
151
|
+
let { zIndex, dynamic } = label;
|
|
152
|
+
let { reverse, vertical } = rangeHook.rootProps;
|
|
185
153
|
let [def] = useState(getDef);
|
|
186
154
|
function getDef() { return RENDER(true); }
|
|
187
|
-
function getList() {
|
|
188
|
-
let res = [];
|
|
189
|
-
if (step) {
|
|
190
|
-
let { start: lstart = start, end: lend = end } = label;
|
|
191
|
-
for (let i = lstart; i <= lend; i += step) {
|
|
192
|
-
res.push(i);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
for (let i = 0; i < list.length; i++) {
|
|
196
|
-
if (res.indexOf(list[i]) === -1) {
|
|
197
|
-
res.push(list[i]);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
return res;
|
|
201
|
-
}
|
|
202
155
|
function updateLabels() {
|
|
203
|
-
if (
|
|
156
|
+
if (props.type !== "spinner" || !label.autoHide || vertical) {
|
|
204
157
|
return;
|
|
205
158
|
}
|
|
206
159
|
let container = $(rangeHook.mainDom.current);
|
|
@@ -242,93 +195,32 @@ const RangeLabel = (props) => {
|
|
|
242
195
|
if (!init && !dynamic) {
|
|
243
196
|
return def;
|
|
244
197
|
}
|
|
245
|
-
|
|
198
|
+
const list = rangeHook.getLabelList(label);
|
|
199
|
+
return (_jsx("div", { className: 'ai-range-labels', style: { zIndex }, children: list.map((itemValue, index) => {
|
|
200
|
+
let disabled = rangeHook.isValueDisabled(itemValue);
|
|
201
|
+
let labelItem = label.setting(itemValue, { disabled, angle: 0, index });
|
|
202
|
+
if (props.type === "slider") {
|
|
203
|
+
return (rangeHook.getSliderLabel(labelItem, itemValue));
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
return rangeHook.getSpinnerLabel(labelItem, itemValue);
|
|
207
|
+
}
|
|
208
|
+
}) }));
|
|
246
209
|
}
|
|
247
210
|
return _jsx(_Fragment, { children: RENDER(false) });
|
|
248
211
|
};
|
|
249
|
-
const
|
|
212
|
+
const AIRangePoint = ({ rangeValue, type }) => {
|
|
250
213
|
let { rangeHook } = useRangeProvider();
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
if (round) {
|
|
255
|
-
angle = rangeHook.fixAngle(rangeHook.getAngleByValue(itemValue));
|
|
256
|
-
}
|
|
257
|
-
let disabled = rangeHook.isValueDisabled(itemValue);
|
|
258
|
-
function getContainerStyle(distance) {
|
|
259
|
-
if (round) {
|
|
260
|
-
return { transform: `rotate(${angle}deg)` };
|
|
261
|
-
}
|
|
262
|
-
else {
|
|
263
|
-
return Object.assign({ [rangeHook.getSide()]: rangeHook.getXPByValue(itemValue) + '%' }, distance);
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
function getTextStyle(item, distance) {
|
|
267
|
-
let res = {};
|
|
268
|
-
if (round) {
|
|
269
|
-
res = Object.assign(Object.assign({}, res), distance);
|
|
270
|
-
if (item.fixAngle) {
|
|
271
|
-
res = Object.assign(Object.assign({}, res), { transform: `rotate(${-angle}deg)` });
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
return Object.assign({ width: 0, height: 0 }, res);
|
|
275
|
-
}
|
|
276
|
-
function getDetails() {
|
|
277
|
-
let item = label.setting(itemValue, { disabled, angle });
|
|
278
|
-
let { offset = 0, html = '', config } = item;
|
|
279
|
-
let distance = { [round || vertical ? 'left' : 'top']: size * offset / 100 / 2 };
|
|
280
|
-
if (round) {
|
|
281
|
-
distance.left = size * offset / 100 / 2;
|
|
282
|
-
}
|
|
283
|
-
else if (vertical) {
|
|
284
|
-
distance.left = `calc(50% + ${offset || 0}px)`;
|
|
285
|
-
}
|
|
286
|
-
else {
|
|
287
|
-
distance.top = `calc(50% + ${offset || 0}px)`;
|
|
288
|
-
}
|
|
289
|
-
let containerStyle = getContainerStyle(distance);
|
|
290
|
-
let containerProps = { className: 'ai-range-label-container', style: containerStyle, draggable: false };
|
|
291
|
-
let textProps = UT.AddToAttrs({}, { className: ['ai-range-label'], style: getTextStyle(item, distance), attrs: { draggable: false } });
|
|
292
|
-
if (config) {
|
|
293
|
-
html = (_jsx("div", { className: "msf", style: {
|
|
294
|
-
[!!round && !vertical ? 'height' : 'width']: size * config.thickness / 100,
|
|
295
|
-
[!!round && !vertical ? 'width' : 'height']: size * config.height / 100,
|
|
296
|
-
//transform:`translate${!!round && !vertical?'Y':'X'}${-size * config.thickness / 200}`,
|
|
297
|
-
background: config.color
|
|
298
|
-
} }));
|
|
299
|
-
}
|
|
300
|
-
return { html, textProps, containerProps };
|
|
301
|
-
}
|
|
302
|
-
let { html, textProps, containerProps } = getDetails();
|
|
303
|
-
return (_jsx("div", Object.assign({}, containerProps, { children: _jsx("div", Object.assign({}, textProps, { children: html })) })));
|
|
304
|
-
};
|
|
305
|
-
const AIRangePoint = (props) => {
|
|
306
|
-
let { rangeHook } = useRangeProvider();
|
|
307
|
-
const { size, vertical, rangeOption = {}, round } = rangeHook.rootProps;
|
|
308
|
-
function getContainerStyle(offset) {
|
|
309
|
-
let containerStyle;
|
|
310
|
-
if (round) {
|
|
311
|
-
containerStyle = { left: size / 2 + offset, transform: `rotate(${-props.angle}deg)` };
|
|
312
|
-
}
|
|
313
|
-
else {
|
|
314
|
-
containerStyle = { [vertical ? 'left' : 'top']: offset };
|
|
315
|
-
}
|
|
316
|
-
return containerStyle;
|
|
317
|
-
}
|
|
318
|
-
function handleZIndex(index) {
|
|
319
|
-
let containers = $(rangeHook.mainDom.current).find(`.ai-range-value-container`);
|
|
320
|
-
containers.css({ zIndex: 10 });
|
|
321
|
-
containers.eq(index).css({ zIndex: 100 });
|
|
322
|
-
}
|
|
323
|
-
const { pointHtml = (() => _jsx("div", { className: 'ai-range-point', children: props.value })), pointOffset = (() => 0) } = rangeOption;
|
|
324
|
-
const point = pointHtml(props);
|
|
214
|
+
const { rangeOption = {} } = rangeHook.rootProps;
|
|
215
|
+
const { pointContent = (() => rangeValue.value), pointHtml = (() => _jsx("div", { className: 'ai-range-point', children: pointContent(rangeValue) })), } = rangeOption;
|
|
216
|
+
const point = pointHtml(rangeValue);
|
|
325
217
|
if (point === false) {
|
|
326
218
|
return null;
|
|
327
219
|
}
|
|
328
|
-
const
|
|
329
|
-
return (_jsx("div", { style:
|
|
220
|
+
const containerStyle = type === "spinner" ? rangeHook.getSpinnerPointContainerStyle(rangeValue) : rangeHook.getSliderPointContainerStyle(rangeValue);
|
|
221
|
+
return (_jsx("div", { style: containerStyle, className: 'ai-range-point-container', draggable: false, "data-index": rangeValue.index, onMouseDown: () => rangeHook.handleZIndex(rangeValue.index), children: point }, 'rangepoint' + rangeValue.index));
|
|
330
222
|
};
|
|
331
|
-
const useRange = (PROPS) => {
|
|
223
|
+
const useRange = (PROPS, type) => {
|
|
332
224
|
const getProps = () => {
|
|
333
225
|
const { start = 0, end = 100, min = start, max = end, step = 1, size = 72, labels = [], rotate = 0, ranges = [] } = PROPS;
|
|
334
226
|
return Object.assign(Object.assign({}, PROPS), { start, end, min, max, step, size, labels, rotate, ranges });
|
|
@@ -339,7 +231,7 @@ const useRange = (PROPS) => {
|
|
|
339
231
|
let [temp] = useState({ start: 0, index: false });
|
|
340
232
|
const [mainDom] = useState(createRef());
|
|
341
233
|
const [values, setValues] = useState([]);
|
|
342
|
-
const { vertical, reverse, start = 0, end = 100, min = start, max = end, step = 1, rotate = 0, round
|
|
234
|
+
const { vertical, reverse, start = 0, end = 100, min = start, max = end, step = 1, rotate = 0, round = 1, size = 72 } = props;
|
|
343
235
|
useEffect(() => {
|
|
344
236
|
if (!props.onChange || props.disabled === true) {
|
|
345
237
|
return;
|
|
@@ -386,7 +278,7 @@ const useRange = (PROPS) => {
|
|
|
386
278
|
}
|
|
387
279
|
let clickedValue;
|
|
388
280
|
//vertical condition
|
|
389
|
-
if (
|
|
281
|
+
if (type === "spinner") {
|
|
390
282
|
clickedValue = getValueByAngle(mousePosition.centerAngle);
|
|
391
283
|
}
|
|
392
284
|
else {
|
|
@@ -425,7 +317,7 @@ const useRange = (PROPS) => {
|
|
|
425
317
|
let res;
|
|
426
318
|
if (index === false) {
|
|
427
319
|
let deltaValue;
|
|
428
|
-
if (
|
|
320
|
+
if (type === "spinner") {
|
|
429
321
|
let v = deltaCenterAngle * (props.end - props.start) / 360;
|
|
430
322
|
v = Math.round(v / props.step) * props.step;
|
|
431
323
|
deltaValue = v;
|
|
@@ -439,7 +331,7 @@ const useRange = (PROPS) => {
|
|
|
439
331
|
else {
|
|
440
332
|
let { before, after } = getIndexLimit(index);
|
|
441
333
|
let newUnitValue;
|
|
442
|
-
if (
|
|
334
|
+
if (type === 'spinner') {
|
|
443
335
|
newUnitValue = Math.round(getValueByAngle(centerAngle) / props.step) * props.step;
|
|
444
336
|
}
|
|
445
337
|
else {
|
|
@@ -515,7 +407,8 @@ const useRange = (PROPS) => {
|
|
|
515
407
|
for (let i = 0; i < value.length; i++) {
|
|
516
408
|
let point = value[i] || 0;
|
|
517
409
|
point = Math.round((point - start) / step) * step + start;
|
|
518
|
-
|
|
410
|
+
const { floatLength } = UT.Float(step);
|
|
411
|
+
point = +point.toFixed(floatLength);
|
|
519
412
|
if (point < min) {
|
|
520
413
|
point = min;
|
|
521
414
|
}
|
|
@@ -533,7 +426,7 @@ const useRange = (PROPS) => {
|
|
|
533
426
|
return vertical ? (reverse ? 'bottom' : 'top') : (reverse ? 'right' : 'left');
|
|
534
427
|
}
|
|
535
428
|
function fixValueInEmpty(value) {
|
|
536
|
-
let fill = round
|
|
429
|
+
let fill = round;
|
|
537
430
|
let empty = 1 - fill;
|
|
538
431
|
let emptyValue = empty * (end - start) / fill;
|
|
539
432
|
if (value > end + emptyValue / 2) {
|
|
@@ -543,7 +436,7 @@ const useRange = (PROPS) => {
|
|
|
543
436
|
}
|
|
544
437
|
function fixAngle(angle) { angle = angle % 360; return angle < 0 ? angle = 360 + angle : angle; }
|
|
545
438
|
function getValueByAngle(angle) {
|
|
546
|
-
let fillAngle = 360 *
|
|
439
|
+
let fillAngle = 360 * round;
|
|
547
440
|
let emptyAngle = 360 - fillAngle;
|
|
548
441
|
if (reverse) {
|
|
549
442
|
angle = 180 - angle;
|
|
@@ -608,11 +501,120 @@ const useRange = (PROPS) => {
|
|
|
608
501
|
offset = sbp(offset);
|
|
609
502
|
return { thickness, radius, color, roundCap, full, className, from, to };
|
|
610
503
|
};
|
|
611
|
-
function
|
|
612
|
-
|
|
504
|
+
function handleZIndex(index) {
|
|
505
|
+
let containers = $(mainDom.current).find(`.ai-range-value-container`);
|
|
506
|
+
containers.css({ zIndex: 10 });
|
|
507
|
+
containers.eq(index).css({ zIndex: 100 });
|
|
508
|
+
}
|
|
509
|
+
function getOffset(rangeValue) {
|
|
510
|
+
const { pointOffset = (() => 0) } = props.rangeOption || {};
|
|
511
|
+
return pointOffset(rangeValue) || 0;
|
|
512
|
+
}
|
|
513
|
+
function getSliderPointContainerStyle(rangeValue) { return { [vertical ? 'left' : 'top']: getOffset(rangeValue) }; }
|
|
514
|
+
function getSpinnerPointContainerStyle(rangeValue) { return { left: size / 2 + getOffset(rangeValue), transform: `rotate(${-rangeValue.angle}deg)` }; }
|
|
515
|
+
function getSliderValueProps(rangeValue) { return { className: 'ai-range-value-container', draggable: false, style: { [getSide()]: getXPByValue(rangeValue.value) + '%' } }; }
|
|
516
|
+
function getSpinnerValueProps(rangeValue) {
|
|
517
|
+
return { className: 'ai-range-value-container', draggable: false, style: { transform: `rotate(${rangeValue.angle}deg)` } };
|
|
518
|
+
}
|
|
519
|
+
const getRangeValue = (itemValue, index) => {
|
|
520
|
+
let angle = fixAngle(getAngleByValue(itemValue));
|
|
521
|
+
const disabled = isValueDisabled(itemValue);
|
|
522
|
+
return { disabled, value: itemValue, index, angle };
|
|
523
|
+
};
|
|
524
|
+
function getRootClassName(props, type) {
|
|
525
|
+
let c = 'ai-range';
|
|
526
|
+
if (type === "spinner") {
|
|
527
|
+
c += ` ai-spinner`;
|
|
528
|
+
}
|
|
529
|
+
else {
|
|
530
|
+
c += props.vertical ? ` ai-slider-vertical` : ` ai-slider-horizontal`;
|
|
531
|
+
}
|
|
532
|
+
if (props.className) {
|
|
533
|
+
c += ' ' + props.className;
|
|
534
|
+
}
|
|
535
|
+
if (props.reverse) {
|
|
536
|
+
c += ` ai-${type === "spinner" ? 'spinner' : 'slider'}-reverse`;
|
|
537
|
+
}
|
|
538
|
+
return c;
|
|
539
|
+
}
|
|
540
|
+
function getRootStyle(props, type) {
|
|
541
|
+
let { style } = props;
|
|
542
|
+
let res;
|
|
543
|
+
if (type === "spinner") {
|
|
544
|
+
res = { width: props.size, height: props.size };
|
|
545
|
+
}
|
|
546
|
+
return Object.assign(Object.assign({}, res), style);
|
|
547
|
+
}
|
|
548
|
+
function getRootProps(props, type) {
|
|
549
|
+
let { attrs = {} } = props;
|
|
550
|
+
let rootStyle = getRootStyle(props, type);
|
|
551
|
+
return UT.AddToAttrs(attrs, { className: getRootClassName(props, type), style: rootStyle, attrs: { ref: mainDom } });
|
|
552
|
+
}
|
|
553
|
+
function getDistance(labelItem, type) {
|
|
554
|
+
let { offset = 0 } = labelItem;
|
|
555
|
+
let distance = { [type === "spinner" || vertical ? 'left' : 'top']: size * offset / 100 / 2 };
|
|
556
|
+
if (type === "spinner") {
|
|
557
|
+
distance.left = size * offset / 100 / 2;
|
|
558
|
+
}
|
|
559
|
+
else if (vertical) {
|
|
560
|
+
distance.left = `calc(50% + ${offset || 0}px)`;
|
|
561
|
+
}
|
|
562
|
+
else {
|
|
563
|
+
distance.top = `calc(50% + ${offset || 0}px)`;
|
|
564
|
+
}
|
|
565
|
+
return distance;
|
|
566
|
+
}
|
|
567
|
+
function getSliderLabel(labelItem, itemValue) {
|
|
568
|
+
let { html = '', config } = labelItem;
|
|
569
|
+
if (config) {
|
|
570
|
+
html = (_jsx("div", { style: {
|
|
571
|
+
[!vertical ? 'width' : 'height']: size * config.thickness / 100,
|
|
572
|
+
[!vertical ? 'height' : 'width']: size * config.height / 100,
|
|
573
|
+
background: config.color
|
|
574
|
+
} }));
|
|
575
|
+
}
|
|
576
|
+
const htmlProps = UT.AddToAttrs({}, { className: ['ai-range-label'], attrs: { draggable: false } });
|
|
577
|
+
const containerStyle = Object.assign({ [getSide()]: getXPByValue(itemValue) + '%' }, getDistance(labelItem, 'slider'));
|
|
578
|
+
const containerProps = { className: 'ai-range-label-container', style: containerStyle, draggable: false };
|
|
579
|
+
return (_jsx("div", Object.assign({}, containerProps, { children: _jsx("div", Object.assign({}, htmlProps, { children: html })) })));
|
|
580
|
+
}
|
|
581
|
+
function getLabelList(label) {
|
|
582
|
+
let { step, list = [] } = label;
|
|
583
|
+
let res = [];
|
|
584
|
+
if (step) {
|
|
585
|
+
let { start: lstart = start, end: lend = end } = label;
|
|
586
|
+
for (let i = lstart; i <= lend; i += step) {
|
|
587
|
+
res.push(i);
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
for (let i = 0; i < list.length; i++) {
|
|
591
|
+
if (res.indexOf(list[i]) === -1) {
|
|
592
|
+
res.push(list[i]);
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
return res;
|
|
596
|
+
}
|
|
597
|
+
function getSpinnerLabel(labelItem, itemValue) {
|
|
598
|
+
let { html = '', config } = labelItem;
|
|
599
|
+
if (config) {
|
|
600
|
+
html = (_jsx("div", { style: {
|
|
601
|
+
height: size * config.thickness / 100,
|
|
602
|
+
width: size * config.height / 100,
|
|
603
|
+
background: config.color
|
|
604
|
+
} }));
|
|
605
|
+
}
|
|
606
|
+
let angle = fixAngle(getAngleByValue(itemValue)) || 0;
|
|
607
|
+
let containerStyle = { transform: `rotate(${angle}deg)` };
|
|
608
|
+
let containerProps = { className: 'ai-range-label-container', style: containerStyle, draggable: false };
|
|
609
|
+
const distance = getDistance(labelItem, "spinner");
|
|
610
|
+
let textStyle = Object.assign(Object.assign({}, distance), { transform: labelItem.fixAngle ? `rotate(${-angle}deg)` : undefined });
|
|
611
|
+
const htmlProps = UT.AddToAttrs({}, { className: ['ai-range-label'], style: textStyle, attrs: { draggable: false } });
|
|
612
|
+
return (_jsx("div", Object.assign({}, containerProps, { children: _jsx("div", Object.assign({}, htmlProps, { children: html })) })));
|
|
613
613
|
}
|
|
614
614
|
return {
|
|
615
|
-
values, getValues, getSide, fixAngle, getValueByAngle, mainDom, isValueDisabled, rootProps: props,
|
|
616
|
-
getArc, getAngleByValue, getRectByStr, sbp, getXPByValue, getValueByXP, getXPByX,
|
|
615
|
+
values, getValues, getSide, fixAngle, getValueByAngle, mainDom, isValueDisabled, rootProps: props, getRootProps, getLabelList,
|
|
616
|
+
getArc, getAngleByValue, getRectByStr, sbp, getXPByValue, getValueByXP, getXPByX, handleZIndex, getSpinnerLabel,
|
|
617
|
+
getSliderPointContainerStyle, getSpinnerPointContainerStyle, getSliderValueProps, getSpinnerValueProps, getRangeValue,
|
|
618
|
+
getSliderLabel
|
|
617
619
|
};
|
|
618
620
|
};
|