Files
root 608aca79b8
Deploy to Shared Hosting / Shared hosting deploy (push) Failing after 47s
Tests / PHPUnit (push) Failing after 1m19s
fix enrollment, invoice, payment and financila aid
2026-08-24 21:20:58 -04:00

214 lines
8.5 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?= $this->extend('layout/management_layout') ?>
<?= $this->section('content') ?>
<div class="container my-4">
<?php $isEdit = !empty($item); ?>
<h3 class="mb-3"><?= $isEdit ? 'Edit' : 'Add' ?> Book</h3>
<?= view('partials/flash_messages') ?>
<?php
$isEdit = isset($isEdit) && $isEdit;
$itemId = $item['id'] ?? null;
$action = $isEdit ? site_url('inventory/update/'.$itemId) : site_url('inventory/store');
// Build a label function for categories with grade range
$catLabel = function(array $c): string {
$name = $c['name'] ?? '';
$gmin = $c['grade_min'] ?? null;
$gmax = $c['grade_max'] ?? null;
if ($gmin !== null || $gmax !== null) {
// Render compact: (GminGmax) supports one-sided ranges too
if ($gmin !== null && $gmax !== null) $name .= " (G{$gmin}G{$gmax})";
elseif ($gmin !== null) $name .= " (G{$gmin}+)";
elseif ($gmax !== null) $name .= " (≤G{$gmax})";
}
return $name;
};
// ---- Classes preselection (supports array, CSV, or JSON) ----
$selectedClasses = [];
$rawClasses = $item['classes'] ?? $item['class_list'] ?? $item['class_ids'] ?? null;
if (is_array($rawClasses)) {
$selectedClasses = array_map('intval', $rawClasses);
} elseif (is_string($rawClasses) && $rawClasses !== '') {
$decoded = json_decode($rawClasses, true);
if (json_last_error() === JSON_ERROR_NONE && is_array($decoded)) {
$selectedClasses = array_map('intval', $decoded);
} else {
$parts = preg_split('/[,\s]+/', $rawClasses);
$selectedClasses = array_map('intval', array_filter($parts, static fn($v) => $v !== ''));
}
}
// Keep only values 1..13
$selectedClasses = array_values(array_intersect(range(1,13), $selectedClasses));
?>
<form method="post" action="<?= $action ?>">
<?= csrf_field() ?>
<input type="hidden" name="type" value="book">
<div class="row g-3">
<div class="col-md-6">
<label class="form-label">Title</label>
<input class="form-control" name="name" required value="<?= esc($item['name'] ?? '') ?>">
</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 = $selectedCategoryId === $cid ? 'selected' : '';
$gmin = $c['grade_min'] ?? '';
$gmax = $c['grade_max'] ?? '';
?>
<option value="<?= esc($cid) ?>"
data-gmin="<?= esc($gmin) ?>"
data-gmax="<?= esc($gmax) ?>"
<?= $sel ?>>
<?= esc($catLabel($c)) ?>
</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 is saved on the selected category (shared by all books in that category).
</div>
</div>
<!-- ===== Classes (113) ===== -->
<div class="col-12">
<label class="form-label d-flex align-items-center gap-2">
Classes (113)
<button type="button" class="btn btn-sm btn-outline-secondary" id="btnSelectAllClasses">Select All</button>
<button type="button" class="btn btn-sm btn-outline-secondary" id="btnClearClasses">Clear</button>
</label>
<div class="row g-2" id="classesGrid">
<?php for ($i = 1; $i <= 13; $i++): ?>
<?php $checked = in_array($i, $selectedClasses, true) ? 'checked' : ''; ?>
<div class="col-6 col-sm-4 col-md-3 col-lg-2">
<div class="form-check">
<input class="form-check-input class-checkbox" type="checkbox"
id="class<?= $i ?>" name="classes[]" value="<?= $i ?>" <?= $checked ?>>
<label class="form-check-label" for="class<?= $i ?>">Class <?= $i ?></label>
</div>
</div>
<?php endfor; ?>
</div>
<div class="form-text">Choose all class numbers that use this book.</div>
</div>
<!-- ========================== -->
<div class="col-md-4">
<label class="form-label">Author</label>
<input class="form-control" name="author" value="<?= esc($item['author'] ?? '') ?>">
</div>
<div class="col-md-4">
<label class="form-label">ISBN</label>
<input class="form-control" name="isbn" value="<?= esc($item['isbn'] ?? '') ?>">
</div>
<div class="col-md-4">
<label class="form-label">Edition</label>
<input class="form-control" name="edition" value="<?= esc($item['edition'] ?? '') ?>">
</div>
<div class="col-md-2">
<label class="form-label">Quantity</label>
<input type="number" min="0" class="form-control" name="quantity" value="<?= esc($item['quantity'] ?? 0) ?>">
</div>
<div class="col-md-2">
<label class="form-label">Unit</label>
<input class="form-control" name="unit" placeholder="pcs, set" value="<?= esc($item['unit'] ?? '') ?>">
</div>
<div class="col-md-4">
<label class="form-label">SKU</label>
<input class="form-control" name="sku" value="<?= esc($item['sku'] ?? '') ?>">
</div>
<div class="col-12">
<label class="form-label">Description / Notes</label>
<textarea class="form-control" rows="3" name="description"><?= esc($item['description'] ?? '') ?></textarea>
</div>
</div>
<div class="mt-3 d-flex gap-2">
<button class="btn btn-primary"><?= $isEdit ? 'Update' : 'Save' ?></button>
<a class="btn btn-outline-secondary" href="<?= site_url('inventory/book') ?>">Cancel</a>
</div>
</form>
</div>
<script>
(function() {
const sel = document.getElementById('bookCategorySelect');
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') ?? '';
}
// 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');
const clearBtn = document.getElementById('btnClearClasses');
const checkboxes = document.querySelectorAll('.class-checkbox');
selectAllBtn?.addEventListener('click', () => {
checkboxes.forEach(cb => cb.checked = true);
});
clearBtn?.addEventListener('click', () => {
checkboxes.forEach(cb => cb.checked = false);
});
})();
</script>
<?= $this->endSection() ?>