1
1
import React , { useEffect , useState , useMemo , useRef } from 'react' ;
2
2
import * as RadixSlider from '@radix-ui/react-slider' ;
3
- import * as Tooltip from '@radix-ui/react-tooltip' ;
4
3
import { isNil } from 'ramda' ;
5
4
6
5
import {
7
6
sanitizeMarks ,
8
7
calcStep ,
9
8
setUndefined ,
10
9
} from '../utils/computeSliderMarkers' ;
11
- import {
12
- formatSliderTooltip ,
13
- transformSliderTooltip ,
14
- } from '../utils/formatSliderTooltip' ;
15
10
import { snapToNearestMark } from '../utils/sliderSnapToMark' ;
16
11
import { renderSliderMarks , renderSliderDots } from '../utils/sliderRendering' ;
17
12
import LoadingElement from '../utils/_LoadingElement' ;
13
+ import { Tooltip } from '../utils/sliderTooltip' ;
18
14
import { RangeSliderProps } from '../types' ;
19
15
20
16
const MAX_MARKS = 500 ;
@@ -51,6 +47,7 @@ export default function RangeSlider(props: RangeSliderProps) {
51
47
// Track slider dimension (width for horizontal, height for vertical) for conditional input rendering
52
48
const [ sliderWidth , setSliderWidth ] = useState < number | null > ( null ) ;
53
49
const [ showInputs , setShowInputs ] = useState < boolean > ( value . length === 2 ) ;
50
+
54
51
const sliderRef = useRef < HTMLDivElement > ( null ) ;
55
52
56
53
// Handle initial mount - equivalent to componentWillMount
@@ -178,9 +175,8 @@ export default function RangeSlider(props: RangeSliderProps) {
178
175
processedMarks &&
179
176
typeof processedMarks === 'object'
180
177
) {
181
- adjustedValue = newValue . map ( val =>
182
- snapToNearestMark ( val , processedMarks )
183
- ) ;
178
+ const marks = processedMarks ;
179
+ adjustedValue = newValue . map ( val => snapToNearestMark ( val , marks ) ) ;
184
180
}
185
181
186
182
setValue ( adjustedValue ) ;
@@ -197,25 +193,6 @@ export default function RangeSlider(props: RangeSliderProps) {
197
193
}
198
194
} ;
199
195
200
- // Format tooltip content
201
- const formatTooltipContent = ( value : number , index : number ) => {
202
- let displayValue : string | number = value ;
203
- if ( tooltip ?. transform ) {
204
- displayValue = transformSliderTooltip ( tooltip . transform , value ) ;
205
- }
206
- return (
207
- < div
208
- id = { `${ id } -tooltip-${ index + 1 } -content` }
209
- style = { tooltip ?. style }
210
- >
211
- { formatSliderTooltip (
212
- tooltip ?. template || '{value}' ,
213
- displayValue
214
- ) }
215
- </ div >
216
- ) ;
217
- } ;
218
-
219
196
return (
220
197
< LoadingElement >
221
198
{ loadingProps => (
@@ -289,100 +266,73 @@ export default function RangeSlider(props: RangeSliderProps) {
289
266
className = "dash-slider-wrapper"
290
267
onClickCapture = { e => e . preventDefault ( ) } // prevent interactions from "clicking" the parent, particularly when slider is inside a label tag
291
268
>
292
- < Tooltip . Provider >
293
- < RadixSlider . Root
294
- ref = { sliderRef }
295
- className = { `dash-slider-root dash-range-slider-root ${
296
- renderedMarks ? 'has-marks' : ''
297
- } ${ className || '' } `. trim ( ) }
298
- style = { {
299
- position : 'relative' ,
300
- ...( vertical && {
301
- height : `${ verticalHeight } px` ,
302
- } ) ,
303
- } }
304
- value = { value }
305
- onValueChange = { handleValueChange }
306
- onValueCommit = { handleValueCommit }
307
- min = { minMaxValues . min_mark }
308
- max = { minMaxValues . max_mark }
309
- step = { stepValue }
310
- disabled = { disabled }
311
- orientation = {
312
- vertical ? 'vertical' : 'horizontal'
313
- }
314
- data-included = { included !== false }
315
- minStepsBetweenThumbs = {
316
- typeof pushable === 'number'
317
- ? pushable
318
- : undefined
319
- }
320
- >
321
- < RadixSlider . Track className = "dash-slider-track" >
322
- { included !== false && (
323
- < RadixSlider . Range className = "dash-slider-range" />
324
- ) }
325
- </ RadixSlider . Track >
326
- { renderedMarks &&
327
- renderSliderMarks (
328
- renderedMarks ,
329
- ! ! vertical ,
330
- minMaxValues ,
331
- ! ! dots
332
- ) }
333
- { dots &&
334
- stepValue &&
335
- renderSliderDots (
336
- stepValue ,
337
- minMaxValues ,
338
- ! ! vertical
339
- ) }
340
- { /* Render thumbs with tooltips for each value */ }
341
- { value . map ( ( val , index ) => {
342
- const thumbClassName = `dash-slider-thumb dash-slider-thumb-${
343
- index + 1
344
- } `;
345
-
346
- return tooltip ? (
347
- < Tooltip . Root
348
- key = { index }
349
- open = {
350
- tooltip . always_visible ||
351
- undefined
352
- }
353
- >
354
- < Tooltip . Trigger asChild >
355
- < RadixSlider . Thumb
356
- className = { thumbClassName }
357
- />
358
- </ Tooltip . Trigger >
359
- < Tooltip . Portal >
360
- < Tooltip . Content
361
- className = "dash-slider-tooltip"
362
- side = {
363
- vertical
364
- ? 'right'
365
- : 'top'
366
- }
367
- align = "center"
368
- >
369
- { formatTooltipContent (
370
- val ,
371
- index
372
- ) }
373
- < Tooltip . Arrow />
374
- </ Tooltip . Content >
375
- </ Tooltip . Portal >
376
- </ Tooltip . Root >
377
- ) : (
378
- < RadixSlider . Thumb
379
- key = { index }
380
- className = { thumbClassName }
381
- />
382
- ) ;
383
- } ) }
384
- </ RadixSlider . Root >
385
- </ Tooltip . Provider >
269
+ < RadixSlider . Root
270
+ ref = { sliderRef }
271
+ className = { `dash-slider-root ${
272
+ renderedMarks ? 'has-marks' : ''
273
+ } ${ className || '' } `. trim ( ) }
274
+ style = { {
275
+ ...( vertical && {
276
+ height : `${ verticalHeight } px` ,
277
+ } ) ,
278
+ } }
279
+ value = { value }
280
+ onValueChange = { handleValueChange }
281
+ onValueCommit = { handleValueCommit }
282
+ min = { minMaxValues . min_mark }
283
+ max = { minMaxValues . max_mark }
284
+ step = { stepValue }
285
+ disabled = { disabled }
286
+ orientation = { vertical ? 'vertical' : 'horizontal' }
287
+ data-included = { included !== false }
288
+ minStepsBetweenThumbs = {
289
+ typeof pushable === 'number'
290
+ ? pushable
291
+ : undefined
292
+ }
293
+ >
294
+ < RadixSlider . Track className = "dash-slider-track" >
295
+ { included !== false && (
296
+ < RadixSlider . Range className = "dash-slider-range" />
297
+ ) }
298
+ </ RadixSlider . Track >
299
+ { renderedMarks &&
300
+ renderSliderMarks (
301
+ renderedMarks ,
302
+ ! ! vertical ,
303
+ minMaxValues ,
304
+ ! ! dots
305
+ ) }
306
+ { dots &&
307
+ stepValue &&
308
+ renderSliderDots (
309
+ stepValue ,
310
+ minMaxValues ,
311
+ ! ! vertical
312
+ ) }
313
+ { /* Render thumbs with tooltips for each value */ }
314
+ { value . map ( ( val , index ) => {
315
+ const thumbClassName = `dash-slider-thumb dash-slider-thumb-${
316
+ index + 1
317
+ } `;
318
+
319
+ return (
320
+ < RadixSlider . Thumb
321
+ key = { 'thumb' + index }
322
+ className = { thumbClassName }
323
+ >
324
+ { tooltip && (
325
+ < Tooltip
326
+ id = { id }
327
+ index = { index }
328
+ value = { val }
329
+ tooltip = { tooltip }
330
+ />
331
+ ) }
332
+ </ RadixSlider . Thumb >
333
+ ) ;
334
+ } ) }
335
+ </ RadixSlider . Root >
386
336
</ div >
387
337
{ showInputs && ! vertical && (
388
338
< input
0 commit comments