|
1 | 1 | // Constants and Variables |
2 | 2 | const minDataPointsForBoxPlot = 2; |
3 | 3 | 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; |
5 | 6 | let currentPage = 1; |
6 | 7 | let offers = []; |
7 | 8 | let filteredOffers = []; |
@@ -292,6 +293,8 @@ function displayOffers(page) { |
292 | 293 | container.innerHTML = ''; |
293 | 294 | container.appendChild(table); |
294 | 295 | renderPageOptions(); |
| 296 | + renderShowingText(); |
| 297 | + updatePrevNextDisabledState(); |
295 | 298 |
|
296 | 299 | } |
297 | 300 |
|
@@ -330,19 +333,68 @@ function sortOffers(column) { |
330 | 333 | displayOffers(currentPage); |
331 | 334 | } |
332 | 335 |
|
| 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 | + |
333 | 357 | 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); |
345 | 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; |
| 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; |
346 | 398 | } |
347 | 399 |
|
348 | 400 | function mostOfferCompanies(jsonData) { |
@@ -401,7 +453,8 @@ document.addEventListener('DOMContentLoaded', async function () { |
401 | 453 | const data = await response.json(); |
402 | 454 | offers = data; |
403 | 455 | filteredOffers = [...offers]; |
404 | | - totalPages = Math.ceil(filteredOffers.length / offersPerPage); |
| 456 | + renderPageOptions(); |
| 457 | + computeTotalPages(); |
405 | 458 | displayOffers(currentPage); |
406 | 459 | } |
407 | 460 |
|
@@ -430,9 +483,11 @@ document.addEventListener('DOMContentLoaded', async function () { |
430 | 483 | } |
431 | 484 | }); |
432 | 485 |
|
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(); |
436 | 491 | displayOffers(currentPage); |
437 | 492 | }); |
438 | 493 | function filterOffers() { |
@@ -464,8 +519,7 @@ document.addEventListener('DOMContentLoaded', async function () { |
464 | 519 | } |
465 | 520 |
|
466 | 521 | filteredOffers = tempFilteredOffers; |
467 | | - totalPages = Math.ceil(filteredOffers.length / offersPerPage); |
468 | | - currentPage = 1; |
| 522 | + computeTotalPages(); |
469 | 523 |
|
470 | 524 | // Update UI elements |
471 | 525 | setStatsStr(filteredOffers); |
|
0 commit comments