feat(v1.4.0): CSV/Excel/JSON/NextUp exports + hybrid smart year standing

- Export modules (export-csv/json/xlsx) mirroring the PDF layout, plus a
  Next Up import CSV matching the raycast/nextup column contract.
- Hybrid Year Level: View Grades history (exact per-semester standing),
  falling back to units math (prospectus total - lacking), then profile.
  Popup adds a year-mode setting (auto/custom/off).
- On-page button row now offers PDF / CSV / Excel / JSON / Next Up.
- Bump version to 1.4.0.
- Tag-only build workflow with an optional AMO sign step for a signed .xpi;
  separate ci.yml keeps tests on pushes/PRs.
- Tests: year-standing parser tests + export tests (CSV quoting, JSON schema,
  XLSX structure); CI validates XLSX via openpyxl.
This commit is contained in:
2026-08-20 06:45:21 +08:00
parent 89fd587c21
commit 53d5ca6d04
19 changed files with 5231 additions and 76 deletions
+9 -1
View File
@@ -36,10 +36,18 @@
<h2>PDF Settings</h2>
<label class="row"><input type="checkbox" id="truncateToggle"> Truncate long course descriptions (official PDF style)</label>
<label class="row"><input type="checkbox" id="showYearToggle"> Show Year Level on the PDF</label>
<div class="row">Year Level mode:
<select id="yearMode">
<option value="auto">Auto (recommended)</option>
<option value="custom">Use custom value</option>
<option value="off">Profile value only</option>
</select>
</div>
<label class="row">Custom Year Level (optional):
<input type="text" id="customYear" placeholder="e.g. 3">
</label>
<p class="hint">Leave blank to use the scraped value (auto-adjusted in Summer).</p>
<p class="hint">Auto derives the standing of the semester being printed (from
View Grades, or remaining units). Profile value only disables derivation.</p>
</section>
<script src="popup.js"></script>