Header.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  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 order="0" density="compact" class="theme-primary">
  7. <template #prepend>
  8. <v-app-bar-nav-icon
  9. v-if="hasLateralMenu"
  10. :icon="isLateralMenuOpened ? 'mdi:mdi-menu-open' : 'mdi:mdi-menu'"
  11. @click="toggleLateralMenu"
  12. />
  13. </template>
  14. <v-toolbar-title v-if="smAndUp">
  15. <LayoutHeaderTitle
  16. :hasLateralMenu
  17. >
  18. {{ title }}
  19. </LayoutHeaderTitle>
  20. </v-toolbar-title>
  21. <LayoutThemeSwitcher v-if="false" />
  22. <!-- En attente validation PO -->
  23. <LayoutHeaderUniversalCreationCreateButton
  24. v-if="showUniversalButton"
  25. :class="smAndUp ? 'mr-3' : ''"
  26. />
  27. <LayoutHeaderHomeBtn />
  28. <LayoutHeaderMenu
  29. v-if="isWebsitesMenuNotEmpty"
  30. name="WebsiteList"
  31. :translate-label="false"
  32. />
  33. <v-btn
  34. v-else
  35. icon
  36. size="small"
  37. class="ml-2"
  38. href="https://opentalent.fr"
  39. target="_blank"
  40. >
  41. <v-icon icon="fas fa-globe-americas" class="on-primary" />
  42. </v-btn>
  43. <LayoutHeaderMenu name="MyAccesses" />
  44. <LayoutHeaderMenu name="MyFamily" :translate-label="false" />
  45. <LayoutHeaderNotification v-if="layoutStore.name !== 'freemium'" />
  46. <LayoutHeaderMenu name="Configuration" />
  47. <LayoutHeaderMenu name="Account" color="on-primary" icon="fas fa-sun" />
  48. <a
  49. :href="runtimeConfig.supportUrl || runtimeConfig.public.supportUrl"
  50. class="help theme-secondary"
  51. target="_blank"
  52. >
  53. <span class="d-none d-sm-none d-md-flex">
  54. {{ $t('help_access') }}
  55. </span>
  56. <v-icon
  57. icon="fas fa-question-circle"
  58. class="d-sm-flex d-md-none"
  59. color="on-secondary"
  60. />
  61. </a>
  62. </v-app-bar>
  63. </template>
  64. <script setup lang="ts">
  65. import { computed } from 'vue'
  66. import type { ComputedRef } from 'vue'
  67. import { useAbility } from '@casl/vue'
  68. import { useDisplay } from 'vuetify'
  69. import { useMenu } from '~/composables/layout/useMenu'
  70. import { useOrganizationProfileStore } from '~/stores/organizationProfile'
  71. import { useLayoutStore } from '~/stores/layout'
  72. const organizationProfile = useOrganizationProfileStore()
  73. const runtimeConfig = useRuntimeConfig()
  74. const title: ComputedRef<string> = computed(
  75. () => organizationProfile.name ?? 'Opentalent',
  76. )
  77. const { hasMenu, isMenuOpened, toggleMenu, getMenu } = useMenu()
  78. const { smAndUp } = useDisplay()
  79. const hasLateralMenu = computed(() => {
  80. return (
  81. layoutStore.name !== 'freemium' &&
  82. ((layoutStore.name !== 'parameters' && hasMenu('Main')) ||
  83. (layoutStore.name === 'parameters' && hasMenu('Parameters')))
  84. )
  85. })
  86. const isLateralMenuOpened = computed(() => {
  87. return (
  88. (layoutStore.name !== 'parameters' && isMenuOpened('Main')) ||
  89. (layoutStore.name === 'parameters' && isMenuOpened('Parameters'))
  90. )
  91. })
  92. const toggleLateralMenu = () => {
  93. if (layoutStore.name === 'parameters') {
  94. toggleMenu('Parameters')
  95. } else {
  96. toggleMenu('Main')
  97. }
  98. }
  99. const ability = useAbility()
  100. const showUniversalButton =
  101. ability.can('manage', 'users') ||
  102. ability.can('manage', 'courses') ||
  103. ability.can('manage', 'examens') ||
  104. ability.can('manage', 'educationalprojects') ||
  105. ability.can('manage', 'events') ||
  106. ability.can('manage', 'emails') ||
  107. ability.can('manage', 'mails') ||
  108. ability.can('manage', 'texto') ||
  109. ability.can('display', 'message_send_page') ||
  110. ability.can('manage', 'equipments')
  111. const layoutStore = useLayoutStore()
  112. const websitesMenu = getMenu('WebsiteList')
  113. const isWebsitesMenuNotEmpty = computed(
  114. () => websitesMenu?.children?.length > 0,
  115. )
  116. </script>
  117. <style scoped>
  118. :deep(.v-toolbar__content > .v-toolbar-title) {
  119. margin-left: 2px;
  120. .v-img {
  121. background-color: rgb(var(--v-theme-on-primary));
  122. border-radius: 18px;
  123. }
  124. }
  125. .help {
  126. padding: 12px 16px;
  127. margin-left: 4px;
  128. font-size: 14px;
  129. text-decoration: none;
  130. height: 100%;
  131. }
  132. </style>