MenuComponent.vue 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <template>
  2. <v-navigation-drawer
  3. :mini-variant="miniVariant"
  4. :clipped="clipped"
  5. class="ot_dark_grey ot_menu_color--text"
  6. fixed
  7. app
  8. >
  9. <v-list>
  10. <div v-for="(item, i) in menu" :key="i">
  11. <v-list-item
  12. v-if="!item.children"
  13. :href="item.old ? item.to : undefined"
  14. :to="!item.old ? item.to : undefined"
  15. router
  16. exact
  17. >
  18. <v-list-item-action>
  19. <v-icon class="ot_menu_color--text">{{ item.icon }}</v-icon>
  20. </v-list-item-action>
  21. <v-list-item-content>
  22. <v-list-item-title class="ot_menu_color--text" v-text="$t(item.title)"/>
  23. </v-list-item-content>
  24. </v-list-item>
  25. <v-list-group
  26. v-else
  27. v-model="item.active"
  28. no-action
  29. >
  30. <template v-slot:activator>
  31. <v-list-item-action>
  32. <v-icon class="ot_menu_color--text">{{ item.icon }}</v-icon>
  33. </v-list-item-action>
  34. <v-list-item-content>
  35. <v-list-item-title class="ot_menu_color--text" v-text="$t(item.title)"/>
  36. </v-list-item-content>
  37. </template>
  38. <v-list-item
  39. v-for="child in item.children"
  40. :key="child.title"
  41. :href="child.old ? child.to : undefined"
  42. :to="!child.old ? child.to : undefined"
  43. router
  44. exact
  45. >
  46. <v-list-item-action>
  47. <v-icon class="ot_menu_color--text">{{ child.icon }}</v-icon>
  48. </v-list-item-action>
  49. <v-list-item-content>
  50. <v-list-item-title class="ot_menu_color--text" v-text="$t(child.title)"/>
  51. </v-list-item-content>
  52. </v-list-item>
  53. </v-list-group>
  54. </div>
  55. </v-list>
  56. </v-navigation-drawer>
  57. </template>
  58. <script lang="ts">
  59. import Menu from '@/use/template/menu'
  60. import {defineComponent} from '@nuxtjs/composition-api'
  61. import {AnyJson} from "~/types/types";
  62. export default defineComponent({
  63. props: {
  64. miniVariant: {
  65. type: Boolean,
  66. required: true
  67. },
  68. clipped: {
  69. type: Boolean,
  70. required: true
  71. }
  72. },
  73. setup() {
  74. const menu: AnyJson = new Menu().useMenuConstruct()
  75. return {
  76. menu
  77. }
  78. }
  79. })
  80. </script>
  81. <style scoped>
  82. .v-list-item__action, .v-list-group__header__prepend-icon {
  83. margin-right: 10px !important;
  84. }
  85. .v-application--is-ltr .v-list-group--no-action > .v-list-group__items > .v-list-item {
  86. padding-left: 30px;
  87. }
  88. .v-list-item__title{
  89. font-size: 14px;
  90. }
  91. .v-icon.v-icon{
  92. font-size: 16px;
  93. }
  94. .v-list-item{
  95. min-height: 10px;
  96. }
  97. .v-list-item__action {
  98. margin: 8px 0;
  99. }
  100. .v-list-item__content {
  101. padding: 8px 0;
  102. }
  103. </style>