You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

209 lines
5.5 KiB

  1. <template lang='pug'>
  2. v-toolbar.nav-header(color='black', dark, app, clipped-left, fixed, flat, :extended='searchIsShown && $vuetify.breakpoint.smAndDown')
  3. v-toolbar(color='deep-purple', flat, slot='extension', v-if='searchIsShown && $vuetify.breakpoint.smAndDown')
  4. v-text-field(
  5. ref='searchFieldMobile',
  6. v-model='search',
  7. clearable,
  8. background-color='deep-purple'
  9. color='white',
  10. label='Search...',
  11. single-line,
  12. solo
  13. flat
  14. hide-details,
  15. prepend-inner-icon='search',
  16. :loading='searchIsLoading',
  17. @keyup.enter='searchEnter'
  18. )
  19. v-menu(open-on-hover, offset-y, bottom, left, min-width='250')
  20. v-toolbar-side-icon(slot='activator')
  21. v-icon view_module
  22. v-list(dense).py-0
  23. v-list-tile(avatar, href='/')
  24. v-list-tile-avatar: v-icon(color='blue') home
  25. v-list-tile-content Home
  26. v-list-tile(avatar, @click='pageNew')
  27. v-list-tile-avatar: v-icon(color='green') add_box
  28. v-list-tile-content New Page
  29. v-divider.my-0
  30. v-subheader Current Page
  31. v-list-tile(avatar, @click='pageEdit')
  32. v-list-tile-avatar: v-icon(color='indigo') edit
  33. v-list-tile-content Edit
  34. v-list-tile(avatar, @click='pageHistory')
  35. v-list-tile-avatar: v-icon(color='indigo') history
  36. v-list-tile-content History
  37. v-list-tile(avatar, @click='pageSource')
  38. v-list-tile-avatar: v-icon(color='indigo') code
  39. v-list-tile-content View Source
  40. v-list-tile(avatar, @click='pageMove')
  41. v-list-tile-avatar: v-icon(color='indigo') forward
  42. v-list-tile-content Move / Rename
  43. v-list-tile(avatar, @click='pageDelete')
  44. v-list-tile-avatar: v-icon(color='red darken-2') delete
  45. v-list-tile-content Delete
  46. v-divider.my-0
  47. v-subheader Assets
  48. v-list-tile(avatar, @click='')
  49. v-list-tile-avatar: v-icon(color='blue-grey') burst_mode
  50. v-list-tile-content Images &amp; Files
  51. v-toolbar-title(:class='{ "ml-2": $vuetify.breakpoint.mdAndUp, "ml-0": $vuetify.breakpoint.smAndDown }')
  52. span.subheading {{title}}
  53. v-spacer(v-if='searchIsShown && $vuetify.breakpoint.mdAndUp')
  54. transition(name='navHeaderSearch')
  55. v-text-field(
  56. ref='searchField',
  57. v-if='searchIsShown && $vuetify.breakpoint.mdAndUp',
  58. v-model='search',
  59. clearable,
  60. color='white',
  61. label='Search...',
  62. single-line,
  63. solo
  64. flat
  65. hide-details,
  66. prepend-inner-icon='search',
  67. :loading='searchIsLoading',
  68. @keyup.enter='searchEnter'
  69. )
  70. v-progress-linear(
  71. indeterminate,
  72. slot='progress',
  73. height='2',
  74. color='blue'
  75. )
  76. v-spacer
  77. .navHeaderLoading.mr-3
  78. v-progress-circular(indeterminate, color='blue', :size='22', :width='2' v-show='isLoading')
  79. slot(name='actions')
  80. v-btn(
  81. v-if='!hideSearch && $vuetify.breakpoint.smAndDown'
  82. @click='searchToggle'
  83. icon
  84. )
  85. v-icon(color='grey') search
  86. v-tooltip(bottom)
  87. v-btn(icon, href='/a', slot='activator')
  88. v-icon(color='grey') settings
  89. span Admin
  90. v-menu(offset-y, min-width='300')
  91. v-tooltip(bottom, slot='activator')
  92. v-btn(icon, slot='activator')
  93. v-icon(color='grey') account_circle
  94. span Account
  95. v-list.py-0
  96. v-list-tile.py-3(avatar)
  97. v-list-tile-avatar
  98. v-avatar.red(:size='40'): span.white--text.subheading JD
  99. v-list-tile-content
  100. v-list-tile-title John Doe
  101. v-list-tile-sub-title john.doe@example.com
  102. v-divider.my-0
  103. v-list-tile(href='/p')
  104. v-list-tile-action: v-icon(color='red') person
  105. v-list-tile-title Profile
  106. v-list-tile(href='/logout')
  107. v-list-tile-action: v-icon(color='red') exit_to_app
  108. v-list-tile-title Logout
  109. </template>
  110. <script>
  111. import { get } from 'vuex-pathify'
  112. import _ from 'lodash'
  113. export default {
  114. props: {
  115. dense: {
  116. type: Boolean,
  117. default: false
  118. },
  119. hideSearch: {
  120. type: Boolean,
  121. default: false
  122. }
  123. },
  124. data() {
  125. return {
  126. menuIsShown: true,
  127. searchIsLoading: false,
  128. searchIsShown: true,
  129. search: ''
  130. }
  131. },
  132. computed: {
  133. isLoading: get('isLoading'),
  134. title: get('site/title')
  135. },
  136. created() {
  137. if (this.hideSearch || this.dense || this.$vuetify.breakpoint.smAndDown) {
  138. this.searchIsShown = false
  139. }
  140. },
  141. methods: {
  142. searchToggle() {
  143. this.searchIsShown = !this.searchIsShown
  144. if (this.searchIsShown) {
  145. _.delay(() => {
  146. this.$refs.searchFieldMobile.focus()
  147. }, 200)
  148. }
  149. },
  150. searchEnter() {
  151. this.searchIsLoading = true
  152. },
  153. pageNew () {
  154. },
  155. pageEdit () {
  156. },
  157. pageHistory () {
  158. },
  159. pageSource () {
  160. },
  161. pageMove () {
  162. },
  163. pageDelete () {
  164. }
  165. }
  166. }
  167. </script>
  168. <style lang='scss'>
  169. .nav-header {
  170. .v-toolbar__extension {
  171. padding: 0;
  172. .v-toolbar__content {
  173. padding: 0;
  174. }
  175. .v-text-field .v-input__prepend-inner {
  176. padding: 0 14px 0 5px;
  177. padding-right: 14px;
  178. }
  179. }
  180. }
  181. .navHeaderSearch {
  182. &-enter-active, &-leave-active {
  183. transition: opacity .25s ease, transform .25s ease;
  184. opacity: 1;
  185. }
  186. &-enter-active {
  187. transition-delay: .25s;
  188. }
  189. &-enter, &-leave-to {
  190. opacity: 0;
  191. transform: scale(.7, .7);
  192. }
  193. }
  194. .navHeaderLoading { // To avoid search bar jumping
  195. width: 22px;
  196. }
  197. </style>