IF YOU WOULD LIKE TO GET AN ACCOUNT, please write an email to s dot adaszewski at gmail dot com. User accounts are meant only to report issues and/or generate pull requests. This is a purpose-specific Git hosting for ADARED projects. Thank you for your understanding!
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

76 рядки
2.1KB

  1. import { h, Component } from 'preact';
  2. class WBPagination extends Component {
  3. renderVisiblePages(numPages, activePage, chunkSize, onPageChanged) {
  4. let visible = {};
  5. let begActChnk = activePage - Math.floor(chunkSize / 2);
  6. let endActChnk = activePage + Math.floor(chunkSize / 2) + 1;
  7. for (let i = Math.max(0, begActChnk); i < Math.min(numPages, endActChnk); i++)
  8. visible[i] = true;
  9. for (let i = 0; i < Math.min(numPages, chunkSize); i++)
  10. visible[i] = true;
  11. for (let i = Math.max(numPages - chunkSize, 0); i < numPages; i++)
  12. visible[i] = true;
  13. visible = Object.keys(visible).map(n => Number(n));
  14. visible.sort();
  15. let res = [];
  16. let prev = 0;
  17. res.push((
  18. <li class={ activePage === 0 ? "page-item disabled" : "page-item" }>
  19. <a class="page-link" href="#"
  20. onclick={ () => onPageChanged(activePage - 1) }>Previous</a>
  21. </li>
  22. ));
  23. for (let idx in visible) {
  24. let i = visible[idx];
  25. if (i > prev + 1)
  26. res.push((
  27. <li class="page-item">
  28. <a class="page-link" href="#"
  29. onclick={ () => onPageChanged(i - 1) }>...</a>
  30. </li>
  31. ));
  32. prev = i;
  33. res.push((
  34. <li class={ i === activePage ? "page-item active" : "page-item" }>
  35. <a class="page-link" href="#"
  36. onclick={ () => onPageChanged(i) }>{ i + 1 }</a>
  37. </li>
  38. ));
  39. }
  40. res.push((
  41. <li class={ activePage >= numPages - 1 ? "page-item disabled" : "page-item" }>
  42. <a class="page-link" href="#"
  43. onclick={ () => onPageChanged(activePage + 1) }>Next</a>
  44. </li>
  45. ));
  46. return res;
  47. }
  48. render({ numPages, activePage, chunkSize, onPageChanged }) {
  49. return (
  50. <nav aria-label="Pagination">
  51. <ul class="pagination">
  52. { this.renderVisiblePages(numPages, activePage, chunkSize, onPageChanged) }
  53. </ul>
  54. </nav>
  55. );
  56. }
  57. }
  58. WBPagination.defaultProps = {
  59. 'chunkSize': 5
  60. };
  61. export default WBPagination;