Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.79 KB | None | 0 0
  1. const _pipe = require('../helpers/pipe')
  2.  
  3. // query default setting
  4. const { conditionConfig, _get } = require('./../../config/')
  5. const sort_default = _get("sort.default", conditionConfig)
  6. const limit_default = _get("limit", conditionConfig)
  7.  
  8. /*
  9. * @param String limit, path, sort for generating link
  10. * @param Number page
  11. * if page === 1, return base link or/and limit or/and sort
  12. * @return link pagination
  13. */
  14. const getPaginationPath = (sort, limit, path) => {
  15.  
  16. let url = []
  17.  
  18. if(sort !== sort_default) {
  19. url = [...url, 'sort=' + sort]
  20. }
  21.  
  22. if(limit !== limit_default) {
  23. url = [...url, 'limit=' + limit]
  24. }
  25.  
  26. path += url.length ? '?' + url.join('&') : ''
  27.  
  28. return page => page !== 1 ?
  29. path + (url.length ? '&' : '?') + 'page=' + page :
  30. path
  31. }
  32.  
  33. /*
  34. * @param Number limit, limit items for page
  35. * @param Number total, total items
  36. * @return max page number pagination
  37. */
  38. const getLastPageNumber = ({limit, total}) => Math.ceil(total / limit)
  39.  
  40. /*
  41. * @param Number current page
  42. * @param Number max page pagination
  43. * @return Array pages - example - [1,2,3,4,'...',7] etc
  44. */
  45. const getRange = page => last => {
  46.  
  47. let range = [1],
  48. delta = 2,
  49. left = page - delta,
  50. right = page + delta
  51.  
  52. for (let i = 2; i <= last; i++) {
  53. if (i == last || i >= left && i <= right) {
  54. range.push(i)
  55. }
  56. }
  57.  
  58. return range
  59. }
  60.  
  61. /*
  62. * @param Number `page` - current page
  63. * @param Function `getPaginationLink` - this function include limit & sort
  64. * @param Array `range` - page number for pagination generate
  65. * @return `html pagination template`
  66. */
  67. const getHtml = (page, getPaginationLink) => range => {
  68.  
  69. let htmlTemplateStart = '<nav aria-label="Page navigation"><ul class="pagination pagination-sm mb-0">',
  70. htmlTemplate = '',
  71. htmlTemplateFinish = '</ul></nav>',
  72. l
  73.  
  74. for (let i of range) {
  75. if (l) {
  76. if (i - l === 2) {
  77. htmlTemplate += `<li class="page-item ${(page === l + i) ? 'active' : ''}"><a class="page-link" href="${getPaginationLink(l + 1)}">${l + 1}</a></li>`
  78. } else if (i - l !== 1) {
  79. htmlTemplate += `<li class="page-item" disabled><a class="page-link" href="#">...</a></li>`
  80. }
  81. }
  82. htmlTemplate += `<li class="page-item ${(page === i) ? 'active' : ''}"><a class="page-link" href="${getPaginationLink(i)}">${i}</a></li>`
  83. l = i
  84. }
  85.  
  86. return htmlTemplateStart + htmlTemplate + htmlTemplateFinish
  87. }
  88.  
  89. /*
  90. *
  91. */
  92. const Pagination = (sort = '', page = 1, limit = 15, total = 45, path = '') => {
  93.  
  94. if(total > 0) {
  95. let getPaginationLink = getPaginationPath(sort, limit, path)
  96.  
  97. let htmlTemplateLinks = () =>
  98. _pipe(
  99. getLastPageNumber,
  100. getRange(page),
  101. getHtml(page, getPaginationLink)
  102. )({limit, total})
  103.  
  104. return htmlTemplateLinks()
  105. }
  106. return ''
  107. }
  108.  
  109. module.exports = Pagination
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement