Skip to content

Commit 15aa46f

Browse files
author
赵汝波
committed
Enhance task filtering with date range support and UI improvements
- Completed the implementation of date range filtering for tasks, allowing users to filter by `updatedAt` within specified dates. - Updated the project plan to reflect the completion of advanced search and filtering features. - Added new date input fields in the TasksView component for user-friendly date selection. - Integrated date range functionality into the task query logic, ensuring seamless filtering based on user input. - Enhanced UI components to support date range selection and improved overall user experience.
1 parent e660123 commit 15aa46f

9 files changed

Lines changed: 336 additions & 17 deletions

File tree

PROJECT_PLAN.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
## 本周重点
2323

24-
- [~] `P0` 完成任务高级搜索与筛选第一版(后端+URL+UI 已完成,剩日期筛选
24+
- [x] `P0` 完成任务高级搜索与筛选第一版(含按更新时间日期范围 + 筛选标签
2525
- [~] `P0` 引入更适合 SaaS 风格的 UI 组件体系(App Shell 已上,持续补组件)
2626
- [ ] `P1` 新增 1-2 个可展示模块/页面
2727
- [x] `P1` 梳理并落地 ACL 权限设计第一版
@@ -78,23 +78,23 @@
7878
- [x] `P0` 设计筛选参数:`keyword`
7979
- [x] `P0` 设计筛选参数:`status`
8080
- [x] `P0` 设计筛选参数:`projectId`
81-
- [ ] `P0` 设计筛选参数:`dateFrom`
82-
- [ ] `P0` 设计筛选参数:`dateTo`
81+
- [x] `P0` 设计筛选参数:`dateFrom`
82+
- [x] `P0` 设计筛选参数:`dateTo`
8383
- [x] `P0` 设计排序参数:`sort`
8484
- [x] `P0` 抽离统一服务端查询函数
85-
- [ ] `P1` 为查询补充 Prisma 索引
85+
- [x] `P1` 为查询补充 Prisma 索引`Task.userId + updatedAt`
8686

8787
### 前端交互
8888

8989
- [x] `P0``/tasks` 顶部增加筛选条
9090
- [x] `P0` 支持关键词搜索
9191
- [x] `P0` 支持状态筛选
9292
- [x] `P0` 支持项目筛选
93-
- [ ] `P1` 支持日期范围筛选
93+
- [x] `P1` 支持日期范围筛选(按 `updatedAt`,UTC 日界;快捷:近 7 / 30 天)
9494
- [x] `P1` 支持 URL 参数同步
9595
- [x] `P1` 支持刷新后保留筛选状态
9696
- [x] `P1` 增加“清空筛选”
97-
- [ ] `P2` 增加“当前筛选条件标签”
97+
- [x] `P2` 增加“当前筛选条件标签”(可单独移除)
9898

9999
---
100100

@@ -212,4 +212,6 @@
212212
- [x] Sidebar + CommandMenu 新增 Insights 入口
213213
- [x] ACL 第一版:`can()` / `assertCan()`,覆盖 Server Actions 与页面鉴权
214214
- [x] Vitest 覆盖 ACL 规则(8 项通过)
215+
- [x] 对标 Linear:`dateFrom`/`dateTo` + 筛选 Chips + `@@index([userId, updatedAt])`
216+
- [x] Vitest:`date-query` 日历与区间(parse / normalize / filter)
215217

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- CreateIndex
2+
CREATE INDEX "Task_userId_updatedAt_idx" ON "Task"("userId", "updatedAt");

prisma/schema.prisma

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,6 @@ model Task {
4646
project Project? @relation(fields: [projectId], references: [id], onDelete: SetNull)
4747
createdAt DateTime @default(now())
4848
updatedAt DateTime @updatedAt
49+
50+
@@index([userId, updatedAt])
4951
}

src/app/projects/[id]/page.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ export default async function ProjectDetailPage({
8080
status: "all",
8181
projectId: project.id,
8282
sort: "updated_desc",
83+
dateFrom: "",
84+
dateTo: "",
8385
}}
8486
/>
8587
</main>

src/app/tasks/page.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { auth } from "@/auth";
22
import { CreateTaskSheet } from "@/components/create-task-sheet";
33
import { TasksView } from "@/components/tasks-view";
4+
import { normalizeDateRange, parseYmdParam } from "@/lib/date-query";
45
import { prisma } from "@/lib/db";
56
import { getTasksForUser, type TaskQuery, type TaskSort } from "@/lib/tasks-data";
67
import type { TaskListItem, TaskStatus } from "@/types/task";
@@ -40,7 +41,11 @@ function parseTaskQuery(
4041
? (rawSort as TaskSort)
4142
: undefined;
4243

43-
return { keyword, status, projectId, sort };
44+
const rawFrom = parseYmdParam(pickFirst(sp.dateFrom));
45+
const rawTo = parseYmdParam(pickFirst(sp.dateTo));
46+
const { dateFrom, dateTo } = normalizeDateRange(rawFrom, rawTo);
47+
48+
return { keyword, status, projectId, sort, dateFrom, dateTo };
4449
}
4550

4651
export default async function TasksPage({
@@ -86,7 +91,7 @@ export default async function TasksPage({
8691
我的任务
8792
</h1>
8893
<p className="mt-2 text-sm text-zinc-500">
89-
服务端筛选 + URL 同步,刷新后保留条件
94+
关键词、状态、项目、排序与「更新时间」日期范围;条件写入 URL,刷新不丢
9095
</p>
9196
</div>
9297
<CreateTaskSheet projects={projects} />
@@ -108,6 +113,8 @@ export default async function TasksPage({
108113
status: (query.status as string) ?? "all",
109114
projectId: (query.projectId as string) ?? "all",
110115
sort: query.sort ?? "updated_desc",
116+
dateFrom: query.dateFrom ?? "",
117+
dateTo: query.dateTo ?? "",
111118
}}
112119
/>
113120
</Suspense>

0 commit comments

Comments
 (0)