1ca4a4d185
fix(archive): serve student attachments securely
...
Download attachments through authenticated API requests, support configurable upload paths, validate resolved file locations, and retain compatibility with legacy stored paths.
2026-07-10 14:11:47 +08:00
55881863c1
feat(sync): sync class schedules to DingTalk students
...
Group active schedules by class, resolve enrolled students through DingTalk mappings, reuse shifts and attendance groups, and expose class-based sync status in the admin UI.
2026-07-10 14:11:39 +08:00
bc6b8b0095
fix: 修复入住管理白屏、重构首页工作台、拍平教务菜单
...
- Occupancies: 补齐缺失的 Alert import(渲染时 ReferenceError 导致白屏),
并为两处 api.get 补泛型消除既有类型错误
- Dashboard: 改为待办优先的工作台(待办异常区 + 核心 KPI + 更多指标折叠 +
图表按重要性重排),修复 fetchData 无限请求循环(loadedRef),
重活图表用 IntersectionObserver(callback ref)懒加载
- MainLayout: 将三层嵌套的"教室管理"提升为一级菜单,全站菜单统一为两层
2026-07-10 11:16:30 +08:00
18060d44a8
fix: pass user name and mobile to backend when importing students
2026-07-10 09:50:45 +08:00
97c2ceccde
fix: re-apply UX fixes on Bills, Expenses, Deposits
...
- Add Empty component to antd imports
- Replace console.error with message.error in catch blocks
- Add batchLoading state + guard on batch operations
- Add locale emptyText to Tables
2026-07-09 19:57:10 +08:00
8f28c172c4
fix: close unclosed fragments in Expenses/Deposits, fix brace in Bills
2026-07-09 19:52:33 +08:00
bc2ff2b270
fix: brace mismatch in Classes fetchData try/catch/finally
2026-07-09 19:49:21 +08:00
c59fd6ce92
fix(admin): UX improvements — silent fetch failures, empty states, batch loading guards, dashboard refresh
...
- Replace console.error-only catches with message.error user-facing notifications
across Bills, Classes, ClassroomRentals, ClassroomSchedule, Classrooms, Deposits,
Expenses, OperationLogs, Permissions, Roles, RoomVisual, Rooms, Students,
Tenants, Users
- Add Empty component via Table locale prop on list pages: Bills, Classes,
ClassroomRentals, Classrooms, Deposits, Expenses (room+personal), Occupancies,
Rooms, Students, Tenants, Roles
- Add batchLoading state to batch delete/update operations: Bills (batchDelete,
batchUpdateStatus), Expenses (batchDeleteRoom, batchDeletePersonal),
Occupancies (batchCheckOut, batchDelete), Rooms (batchDelete),
Students (batchDelete)
- Add refreshLoading indicator to Dashboard header when re-fetching data
- Consistent error pattern: catch (e: unknown) { const err = e as { message?: string }; message.error(...); }
2026-07-09 18:03:42 +08:00
b0f7883f33
feat(admin): remove all department/campus scoping from frontend
...
- Delete CampusSwitcher component and useCampus hook
- Delete Departments page and its route
- Remove campus header interceptor from API client
- Remove departmentId from Class interfaces
- Remove campusLocation from student profile
- Remove department permissions from test fixtures
- Remove currentCampusId from test cleanup
TypeScript compiles clean.
2026-07-09 17:40:57 +08:00
22bc1876d8
refactor: remove departmentId from Class entity
2026-07-09 17:32:37 +08:00
9b7a8e37b4
fix: resolve 5 review findings
...
Critical 1: Remove broken '钉钉绑定' tab (IntegConfig) — deleted /rbac/user-ding-mappings calls
Critical 2: Fix decorator placement in CreateClassDto — @IsOptional @IsArray restored to teachers
Important 1: Restore sync.service.spec.ts from 1fa3363 , strip importDingTalkUsers tests
Important 2: Fix N+1 in batchImportStudents — batched find/save with In() operator
Important 3: Add migrate-student-ding-mapping.sql
2026-07-09 17:25:44 +08:00
1f63a53222
feat: rewrite sync drawer with checkable tree + class batch import
2026-07-09 17:16:08 +08:00
c1d065a5e6
fix(students): remove staff role from status map
2026-07-09 16:32:02 +08:00
5145c3e4b4
fix(layout): use controlled sidebar openKeys to preserve manual expand/collapse across navigation
2026-07-09 16:31:56 +08:00
d1d5b4681b
feat(schedules): replace teacher ID input with searchable user select, show teacher name, add schedule button
2026-07-09 16:31:53 +08:00
7e4f06058c
fix(admin): match flat API response shape, no nested data envelope
2026-07-09 15:52:40 +08:00
2da2e68318
fix(admin): refactor inline map arrow to avoid oxc TSX parser confusion
2026-07-09 15:46:24 +08:00
d2d0ca31ad
fix(admin): use type pattern consistent with rest of codebase (oxc compat)
2026-07-09 15:43:46 +08:00
867e1aab1f
fix(admin): avoid TSX generic syntax to fix oxc parser in Vite 8
2026-07-09 15:41:30 +08:00
8bfb8bf7ae
fix(admin): fix syntax error — missing closing parens in map after console.log removal
2026-07-09 15:39:03 +08:00
b624c52b30
fix(admin): restore nested ImportUsersResponse and remove debug console.log
2026-07-09 15:24:54 +08:00
f7df3bdcf1
fix(admin): only show class-mark button on leaf departments with users
2026-07-09 15:18:23 +08:00
db3e4aae84
fix(admin): display classCount and warnings in import response
2026-07-09 13:01:07 +08:00
7f42c12392
feat(admin): add class marking modal in DingTalk org import drawer
2026-07-09 12:41:29 +08:00
e90f73cb60
fix: broken Form.Item tag in check-in room select
2026-07-09 12:19:04 +08:00
74e6171e17
feat: add bed occupancy stats to RoomVisual cards and API
2026-07-09 12:18:30 +08:00
ba94a0e091
feat: add bed/locker selection to check-in form and occupancy table
2026-07-09 12:16:51 +08:00
5700fa556b
fix: restore RoomPage component wrapper and fix action column
2026-07-09 12:13:19 +08:00
e572f92017
feat: upgrade Room detail to Drawer with Bed/Locker tabs
2026-07-09 12:08:06 +08:00
454a0d24c6
fix: release beds/lockers in batchCheckOut
...
The batchCheckOut method was not releasing assigned beds and lockers
after checkout, leaving them orphaned as 'occupied'. Added the same
release pattern used in checkOut() — using runner.manager.update()
since batchCheckOut operates inside a QueryRunner transaction.
2026-07-09 12:05:36 +08:00
fb8c897b4f
fix: disable import button when roles not loaded (null defaultTeacherRoleId guard)
2026-07-09 11:32:01 +08:00
0cfdab95ee
fix: add DTO validation, transactional imports, role-not-found handling, null role guard
2026-07-09 11:28:11 +08:00
33e6cb445c
fix: parallel fetches, error handling, extract UserTreeNode component
2026-07-09 11:16:47 +08:00
a42039d1df
feat: add sync users Tab with Drawer tree to IntegrationConfig
2026-07-09 11:13:05 +08:00
3790b2dabb
refactor: remove sync and mark-staff buttons from Users page
2026-07-09 11:06:58 +08:00
e8dec3b171
feat: add DingTalk integration config page
2026-07-09 10:14:51 +08:00
7df7695073
fix: missing '>' in header div tag on Users page
2026-07-09 10:11:07 +08:00
903f090293
feat: add staff status filter in student management
2026-07-09 10:07:51 +08:00
e20e22fc65
feat: add mark-staff/restore-student buttons in user management
2026-07-09 10:07:34 +08:00
42d3f0e27f
feat: DingTalk attendance import + integration config + expense types + UI polish
...
Server:
- Add DingTalk attendance import service with SSE progress streaming
- Add IntegrationConfig entity & module for multi-tenant DingTalk setup
- Add ExpenseType entity & ExpenseTypesModule
- Add SeedModule for DB initialization
- Add UserDingMapping entity for DingTalk user linkage
- Attendance service: import flow with dedup & student auto-mapping
- Rooms service: time-range overlap queries
- Sync controller/service: DingTalk integration wiring
- Permission guard: refactor to pure re-export
- Campus scope middleware: tenant-aware filtering
Admin UI:
- Attendance page: import UI with progress & result summary
- All pages: tableStyle/tablePagination standardization
- Login page: responsive styling
- Sensitive data: useViewSensitive hook for masked viewing
- Vite config: path aliases, build optimization
- Test infra: vitest config, test utilities
Docs: PRD DingTalk batch 1 & 2 design docs
2026-07-09 09:11:56 +08:00
a7cb2865a9
fix: update StudentProfileContent report buttons to use /report-html, remove dead /report references
2026-07-07 10:03:19 +08:00
6e6dd25dc1
feat: change report button to preview in new window
2026-07-07 09:53:39 +08:00
24126ab3a9
fix: adjust Students table scroll.x to match total column width
2026-07-07 09:40:52 +08:00
693ba5d3b8
feat: complete remaining PRD tasks — RBAC nodes and staff split, schedule month view, auto-generate attendance from schedules, plus fix TypeORM name
2026-07-06 18:10:14 +08:00
5ea49d0a9e
feat(classes): add schedule and attendance-summary endpoints + frontend tabs
...
- Add GET /classes/:id/schedule returning ClassSchedule list with classroom name
- Add GET /classes/:id/attendance-summary returning attendance/absence/late rates
- Add 课表 and 出勤汇总 tabs to Classes detail page
- Register ClassSchedule and AttendanceRecord in ClassesModule
2026-07-06 17:48:19 +08:00
85872d6564
refactor(admin): extract StudentProfileContent component and reuse in drawer
2026-07-06 17:22:09 +08:00
b8563fbde0
fix: use div wrapper for Drawer content
2026-07-06 17:01:17 +08:00
edb80b7fb2
fix: wrap Drawer content in fragment
2026-07-06 17:00:51 +08:00
b4fa3ab1fd
feat: add learning records and attachments tabs to profile Drawer, plus PDF report button
2026-07-06 17:00:13 +08:00
09eb9ca9e0
fix: archive button opens Drawer instead of navigating to separate page
2026-07-06 16:58:54 +08:00