fix enrollment, invoice, payment and financila aid
Deploy to Shared Hosting / Shared hosting deploy (push) Failing after 47s
Tests / PHPUnit (push) Failing after 1m19s

This commit is contained in:
root
2026-08-24 21:20:58 -04:00
parent 576da3bd78
commit 608aca79b8
30 changed files with 3327 additions and 774 deletions
+55 -15
View File
@@ -54,12 +54,26 @@ $selectedClasses = array_values(array_intersect(range(1,13), $selectedClasses));
</div>
<div class="col-md-6">
<label class="form-label">Category</label>
<?php
$selectedCategoryId = (int) old('category_id', $item['category_id'] ?? 0);
$selectedCat = null;
if ($selectedCategoryId > 0) {
foreach ($categories as $c) {
if ((int)($c['id'] ?? 0) === $selectedCategoryId) {
$selectedCat = $c;
break;
}
}
}
$editGmin = old('grade_min', $selectedCat['grade_min'] ?? '');
$editGmax = old('grade_max', $selectedCat['grade_max'] ?? '');
?>
<select class="form-select" name="category_id" id="bookCategorySelect">
<option value="">— None —</option>
<?php foreach ($categories as $c): ?>
<?php
$cid = (int)($c['id'] ?? 0);
$sel = isset($item['category_id']) && (int)$item['category_id'] === $cid ? 'selected' : '';
$sel = $selectedCategoryId === $cid ? 'selected' : '';
$gmin = $c['grade_min'] ?? '';
$gmax = $c['grade_max'] ?? '';
?>
@@ -71,9 +85,20 @@ $selectedClasses = array_values(array_intersect(range(1,13), $selectedClasses));
</option>
<?php endforeach; ?>
</select>
<div class="row g-2 mt-2">
<div class="col-6">
<label class="form-label" for="bookGradeMin">Grade Min</label>
<input type="number" class="form-control" name="grade_min" id="bookGradeMin"
min="0" max="13" value="<?= esc((string)$editGmin) ?>">
</div>
<div class="col-6">
<label class="form-label" for="bookGradeMax">Grade Max</label>
<input type="number" class="form-control" name="grade_max" id="bookGradeMax"
min="0" max="13" value="<?= esc((string)$editGmax) ?>">
</div>
</div>
<div class="form-text">
Grade Range:
<span id="catGradeRange">—</span>
Grade range is saved on the selected category (shared by all books in that category).
</div>
</div>
@@ -141,20 +166,35 @@ $selectedClasses = array_values(array_intersect(range(1,13), $selectedClasses));
<script>
(function() {
// Category grade range helper
const sel = document.getElementById('bookCategorySelect');
const out = document.getElementById('catGradeRange');
function label(opt) {
if (!opt) { out.textContent = '—'; return; }
const gmin = opt.getAttribute('data-gmin');
const gmax = opt.getAttribute('data-gmax');
if ((gmin && gmin !== '') && (gmax && gmax !== '')) out.textContent = `G${gmin}G${gmax}`;
else if (gmin && gmin !== '') out.textContent = `G${gmin}+`;
else if (gmax && gmax !== '') out.textContent = `≤G${gmax}`;
else out.textContent = '';
const gminInput = document.getElementById('bookGradeMin');
const gmaxInput = document.getElementById('bookGradeMax');
function syncGradeInputsFromCategory() {
if (!sel || !gminInput || !gmaxInput) return;
const hasCategory = sel.value !== '';
if (!hasCategory) {
gminInput.value = '';
gmaxInput.value = '';
return;
}
const opt = sel.options[sel.selectedIndex];
gminInput.value = opt?.getAttribute('data-gmin') ?? '';
gmaxInput.value = opt?.getAttribute('data-gmax') ?? '';
}
sel?.addEventListener('change', () => label(sel.options[sel.selectedIndex]));
if (sel) label(sel.options[sel.selectedIndex]); // init on load
// Keep option dataset in sync so re-selecting the same category shows latest typed values
function mirrorInputsOntoSelectedOption() {
if (!sel || !sel.value) return;
const opt = sel.options[sel.selectedIndex];
if (!opt) return;
opt.setAttribute('data-gmin', gminInput?.value ?? '');
opt.setAttribute('data-gmax', gmaxInput?.value ?? '');
}
sel?.addEventListener('change', syncGradeInputsFromCategory);
gminInput?.addEventListener('change', mirrorInputsOntoSelectedOption);
gmaxInput?.addEventListener('change', mirrorInputsOntoSelectedOption);
// Classes select all / clear
const selectAllBtn = document.getElementById('btnSelectAllClasses');