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>
WeChat webview can desync route query from route props; use useRoute for course_id and log API failures to console. Watch course_id to refetch when query changes.
Made-with: Cursor
Sanitize course section resources payloads across list and id queries to avoid runtime filter/some failures from malformed resource shapes, with CourseSectionResourceDebug diagnostics.
Made-with: Cursor
Normalize paged and list responses for course section APIs to prevent runtime errors on infinite scroll and emit CourseSectionPayloadDebug diagnostics for malformed payloads.
Made-with: Cursor
Prevent runtime filter crashes in /clazz by normalizing API payloads to arrays and emitting ClazzPayloadDebug diagnostics when response shape is unexpected.
Made-with: Cursor
Normalize find_all_courses response to an array and add page-level array fallback to prevent filter runtime errors when response payload is malformed.
Made-with: Cursor
Parse current_org_id/current_org_role_keys from subject payload when tokens are encoded under claims.sub, so org switch context is correctly detected.
Made-with: Cursor
Record before/after jwt org context decode details for org switch into console and localStorage, and surface actionable debug dialog when returned token lacks org context.
Made-with: Cursor
Validate current_org_id from switch token before accepting it, align auth/sudo tokens, and force full navigation to home after switch to avoid staying on org-select state.
Made-with: Cursor
After org switch, sync sudo token and navigate to home immediately instead of awaiting read() chain, preventing org select page from stalling.
Made-with: Cursor
Add base64 padding before atob when parsing token payload so current_org_id extraction no longer fails intermittently and loops users back to org select.
Made-with: Cursor