@@ -74,7 +74,9 @@ export const Tasks = (
7474 setIsLoading : ( val : boolean ) => void ;
7575 }
7676) => {
77+ const [ uniqueTags , setUniqueTags ] = useState < string [ ] > ( [ ] ) ;
7778 const [ tasks , setTasks ] = useState < Task [ ] > ( [ ] ) ;
79+ const [ selectedTag , setSelectedTag ] = useState ( 'all' ) ;
7880 const [ uniqueProjects , setUniqueProjects ] = useState < string [ ] > ( [ ] ) ;
7981 const [ selectedProject , setSelectedProject ] = useState < string > ( 'all' ) ;
8082 const [ tempTasks , setTempTasks ] = useState < Task [ ] > ( [ ] ) ;
@@ -146,28 +148,43 @@ export const Tasks = (
146148 }
147149 } , [ _selectedTask ] ) ;
148150
151+
149152 useEffect ( ( ) => {
150- const fetchTasksForEmail = async ( ) => {
151- try {
152- const tasksFromDB = await db . tasks
153- . where ( 'email' )
154- . equals ( props . email )
155- . toArray ( ) ;
153+ const fetchTasksForEmail = async ( ) => {
154+ try {
155+ const tasksFromDB = await db . tasks
156+ . where ( 'email' )
157+ . equals ( props . email )
158+ . toArray ( ) ;
156159
157- setTasks ( sortTasksById ( tasksFromDB , 'desc' ) ) ;
158- setTempTasks ( sortTasksById ( tasksFromDB , 'desc' ) ) ;
160+ // Set all tasks
161+ setTasks ( sortTasksById ( tasksFromDB , 'desc' ) ) ;
162+ setTempTasks ( sortTasksById ( tasksFromDB , 'desc' ) ) ;
163+
164+
165+ const projectsSet = new Set ( tasksFromDB . map ( ( task ) => task . project ) ) ;
166+ const filteredProjects = Array . from ( projectsSet )
167+ . filter ( ( project ) => project !== '' )
168+ . sort ( ( a , b ) => ( a > b ? 1 : - 1 ) ) ;
169+ setUniqueProjects ( filteredProjects ) ;
170+
171+ // Extract unique tags
172+ const tagsSet = new Set (
173+ tasksFromDB . flatMap ( ( task ) => task . tags || [ ] )
174+ ) ;
175+ const filteredTags = Array . from ( tagsSet )
176+ . filter ( ( tag ) => tag !== '' )
177+ . sort ( ( a , b ) => ( a > b ? 1 : - 1 ) ) ;
178+ setUniqueTags ( filteredTags ) ;
179+
180+ } catch ( error ) {
181+ console . error ( 'Error fetching tasks:' , error ) ;
182+ }
183+ } ;
184+
185+ fetchTasksForEmail ( ) ;
186+ } , [ props . email ] ) ;
159187
160- const projectsSet = new Set ( tasksFromDB . map ( ( task ) => task . project ) ) ;
161- const filteredProjects = Array . from ( projectsSet )
162- . filter ( ( project ) => project !== '' )
163- . sort ( ( a , b ) => ( a > b ? 1 : - 1 ) ) ;
164- setUniqueProjects ( filteredProjects ) ;
165- } catch ( error ) {
166- console . error ( 'Error fetching tasks:' , error ) ;
167- }
168- } ;
169- fetchTasksForEmail ( ) ;
170- } , [ props . email ] ) ;
171188
172189 async function syncTasksWithTwAndDb ( ) {
173190 try {
@@ -330,33 +347,34 @@ export const Tasks = (
330347 tags : newTask . tags . filter ( ( tag ) => tag !== tagToRemove ) ,
331348 } ) ;
332349 } ;
333-
334- // useEffect to update tempTasks whenever selectedProject changes
335- useEffect ( ( ) => {
336- if ( selectedProject === 'all' ) {
337- setTempTasks ( tasks ) ;
338- } else {
339- const filteredTasks = tasks . filter (
340- ( task ) => task . project === selectedProject
341- ) ;
342- setTempTasks ( sortTasksById ( filteredTasks , 'desc' ) ) ;
343- }
344- } , [ selectedProject , tasks ] ) ;
350+ const handleTagChange = ( value : string ) => {
351+ setSelectedTag ( value ) ;
352+ } ;
345353
346354 const handleStatusChange = ( value : string ) => {
347355 setSelectedStatus ( value ) ;
348356 } ;
357+ useEffect ( ( ) => {
358+ let filteredTasks = tasks ;
359+
360+ // Project filter
361+ if ( selectedProject !== 'all' ) {
362+ filteredTasks = filteredTasks . filter (
363+ ( task ) => task . project === selectedProject
364+ ) ;
365+ }
366+
367+ // Tag filter
368+ if ( selectedTag && selectedTag !== 'all' ) {
369+ filteredTasks = filteredTasks . filter (
370+ ( task ) => task . tags && task . tags . includes ( selectedTag )
371+ ) ;
372+ }
373+
374+ // Sort + set
375+ setTempTasks ( sortTasksById ( filteredTasks , 'desc' ) ) ;
376+ } , [ selectedProject , selectedTag , tasks ] ) ;
349377
350- useEffect ( ( ) => {
351- if ( selectedStatus === 'all' ) {
352- setTempTasks ( tasks ) ;
353- } else {
354- const filteredTasks = tasks . filter (
355- ( task ) => task . status === selectedStatus
356- ) ;
357- setTempTasks ( sortTasksById ( filteredTasks , 'desc' ) ) ;
358- }
359- } , [ selectedStatus , tasks ] ) ;
360378
361379 const handleEditTagsClick = ( task : Task ) => {
362380 setEditedTags ( task . tags || [ ] ) ;
@@ -467,6 +485,22 @@ export const Tasks = (
467485 </ SelectGroup >
468486 </ SelectContent >
469487 </ Select >
488+ < Select onValueChange = { handleTagChange } >
489+ < SelectTrigger className = "w-[180px] hidden sm:flex mr-2" >
490+ < SelectValue placeholder = "Select a tag" />
491+ </ SelectTrigger >
492+ < SelectContent >
493+ < SelectGroup >
494+ < SelectLabel > Select Tag</ SelectLabel >
495+ < SelectItem value = "all" > All Tags</ SelectItem >
496+ { uniqueTags . map ( ( tag ) => (
497+ < SelectItem key = { tag } value = { tag } >
498+ { tag }
499+ </ SelectItem >
500+ ) ) }
501+ </ SelectGroup >
502+ </ SelectContent >
503+ </ Select >
470504 < div className = "pr-2" >
471505 < Dialog open = { isAddTaskOpen } onOpenChange = { setIsAddTaskOpen } >
472506 < DialogTrigger asChild >
0 commit comments