Header.vue 3.4 KB

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