Skip to content

Commit 9d02022

Browse files
authored
Updated tags based filter (#115)
* Updated tags based filter * Removed duplicacy * WIP: Committing local changes to clean up workspace before merge.
1 parent bfeadb0 commit 9d02022

3 files changed

Lines changed: 124 additions & 55 deletions

File tree

frontend/package-lock.json

Lines changed: 47 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@
279279
"react-remove-scroll": "^2.5.5",
280280
"react-remove-scroll-bar": "^2.3.4",
281281
"react-router": "^6.23.1",
282-
"react-router-dom": "^6.23.1",
282+
"react-router-dom": "^6.30.1",
283283
"react-style-singleton": "^2.2.1",
284284
"react-toastify": "^10.0.5",
285285
"read-cache": "^1.0.0",
@@ -383,6 +383,7 @@
383383
"@types/lodash.debounce": "^4.0.9",
384384
"@types/react-copy-to-clipboard": "^5.0.7",
385385
"@types/react-dom": "^18.3.0",
386+
"@types/react-router-dom": "^5.3.3",
386387
"@vitejs/plugin-react": "^4.3.0",
387388
"identity-obj-proxy": "^3.0.0",
388389
"intersection-observer": "^0.12.2",

frontend/src/components/HomeComponents/Tasks/Tasks.tsx

Lines changed: 75 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)