1+ import React , { useState } from 'react' ;
2+ import { Slider } from "@/components/ui/slider" ;
3+ import { Settings } from 'lucide-react' ;
4+
5+ interface GraphMenuProps {
6+ maxValue : number ;
7+ value : number ;
8+ onChange : ( value : number ) => void ;
9+ uniqueStudentMode : boolean ;
10+ // Optional props for sequence filter checkbox
11+ showSlider ?: boolean ;
12+ showSequenceFilter ?: boolean ;
13+ showOnlySequenceStudents ?: boolean ;
14+ onSequenceFilterChange ?: ( value : boolean ) => void ;
15+ }
16+
17+ const GraphMenu : React . FC < GraphMenuProps > = ( {
18+ maxValue,
19+ value,
20+ onChange,
21+ uniqueStudentMode,
22+ showSlider = true ,
23+ showSequenceFilter = false ,
24+ showOnlySequenceStudents = true ,
25+ onSequenceFilterChange
26+ } ) => {
27+ const [ isOpen , setIsOpen ] = useState ( false ) ;
28+
29+ const handleSliderChange = ( newValue : number [ ] ) => {
30+ onChange ( newValue [ 0 ] ) ;
31+ } ;
32+
33+ return (
34+ < div className = "absolute top-2 left-2 z-10" >
35+ < button
36+ onClick = { ( ) => setIsOpen ( ! isOpen ) }
37+ className = "w-8 h-8 flex items-center justify-center bg-white border border-gray-300 rounded shadow-sm hover:bg-gray-50 transition-colors"
38+ title = "Graph Settings"
39+ >
40+ < Settings className = "w-4 h-4 text-gray-700" />
41+ </ button >
42+
43+ { isOpen && (
44+ < div className = "absolute top-10 left-0 w-64 bg-white border border-gray-300 rounded-lg shadow-lg p-4" >
45+ { showSequenceFilter && onSequenceFilterChange && (
46+ < div className = "mb-4" >
47+ < label className = "flex items-center cursor-pointer" >
48+ < input
49+ type = "checkbox"
50+ checked = { showOnlySequenceStudents }
51+ onChange = { ( e ) => onSequenceFilterChange ( e . target . checked ) }
52+ className = "w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500"
53+ />
54+ < span className = "ml-2 text-xs font-medium text-gray-700" >
55+ Include only students on this path in edge counts
56+ </ span >
57+ </ label >
58+ </ div >
59+ ) }
60+
61+ { showSlider && (
62+ < >
63+ < div className = "flex justify-between items-center mb-3" >
64+ < span className = "text-sm font-medium text-gray-700" >
65+ Min { uniqueStudentMode ? 'Students' : 'Visits' }
66+ </ span >
67+ < span className = "text-sm font-semibold text-gray-900" > { value } </ span >
68+ </ div >
69+ < Slider
70+ min = { 0 }
71+ max = { maxValue }
72+ step = { 1 }
73+ value = { [ value ] }
74+ onValueChange = { handleSliderChange }
75+ className = "w-full"
76+ />
77+ < div className = "flex justify-between text-xs text-gray-500 mt-2" >
78+ < span > 0</ span >
79+ < span > { maxValue } </ span >
80+ </ div >
81+ </ >
82+ ) }
83+ </ div >
84+ ) }
85+ </ div >
86+ ) ;
87+ } ;
88+
89+ export default GraphMenu ;
0 commit comments