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
+100 -3
View File
@@ -8,6 +8,7 @@
<a class="btn btn-outline-primary" href="<?= site_url('inventory/book-prices') ?>">Book Prices</a>
<a class="btn btn-primary" href="<?= site_url('inventory/create/book') ?>">Add Book</a>
<button class="btn btn-outline-secondary" data-bs-toggle="modal" data-bs-target="#addCategoryModal">Add Category</button>
<button class="btn btn-outline-secondary" data-bs-toggle="modal" data-bs-target="#editCategoryModal">Edit Category</button>
</div>
</div>
@@ -65,7 +66,19 @@
<td><?= esc($i['isbn']) ?></td>
<td><?= esc($i['edition']) ?></td>
<td><?= esc($catName) ?></td>
<td><?= esc($catGrades) ?></td> <!-- NEW -->
<td>
<?php if (!empty($cat['id'])): ?>
<button type="button"
class="btn btn-link p-0 text-decoration-none js-edit-category-grades"
data-bs-toggle="modal"
data-bs-target="#editCategoryModal"
data-category-id="<?= (int) $cat['id'] ?>">
<?= esc($catGrades) ?>
</button>
<?php else: ?>
<?= esc($catGrades) ?>
<?php endif; ?>
</td>
<td><?= esc($i['quantity']) ?></td>
<td><?= esc($i['unit']) ?></td>
<td><?= esc($userNames[(int)($i['updated_by'] ?? 0)] ?? '—') ?></td>
@@ -102,7 +115,6 @@
<input type="text" name="name" class="form-control" required>
</div>
<!-- NEW: Grade range -->
<div class="row g-2 mb-3">
<div class="col-6">
<label class="form-label">Grade Min</label>
@@ -127,6 +139,65 @@
</div>
</div>
<!-- Edit Category Modal -->
<div class="modal fade" id="editCategoryModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog">
<form class="modal-content" method="post" action="<?= site_url('inventory/category/save') ?>" id="editCategoryForm">
<?= csrf_field() ?>
<input type="hidden" name="type" value="book">
<div class="modal-header">
<h5 class="modal-title">Edit Category (Books)</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<div class="mb-3">
<label class="form-label">Category</label>
<select class="form-select" name="id" id="editCategorySelect" required>
<option value="">— Select category —</option>
<?php foreach ($categories as $c): ?>
<option
value="<?= (int)($c['id'] ?? 0) ?>"
data-name="<?= esc($c['name'] ?? '', 'attr') ?>"
data-description="<?= esc($c['description'] ?? '', 'attr') ?>"
data-gmin="<?= esc((string)($c['grade_min'] ?? ''), 'attr') ?>"
data-gmax="<?= esc((string)($c['grade_max'] ?? ''), 'attr') ?>"
><?= esc(($c['name'] ?? '') . ($gradeLabel($c) !== '—' ? ' (' . $gradeLabel($c) . ')' : '')) ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="mb-3">
<label class="form-label">Name</label>
<input type="text" name="name" id="editCategoryName" class="form-control" required>
</div>
<div class="row g-2 mb-3">
<div class="col-6">
<label class="form-label">Grade Min</label>
<input type="number" name="grade_min" id="editCategoryGradeMin" class="form-control" min="0" max="13" placeholder="e.g., 1">
</div>
<div class="col-6">
<label class="form-label">Grade Max</label>
<input type="number" name="grade_max" id="editCategoryGradeMax" class="form-control" min="0" max="13" placeholder="e.g., 3">
</div>
<div class="col-12">
<small class="text-muted">Optional. Changing grade range updates every book in this category.</small>
</div>
</div>
<div class="mb-0">
<label class="form-label">Description (optional)</label>
<textarea name="description" id="editCategoryDescription" class="form-control" rows="2"></textarea>
</div>
</div>
<div class="modal-footer"><button type="submit" class="btn btn-primary" id="editCategorySaveBtn">Update Category</button></div>
</form>
</div>
</div>
<?= $this->endSection() ?>
<?= $this->section('scripts') ?>
<script>
document.getElementById('categoryFilter')?.addEventListener('change', function() {
const val = this.value;
@@ -134,6 +205,32 @@ document.getElementById('categoryFilter')?.addEventListener('change', function()
tr.style.display = (!val || tr.getAttribute('data-category') === val) ? '' : 'none';
});
});
</script>
(function() {
const select = document.getElementById('editCategorySelect');
const nameInput = document.getElementById('editCategoryName');
const descInput = document.getElementById('editCategoryDescription');
const gminInput = document.getElementById('editCategoryGradeMin');
const gmaxInput = document.getElementById('editCategoryGradeMax');
function fillEditCategory() {
const opt = select?.options[select.selectedIndex];
const has = !!(select && select.value);
if (nameInput) nameInput.value = has ? (opt.getAttribute('data-name') || '') : '';
if (descInput) descInput.value = has ? (opt.getAttribute('data-description') || '') : '';
if (gminInput) gminInput.value = has ? (opt.getAttribute('data-gmin') || '') : '';
if (gmaxInput) gmaxInput.value = has ? (opt.getAttribute('data-gmax') || '') : '';
}
select?.addEventListener('change', fillEditCategory);
document.getElementById('editCategoryModal')?.addEventListener('show.bs.modal', function (e) {
const trigger = e.relatedTarget;
const preselect = trigger && trigger.getAttribute ? trigger.getAttribute('data-category-id') : null;
if (preselect && select) {
select.value = preselect;
}
fillEditCategory();
});
})();
</script>
<?= $this->endSection() ?>