Header.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <!--
  2. Header de l'application
  3. Contient entre autres le nom de l'organisation, l'accès à l'aide et aux préférences de l'utilisateur
  4. -->
  5. <template>
  6. <v-app-bar
  7. order="0"
  8. density="compact"
  9. class="theme-primary"
  10. >
  11. <template #prepend>
  12. <v-app-bar-nav-icon
  13. v-if="hasMainMenu && layoutStore.name !== 'parameters'"
  14. :icon="isMainMenuOpened ? 'mdi:mdi-menu-open' : 'mdi:mdi-menu'"
  15. @click="toggleMainMenu"
  16. />
  17. <div v-else-if="hasParametersMenu && layoutStore.name === 'parameters'">
  18. <v-app-bar-nav-icon
  19. v-if="mdAndUp"
  20. icon="fa fa-gear"
  21. />
  22. <v-app-bar-nav-icon
  23. v-else
  24. :icon="isParametersMenuOpened ? 'mdi:mdi-menu-open' : 'mdi:mdi-menu'"
  25. @click="toggleParametersMenu"
  26. />
  27. </div>
  28. </template>
  29. <v-toolbar-title v-if="mdAndUp" v-text="title"/>
  30. <LayoutThemeSwitcher v-if="false" /> <!-- En attente validation PO -->
  31. <LayoutHeaderUniversalCreationCreateButton v-if="showUniversalButton" class="mr-3" />
  32. <LayoutHeaderHomeBtn v-if="smAndUp" />
  33. <LayoutHeaderMenu name="WebsiteList" :translate-label="false" />
  34. <LayoutHeaderMenu name="MyAccesses" />
  35. <LayoutHeaderMenu name="MyFamily" :translate-label="false" />
  36. <LayoutHeaderNotification />
  37. <LayoutHeaderMenu name="Configuration" />
  38. <LayoutHeaderMenu name="Account" color="on-primary" icon="fas fa-sun" />
  39. <a
  40. :href="runtimeConfig.supportUrl"
  41. class="text-body px-3 py-4 ml-2 theme-secondary text-decoration-none"
  42. target="_blank"
  43. >
  44. <span class="d-none d-sm-none d-md-flex">{{ $t('help_access') }}</span>
  45. <v-icon icon="fas fa-question-circle" class="d-sm-flex d-md-none" color="on-secondary" />
  46. </a>
  47. </v-app-bar>
  48. </template>
  49. <script setup lang="ts">
  50. import {computed} from "@vue/reactivity";
  51. import type {ComputedRef} from "@vue/reactivity";
  52. import {useMenu} from "~/composables/layout/useMenu";
  53. import {useAbility} from "@casl/vue";
  54. import {useDisplay} from 'vuetify'
  55. import {useOrganizationProfileStore} from "~/stores/organizationProfile";
  56. import {useLayoutStore} from "~/stores/layout";
  57. const organizationProfile = useOrganizationProfileStore()
  58. const runtimeConfig = useRuntimeConfig()
  59. const title: ComputedRef<string> = computed(() => organizationProfile.name ?? 'Opentalent')
  60. const { hasMenu, isMenuOpened, toggleMenu } = useMenu()
  61. const { smAndUp, mdAndUp } = useDisplay()
  62. const hasMainMenu = computed(() => hasMenu('Main'))
  63. const isMainMenuOpened = computed(() => isMenuOpened('Main'))
  64. const toggleMainMenu = () => toggleMenu('Main')
  65. const hasParametersMenu = computed(() => hasMenu('Parameters'))
  66. const isParametersMenuOpened = computed(() => isMenuOpened('Parameters'))
  67. const toggleParametersMenu = () => toggleMenu('Parameters')
  68. const ability = useAbility()
  69. const showUniversalButton =
  70. ability.can('manage', 'users')
  71. || ability.can('manage', 'courses')
  72. || ability.can('manage', 'examens')
  73. || ability.can('manage', 'educationalprojects')
  74. || ability.can('manage', 'events')
  75. || ability.can('manage', 'emails')
  76. || ability.can('manage', 'mails')
  77. || ability.can('manage', 'texto')
  78. || ability.can('display', 'message_send_page')
  79. || ability.can('manage', 'equipments')
  80. const layoutStore = useLayoutStore()
  81. </script>
  82. <style scoped>
  83. .help {
  84. padding: 14px 14px 13px;
  85. font-size: 14px;
  86. text-decoration: none;
  87. }
  88. </style>