Skip to content

Commit b99fa96

Browse files
authored
feat: support slider editable (#1006)
* refactor: update logic * feat: click to add * chore: click to move * feat: key to delete * chore: support drag to remove * chore: drag to delete * chore: dragable * chore: editable only * chore: good for dragging remove check * chore: fix save * test: fix test case * chore: adjust range * test: add test case * test: coverage
1 parent ddaee15 commit b99fa96

File tree

12 files changed

+421
-131
lines changed

12 files changed

+421
-131
lines changed

assets/index.less

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@
7373
&-dragging&-dragging&-dragging {
7474
border-color: tint(@primary-color, 20%);
7575
box-shadow: 0 0 0 5px tint(@primary-color, 50%);
76+
77+
&-delete {
78+
opacity: 0;
79+
}
7680
}
7781

7882
&:focus {
@@ -186,11 +190,11 @@
186190
left: 5px;
187191
width: 4px;
188192
}
189-
193+
190194
&-track-draggable {
191-
border-top:0;
192-
border-bottom: 0;
195+
border-top: 0;
193196
border-right: 5px solid rgba(0, 0, 0, 0);
197+
border-bottom: 0;
194198
border-left: 5px solid rgba(0, 0, 0, 0);
195199
transform: translateX(-5px);
196200
}

docs/demo/editable.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
title: Multiple
3+
nav:
4+
title: Demo
5+
path: /demo
6+
---
7+
8+
<code src="../examples/editable.tsx"></code>

docs/examples/editable.tsx

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/* eslint react/no-multi-comp: 0, no-console: 0 */
2+
import Slider from 'rc-slider';
3+
import React from 'react';
4+
import '../../assets/index.less';
5+
6+
const style: React.CSSProperties = {
7+
width: 400,
8+
margin: 50,
9+
};
10+
11+
export default () => {
12+
const [value, setValue] = React.useState([0, 50, 80]);
13+
14+
return (
15+
<div>
16+
<div style={style}>
17+
<Slider
18+
// range
19+
range={{
20+
editable: true,
21+
}}
22+
track={false}
23+
min={0}
24+
max={100}
25+
value={value}
26+
// defaultValue={null}
27+
onChange={(nextValue) => {
28+
console.error('Change:', nextValue);
29+
setValue(nextValue as any);
30+
}}
31+
onChangeComplete={(nextValue) => {
32+
console.log('Complete', nextValue);
33+
}}
34+
styles={{
35+
rail: {
36+
background: `linear-gradient(to right, blue, red)`,
37+
},
38+
}}
39+
/>
40+
</div>
41+
</div>
42+
);
43+
};

docs/examples/multiple.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ const NodeWrapper = ({ children }: { children: React.ReactElement }) => {
1717
};
1818

1919
export default () => {
20-
const [value, setValue] = React.useState([0, 5, 8]);
20+
const [value, setValue] = React.useState([0, 50, 80]);
2121

2222
return (
2323
<div>
@@ -27,7 +27,7 @@ export default () => {
2727
// defaultValue={[0, 10, 30]}
2828
// onChange={log}
2929
min={0}
30-
max={10}
30+
max={100}
3131
value={value}
3232
onChange={(nextValue) => {
3333
// console.log('>>>', nextValue);

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
"@testing-library/react": "^12.1.3",
5252
"@types/classnames": "^2.2.9",
5353
"@types/jest": "^29.5.1",
54+
"@types/node": "^20.14.10",
5455
"@types/react": "^18.2.42",
5556
"@types/react-dom": "^18.0.11",
5657
"@umijs/fabric": "^4.0.1",

src/Handles/Handle.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ interface RenderProps {
1010
prefixCls: string;
1111
value: number;
1212
dragging: boolean;
13+
draggingDelete: boolean;
1314
}
1415

1516
export interface HandleProps
@@ -19,7 +20,9 @@ export interface HandleProps
1920
value: number;
2021
valueIndex: number;
2122
dragging: boolean;
23+
draggingDelete: boolean;
2224
onStartMove: OnStartMove;
25+
onDelete: (index: number) => void;
2326
onOffsetChange: (value: number | 'min' | 'max', valueIndex: number) => void;
2427
onFocus: (e: React.FocusEvent<HTMLDivElement>, index: number) => void;
2528
onMouseEnter: (e: React.MouseEvent<HTMLDivElement>, index: number) => void;
@@ -37,9 +40,11 @@ const Handle = React.forwardRef<HTMLDivElement, HandleProps>((props, ref) => {
3740
value,
3841
valueIndex,
3942
onStartMove,
43+
onDelete,
4044
style,
4145
render,
4246
dragging,
47+
draggingDelete,
4348
onOffsetChange,
4449
onChangeComplete,
4550
onFocus,
@@ -118,6 +123,11 @@ const Handle = React.forwardRef<HTMLDivElement, HandleProps>((props, ref) => {
118123
case KeyCode.PAGE_DOWN:
119124
offset = -2;
120125
break;
126+
127+
case KeyCode.BACKSPACE:
128+
case KeyCode.DELETE:
129+
onDelete(valueIndex);
130+
break;
121131
}
122132

123133
if (offset !== null) {
@@ -177,6 +187,7 @@ const Handle = React.forwardRef<HTMLDivElement, HandleProps>((props, ref) => {
177187
{
178188
[`${handlePrefixCls}-${valueIndex + 1}`]: valueIndex !== null && range,
179189
[`${handlePrefixCls}-dragging`]: dragging,
190+
[`${handlePrefixCls}-dragging-delete`]: draggingDelete,
180191
},
181192
classNames.handle,
182193
)}
@@ -197,6 +208,7 @@ const Handle = React.forwardRef<HTMLDivElement, HandleProps>((props, ref) => {
197208
prefixCls,
198209
value,
199210
dragging,
211+
draggingDelete,
200212
});
201213
}
202214

src/Handles/index.tsx

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export interface HandlesProps {
1212
onOffsetChange: (value: number | 'min' | 'max', valueIndex: number) => void;
1313
onFocus?: (e: React.FocusEvent<HTMLDivElement>) => void;
1414
onBlur?: (e: React.FocusEvent<HTMLDivElement>) => void;
15+
onDelete: (index: number) => void;
1516
handleRender?: HandleProps['render'];
1617
/**
1718
* When config `activeHandleRender`,
@@ -20,6 +21,7 @@ export interface HandlesProps {
2021
*/
2122
activeHandleRender?: HandleProps['render'];
2223
draggingIndex: number;
24+
draggingDelete: boolean;
2325
onChangeComplete?: () => void;
2426
}
2527

@@ -37,6 +39,7 @@ const Handles = React.forwardRef<HandlesRef, HandlesProps>((props, ref) => {
3739
handleRender,
3840
activeHandleRender,
3941
draggingIndex,
42+
draggingDelete,
4043
onFocus,
4144
...restProps
4245
} = props;
@@ -74,31 +77,38 @@ const Handles = React.forwardRef<HandlesRef, HandlesProps>((props, ref) => {
7477

7578
return (
7679
<>
77-
{values.map<React.ReactNode>((value, index) => (
78-
<Handle
79-
ref={(node) => {
80-
if (!node) {
81-
delete handlesRef.current[index];
82-
} else {
83-
handlesRef.current[index] = node;
84-
}
85-
}}
86-
dragging={draggingIndex === index}
87-
style={getIndex(style, index)}
88-
key={index}
89-
value={value}
90-
valueIndex={index}
91-
{...handleProps}
92-
/>
93-
))}
80+
{values.map<React.ReactNode>((value, index) => {
81+
const dragging = draggingIndex === index;
82+
83+
return (
84+
<Handle
85+
ref={(node) => {
86+
if (!node) {
87+
delete handlesRef.current[index];
88+
} else {
89+
handlesRef.current[index] = node;
90+
}
91+
}}
92+
dragging={dragging}
93+
draggingDelete={dragging && draggingDelete}
94+
style={getIndex(style, index)}
95+
key={index}
96+
value={value}
97+
valueIndex={index}
98+
{...handleProps}
99+
/>
100+
);
101+
})}
94102

103+
{/* Used for render tooltip, this is not a real handle */}
95104
{activeHandleRender && (
96105
<Handle
97106
key="a11y"
98107
{...handleProps}
99108
value={values[activeIndex]}
100109
valueIndex={null}
101110
dragging={draggingIndex !== -1}
111+
draggingDelete={draggingDelete}
102112
render={activeHandleRender}
103113
style={{ pointerEvents: 'none' }}
104114
tabIndex={null}

0 commit comments

Comments
 (0)