Add group-class enrolment deadline with instructor late-enrolment override
CI / Tests (PHP 8.1) (pull_request) Successful in 48s
CI / Tests (PHP 8.2) (pull_request) Successful in 47s
CI / No Debug Code (pull_request) Successful in 3s
CI / PHPStan (pull_request) Successful in 2m51s
CI / Coding Standards (pull_request) Successful in 3m2s
CI / Tests (PHP 8.3) (pull_request) Successful in 2m37s
CI / Build Plugin Zip (pull_request) Skipped
CI / Tests (PHP 8.1) (pull_request) Successful in 48s
CI / Tests (PHP 8.2) (pull_request) Successful in 47s
CI / No Debug Code (pull_request) Successful in 3s
CI / PHPStan (pull_request) Successful in 2m51s
CI / Coding Standards (pull_request) Successful in 3m2s
CI / Tests (PHP 8.3) (pull_request) Successful in 2m37s
CI / Build Plugin Zip (pull_request) Skipped
Group classes gain an instructor-set enrolment deadline (new us_offerings.enrollment_deadline column) that defaults to the first day of the class (term_start). Past the deadline students can no longer self-enrol: the enrolment endpoint rejects it (403 enrollment_closed) and the front-end class list shows "Enrolment has closed." in place of the Enrol button. Instructors keep a manual path: the "Add students directly" control on each class's details page now renders for public classes too (not just invite-only) and deliberately bypasses the deadline and capacity, so a student can be added as a late enrolment after the class has closed. Past the deadline the details page labels these as late enrolments. Bumps USC_VERSION to 1.1.3 for the schema change. Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
@@ -6,7 +6,7 @@ if (! defined('ABSPATH')) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @var array{id: int|null, title: string, when: string, capacity: int|null, enrolled: int, invite_only: bool, instructor: string, price: float, currency: string, duration: int|null, description: string|null, schedule_note: string|null, active: bool, roster: list<array{student: string, status: string, payment: string|null}>, invited: list<array{who: string, kind: string}>} $class
|
||||
* @var array{id: int|null, title: string, when: string, capacity: int|null, enrolled: int, invite_only: bool, instructor: string, price: float, currency: string, duration: int|null, description: string|null, schedule_note: string|null, deadline: string, enrollment_open: bool, active: bool, roster: list<array{student: string, status: string, payment: string|null}>, invited: list<array{who: string, kind: string}>} $class
|
||||
* @var list<array{id: int, name: string}> $students
|
||||
* @var string $notice
|
||||
* @var string $baseUrl
|
||||
@@ -78,6 +78,12 @@ if (! defined('ABSPATH')) {
|
||||
<th scope="row"><?php esc_html_e('Price', 'unsupervised-schedular'); ?></th>
|
||||
<td><?php echo esc_html(number_format($class['price'], 2) . ' ' . $class['currency']); ?></td>
|
||||
</tr>
|
||||
<?php if ('' !== $class['deadline']) : ?>
|
||||
<tr>
|
||||
<th scope="row"><?php esc_html_e('Enrolment deadline', 'unsupervised-schedular'); ?></th>
|
||||
<td><?php echo esc_html($class['deadline']); ?></td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
<?php if (null !== $class['schedule_note'] && '' !== $class['schedule_note']) : ?>
|
||||
<tr>
|
||||
<th scope="row"><?php esc_html_e('Schedule note', 'unsupervised-schedular'); ?></th>
|
||||
@@ -130,35 +136,51 @@ if (! defined('ABSPATH')) {
|
||||
</table>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($class['invite_only']) : ?>
|
||||
<h2><?php esc_html_e('Invite & enrol students', 'unsupervised-schedular'); ?></h2>
|
||||
<h2>
|
||||
<?php
|
||||
echo $class['invite_only']
|
||||
? esc_html__('Invite & enrol students', 'unsupervised-schedular')
|
||||
: esc_html__('Add students', 'unsupervised-schedular');
|
||||
?>
|
||||
</h2>
|
||||
<?php if (! $class['enrollment_open']) : ?>
|
||||
<p class="description"><?php esc_html_e('Enrolment has closed for this class. Students you add here are enrolled as late enrolments.', 'unsupervised-schedular'); ?></p>
|
||||
<?php elseif ($class['invite_only']) : ?>
|
||||
<p class="description"><?php esc_html_e('This class is invite only, so students join only when you add or invite them here.', 'unsupervised-schedular'); ?></p>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (! empty($class['invited'])) : ?>
|
||||
<h3><?php esc_html_e('Invited (not yet enrolled)', 'unsupervised-schedular'); ?></h3>
|
||||
<ul class="ul-disc">
|
||||
<?php foreach ($class['invited'] as $invitee) : ?>
|
||||
<li><?php echo esc_html($invitee['who'] . ' — ' . $invitee['kind']); ?></li>
|
||||
<?php if ($class['invite_only'] && ! empty($class['invited'])) : ?>
|
||||
<h3><?php esc_html_e('Invited (not yet enrolled)', 'unsupervised-schedular'); ?></h3>
|
||||
<ul class="ul-disc">
|
||||
<?php foreach ($class['invited'] as $invitee) : ?>
|
||||
<li><?php echo esc_html($invitee['who'] . ' — ' . $invitee['kind']); ?></li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="us-group-invite-controls" style="display:flex; flex-wrap:wrap; gap:2em; margin:1em 0 2em;">
|
||||
<form method="post">
|
||||
<?php wp_nonce_field('usc_group_action'); ?>
|
||||
<input type="hidden" name="offering_id" value="<?php echo esc_attr((string) $class['id']); ?>">
|
||||
<h4><?php esc_html_e('Add students directly', 'unsupervised-schedular'); ?></h4>
|
||||
<p class="description">
|
||||
<?php
|
||||
echo $class['enrollment_open']
|
||||
? esc_html__('Enrols them now with a pending payment.', 'unsupervised-schedular')
|
||||
: esc_html__('Enrols them now with a pending payment, past the enrolment deadline.', 'unsupervised-schedular');
|
||||
?>
|
||||
</p>
|
||||
<select name="student_ids[]" multiple size="5" style="min-width:16em;">
|
||||
<?php foreach ($students as $student) : ?>
|
||||
<option value="<?php echo esc_attr((string) $student['id']); ?>"><?php echo esc_html($student['name']); ?></option>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="us-group-invite-controls" style="display:flex; flex-wrap:wrap; gap:2em; margin:1em 0 2em;">
|
||||
<form method="post">
|
||||
<?php wp_nonce_field('usc_group_action'); ?>
|
||||
<input type="hidden" name="offering_id" value="<?php echo esc_attr((string) $class['id']); ?>">
|
||||
<h4><?php esc_html_e('Add students directly', 'unsupervised-schedular'); ?></h4>
|
||||
<p class="description"><?php esc_html_e('Enrols them now with a pending payment.', 'unsupervised-schedular'); ?></p>
|
||||
<select name="student_ids[]" multiple size="5" style="min-width:16em;">
|
||||
<?php foreach ($students as $student) : ?>
|
||||
<option value="<?php echo esc_attr((string) $student['id']); ?>"><?php echo esc_html($student['name']); ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
<p>
|
||||
<button type="submit" name="usc_action" value="add_direct" class="button"><?php esc_html_e('Add to class', 'unsupervised-schedular'); ?></button>
|
||||
</p>
|
||||
</form>
|
||||
</select>
|
||||
<p>
|
||||
<button type="submit" name="usc_action" value="add_direct" class="button"><?php esc_html_e('Add to class', 'unsupervised-schedular'); ?></button>
|
||||
</p>
|
||||
</form>
|
||||
|
||||
<?php if ($class['invite_only']) : ?>
|
||||
<form method="post">
|
||||
<?php wp_nonce_field('usc_group_action'); ?>
|
||||
<input type="hidden" name="offering_id" value="<?php echo esc_attr((string) $class['id']); ?>">
|
||||
@@ -184,6 +206,6 @@ if (! defined('ABSPATH')) {
|
||||
<button type="submit" name="usc_action" value="invite_email" class="button"><?php esc_html_e('Send invite', 'unsupervised-schedular'); ?></button>
|
||||
</p>
|
||||
</form>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user