]> Slayer Assistant Repositories - slayer.unlishema.org/.git/commitdiff
Added a lot to the dev test
authorunlishema <unlishema@jtryba.com>
Mon, 22 Sep 2025 13:37:41 +0000 (09:37 -0400)
committerunlishema <unlishema@jtryba.com>
Mon, 22 Sep 2025 13:37:41 +0000 (09:37 -0400)
dist/dev.html
dist/pages/data/version.json
src/dev.html
src/pages/data/version.json

index 3a8229d2f2841148275d726a68d7938b8b0e75d2..5e2bf3ffa27049cc5b3c0da5884c93a960a48087 100644 (file)
             background-color: #fff;
         }
 
+        #limit,
+        #offset {
+            height: 16px;
+            width: 80px;
+            margin-right: 5px;
+        }
+
         #querySearch,
         #querySearch-oldschool {
-            width: 70%;
+            width: 85%;
             padding: 8px;
             margin-right: 10px;
         }
             margin-top: 10px;
         }
 
+        table {
+            width: 100%;
+            border-collapse: collapse;
+            margin-top: 10px;
+        }
+
+        td,
+        th {
+            max-width: 100px;
+            overflow-x: scroll;
+            border: 1px solid #ddd;
+        }
+
+        tr {
+            padding: 8px;
+        }
+
         img {
             max-width: 100px;
             height: auto;
         <div class="input-section">
             <h3>Search a Bucket</h3>
 
-            <label for="querySearch">Enter a bucket API query:</label><br>
+            <label for="querySearch">Enter a bucket API query:</label>
+            <span style="margin: 65px"></span>
+            <input type="number" id="limit" min="0" max="500" value="20"><label for="limit">Limit</label>
+            <input type="number" id="offset" min="0" max="50000" step="20" value="0"><label
+                for="limit">Offset</label><br>
             <input type="text" id="querySearch"
-                value="bucket('infobox_item').select('item_name','item_id','image','examine').run()">
+                value="bucket('infobox_item').select('item_name','item_id','examine').limit(20).offset(0).run()">
             <button onclick="fetchAndDisplayRS3()">Search</button><br>
             <label for="querySelect">Choose an default bucket:</label><br>
             <select id="querySelect"></select><br>
             <h3>Select an Item</h3>
             <label for="itemSelect">Choose an item from query:</label><br>
             <select id="itemSelect"></select>
+            <input id="prevOffset" type="button" value="<" onclick="prevOffset()" style="display: none;">
+            <input id="nextOffset" type="button" value=">" onclick="nextOffset()">
+            <span id="itemCount">Items Found: 0</span>
         </div>
 
         <div class="data-section">
-            <h3>Extracted Item Data <span style="font-size: 12px;">(Max Shown: 10)</span></h3>
-            <div id="extractedData">
-                <p>Select an item to display its data here.</p>
-            </div>
+            <h3>Extracted Item Data <span style="font-size: 12px;">(Max Shown: 500)</span></h3>
+            <table id="extractedData">
+                <caption>
+                    Extracted Data
+                </caption>
+            </table>
         </div>
 
         <div class="raw-data-section">
         <div class="input-section">
             <h3>Search a Bucket</h3>
 
-            <label for="querySearch-oldschool">Enter a bucket API query:</label><br>
+            <label for="querySearch-oldschool">Enter a bucket API query:</label>
+            <span style="margin: 65px"></span>
+            <input type="number" id="limit-oldschool" min="0" max="500" value="20"><label for="limit">Limit</label>
+            <input type="number" id="offset-oldschool" min="0" max="50000" step="20" value="0"><label
+                for="limit">Offset</label><br>
             <input type="text" id="querySearch-oldschool"
-                value="bucket('infobox_item').select('item_name','item_id','image','examine').run()">
+                value="bucket('infobox_item').select('item_name','item_id','examine').limit(20).offset(0).run()">
             <button onclick="fetchAndDisplayOSRS()">Search</button><br>
             <label for="querySelect-oldschool">Choose an default bucket:</label><br>
             <select id="querySelect-oldschool"></select><br>
             <h3>Select an Item</h3>
             <label for="itemSelect-oldschool">Choose an item from query:</label><br>
             <select id="itemSelect-oldschool"></select>
+            <input id="prevOffset-oldschool" type="button" value="<" onclick="prevOffset(true)" style="display: none;">
+            <input id="nextOffset-oldschool" type="button" value=">" onclick="nextOffset(true)">
+            <span id="itemCount-oldschool">Items Found: 0</span>
         </div>
 
         <div class="data-section">
-            <h3>Extracted Item Data <span style="font-size: 12px;">(Max Shown: 10)</span></h3>
-            <div id="extractedData-oldschool">
-                <p>Select an item to display its data here.</p>
-            </div>
+            <h3>Extracted Item Data <span style="font-size: 12px;">(Max Shown: 500)</span></h3>
+            <table id="extractedData-oldschool">
+                <caption>
+                    Extracted Data
+                </caption>
+            </table>
         </div>
 
         <div class="raw-data-section">
         document.addEventListener("DOMContentLoaded", async () => {
             // Populate the RS3 combobox with some default items
             const defaultItemsRS3 = [
-                { name: "Items", query: "bucket('infobox_item').select('item_name','item_id','image','examine').run()" },
-                { name: "Monsters", query: "bucket('infobox_monster').select('name', 'examine').run()" },
-                { name: "Locations", query: "bucket('infobox_location').select('page_name', 'is_members_only').run()" },
+                { name: "Items", query: "bucket('infobox_item').select('item_name','item_id','examine').limit(20).offset(0).run()" },
+                { name: "Monsters", query: "bucket('infobox_monster').select('name', 'examine').limit(20).offset(0).run()" },
+                { name: "Locations", query: "bucket('infobox_location').select('page_name', 'is_members_only').limit(20).offset(0).run()" },
             ];
+            // TODO Readjust all these these defaults for RS3 & OSRS
+
             // Populate the OSRS combobox with some default items
             const defaultItemsOSRS = [
-                { name: "Items", query: "bucket('infobox_item').select('item_name','item_id','image','examine').run()" },
-                { name: "Monsters", query: "bucket('infobox_monster').select('name', 'examine').run()" },
-                { name: "Construction", query: "bucket('infobox_construction').select('page_name', 'image').run()" },
-                { name: "Locations", query: "bucket('infobox_location').select('page_name', 'is_members_only').run()" },
+                { name: "Items", query: "bucket('infobox_item').select('item_name','item_id','examine').limit(20).offset(0).run()" },
+                { name: "Monsters", query: "bucket('infobox_monster').select('name', 'examine').limit(20).offset(0).run()" },
+                { name: "Construction", query: "bucket('infobox_construction').select('page_name', 'image').limit(20).offset(0).run()" },
+                { name: "Locations", query: "bucket('infobox_location').select('page_name', 'is_members_only').limit(20).offset(0).run()" },
             ];
 
+            const limitRS3 = document.getElementById("limit");
+            const offsetRS3 = document.getElementById("offset");
             const queryBoxRS3 = document.getElementById("querySelect");
             const selectBoxRS3 = document.getElementById("itemSelect");
+            const limitOSRS = document.getElementById("limit-oldschool");
+            const offsetOSRS = document.getElementById("offset-oldschool");
             const queryBoxOSRS = document.getElementById("querySelect-oldschool");
             const selectBoxOSRS = document.getElementById("itemSelect-oldschool");
 
                 queryBoxOSRS.appendChild(option);
             });
 
-            // Add event listener to the queryBoxRS3 using an arrow function
-            queryBoxRS3.addEventListener("change", (event) => {
-                handleQueryChange(event, true);
-            });
-
-            // Add event listener to the selectBoxRS3 using an arrow function
-            selectBoxRS3.addEventListener("change", (event) => {
-                handleQueryChange(event, false);
-            });
+            // Add event listener to the limit & offset using arrow functions
+            limitRS3.addEventListener("change", () => { handleNumberChange("limit", false); });
+            offsetRS3.addEventListener("change", () => { handleNumberChange("offset", false); });
+            limitOSRS.addEventListener("change", () => { handleNumberChange("limit", true); });
+            offsetOSRS.addEventListener("change", () => { handleNumberChange("offset", true); });
 
-            // Add event listener to the queryBoxOSRS using an arrow function
-            queryBoxOSRS.addEventListener("change", (event) => {
-                handleQueryChange(event, true, true);
-            });
+            // Handle selection changes in the comboboxes
+            limitRS3.addEventListener("keydown", (event) => { if (event.key === "Enter") { handleNumberChange("limit", false); fetchAndDisplayRS3(null); } });
+            offsetRS3.addEventListener("keydown", (event) => { if (event.key === "Enter") { handleNumberChange("offset", false); fetchAndDisplayRS3(null) } });
+            limitOSRS.addEventListener("keydown", (event) => { if (event.key === "Enter") { handleNumberChange("limit", true); fetchAndDisplayOSRS(null) } });
+            offsetOSRS.addEventListener("keydown", (event) => { if (event.key === "Enter") { handleNumberChange("offset", true); fetchAndDisplayOSRS(null) } });
 
-            // Add event listener to the selectBoxOSRS using an arrow function
-            selectBoxOSRS.addEventListener("change", (event) => {
-                handleQueryChange(event, false, true);
-            });
+            // Add event listener to the queryBox & selectBox using arrow functions
+            queryBoxRS3.addEventListener("change", (event) => { handleQueryChange(event, true); });
+            selectBoxRS3.addEventListener("change", (event) => { handleQueryChange(event, false); });
+            queryBoxOSRS.addEventListener("change", (event) => { handleQueryChange(event, true, true); });
+            selectBoxOSRS.addEventListener("change", (event) => { handleQueryChange(event, false, true); });
 
             fetchAndDisplayRS3(); // Initial fetch with default value
             fetchAndDisplayOSRS(); // Initial fetch with default value
             alert(`${oldschool ? "OSRS" : "RS3"} Cache cleared!`);
         }
 
+        function prevOffset(oldschool = false) {
+            let offsetInput = document.getElementById(`offset${oldschool ? "-oldschool" : ""}`);
+            let limitInput = document.getElementById(`limit${oldschool ? "-oldschool" : ""}`);
+            let currentOffset = parseInt(offsetInput.value);
+            let limit = parseInt(limitInput.value);
+            if (isNaN(currentOffset)) currentOffset = 0;
+            if (isNaN(limit)) limit = 20;
+
+            // Decrease offset by limit, but not below 0
+            currentOffset -= limit;
+            if (currentOffset < 0) currentOffset = 0;
+            offsetInput.value = currentOffset;
+            handleNumberChange("offset", oldschool);
+            let itemCount = fetchAndDisplayData(document.getElementById(`querySearch${oldschool ? "-oldschool" : ""}`).value, false, oldschool);
+        }
+
+        async function nextOffset(oldschool = false) {
+
+            let offsetInput = document.getElementById(`offset${oldschool ? "-oldschool" : ""}`);
+            let limitInput = document.getElementById(`limit${oldschool ? "-oldschool" : ""}`);
+            let currentOffset = parseInt(offsetInput.value);
+            let limit = parseInt(limitInput.value);
+            if (isNaN(currentOffset)) currentOffset = 0;
+            if (isNaN(limit)) limit = 20;
+
+            // Increase offset by limit
+            offsetInput.value = currentOffset + limit;
+            handleNumberChange("offset", oldschool);
+            let itemCount = await fetchAndDisplayData(document.getElementById(`querySearch${oldschool ? "-oldschool" : ""}`).value, false, oldschool);
+        }
+
+        function handleNumberChange(type, oldschool = false) {
+            let newLimit = parseInt(document.getElementById(`limit${oldschool ? "-oldschool" : ""}`).value);
+            let newOffset = parseInt(document.getElementById(`offset${oldschool ? "-oldschool" : ""}`).value);
+            if (isNaN(newLimit) || newLimit < 0) newLimit = 20;
+            if (isNaN(newOffset) || newOffset < 0) newOffset = 0;
+            document.getElementById(`limit${oldschool ? "-oldschool" : ""}`).value = newLimit;
+            document.getElementById(`offset${oldschool ? "-oldschool" : ""}`).step = newLimit
+            document.getElementById(`offset${oldschool ? "-oldschool" : ""}`).value = newOffset;
+
+            let searchValue = document.getElementById(`querySearch${oldschool ? "-oldschool" : ""}`).value;
+            searchValue = searchValue.replace(/\.limit\(\d+\)/, ''); // Remove existing limit
+            searchValue = searchValue.replace(/\.offset\(\d+\)/, ''); // Remove existing offset
+            searchValue = searchValue.replace(/\.run\(\)/, ''); // Remove existing limit
+            searchValue += `.limit(${newLimit}).offset(${newOffset}).run()`; // Append new limit
+            document.getElementById(`querySearch${oldschool ? "-oldschool" : ""}`).value = searchValue;
+        }
+
         // Function to handle changes in the search input
         function handleQueryChange(event, updateItemList, oldschool = false) {
             const newValue = event.target.value;
         async function fetchAndDisplayData(query, updateItemList = true, oldschool = false) {
             if (!query)
                 query = document.getElementById(`querySearch${oldschool ? "-oldschool" : ""}`).value;
+
             const bucketName = extractBucketName(query);
             const keys = extractSelectKeys(query);
 
                 // Clear previous content
                 extractedDataElement.innerHTML = "";
 
-                const maxCount = 10; // Limit the number of displayed items
+                // Set itemCount for for query results
+                let itemCount = document.getElementById(`itemCount${oldschool ? "-oldschool" : ""}`);
+                itemCount.innerText = `Items Found: ${itemData.bucket.length}`;
+
+                // Hide/show previous button
+                if (parseInt(document.getElementById(`offset${oldschool ? "-oldschool" : ""}`).value) <= 0)
+                    document.getElementById(`prevOffset${oldschool ? "-oldschool" : ""}`).style = "display: none";
+                else
+                    document.getElementById(`prevOffset${oldschool ? "-oldschool" : ""}`).style = "display: inline";
+
+                // Hide/show next button
+                if (itemData.bucket.length < parseInt(document.getElementById(`limit${oldschool ? "-oldschool" : ""}`).value))
+                    document.getElementById(`nextOffset${oldschool ? "-oldschool" : ""}`).style = "display: none";
+                else
+                    document.getElementById(`nextOffset${oldschool ? "-oldschool" : ""}`).style = "display: inline";
+
+                const maxCount = 500; // Limit the number of displayed items
                 let previousItemValue = null;
                 for (let i = 0; i < itemData.bucket.length; i++) {
                     const item = itemData.bucket[i];
 
+                    // Add each item to the combobox if updateItemList is true
                     if (updateItemList && itemData.bucket.length > 1) {
                         let itemSelect = document.getElementById(`itemSelect${oldschool ? "-oldschool" : ""}`);
                         if (i == 0) {
                         for (const key of keys)
                             option.value += `'${key}',`;
                         option.value = option.value.slice(0, -1); // Remove trailing comma
-                        option.value += `).where('${keys[0]}', '${item[keys[0]].replaceAll("'", "\\'")}').run()`;
+                        option.value += `).where('${keys[0]}', '${item[keys[0]].replaceAll("'", "\\'")}').limit(20).offset(0).run()`;
 
                         option.textContent = keys ? item[keys[0]] : "No KEYS";
                         if (!previousItemValue || previousItemValue != item[keys[0]])
                     }
                     if (i > maxCount) continue; // Only display the first item by default
 
-                    for (const key of keys)
-                        extractedDataElement.innerHTML += `<p><strong>${key}:</strong> ${!(key in item) ? 'false' : (item[key] === '' ? 'true' : item[key])}</p>`;
+                    // Setup the table header row
+                    if (i == 0) {
+                        let rowEntry = document.createElement('tr');
+                        for (const key of keys) {
+                            let cellEntry = document.createElement('th')
+                            cellEntry.innerHTML = `<strong>${key}</strong>`;
+                            rowEntry.appendChild(cellEntry);
+                        }
+                        extractedDataElement.appendChild(rowEntry);
+                    }
 
-                    // Show a horizontal line between items, but not after the last one
-                    if (i < maxCount && i < itemData.bucket.length - 1) extractedDataElement.innerHTML += `<hr>`;
+                    let rowEntry = document.createElement('tr');
+                    for (const key of keys) {
+                        let cellEntry = document.createElement('td')
+                        cellEntry.innerHTML = `${!(key in item) ? 'false' : (item[key] === '' ? 'true' : item[key])}`;
+                        rowEntry.appendChild(cellEntry);
+                    }
+                    extractedDataElement.appendChild(rowEntry);
 
                 }
 
                 rawDataElement.innerHTML = `<pre>${JSON.stringify(itemData, null, 2)}</pre>`;
+                return parseInt(itemData.bucket.length);
             } else {
                 extractedDataElement.textContent = "Failed to fetch data from the API.";
                 rawDataElement.textContent = "No raw data available.";
             }
+            return 0;
         }
 
         // --- Request Queue System ---
index a674bfd42b5f50ec76c4a0640a64d70c71f89804..8ef11f468d99f1907f52a11a5f323cf8ccf3ab7c 100644 (file)
@@ -1,3 +1,3 @@
 {
-  "version": "0.0.35"
+  "version": "0.0.36"
 }
\ No newline at end of file
index 3a8229d2f2841148275d726a68d7938b8b0e75d2..5e2bf3ffa27049cc5b3c0da5884c93a960a48087 100644 (file)
             background-color: #fff;
         }
 
+        #limit,
+        #offset {
+            height: 16px;
+            width: 80px;
+            margin-right: 5px;
+        }
+
         #querySearch,
         #querySearch-oldschool {
-            width: 70%;
+            width: 85%;
             padding: 8px;
             margin-right: 10px;
         }
             margin-top: 10px;
         }
 
+        table {
+            width: 100%;
+            border-collapse: collapse;
+            margin-top: 10px;
+        }
+
+        td,
+        th {
+            max-width: 100px;
+            overflow-x: scroll;
+            border: 1px solid #ddd;
+        }
+
+        tr {
+            padding: 8px;
+        }
+
         img {
             max-width: 100px;
             height: auto;
         <div class="input-section">
             <h3>Search a Bucket</h3>
 
-            <label for="querySearch">Enter a bucket API query:</label><br>
+            <label for="querySearch">Enter a bucket API query:</label>
+            <span style="margin: 65px"></span>
+            <input type="number" id="limit" min="0" max="500" value="20"><label for="limit">Limit</label>
+            <input type="number" id="offset" min="0" max="50000" step="20" value="0"><label
+                for="limit">Offset</label><br>
             <input type="text" id="querySearch"
-                value="bucket('infobox_item').select('item_name','item_id','image','examine').run()">
+                value="bucket('infobox_item').select('item_name','item_id','examine').limit(20).offset(0).run()">
             <button onclick="fetchAndDisplayRS3()">Search</button><br>
             <label for="querySelect">Choose an default bucket:</label><br>
             <select id="querySelect"></select><br>
             <h3>Select an Item</h3>
             <label for="itemSelect">Choose an item from query:</label><br>
             <select id="itemSelect"></select>
+            <input id="prevOffset" type="button" value="<" onclick="prevOffset()" style="display: none;">
+            <input id="nextOffset" type="button" value=">" onclick="nextOffset()">
+            <span id="itemCount">Items Found: 0</span>
         </div>
 
         <div class="data-section">
-            <h3>Extracted Item Data <span style="font-size: 12px;">(Max Shown: 10)</span></h3>
-            <div id="extractedData">
-                <p>Select an item to display its data here.</p>
-            </div>
+            <h3>Extracted Item Data <span style="font-size: 12px;">(Max Shown: 500)</span></h3>
+            <table id="extractedData">
+                <caption>
+                    Extracted Data
+                </caption>
+            </table>
         </div>
 
         <div class="raw-data-section">
         <div class="input-section">
             <h3>Search a Bucket</h3>
 
-            <label for="querySearch-oldschool">Enter a bucket API query:</label><br>
+            <label for="querySearch-oldschool">Enter a bucket API query:</label>
+            <span style="margin: 65px"></span>
+            <input type="number" id="limit-oldschool" min="0" max="500" value="20"><label for="limit">Limit</label>
+            <input type="number" id="offset-oldschool" min="0" max="50000" step="20" value="0"><label
+                for="limit">Offset</label><br>
             <input type="text" id="querySearch-oldschool"
-                value="bucket('infobox_item').select('item_name','item_id','image','examine').run()">
+                value="bucket('infobox_item').select('item_name','item_id','examine').limit(20).offset(0).run()">
             <button onclick="fetchAndDisplayOSRS()">Search</button><br>
             <label for="querySelect-oldschool">Choose an default bucket:</label><br>
             <select id="querySelect-oldschool"></select><br>
             <h3>Select an Item</h3>
             <label for="itemSelect-oldschool">Choose an item from query:</label><br>
             <select id="itemSelect-oldschool"></select>
+            <input id="prevOffset-oldschool" type="button" value="<" onclick="prevOffset(true)" style="display: none;">
+            <input id="nextOffset-oldschool" type="button" value=">" onclick="nextOffset(true)">
+            <span id="itemCount-oldschool">Items Found: 0</span>
         </div>
 
         <div class="data-section">
-            <h3>Extracted Item Data <span style="font-size: 12px;">(Max Shown: 10)</span></h3>
-            <div id="extractedData-oldschool">
-                <p>Select an item to display its data here.</p>
-            </div>
+            <h3>Extracted Item Data <span style="font-size: 12px;">(Max Shown: 500)</span></h3>
+            <table id="extractedData-oldschool">
+                <caption>
+                    Extracted Data
+                </caption>
+            </table>
         </div>
 
         <div class="raw-data-section">
         document.addEventListener("DOMContentLoaded", async () => {
             // Populate the RS3 combobox with some default items
             const defaultItemsRS3 = [
-                { name: "Items", query: "bucket('infobox_item').select('item_name','item_id','image','examine').run()" },
-                { name: "Monsters", query: "bucket('infobox_monster').select('name', 'examine').run()" },
-                { name: "Locations", query: "bucket('infobox_location').select('page_name', 'is_members_only').run()" },
+                { name: "Items", query: "bucket('infobox_item').select('item_name','item_id','examine').limit(20).offset(0).run()" },
+                { name: "Monsters", query: "bucket('infobox_monster').select('name', 'examine').limit(20).offset(0).run()" },
+                { name: "Locations", query: "bucket('infobox_location').select('page_name', 'is_members_only').limit(20).offset(0).run()" },
             ];
+            // TODO Readjust all these these defaults for RS3 & OSRS
+
             // Populate the OSRS combobox with some default items
             const defaultItemsOSRS = [
-                { name: "Items", query: "bucket('infobox_item').select('item_name','item_id','image','examine').run()" },
-                { name: "Monsters", query: "bucket('infobox_monster').select('name', 'examine').run()" },
-                { name: "Construction", query: "bucket('infobox_construction').select('page_name', 'image').run()" },
-                { name: "Locations", query: "bucket('infobox_location').select('page_name', 'is_members_only').run()" },
+                { name: "Items", query: "bucket('infobox_item').select('item_name','item_id','examine').limit(20).offset(0).run()" },
+                { name: "Monsters", query: "bucket('infobox_monster').select('name', 'examine').limit(20).offset(0).run()" },
+                { name: "Construction", query: "bucket('infobox_construction').select('page_name', 'image').limit(20).offset(0).run()" },
+                { name: "Locations", query: "bucket('infobox_location').select('page_name', 'is_members_only').limit(20).offset(0).run()" },
             ];
 
+            const limitRS3 = document.getElementById("limit");
+            const offsetRS3 = document.getElementById("offset");
             const queryBoxRS3 = document.getElementById("querySelect");
             const selectBoxRS3 = document.getElementById("itemSelect");
+            const limitOSRS = document.getElementById("limit-oldschool");
+            const offsetOSRS = document.getElementById("offset-oldschool");
             const queryBoxOSRS = document.getElementById("querySelect-oldschool");
             const selectBoxOSRS = document.getElementById("itemSelect-oldschool");
 
                 queryBoxOSRS.appendChild(option);
             });
 
-            // Add event listener to the queryBoxRS3 using an arrow function
-            queryBoxRS3.addEventListener("change", (event) => {
-                handleQueryChange(event, true);
-            });
-
-            // Add event listener to the selectBoxRS3 using an arrow function
-            selectBoxRS3.addEventListener("change", (event) => {
-                handleQueryChange(event, false);
-            });
+            // Add event listener to the limit & offset using arrow functions
+            limitRS3.addEventListener("change", () => { handleNumberChange("limit", false); });
+            offsetRS3.addEventListener("change", () => { handleNumberChange("offset", false); });
+            limitOSRS.addEventListener("change", () => { handleNumberChange("limit", true); });
+            offsetOSRS.addEventListener("change", () => { handleNumberChange("offset", true); });
 
-            // Add event listener to the queryBoxOSRS using an arrow function
-            queryBoxOSRS.addEventListener("change", (event) => {
-                handleQueryChange(event, true, true);
-            });
+            // Handle selection changes in the comboboxes
+            limitRS3.addEventListener("keydown", (event) => { if (event.key === "Enter") { handleNumberChange("limit", false); fetchAndDisplayRS3(null); } });
+            offsetRS3.addEventListener("keydown", (event) => { if (event.key === "Enter") { handleNumberChange("offset", false); fetchAndDisplayRS3(null) } });
+            limitOSRS.addEventListener("keydown", (event) => { if (event.key === "Enter") { handleNumberChange("limit", true); fetchAndDisplayOSRS(null) } });
+            offsetOSRS.addEventListener("keydown", (event) => { if (event.key === "Enter") { handleNumberChange("offset", true); fetchAndDisplayOSRS(null) } });
 
-            // Add event listener to the selectBoxOSRS using an arrow function
-            selectBoxOSRS.addEventListener("change", (event) => {
-                handleQueryChange(event, false, true);
-            });
+            // Add event listener to the queryBox & selectBox using arrow functions
+            queryBoxRS3.addEventListener("change", (event) => { handleQueryChange(event, true); });
+            selectBoxRS3.addEventListener("change", (event) => { handleQueryChange(event, false); });
+            queryBoxOSRS.addEventListener("change", (event) => { handleQueryChange(event, true, true); });
+            selectBoxOSRS.addEventListener("change", (event) => { handleQueryChange(event, false, true); });
 
             fetchAndDisplayRS3(); // Initial fetch with default value
             fetchAndDisplayOSRS(); // Initial fetch with default value
             alert(`${oldschool ? "OSRS" : "RS3"} Cache cleared!`);
         }
 
+        function prevOffset(oldschool = false) {
+            let offsetInput = document.getElementById(`offset${oldschool ? "-oldschool" : ""}`);
+            let limitInput = document.getElementById(`limit${oldschool ? "-oldschool" : ""}`);
+            let currentOffset = parseInt(offsetInput.value);
+            let limit = parseInt(limitInput.value);
+            if (isNaN(currentOffset)) currentOffset = 0;
+            if (isNaN(limit)) limit = 20;
+
+            // Decrease offset by limit, but not below 0
+            currentOffset -= limit;
+            if (currentOffset < 0) currentOffset = 0;
+            offsetInput.value = currentOffset;
+            handleNumberChange("offset", oldschool);
+            let itemCount = fetchAndDisplayData(document.getElementById(`querySearch${oldschool ? "-oldschool" : ""}`).value, false, oldschool);
+        }
+
+        async function nextOffset(oldschool = false) {
+
+            let offsetInput = document.getElementById(`offset${oldschool ? "-oldschool" : ""}`);
+            let limitInput = document.getElementById(`limit${oldschool ? "-oldschool" : ""}`);
+            let currentOffset = parseInt(offsetInput.value);
+            let limit = parseInt(limitInput.value);
+            if (isNaN(currentOffset)) currentOffset = 0;
+            if (isNaN(limit)) limit = 20;
+
+            // Increase offset by limit
+            offsetInput.value = currentOffset + limit;
+            handleNumberChange("offset", oldschool);
+            let itemCount = await fetchAndDisplayData(document.getElementById(`querySearch${oldschool ? "-oldschool" : ""}`).value, false, oldschool);
+        }
+
+        function handleNumberChange(type, oldschool = false) {
+            let newLimit = parseInt(document.getElementById(`limit${oldschool ? "-oldschool" : ""}`).value);
+            let newOffset = parseInt(document.getElementById(`offset${oldschool ? "-oldschool" : ""}`).value);
+            if (isNaN(newLimit) || newLimit < 0) newLimit = 20;
+            if (isNaN(newOffset) || newOffset < 0) newOffset = 0;
+            document.getElementById(`limit${oldschool ? "-oldschool" : ""}`).value = newLimit;
+            document.getElementById(`offset${oldschool ? "-oldschool" : ""}`).step = newLimit
+            document.getElementById(`offset${oldschool ? "-oldschool" : ""}`).value = newOffset;
+
+            let searchValue = document.getElementById(`querySearch${oldschool ? "-oldschool" : ""}`).value;
+            searchValue = searchValue.replace(/\.limit\(\d+\)/, ''); // Remove existing limit
+            searchValue = searchValue.replace(/\.offset\(\d+\)/, ''); // Remove existing offset
+            searchValue = searchValue.replace(/\.run\(\)/, ''); // Remove existing limit
+            searchValue += `.limit(${newLimit}).offset(${newOffset}).run()`; // Append new limit
+            document.getElementById(`querySearch${oldschool ? "-oldschool" : ""}`).value = searchValue;
+        }
+
         // Function to handle changes in the search input
         function handleQueryChange(event, updateItemList, oldschool = false) {
             const newValue = event.target.value;
         async function fetchAndDisplayData(query, updateItemList = true, oldschool = false) {
             if (!query)
                 query = document.getElementById(`querySearch${oldschool ? "-oldschool" : ""}`).value;
+
             const bucketName = extractBucketName(query);
             const keys = extractSelectKeys(query);
 
                 // Clear previous content
                 extractedDataElement.innerHTML = "";
 
-                const maxCount = 10; // Limit the number of displayed items
+                // Set itemCount for for query results
+                let itemCount = document.getElementById(`itemCount${oldschool ? "-oldschool" : ""}`);
+                itemCount.innerText = `Items Found: ${itemData.bucket.length}`;
+
+                // Hide/show previous button
+                if (parseInt(document.getElementById(`offset${oldschool ? "-oldschool" : ""}`).value) <= 0)
+                    document.getElementById(`prevOffset${oldschool ? "-oldschool" : ""}`).style = "display: none";
+                else
+                    document.getElementById(`prevOffset${oldschool ? "-oldschool" : ""}`).style = "display: inline";
+
+                // Hide/show next button
+                if (itemData.bucket.length < parseInt(document.getElementById(`limit${oldschool ? "-oldschool" : ""}`).value))
+                    document.getElementById(`nextOffset${oldschool ? "-oldschool" : ""}`).style = "display: none";
+                else
+                    document.getElementById(`nextOffset${oldschool ? "-oldschool" : ""}`).style = "display: inline";
+
+                const maxCount = 500; // Limit the number of displayed items
                 let previousItemValue = null;
                 for (let i = 0; i < itemData.bucket.length; i++) {
                     const item = itemData.bucket[i];
 
+                    // Add each item to the combobox if updateItemList is true
                     if (updateItemList && itemData.bucket.length > 1) {
                         let itemSelect = document.getElementById(`itemSelect${oldschool ? "-oldschool" : ""}`);
                         if (i == 0) {
                         for (const key of keys)
                             option.value += `'${key}',`;
                         option.value = option.value.slice(0, -1); // Remove trailing comma
-                        option.value += `).where('${keys[0]}', '${item[keys[0]].replaceAll("'", "\\'")}').run()`;
+                        option.value += `).where('${keys[0]}', '${item[keys[0]].replaceAll("'", "\\'")}').limit(20).offset(0).run()`;
 
                         option.textContent = keys ? item[keys[0]] : "No KEYS";
                         if (!previousItemValue || previousItemValue != item[keys[0]])
                     }
                     if (i > maxCount) continue; // Only display the first item by default
 
-                    for (const key of keys)
-                        extractedDataElement.innerHTML += `<p><strong>${key}:</strong> ${!(key in item) ? 'false' : (item[key] === '' ? 'true' : item[key])}</p>`;
+                    // Setup the table header row
+                    if (i == 0) {
+                        let rowEntry = document.createElement('tr');
+                        for (const key of keys) {
+                            let cellEntry = document.createElement('th')
+                            cellEntry.innerHTML = `<strong>${key}</strong>`;
+                            rowEntry.appendChild(cellEntry);
+                        }
+                        extractedDataElement.appendChild(rowEntry);
+                    }
 
-                    // Show a horizontal line between items, but not after the last one
-                    if (i < maxCount && i < itemData.bucket.length - 1) extractedDataElement.innerHTML += `<hr>`;
+                    let rowEntry = document.createElement('tr');
+                    for (const key of keys) {
+                        let cellEntry = document.createElement('td')
+                        cellEntry.innerHTML = `${!(key in item) ? 'false' : (item[key] === '' ? 'true' : item[key])}`;
+                        rowEntry.appendChild(cellEntry);
+                    }
+                    extractedDataElement.appendChild(rowEntry);
 
                 }
 
                 rawDataElement.innerHTML = `<pre>${JSON.stringify(itemData, null, 2)}</pre>`;
+                return parseInt(itemData.bucket.length);
             } else {
                 extractedDataElement.textContent = "Failed to fetch data from the API.";
                 rawDataElement.textContent = "No raw data available.";
             }
+            return 0;
         }
 
         // --- Request Queue System ---
index a674bfd42b5f50ec76c4a0640a64d70c71f89804..8ef11f468d99f1907f52a11a5f323cf8ccf3ab7c 100644 (file)
@@ -1,3 +1,3 @@
 {
-  "version": "0.0.35"
+  "version": "0.0.36"
 }
\ No newline at end of file