39 lines
1021 B
TypeScript
39 lines
1021 B
TypeScript
import { Task, TaskPriority, TaskStatus } from "@/model/task";
|
|
|
|
export type TaskFilter = {
|
|
statuses?: TaskStatus[];
|
|
priorities?: TaskPriority[];
|
|
query?: string;
|
|
tags?: string[];
|
|
};
|
|
|
|
export function filterTasks(tasks: Task[], filter: TaskFilter): Task[] {
|
|
const statuses = filter.statuses;
|
|
const priorities = filter.priorities;
|
|
const tags = filter.tags;
|
|
const query = filter.query?.trim().toLowerCase() ?? "";
|
|
|
|
return tasks.filter((task) => {
|
|
if (statuses && statuses.length > 0 && !statuses.includes(task.status)) {
|
|
return false;
|
|
}
|
|
if (
|
|
priorities &&
|
|
priorities.length > 0 &&
|
|
!priorities.includes(task.priority)
|
|
) {
|
|
return false;
|
|
}
|
|
if (tags && tags.length > 0) {
|
|
const hasAll = tags.every((tag) => task.tags.includes(tag));
|
|
if (!hasAll) return false;
|
|
}
|
|
if (query) {
|
|
const inTitle = task.title.toLowerCase().includes(query);
|
|
const inDescription = task.description.toLowerCase().includes(query);
|
|
if (!inTitle && !inDescription) return false;
|
|
}
|
|
return true;
|
|
});
|
|
}
|