Browse Source

fix/refactoring after MR

Vincent GUFFON 3 years ago
parent
commit
4e9836d761
100 changed files with 499 additions and 499 deletions
  1. BIN
      .output/public/images/Artist-Square.jpg
  2. BIN
      .output/public/images/School-Square.jpg
  3. BIN
      .output/public/images/nom-de-domaine.jpg
  4. BIN
      .output/public/images/sms_big.png
  5. 0 0
      .output/public/robots.txt
  6. 0 4
      assets/css/global.scss
  7. 4 5
      components/Form/Organization/Address.vue
  8. 1 1
      components/Form/Organization/BankAccount.vue
  9. 3 3
      components/Form/Organization/ContactPoint.vue
  10. 2 2
      components/Layout/Alert/Container.vue
  11. 2 2
      components/Layout/Alert/Content.vue
  12. 6 4
      components/Layout/AlertBar/SwitchYear.vue
  13. 1 1
      components/Layout/Alertbar.vue
  14. 1 1
      components/Layout/Header.vue
  15. 2 2
      components/Layout/Header/Menu.vue
  16. 4 3
      components/Layout/Header/Notification.vue
  17. 4 4
      components/Layout/Header/UniversalCreation/CreateButton.vue
  18. 1 1
      components/Layout/Menu.vue
  19. 4 4
      components/Layout/SubHeader/ActivityYear.vue
  20. 5 5
      components/Layout/SubHeader/DataTiming.vue
  21. 6 6
      components/Layout/SubHeader/DataTimingRange.vue
  22. 1 1
      components/Layout/SubHeader/PersonnalizedList.vue
  23. 4 4
      components/Ui/Button/Delete.vue
  24. 3 6
      components/Ui/Button/Submit.vue
  25. 2 2
      components/Ui/DataTable.vue
  26. 5 4
      components/Ui/Form.vue
  27. 2 2
      components/Ui/Image.vue
  28. 2 2
      components/Ui/Input/Autocomplete.vue
  29. 1 1
      components/Ui/Input/Checkbox.vue
  30. 2 2
      components/Ui/Input/DatePicker.vue
  31. 1 1
      components/Ui/Input/Email.vue
  32. 1 1
      components/Ui/Input/Enum.vue
  33. 5 5
      components/Ui/Input/Image.vue
  34. 1 1
      components/Ui/Input/Phone.vue
  35. 1 1
      components/Ui/Input/Text.vue
  36. 1 1
      components/Ui/Input/TextArea.vue
  37. 4 4
      components/Ui/Template/DataTable.vue
  38. 1 1
      composables/data/useAccess.ts
  39. 1 1
      composables/data/useAddresspostal.ts
  40. 1 1
      composables/data/useCountry.ts
  41. 2 2
      composables/data/useDataUtils.ts
  42. 1 1
      composables/data/useImage.ts
  43. 104 0
      composables/data/useMyProfile.ts
  44. 1 1
      composables/data/useTypeOfPractice.ts
  45. 4 4
      composables/form/useError.ts
  46. 1 1
      composables/form/useForm.ts
  47. 5 0
      composables/form/useNavigationHelpers.ts
  48. 5 0
      composables/form/useNextStepFactory.ts
  49. 1 1
      composables/form/useValidator.ts
  50. 2 2
      composables/layout/Menus/accessMenu.ts
  51. 2 2
      composables/layout/Menus/accountMenu.ts
  52. 2 2
      composables/layout/Menus/admin2iosMenu.ts
  53. 2 2
      composables/layout/Menus/agendaMenu.ts
  54. 1 1
      composables/layout/Menus/baseMenu.ts
  55. 2 2
      composables/layout/Menus/billingMenu.ts
  56. 2 2
      composables/layout/Menus/communicationMenu.ts
  57. 2 2
      composables/layout/Menus/configurationMenu.ts
  58. 3 3
      composables/layout/Menus/cotisationsMenu.ts
  59. 2 2
      composables/layout/Menus/donorsMenu.ts
  60. 2 2
      composables/layout/Menus/educationalMenu.ts
  61. 2 2
      composables/layout/Menus/equipmentMenu.ts
  62. 2 2
      composables/layout/Menus/medalsMenu.ts
  63. 2 2
      composables/layout/Menus/myAccessesMenu.ts
  64. 2 2
      composables/layout/Menus/myFamilyMenu.ts
  65. 2 2
      composables/layout/Menus/statsMenu.ts
  66. 2 2
      composables/layout/Menus/websiteMenu.ts
  67. 17 17
      composables/layout/menu.ts
  68. 1 1
      jest.config.js
  69. 1 1
      layouts/default.vue
  70. 2 2
      models/Access/PersonalizedList.ts
  71. 13 13
      models/Core/AddressPostal.ts
  72. 7 7
      models/Core/BankAccount.ts
  73. 8 8
      models/Core/ContactPoint.ts
  74. 5 5
      models/Core/Notification.ts
  75. 6 6
      models/Core/NotificationMessage.ts
  76. 4 4
      models/Core/NotificationUsers.ts
  77. 64 64
      models/Organization/Organization.ts
  78. 6 6
      models/Organization/OrganizationLicence.ts
  79. 6 6
      models/Organization/OrganizationNetwork.ts
  80. 1 1
      pages/organization/address/_id.vue
  81. 1 1
      pages/organization/address/new.vue
  82. 1 1
      pages/organization/bank_account/_id.vue
  83. 1 1
      pages/organization/bank_account/new.vue
  84. 1 1
      pages/organization/contact_points/_id.vue
  85. 1 1
      pages/organization/contact_points/new.vue
  86. 3 3
      pages/organization/index.vue
  87. 1 1
      pages/subscription.vue
  88. 11 13
      services/profile/accessProfile.ts
  89. 5 4
      services/rights/abilitiesUtils.ts
  90. 2 2
      services/store/page.ts
  91. 2 2
      store/page.ts
  92. 67 0
      tests/unit/composables/data/useMyProfile.spec.ts
  93. 1 1
      tests/unit/composables/form/useForm.spec.ts
  94. 1 1
      tests/unit/composables/form/useValidator.spec.ts
  95. 1 1
      tests/unit/composables/layout/menu.spec.ts
  96. 13 14
      tests/unit/services/profile/accessProfile.spec.ts
  97. 1 2
      tests/unit/services/rights/abilitiesUtils.spec.ts
  98. 0 60
      tests/unit/use/updater/useMyProfileUpdater.spec.ts
  99. 2 2
      types/interfaces.d.ts
  100. 0 114
      use/updater/useMyProfileUpdater.ts

BIN
.output/public/images/Artist-Square.jpg


BIN
.output/public/images/School-Square.jpg


BIN
.output/public/images/nom-de-domaine.jpg


BIN
.output/public/images/sms_big.png


+ 0 - 0
.output/public/robots.txt


+ 0 - 4
assets/css/global.scss

@@ -14,10 +14,6 @@ header .v-toolbar__content{
   color: inherit !important;
 }
 
-.margin-bottom-20{
-  margin-bottom: 20px;
-}
-
 .v-application a{
   color: var(--v-ot_green-base, white)
 }

+ 4 - 5
components/Form/Organization/Address.vue

@@ -2,7 +2,7 @@
 <template>
   <main>
     <LayoutContainer>
-      <v-card class="margin-bottom-20">
+      <v-card class="mb-5">
         <FormToolbar title="address_postal" icon="fa-globe-europe"/>
 
         <UiForm
@@ -112,13 +112,12 @@ import {QUERY_TYPE, SUBMIT_TYPE} from '~/types/enums'
 import { repositoryHelper } from '~/services/store/repository'
 import { queryHelper } from '~/services/store/query'
 import { AddressPostal } from '~/models/Core/AddressPostal'
-import {UseCountry} from "~/use/data/useCountry";
+import {UseCountry} from "~/composables/data/useCountry";
 import ModelsUtils from "~/services/utils/modelsUtils";
-import {UseAddressPostal} from "~/use/data/useAddresspostal";
+import {UseAddressPostal} from "~/composables/data/useAddresspostal";
 import {AnyJson} from "~/types/interfaces";
 import DataProvider from "~/services/data/dataProvider";
-import {UseAccess} from "~/use/data/useAccess";
-import {UseTypeOfPractice} from "~/use/data/useTypeOfPractice";
+import {UseAccess} from "~/composables/data/useAccess";
 
 export default defineComponent({
   props: {

+ 1 - 1
components/Form/Organization/BankAccount.vue

@@ -2,7 +2,7 @@
 <template>
   <main>
     <LayoutContainer>
-      <v-card class="margin-bottom-20">
+      <v-card class="mb-5">
         <FormToolbar title="bank_account" icon="fa-euro-sign"/>
 
         <UiForm

+ 3 - 3
components/Form/Organization/ContactPoint.vue

@@ -1,7 +1,7 @@
 <template>
   <main>
     <LayoutContainer>
-      <v-card class="margin-bottom-20">
+      <v-card class="mb-5">
         <FormToolbar title="contact_point" icon="fa-phone"/>
 
         <UiForm
@@ -10,7 +10,7 @@
           :query="query()"
           :submitActions="submitActions">
         >
-          <template v-slot:form.input="{entry, updateRepository}">
+          <template #form.input="{entry, updateRepository}">
             <v-container fluid class="container">
               <v-row>
                 <v-col cols="12" sm="12">
@@ -58,7 +58,7 @@
             </v-container>
           </template>
 
-          <template v-slot:form.button>
+          <template #form.button>
             <NuxtLink :to="{ path: '/organization', query: { accordion: 'contact_point' }}" class="no-decoration">
               <v-btn class="mr-4 ot_light_grey ot_grey--text">
                 {{ $t('back') }}

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

@@ -15,13 +15,13 @@ Container principal pour l'affichage d'une ou plusieurs alertes
 
 <script lang="ts">
 import { defineComponent, computed, ComputedRef, useContext } from '@nuxtjs/composition-api'
-import { Alerts } from '~/types/interfaces'
+import { Alert } from '~/types/interfaces'
 
 export default defineComponent({
   setup () {
     const { store } = useContext()
 
-    const alerts: ComputedRef<Array<Alerts>> = computed(() => {
+    const alerts: ComputedRef<Array<Alert>> = computed(() => {
       return store.state.page.alerts
     })
     return {

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

@@ -23,12 +23,12 @@
 
 <script lang="ts">
 import { defineComponent, ref, Ref, useContext } from '@nuxtjs/composition-api'
-import {Alerts} from '~/types/interfaces'
+import {Alert} from '~/types/interfaces'
 
 export default defineComponent({
   props: {
     alert: {
-      type: Object as () => Alerts,
+      type: Object as () => Alert,
       required: true
     }
   },

+ 6 - 4
components/Layout/AlertBar/SwitchYear.vue

@@ -14,14 +14,14 @@ Switch year bar : Barre qui s'affiche lorsque l'utilisateur n'est pas sur l'ann
 <script lang="ts">
 import { defineComponent, useContext, computed} from '@nuxtjs/composition-api'
 import {accessState, organizationState} from "~/types/interfaces";
-import {$useForm} from "~/use/form/useForm";
-import {$useMyProfileUpdater} from "~/use/updater/useMyProfileUpdater";
+import {$useForm} from "~/composables/form/useForm";
+import { useMyProfile } from '~/composables/data/useMyProfile'
 
 export default defineComponent({
   setup () {
     const { store } = useContext()
     const { markFormAsNotDirty } = $useForm()
-    const { updateMyProfile, setHistorical, setActivityYear } = $useMyProfileUpdater()
+    const { updateMyProfile, setHistorical, setActivityYear } = useMyProfile()
 
     const profileAccess:accessState = store.state.profile.access
     const profileOrganization:organizationState = store.state.profile.organization
@@ -38,7 +38,9 @@ export default defineComponent({
 
     const resetYear = async () =>{
       setHistorical(['present'])
-      setActivityYear(profileOrganization.currentActivityYear)
+      if(profileOrganization.currentActivityYear)
+        setActivityYear(profileOrganization.currentActivityYear)
+      
       markFormAsNotDirty()
       await updateMyProfile()
       window.location.reload()

+ 1 - 1
components/Layout/Alertbar.vue

@@ -7,7 +7,7 @@ Contient les différentes barre d'alertes qui s'affichent selon certains cas...
   <main>
     <client-only><LayoutAlertBarEnv></LayoutAlertBarEnv></client-only>
     <LayoutAlertBarSwitchUser></LayoutAlertBarSwitchUser>
-    <client-only><LayoutAlertBarCotisation v-if="isCmf && $can('manage', 'cotisation')"></LayoutAlertBarCotisation></client-only>
+    <LayoutAlertBarCotisation v-if="isCmf && $can('manage', 'cotisation')"></LayoutAlertBarCotisation>
     <LayoutAlertBarSwitchYear></LayoutAlertBarSwitchYear>
     <LayoutAlertBarSuperAdmin></LayoutAlertBarSuperAdmin>
   </main>

+ 1 - 1
components/Layout/Header.vue

@@ -66,7 +66,7 @@ et aux préférences de l'utilisateur
 import {
   defineComponent, reactive, useContext, computed, ComputedRef, Ref, UnwrapRef
 } from '@nuxtjs/composition-api'
-import { $useMenu } from '~/use/layout/menu'
+import { $useMenu } from '~/composables/layout/menu'
 import { AnyJson } from '~/types/interfaces'
 
 export default defineComponent({

+ 2 - 2
components/Layout/Header/Menu.vue

@@ -5,9 +5,9 @@ header principal (configuration, paramètres du compte...)
 
 <template>
   <v-menu offset-y left>
-    <template v-slot:activator="{ on: { click }, attrs }">
+    <template #activator="{ on: { click }, attrs }">
       <v-tooltip bottom>
-        <template v-slot:activator="{ on: on_tooltips , attrs: attrs_tooltips }">
+        <template #activator="{ on: on_tooltips , attrs: attrs_tooltips }">
           <v-btn
             icon
             v-bind="[attrs, attrs_tooltips]"

+ 4 - 3
components/Layout/Header/Notification.vue

@@ -1,8 +1,8 @@
 <template>
   <v-menu offset-y v-model="isOpen">
-    <template v-slot:activator="{ on: { click }, attrs }">
+    <template #activator="{ on: { click }, attrs }">
       <v-tooltip bottom>
-        <template v-slot:activator="{ on: on_tooltips , attrs: attrs_tooltips }">
+        <template #activator="{ on: on_tooltips , attrs: attrs_tooltips }">
           <v-btn
             icon
             v-bind="[attrs, attrs_tooltips]"
@@ -86,7 +86,8 @@ export default defineComponent({
   setup: function () {
     const {$dataProvider, $dataPersister, $config, store, app: { i18n }} = useContext()
     const profileAccess = store.state.profile.access
-    const currentAccessId = $accessProfile(store).getCurrentAccessId()
+    $accessProfile.setStore(store)
+    const currentAccessId = $accessProfile.getCurrentAccessId()
 
     const loading: Ref<Boolean> = ref(true)
     const isOpen: Ref<Boolean> = ref(false)

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

@@ -15,13 +15,13 @@ bouton Créer
       :show="showDialog"
     >
 
-      <template v-slot:dialogType>{{ $t('creative_assistant') }}</template>
-      <template v-slot:dialogTitle>{{ $t('what_do_you_want_to_create') }}</template>
-      <template v-slot:dialogText>
+      <template #dialogType>{{ $t('creative_assistant') }}</template>
+      <template #dialogTitle>{{ $t('what_do_you_want_to_create') }}</template>
+      <template #dialogText>
         <LayoutHeaderUniversalCreationGenerateCardsSteps :step="step" @updateStep="step=$event" />
 
       </template>
-      <template v-slot:dialogBtn>
+      <template #dialogBtn>
         <div class="text-center">
           <v-btn
             color="ot_super_light_grey"

+ 1 - 1
components/Layout/Menu.vue

@@ -35,7 +35,7 @@ Prend en paramètre une liste de ItemMenu et les met en forme
           v-model="item.active"
           no-action
         >
-          <template v-slot:activator>
+          <template #activator>
             <v-list-item-action>
               <v-icon class="ot_menu_color--text" small>
                 {{ item.icon }}

+ 4 - 4
components/Layout/SubHeader/ActivityYear.vue

@@ -7,7 +7,7 @@
       :data="activityYear"
       @update="updateActivityYear"
     >
-      <template v-slot:xeditable.read="{inputValue}">
+      <template #xeditable.read="{inputValue}">
         <v-icon aria-hidden="false" class="ot_green--text" x-small>
           fas fa-edit
         </v-icon>
@@ -19,14 +19,14 @@
 
 <script lang="ts">
 import { defineComponent, useContext } from '@nuxtjs/composition-api'
-import { $useMyProfileUpdater } from '~/use/updater/useMyProfileUpdater'
+import { useMyProfile } from '~/composables/data/useMyProfile'
 import { $organizationProfile } from '~/services/profile/organizationProfile'
-import { $useForm } from '~/use/form/useForm'
+import { $useForm } from '~/composables/form/useForm'
 
 export default defineComponent({
   setup () {
     const { store } = useContext()
-    const { updateMyProfile, setActivityYear, activityYear } = $useMyProfileUpdater()
+    const { updateMyProfile, setActivityYear, activityYear } = useMyProfile()
     const { markFormAsNotDirty } = $useForm()
 
     const organizationProfile = $organizationProfile(store)

+ 5 - 5
components/Layout/SubHeader/DataTiming.vue

@@ -25,16 +25,16 @@
 </template>
 
 <script lang="ts">
-import { defineComponent, onUnmounted, ref, useContext, watch, Ref, WatchStopHandle } from '@nuxtjs/composition-api'
-import { $useForm } from '~/use/form/useForm'
-import { $useMyProfileUpdater } from '~/use/updater/useMyProfileUpdater'
+import { defineComponent, onUnmounted, ref, watch, Ref, WatchStopHandle } from '@nuxtjs/composition-api'
+import { $useForm } from '~/composables/form/useForm'
+import { useMyProfile } from '~/composables/data/useMyProfile'
 
 export default defineComponent({
   setup () {
     const { markFormAsNotDirty } = $useForm()
-    const { updateMyProfile, setHistorical, historical } = $useMyProfileUpdater()
+    const { updateMyProfile, setHistorical, historical } = useMyProfile()
 
-    const historicalBtn: Ref<Array<number>> = initHistoricalBtn(historical.value)
+    const historicalBtn: Ref<Array<number>> = initHistoricalBtn(historical.value as Array<any>)
 
     const unwatch: WatchStopHandle = watch(historicalBtn, async (newValue) => {
       const historicalChoice: Array<string> = initHistoricalChoice(newValue)

+ 6 - 6
components/Layout/SubHeader/DataTimingRange.vue

@@ -14,7 +14,7 @@
     </div>
 
     <v-tooltip bottom>
-      <template v-slot:activator="{ on, attrs }">
+      <template #activator="{ on, attrs }">
         <v-btn
           class="time-btn"
           max-height="25"
@@ -37,17 +37,17 @@
 
 <script lang="ts">
 import {
-  defineComponent, onUnmounted, ref, useContext, watch, computed, ComputedRef, Ref, WatchStopHandle
+  defineComponent, onUnmounted, ref, watch, computed, ComputedRef, Ref, WatchStopHandle
 } from '@nuxtjs/composition-api'
-import { $useMyProfileUpdater } from '~/use/updater/useMyProfileUpdater'
-import { $useForm } from '~/use/form/useForm'
+import { useMyProfile } from '~/composables/data/useMyProfile'
+import { $useForm } from '~/composables/form/useForm'
 
 export default defineComponent({
   setup (_, { emit }) {
     const { markFormAsNotDirty } = $useForm()
-    const { updateMyProfile, setHistoricalRange, historical } = $useMyProfileUpdater()
+    const { updateMyProfile, setHistoricalRange, historical } = useMyProfile()
 
-    const datesRange:ComputedRef<Array<string>> = computed(() => {
+    const datesRange:ComputedRef<Array<any>> = computed(() => {
       return [historical.value.dateStart, historical.value.dateEnd]
     })
 

+ 1 - 1
components/Layout/SubHeader/PersonnalizedList.vue

@@ -7,7 +7,7 @@
       :close-on-content-click="false"
       min-width="500"
     >
-      <template v-slot:activator="{ on, attrs }">
+      <template #activator="{ on, attrs }">
         <span
           v-bind="attrs"
           class="ot_green--text"

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

@@ -11,14 +11,14 @@ Bouton Delete avec modale de confirmation de la suppression
     <lazy-LayoutDialog
       :show="showDialog"
     >
-      <template v-slot:dialogType>{{ $t('delete_assistant') }}</template>
-      <template v-slot:dialogTitle>{{ $t('attention') }}</template>
-      <template v-slot:dialogText>
+      <template #dialogType>{{ $t('delete_assistant') }}</template>
+      <template #dialogTitle>{{ $t('attention') }}</template>
+      <template #dialogText>
         <v-card-text>
           <p>{{ $t('confirm_to_delete') }}</p>
         </v-card-text>
       </template>
-      <template v-slot:dialogBtn>
+      <template #dialogBtn>
         <v-btn class="mr-4 submitBtn ot_grey ot_white--text" @click="closeDialog">
           {{ $t('cancel') }}
         </v-btn>

+ 3 - 6
components/Ui/Button/Submit.vue

@@ -1,5 +1,5 @@
 <template>
-  <v-btn v-if="!readonly" class="mr-4 ot_green ot_white--text" :class="otherActions ? 'pr-0' : ''" @click="onClick(mainAction)" ref="mainBtn">
+  <v-btn class="mr-4 ot_green ot_white--text" :class="otherActions ? 'pr-0' : ''" @click="onClick(mainAction)" ref="mainBtn">
     {{ $t(mainAction) }}
 
     <v-divider class="ml-3" vertical v-if="otherActions"></v-divider>
@@ -12,7 +12,7 @@
       :nudge-top="dropDirection==='top' ? 6 : 0"
       :nudge-bottom="dropDirection==='bottom' ? 6 : 0"
     >
-      <template v-slot:activator="{ on, attrs }">
+      <template #activator="{ on, attrs }">
         <v-toolbar-title v-on="on">
           <v-icon class="pl-3 pr-3">
             {{ dropDirection==='top' ? 'fa-caret-up' : 'fa-caret-down'}}
@@ -38,7 +38,7 @@
 
 <script lang="ts">
 import {computed, ComputedRef, defineComponent, ref, Ref} from "@nuxtjs/composition-api";
-import {$useForm} from "~/use/form/useForm";
+import {$useForm} from "~/composables/form/useForm";
 
 export default defineComponent({
   props: {
@@ -54,8 +54,6 @@ export default defineComponent({
   },
 
   setup(props, {emit}) {
-    const {readonly} = $useForm()
-
     const mainBtn:Ref<any> = ref(null)
     const menuSize = computed(()=>{
       //Btn size + 40px de padding
@@ -78,7 +76,6 @@ export default defineComponent({
     return{
       mainBtn,
       menuSize,
-      readonly,
       onClick,
       mainAction,
       otherActions

+ 2 - 2
components/Ui/DataTable.vue

@@ -16,13 +16,13 @@ Tableau interactif
       :loading="$fetchState.pending"
       class="elevation-1"
     >
-      <template v-for="header in headersWithItem" v-slot:[header.item]="props">
+      <template v-for="header in headersWithItem" #[header.item]="props">
         <slot :name="header.item" v-bind="props">
           {{ props.item[header.value] }}
         </slot>
       </template>
 
-      <template v-slot:item.actions="{ item }">
+      <template #item.actions="{ item }">
         <v-icon
           small
           class="mr-2"

+ 5 - 4
components/Ui/Form.vue

@@ -16,6 +16,7 @@ Formulaire générique
           <v-col cols="12" sm="12">
             <slot name="form.button"/>
             <UiButtonSubmit
+              v-if="!readonly"
               @submit="submit"
               :actions="actions"
             ></UiButtonSubmit>
@@ -41,7 +42,7 @@ Formulaire générique
     <lazy-LayoutDialog
       :show="showDialog"
     >
-      <template v-slot:dialogText>
+      <template #dialogText>
         <v-card-title class="text-h5 grey lighten-2">
           {{ $t('attention') }}
         </v-card-title>
@@ -50,7 +51,7 @@ Formulaire générique
           <p>{{ $t('quit_without_saving_warning') }}</p>
         </v-card-text>
       </template>
-      <template v-slot:dialogBtn>
+      <template #dialogBtn>
         <v-btn class="mr-4 submitBtn ot_green ot_white--text" @click="closeDialog">
           {{ $t('back_to_form') }}
         </v-btn>
@@ -73,11 +74,11 @@ import {repositoryHelper} from '~/services/store/repository'
 import {queryHelper} from '~/services/store/query'
 import {FORM_STATUS, QUERY_TYPE, SUBMIT_TYPE, TYPE_ALERT} from '~/types/enums'
 import {AnyJson} from '~/types/interfaces'
-import {$useForm} from '~/use/form/useForm'
+import {$useForm} from '~/composables/form/useForm'
 import * as _ from 'lodash'
 import Form from "~/services/store/form";
 import Page from "~/services/store/page";
-import UseNextStepFactory from "~/use/form/useNextStepFactory";
+import UseNextStepFactory from "~/composables/form/useNextStepFactory";
 
 export default defineComponent({
   props: {

+ 2 - 2
components/Ui/Image.vue

@@ -8,7 +8,7 @@
         :width="width"
         aspect-ratio="1"
       >
-        <template v-slot:placeholder>
+        <template #placeholder>
           <v-row
             class="fill-height ma-0"
             align="center"
@@ -42,7 +42,7 @@
 
 <script lang="ts">
 import {defineComponent, onUnmounted, ref, Ref, watch} from '@nuxtjs/composition-api'
-import {UseImage} from "~/use/data/useImage";
+import {UseImage} from "~/composables/data/useImage";
 import {WatchStopHandle} from "@vue/composition-api";
 
 export default defineComponent({

+ 2 - 2
components/Ui/Input/Autocomplete.vue

@@ -25,7 +25,7 @@ Liste déroulante avec autocompletion
       :rules="rules"
       @input="onChange($event)"
     >
-      <template v-if="slotText" v-slot:item="data">
+      <template v-if="slotText" #item="data">
         <v-list-item-content v-text="data.item.slotTextDisplay"></v-list-item-content>
       </template>
     </v-autocomplete>
@@ -37,7 +37,7 @@ import {computed, defineComponent, ComputedRef, Ref, ref, watch, onUnmounted, us
 import { AnyJson } from '~/types/interfaces'
 import * as _ from 'lodash'
 import {$objectProperties} from "~/services/utils/objectProperties";
-import {$useError} from "~/use/form/useError";
+import {$useError} from "~/composables/form/useError";
 
 export default defineComponent({
   props: {

+ 1 - 1
components/Ui/Input/Checkbox.vue

@@ -22,7 +22,7 @@ Case à cocher
 
 <script lang="ts">
 import { defineComponent } from '@nuxtjs/composition-api'
-import {$useError} from "~/use/form/useError";
+import {$useError} from "~/composables/form/useError";
 
 export default defineComponent({
   props: {

+ 2 - 2
components/Ui/Input/DatePicker.vue

@@ -14,7 +14,7 @@ Sélecteur de dates
       offset-y
       min-width="auto"
     >
-      <template v-slot:activator="{ on, attrs }">
+      <template #activator="{ on, attrs }">
         <v-text-field
           v-model="datesFormatted"
           autocomplete="off"
@@ -43,7 +43,7 @@ Sélecteur de dates
 import { defineComponent, watch, ref, useContext, onUnmounted, computed, Ref, ComputedRef } from '@nuxtjs/composition-api'
 import { WatchStopHandle } from '@vue/composition-api'
 import DatesUtils from '~/services/utils/datesUtils'
-import {$useError} from "~/use/form/useError";
+import {$useError} from "~/composables/form/useError";
 
 export default defineComponent({
   props: {

+ 1 - 1
components/Ui/Input/Email.vue

@@ -15,7 +15,7 @@ Champs de saisie de type Text dédié à la saisie d'emails
 
 <script lang="ts">
 import { defineComponent, useContext } from '@nuxtjs/composition-api'
-import {$useError} from "~/use/form/useError";
+import {$useError} from "~/composables/form/useError";
 
 export default defineComponent({
   props: {

+ 1 - 1
components/Ui/Input/Enum.vue

@@ -31,7 +31,7 @@ Liste déroulante dédiée à l'affichage d'objets Enum
 import {defineComponent, ref, useContext, useFetch, Ref} from '@nuxtjs/composition-api'
 import { EnumChoices } from '~/types/interfaces'
 import { QUERY_TYPE } from '~/types/enums'
-import {$useError} from "~/use/form/useError";
+import {$useError} from "~/composables/form/useError";
 
 export default defineComponent({
   props: {

+ 5 - 5
components/Ui/Input/Image.vue

@@ -4,9 +4,9 @@ https://norserium.github.io/vue-advanced-cropper/
 -->
 <template>
     <lazy-LayoutDialog :show="true">
-      <template v-slot:dialogType>{{ $t('image_assistant') }}</template>
-      <template v-slot:dialogTitle>{{ $t('modif_picture') }}</template>
-      <template v-slot:dialogText>
+      <template #dialogType>{{ $t('image_assistant') }}</template>
+      <template #dialogTitle>{{ $t('modif_picture') }}</template>
+      <template #dialogText>
         <div class="upload">
           <v-row
             v-if="fetchState.pending"
@@ -45,7 +45,7 @@ https://norserium.github.io/vue-advanced-cropper/
 
         </div>
       </template>
-      <template v-slot:dialogBtn>
+      <template #dialogBtn>
         <v-btn class="mr-4 submitBtn ot_grey ot_white--text" @click="$emit('close')">
           {{ $t('cancel') }}
         </v-btn>
@@ -62,7 +62,7 @@ import {defineComponent, onUnmounted, Ref, ref, useContext, useFetch, watch} fro
 import { Cropper } from 'vue-advanced-cropper'
 import 'vue-advanced-cropper/dist/style.css';
 import {AnyJson, ApiResponse} from "~/types/interfaces";
-import {UseImage} from "~/use/data/useImage";
+import {UseImage} from "~/composables/data/useImage";
 import {WatchStopHandle} from "@vue/composition-api";
 import {QUERY_TYPE} from "~/types/enums";
 import {File} from "~/models/Core/File";

+ 1 - 1
components/Ui/Input/Phone.vue

@@ -24,7 +24,7 @@ Champs de saisie d'un numéro de téléphone
 
 <script lang="ts">
 import { defineComponent, Ref, ref, useContext, computed } from '@nuxtjs/composition-api'
-import {$useError} from "~/use/form/useError";
+import {$useError} from "~/composables/form/useError";
 
 export default defineComponent({
   props: {

+ 1 - 1
components/Ui/Input/Text.vue

@@ -21,7 +21,7 @@ Champs de saisie de texte
 
 <script lang="ts">
 import { defineComponent } from '@nuxtjs/composition-api'
-import {$useError} from "~/use/form/useError";
+import {$useError} from "~/composables/form/useError";
 import {mask} from 'vue-the-mask';
 
 export default defineComponent({

+ 1 - 1
components/Ui/Input/TextArea.vue

@@ -19,7 +19,7 @@ Champs de saisie de bloc texte
 
 <script lang="ts">
 import { defineComponent } from '@nuxtjs/composition-api'
-import {$useError} from "~/use/form/useError";
+import {$useError} from "~/composables/form/useError";
 
 export default defineComponent({
   props: {

+ 4 - 4
components/Ui/Template/DataTable.vue

@@ -12,20 +12,20 @@ Tableau interactif
     <v-data-table
       :headers="headersWithItem"
       :items="items"
-      locale="fr-FR"
+      :locale="$i18n.locale"
       class="elevation-1"
       :footer-props="{
         'items-per-page-text':  $t('itemsPerPage'),
         'items-per-page-all-text':  $t('allResult')
       }"
     >
-      <template v-for="header in headersWithItem" v-slot:[header.item]="props">
+      <template v-for="header in headersWithItem" #[header.item]="props">
         <slot :name="header.item" v-bind="props">
           {{ props.item[header.value] }}
         </slot>
       </template>
 
-      <template v-slot:[`footer.page-text`]="items">
+      <template #[`footer.page-text`]="items">
         {{ items.pageStart }} - {{ items.pageStop }} {{$t('of')}} {{ items.itemsLength }}
       </template>
 
@@ -34,7 +34,7 @@ Tableau interactif
 </template>
 
 <script lang="ts">
-import { defineComponent, ref, computed, toRefs, Ref } from '@nuxtjs/composition-api'
+import { defineComponent, computed, toRefs } from '@nuxtjs/composition-api'
 
 export default defineComponent({
   props: {

+ 1 - 1
use/data/useAccess.ts → composables/data/useAccess.ts

@@ -4,7 +4,7 @@ import { useContext} from '@nuxtjs/composition-api'
 import DataProvider from "~/services/data/dataProvider";
 
 /**
- * @category Use/data
+ * @category composables/data
  * @class UseAccess
  * Use Classe qui va récupérer les Accesses suivant des critères de recherche
  */

+ 1 - 1
use/data/useAddresspostal.ts → composables/data/useAddresspostal.ts

@@ -4,7 +4,7 @@ import { useContext } from '@nuxtjs/composition-api'
 import DataProvider from "~/services/data/dataProvider";
 
 /**
- * @category Use/data
+ * @category composables/data
  * @class UseAddressPostal
  * Use Classe pour gérer les deux champs postal code et adresseCity
  */

+ 1 - 1
use/data/useCountry.ts → composables/data/useCountry.ts

@@ -6,7 +6,7 @@ import DataProvider from "~/services/data/dataProvider";
 import {repositoryHelper} from "~/services/store/repository";
 
 /**
- * @category Use/data
+ * @category composables/data
  * @class UseCountry
  * Use Classe qui va récupérer les Countries
  */

+ 2 - 2
use/data/useDataUtils.ts → composables/data/useDataUtils.ts

@@ -7,8 +7,8 @@ import {repositoryHelper} from "~/services/store/repository";
 import {Store} from "vuex";
 
 /**
- * @category Use/data
- * @class UseAccess
+ * @category composables/data
+ * @class UseDataUtils
  * Use Classe qui va récupérer les Accesses suivant des critères de recherche
  */
 export class UseDataUtils {

+ 1 - 1
use/data/useImage.ts → composables/data/useImage.ts

@@ -4,7 +4,7 @@ import {useContext, useFetch, Ref, ref} from '@nuxtjs/composition-api'
 import DataProvider from "~/services/data/dataProvider";
 
 /**
- * @category Use/data
+ * @category composables/data
  * @class UseImage
  * Use Classe qui va récupérer les Images
  */

+ 104 - 0
composables/data/useMyProfile.ts

@@ -0,0 +1,104 @@
+import {computed, ComputedRef} from '@nuxtjs/composition-api'
+import { Item, Model } from '@vuex-orm/core'
+import { repositoryHelper } from '~/services/store/repository'
+import { QUERY_TYPE } from '~/types/enums'
+import { Historical } from '~/types/interfaces'
+import { MyProfile } from '~/models/Access/MyProfile'
+import { $accessProfile } from '@/services/profile/accessProfile'
+import { useContext } from '@nuxtjs/composition-api'
+
+/**
+ * Composable function
+ */
+export function useMyProfile(){
+  const {$dataPersister, store} = useContext()
+  $accessProfile.setStore(store)
+  const currentAccessId = $accessProfile.getCurrentAccessId()
+  const myProfile = getMyProfileInstance(currentAccessId) as MyProfile
+  const activityYear:ComputedRef<number> = computed(() => myProfile.activityYear)
+  const historical:ComputedRef<Historical> = computed(() => myProfile.historical)
+
+  /**
+   * Effectue la mise à jour (coté API) de MyProfile
+   */
+  async function updateMyProfile (): Promise<any> {
+    await $dataPersister.invoke({
+      type: QUERY_TYPE.MODEL,
+      model: MyProfile,
+      id: myProfile.id
+    })
+  }
+
+  /**
+   * Mets à jour l'activity de my profile
+   * @param activityYear
+   */
+  function setActivityYear (activityYear:number) {
+    if (activityYear <= 0) { throw new Error('year must be positive') }
+    repositoryHelper.updateStoreFromField(MyProfile, myProfile, activityYear, 'activityYear')
+  }
+
+  /**
+   * Mets à jour l'historical de my profile
+   * @param historicalChoices
+   */
+  function setHistorical (historicalChoices:Array<string>) {
+    repositoryHelper.updateStoreFromField(MyProfile, myProfile, getHistoricalEntry(historicalChoices), 'historical')
+  }
+
+
+  /**
+   * Mets à jour l'historical de my profile
+   * @param dates
+   */
+  function setHistoricalRange (dates:Array<string>) {
+    repositoryHelper.updateStoreFromField(MyProfile, myProfile, getHistoricalRangeEntry(dates), 'historical')
+  }
+
+  return {
+    currentAccessId,
+    activityYear,
+    historical,
+    updateMyProfile,
+    setActivityYear,
+    setHistorical,
+    setHistoricalRange
+  }
+}
+
+/**
+ * récupère l'instance MyProfile
+ * @param myProfileId
+ */
+function getMyProfileInstance (myProfileId:any): Item<Model> {
+  return repositoryHelper.findItemFromModel(MyProfile, parseInt(myProfileId))
+}
+
+/**
+ * Transform les choix de l'historique en objet JSON reconnaissable coté API
+ * @param historicalChoices
+ */
+function getHistoricalEntry (historicalChoices:Array<string>) {
+  const historicalDefault:any = { past: false, future: false, present: false }
+  for (const historicalChoice of historicalChoices) {
+    historicalDefault[historicalChoice] = true
+  }
+  return historicalDefault
+}
+
+/**
+ * Transforme le choix des période en Objet JSON reconnaissable coté API
+ * @param dates
+ */
+function getHistoricalRangeEntry (dates:Array<string>) {
+  return { past: false, future: false, present: false, dateStart: dates[0], dateEnd: dates[1] }
+}
+
+/**
+ * Const servant à assurer les tests des fonctions non exportées
+ */
+export const _exportedForTesting = {
+  getMyProfileInstance,
+  getHistoricalEntry,
+  getHistoricalRangeEntry
+}

+ 1 - 1
use/data/useTypeOfPractice.ts → composables/data/useTypeOfPractice.ts

@@ -6,7 +6,7 @@ import {repositoryHelper} from "~/services/store/repository";
 import {TypeOfPractice} from "~/models/Organization/TypeOfPractice";
 
 /**
- * @category Use/data
+ * @category composables/data
  * @class UseTypeOfPractice
  * Use Classe qui va récupérer les UseTypeOfPractices
  */

+ 4 - 4
use/form/useError.ts → composables/form/useError.ts

@@ -2,7 +2,7 @@ import { AnyJson, AnyStore } from '~/types/interfaces'
 import {computed, ComputedRef, useContext} from "@nuxtjs/composition-api";
 
 /**
- * @category Use/form
+ * @category composables/form
  * @class UseError
  * Use Classe pour gérer l'apparition de message si le formulaire est dirty
  */
@@ -31,10 +31,10 @@ export class UseError {
   /**
    *
    */
-  private onChange (emit:any, fieldValue:any, field:string) {
-    const errors = this.store.state.form.violations.filter((field:string) => field !== field)
+  private onChange (emit:any, fieldValue:any, changeField:string) {
+    const errors = this.store.state.form.violations.filter((field:string) => field !== changeField)
     this.store.commit('form/setViolations', errors)
-    emit('update', fieldValue, field)
+    emit('update', fieldValue, changeField)
   }
 }
 

+ 1 - 1
use/form/useForm.ts → composables/form/useForm.ts

@@ -2,7 +2,7 @@ import { AnyJson, AnyStore } from '~/types/interfaces'
 import {computed, ComputedRef, useContext} from "@nuxtjs/composition-api";
 
 /**
- * @category Use/form
+ * @category composables/form
  * @class UseDirtyForm
  * Use Classe pour gérer l'apparition de message si le formulaire est dirty
  */

+ 5 - 0
use/form/useNavigationHelpers.ts → composables/form/useNavigationHelpers.ts

@@ -1,6 +1,11 @@
 import { onMounted, ref, useContext, Ref } from '@nuxtjs/composition-api'
 import * as _ from 'lodash'
 
+/**
+ * @category composables/form
+ * @class UseNavigationHelpers
+ * Use Classe pour gérer les expansions des accordions
+ */
 export class UseNavigationHelpers {
   public static expansionPanels () {
     const { route } = useContext()

+ 5 - 0
use/form/useNextStepFactory.ts → composables/form/useNextStepFactory.ts

@@ -4,6 +4,11 @@ import {Store} from "vuex";
 import {AnyJson} from "~/types/interfaces";
 import {Route} from "vue-router";
 
+/**
+ * @category composables/form
+ * @class UseNextStepFactory
+ * Use Classe pour gérer actions post submit
+ */
 export default class UseNextStepFactory{
   private store: Store<any>
   private router: any

+ 1 - 1
use/form/useValidator.ts → composables/form/useValidator.ts

@@ -4,7 +4,7 @@ import { QUERY_TYPE } from '~/types/enums'
 import { DataManager } from '~/types/interfaces'
 
 /**
- * @category Use/form
+ * @category composables/form
  * @class UseValidator
  * Use Classe pour des utils de verifications
  */

+ 2 - 2
use/layout/Menus/accessMenu.ts → composables/layout/Menus/accessMenu.ts

@@ -2,10 +2,10 @@ import { Ability } from '@casl/ability'
 import { NuxtConfig } from '@nuxt/types/config'
 import { AnyStore, ItemMenu, ItemsMenu, Menu } from '~/types/interfaces'
 import { $organizationProfile } from '~/services/profile/organizationProfile'
-import BaseMenu from '~/use/layout/Menus/baseMenu'
+import BaseMenu from '~/composables/layout/Menus/baseMenu'
 
 /**
- * @category Use/layout/Menus
+ * @category composables/layout/Menus
  * @class AccessMenu
  * Classe pour la construction du Menu Répertoire
  */

+ 2 - 2
use/layout/Menus/accountMenu.ts → composables/layout/Menus/accountMenu.ts

@@ -1,10 +1,10 @@
 import { Ability } from '@casl/ability'
 import { NuxtConfig } from '@nuxt/types/config'
 import { AnyStore, ItemMenu, ItemsMenu, Menu } from '~/types/interfaces'
-import BaseMenu from '~/use/layout/Menus/baseMenu'
+import BaseMenu from '~/composables/layout/Menus/baseMenu'
 
 /**
- * @category Use/layout/Menus
+ * @category composables/layout/Menus
  * @class AccountMenu
  * Classe pour la construction du Menu Mon compte
  */

+ 2 - 2
use/layout/Menus/admin2iosMenu.ts → composables/layout/Menus/admin2iosMenu.ts

@@ -1,10 +1,10 @@
 import { NuxtConfig } from '@nuxt/types/config'
 import { Ability } from '@casl/ability'
 import { ItemMenu, ItemsMenu, Menu } from '~/types/interfaces'
-import BaseMenu from '~/use/layout/Menus/baseMenu'
+import BaseMenu from '~/composables/layout/Menus/baseMenu'
 
 /**
- * @category Use/layout/Menus
+ * @category composables/layout/Menus
  * @class Admin2iosMenu
  * Classe pour la construction du Menu Admin 2IOS
  */

+ 2 - 2
use/layout/Menus/agendaMenu.ts → composables/layout/Menus/agendaMenu.ts

@@ -1,10 +1,10 @@
 import { NuxtConfig } from '@nuxt/types/config'
 import { Ability } from '@casl/ability'
 import { ItemMenu, ItemsMenu, Menu } from '~/types/interfaces'
-import BaseMenu from '~/use/layout/Menus/baseMenu'
+import BaseMenu from '~/composables/layout/Menus/baseMenu'
 
 /**
- * @category Use/layout/Menus
+ * @category composables/layout/Menus
  * @class AgendaMenu
  * Classe pour la construction du Menu agenda
  */

+ 1 - 1
use/layout/Menus/baseMenu.ts → composables/layout/Menus/baseMenu.ts

@@ -2,7 +2,7 @@ import { NuxtConfig } from '@nuxt/types/config'
 import { ItemMenu } from '~/types/interfaces'
 
 /**
- * @category Use/layout/Menus
+ * @category composables/layout/Menus
  * @class BaseMenu
  * Classe abstraite pour chacun des menu
  */

+ 2 - 2
use/layout/Menus/billingMenu.ts → composables/layout/Menus/billingMenu.ts

@@ -1,10 +1,10 @@
 import { NuxtConfig } from '@nuxt/types/config'
 import { Ability } from '@casl/ability'
 import { ItemMenu, ItemsMenu, Menu } from '~/types/interfaces'
-import BaseMenu from '~/use/layout/Menus/baseMenu'
+import BaseMenu from '~/composables/layout/Menus/baseMenu'
 
 /**
- * @category Use/layout/Menus
+ * @category composables/layout/Menus
  * @class BillingMenu
  * Classe pour la construction du Menu Facturation
  */

+ 2 - 2
use/layout/Menus/communicationMenu.ts → composables/layout/Menus/communicationMenu.ts

@@ -1,10 +1,10 @@
 import { NuxtConfig } from '@nuxt/types/config'
 import { Ability } from '@casl/ability'
 import { ItemMenu, ItemsMenu, Menu } from '~/types/interfaces'
-import BaseMenu from '~/use/layout/Menus/baseMenu'
+import BaseMenu from '~/composables/layout/Menus/baseMenu'
 
 /**
- * @category Use/layout/Menus
+ * @category composables/layout/Menus
  * @class CommunicationMenu
  * Classe pour la construction du Menu Communication
  */

+ 2 - 2
use/layout/Menus/configurationMenu.ts → composables/layout/Menus/configurationMenu.ts

@@ -1,10 +1,10 @@
 import { Ability } from '@casl/ability'
 import { NuxtConfig } from '@nuxt/types/config'
 import { AnyStore, ItemMenu, ItemsMenu, Menu } from '~/types/interfaces'
-import BaseMenu from '~/use/layout/Menus/baseMenu'
+import BaseMenu from '~/composables/layout/Menus/baseMenu'
 
 /**
- * @category Use/layout/Menus
+ * @category composables/layout/Menus
  * @class ConfigurationMenu
  * Classe pour la construction du Menu Paramètres
  */

+ 3 - 3
use/layout/Menus/cotisationsMenu.ts → composables/layout/Menus/cotisationsMenu.ts

@@ -1,10 +1,10 @@
 import { NuxtConfig } from '@nuxt/types/config'
 import { Ability } from '@casl/ability'
-import { AnyStore, ItemMenu, ItemsMenu, Menu } from '~/types/interfaces'
-import BaseMenu from '~/use/layout/Menus/baseMenu'
+import { ItemMenu, ItemsMenu, Menu } from '~/types/interfaces'
+import BaseMenu from '~/composables/layout/Menus/baseMenu'
 
 /**
- * @category Use/layout/Menus
+ * @category composables/layout/Menus
  * @class CotisationsMenu
  * Classe pour la construction du Menu Cotisation (CMF)
  */

+ 2 - 2
use/layout/Menus/donorsMenu.ts → composables/layout/Menus/donorsMenu.ts

@@ -1,10 +1,10 @@
 import { Ability } from '@casl/ability'
 import { NuxtConfig } from '@nuxt/types/config'
 import { ItemMenu, Menu } from '~/types/interfaces'
-import BaseMenu from '~/use/layout/Menus/baseMenu'
+import BaseMenu from '~/composables/layout/Menus/baseMenu'
 
 /**
- * @category Use/layout/Menus
+ * @category composables/layout/Menus
  * @class DonorsMenu
  * Classe pour la construction du Menu Donneurs
  */

+ 2 - 2
use/layout/Menus/educationalMenu.ts → composables/layout/Menus/educationalMenu.ts

@@ -1,10 +1,10 @@
 import { Ability } from '@casl/ability'
 import { NuxtConfig } from '@nuxt/types/config'
 import { ItemMenu, ItemsMenu, Menu } from '~/types/interfaces'
-import BaseMenu from '~/use/layout/Menus/baseMenu'
+import BaseMenu from '~/composables/layout/Menus/baseMenu'
 
 /**
- * @category Use/layout/Menus
+ * @category composables/layout/Menus
  * @class EducationalMenu
  * Classe pour la construction du Menu Suivi pédagogique
  */

+ 2 - 2
use/layout/Menus/equipmentMenu.ts → composables/layout/Menus/equipmentMenu.ts

@@ -1,10 +1,10 @@
 import { Ability } from '@casl/ability'
 import { NuxtConfig } from '@nuxt/types/config'
 import { ItemMenu, Menu } from '~/types/interfaces'
-import BaseMenu from '~/use/layout/Menus/baseMenu'
+import BaseMenu from '~/composables/layout/Menus/baseMenu'
 
 /**
- * @category Use/layout/Menus
+ * @category composables/layout/Menus
  * @class EquipmentMenu
  * Classe pour la construction du Menu Matériel
  */

+ 2 - 2
use/layout/Menus/medalsMenu.ts → composables/layout/Menus/medalsMenu.ts

@@ -1,10 +1,10 @@
 import { NuxtConfig } from '@nuxt/types/config'
 import { Ability } from '@casl/ability'
 import { ItemMenu, Menu } from '~/types/interfaces'
-import BaseMenu from '~/use/layout/Menus/baseMenu'
+import BaseMenu from '~/composables/layout/Menus/baseMenu'
 
 /**
- * @category Use/layout/Menus
+ * @category composables/layout/Menus
  * @class MedalsMenu
  * Classe pour la construction du Menu Médailles
  */

+ 2 - 2
use/layout/Menus/myAccessesMenu.ts → composables/layout/Menus/myAccessesMenu.ts

@@ -1,11 +1,11 @@
 import { Ability } from '@casl/ability'
 import { NuxtConfig } from '@nuxt/types/config'
 import * as _ from 'lodash'
-import BaseMenu from '~/use/layout/Menus/baseMenu'
+import BaseMenu from '~/composables/layout/Menus/baseMenu'
 import { AnyStore, ItemMenu, ItemsMenu, Menu } from '~/types/interfaces'
 
 /**
- * @category Use/layout/Menus
+ * @category composables/layout/Menus
  * @class MyAccessesMenu
  * Classe pour la construction du Menu Mon profile
  */

+ 2 - 2
use/layout/Menus/myFamilyMenu.ts → composables/layout/Menus/myFamilyMenu.ts

@@ -1,11 +1,11 @@
 import { Ability } from '@casl/ability'
 import { NuxtConfig } from '@nuxt/types/config'
 import * as _ from 'lodash'
-import BaseMenu from '~/use/layout/Menus/baseMenu'
+import BaseMenu from '~/composables/layout/Menus/baseMenu'
 import { AnyStore, ItemMenu, ItemsMenu, Menu } from '~/types/interfaces'
 
 /**
- * @category Use/layout/Menus
+ * @category composables/layout/Menus
  * @class MyFamilyMenu
  * Classe pour la construction du Menu Famille
  */

+ 2 - 2
use/layout/Menus/statsMenu.ts → composables/layout/Menus/statsMenu.ts

@@ -1,10 +1,10 @@
 import { NuxtConfig } from '@nuxt/types/config'
 import { Ability } from '@casl/ability'
 import { ItemMenu, ItemsMenu, Menu } from '~/types/interfaces'
-import BaseMenu from '~/use/layout/Menus/baseMenu'
+import BaseMenu from '~/composables/layout/Menus/baseMenu'
 
 /**
- * @category Use/layout/Menus
+ * @category composables/layout/Menus
  * @class StatsMenu
  * Classe pour la construction du Menu Statistiques
  */

+ 2 - 2
use/layout/Menus/websiteMenu.ts → composables/layout/Menus/websiteMenu.ts

@@ -1,11 +1,11 @@
 import * as _ from 'lodash'
 import { Ability } from '@casl/ability'
 import { NuxtConfig } from '@nuxt/types/config'
-import BaseMenu from '~/use/layout/Menus/baseMenu'
+import BaseMenu from '~/composables/layout/Menus/baseMenu'
 import { AnyStore, ItemMenu, ItemsMenu, Menu, organizationState } from '~/types/interfaces'
 
 /**
- * @category Use/layout/Menus
+ * @category composables/layout/Menus
  * @class WebsiteMenu
  * Classe pour la construction du Menu Sites internet
  */

+ 17 - 17
use/layout/menu.ts → composables/layout/menu.ts

@@ -1,25 +1,25 @@
 import { ref, useContext, Ref } from '@nuxtjs/composition-api'
 import { Ability } from '@casl/ability'
 import { ItemMenu, ItemsMenu, OrganizationStore } from '~/types/interfaces'
-import { getAccessMenu } from '~/use/layout/Menus/accessMenu'
-import { getAgendaMenu } from '~/use/layout/Menus/agendaMenu'
-import { getEquipmentMenu } from '~/use/layout/Menus/equipmentMenu'
-import { getEducationalMenu } from '~/use/layout/Menus/educationalMenu'
-import { getBillingMenu } from '~/use/layout/Menus/billingMenu'
-import { getCommunicationMenu } from '~/use/layout/Menus/communicationMenu'
-import { getDonorsMenu } from '~/use/layout/Menus/donorsMenu'
-import { getMedalsMenu } from '~/use/layout/Menus/medalsMenu'
-import { getStatsMenu } from '~/use/layout/Menus/statsMenu'
-import { getCotisationsMenu } from '~/use/layout/Menus/cotisationsMenu'
-import { getAdmin2iosMenu } from '~/use/layout/Menus/admin2iosMenu'
-import { getWebsiteMenu } from '~/use/layout/Menus/websiteMenu'
-import { getConfigurationMenu } from '~/use/layout/Menus/configurationMenu'
-import { getMyFamilyMenu } from '~/use/layout/Menus/myFamilyMenu'
-import { getMyAccessesMenu } from '~/use/layout/Menus/myAccessesMenu'
-import { getAccountMenu } from '~/use/layout/Menus/accountMenu'
+import { getAccessMenu } from '~/composables/layout/Menus/accessMenu'
+import { getAgendaMenu } from '~/composables/layout/Menus/agendaMenu'
+import { getEquipmentMenu } from '~/composables/layout/Menus/equipmentMenu'
+import { getEducationalMenu } from '~/composables/layout/Menus/educationalMenu'
+import { getBillingMenu } from '~/composables/layout/Menus/billingMenu'
+import { getCommunicationMenu } from '~/composables/layout/Menus/communicationMenu'
+import { getDonorsMenu } from '~/composables/layout/Menus/donorsMenu'
+import { getMedalsMenu } from '~/composables/layout/Menus/medalsMenu'
+import { getStatsMenu } from '~/composables/layout/Menus/statsMenu'
+import { getCotisationsMenu } from '~/composables/layout/Menus/cotisationsMenu'
+import { getAdmin2iosMenu } from '~/composables/layout/Menus/admin2iosMenu'
+import { getWebsiteMenu } from '~/composables/layout/Menus/websiteMenu'
+import { getConfigurationMenu } from '~/composables/layout/Menus/configurationMenu'
+import { getMyFamilyMenu } from '~/composables/layout/Menus/myFamilyMenu'
+import { getMyAccessesMenu } from '~/composables/layout/Menus/myAccessesMenu'
+import { getAccountMenu } from '~/composables/layout/Menus/accountMenu'
 
 /**
- * @category Use/layout
+ * @category composables/layout
  * @class Menu
  * Use Classe pour la construction du Menu
  */

+ 1 - 1
jest.config.js

@@ -23,7 +23,7 @@ module.exports = {
     '<rootDir>/components/**/*.vue',
     '<rootDir>/middleware/**/*.ts',
     '<rootDir>/services/**/*.ts',
-    '<rootDir>/use/**/*.ts',
+    '<rootDir>/composables/**/*.ts',
     '<rootDir>/pages/**/*.vue'
   ],
   setupFiles: ['<rootDir>/tests/unit/index.ts']

+ 1 - 1
layouts/default.vue

@@ -24,7 +24,7 @@
 
 <script lang="ts">
 import { computed, ComputedRef, defineComponent, reactive, useContext } from '@nuxtjs/composition-api'
-import { $useMenu } from '@/use/layout/menu'
+import { $useMenu } from '@/composables/layout/menu'
 
 export default defineComponent({
   name: 'DefaultLayout',

+ 2 - 2
models/Access/PersonalizedList.ts

@@ -6,10 +6,10 @@ export class PersonalizedList extends Model {
   @Uid()
   id!: number | string | null
 
-  @Str('')
+  @Str(null, { nullable: true })
   label!:string|null
 
-  @Str('')
+  @Str(null, { nullable: true })
   entity!:string|null
 
   @Str('')

+ 13 - 13
models/Core/AddressPostal.ts

@@ -13,25 +13,25 @@ export class AddressPostal extends Model {
   organizationAddressPostalId!: number | null
 
   @Str(null, { nullable: true })
-  addressCountry!: string
+  addressCountry!: string|null
 
-  @Str('', { nullable: true })
-  addressCity!: string
+  @Str(null, { nullable: true })
+  addressCity!: string|null
 
-  @Str('', { nullable: true })
-  addressOwner!: string
+  @Str(null, { nullable: true })
+  addressOwner!: string|null
 
-  @Str('', { nullable: true })
-  postalCode!: string
+  @Str(null, { nullable: true })
+  postalCode!: string|null
 
-  @Str('', { nullable: true })
-  streetAddress!: string
+  @Str(null, { nullable: true })
+  streetAddress!: string|null
 
-  @Str('', { nullable: true })
-  streetAddressSecond!: string
+  @Str(null, { nullable: true })
+  streetAddressSecond!: string|null
 
-  @Str('', { nullable: true })
-  streetAddressThird!: string
+  @Str(null, { nullable: true })
+  streetAddressThird!: string|null
 
   @Num(0, { nullable: true })
   latitude!: number

+ 7 - 7
models/Core/BankAccount.ts

@@ -7,25 +7,25 @@ export class BankAccount extends Model {
   id!: number | string | null
 
   @Str(null, { nullable: true })
-  bankName!: string
+  bankName!: string|null
 
   @Str(null, { nullable: true })
-  bic!: string
+  bic!: string|null
 
   @Str(null, { nullable: true })
-  bicInvalid!: string
+  bicInvalid!: string|null
 
   @Str(null, { nullable: true })
-  iban!: string
+  iban!: string|null
 
   @Str(null, { nullable: true })
-  ibanInvalid!: string
+  ibanInvalid!: string|null
 
   @Str(null, { nullable: true })
-  debitAddress!: string
+  debitAddress!: string|null
 
   @Str(null, { nullable: true })
-  holder!: string
+  holder!: string|null
 
   @Bool(false, { nullable: false })
   principal!: boolean

+ 8 - 8
models/Core/ContactPoint.ts

@@ -10,28 +10,28 @@ export class ContactPoint extends Model {
   contactType!: string
 
   @Str(null, { nullable: true })
-  email!: string
+  email!: string|null
 
   @Str(null, { nullable: true })
-  emailInvalid!: string
+  emailInvalid!: string|null
 
   @Str(null, { nullable: true })
-  telphone!: string
+  telphone!: string|null
 
   @Str(null, { nullable: true })
-  telphoneInvalid!: string
+  telphoneInvalid!: string|null
 
   @Str(null, { nullable: true })
-  mobilPhone!: string
+  mobilPhone!: string|null
 
   @Str(null, { nullable: true })
-  mobilPhoneInvalid!: string
+  mobilPhoneInvalid!: string|null
 
   @Str(null, { nullable: true })
-  faxNumber!: string
+  faxNumber!: string|null
 
   @Str(null, { nullable: true })
-  faxNumberInvalid!: string
+  faxNumberInvalid!: string|null
 
   @Attr([])
   organization!: []

+ 5 - 5
models/Core/Notification.ts

@@ -7,17 +7,17 @@ export class Notification extends Model {
   @Uid()
   id!: number | string | null
 
-  @Str('', { nullable: true })
+  @Str('')
   name!: string
 
   @HasOne(() => NotificationMessage, 'id')
   message!: NotificationMessage | null
 
-  @Str('', { nullable: true })
-  type!: string
+  @Str(null, { nullable: true })
+  type!: string|null
 
-  @Str('', { nullable: true })
-  link!: string
+  @Str(null, { nullable: true })
+  link!: string|null
 
   @Attr({})
   notificationUsers!: Array<string>

+ 6 - 6
models/Core/NotificationMessage.ts

@@ -6,12 +6,12 @@ export class NotificationMessage extends Model {
   @Uid()
   id!: number | string | null
 
-  @Str('', { nullable: true })
-  about!: string
+  @Str(null, { nullable: true })
+  about!: string|null
 
-  @Str('', { nullable: true })
-  action!: string
+  @Str(null, { nullable: true })
+  action!: string|null
 
-  @Str('', { nullable: true })
-  fileName!: string
+  @Str(null, { nullable: true })
+  fileName!: string|null
 }

+ 4 - 4
models/Core/NotificationUsers.ts

@@ -6,11 +6,11 @@ export class NotificationUsers extends Model {
   @Uid()
   id!: number | string | null
 
-  @Str('', { nullable: true })
-  notification!: string
+  @Str(null, { nullable: true })
+  notification!: string|null
 
-  @Str('', { nullable: true })
-  access!: string
+  @Str(null, { nullable: true })
+  access!: string|null
 
   @Bool(false, { nullable: false })
   isRead!: boolean

+ 64 - 64
models/Organization/Organization.ts

@@ -9,104 +9,104 @@ export class Organization extends Model {
   @Attr({})
   originalState!: object | null
 
-  @Str('', { nullable: true })
-  name!: string
+  @Str(null, { nullable: true })
+  name!: string|null
 
-  @Str('', { nullable: true })
-  acronym!: string
+  @Str(null, { nullable: true })
+  acronym!: string|null
 
-  @Str('', { nullable: true })
-  siretNumber!: string
+  @Str(null, { nullable: true })
+  siretNumber!: string|null
 
-  @Str('', { nullable: true })
-  apeNumber!: string
+  @Str(null, { nullable: true })
+  apeNumber!: string|null
 
-  @Str('', { nullable: true })
-  waldecNumber!: string
+  @Str(null, { nullable: true })
+  waldecNumber!: string|null
 
-  @Str('', { nullable: true })
-  identifier!: string
+  @Str(null, { nullable: true })
+  identifier!: string|null
 
-  @Str('', { nullable: true })
-  ffecApproval!: string
+  @Str(null, { nullable: true })
+  ffecApproval!: string|null
 
-  @Str('', { nullable: true })
-  description!: string
+  @Str(null, { nullable: true })
+  description!: string|null
 
   @Attr([])
   typeOfPractices!: []
 
-  @Str('', { nullable: true })
-  otherPractice!: string
+  @Str(null, { nullable: true })
+  otherPractice!: string|null
 
-  @Str('', { nullable: true })
-  legalStatus!: string
+  @Str(null, { nullable: true })
+  legalStatus!: string|null
 
-  @Str('', { nullable: true })
-  principalType!: string
+  @Str(null, { nullable: true })
+  principalType!: string|null
 
-  @Str('', { nullable: true })
-  youngApproval!: string
+  @Str(null, { nullable: true })
+  youngApproval!: string|null
 
-  @Str('', { nullable: true })
-  trainingApproval!: string
+  @Str(null, { nullable: true })
+  trainingApproval!: string|null
 
-  @Str('', { nullable: true })
-  otherApproval!: string
+  @Str(null, { nullable: true })
+  otherApproval!: string|null
 
-  @Str('', { nullable: true })
-  collectiveAgreement!: string
+  @Str(null, { nullable: true })
+  collectiveAgreement!: string|null
 
-  @Str('', { nullable: true })
-  opca!: string
+  @Str(null, { nullable: true })
+  opca!: string|null
 
-  @Str('', { nullable: true })
-  icomNumber!: string
+  @Str(null, { nullable: true })
+  icomNumber!: string|null
 
-  @Str('', { nullable: true })
-  urssafNumber!: string
+  @Str(null, { nullable: true })
+  urssafNumber!: string|null
 
-  @Str('', { nullable: true })
-  twitter!: string
+  @Str(null, { nullable: true })
+  twitter!: string|null
 
-  @Str('', { nullable: true })
-  youtube!: string
+  @Str(null, { nullable: true })
+  youtube!: string|null
 
-  @Str('', { nullable: true })
-  facebook!: string
+  @Str(null, { nullable: true })
+  facebook!: string|null
 
-  @Str('', { nullable: true })
-  instagram!: string
+  @Str(null, { nullable: true })
+  instagram!: string|null
 
   @Bool(true, { nullable: false })
   portailVisibility!: boolean
 
-  @Str('', { nullable: true })
-  image!: string
+  @Str(null, { nullable: true })
+  image!: string|null
 
-  @Str('', { nullable: true })
-  creationDate!: string
+  @Str(null, { nullable: true })
+  creationDate!: string|null
 
-  @Str('', { nullable: true })
-  prefectureName!: string
+  @Str(null, { nullable: true })
+  prefectureName!: string|null
 
-  @Str('', { nullable: true })
-  prefectureNumber!: string
+  @Str(null, { nullable: true })
+  prefectureNumber!: string|null
 
-  @Str('', { nullable: true })
-  declarationDate!: string
+  @Str(null, { nullable: true })
+  declarationDate!: string|null
 
-  @Str('', { nullable: true })
-  tvaNumber!: string
+  @Str(null, { nullable: true })
+  tvaNumber!: string|null
 
-  @Str('', { nullable: true })
-  schoolCategory!: string
+  @Str(null, { nullable: true })
+  schoolCategory!: string|null
 
-  @Str('', { nullable: true })
-  typeEstablishment!: string
+  @Str(null, { nullable: true })
+  typeEstablishment!: string|null
 
-  @Str('', { nullable: true })
-  typeEstablishmentDetail!: string
+  @Str(null, { nullable: true })
+  typeEstablishmentDetail!: string|null
 
   @Bool(false, { nullable: false })
   isPerformanceContractor!: boolean
@@ -120,6 +120,6 @@ export class Organization extends Model {
   @Num(0, { nullable: true })
   pedagogicBudget!: number
 
-  @Str('', { nullable: true })
-  logo!: string
+  @Str(null, { nullable: true })
+  logo!: string|null
 }

+ 6 - 6
models/Organization/OrganizationLicence.ts

@@ -9,12 +9,12 @@ export class OrganizationLicence extends Model {
   @Str('', { nullable: false })
   licensee!: string
 
-  @Str('', { nullable: true })
-  licenceNumber!: string
+  @Str(null, { nullable: true })
+  licenceNumber!: string|null
 
-  @Str('', { nullable: true })
-  categorie!: string
+  @Str(null, { nullable: true })
+  categorie!: string|null
 
-  @Str('', { nullable: true })
-  validityDate!: string
+  @Str(null, { nullable: true })
+  validityDate!: string|null
 }

+ 6 - 6
models/Organization/OrganizationNetwork.ts

@@ -9,12 +9,12 @@ export class OrganizationLicence extends Model {
   @Str('', { nullable: false })
   licensee!: string
 
-  @Str('', { nullable: true })
-  licenceNumber!: string
+  @Str(null, { nullable: true })
+  licenceNumber!: string|null
 
-  @Str('', { nullable: true })
-  categorie!: string
+  @Str(null, { nullable: true })
+  categorie!: string|null
 
-  @Str('', { nullable: true })
-  validityDate!: string
+  @Str(null, { nullable: true })
+  validityDate!: string|null
 }

+ 1 - 1
pages/organization/address/_id.vue

@@ -12,7 +12,7 @@
 <script lang="ts">
 import { defineComponent } from '@nuxtjs/composition-api'
 import { OrganizationAddressPostal } from '~/models/Organization/OrganizationAddressPostal'
-import {UseDataUtils} from "~/use/data/useDataUtils";
+import {UseDataUtils} from "~/composables/data/useDataUtils";
 
 export default defineComponent({
   name: 'EditOrganizationAddressEdit',

+ 1 - 1
pages/organization/address/new.vue

@@ -13,7 +13,7 @@
 import {defineComponent} from '@nuxtjs/composition-api'
 import { OrganizationAddressPostal } from '~/models/Organization/OrganizationAddressPostal'
 import {AddressPostal} from "~/models/Core/AddressPostal";
-import {UseDataUtils} from "~/use/data/useDataUtils";
+import {UseDataUtils} from "~/composables/data/useDataUtils";
 
 export default defineComponent({
   name: 'NewOrganizationAddress',

+ 1 - 1
pages/organization/bank_account/_id.vue

@@ -12,7 +12,7 @@
 
 <script lang="ts">
 import { defineComponent } from '@nuxtjs/composition-api'
-import {UseDataUtils} from "~/use/data/useDataUtils";
+import {UseDataUtils} from "~/composables/data/useDataUtils";
 import {BankAccount} from "~/models/Core/BankAccount";
 
 export default defineComponent({

+ 1 - 1
pages/organization/bank_account/new.vue

@@ -11,7 +11,7 @@
 
 <script lang="ts">
 import {defineComponent, useContext} from '@nuxtjs/composition-api'
-import {UseDataUtils} from "~/use/data/useDataUtils";
+import {UseDataUtils} from "~/composables/data/useDataUtils";
 import {BankAccount} from "~/models/Core/BankAccount";
 
 export default defineComponent({

+ 1 - 1
pages/organization/contact_points/_id.vue

@@ -13,7 +13,7 @@
 <script lang="ts">
 import { defineComponent } from '@nuxtjs/composition-api'
 import { ContactPoint } from '~/models/Core/ContactPoint'
-import {UseDataUtils} from "~/use/data/useDataUtils";
+import {UseDataUtils} from "~/composables/data/useDataUtils";
 
 export default defineComponent({
   name: 'EditContactPoint',

+ 1 - 1
pages/organization/contact_points/new.vue

@@ -12,7 +12,7 @@
 <script lang="ts">
 import {defineComponent, useContext} from '@nuxtjs/composition-api'
 import {ContactPoint} from "~/models/Core/ContactPoint";
-import {UseDataUtils} from "~/use/data/useDataUtils";
+import {UseDataUtils} from "~/composables/data/useDataUtils";
 
 export default defineComponent({
   name: 'NewContactPoint',

+ 3 - 3
pages/organization/index.vue

@@ -436,11 +436,11 @@ import { OrganizationAddressPostal } from '~/models/Organization/OrganizationAdd
 import { ContactPoint } from '~/models/Core/ContactPoint'
 import { BankAccount } from '~/models/Core/BankAccount'
 import { repositoryHelper } from '~/services/store/repository'
-import UseValidator from '~/use/form/useValidator'
-import { UseNavigationHelpers } from '~/use/form/useNavigationHelpers'
+import UseValidator from '~/composables/form/useValidator'
+import { UseNavigationHelpers } from '~/composables/form/useNavigationHelpers'
 import I18N from '~/services/utils/i18n'
 import {Country} from "~/models/Core/Country";
-import {UseTypeOfPractice} from "~/use/data/useTypeOfPractice";
+import {UseTypeOfPractice} from "~/composables/data/useTypeOfPractice";
 import ModelsUtils from "~/services/utils/modelsUtils";
 import {NetworkOrganization} from "~/models/Network/NetworkOrganization";
 import {OrganizationArticle} from "~/models/Organization/OrganizationArticle";

+ 1 - 1
pages/subscription.vue

@@ -6,7 +6,7 @@ Page 'Mon abonnement'
 <template>
   <LayoutContainer>
     <v-col cols="12" sm="12" md="12">
-      <h3 class="margin-bottom-20">{{ $t('my_subscription') }}</h3>
+      <h3 class="mb-5">{{ $t('my_subscription') }}</h3>
 
       <v-expansion-panels focusable multiple :value="[0,1]">
         <UiExpansionPanel id="informations" icon="fa-info">

+ 11 - 13
services/profile/accessProfile.ts

@@ -7,19 +7,17 @@ import {Store} from "vuex";
  * être nécessaires pour l'affichage de chacune des pages de l'application
  * (ex: rôles, habilités, ...etc)
  */
-class AccessProfile {
-  private accessProfile: accessState
+export class AccessProfile {
+  private accessProfile!: accessState
 
   private $ability:Ability = {} as Ability
-  private store:Store<any>
+  private store!:Store<any>
 
   /**
-   * @constructor
-   *
-   * @param {AccessStore} store State Access du Store contenant les informations de l'utilisateur
-   * @param {Ability} ability Plugin $ability
+   * Set le store
+   * @param {Store<AccessStore>} store
    */
-  constructor (store: AccessStore) {
+  public setStore (store: AccessStore) {
     this.accessProfile = store.state.profile.access
     this.store = store
   }
@@ -28,7 +26,7 @@ class AccessProfile {
    * Permet de setter le service d'abilités
    * @param ability
    */
-  setAbility(ability: Ability){
+  public setAbility(ability: Ability){
     this.$ability = ability
   }
 
@@ -38,7 +36,7 @@ class AccessProfile {
    * @param {Array<string>} roles Rôles à tester
    * @return {boolean}
    */
-  hasRole (roles: Array<string>): boolean {
+  hasRole (roles: Array<string>|null): boolean {
     if (roles === null) {
       return true
     }
@@ -57,7 +55,7 @@ class AccessProfile {
    * @param {Array<AbilitiesType>} abilities abilités à tester
    * @return {boolean}
    */
-  hasAbility(abilities:Array<AbilitiesType>): boolean{
+  hasAbility(abilities:Array<AbilitiesType>|null): boolean{
     if(abilities === null)
       return true;
 
@@ -74,7 +72,7 @@ class AccessProfile {
    * @param {Array<string>} profiles : profiles à tester
    * @return {boolean}
    */
-  hasProfile(profiles: Array<string>): boolean{
+  hasProfile(profiles: Array<string>|null): boolean{
     if (null === profiles)
       return true;
 
@@ -142,4 +140,4 @@ class AccessProfile {
   }
 }
 
-export const $accessProfile = (store:AccessStore) => new AccessProfile(store)
+export const $accessProfile = new AccessProfile()

+ 5 - 4
services/rights/abilitiesUtils.ts

@@ -37,16 +37,18 @@ class AbilitiesUtils {
    */
   initFactory () {
     this.factory = {
-      access: $accessProfile(this.$store),
+      access: $accessProfile,
       organization: $organizationProfile(this.$store)
     }
+    this.setAbilitiesAndStore()
   }
 
   /**
    * Initialise les Abilities pour le service AccessProfile
    */
-  initAbilities(){
-    this.factory.access.setAbility(this.$ability)
+  setAbilitiesAndStore(){
+    this.factory.access.setAbility(this.$ability, this.$store)
+    this.factory.access.setStore(this.$store)
   }
 
   /**
@@ -85,7 +87,6 @@ class AbilitiesUtils {
     const abilitiesByRoles: Array<AbilitiesType> = this.getAbilitiesByRoles(this.$store.state.profile.access.roles)
     this.$ability.update(abilitiesByRoles)
     this.initFactory()
-    this.initAbilities()
     return abilitiesByRoles.concat(this.getAbilitiesByConfig('./config/abilities/config.yaml'))
   }
 

+ 2 - 2
services/store/page.ts

@@ -1,6 +1,6 @@
 import {Store} from "vuex";
 import {TYPE_ALERT} from "~/types/enums";
-import {Alerts} from "~/types/interfaces";
+import {Alert} from "~/types/interfaces";
 
 export default class Page {
   private store
@@ -15,7 +15,7 @@ export default class Page {
    * @param alerts
    */
   addAlerts(type: TYPE_ALERT, alerts: Array<string>){
-    const alert:Alerts = {
+    const alert:Alert = {
       type: type,
       messages: alerts
     }

+ 2 - 2
store/page.ts

@@ -1,11 +1,11 @@
-import { Alerts, pageState } from '~/types/interfaces'
+import { Alert, pageState } from '~/types/interfaces'
 
 export const state = () => ({
   alerts: []
 })
 
 export const mutations = {
-  setAlert (state: pageState, alert: Alerts) {
+  setAlert (state: pageState, alert: Alert) {
     state.alerts.push(alert)
   },
   removeAlert (state: pageState) {

+ 67 - 0
tests/unit/composables/data/useMyProfile.spec.ts

@@ -0,0 +1,67 @@
+import { createStore, initLocalVue, mountComposition } from '~/tests/unit/Helpers'
+import { accessProfile as accessModule } from '~/tests/unit/fixture/state/profile'
+import { AnyStore } from '~/types/interfaces'
+import { useMyProfile } from '~/composables/data/useMyProfile'
+import { repositoryHelper } from '~/services/store/repository'
+import {$accessProfile} from "~/services/profile/accessProfile";
+import {_exportedForTesting} from "~/composables/data/useMyProfile"
+let store:AnyStore
+let useMyProfileMount:any
+let repositoryHelperMock = repositoryHelper as jest.Mocked<typeof repositoryHelper>
+
+beforeAll(() => {
+  store = createStore()
+  store.registerModule('profile', {})
+  store.registerModule(['profile', 'access'], accessModule)
+  repositoryHelper.setStore(store)
+  initLocalVue({store: store})
+
+  const $accessProfileMock = $accessProfile as jest.Mocked<typeof $accessProfile>
+  $accessProfileMock.getCurrentAccessId = jest.fn().mockReturnValue(1)
+  repositoryHelperMock.findItemFromModel = jest.fn()
+
+  const component = mountComposition(() => {
+    useMyProfileMount = useMyProfile()
+  });
+})
+
+describe('setActivityYear()', () => {
+  it('should throw an error if year is negative nor eq to 0', () => {
+   expect(() => useMyProfileMount.setActivityYear(-1)).toThrow()
+  })
+  it('should call updateStoreFromField', () => {
+    repositoryHelperMock.updateStoreFromField = jest.fn()
+    useMyProfileMount.setActivityYear(2020)
+    expect(repositoryHelperMock).toHaveBeenCalled
+  })
+})
+
+describe('setHistorical()', () => {
+  it('should call updateStoreFromField', () => {
+    repositoryHelperMock.updateStoreFromField = jest.fn()
+    useMyProfileMount.setHistorical(['present', 'future'])
+    expect(repositoryHelperMock).toHaveBeenCalled
+  })
+})
+
+describe('getHistoricalEntry()', () => {
+  it('should return an json object', () => {
+    const historical = _exportedForTesting.getHistoricalEntry(['present', 'future'])
+    expect(historical).toStrictEqual({ past: false, present: true, future: true })
+  })
+})
+
+describe('getHistoricalRangeEntry()', () => {
+  it('should return an json object', () => {
+    const historical = _exportedForTesting.getHistoricalRangeEntry(['2020/01/01', '2020/01/31'])
+    expect(historical).toStrictEqual({ past: false, present: false, future: false, dateStart: '2020/01/01', dateEnd: '2020/01/31' })
+  })
+})
+
+describe('getMyProfileInstance()', () => {
+  it('should call findItemFromModel', () => {
+    repositoryHelperMock.findItemFromModel = jest.fn()
+    _exportedForTesting.getMyProfileInstance(1)
+    expect(repositoryHelperMock).toHaveBeenCalled
+  })
+})

+ 1 - 1
tests/unit/use/form/useForm.spec.ts → tests/unit/composables/form/useForm.spec.ts

@@ -1,6 +1,6 @@
 import {createStore, initLocalVue, mountComposition} from '~/tests/unit/Helpers'
 import { form } from '~/tests/unit/fixture/state/profile'
-import { $useForm, UseForm } from '~/use/form/useForm'
+import { $useForm, UseForm } from '~/composables/form/useForm'
 import { AnyStore } from '~/types/interfaces'
 
 let store: AnyStore

+ 1 - 1
tests/unit/use/form/useValidator.spec.ts → tests/unit/composables/form/useValidator.spec.ts

@@ -1,5 +1,5 @@
 import VueI18n from 'vue-i18n'
-import UseValidator from '~/use/form/useValidator'
+import UseValidator from '~/composables/form/useValidator'
 import DataProvider from '~/services/data/dataProvider'
 
 jest.mock('~/services/data/dataProvider')

+ 1 - 1
tests/unit/use/layout/menu.spec.ts → tests/unit/composables/layout/menu.spec.ts

@@ -1,4 +1,4 @@
-import BaseMenu from '~/use/layout/Menus/baseMenu'
+import BaseMenu from '~/composables/layout/Menus/baseMenu'
 
 describe('constructMenu()', () => {
   it('should construct a menu without children', () => {

+ 13 - 14
tests/unit/services/profile/accessProfile.spec.ts

@@ -5,37 +5,37 @@ import { $accessProfile } from '~/services/profile/accessProfile'
 import { ABILITIES } from '~/types/enums'
 import { accessProfile as accessModule } from '~/tests/unit/fixture/state/profile'
 
-let ability: Ability, store: AccessStore, accessProfile:any
+let ability: Ability, store: AccessStore
 
 beforeEach(() => {
   ability = new Ability()
   store = createStore()
   store.registerModule('profile', {})
   store.registerModule(['profile', 'access'], accessModule)
-  accessProfile = $accessProfile(store)
-  accessProfile.setAbility(ability)
+  $accessProfile.setAbility(ability)
+  $accessProfile.setStore(store)
 })
 
 describe('hasRole()', () => {
   it('should return true if there is no role', () => {
-    expect(accessProfile.hasRole(null)).toBeTruthy()
+    expect($accessProfile.hasRole(null)).toBeTruthy()
   })
 
   it('should return false if profile dont have the role', () => {
     const role_to_have = ['ROLE_EVENT']
-    expect(accessProfile.hasRole(role_to_have)).toBeFalsy()
+    expect($accessProfile.hasRole(role_to_have)).toBeFalsy()
   })
 
   it('should return true if profile have the role', () => {
     const role_to_have = ['ROLE_USERS']
     store.commit('access/setRoles', ['ROLE_USERS'])
-    expect(accessProfile.hasRole(role_to_have)).toBeTruthy()
+    expect($accessProfile.hasRole(role_to_have)).toBeTruthy()
   })
 })
 
 describe('hasAbility()', () => {
   it('should return true if there is no ability', () => {
-    expect(accessProfile.hasAbility(null)).toBeTruthy()
+    expect($accessProfile.hasAbility(null)).toBeTruthy()
   })
 
   it('should return false if profile dont have the ability', () => {
@@ -43,7 +43,7 @@ describe('hasAbility()', () => {
       action: ABILITIES.MANAGE,
       subject: 'bills'
     }]
-    expect(accessProfile.hasAbility(ability_to_have)).toBeFalsy()
+    expect($accessProfile.hasAbility(ability_to_have)).toBeFalsy()
   })
 
   it('should return true if profile dont have the ability', () => {
@@ -53,30 +53,29 @@ describe('hasAbility()', () => {
     }
     const ability_to_have:Array<AbilitiesType> = [manage_bills]
     ability.update([manage_bills])
-    expect(accessProfile.hasAbility(ability_to_have)).toBeTruthy()
+    expect($accessProfile.hasAbility(ability_to_have)).toBeTruthy()
   })
 })
 
 describe('hasProfile()', () => {
   it('should return true if there is no profile', () => {
-    expect(accessProfile.hasProfile(null)).toBeTruthy()
+    expect($accessProfile.hasProfile(null)).toBeTruthy()
   })
 
   it('should return false if user do not have the profile', () =>{
     const profile_to_have = ['admin']
-    expect(accessProfile.hasProfile(profile_to_have)).toBeFalsy()
+    expect($accessProfile.hasProfile(profile_to_have)).toBeFalsy()
   })
 
   it('should return true if user have the profile', () =>{
     const profile_to_have = ['admin']
     store.commit('access/setIsAdmin', true)
-    expect(accessProfile.hasProfile(profile_to_have)).toBeTruthy()
+    expect($accessProfile.hasProfile(profile_to_have)).toBeTruthy()
   })
 })
 
 describe('testProfile()', () => {
   it('should return false if profile do not exist', () => {
-    const profile_to_test = ['none']
-    expect(accessProfile.testProfile(profile_to_test)).toBeFalsy()
+    expect($accessProfile.testProfile('none')).toBeFalsy()
   })
 })

+ 1 - 2
tests/unit/services/rights/abilitiesUtils.spec.ts

@@ -23,7 +23,7 @@ describe('initFactory', () => {
     abilitiesUtils.initFactory()
   })
   it('should init the factory service and give access to AccessProfile service', () => {
-    expect(abilitiesUtils.getFactory().access).toStrictEqual($accessProfile(store))
+    expect(abilitiesUtils.getFactory().access).toStrictEqual($accessProfile)
   })
 
   it('should init the factory service and give access to OrganizationProfile service', () => {
@@ -165,7 +165,6 @@ describe('canHaveTheAbility()', () => {
 
   beforeEach(() => {
     abilitiesUtils.initFactory()
-    abilitiesUtils.initAbilities()
   })
 
   it('should return false when we dont have the ability', () => {

+ 0 - 60
tests/unit/use/updater/useMyProfileUpdater.spec.ts

@@ -1,60 +0,0 @@
-import { createStore, initLocalVue, mountComposition } from '~/tests/unit/Helpers'
-import { AnyStore } from '~/types/interfaces'
-import DataPersister from '~/services/data/dataPersister'
-import { UseMyProfileUpdater } from '~/use/updater/useMyProfileUpdater'
-import { repositoryHelper } from '~/services/store/repository'
-
-let store:AnyStore
-let dataPersister:DataPersister
-let useMyProfileUpdater:any
-
-beforeAll(() => {
-  store = createStore()
-  dataPersister = new DataPersister()
-  repositoryHelper.setStore(store)
-  initLocalVue({store: store})
-
-  const component = mountComposition(() => {
-    useMyProfileUpdater = new UseMyProfileUpdater() as any
-  });
-})
-
-describe('setActivityYear()', () => {
-  it('should throw an error if year is negative nor eq to 0', () => {
-    expect(() => useMyProfileUpdater.setActivityYear(-1)).toThrow()
-  })
-  it('should call updateStoreFromField', () => {
-    repositoryHelper.updateStoreFromField = jest.fn()
-    useMyProfileUpdater.setActivityYear(2020)
-    expect(repositoryHelper).toHaveBeenCalled
-  })
-})
-
-describe('setHistorical()', () => {
-  it('should call updateStoreFromField', () => {
-    repositoryHelper.updateStoreFromField = jest.fn()
-    useMyProfileUpdater.setHistorical(['present', 'future'])
-    expect(repositoryHelper).toHaveBeenCalled
-  })
-})
-
-describe('getHistoricalEntry()', () => {
-  it('should return an json object', () => {
-    const historical = useMyProfileUpdater.getHistoricalEntry(['present', 'future'])
-    expect(historical).toStrictEqual({ past: false, present: true, future: true })
-  })
-})
-
-describe('getHistoricalRangeEntry()', () => {
-  it('should return an json object', () => {
-    const historical = useMyProfileUpdater.getHistoricalRangeEntry(['2020/01/01', '2020/01/31'])
-    expect(historical).toStrictEqual({ past: false, present: false, future: false, dateStart: '2020/01/01', dateEnd: '2020/01/31' })
-  })
-})
-
-describe('getMyProfileInstance()', () => {
-  it('should call findItemFromModel', () => {
-    repositoryHelper.findItemFromModel = jest.fn()
-    expect(repositoryHelper).toHaveBeenCalled
-  })
-})

+ 2 - 2
types/interfaces.d.ts

@@ -63,13 +63,13 @@ interface formState {
   goAfterLeave: string
 }
 
-interface Alerts {
+interface Alert {
   type: TYPE_ALERT,
   messages: Array<string>
 }
 
 interface pageState {
-  alerts: Array<Alerts>,
+  alerts: Array<Alert>,
 }
 
 interface Historical {

+ 0 - 114
use/updater/useMyProfileUpdater.ts

@@ -1,114 +0,0 @@
-import {computed, ComputedRef} from '@nuxtjs/composition-api'
-import { Item, Model } from '@vuex-orm/core'
-import { repositoryHelper } from '~/services/store/repository'
-import { QUERY_TYPE } from '~/types/enums'
-import { AnyJson, AnyStore, Historical } from '~/types/interfaces'
-import DataPersister from '~/services/data/dataPersister'
-import { MyProfile } from '~/models/Access/MyProfile'
-import { $accessProfile } from '@/services/profile/accessProfile'
-import { useContext } from '@nuxtjs/composition-api'
-
-/**
- * @category Use/updater
- * @class UseMyProfileUpdater
- * Use Classe pour la gestion REST de MyProfile
- */
-export class UseMyProfileUpdater {
-  private store!:AnyStore
-  private $dataPersister!:DataPersister
-  private myProfile!:MyProfile
-
-  constructor () {
-    const {$dataPersister, store} = useContext()
-    this.store = store
-    this.$dataPersister = $dataPersister
-  }
-
-  /**
-   * Composition function
-   */
-  public invoke (): AnyJson {
-    const currentAccessId = $accessProfile(this.store).getCurrentAccessId()
-
-    this.myProfile = this.getMyProfileInstance(currentAccessId) as MyProfile
-    const activityYear:ComputedRef<number> = computed(() => this.myProfile.activityYear)
-    const historical:ComputedRef<Historical> = computed(() => this.myProfile.historical)
-
-    return {
-      updateMyProfile: () => this.updateMyProfile(),
-      setActivityYear: (activityYear:number) => this.setActivityYear(activityYear),
-      setHistorical: (historicalChoices:Array<string>) => this.setHistorical(historicalChoices),
-      setHistoricalRange: (dates:Array<string>) => this.setHistoricalRange(dates),
-      activityYear,
-      historical
-    }
-  }
-
-  /**
-   * récupère l'instance MyProfile
-   * @param myProfileId
-   */
-  private getMyProfileInstance (myProfileId:any): Item<Model> {
-    return repositoryHelper.findItemFromModel(MyProfile, parseInt(myProfileId))
-  }
-
-  /**
-   * Mets à jour l'activity de my profile
-   * @param activityYear
-   */
-  private setActivityYear (activityYear:number) {
-    if (activityYear <= 0) { throw new Error('year must be positive') }
-
-    repositoryHelper.updateStoreFromField(MyProfile, this.myProfile, activityYear, 'activityYear')
-  }
-
-  /**
-   * Mets à jour l'historical de my profile
-   * @param historicalChoices
-   */
-  private setHistorical (historicalChoices:Array<string>) {
-    repositoryHelper.updateStoreFromField(MyProfile, this.myProfile, this.getHistoricalEntry(historicalChoices), 'historical')
-  }
-
-  /**
-   * Mets à jour l'historical de my profile
-   * @param dates
-   */
-  private setHistoricalRange (dates:Array<string>) {
-    repositoryHelper.updateStoreFromField(MyProfile, this.myProfile, this.getHistoricalRangeEntry(dates), 'historical')
-  }
-
-  /**
-   * Transform les choix de l'historique en objet JSON reconnaissable coté API
-   * @param historicalChoices
-   */
-  private getHistoricalEntry (historicalChoices:Array<string>) {
-    const historicalDefault:any = { past: false, future: false, present: false }
-
-    for (const historicalChoice of historicalChoices) {
-      historicalDefault[historicalChoice] = true
-    }
-    return historicalDefault
-  }
-
-  /**
-   * Trasnforme le choix des période en Objet JSON reconnaissable coté API
-   * @param dates
-   */
-  private getHistoricalRangeEntry (dates:Array<string>) {
-    return { past: false, future: false, present: false, dateStart: dates[0], dateEnd: dates[1] }
-  }
-
-  /**
-   * Effectue la mise à jour (coté API) de MyProfile
-   */
-  private async updateMyProfile (): Promise<any> {
-    await this.$dataPersister.invoke({
-      type: QUERY_TYPE.MODEL,
-      model: MyProfile,
-      id: this.myProfile.id
-    })
-  }
-}
-
-export const $useMyProfileUpdater = () => new UseMyProfileUpdater().invoke()