41 lines
1.6 KiB
TypeScript
41 lines
1.6 KiB
TypeScript
import { type Component, For, createMemo } from "solid-js";
|
|
import { store, calculateUrgencyScore, getCombinedScore } from "@/store";
|
|
import { TaskCard } from "@/components/TaskCard";
|
|
|
|
export const UrgencyView: Component = () => {
|
|
const sortedTasks = createMemo(() => {
|
|
return [...store.tasks].filter(t => !t.deletedAt).sort((a, b) => {
|
|
if (a.completed !== b.completed) return a.completed ? 1 : -1;
|
|
const uA = calculateUrgencyScore(a.dueDate);
|
|
const uB = calculateUrgencyScore(b.dueDate);
|
|
if (uA !== uB) return uB - uA;
|
|
// Tie-break with combined score (Priority + Tags)
|
|
return getCombinedScore(b) - getCombinedScore(a);
|
|
});
|
|
});
|
|
|
|
return (
|
|
<div class="space-y-6">
|
|
<header>
|
|
<h2 class="text-3xl font-bold tracking-tight">Time</h2>
|
|
<p class="text-muted-foreground mt-1 text-lg">Your tasks ordered by deadline.</p>
|
|
</header>
|
|
|
|
<div class="grid gap-3">
|
|
<For each={sortedTasks()}>
|
|
{(task) => <TaskCard task={task} />}
|
|
</For>
|
|
</div>
|
|
|
|
{sortedTasks().length === 0 && (
|
|
<div class="flex flex-col items-center justify-center py-20 text-center">
|
|
<div class="w-16 h-16 bg-muted rounded-full flex items-center justify-center mb-4">
|
|
<span class="text-2xl">⏳</span>
|
|
</div>
|
|
<p class="text-muted-foreground">All clear. No time-sensitive tasks.</p>
|
|
</div>
|
|
)}
|
|
</div>
|
|
);
|
|
};
|