feat(business): update audit, auth, course-plans, announcements, exams

- audit: update retention.ts, types.ts, audit-retention-settings.tsx

- auth: update actions.ts and types.ts

- course-plans: update actions.ts, course-plan-detail.tsx, template-picker-dialog.tsx,

  add lib/track-event.ts

- announcements: update page.tsx, announcement-list.tsx, announcement-pagination.tsx

- exams: update actions.ts
This commit is contained in:
SpecialX
2026-07-04 10:23:03 +08:00
parent b63d116b6c
commit 98429e87eb
13 changed files with 114 additions and 61 deletions

View File

@@ -35,14 +35,11 @@ export default async function AnnouncementsPage({
PAGE_SIZE
)
// 构建分页 URL保留 ?status= 过滤参数(与 AnnouncementList 的过滤机制一致)
const buildPageHref = (targetPage: number): string => {
const params = new URLSearchParams()
if (sp.status) params.set("status", sp.status)
if (targetPage > 1) params.set("page", String(targetPage))
const qs = params.toString()
return qs ? `/announcements?${qs}` : "/announcements"
}
// v3: 不再将 buildPageHref 函数传给 Client ComponentServer Component 不能传函数)。
// 改为传 basePath + statusFilter由 AnnouncementPagination 在客户端自行构建 URL。
const statusFilter = sp.status === "published" || sp.status === "draft" || sp.status === "archived"
? sp.status
: "all"
return (
<AnnouncementsServiceProvider>
@@ -56,12 +53,13 @@ export default async function AnnouncementsPage({
<AnnouncementList
announcements={items}
detailHrefPrefix="/announcements"
initialStatus={sp.status === "published" || sp.status === "draft" || sp.status === "archived" ? sp.status : "all"}
initialStatus={statusFilter}
pagination={{
page: currentPage,
pageSize,
total,
buildPageHref,
basePath: "/announcements",
statusFilter,
}}
/>
</div>