nav-header.vue 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. <template lang='pug'>
  2. v-toolbar(color='black', dark, app, clipped-left, fixed, flat)
  3. v-toolbar-side-icon(@click.native='')
  4. v-icon view_module
  5. v-toolbar-title
  6. span.subheading Wiki.js
  7. v-spacer
  8. transition(name='navHeaderSearch')
  9. v-text-field(
  10. ref='searchField',
  11. v-if='searchIsShown',
  12. v-model='search',
  13. clearable,
  14. color='blue',
  15. label='Search...',
  16. single-line,
  17. hide-details,
  18. append-icon='search',
  19. :append-icon-cb='searchEnter',
  20. :loading='searchIsLoading',
  21. @keyup.enter='searchEnter',
  22. @keyup.esc='searchToggle'
  23. )
  24. v-progress-linear(
  25. indeterminate,
  26. slot='progress',
  27. height='2',
  28. color='blue'
  29. )
  30. v-spacer
  31. v-progress-circular.mr-3(indeterminate, color='blue', v-show='$apollo.loading')
  32. transition(name='navHeaderSearch')
  33. v-btn(icon, @click='searchToggle', v-if='!searchIsShown')
  34. v-icon(color='grey') search
  35. v-btn(icon, href='/a')
  36. v-icon(color='grey') settings
  37. v-menu(offset-y, min-width='300')
  38. v-btn(icon, slot='activator')
  39. v-icon(color='grey') account_circle
  40. v-list.py-0
  41. v-list-tile.py-3(avatar)
  42. v-list-tile-avatar
  43. v-avatar.red(:size='40'): span.white--text.subheading JD
  44. v-list-tile-content
  45. v-list-tile-title John Doe
  46. v-list-tile-sub-title john.doe@example.com
  47. v-divider.my-0
  48. v-list-tile(href='/p')
  49. v-list-tile-action: v-icon(color='red') person
  50. v-list-tile-title Profile
  51. v-list-tile(href='/logout')
  52. v-list-tile-action: v-icon(color='red') exit_to_app
  53. v-list-tile-title Logout
  54. </template>
  55. <script>
  56. export default {
  57. data() {
  58. return {
  59. searchIsLoading: false,
  60. searchIsShown: false,
  61. search: ''
  62. }
  63. },
  64. methods: {
  65. searchToggle() {
  66. this.searchIsLoading = false
  67. this.searchIsShown = !this.searchIsShown
  68. if (this.searchIsShown) {
  69. this.$nextTick(() => {
  70. this.$refs.searchField.focus()
  71. })
  72. }
  73. },
  74. searchEnter() {
  75. this.searchIsLoading = true
  76. }
  77. }
  78. }
  79. </script>
  80. <style lang='scss'>
  81. .navHeaderSearch {
  82. &-enter-active, &-leave-active {
  83. transition: opacity .25s ease, transform .25s ease;
  84. opacity: 1;
  85. }
  86. &-enter-active {
  87. transition-delay: .25s;
  88. }
  89. &-enter, &-leave-to {
  90. opacity: 0;
  91. transform: translateY(-25px);
  92. }
  93. }
  94. </style>