Add src/components/FilterPanel.tsx
This commit is contained in:
112
src/components/FilterPanel.tsx
Normal file
112
src/components/FilterPanel.tsx
Normal file
@@ -0,0 +1,112 @@
|
||||
'use client';
|
||||
|
||||
import { useApp } from './AppProvider';
|
||||
|
||||
export default function FilterPanel() {
|
||||
const {
|
||||
filterStatus, setFilterStatus, filterPriority, setFilterPriority,
|
||||
filterDueBefore, setFilterDueBefore, filterDueAfter, setFilterDueAfter,
|
||||
filterCompleted, setFilterCompleted, refreshTasks,
|
||||
} = useApp();
|
||||
|
||||
const handleApply = () => {
|
||||
refreshTasks();
|
||||
};
|
||||
|
||||
const handleReset = () => {
|
||||
setFilterStatus('');
|
||||
setFilterPriority('');
|
||||
setFilterDueBefore('');
|
||||
setFilterDueAfter('');
|
||||
setFilterCompleted('');
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="bg-card border-b border-border px-4 py-3 animate-slide-in">
|
||||
<div className="flex flex-wrap items-center gap-4">
|
||||
{/* Status */}
|
||||
<div>
|
||||
<label className="block text-xs text-text-secondary mb-1">Status</label>
|
||||
<select
|
||||
value={filterStatus}
|
||||
onChange={(e) => setFilterStatus(e.target.value)}
|
||||
className="bg-content border border-border rounded px-2 py-1.5 text-sm focus:outline-none focus:border-accent"
|
||||
>
|
||||
<option value="">All</option>
|
||||
<option value="todo">Todo</option>
|
||||
<option value="in_progress">In Progress</option>
|
||||
<option value="done">Done</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
{/* Priority */}
|
||||
<div>
|
||||
<label className="block text-xs text-text-secondary mb-1">Priority</label>
|
||||
<select
|
||||
value={filterPriority}
|
||||
onChange={(e) => setFilterPriority(e.target.value)}
|
||||
className="bg-content border border-border rounded px-2 py-1.5 text-sm focus:outline-none focus:border-accent"
|
||||
>
|
||||
<option value="">All</option>
|
||||
<option value="urgent">🔴 Urgent</option>
|
||||
<option value="high">🟠 High</option>
|
||||
<option value="medium">🟡 Medium</option>
|
||||
<option value="low">🟢 Low</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
{/* Due before */}
|
||||
<div>
|
||||
<label className="block text-xs text-text-secondary mb-1">Due before</label>
|
||||
<input
|
||||
type="date"
|
||||
value={filterDueBefore}
|
||||
onChange={(e) => setFilterDueBefore(e.target.value)}
|
||||
className="bg-content border border-border rounded px-2 py-1.5 text-sm focus:outline-none focus:border-accent"
|
||||
/>
|
||||
</div>
|
||||
|
||||
{/* Due after */}
|
||||
<div>
|
||||
<label className="block text-xs text-text-secondary mb-1">Due after</label>
|
||||
<input
|
||||
type="date"
|
||||
value={filterDueAfter}
|
||||
onChange={(e) => setFilterDueAfter(e.target.value)}
|
||||
className="bg-content border border-border rounded px-2 py-1.5 text-sm focus:outline-none focus:border-accent"
|
||||
/>
|
||||
</div>
|
||||
|
||||
{/* Completed */}
|
||||
<div>
|
||||
<label className="block text-xs text-text-secondary mb-1">Completed</label>
|
||||
<select
|
||||
value={filterCompleted}
|
||||
onChange={(e) => setFilterCompleted(e.target.value)}
|
||||
className="bg-content border border-border rounded px-2 py-1.5 text-sm focus:outline-none focus:border-accent"
|
||||
>
|
||||
<option value="">All</option>
|
||||
<option value="true">Completed</option>
|
||||
<option value="false">Not completed</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
{/* Actions */}
|
||||
<div className="flex gap-2 ml-auto">
|
||||
<button
|
||||
onClick={handleReset}
|
||||
className="px-3 py-1.5 text-sm text-text-secondary hover:text-text-primary transition-colors"
|
||||
>
|
||||
Reset
|
||||
</button>
|
||||
<button
|
||||
onClick={handleApply}
|
||||
className="px-4 py-1.5 bg-accent hover:bg-accent-hover text-white rounded text-sm transition-colors"
|
||||
>
|
||||
Apply
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user