@@ -83,6 +83,15 @@ const sampleProjects = [
8383
8484 // Store the current projects array
8585 let currentProjects = [ ...sampleProjects ] ;
86+ let selectedTag = null ;
87+
88+ //Store all the unique tags
89+ const allTagSet = new Set ( ) ;
90+ sampleProjects . forEach ( project => {
91+ project . tags . forEach ( tag => allTagSet . add ( tag ) ) ;
92+ } )
93+
94+ const uniqueTags = Array . from ( allTagSet ) ;
8695
8796 // DOM elements
8897 const projectsContainer = document . getElementById ( 'projects-container' ) ;
@@ -95,13 +104,23 @@ const sampleProjects = [
95104 const resetFiltersBtn = document . getElementById ( 'reset-filters' ) ;
96105 const searchInput = document . getElementById ( 'search-input' ) ;
97106 const clearSearchBtn = document . getElementById ( 'clear-search' ) ;
107+ const tagFiltersContainer = document . querySelector ( '.tag-filters' ) ;
108+
109+ uniqueTags . forEach ( tag => {
110+ const button = document . createElement ( 'button' ) ;
111+ button . textContent = tag ;
112+ button . classList . add ( 'tag-filter-btn' )
113+ button . dataset . tag = tag
114+ tagFiltersContainer . appendChild ( button )
115+ } )
98116
99117 // Initialize the app
100118 function init ( ) {
101119 setTimeout ( ( ) => {
102120 hideLoading ( ) ;
103121 renderProjects ( currentProjects ) ;
104122 setupEventListeners ( ) ;
123+ initializeTagFilterListener ( ) ;
105124 } , 1000 ) ; // Simulate loading time
106125 }
107126
@@ -129,6 +148,28 @@ const sampleProjects = [
129148 } ) ;
130149 }
131150
151+ function initializeTagFilterListener ( ) {
152+ tagFiltersContainer . addEventListener ( 'click' , ( e ) => {
153+ if ( e . target . classList . contains ( 'tag-filter-btn' ) ) {
154+ const clickedTag = e . target . dataset . tag ;
155+
156+ // Toggle selection
157+ if ( selectedTag === clickedTag ) {
158+ selectedTag = null ;
159+ e . target . classList . remove ( 'active' ) ;
160+ } else {
161+ selectedTag = clickedTag ;
162+ // Remove active from all buttons
163+ document . querySelectorAll ( '.tag-filter-btn' ) . forEach ( btn => btn . classList . remove ( 'active' ) ) ;
164+ e . target . classList . add ( 'active' ) ;
165+ }
166+
167+ applyFilters ( ) ; // Re-apply filters based on tag
168+ }
169+ } ) ;
170+ }
171+
172+
132173 // Render projects
133174 function renderProjects ( projects ) {
134175 if ( projects . length === 0 ) {
@@ -248,6 +289,10 @@ const sampleProjects = [
248289 filtered = filtered . filter ( p => p . hasReadme ) ;
249290 }
250291
292+ if ( selectedTag ) {
293+ filtered = filtered . filter ( project => project . tags . includes ( selectedTag ) ) ;
294+ }
295+
251296 return filtered ;
252297 }
253298
@@ -288,6 +333,8 @@ const sampleProjects = [
288333 hasReadmeFilter . checked = false ;
289334 searchInput . value = '' ;
290335 clearSearchBtn . style . display = 'none' ;
336+ selectedTag = null ;
337+ document . querySelectorAll ( '.tag-filter-btn' ) . forEach ( btn => btn . classList . remove ( 'active' ) ) ;
291338 renderProjects ( sampleProjects ) ;
292339 }
293340
0 commit comments