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