class PackageIndexEntry { name; description; website; version; report; } function toHTML(entry) { let v = entry.version != null ? `${escapeHtml(entry.version)}` : ""; let d = entry.description != null ? `

${escapeHtml(entry.description)}

` : ""; let w = entry.website != null ? `Website` : ""; let r = entry.report ? `Log (View | Download)` : ""; let row = (document.createElement('tr')); row.innerHTML = `

${escapeHtml(entry.name)} ${v}

${d} ${w} ${r} `; return row; } const API_VERSION = 1; const ENDPOINT = `/api/v${API_VERSION}`; class InfoPayload { count; hakurei_version; } async function infoRequest() { const res = await fetch(`${ENDPOINT}/info`); const payload = await res.json(); return payload; } class GetPayload { count; values; } var SortOrders; (function (SortOrders) { SortOrders[SortOrders["DeclarationAscending"] = 0] = "DeclarationAscending"; SortOrders[SortOrders["DeclarationDescending"] = 1] = "DeclarationDescending"; SortOrders[SortOrders["NameAscending"] = 2] = "NameAscending"; SortOrders[SortOrders["NameDescending"] = 3] = "NameDescending"; })(SortOrders || (SortOrders = {})); async function getRequest(limit, index, sort) { const res = await fetch(`${ENDPOINT}/get?limit=${limit}&index=${index}&sort=${sort.valueOf()}`); const payload = await res.json(); return payload; } class State { entriesPerPage = 10; entryIndex = 0; maxEntries = 0; sort = SortOrders.DeclarationAscending; getEntriesPerPage() { return this.entriesPerPage; } setEntriesPerPage(entriesPerPage) { this.entriesPerPage = entriesPerPage; this.setEntryIndex(Math.floor(this.getEntryIndex() / entriesPerPage) * entriesPerPage); } getEntryIndex() { return this.entryIndex; } setEntryIndex(entryIndex) { this.entryIndex = entryIndex; this.updatePage(); this.updateRange(); this.updateListings(); } getMaxEntries() { return this.maxEntries; } setMaxEntries(max) { this.maxEntries = max; } getSortOrder() { return this.sort; } setSortOrder(sortOrder) { this.sort = sortOrder; this.setEntryIndex(0); } updatePage() { let page = Math.ceil(((this.getEntryIndex() + this.getEntriesPerPage()) - 1) / this.getEntriesPerPage()); document.getElementById("page-number").innerText = String(page); } updateRange() { let max = Math.min(this.getEntryIndex() + this.getEntriesPerPage(), this.getMaxEntries()); document.getElementById("entry-counter").innerText = `${this.getEntryIndex() + 1}-${max} of ${this.getMaxEntries()}`; } updateListings() { getRequest(this.getEntriesPerPage(), this.getEntryIndex(), this.getSortOrder()) .then(res => { let table = document.getElementById("pkg-list"); table.innerHTML = ''; for (let i = 0; i < res.count; i++) { table.appendChild(toHTML(res.values[i])); } }); } } let STATE; function prevPage() { let index = STATE.getEntryIndex(); STATE.setEntryIndex(Math.max(0, index - STATE.getEntriesPerPage())); } function nextPage() { let index = STATE.getEntryIndex(); STATE.setEntryIndex(Math.min((Math.ceil(STATE.getMaxEntries() / STATE.getEntriesPerPage()) * STATE.getEntriesPerPage()) - STATE.getEntriesPerPage(), index + STATE.getEntriesPerPage())); } function escapeHtml(str) { return str .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); } document.addEventListener("DOMContentLoaded", () => { STATE = new State(); infoRequest() .then(res => { STATE.setMaxEntries(res.count); document.getElementById("hakurei-version").innerText = res.hakurei_version; STATE.updateRange(); STATE.updateListings(); }); document.getElementById("count").addEventListener("change", (event) => { STATE.setEntriesPerPage(parseInt(event.target.value)); }); document.getElementById("sort").addEventListener("change", (event) => { STATE.setSortOrder(parseInt(event.target.value)); }); });