PageSelect.scala 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package com.weEat.modules
  2. import mhtml.{Rx,Var}
  3. case class PageSelect(
  4. numPages: Rx[Int],
  5. revealedRadius: Rx[Int] = Rx(3)
  6. ) extends Module {
  7. private val _page = Var[Int](1)
  8. // TODO: Add buttons for First/Last page
  9. // TODO: Allow the user to click on `...` to temporarily expand the upper or
  10. // lower reveal boundary
  11. private val _minRevealed = _page.zip(revealedRadius).map({
  12. case (p, r) => 1.max(p - r)
  13. })
  14. private val _maxRevealed = _page.zip(revealedRadius).zip(numPages).map({
  15. case ((p, r), n) => n.min(p + r)
  16. })
  17. val page = _page.zip(numPages).map({ case (idx, pages) => idx.min(pages) - 1 })
  18. private def idxToString(targIdx: Int, str: String) =
  19. _page.map({page: Int => if (page == targIdx) str else ""})
  20. val render = {
  21. <ul class="pagination">
  22. <li class={idxToString(1, " disabled").map("page-item"+_)}>
  23. <a class="page-link" href="#" onclick={ () => _page.update(_ - 1)}>
  24. <span>{"<"}</span>
  25. <span class="sr-only">Previous</span>
  26. </a>
  27. </li>
  28. <li class="page-item disabled" style={_minRevealed.map({ min =>
  29. if (min <= 1) "display: none;" else ""
  30. })}><a class="page-link" href="#">...</a></li>
  31. {
  32. _minRevealed.zip(_maxRevealed).map({
  33. case (min, max) => for (i <- (min to max)) yield {
  34. <li class={idxToString(i, " active").map("page-item"+_)}>
  35. <a class="page-link" href="#" onclick={ () => _page.update(_ => i)}>
  36. {i.toString}
  37. </a>
  38. </li>
  39. }
  40. })
  41. }
  42. <li class="page-item disabled" style={_maxRevealed.zip(numPages).map({
  43. case (max, n) => if (n <= max) "display: none;" else ""
  44. })}><a class="page-link" href="#">...</a></li>
  45. <li class={numPages.flatMap({targIdx =>
  46. _page.map({page: Int => if (page >= targIdx) " disabled" else ""})
  47. }).map("page-item"+_)}>
  48. <a class="page-link" href="#" onclick={ () => _page.update(_ + 1)}>
  49. <span>{">"}</span>
  50. <span class="sr-only">Next</span>
  51. </a>
  52. </li>
  53. </ul>
  54. }
  55. }