Header.vue 3.6 KB

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