When sudo2() fails (e.g. CI user whose login JWT lacks current_org_id),
fall back to using the auth token as the sudo token instead of propagating
the error. This prevents the route guard from aborting org/department
loading, allowing subsequent API calls (loadMyDepartments, etc.) to proceed.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Restores 0910774 rotation structure (external day header + rotated
stage with ml-* layout) and adds missing ml-* CSS rules. Changes
landscape-stage overflow from hidden to visible so viewport can
handle scrolling of time slot content.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Matrix landscape now stays in the rotated stage (same as calendar), but the
internal layout is transposed: time slots are columns (overflow-x: auto) and
days are reversed rows, so after 90° rotation the visual result has days
left-to-right across the top and time slots scrollable vertically.
Header (landscape-matrix-header) stays outside rotation for natural fixed
positioning at the top of the landscape viewport.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Wrap entire beforeEach guard in try/catch to prevent crashes from
breaking navigation and leaving a blank page
- Add missing next() at end of try block so all code paths resolve
- Integrate switchDepartment() after loadMyDepartments() when exactly
1 department is available, enabling transparent single-dept flow
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Revert matrix landscape to use the native ml-* template which has the
correct layout (time slots = rows, days = columns, header fixed, body
scrollable). This avoids the scroll-direction issues caused by 90° CSS
rotation. Calendar landscape retains rotation.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Add Department type to types.ts
- Add loadMyDepartments / switchDepartment to store/org.ts
- Auto-load departments after org switch in main.ts
- Single-department orgs auto-select default department
- localStorage persistence for CurrentDepartmentId
- Override --clazz-landscape-body-height for matrix to subtract header
height, eliminating white space when scrolling
- Set overflow: visible on landscape-stage for matrix so ml-body content
can overflow the stage
- Add min-width: max-content on matrix container so content overflows
in X direction → becomes vertical scroll after 90° rotation
- ml-body disabled internal scrolling when inside rotated viewport
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Matrix landscape now uses the same landscape-stage 90° CSS rotation as
the calendar view. The weekday header (ml-header) is rendered outside
the rotated container so it stays fixed at the top. Matrix body
(ml-body) is inside the rotation and scrollable.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
"排课" = scheduled class instance, "课程" = course content/curriculum.
All 21 instances of incorrect usage were in clazz/tongzhi/user-settings
contexts where the underlying data is a clazz (clazz_id, clazz_name,
is_repeat), not a course.
Affected files: clazz/index.vue (10), tongzhi/index.vue (4),
tongzhi/detail.vue (3), store/clazz.ts (3), user-settings.vue (1).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The 排课 and 打卡 tabs were hidden behind v-if="is_teacher",
excluding the SUPERVISOR role from accessing the clazz page.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The query() function in clazz store only filtered for TEACHER and
STUDENT roles, causing SUPERVISOR role to always get an empty list.
Added SUPERVISOR alongside TEACHER to show supervisor's own courses.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Previously vConsole was only shown to users with a role carrying the
SYS_TESTER label. Extend visibility to users who have the SYS_CAN_SUDO
tag (the "root tag"), since those users also need debug access during
E2E testing and general troubleshooting.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The datesSet callback was formatting dates as "YYYY-MM-DD HH:mm:ss"
but the by_hty_id backend endpoints now use string_to_date which
only accepts "YYYY-MM-DD" format. Caused "trailing input" errors.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Subsidiary courses now only appear in SUPERVISOR mode, not TEACHER mode.
Matrix view shows each subsidiary teacher's courses with a distinct color.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
"试看" (preview) from the storefront should show a read-only view without
admin operations (编辑, 删除, 发布上架, 下架). Add preview=1 query param
to distinguish preview from direct management navigation. Also limit
previewable sections to first one in preview mode, consistent with
non-owner experience.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Only show columns for time slots that have actual courses
- Event blocks show: lesson period, time range, teacher, students
- Horizontal scroll when many slot columns
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Remove Y-axis time slot rows (was wrong)
- X-axis: hierarchical header (weekday + date | time slot name)
- Body: lane-packed event blocks in each date×slot column
- Show teacher name and student names in each block
- Empty slots show clickable '+' placeholder
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Add flex column layout for landscape full-screen fill
- Show teacher name and student names in matrix event blocks
- Refactor useClazzViewModel with makeEvent() helper
- Fix CSS nesting for .slot-row
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Add "创建排课" custom button in FullCalendar header toolbar, defaults
to current date/time + 45min duration, guarded by is_teacher check
- Add margin-bottom to 操作记录 cell so it doesn't crowd the footer buttons
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- CoursePackageStore: don't show error when no orgId and unauth,
just show empty state
- index.vue: only render CoursePackageStore when org_id is available
in URL, otherwise show original login prompt
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
When a student has no claimed teachers, redirect them to the
teacher-select page instead of silently landing on the home page
with no teacher. The teacher-select page falls back to showing
available valid teachers when the student's teacher list is empty.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Remove the "请选择您的老师" page (v-else-if block) that showed teachers
from all orgs
- Remove the mine.length === 0 guard in watchEffect - students with no
teachers now redirect to home page normally
- Teacher selection moves to profile page /student/teacher-select
- Remove unused code (getAllTeachers, teachers computed, chooseTeacher)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Update chooseRole STUDENT branch: redirect to / instead of teacher-select
- Update org/select.vue: redirect to / for students (index page handles auto-select)
- Remove unused imports
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Replace getValidTeachers() with getAllTeachers() for org-scoped teacher list
- Fix chooseTeacher() to use async/await with error handling instead of reload
- After claiming teacher, refresh mine list and navigate without page reload
- Fix chooseRole STUDENT branch: clear teacher and redirect to teacher-select
- Remove auto-select on role switch (user should pick explicitly)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Add tryAutoSelect() to teacher store to pick first teacher when none selected
- Auto-select first teacher when student role is confirmed (both auto-login and manual role selection)
- Redirect students to /student/teacher-select after org switch, clearing previous teacher
- Covers: chooseRole(), single-role auto-login, and index page initialization
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Add teacher context for students: show current teacher in profile,
allow switching via new teacher-select page. Filter daka queries
by selected teacher when available.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Add detail/show page with conditional action buttons
- Route /course/course-package/detail with props query params
- List page click navigates to detail instead of edit
- Edit page redirects if package is published (published_at set)
- Store: add publish/unpublish API functions
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Course-package picker only showed org-visible groups, but supervisors
also need to see and use their own course groups. Add "我的课节" tab
for course-package mode.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- CourseGroup: add org_visible field, teacher toggle on add/edit
- CoursePackage: add selectedGroups state, sync/list package items API
- Group picker: support COURSE_PACKAGE target, show org-visible groups
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Add list/add/edit views for course-package under the qumu section,
visible to TEACHER and SUPERVISOR roles via the 教学资源库 tab.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>