LeftMenuLayoutMobile.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. <!-- eslint-disable @intlify/vue-i18n/no-raw-text -->
  2. <template>
  3. <q-drawer
  4. v-bind="$attrs"
  5. v-model="leftDrawerOpen"
  6. behavior="mobile"
  7. class="detached-container"
  8. :breakpoint="500"
  9. :width="214"
  10. >
  11. <div class="column full-height no-wrap">
  12. <div
  13. class="overflow-hidden"
  14. style="border-radius: 8px 8px 0px 0px"
  15. >
  16. <div
  17. class="flex flex-center full-width q-pa-sm"
  18. style="height: 50px"
  19. >
  20. <q-img style="max-width: 92px" :src="Logo" />
  21. </div>
  22. </div>
  23. <div class="column no-wrap menu-content">
  24. <q-scroll-area class="menu-scroll-area">
  25. <q-list class="column no-wrap">
  26. <template
  27. v-for="item in navigation_store.navigationItems"
  28. :key="item.name ?? item.icon"
  29. >
  30. <template v-if="item.permission">
  31. <q-item
  32. v-if="item.type === 'single'"
  33. v-ripple
  34. active-class="menu-selected"
  35. clickable
  36. exact-active-class="menu-selected"
  37. :exact="item.name == 'HomePage'"
  38. :to="{ name: item.name }"
  39. >
  40. <q-item-section avatar>
  41. <q-icon
  42. :name="item.icon"
  43. style="font-size: 20px"
  44. />
  45. </q-item-section>
  46. <q-item-section>
  47. {{ $t(item.title) }}
  48. </q-item-section>
  49. </q-item>
  50. <q-expansion-item
  51. v-else
  52. v-model="isExpasionItemExpanded"
  53. :class="{
  54. 'menu-selected':
  55. childrenAreActive(item.childrens) &&
  56. !isExpasionItemExpanded,
  57. }"
  58. >
  59. <template #header>
  60. <q-item-section avatar>
  61. <q-icon
  62. :name="item.icon"
  63. style="font-size: 20px"
  64. />
  65. </q-item-section>
  66. <q-item-section>
  67. {{ $t(item.title) }}
  68. </q-item-section>
  69. </template>
  70. <div
  71. v-for="child in item.childrens"
  72. :key="child.name"
  73. >
  74. <q-item
  75. v-ripple
  76. class="q-pl-lg"
  77. clickable
  78. exact
  79. exact-active-class="menu-selected"
  80. :to="{ name: child.name }"
  81. >
  82. <q-item-section avatar>
  83. <q-icon
  84. :name="child.icon"
  85. style="font-size: 20px"
  86. />
  87. </q-item-section>
  88. <q-item-section>
  89. {{ $t(child.title) }}
  90. </q-item-section>
  91. </q-item>
  92. </div>
  93. </q-expansion-item>
  94. </template>
  95. </template>
  96. </q-list>
  97. </q-scroll-area>
  98. <q-list class="q-mt-auto">
  99. <q-item
  100. v-ripple
  101. clickable
  102. @click="openUrl('https://softpar.inf.br')"
  103. >
  104. <div class="flex full-width justify-center">
  105. <q-img
  106. :src="LogoSoftparDark"
  107. style="width: 100%; height: 30px; max-width: 114px"
  108. />
  109. </div>
  110. </q-item>
  111. </q-list>
  112. <div
  113. class="full-width text-center text-subtitle3 cursor-pointer"
  114. @click="gotoVersionPage"
  115. >
  116. <span class="text-caption text-weight-light">
  117. {{ $t("common.terms.version") + " " + version }}
  118. </span>
  119. </div>
  120. </div>
  121. </div>
  122. </q-drawer>
  123. </template>
  124. <script setup>
  125. import { navigationStore } from "src/stores/navigation";
  126. import { onMounted, ref } from "vue";
  127. import { useRoute, useRouter } from "vue-router";
  128. import { version } from "src/../package.json";
  129. import Logo from "src/assets/logo.png";
  130. import LogoSoftparDark from "src/assets/softpar_logo_dark.svg";
  131. const leftDrawerOpen = defineModel({
  132. type: Boolean,
  133. });
  134. const navigation_store = navigationStore();
  135. const route = useRoute();
  136. const router = useRouter();
  137. const isExpasionItemExpanded = ref([]);
  138. const childrenAreActive = (children) => {
  139. if (!Array.isArray(children) || children.length === 0) {
  140. return false;
  141. }
  142. return children.some((child) => route?.name === child?.name);
  143. };
  144. const gotoVersionPage = () => {
  145. router.push({ name: "SystemVersionsPage" });
  146. };
  147. const openUrl = (url) => {
  148. window.open(url, "_blank");
  149. };
  150. onMounted(() => {
  151. navigation_store.navigationItems.forEach((item, index) => {
  152. if (childrenAreActive(item.childrens)) {
  153. isExpasionItemExpanded.value[index] = true;
  154. }
  155. });
  156. });
  157. </script>
  158. <style lang="scss" scoped>
  159. @import "/src/css/quasar.variables.scss";
  160. .menu-content {
  161. flex: 1 1 auto;
  162. min-height: 0;
  163. }
  164. .menu-selected {
  165. background-color: rgba($primary, 0.1);
  166. color: $primary;
  167. }
  168. .menu-scroll-area {
  169. flex: 1 1 auto;
  170. min-height: 0;
  171. }
  172. .text-subtitle3 {
  173. font-size: 1.1rem !important;
  174. font-weight: 400 !important;
  175. }
  176. </style>