aboutsummaryrefslogtreecommitdiff
path: root/static
diff options
context:
space:
mode:
authortdro <tdro@noreply.example.com>2022-11-02 11:08:22 -0400
committertdro <tdro@noreply.example.com>2022-11-02 11:08:22 -0400
commitbf1926903403a77767efb8bbbcde6b32c8929179 (patch)
tree73e9d52d9784142f598d7d85b4f736550819ee71 /static
parentbec107a46771da25778a92d7e881f157dc91c035 (diff)
downloadcanory-bf1926903403a77767efb8bbbcde6b32c8929179.tar.gz
canory-bf1926903403a77767efb8bbbcde6b32c8929179.tar.bz2
canory-bf1926903403a77767efb8bbbcde6b32c8929179.zip
themes/default/layouts/_default/index.json: Paginate
Load feed in chunks on the client side.
Diffstat (limited to 'static')
-rw-r--r--static/js/fixedsearch.ts47
1 files changed, 32 insertions, 15 deletions
diff --git a/static/js/fixedsearch.ts b/static/js/fixedsearch.ts
index 4a24144..fafe5ee 100644
--- a/static/js/fixedsearch.ts
+++ b/static/js/fixedsearch.ts
@@ -33,7 +33,7 @@
}
}
- // DOWN (40)
+ // DOWN (40)
if (event.keyCode == 40) {
event.preventDefault();
if (document.activeElement == query) head.focus();
@@ -44,7 +44,7 @@
}
}
- // UP (38)
+ // UP (38)
if (event.keyCode == 38) {
event.preventDefault();
if (document.activeElement == query) tail.focus();
@@ -92,11 +92,30 @@
}
});
- function fetchJson(url, callback) {
+ let data = {};
+
+ function isEmpty(obj) {
+ return Object.keys(obj).length === 0;
+ }
+
+ function appendItemsTo(local, remote) {
+ const paginated = Object.keys(remote).includes("next_url");
+ if (isEmpty(local)) {
+ local = remote;
+ } else {
+ local.items = local.items.concat(remote.items);
+ }
+ if (paginated) {
+ fetchJson(remote.next_url, local);
+ }
+ data = local;
+ }
+
+ function fetchJson(url, store) {
const httpRequest = new XMLHttpRequest();
httpRequest.onreadystatechange = function () {
if (httpRequest.readyState === 4 && httpRequest.status === 200) {
- if (callback) callback(JSON.parse(httpRequest.responseText));
+ appendItemsTo(store, JSON.parse(httpRequest.responseText));
}
};
httpRequest.open("GET", url);
@@ -122,28 +141,26 @@
});
}
- let firstRun = true; // allow us to delay loading json data unless search activated
+ let firstRun = true;
function initialize() {
if (firstRun) {
loadScript(window.location.origin + "/js/fuzzysort.js")
.then(() => {
firstRun = false;
- fetchJson("/index.json", function (data) {
- const options = {
- key: ["title"],
- };
+ fetchJson("/index.json", {});
- query.addEventListener("keyup", function () {
- search(query.value, data.items, options);
- });
+ const options = { key: ["title"] };
- query.addEventListener("focusin", function () {
- search(query.value, data.items, options);
- });
+ query.addEventListener("keyup", function () {
+ search(query.value, data.items, options);
+ });
+ query.addEventListener("focusin", function () {
search(query.value, data.items, options);
});
+
+ search(query.value, data.items, options);
}).catch((error) => {
console.log("Error failed to load fuzzy sort: " + error);
});