Skip to content

Commit 5f0f058

Browse files
committed
refactor: enhance pagination UI and functionality
1 parent 985300c commit 5f0f058

File tree

2 files changed

+53
-28
lines changed

2 files changed

+53
-28
lines changed

index.html

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -109,16 +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-
<label for="pageSizeSelect" class="me-2 mb-0 text-secondary" style="font-size: 12px;">Rows:</label>
113-
<select id="pageSizeSelect" class="form-select form-select-sm" style="max-width: 92px;">
114-
<option value="10" selected>10</option>
115-
<option value="20">20</option>
116-
<option value="50">50</option>
117-
<option value="100">100</option>
118-
<option value="all">All</option>
119-
</select>
120-
<select id="pageSelect" class="form-select form-select-sm" style="max-width: 72px;"></select>
121-
<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>
122116
<button id="nextPage" class="ms-2 px-2 btn btn-primary btn-sm">Next</button>
123117
</div>
124118
</div>

script.js

Lines changed: 49 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,8 @@ function displayOffers(page) {
293293
container.innerHTML = '';
294294
container.appendChild(table);
295295
renderPageOptions();
296+
renderShowingText();
297+
updatePrevNextDisabledState();
296298

297299
}
298300

@@ -333,14 +335,18 @@ function sortOffers(column) {
333335

334336
function computeTotalPages() {
335337
const pageSizeSelect = document.getElementById('pageSizeSelect');
336-
const selected = pageSizeSelect ? pageSizeSelect.value : String(pageSize);
338+
let selected = pageSizeSelect ? pageSizeSelect.value : String(pageSize);
339+
if (!selected) {
340+
selected = String(pageSize || 10);
341+
}
337342
if (selected === 'all') {
338343
pageSize = 'all';
339344
offersPerPage = filteredOffers.length || 1;
340345
totalPages = 1;
341346
currentPage = 1;
342347
} else {
343-
pageSize = parseInt(selected);
348+
const parsed = parseInt(selected, 10);
349+
pageSize = Number.isNaN(parsed) || parsed <= 0 ? 10 : parsed;
344350
offersPerPage = pageSize;
345351
totalPages = Math.ceil(filteredOffers.length / offersPerPage) || 1;
346352
if (currentPage > totalPages) currentPage = totalPages;
@@ -349,18 +355,46 @@ function computeTotalPages() {
349355
}
350356

351357
function renderPageOptions() {
352-
const pageSelect = document.getElementById('pageSelect');
353-
pageSelect.innerHTML = '';
354-
355-
for (let i = 1; i <= totalPages; i++) {
356-
const option = document.createElement('option');
357-
option.value = i;
358-
option.textContent = i;
359-
if (i === currentPage) {
360-
option.selected = true;
361-
}
362-
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);
372+
}
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;
363386
}
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;
364398
}
365399

366400
function mostOfferCompanies(jsonData) {
@@ -395,6 +429,7 @@ document.addEventListener('DOMContentLoaded', async function () {
395429
const data = await response.json();
396430
offers = data;
397431
filteredOffers = [...offers];
432+
renderPageOptions();
398433
computeTotalPages();
399434
displayOffers(currentPage);
400435
}
@@ -423,11 +458,7 @@ document.addEventListener('DOMContentLoaded', async function () {
423458
}
424459
});
425460

426-
// Page selection dropdown event listener
427-
document.getElementById('pageSelect').addEventListener('change', (event) => {
428-
currentPage = parseInt(event.target.value);
429-
displayOffers(currentPage);
430-
});
461+
// no page number dropdown in the UI
431462

432463
// Page size dropdown event listener
433464
document.getElementById('pageSizeSelect').addEventListener('change', () => {

0 commit comments

Comments
 (0)