Group class term dates, single-class embed mode, and offering editing
CI / Tests (PHP 8.2) (pull_request) Successful in 45s
CI / Tests (PHP 8.1) (pull_request) Successful in 48s
CI / No Debug Code (pull_request) Successful in 2s
CI / Coding Standards (pull_request) Successful in 1m14s
CI / PHPStan (pull_request) Successful in 1m16s
CI / Tests (PHP 8.3) (pull_request) Successful in 37s
CI / Build Plugin Zip (pull_request) Has been skipped
CI / Tests (PHP 8.2) (pull_request) Successful in 45s
CI / Tests (PHP 8.1) (pull_request) Successful in 48s
CI / No Debug Code (pull_request) Successful in 2s
CI / Coding Standards (pull_request) Successful in 1m14s
CI / PHPStan (pull_request) Successful in 1m16s
CI / Tests (PHP 8.3) (pull_request) Successful in 37s
CI / Build Plugin Zip (pull_request) Has been skipped
Group class offerings now carry real dates: the add/edit form takes a start date plus a sessions control (one-off, or weekly for N sessions; the end date is computed as start + (N-1) weeks via Offering::weeklyTermEnd). Dates are validated strictly (Y-m-d) and shown in the offerings list and on the student-facing class card, including the weekly session count. [us_group_classes offering="<id>"] (block attribute offeringId, chosen from a dropdown of active classes fetched from the public offerings endpoint) restricts the page to a single class so the enrolment flow can be embedded on a page dedicated to that class; a pinned class that is no longer offered reports itself closed instead of falling back to the catalog. Offerings are now editable from the admin screen: an Edit button prefills the shared add/edit form and saving posts usc_action=update. Updates always preserve the original owner and currency, and non-admin instructors can only load and update their own offerings. The form also gains the previously missing description field and an Active toggle (the admin-UI counterpart of the REST is_active flag) so an edit cannot wipe data the form never collected. Closes #59 Co-Authored-By: Claude Fable 5 <[email protected]>
This commit is contained in:
@@ -28,6 +28,30 @@ class OfferingTest extends TestCase
|
||||
self::assertSame(42, $offering->id);
|
||||
}
|
||||
|
||||
public function testNormalizeDateAcceptsRealDates(): void
|
||||
{
|
||||
self::assertSame('2026-09-08', Offering::normalizeDate('2026-09-08'));
|
||||
}
|
||||
|
||||
public function testNormalizeDateRejectsGarbage(): void
|
||||
{
|
||||
self::assertNull(Offering::normalizeDate(''));
|
||||
self::assertNull(Offering::normalizeDate('not-a-date'));
|
||||
self::assertNull(Offering::normalizeDate('2026-02-30'));
|
||||
self::assertNull(Offering::normalizeDate('2026-09-08 10:00'));
|
||||
}
|
||||
|
||||
public function testWeeklyTermEndAddsOneWeekPerExtraSession(): void
|
||||
{
|
||||
self::assertSame('2026-11-10', Offering::weeklyTermEnd('2026-09-08', 10));
|
||||
}
|
||||
|
||||
public function testWeeklyTermEndOfSingleSessionIsTheStartDate(): void
|
||||
{
|
||||
self::assertSame('2026-09-08', Offering::weeklyTermEnd('2026-09-08', 1));
|
||||
self::assertSame('2026-09-08', Offering::weeklyTermEnd('2026-09-08', 0));
|
||||
}
|
||||
|
||||
public function testDefaults(): void
|
||||
{
|
||||
$offering = new Offering(1, Offering::KIND_GROUP_CLASS, 'Choir');
|
||||
|
||||
Reference in New Issue
Block a user