123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <script setup>
  2. import { ref, computed } from 'vue'
  3. import { usePage } from '@inertiajs/inertia-vue3'
  4. import AppTopBar from '@/components/AppTopBar.vue'
  5. import AppSidebar from '@/components/AppSidebar.vue'
  6. import AppFooter from '@/components/AppFooter.vue'
  7. import AppMessage from '@/components/AppMessage.vue'
  8. import menu from '@/utils/menu'
  9. import menuAdmin from '@/utils/menu-admin'
  10. const containerClass = computed(() => {
  11. return [
  12. 'layout-wrapper',
  13. 'layout-static',
  14. {
  15. 'layout-static-sidebar-inactive': staticMenuInactive.value,
  16. 'layout-mobile-sidebar-active': mobileMenuActive.value,
  17. },
  18. ]
  19. })
  20. const mobileMenuActive = ref(false)
  21. const staticMenuInactive = ref(false)
  22. const menuClick = ref(false)
  23. const isDesktop = () => window.innerWidth >= 992
  24. const onMenuToggle = () => {
  25. menuClick.value = true
  26. if (isDesktop()) {
  27. staticMenuInactive.value = !staticMenuInactive.value
  28. } else {
  29. mobileMenuActive.value = !mobileMenuActive.value
  30. }
  31. }
  32. const onWrapperClick = () => {
  33. if (!menuClick.value) {
  34. mobileMenuActive.value = false
  35. }
  36. menuClick.value = false
  37. }
  38. const isAdmin = computed(() => usePage().props.value.isAdmin)
  39. </script>
  40. <template>
  41. <div :class="containerClass" @click="onWrapperClick">
  42. <AppTopBar @menu-toggle="onMenuToggle" />
  43. <div class="layout-sidebar">
  44. <AppSidebar :model="isAdmin ? menuAdmin : menu" />
  45. </div>
  46. <div class="layout-main-container">
  47. <div class="layout-main">
  48. <AppMessage />
  49. <slot />
  50. </div>
  51. <AppFooter />
  52. </div>
  53. <Transition name="layout-mask">
  54. <div class="layout-mask p-component-overlay" v-if="mobileMenuActive"></div>
  55. </Transition>
  56. </div>
  57. </template>