Kaynağa Gözat

resolve merge conflicts

Olivier Massot 2 yıl önce
ebeveyn
işleme
e9b595e356

+ 7 - 1
components/Layout/AlertBar/SwitchYear.vue

@@ -10,7 +10,9 @@ Barre d'alerte qui s'affiche lorsque l'utilisateur n'est pas sur l'année couran
     {{$t('not_current_year')}}
 
     <a @click="resetYear" class="text-decoration-none on-warning" style="cursor: pointer;">
-      &nbsp;<strong>{{$t('not_current_year_reset')}}</strong>
+      <strong class="pl-2 text-neutral-strong">
+        {{$t('not_current_year_reset')}}
+      </strong>
     </a>
   </UiSystemBar>
 </template>
@@ -57,4 +59,8 @@ Barre d'alerte qui s'affiche lorsque l'utilisateur n'est pas sur l'année couran
   height: 20px;
   margin: 0 6px;
 }
+
+#resetLink:hover {
+  cursor: pointer;
+}
 </style>

+ 4 - 1
components/Layout/Header/HomeBtn.vue

@@ -5,7 +5,7 @@
         icon="fas fa-home"
         size="small"
         :href="homeUrl"
-        class="ml-2 on-primary"
+        class="on-primary"
     />
     <v-tooltip :activator="btn" :text="$t('welcome')" location="bottom" />
   </div>
@@ -13,10 +13,13 @@
 
 <script setup lang="ts">
   import {ref} from "@vue/reactivity";
+  import {useDisplay} from "vuetify";
 
   const runtimeConfig = useRuntimeConfig()
   const homeUrl = runtimeConfig.baseUrlAdminLegacy
 
+  const { mdAndUp } = useDisplay()
+
   const btn = ref(null);
 </script>
 

+ 20 - 4
components/Layout/Header/UniversalCreation/CreateButton.vue

@@ -5,11 +5,23 @@ bouton Créer
 <template>
   <main>
     <v-btn
-      elevation="2"
-      class="theme-x-create-btn"
-      @click="showDialog=true"
+        v-if="asIcon"
+        :elevation="0"
+        class="theme-primary"
+        :icon="true"
+        size="small"
+        @click="showDialog=true"
     >
-      {{ $t('create') }}
+      <v-icon>fas fa-plus</v-icon>
+    </v-btn>
+
+    <v-btn
+        v-else
+        :elevation="2"
+        class="theme-x-create-btn"
+        @click="showDialog=true"
+    >
+      <span>{{ $t('create') }}</span>
     </v-btn>
 
     <LayoutDialog :show="showDialog" >
@@ -52,6 +64,7 @@ bouton Créer
 
 <script setup lang="ts">
   import {Ref, ref} from "@vue/reactivity";
+  import {useDisplay} from "vuetify";
 
   const showDialog: Ref<Boolean> = ref(false);
   const step: Ref<Number> = ref(1);
@@ -61,6 +74,9 @@ bouton Créer
     step.value = stepChoice
     type.value = typeChoice
   }
+
+  const { mdAndDown: asIcon } = useDisplay()
+
 </script>
 <style scoped>
 

+ 11 - 1
components/Layout/MainMenu.vue

@@ -20,7 +20,7 @@ Prend en paramètre une liste de ItemMenu et les met en forme
         class="left-menu"
     >
       <!-- TODO: que se passe-t-il si le menu ne comprend qu'un seul MenuItem? -->
-      <div v-for="(item, i) in menu.children" :key="i">
+      <div v-for="(item, i) in items" :key="i">
 
         <!-- Cas 1 : l'item n'a pas d'enfants, c'est un lien -->
         <v-list-item
@@ -76,6 +76,7 @@ Prend en paramètre une liste de ItemMenu et les met en forme
 import {useMenu} from "~/composables/layout/useMenu";
 import {computed} from "@vue/reactivity";
 import { useDisplay } from 'vuetify'
+import {MenuGroup} from "~/types/layout";
 
 const { getMenu, hasMenu, isInternalLink, setMenuState, isMenuOpened } = useMenu()
 
@@ -87,6 +88,15 @@ const hasMainMenu = computed(() => hasMenu('Main'))
 
 const isOpened = computed(() => isMenuOpened('Main'))
 
+let items
+if (menu === null) {
+  items = []
+} else if (menu.hasOwnProperty('children')) {
+  items = (menu as MenuGroup).children ?? []
+} else {
+  items = [menu]
+}
+
 // En vue lg+, on affiche toujours le menu
 const displayMenu = computed(() => {
   return menu !== null && hasMenu('Main') && (lgAndUp.value || isOpened.value)

+ 10 - 8
components/Layout/Subheader.vue

@@ -7,22 +7,24 @@ Contient entre autres le breadcrumb, les commandes de changement d'année et les
   <main>
     <v-card
       id="subheader"
-      class="d-md-flex theme-neutral text-body-2 px-2"
+      class="d-flex theme-neutral text-body-2 px-2"
       flat
       rounded="0"
     >
-      <LayoutSubHeaderBreadcrumbs v-if="mdAndUp" class="mr-auto d-flex" />
+      <LayoutSubHeaderBreadcrumbs v-if="lgAndUp" class="mr-auto d-flex" />
+
+      <span class="flex-fill" />
 
       <v-card
-        class="d-md-flex pt-2 mr-6 align-baseline"
+        class="d-flex flex-row pt-2 mr-6 align-baseline"
         flat
         tile
       >
-        <LayoutSubHeaderActivityYear v-if="!showDateTimeRange" class="activity-year" />
+        <LayoutSubHeaderActivityYear v-if="smAndUp && !showDateTimeRange" class="activity-year" />
 
-        <div v-if="hasMenuOrIsTeacher" class="d-sm-none d-md-flex d-none d-sm-flex">
-          <LayoutSubHeaderDataTiming v-if="!showDateTimeRange" class="data-timing ml-2" />
-          <LayoutSubHeaderDataTimingRange class="data-timing-range ml-n1" @showDateTimeRange="showDateTimeRange=$event" />
+        <div v-if="hasMenuOrIsTeacher" class="d-flex flex-row">
+          <LayoutSubHeaderDataTiming v-if="smAndUp && !showDateTimeRange" class="data-timing ml-2" />
+          <LayoutSubHeaderDataTimingRange v-if="smAndUp" class="data-timing-range ml-n1" @showDateTimeRange="showDateTimeRange=$event" />
           <LayoutSubHeaderPersonnalizedList class="personalized-list ml-2" />
         </div>
       </v-card>
@@ -37,7 +39,7 @@ Contient entre autres le breadcrumb, les commandes de changement d'année et les
     import {useMenu} from "~/composables/layout/useMenu";
     import {useDisplay} from "vuetify";
 
-    const { mdAndUp } = useDisplay()
+    const { smAndUp, mdAndUp, lgAndUp } = useDisplay()
     const accessProfile = useAccessProfileStore()
     const { hasMenu } = useMenu()
 

+ 1 - 4
services/layout/menuBuilder/myFamilyMenuBuilder.ts

@@ -14,7 +14,6 @@ export default class MyFamilyMenuBuilder extends AbstractMenuBuilder {
    */
   build(): MenuGroup | null {
     const children: MenuItems = []
-
     // Si Access des membres de la familles (enfants)
     _.each(this.accessProfile.familyAccesses, (access) => {
       const url = `/switch_user/${this.organizationProfile.id}/${this.accessProfile.id}/${access.id}`
@@ -25,14 +24,12 @@ export default class MyFamilyMenuBuilder extends AbstractMenuBuilder {
 
       children.push(this.createItem(`${access.givenName} ${access.name}`, icon, url, MENU_LINK_TYPE.V1))
     })
-
     // Si on est en compte switch, on doit pouvoir retourner au compte d'origine
     const originalAccess = this.accessProfile.originalAccess
-    if (originalAccess && !originalAccess.isSuperAdminAccess) {
+    if (originalAccess && !_.isEmpty(originalAccess) && !originalAccess.isSuperAdminAccess) {
       const url = `/switch_user/${originalAccess.organization.id}/${originalAccess.id}/exit`
       children.push(this.createItem(`${originalAccess.givenName} ${originalAccess.name}`, undefined, url, MENU_LINK_TYPE.V1))
     }
-
     if (children.length > 0) {
       return this.createGroup('familyAccesses', {name: 'fas fa-users'}, children)
     }

+ 1 - 1
stores/accessProfile.ts

@@ -93,7 +93,7 @@ export const useAccessProfileStore = defineStore('accessProfile', () => {
    * @param role
    */
   const hasRole = (role: string): boolean => {
-    return roles.value.includes(role)
+    return roles.value && roles.value.includes(role)
   }
 
   const setProfile = (profile: any) => {

+ 3 - 3
stores/organizationProfile.ts

@@ -27,7 +27,7 @@ export const useOrganizationProfileStore = defineStore('organizationProfile', ()
    * @return {boolean}
    */
   const isCmf = computed( (): boolean => {
-    return networks.value.filter((network: string) => {
+    return networks.value && networks.value.filter((network: string) => {
       return network === runtimeConfig.cmf_network
     }).length > 0
   })
@@ -38,7 +38,7 @@ export const useOrganizationProfileStore = defineStore('organizationProfile', ()
    * @return {boolean}
    */
   const isFfec = computed( (): boolean => {
-    return networks.value.filter((network: string) => {
+    return networks.value && networks.value.filter((network: string) => {
       return network === runtimeConfig.ffec_network
     }).length > 0
   })
@@ -142,7 +142,7 @@ export const useOrganizationProfileStore = defineStore('organizationProfile', ()
   })
 
   const hasModule = (module: string): boolean => {
-    return modules.value.includes(module)
+    return modules.value && modules.value.includes(module)
   }
 
   // Actions