Each upcoming lesson now shows the booked offering's name and length next to its date/time (not just when it is).
Only the soonest five lessons render, with a "Show all N lessons" reveal for the rest.
GET /bookings now returns offering_title and duration_minutes, so the list needs no extra request.
Admin — Scheduler & My Lessons
Both the week and list views show the booked offering's name.
Each lesson links (?lesson_id=) to a new detail view showing the offering, time, status, notes, the policy versions the student accepted (with acceptance time and IP), and their intake-question answers.
On My Lessons an instructor may only open their own lessons; the studio Scheduler may open any.
Implementation
Booking\LessonDetail (new) presenter for a single lesson's answers + acceptances; template templates/admin/lesson-detail.php.
LessonController::maybeRenderDetail() handles the routing/permission check; rows gain the offering, duration, recurrence, and lesson id.
BookingEndpoint::lessonWithTimes() includes the offering name/length.
Tests
New tests/Unit/Booking/LessonDetailTest.php; added cases to LessonControllerTest (offering shown, detail routing, cross-instructor access blocked) and BookingEndpointTest (offering name in myLessons).
composer test (519 passing), composer lint, and composer cs all pass.
## Front end — student "Upcoming lessons"
- Each upcoming lesson now shows the **booked offering's name and length** next to its date/time (not just when it is).
- Only the **soonest five** lessons render, with a **"Show all N lessons"** reveal for the rest.
- `GET /bookings` now returns `offering_title` and `duration_minutes`, so the list needs no extra request.
## Admin — Scheduler & My Lessons
- Both the **week** and **list** views show the booked offering's name.
- Each lesson links (`?lesson_id=`) to a new **detail view** showing the offering, time, status, notes, the **policy versions the student accepted** (with acceptance time and IP), and their **intake-question answers**.
- On **My Lessons** an instructor may only open their own lessons; the studio **Scheduler** may open any.
## Implementation
- `Booking\LessonDetail` (new) presenter for a single lesson's answers + acceptances; template `templates/admin/lesson-detail.php`.
- `LessonController::maybeRenderDetail()` handles the routing/permission check; rows gain the offering, duration, recurrence, and lesson id.
- `BookingEndpoint::lessonWithTimes()` includes the offering name/length.
## Tests
- New `tests/Unit/Booking/LessonDetailTest.php`; added cases to `LessonControllerTest` (offering shown, detail routing, cross-instructor access blocked) and `BookingEndpointTest` (offering name in `myLessons`).
- `composer test` (519 passing), `composer lint`, and `composer cs` all pass.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Front end: the student "upcoming lessons" panel now shows each booked
offering's name and length next to the time, and renders only the soonest
five lessons with a "Show all" reveal. GET /bookings returns offering_title
and duration_minutes so the list needs no extra request.
Admin: the Scheduler and My Lessons week/list views now show the booked
offering, and each lesson links to a detail view showing the policy versions
the student accepted (with acceptance time and IP) and their intake answers.
On My Lessons an instructor may only open their own lessons; the studio
Scheduler may open any.
composer test / composer lint / composer cs all pass.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Front end — student "Upcoming lessons"
GET /bookingsnow returnsoffering_titleandduration_minutes, so the list needs no extra request.Admin — Scheduler & My Lessons
?lesson_id=) to a new detail view showing the offering, time, status, notes, the policy versions the student accepted (with acceptance time and IP), and their intake-question answers.Implementation
Booking\LessonDetail(new) presenter for a single lesson's answers + acceptances; templatetemplates/admin/lesson-detail.php.LessonController::maybeRenderDetail()handles the routing/permission check; rows gain the offering, duration, recurrence, and lesson id.BookingEndpoint::lessonWithTimes()includes the offering name/length.Tests
tests/Unit/Booking/LessonDetailTest.php; added cases toLessonControllerTest(offering shown, detail routing, cross-instructor access blocked) andBookingEndpointTest(offering name inmyLessons).composer test(519 passing),composer lint, andcomposer csall pass.🤖 Generated with Claude Code