@@ -3,21 +3,29 @@ const initTagFilter = () => {
33
44 sections . forEach ( ( section ) => {
55 const filterContainer = section . querySelector ( "[data-tag-filter]" ) ;
6+ const supervisorFilterContainer = section . querySelector ( "[data-supervisor-filter]" ) ;
67 const cards = Array . from ( section . querySelectorAll ( ".project-card" ) ) ;
78
89 if ( ! cards . length ) return ;
910
1011 let activeTag = "all" ;
12+ let activeSupervisor = "all" ;
1113
12- const captureButtons = ( ) =>
14+ const captureTagButtons = ( ) =>
1315 Array . from ( section . querySelectorAll ( "[data-tag][data-filter-control]" ) ) ;
16+ const captureSupervisorButtons = ( ) =>
17+ Array . from ( section . querySelectorAll ( "[data-supervisor][data-supervisor-control]" ) ) ;
1418
15- const setActiveButtonState = ( tag ) => {
16- captureButtons ( ) . forEach ( ( btn ) => {
17- const isFilterButton = ! ! btn . closest ( "[data-tag-filter]" ) ;
19+ const setActiveButtonState = ( type , value ) => {
20+ const buttons = type === "supervisor" ? captureSupervisorButtons ( ) : captureTagButtons ( ) ;
21+ const containerSelector = type === "supervisor" ? "[data-supervisor-filter]" : "[data-tag-filter]" ;
22+ const dataKey = type === "supervisor" ? "supervisor" : "tag" ;
23+
24+ buttons . forEach ( ( btn ) => {
25+ const isFilterButton = ! ! btn . closest ( containerSelector ) ;
1826 if ( ! isFilterButton ) return ;
1927
20- if ( btn . dataset . tag === tag ) {
28+ if ( btn . dataset [ dataKey ] === value ) {
2129 btn . classList . add ( "is-active" ) ;
2230 btn . setAttribute ( "aria-pressed" , "true" ) ;
2331 } else {
@@ -27,13 +35,17 @@ const initTagFilter = () => {
2735 } ) ;
2836 } ;
2937
30- const applyFilter = ( tag ) => {
38+ const applyFilter = ( ) => {
3139 cards . forEach ( ( card ) => {
3240 const datasetTags = ( card . dataset . tags || "" )
3341 . split ( "," )
3442 . map ( ( t ) => t . trim ( ) )
3543 . filter ( Boolean ) ;
36- const matches = tag === "all" ? true : datasetTags . includes ( tag ) ;
44+ const datasetSupervisor = ( card . dataset . supervisor || "" ) . trim ( ) ;
45+ const matchesTag = activeTag === "all" ? true : datasetTags . includes ( activeTag ) ;
46+ const matchesSupervisor =
47+ activeSupervisor === "all" ? true : datasetSupervisor === activeSupervisor ;
48+ const matches = matchesTag && matchesSupervisor ;
3749 card . classList . toggle ( "is-hidden" , ! matches ) ;
3850 card . setAttribute ( "aria-hidden" , String ( ! matches ) ) ;
3951 } ) ;
@@ -42,24 +54,46 @@ const initTagFilter = () => {
4254 const handleTagSelection = ( tag , options = { } ) => {
4355 if ( ! tag || tag === activeTag ) return ;
4456 activeTag = tag ;
45- setActiveButtonState ( tag ) ;
46- applyFilter ( tag ) ;
57+ setActiveButtonState ( "tag" , tag ) ;
58+ applyFilter ( ) ;
4759
4860 if ( filterContainer && options . scrollToFilter ) {
4961 filterContainer . scrollIntoView ( { behavior : "smooth" , block : "start" } ) ;
5062 }
5163 } ;
5264
53- captureButtons ( ) . forEach ( ( button ) => {
54- button . addEventListener ( "click" , ( ) => {
65+ const handleSupervisorSelection = ( supervisor , options = { } ) => {
66+ if ( ! supervisor || supervisor === activeSupervisor ) return ;
67+ activeSupervisor = supervisor ;
68+ setActiveButtonState ( "supervisor" , supervisor ) ;
69+ applyFilter ( ) ;
70+
71+ if ( supervisorFilterContainer && options . scrollToFilter ) {
72+ supervisorFilterContainer . scrollIntoView ( { behavior : "smooth" , block : "start" } ) ;
73+ }
74+ } ;
75+
76+ captureTagButtons ( ) . forEach ( ( button ) => {
77+ button . addEventListener ( "click" , ( event ) => {
78+ event . preventDefault ( ) ;
5579 handleTagSelection ( button . dataset . tag , {
5680 scrollToFilter : button . dataset . scrollToFilter === "true" ,
5781 } ) ;
5882 } ) ;
5983 } ) ;
6084
61- setActiveButtonState ( activeTag ) ;
62- applyFilter ( activeTag ) ;
85+ captureSupervisorButtons ( ) . forEach ( ( button ) => {
86+ button . addEventListener ( "click" , ( event ) => {
87+ event . preventDefault ( ) ;
88+ handleSupervisorSelection ( button . dataset . supervisor , {
89+ scrollToFilter : button . dataset . scrollToFilter === "true" ,
90+ } ) ;
91+ } ) ;
92+ } ) ;
93+
94+ setActiveButtonState ( "tag" , activeTag ) ;
95+ setActiveButtonState ( "supervisor" , activeSupervisor ) ;
96+ applyFilter ( ) ;
6397 } ) ;
6498} ;
6599
0 commit comments