Skip to content

Commit 4c1f405

Browse files
authored
Merge pull request #58 from anxkhn/feat/pagination-ui
feat: add configurable rows-per-page selector
2 parents e8b4548 + 5f0f058 commit 4c1f405

File tree

2 files changed

+76
-20
lines changed

2 files changed

+76
-20
lines changed

index.html

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,10 @@
109109

110110
</div>
111111
<div class="col-12 col-md-6 d-flex align-items-center justify-content-md-end justify-content-start mt-2 mt-md-0">
112-
<select id="pageSelect" class="form-select form-select-sm" style="max-width: 72px;"></select>
113-
<button id="prevPage" class="ms-2 px-2 btn btn-secondary btn-sm">Previous</button>
112+
<span class="me-2 text-secondary" style="font-size: 12px;">Rows per page:</span>
113+
<select id="pageSizeSelect" class="form-select form-select-sm" style="max-width: 72px;"></select>
114+
<span id="showingText" class="ms-3 me-2 text-secondary" style="font-size: 12px; white-space: nowrap;">Showing 0–0 of 0</span>
115+
<button id="prevPage" class="ms-2 px-2 btn btn-secondary btn-sm">Prev</button>
114116
<button id="nextPage" class="ms-2 px-2 btn btn-primary btn-sm">Next</button>
115117
</div>
116118
</div>

script.js

Lines changed: 72 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
// Constants and Variables
22
const minDataPointsForBoxPlot = 2;
33
const validYoeBucket = new Set(["Entry (0-1)", "Mid (2-6)", "Senior (7-10)", "Senior + (11+)"]);
4-
const offersPerPage = 10;
4+
let offersPerPage = 10;
5+
let pageSize = 10;
56
let currentPage = 1;
67
let offers = [];
78
let filteredOffers = [];
@@ -292,6 +293,8 @@ function displayOffers(page) {
292293
container.innerHTML = '';
293294
container.appendChild(table);
294295
renderPageOptions();
296+
renderShowingText();
297+
updatePrevNextDisabledState();
295298

296299
}
297300

@@ -330,19 +333,68 @@ function sortOffers(column) {
330333
displayOffers(currentPage);
331334
}
332335

336+
function computeTotalPages() {
337+
const pageSizeSelect = document.getElementById('pageSizeSelect');
338+
let selected = pageSizeSelect ? pageSizeSelect.value : String(pageSize);
339+
if (!selected) {
340+
selected = String(pageSize || 10);
341+
}
342+
if (selected === 'all') {
343+
pageSize = 'all';
344+
offersPerPage = filteredOffers.length || 1;
345+
totalPages = 1;
346+
currentPage = 1;
347+
} else {
348+
const parsed = parseInt(selected, 10);
349+
pageSize = Number.isNaN(parsed) || parsed <= 0 ? 10 : parsed;
350+
offersPerPage = pageSize;
351+
totalPages = Math.ceil(filteredOffers.length / offersPerPage) || 1;
352+
if (currentPage > totalPages) currentPage = totalPages;
353+
if (currentPage < 1) currentPage = 1;
354+
}
355+
}
356+
333357
function renderPageOptions() {
334-
const pageSelect = document.getElementById('pageSelect');
335-
pageSelect.innerHTML = '';
336-
337-
for (let i = 1; i <= totalPages; i++) {
338-
const option = document.createElement('option');
339-
option.value = i;
340-
option.textContent = i;
341-
if (i === currentPage) {
342-
option.selected = true;
343-
}
344-
pageSelect.appendChild(option);
358+
// Ensure rows-per-page options exist and reflect current selection
359+
const pageSizeSelect = document.getElementById('pageSizeSelect');
360+
if (!pageSizeSelect) return;
361+
if (pageSizeSelect.options.length === 0) {
362+
[10, 20, 50, 100].forEach(size => {
363+
const opt = document.createElement('option');
364+
opt.value = String(size);
365+
opt.textContent = String(size);
366+
pageSizeSelect.appendChild(opt);
367+
});
368+
const allOpt = document.createElement('option');
369+
allOpt.value = 'all';
370+
allOpt.textContent = 'All';
371+
pageSizeSelect.appendChild(allOpt);
345372
}
373+
// Set selected
374+
Array.from(pageSizeSelect.options).forEach(opt => {
375+
opt.selected = (opt.value === String(pageSize));
376+
});
377+
}
378+
379+
function renderShowingText() {
380+
const showingTextEl = document.getElementById('showingText');
381+
if (!showingTextEl) return;
382+
const total = filteredOffers.length;
383+
if (total === 0) {
384+
showingTextEl.textContent = 'Showing 0–0 of 0';
385+
return;
386+
}
387+
const start = (currentPage - 1) * offersPerPage + 1;
388+
const end = Math.min(currentPage * offersPerPage, total);
389+
showingTextEl.textContent = `Showing ${start}${end} of ${total}`;
390+
}
391+
392+
function updatePrevNextDisabledState() {
393+
const prevBtn = document.getElementById('prevPage');
394+
const nextBtn = document.getElementById('nextPage');
395+
if (!prevBtn || !nextBtn) return;
396+
prevBtn.disabled = currentPage <= 1;
397+
nextBtn.disabled = currentPage >= totalPages || (currentPage * offersPerPage) >= filteredOffers.length;
346398
}
347399

348400
function mostOfferCompanies(jsonData) {
@@ -401,7 +453,8 @@ document.addEventListener('DOMContentLoaded', async function () {
401453
const data = await response.json();
402454
offers = data;
403455
filteredOffers = [...offers];
404-
totalPages = Math.ceil(filteredOffers.length / offersPerPage);
456+
renderPageOptions();
457+
computeTotalPages();
405458
displayOffers(currentPage);
406459
}
407460

@@ -430,9 +483,11 @@ document.addEventListener('DOMContentLoaded', async function () {
430483
}
431484
});
432485

433-
// Page selection dropdown event listener
434-
document.getElementById('pageSelect').addEventListener('change', (event) => {
435-
currentPage = parseInt(event.target.value);
486+
// no page number dropdown in the UI
487+
488+
// Page size dropdown event listener
489+
document.getElementById('pageSizeSelect').addEventListener('change', () => {
490+
computeTotalPages();
436491
displayOffers(currentPage);
437492
});
438493
function filterOffers() {
@@ -464,8 +519,7 @@ document.addEventListener('DOMContentLoaded', async function () {
464519
}
465520

466521
filteredOffers = tempFilteredOffers;
467-
totalPages = Math.ceil(filteredOffers.length / offersPerPage);
468-
currentPage = 1;
522+
computeTotalPages();
469523

470524
// Update UI elements
471525
setStatsStr(filteredOffers);

0 commit comments

Comments
 (0)