Commit Graph

113 Commits

Author SHA1 Message Date
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
be75437861 fix: comprehensive UI fix — all table columns have explicit widths, no ellipsis on data, consistent scroll.x 2026-07-06 16:56:35 +08:00
26754dc3fa fix(admin): fix column widths and scroll.x for Attendance and Roles pages
- Attendance: remove ellipsis from 备注 column, scroll.x 1100 -> 1200
- Roles: adjust column widths (ID 60->80, 系统 70->80, 操作 160->180), remove ellipsis from 描述 and 权限标签
- Teachers: already correct (verified all widths match spec)
- Permissions: card-based layout, no Table component - no changes needed
- Notifications: List-based layout, no Table component - no changes needed
2026-07-06 16:56:26 +08:00
cb39a183cc fix: restore form declaration, fix openDrawer state 2026-07-06 16:47:20 +08:00
0f9bcbdaca fix: import Tabs/Descriptions, remove duplicate state 2026-07-06 16:46:03 +08:00
aac01594da feat: student profile as Drawer from student list 2026-07-06 16:45:21 +08:00
8f3a20140d feat: click student name to navigate to profile page 2026-07-06 16:43:51 +08:00
4024d7c174 fix: remove ellipsis from student name column, give it 120px width 2026-07-06 16:42:36 +08:00
43ee4dc5d5 fix(admin): replace scroll.x='max-content' with calculated fixed widths for all tables 2026-07-06 16:39:53 +08:00
f4eac7b804 fix: add scroll.x='max-content' to 15 tables, widen narrow columns to prevent header wrapping 2026-07-06 16:10:33 +08:00