Browse Source

various refactorings, add ActivityYear component

Olivier Massot 3 năm trước cách đây
mục cha
commit
1467247f33

+ 1 - 1
components/Layout/Alert/Container.vue

@@ -15,7 +15,7 @@ Container principal pour l'affichage d'une ou plusieurs alertes
 
 <script setup lang="ts">
 import { Alert } from '~/types/interfaces'
-import {usePageStore} from "~/store/page";
+import {usePageStore} from "~/stores/page";
 import {ComputedRef} from "@vue/reactivity";
 
 const pageStore = usePageStore()

+ 1 - 1
components/Layout/Alert/Content.vue

@@ -24,7 +24,7 @@
 <script setup lang="ts">
 import {Alert} from '~/types/interfaces'
 import {Ref} from "@vue/reactivity";
-import {usePageStore} from "~/store/page";
+import {usePageStore} from "~/stores/page";
 
 const $t = (s: string) => { return s } // TODO: remove after i18n install
 

+ 25 - 25
components/Layout/Header.vue

@@ -25,39 +25,39 @@ Contient entre autres le nom de l'organisation, l'accès à l'aide et aux préf
 
 <!--    <LayoutHeaderUniversalCreationCreateButton v-if="showUniversalButton" />-->
 
-    <v-tooltip :text="$t('welcome')" location="bottom">
-      <template #activator="{ props }">
-        <v-btn
-            v-bind="props"
-            icon="fas fa-home"
-            :href="homeUrl"
-            class="ml-2 text-ot-white"
-            size="small"
-        ></v-btn>
-      </template>
-    </v-tooltip>
+<!--    <v-tooltip :text="$t('welcome')" location="bottom">-->
+<!--      <template #activator="{ props }">-->
+<!--        <v-btn-->
+<!--            v-bind="props"-->
+<!--            icon="fas fa-home"-->
+<!--            :href="homeUrl"-->
+<!--            class="ml-2 text-ot-white"-->
+<!--            size="small"-->
+<!--        ></v-btn>-->
+<!--      </template>-->
+<!--    </v-tooltip>-->
 
     <LayoutHeaderMenu name="WebsiteList" />
 
-    <LayoutHeaderMenu name="MyAccesses" />
+<!--    <LayoutHeaderMenu name="MyAccesses" />-->
 
-    <LayoutHeaderMenu name="MyFamily" />
+<!--    <LayoutHeaderMenu name="MyFamily" />-->
 
 <!--    <LayoutHeaderNotification />-->
 
-    <LayoutHeaderMenu name="Configuration" />
+<!--    <LayoutHeaderMenu name="Configuration" />-->
 
-    <LayoutHeaderMenu name="Account" />
+<!--    <LayoutHeaderMenu name="Account" />-->
 
-    <a
-        href="https://support.opentalent.fr/"
-        class="text-body pa-3 ml-2 bg-ot-dark-grey text-ot-white text-decoration-none"
-        target="_blank"
-    >
-      <!-- TODO: mettre le lien vers le support dans les .env ou dans la conf -->
-      <span class="d-none d-sm-none d-md-flex">{{ $t('help_access') }}</span>
-      <v-icon icon="fas fa-question-circle" class="d-sm-flex d-md-none" color="white"></v-icon>
-    </a>
+<!--    <a-->
+<!--        href="https://support.opentalent.fr/"-->
+<!--        class="text-body pa-3 ml-2 bg-ot-dark-grey text-ot-white text-decoration-none"-->
+<!--        target="_blank"-->
+<!--    >-->
+<!--      &lt;!&ndash; TODO: mettre le lien vers le support dans les .env ou dans la conf &ndash;&gt;-->
+<!--      <span class="d-none d-sm-none d-md-flex">{{ $t('help_access') }}</span>-->
+<!--      <v-icon icon="fas fa-question-circle" class="d-sm-flex d-md-none" color="white"></v-icon>-->
+<!--    </a>-->
   </v-app-bar>
 </template>
 
@@ -66,7 +66,7 @@ Contient entre autres le nom de l'organisation, l'accès à l'aide et aux préf
 import {computed, ComputedRef} from "@vue/reactivity";
 import {useMenu} from "~/composables/layout/useMenu";
 import {useAbility} from "@casl/vue";
-import {useOrganizationProfileStore} from "~/store/profile/organization";
+import {useOrganizationProfileStore} from "~/stores/organizationProfile";
 import {useRuntimeConfig} from "#app";
 
 const organizationProfile = useOrganizationProfileStore()

+ 1 - 1
components/Layout/Header/Notification.vue

@@ -80,7 +80,7 @@ import {repositoryHelper} from "~/services/store/repository";
 import {ApiResponse, HydraMetadata} from "~/types/interfaces";
 import {queryHelper} from "~/services/store/query";
 import {NotificationUsers} from "~/models/Core/NotificationUsers";
-import {$accessProfile} from "~/services/profile/accessProfile";
+import {$accessProfile} from "~/services/accessProfile";
 
 export default defineComponent({
   setup: function () {

+ 22 - 9
components/Layout/SubHeader/ActivityYear.vue

@@ -17,19 +17,32 @@
   </main>
 </template>
 
-<script lang="ts">
+<script setup lang="ts">
 
-import {useOrganizationProfileStore} from "~/store/profile/organization";
+import {useEntityManager} from "~/composables/data/useEntityManager";
+import {useFormStore} from "~/stores/form";
+import {useOrganizationProfileStore} from "~/stores/organizationProfile";
+import {useAccessProfileStore} from "~/stores/accessProfile";
 
-const organizationProfile = useOrganizationProfileStore()
+const { em } = useEntityManager()
+const { activityYear } = useAccessProfileStore()
+const { isManagerProduct, isSchool, isArtist } = useOrganizationProfileStore()
+const { setDirty } = useFormStore()
 
-const yearPlusOne: boolean = !organizationProfile.isManagerProduct()
-const label: string = organizationProfile.isSchool() ? 'schooling_year' : organizationProfile.isArtist() ? 'season_year' : 'cotisation_year'
+const setActivityYear = async (activityYear: number) => {
+  if (!(1900 < activityYear) || !(activityYear <= 2100)) {
+    throw new Error("Error: 'year' shall be a valid year")
+  }
+
+  await em.updateProfile({'activityYear': activityYear})
+}
+
+const yearPlusOne: boolean = !isManagerProduct
+const label: string = isSchool ? 'schooling_year' : isArtist ? 'season_year' : 'cotisation_year'
 
-const updateActivityYear = async (newDate:number) => {
-  markAsNotDirty()
-  setActivityYear(newDate)
-  await updateMyProfile()
+const updateActivityYear = async (newDate: number) => {
+  setDirty(false)
+  await setActivityYear(newDate)
   window.location.reload()
 }
 

+ 1 - 1
components/Layout/Subheader.vue

@@ -30,7 +30,7 @@ Contient entre autres le breadcrumb, les commandes de changement d'année et les
 
 <script setup lang="ts">
 
-    import {useAccessProfileStore} from "~/store/profile/access";
+    import {useAccessProfileStore} from "~/stores/accessProfile";
     import {computed, ComputedRef, ref, Ref} from "@vue/reactivity";
     import {useMenu} from "~/composables/layout/useMenu";
 

+ 1 - 1
components/Ui/Button/Delete.vue

@@ -35,7 +35,7 @@ import {TYPE_ALERT} from '~/types/enum/enums'
 import {Ref} from "@vue/reactivity";
 import {useEntityManager} from "~/composables/data/useEntityManager";
 import ApiResource from "~/models/ApiResource";
-import {usePageStore} from "~/store/page";
+import {usePageStore} from "~/stores/page";
 
 const props = defineProps({
     model: {

+ 2 - 2
components/Ui/Form.vue

@@ -81,11 +81,11 @@ import {computed, ComputedRef, ref, Ref} from "@vue/reactivity";
 import {AnyJson} from "~/types/enum/data";
 import {FORM_FUNCTION, SUBMIT_TYPE, TYPE_ALERT} from "~/types/enum/enums";
 import {useNuxtApp, useRouter} from "#app";
-import { useFormStore } from "~/store/form";
+import { useFormStore } from "~/stores/form";
 import {Route} from "@intlify/vue-router-bridge";
 import {useEntityManager} from "~/composables/data/useEntityManager";
 import ApiModel from "~/models/ApiModel";
-import {usePageStore} from "~/store/page";
+import {usePageStore} from "~/stores/page";
 import {watch} from "@vue/runtime-core";
 
 const props = defineProps({

+ 71 - 0
components/Ui/Xeditable/Text.vue

@@ -0,0 +1,71 @@
+<!--
+-->
+
+<template>
+  <main>
+    <div v-if="edit" class="d-flex align-baseline x-editable-input mt-n1">
+      <UiInputText
+          class="mt-0 pt-0 mt-n1"
+          :type="type"
+          :data="inputValue"
+          @update="inputValue=$event"
+      />
+      <v-icon aria-hidden="false" class="valid icons text-ot-green" small @click="update">
+        fas fa-check
+      </v-icon>
+      <v-icon aria-hidden="false" class="cancel icons text-ot-grey" small @click="close">
+        fas fa-times
+      </v-icon>
+    </div>
+    <div v-else class="edit-link" @click="edit=true">
+      <slot name="xeditable.read" v-bind="{inputValue}" />
+    </div>
+  </main>
+</template>
+
+<script setup lang="ts">
+import {ref, Ref} from "@vue/reactivity";
+
+  const props = defineProps({
+    type: {
+      type: String,
+      required: false,
+      default: null
+    },
+    data: {
+      type: [String, Number],
+      required: false,
+      default: null
+    }
+  })
+
+  const emit = defineEmits(['update'])
+
+  const edit: Ref<boolean> = ref(false)
+  const inputValue: Ref<string|number|null> = ref(props.data)
+
+  const update = () => {
+    edit.value = false
+    if (inputValue.value !== props.data) { emit('update', inputValue.value) }
+  }
+
+  const close = () => {
+    edit.value = false
+    inputValue.value = props.data
+  }
+
+</script>
+
+<style lang="scss">
+.x-editable-input{
+  input{
+    padding: 0 !important;
+  }
+  .icons{
+    padding: 5px;
+  }
+}
+.edit-link{
+  cursor: pointer;
+}
+</style>

+ 5 - 5
composables/data/useAp2iRequestService.ts

@@ -1,12 +1,12 @@
-import {useAccessProfileStore} from "~/store/profile/access";
 import {FetchContext, FetchOptions} from "ohmyfetch";
 import {TYPE_ALERT} from "~/types/enum/enums";
 import {navigateTo, useRuntimeConfig} from "#app";
 import ApiRequestService from "~/services/data/apiRequestService";
-import {AssociativeArray} from "~/types/enum/data";
 import {Ref} from "@vue/reactivity";
-import {usePageStore} from "~/store/page";
+import {usePageStore} from "~/stores/page";
 import UnauthorizedError from "~/services/error/UnauthorizedError";
+import {useAccessProfileStore} from "~/stores/accessProfile";
+import {AssociativeArray} from "~/types/data";
 
 /**
  * Retourne une instance de ApiRequestService configurée pour interroger l'api Ap2i
@@ -80,12 +80,12 @@ export const useAp2iRequestService = () => {
             throw new UnauthorizedError('Ap2i - Unauthorized')
         }
         else if (response && response.status === 403) {
-            usePageStore().addAlerts(TYPE_ALERT.ALERT, ['forbidden'])
+            usePageStore().addAlert(TYPE_ALERT.ALERT, ['forbidden'])
             console.error('Forbidden')
         }
         else if (response && response.status >= 404) {
             // @see https://developer.mozilla.org/fr/docs/Web/HTTP/Status
-            usePageStore().addAlerts(TYPE_ALERT.ALERT, [error ? error.message : response.statusText])
+            usePageStore().addAlert(TYPE_ALERT.ALERT, [error ? error.message : response.statusText])
             console.error(error ? error.message : response.statusText)
         }
     }

+ 1 - 1
composables/data/useEntityFetch.ts

@@ -1,7 +1,7 @@
 import {useAsyncData, AsyncData} from "#app";
 import {useEntityManager} from "~/composables/data/useEntityManager";
 import ApiResource from "~/models/ApiResource";
-import {AssociativeArray, Collection} from "~/types/enum/data";
+import {AssociativeArray, Collection} from "~/types/data";
 
 interface useEntityFetchReturnType {
     fetch: (model: typeof ApiResource, id: number) => AsyncData<ApiResource, ApiResource | true>,

+ 1 - 1
composables/data/useEnumFetch.ts

@@ -1,6 +1,6 @@
 import {useAsyncData, AsyncData} from "#app";
-import {Enum} from "~/types/enum/data";
 import {useEnumManager} from "~/composables/data/useEnumManager";
+import {Enum} from "~/types/data";
 
 interface useEnumFetchReturnType {
     fetch: (enumName: string) => AsyncData<Enum, null | true | Error>,

+ 0 - 1
composables/data/useEnumManager.ts

@@ -1,4 +1,3 @@
-import EntityManager from "~/services/data/entityManager";
 import {useAp2iRequestService} from "~/composables/data/useAp2iRequestService";
 import EnumManager from "~/services/data/enumManager";
 import VueI18n, {useI18n} from "vue-i18n";

+ 1 - 1
composables/data/useImageFetch.ts

@@ -1,4 +1,4 @@
-import {useAsyncData, AsyncData, useFetch, FetchResult} from "#app";
+import {useFetch, FetchResult} from "#app";
 import {useImageManager} from "~/composables/data/useImageManager";
 import {ref, Ref} from "@vue/reactivity";
 

+ 1 - 1
composables/form/useFieldViolation.ts

@@ -1,5 +1,5 @@
 import {computed, ComputedRef} from "@vue/reactivity";
-import {useFormStore} from "~/store/form";
+import {useFormStore} from "~/stores/form";
 import {useNuxtApp} from "#app";
 import {useGet} from "#imports";
 

+ 3 - 3
composables/layout/useMenu.ts

@@ -1,11 +1,11 @@
 import {Ref, ref} from "@vue/reactivity";
-import {useAccessProfileStore} from "~/store/profile/access";
+import {useAccessProfileStore} from "~/stores/accessProfile";
 import {useRuntimeConfig} from "#app";
 import {useAbility} from "@casl/vue";
-import {useOrganizationProfileStore} from "~/store/profile/organization";
+import {useOrganizationProfileStore} from "~/stores/organizationProfile";
 import AbstractMenuBuilder from "~/services/menuBuilder/abstractMenuBuilder";
 import {MenuGroup, MenuItem} from "~/types/layout";
-import {usePageStore} from "~/store/page";
+import {usePageStore} from "~/stores/page";
 import menus from "~/services/menuBuilder/_import";
 import {MENU_LINK_TYPE} from "~/types/enum/layout";
 

+ 1 - 1
middleware/auth.ts

@@ -1,4 +1,4 @@
-import {useAccessProfileStore} from "~/store/profile/access";
+import {useAccessProfileStore} from "~/stores/accessProfile";
 import {defineNuxtRouteMiddleware, navigateTo} from "#app";
 
 export default defineNuxtRouteMiddleware(

+ 1 - 0
models/models.ts

@@ -29,6 +29,7 @@ import {Person} from "~/models/Person/Person";
 import {Subdomain} from "~/models/Organization/Subdomain";
 import ApiResource from "~/models/ApiResource";
 
+// TODO: voir si possible de se passer de ce fichier
 
 const classes = [
     Access,

+ 1 - 1
pages/organization.vue

@@ -30,7 +30,7 @@
 import {useEntityManager} from "~/composables/data/useEntityManager";
 import {useEntityFetch} from "~/composables/data/useEntityFetch";
 import {computed, ComputedRef, Ref} from "@vue/reactivity";
-import {useOrganizationProfileStore} from "~/store/profile/organization";
+import {useOrganizationProfileStore} from "~/stores/organizationProfile";
 import {Organization} from "~/models/Organization/Organization";
 import {ContactPoint} from "~/models/Core/ContactPoint";
 import {BankAccount} from "~/models/Core/BankAccount";

+ 1 - 1
pages/organization/index.vue

@@ -449,7 +449,7 @@ import {useEntityFetch} from "~/composables/data/useEntityFetch";
 import {TypeOfPractice} from "~/models/Organization/TypeOfPractice";
 import {computed, ComputedRef, reactive, ref} from "@vue/reactivity";
 import {$organizationProfile} from "~/services/profile/organizationProfile";
-import {useOrganizationProfileStore} from "~/store/profile/organization";
+import {useOrganizationProfileStore} from "~/stores/profile/organization";
 import {useExtensionPanel} from "~/composables/layout/useExtensionPanel";
 import {useRoute} from "#app";
 import { useValidation } from "~/composables/form/useValidation";

+ 3 - 3
plugins/init.server.ts

@@ -1,5 +1,5 @@
 import {defineNuxtPlugin, useCookie} from "nuxt/app";
-import {useAccessProfileStore} from "~/store/profile/access";
+import {useAccessProfileStore} from "~/stores/accessProfile";
 import {useEntityManager} from "~/composables/data/useEntityManager";
 import UnauthorizedError from "~/services/error/UnauthorizedError";
 import {useRedirectToLogin} from "~/composables/layout/useRedirectToLogin";
@@ -10,10 +10,10 @@ export default defineNuxtPlugin(async ({ssrContext}) => {
     const bearer = useCookie('BEARER')
     const accessId = useCookie('AccessId')
 
-    const accessProfileStore = useAccessProfileStore()
+    const accessProfile = useAccessProfileStore()
 
     if (accessId.value !== null) {
-        accessProfileStore.$patch({
+        accessProfile.$patch({
             bearer: bearer.value,
             id: parseInt(accessId.value)
         })

+ 33 - 2
services/data/entityManager.ts

@@ -4,13 +4,13 @@ import Url from "~/services/utils/url";
 import ModelNormalizer from "./serializer/normalizer/modelNormalizer";
 import HydraDenormalizer from "./serializer/denormalizer/hydraDenormalizer";
 import ApiModel from "~/models/ApiModel";
-import {useAccessProfileStore} from "~/store/profile/access";
 import ApiResource from "~/models/ApiResource";
 import {MyProfile} from "~/models/Access/MyProfile";
 import { v4 as uuid4 } from 'uuid';
 import {AssociativeArray, Collection} from "~/types/data.d";
 import {useCloneDeep} from "#imports";
 import models from "~/models/models";
+import {useAccessProfileStore} from "~/stores/accessProfile";
 
 /**
  * Entity manager: make operations on the models defined with the Pinia-Orm library
@@ -244,7 +244,7 @@ class EntityManager {
     }
 
     /**
-     * Re-fetch the user profile and reactiveUpdate the store
+     * Re-fetch the user profile and update the store
      */
     public async refreshProfile() {
         const response = await this.apiRequestService.get('api/my_profile')
@@ -252,12 +252,43 @@ class EntityManager {
         // deserialize the response
         const hydraResponse = await HydraDenormalizer.denormalize(response)
 
+        const profileData = hydraResponse.data
+
+        // On n'aura jamais 2 profils stockés, et on a besoin d'un id pour retrouver le profil dans le store :
+        profileData['id'] = 1
+
         const profile = this.newInstance(MyProfile, hydraResponse.data)
 
+        // On met à jour le store accessProfile
+        // TODO: sortir le use du service, ça devrait être dans un composable
         const accessProfileStore = useAccessProfileStore()
         accessProfileStore.setProfile(profile)
     }
 
+    /**
+     * Update and persist the user profile
+     * @param data
+     */
+    public async updateProfile(data: object) {
+        const myProfile = await this.fetch(MyProfile, 1)
+
+        for (const prop in data) {
+            if (!Object.prototype.hasOwnProperty.call(myProfile, prop)) {
+                throw new Error('Error : MyProfile has no property named `' + prop + '`')
+            }
+
+            // @ts-ignore
+            myProfile[prop] = data[prop]
+        }
+
+        const newProfile = await this.persist(MyProfile, myProfile)
+
+        // On met à jour le store accessProfile
+        // TODO: sortir le use du service, ça devrait être dans un composable
+        const accessProfileStore = useAccessProfileStore()
+        accessProfileStore.setProfile(newProfile)
+    }
+
     /**
      * Delete all records in the repository of the model
      *

+ 0 - 1
services/data/imageManager.ts

@@ -1,5 +1,4 @@
 import ApiRequestService from "./apiRequestService";
-import Url from "~/services/utils/url";
 import ImageUtils from "~/services/utils/imageUtils";
 
 class ImageManager {

+ 1 - 1
services/data/serializer/denormalizer/yamlDenormalizer.ts

@@ -1,6 +1,6 @@
 import { read } from 'yaml-import'
 import {dump, load} from 'js-yaml';
-import {AnyJson} from "~/types/enum/data";
+import {AnyJson} from "~/types/data";
 
 
 /**

+ 3 - 3
services/menuBuilder/accessMenuBuilder.ts

@@ -1,7 +1,7 @@
-import {$organizationProfile} from '~/services/profile/organizationProfile'
 import AbstractMenuBuilder from '~/services/menuBuilder/abstractMenuBuilder'
 import {MenuGroup, MenuItem, MenuItems} from "~/types/layout";
 import {MENU_LINK_TYPE} from "~/types/enum/layout";
+import {useOrganizationProfileStore} from "~/stores/organizationProfile";
 
 /**
  * Menu Répertoire
@@ -16,8 +16,8 @@ export default class AccessMenuBuilder extends AbstractMenuBuilder {
     const children: MenuItems = []
 
     if (this.ability.can('display', 'accesses_page')) {
-      const organization = $organizationProfile()
-      const to = organization.isSchool() ? '/students/list/' : '/adherent/list/'
+      const organizationProfile = useOrganizationProfileStore()
+      const to = organizationProfile.isSchool ? '/students/list/' : '/adherent/list/'
       children.push(this.createItem('person', {name: 'fas fa-user'}, to, MENU_LINK_TYPE.V1))
     }
 

+ 5 - 34
services/rights/abilitiesUtils.ts

@@ -1,17 +1,16 @@
 import {$roleUtils} from '~/services/rights/roleUtils'
 import {AbilitiesType} from '~/types/interfaces'
-import {useAccessProfileStore} from "~/store/profile/access";
-import {useOrganizationProfileStore} from "~/store/profile/organization";
 import YamlDenormalizer from "~/services/data/serializer/denormalizer/yamlDenormalizer";
 import {MongoAbility} from "@casl/ability/dist/types/Ability";
 import {AnyJson} from "~/types/data";
+import {useAccessProfileStore} from "~/stores/accessProfile";
+import {useOrganizationProfileStore} from "~/stores/organizationProfile";
 
 /**
  * Classe permettant de mener des opérations sur les habilités
  */
 class AbilitiesUtils {
     private readonly $ability: MongoAbility = {} as MongoAbility
-    private factory: AnyJson = {}
 
     /**
      * @constructor
@@ -20,34 +19,6 @@ class AbilitiesUtils {
         this.$ability = ability
     }
 
-    /**
-     * Retourne la factory des services
-     *
-     * @return {AnyJson} factory
-     */
-    getFactory() {
-        return this.factory
-    }
-
-    /**
-     * Initialise les services factories
-     */
-    initFactory() {
-        this.factory = {
-            access: $accessProfile,
-            organization: $organizationProfile()
-        }
-        this.setAbilitiesAndStore()
-    }
-
-    /**
-     * Initialise les Abilities pour le service AccessProfile
-     */
-    setAbilitiesAndStore() {
-        this.factory.access.setAbility(this.$ability)
-        this.factory.access.setPinia()
-    }
-
     /**
      * Définit les abilities de l'utilisateur à chaque fois qu'on met à jour son profile
      */
@@ -58,8 +29,8 @@ class AbilitiesUtils {
         // Nécessaire pour que l'update des habilités soit correcte après la phase SSR
         this.$ability.update(accessProfileStore.abilities)
 
-        // // Au moment où l'on effectue un SetProfile, il faut aller récupérer
-        // // les différentes abilitées que l'utilisateur peut effectuer. (Tout cela se passe en SSR)
+        // Au moment où l'on effectue un SetProfile, il faut aller récupérer
+        // les différentes habilités que l'utilisateur peut effectuer. (Tout cela se passe en SSR)
         const unsubscribe = organizationProfileStore.$onAction(({
                 name, // name of the action
                 store, // store instance, same as `someStore`
@@ -91,7 +62,6 @@ class AbilitiesUtils {
         const accessProfileStore = useAccessProfileStore()
         const abilitiesByRoles: Array<AbilitiesType> = this.getAbilitiesByRoles(accessProfileStore.roles)
         this.$ability.update(abilitiesByRoles)
-        this.initFactory()
         return abilitiesByRoles.concat(this.getAbilitiesByConfig('./config/abilities/config.yaml'))
     }
 
@@ -175,6 +145,7 @@ class AbilitiesUtils {
                     const parameters: any = functions[cmpt]['parameters'] ?? null;
                     const result: boolean = functions[cmpt]['result'] ?? true;
 
+                    // TODO : à revoir
                     hasAbility = result !== null ? this.factory[service].handler()[f](parameters) == result : this.factory[service].handler()[f](parameters)
                     cmpt++
                 }

+ 1 - 1
services/rights/roleUtils.ts

@@ -1,5 +1,5 @@
 import { AbilitiesType } from '~/types/interfaces'
-import {AnyJson} from "~/types/enum/data";
+import {AnyJson} from "~/types/data";
 
 // TODO: peut-être passer ces constantes dans la config?
 const rolesByFunction: Array<string> = [

+ 1 - 2
services/utils/objectUtils.ts

@@ -3,8 +3,7 @@
  * @class ObjectUtils
  * Classe aidant à manipuler des Objets
  */
-import {AnyJson} from "~/types/enum/data";
-import ApiResource from "~/models/ApiResource";
+import {AnyJson} from "~/types/data";
 
 
 export default class ObjectUtils {

+ 25 - 29
store/profile/access.ts → stores/accessProfile.ts

@@ -6,41 +6,39 @@ import {
   baseOrganizationState,
   OrignalAccessState
 } from "~/types/interfaces";
-import {useOrganizationProfileStore} from "~/store/profile/organization";
 
-import {MyProfile} from "~/models/Access/MyProfile";
-import {useRepo} from "pinia-orm";
 import {computed, ref, Ref} from "@vue/reactivity";
 import {useEach} from "#imports";
 import {useAbility} from "@casl/vue";
+import {useOrganizationProfileStore} from "~/stores/organizationProfile";
 
 export const useAccessProfileStore = defineStore('accessProfile', () => {
 
   // State
-  const bearer = ref(null)
-  const id = ref(null)
-  const switchId = ref(null)
-  const name = ref(null)
-  const givenName = ref(null)
-  const gender = ref(null)
-  const avatarId = ref(null)
-  const activityYear = ref(null)
+  const bearer: Ref<string | null> = ref(null)
+  const id: Ref<number | null> = ref(null)
+  const switchId: Ref<number | null> = ref(null)
+  const name: Ref<string | null> = ref(null)
+  const givenName: Ref<string | null> = ref(null)
+  const gender: Ref<string | null> = ref(null)
+  const avatarId: Ref<number | null> = ref(null)
+  const activityYear: Ref<number | null> = ref(null)
   const historical = ref([])
   const roles: Ref<Array<string>> = ref([])
-  const abilities = ref([])
-  const isAdminAccess = ref(false)
-  const isSuperAdminAccess = ref(false)
-  const isAdmin = ref(false)
-  const isAdministratifManager = ref(false)
-  const isPedagogicManager = ref(false)
-  const isFinancialManager = ref(false)
-  const isCaMember = ref(false)
-  const isStudent = ref(false)
-  const isTeacher = ref(false)
-  const isMember = ref(false)
-  const isOther = ref(false)
-  const isGuardian = ref(false)
-  const isPayer = ref(false)
+  const abilities: Ref<Array<AbilitiesType>> = ref([])
+  const isAdminAccess: Ref<boolean | null> = ref(false)
+  const isSuperAdminAccess: Ref<boolean | null> = ref(false)
+  const isAdmin: Ref<boolean | null> = ref(false)
+  const isAdministratifManager: Ref<boolean | null> = ref(false)
+  const isPedagogicManager: Ref<boolean | null> = ref(false)
+  const isFinancialManager: Ref<boolean | null> = ref(false)
+  const isCaMember: Ref<boolean | null> = ref(false)
+  const isStudent: Ref<boolean | null> = ref(false)
+  const isTeacher: Ref<boolean | null> = ref(false)
+  const isMember: Ref<boolean | null> = ref(false)
+  const isOther: Ref<boolean | null> = ref(false)
+  const isGuardian: Ref<boolean | null> = ref(false)
+  const isPayer: Ref<boolean | null> = ref(false)
   const multiAccesses: Ref<Array<baseOrganizationState>> = ref([])
   const familyAccesses: Ref<Array<baseAccessState>> = ref([])
   const originalAccess = ref(null)
@@ -122,8 +120,6 @@ export const useAccessProfileStore = defineStore('accessProfile', () => {
     // Time to set Organization Profile
     const organizationProfileStore = useOrganizationProfileStore()
     organizationProfileStore.setProfile(profile.organization)
-
-    useRepo(MyProfile).save(profile)
   }
 
   const refreshProfile = (profile: any) => {
@@ -202,8 +198,6 @@ export const useAccessProfileStore = defineStore('accessProfile', () => {
     return hasProfile;
   }
 
-  const { can } = useAbility()
-
   /**
    * Est-ce que l'utilisateur possède l'habilité
    *
@@ -214,6 +208,8 @@ export const useAccessProfileStore = defineStore('accessProfile', () => {
     if(abilities === null)
       return true;
 
+    const { can } = useAbility()
+
     let hasAbility= false;
     abilities.map((ability) => {
       if (can(ability.action, ability.subject))

+ 2 - 2
store/form.ts → stores/form.ts

@@ -55,7 +55,7 @@ export const useFormStore = defineStore('form', () => {
     }
   }
 
-  return [
+  return {
     formFunction,
     violations,
     readonly,
@@ -70,5 +70,5 @@ export const useFormStore = defineStore('form', () => {
     setShowConfirmToLeave,
     setGoAfterLeave,
     handleActionsAfterLeavingPage
-  ]
+  }
 })

+ 0 - 0
store/profile/organization.ts → stores/organizationProfile.ts


+ 3 - 3
store/page.ts → stores/page.ts

@@ -5,7 +5,7 @@ import {Ref, ref} from "@vue/reactivity";
 
 export const usePageStore = defineStore('page', () => {
     const alerts: Ref<Array<Alert>> = ref([])
-    const menusOpened = ref({})
+    const menusOpened: Ref<Record<string, boolean>> = ref({})
 
     const removeSlowlyAlert = () => {
       setTimeout(() => {
@@ -26,10 +26,10 @@ export const usePageStore = defineStore('page', () => {
       alerts.value.push(alert)
     }
 
-    return [
+    return {
         alerts,
         menusOpened,
         removeSlowlyAlert,
         addAlert
-    ]
+    }
 })

+ 5 - 5
store/sse.ts → stores/sse.ts

@@ -33,9 +33,9 @@ export const useSseStore = defineStore('sse', () => {
     }
   }
 
-  return [
-      connected,
-      events,
-      addEvent
-  ]
+  return {
+    connected,
+    events,
+    addEvent
+  }
 })