PageNav 1.vue 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <template>
  2. <div class="page-nav" v-if="prev || next">
  3. <p class="inner">
  4. <span v-if="prev" class="prev">
  5. <router-link v-if="prev" class="prev" :to="prev.path">{{ prev.title || prev.path }}</router-link>
  6. </span>
  7. <span v-if="next" class="next">
  8. <router-link v-if="next" :to="next.path">{{ next.title || next.path }}</router-link>
  9. </span>
  10. </p>
  11. </div>
  12. </template>
  13. <script>
  14. import { resolvePage } from '../util'
  15. import isString from 'lodash/isString'
  16. import isNil from 'lodash/isNil'
  17. export default {
  18. name: 'PageNav',
  19. props: ['sidebarItems'],
  20. computed: {
  21. prev () {
  22. return resolvePageLink(LINK_TYPES.PREV, this)
  23. },
  24. next () {
  25. return resolvePageLink(LINK_TYPES.NEXT, this)
  26. }
  27. }
  28. }
  29. function resolvePrev (page, items) {
  30. return find(page, items, -1)
  31. }
  32. function resolveNext (page, items) {
  33. return find(page, items, 1)
  34. }
  35. const LINK_TYPES = {
  36. NEXT: {
  37. resolveLink: resolveNext,
  38. getThemeLinkConfig: ({ nextLinks }) => nextLinks,
  39. getPageLinkConfig: ({ frontmatter }) => frontmatter.next
  40. },
  41. PREV: {
  42. resolveLink: resolvePrev,
  43. getThemeLinkConfig: ({ prevLinks }) => prevLinks,
  44. getPageLinkConfig: ({ frontmatter }) => frontmatter.prev
  45. }
  46. }
  47. function resolvePageLink (
  48. linkType,
  49. { $themeConfig, $page, $route, $site, sidebarItems }
  50. ) {
  51. const { resolveLink, getThemeLinkConfig, getPageLinkConfig } = linkType
  52. // Get link config from theme-1
  53. const themeLinkConfig = getThemeLinkConfig($themeConfig)
  54. // Get link config from current page
  55. const pageLinkConfig = getPageLinkConfig($page)
  56. // Page link config will overwrite global theme-1 link config if defined
  57. const link = isNil(pageLinkConfig) ? themeLinkConfig : pageLinkConfig
  58. if (link === false) {
  59. return
  60. } else if (isString(link)) {
  61. return resolvePage($site.pages, link, $route.path)
  62. } else {
  63. return resolveLink($page, sidebarItems)
  64. }
  65. }
  66. function find (page, items, offset) {
  67. const res = []
  68. flatten(items, res)
  69. for (let i = 0; i < res.length; i++) {
  70. const cur = res[i]
  71. if (cur.type === 'page' && cur.path === decodeURIComponent(page.path)) {
  72. return res[i + offset]
  73. }
  74. }
  75. }
  76. function flatten (items, res) {
  77. for (let i = 0, l = items.length; i < l; i++) {
  78. if (items[i].type === 'group') {
  79. flatten(items[i].children || [], res)
  80. } else {
  81. res.push(items[i])
  82. }
  83. }
  84. }
  85. </script>
  86. <style lang="stylus">
  87. @require '../styles/wrapper.styl'
  88. .page-nav
  89. @extend $wrapper
  90. padding-top 1rem
  91. padding-bottom 0
  92. .inner
  93. min-height 2rem
  94. margin-top 0
  95. border-top 1px solid $borderColor
  96. padding-top 1rem
  97. overflow auto // clear float
  98. .next
  99. float right
  100. </style>