Olivier Massot 6 месяцев назад
Родитель
Сommit
c3da69d5a7
75 измененных файлов с 175 добавлено и 179 удалено
  1. 1 2
      components/Layout/Alert/Container.vue
  2. 0 2
      components/Layout/Alert/Content.vue
  3. 0 1
      components/Layout/AlertBar.vue
  4. 47 42
      components/Layout/AlertBar/Cotisation.vue
  5. 1 1
      components/Layout/AlertBar/OnlineRegistration.vue
  6. 1 1
      components/Layout/AlertBar/SwitchYear.vue
  7. 2 1
      components/Layout/Dialog.vue
  8. 4 3
      components/Layout/Header/Menu.vue
  9. 1 1
      components/Layout/Header/Notification.vue
  10. 3 2
      components/Layout/Header/UniversalCreation/EventParams.vue
  11. 4 4
      components/Layout/MainMenu.vue
  12. 2 0
      components/Layout/Pages/Subscription/Card.vue
  13. 3 3
      components/Layout/Pages/Subscription/List.vue
  14. 1 1
      components/Layout/Parameters/EntityTable.vue
  15. 2 3
      components/Layout/Parameters/Menu.vue
  16. 3 3
      components/Layout/Parameters/Table.vue
  17. 1 1
      components/Layout/SubHeader/ActivityYear.vue
  18. 3 2
      components/Layout/SubHeader/DataTiming.vue
  19. 1 1
      components/Layout/SubHeader/DataTimingRange.vue
  20. 1 1
      components/Layout/SubHeader/PersonnalizedList.vue
  21. 1 1
      components/Layout/UpgradePremiumButton.vue
  22. 1 1
      components/Ui/Button/Delete.vue
  23. 1 1
      components/Ui/Button/Submit.vue
  24. 2 2
      components/Ui/DataTable.vue
  25. 2 1
      components/Ui/DatePicker.vue
  26. 4 4
      components/Ui/Form.vue
  27. 1 1
      components/Ui/Form/Creation.vue
  28. 1 1
      components/Ui/Form/Edition.vue
  29. 1 1
      components/Ui/Help.vue
  30. 2 2
      components/Ui/Input/AutocompleteWithAp2i.vue
  31. 3 4
      components/Ui/Input/Image.vue
  32. 3 2
      components/Ui/Input/Text.vue
  33. 2 2
      components/Ui/ItemFromUri.vue
  34. 1 1
      components/Ui/Template/DataTable.vue
  35. 1 1
      composables/data/useAp2iRequestService.ts
  36. 2 2
      composables/data/useEntityFetch.ts
  37. 1 1
      composables/utils/useDownloadFile.ts
  38. 3 8
      eslint.config.mjs
  39. 1 1
      layouts/error.vue
  40. 2 2
      models/Access/MyProfile.ts
  41. 1 1
      models/ApiResource.ts
  42. 1 1
      models/Core/Notification.ts
  43. 1 1
      models/decorators.ts
  44. 7 8
      nuxt.config.ts
  45. 1 1
      pages/parameters/attendance_booking_reasons/new.vue
  46. 1 1
      pages/parameters/education_timings/new.vue
  47. 1 1
      pages/parameters/subdomains/new.vue
  48. 1 1
      pages/parameters/teaching.vue
  49. 1 1
      pages/parameters/website.vue
  50. 10 10
      pages/subscription.vue
  51. 1 1
      services/data/Filters/EqualFilter.ts
  52. 1 1
      services/data/Filters/InArrayFilter.ts
  53. 1 1
      services/data/Filters/OrderBy.ts
  54. 1 1
      services/data/Filters/PageFilter.ts
  55. 1 1
      services/data/Filters/SearchFilter.ts
  56. 5 8
      services/data/entityManager.ts
  57. 1 1
      services/data/enumManager.ts
  58. 1 1
      services/data/imageManager.ts
  59. 2 2
      services/data/normalizer/hydraNormalizer.ts
  60. 0 1
      services/layout/menuBuilder/abstractMenuBuilder.ts
  61. 1 1
      services/layout/menuComposer.ts
  62. 1 1
      services/rights/abilityBuilder.ts
  63. 1 1
      services/sse/sseSource.ts
  64. 1 1
      services/validation/subdomainValidation.ts
  65. 1 1
      stores/page.ts
  66. 2 3
      tests/units/services/data/entityManager.test.ts
  67. 1 1
      tests/units/services/data/enumManager.test.ts
  68. 1 1
      tests/units/services/data/imageManager.test.ts
  69. 1 1
      tests/units/services/layout/menuBuilder/mainMenuBuilder.test.ts
  70. 2 2
      tests/units/services/sse/sseSource.test.ts
  71. 1 1
      tests/units/services/validation/subdomainValidation.test.ts
  72. 1 1
      types/data.d.ts
  73. 3 3
      types/interfaces.d.ts
  74. 2 2
      types/layout.d.ts
  75. 1 1
      types/types.d.ts

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

@@ -23,8 +23,7 @@ import { usePageStore } from '~/stores/page'
 
 const pageStore = usePageStore()
 
-// Using alerts in the template v-for directive
-// eslint-disable-next-line @typescript-eslint/no-unused-vars
+// Using alerts in the template's v-for directive
 const alerts = computed<Array<Alert>>(() => pageStore.alerts)
 </script>
 

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

@@ -66,7 +66,6 @@ const clearAlert = (time: number = 4000) => {
 /**
  * Réinitialise et suspend le délai avant le retrait de l'alerte au survol du curseur
  */
-// eslint-disable-next-line @typescript-eslint/no-unused-vars
 const onMouseOver = () => {
   clearTimeout(timeoutId)
 }
@@ -74,7 +73,6 @@ const onMouseOver = () => {
 /**
  * Relance le timer avant le retrait de l'alerte lorsque le curseur quitte l'alerte
  */
-// eslint-disable-next-line @typescript-eslint/no-unused-vars
 const onMouseOut = () => {
   clearAlert(props.timeout)
 }

+ 0 - 1
components/Layout/AlertBar.vue

@@ -53,7 +53,6 @@ Contient les différentes barres d'alertes qui s'affichent dans certains cas
 <script setup lang="ts">
 import { useAbility } from '@casl/vue'
 import { useDisplay } from 'vuetify'
-import { StencilPreview } from 'vue-advanced-cropper'
 import { useOrganizationProfileStore } from '~/stores/organizationProfile'
 
 const organizationProfile = useOrganizationProfileStore()

+ 47 - 42
components/Layout/AlertBar/Cotisation.vue

@@ -17,10 +17,9 @@ Barre d'alerte qui s'affiche pour donner l'état de la cotisation
 </template>
 
 <script setup lang="ts">
-import type { Ref } from 'vue'
 import { useOrganizationProfileStore } from '~/stores/organizationProfile'
 import UrlUtils from '~/services/utils/urlUtils'
-import { ALERT_STATE_COTISATION } from '~/types/enum/enums'
+import type { ALERT_STATE_COTISATION } from '~/types/enum/enums'
 import { useEntityFetch } from '~/composables/data/useEntityFetch'
 import Cotisation from '~/models/Organization/Cotisation'
 
@@ -29,7 +28,52 @@ const organizationProfile = useOrganizationProfileStore()
 const runtimeConfig = useRuntimeConfig()
 const baseLegacyUrl: string = runtimeConfig.baseUrlAdminLegacy
 
-const cotisationYear: Ref<number | null> = ref(null)
+// On récupère l'état des cotisations via l'API
+if (!organizationProfile.id) {
+  throw new Error('missing organization id')
+}
+
+const { fetch } = useEntityFetch()
+const { data: cotisation, pending } = await fetch(
+  Cotisation,
+  organizationProfile.id,
+)
+
+interface Alert {
+  text: string
+  callback: () => void
+}
+
+const cotisationYear: ComputedRef<number | null> = computed(() => {
+  if (pending.value || cotisation.value === null) {
+    return null
+  }
+
+  return cotisation.value.cotisationYear
+})
+
+const alert: ComputedRef<Alert | null> = computed(() => {
+  if (pending.value || cotisation.value === null) {
+    return null
+  }
+
+  const mapping: Record<ALERT_STATE_COTISATION, Alert> = {
+    AFFILIATION: { text: 'cotisation_access', callback: goToCotisation },
+    INVOICE: { text: 'upload_cotisation_invoice', callback: openInvoiceWindow },
+    INSURANCE: { text: 'renew_insurance_cmf', callback: goToInsurancePage },
+    ADVERTISINGINSURANCE: {
+      text: 'insurance_cmf_subscription',
+      callback: openCmfSubscriptionPage,
+    },
+  }
+
+  if (!cotisation.value.alertState) {
+    return null
+  }
+
+  return mapping[cotisation.value.alertState as ALERT_STATE_COTISATION]
+})
+
 
 /**
  * Redirige l'utilisateur vers la page des cotisations
@@ -79,45 +123,6 @@ const openCmfSubscriptionPage = () => {
   )
 }
 
-// On récupère l'état des cotisations via l'API
-if (!organizationProfile.id) {
-  throw new Error('missing organization id')
-}
-
-const { fetch } = useEntityFetch()
-const { data: cotisation, pending } = await fetch(
-  Cotisation,
-  organizationProfile.id,
-)
-
-interface Alert {
-  text: string
-  callback: () => void
-}
-
-const alert: ComputedRef<Alert | null> = computed(() => {
-  if (pending.value) {
-    return null
-  }
-
-  cotisationYear.value = cotisation.value.cotisationYear
-
-  const mapping: Record<ALERT_STATE_COTISATION, Alert> = {
-    AFFILIATION: { text: 'cotisation_access', callback: goToCotisation },
-    INVOICE: { text: 'upload_cotisation_invoice', callback: openInvoiceWindow },
-    INSURANCE: { text: 'renew_insurance_cmf', callback: goToInsurancePage },
-    ADVERTISINGINSURANCE: {
-      text: 'insurance_cmf_subscription',
-      callback: openCmfSubscriptionPage,
-    },
-  }
-
-  if (!cotisation.value.alertState) {
-    return null
-  }
-
-  return mapping[cotisation.value.alertState as ALERT_STATE_COTISATION]
-})
 </script>
 
 <style scoped lang="scss">

+ 1 - 1
components/Layout/AlertBar/OnlineRegistration.vue

@@ -13,7 +13,7 @@ Barre d'alerte sur l'ouverture ou non de l'inscription en ligne
 </template>
 
 <script setup lang="ts">
-import { ComputedRef } from 'vue'
+import type { ComputedRef } from 'vue'
 import { useEntityFetch } from '~/composables/data/useEntityFetch'
 import { useAccessProfileStore } from '~/stores/accessProfile'
 import RegistrationAvailability from '~/models/OnlineRegistration/RegistrationAvailability'

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

@@ -65,7 +65,7 @@ const resetYear = async () => {
 
   pageStore.loading = true
   await em.patch(Access, accessProfile.currentAccessId, defaultValues)
-  if (process.server) {
+  if (import.meta.server) {
     // Force profile refresh server side to avoid a bug where server and client stores diverge on profile refresh
     await refreshProfile()
   }

+ 2 - 1
components/Layout/Dialog.vue

@@ -48,6 +48,7 @@ const props = defineProps({
   contentClass: {
     type: String,
     required: false,
+    default: ''
   },
   theme: {
     type: String,
@@ -61,7 +62,7 @@ const props = defineProps({
   },
 })
 
-// @ts-ignore  -> just to avoid the error with the prop's type of v-dialog
+// @ts-expect-error This is just to avoid the error with the prop's type of v-dialog
 const _show = computed(() => props.show) as boolean
 </script>
 

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

@@ -78,8 +78,9 @@ header principal (configuration, paramètres du compte...)
             >
               <v-list-item-title
                 class="text-body-2"
-                v-text="$t(action.label)"
-              />
+              >
+                {{ $t(action.label) }}
+              </v-list-item-title>
             </v-list-item>
           </template>
         </v-card-actions>
@@ -111,7 +112,7 @@ const menu = getMenu(props.name)
 const displayMenu = computed(() => hasMenu(props.name))
 const isOpened = () => isMenuOpened(props.name)
 
-const onStateUpdated = (e: any) => {
+const onStateUpdated = (e: boolean) => {
   setMenuState(props.name, e)
 }
 

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

@@ -48,7 +48,7 @@
             </template>
           </v-list-item>
 
-          <v-divider></v-divider>
+          <v-divider/>
 
           <!--suppress VueUnrecognizedDirective -->
           <span v-intersect="onLastNotificationIntersect" />

+ 3 - 2
components/Layout/Header/UniversalCreation/EventParams.vue

@@ -15,7 +15,7 @@ Event parameters page in the create dialog
     </v-row>
 
     <v-row v-show="eventStart < now" class="anteriorDateWarning mt-0">
-      <v-col cols="2" class="pt-1"></v-col>
+      <v-col cols="2" class="pt-1"/>
       <v-col cols="9" class="pt-1">
         <i class="fa fa-circle-info" />
         {{
@@ -57,7 +57,8 @@ Event parameters page in the create dialog
 import { ref } from 'vue'
 import type { Ref, ComputedRef } from 'vue'
 import { add, format, startOfHour, formatISO } from 'date-fns'
-import DateUtils, { supportedLocales } from '~/services/utils/dateUtils'
+import type { supportedLocales } from '~/services/utils/dateUtils';
+import DateUtils from '~/services/utils/dateUtils'
 
 const i18n = useI18n()
 

+ 4 - 4
components/Layout/MainMenu.vue

@@ -60,9 +60,9 @@ Prend en paramètre une liste de ItemMenu et les met en forme
           </template>
 
           <v-list-item
-            v-for="child in item.children"
+            v-for="(child, index) in item.children"
             :id="'main-menu-item' + item.label + '-' + child.label"
-            :key="child.label"
+            :key="index"
             :title="$t(child.label)"
             :prepend-icon="child.icon.name"
             :href="!isInternalLink(child) ? child.to : undefined"
@@ -119,7 +119,7 @@ const isRail = computed(() => {
 
 const unwatch = watch(lgAndUp, (newValue, oldValue) => {
   // Par défaut si l'écran est trop petit au chargement de la page, le menu doit rester fermé.
-  if (process.client && menu !== null) {
+  if (import.meta.client && menu !== null) {
     setMenuState('Main', lgAndUp.value)
   }
 })
@@ -139,7 +139,7 @@ function getItems(
 
   if (menu === null) {
     items = []
-  } else if (menu.hasOwnProperty('children')) {
+  } else if (Object.prototype.hasOwnProperty.call(menu, 'children')) {
     items = (menu as MenuGroup).children ?? []
   } else {
     items = [menu]

+ 2 - 0
components/Layout/Pages/Subscription/Card.vue

@@ -46,10 +46,12 @@ const props = defineProps({
   subTitle: {
     type: String,
     required: false,
+    default: ''
   },
   extraHeader: {
     type: String,
     required: false,
+    default: ''
   },
   color: {
     type: String,

+ 3 - 3
components/Layout/Pages/Subscription/List.vue

@@ -1,19 +1,19 @@
 <template>
   <ul>
-    <li v-for="li in elements">
+    <li v-for="(li, index) in elements" :key="index">
       <v-icon
         class="check"
         :color="color"
         icon="fa-solid fa-check"
         size="large"
-      ></v-icon>
+      />
       <span class="pl-2">{{ li }}</span>
     </li>
   </ul>
 </template>
 
 <script setup lang="ts">
-const props = defineProps({
+defineProps({
   elements: {
     type: Array,
     required: true,

+ 1 - 1
components/Layout/Parameters/EntityTable.vue

@@ -69,7 +69,7 @@ const props = defineProps({
   actions: {
     type: Array as PropType<Array<TABLE_ACTION>>,
     required: false,
-    default: [TABLE_ACTION.EDIT, TABLE_ACTION.DELETE, TABLE_ACTION.ADD],
+    default: () => [TABLE_ACTION.EDIT, TABLE_ACTION.DELETE, TABLE_ACTION.ADD],
   },
   /**
    * The base URL for the edit / create pages

+ 2 - 3
components/Layout/Parameters/Menu.vue

@@ -31,8 +31,7 @@
         :prepend-icon="item.icon ? item.icon.name : ''"
         :to="(item as MenuItem).to"
         @click="onItemClicked"
-      >
-      </v-list-item>
+      />
     </v-list>
   </v-navigation-drawer>
 </template>
@@ -73,7 +72,7 @@ const onItemClicked = () => {
 
 const unwatch = watch(mdAndUp, () => {
   // Par défaut si l'écran est trop petit au chargement de la page, le menu doit rester fermé.
-  if (process.client && menu !== null) {
+  if (import.meta.client && menu !== null) {
     setMenuState('Parameters', mdAndUp.value)
   }
 })

+ 3 - 3
components/Layout/Parameters/Table.vue

@@ -12,7 +12,7 @@ A data table for the parameters page
     <v-table>
       <thead>
         <tr>
-          <td v-for="col in columns">
+          <td v-for="(col, index) in columns" :key="index">
             {{ col.label }}
           </td>
           <td>{{ $t('actions') }}</td>
@@ -20,7 +20,7 @@ A data table for the parameters page
       </thead>
       <tbody v-if="items.length > 0">
         <tr v-for="(item, i) in items" :key="i">
-          <td v-for="col in columnsDefinitions" class="cycle-editable-cell">
+          <td v-for="(col, index) in columnsDefinitions" :key="index" class="cycle-editable-cell">
             {{ item[col.property] }}
           </td>
 
@@ -69,7 +69,7 @@ A data table for the parameters page
           <td>
             <i>{{ i18n.t('nothing_to_show') }}</i>
           </td>
-          <td></td>
+          <td/>
         </tr>
       </tbody>
     </v-table>

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

@@ -72,7 +72,7 @@ const setActivityYear = async (event: string) => {
   await em.patch(Access, accessProfileStore.currentAccessId, {
     activityYear,
   })
-  if (process.server) {
+  if (import.meta.server) {
     // Force profile refresh server side to avoid a bug where server and client stores diverge on profile refresh
     await refreshProfile()
   }

+ 3 - 2
components/Layout/SubHeader/DataTiming.vue

@@ -17,7 +17,8 @@
       @update:model-value="onUpdate"
     >
       <v-btn
-        v-for="choice in historicalChoices"
+        v-for="(choice, index) in historicalChoices"
+        :key="index"
         :value="choice"
         max-height="25"
         :class="
@@ -84,7 +85,7 @@ const onUpdate = async (newValue: Array<string>) => {
   await em.patch(Access, accessId, {
     historical: accessProfileStore.historical,
   })
-  if (process.server) {
+  if (import.meta.server) {
     // Force profile refresh server side to avoid a bug where server and client stores diverge on profile refresh
     await refreshProfile()
   }

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

@@ -62,7 +62,7 @@ const updateDateTimeRange = async (dates: Array<Date>): Promise<any> => {
   await em.patch(Access, accessId, {
     historical: accessProfileStore.historical,
   })
-  if (process.server) {
+  if (import.meta.server) {
     // Force profile refresh server side to avoid a bug where server and client stores diverge on profile refresh
     await refreshProfile()
   }

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

@@ -56,7 +56,7 @@ import type { ComputedRef, Ref } from 'vue'
 import PersonalizedList from '~/models/Access/PersonalizedList'
 import { useEntityFetch } from '~/composables/data/useEntityFetch'
 import type { AnyJson } from '~/types/data'
-import ApiResource from '~/models/ApiResource'
+import type ApiResource from '~/models/ApiResource'
 import UrlUtils from '~/services/utils/urlUtils'
 
 const btn: Ref = ref(null)

+ 1 - 1
components/Layout/UpgradePremiumButton.vue

@@ -5,7 +5,7 @@
 
       <span v-if="organizationProfile.isTrialActive && !minimized">
         <strong>J-{{ organizationProfile.trialCountDown }}</strong>
-        <br />
+        <br >
       </span>
 
       <span v-if="!minimized">{{ btnLabel }}</span>

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

@@ -17,7 +17,7 @@ Bouton Delete avec modale de confirmation de la suppression
 
 <script setup lang="ts">
 import type { Ref, PropType } from 'vue'
-import ApiResource from '~/models/ApiResource'
+import type ApiResource from '~/models/ApiResource'
 import { useDeleteItem } from '~/composables/form/useDeleteItem'
 
 const props = defineProps({

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

@@ -8,7 +8,7 @@
   >
     {{ $t(mainAction) }}
 
-    <v-divider v-if="hasOtherActions" class="ml-3" :vertical="true"></v-divider>
+    <v-divider v-if="hasOtherActions" class="ml-3" :vertical="true"/>
 
     <v-menu
       v-if="hasOtherActions"

+ 2 - 2
components/Ui/DataTable.vue

@@ -13,7 +13,7 @@ Tableau interactif conçu pour l'affichage d'une collection d'entités
       :loading="$fetchState.pending"
       class="elevation-1"
     >
-      <template v-for="header in headersWithItem" #[header.item]="props">
+      <template v-for="(header, index) in headersWithItem" :key="index" #[header.item]="props">
         <slot :name="header.item" v-bind="props">
           {{ props.item[header.value] }}
         </slot>
@@ -31,7 +31,7 @@ Tableau interactif conçu pour l'affichage d'une collection d'entités
 import { ref, toRefs } from 'vue'
 import type { Ref } from 'vue'
 import { useEntityFetch } from '~/composables/data/useEntityFetch'
-import ApiResource from '~/models/ApiResource'
+import type ApiResource from '~/models/ApiResource'
 import type { AnyJson } from '~/types/data'
 
 const props = defineProps({

+ 2 - 1
components/Ui/DatePicker.vue

@@ -35,7 +35,8 @@ Sélecteur de dates
 import { useI18n } from 'vue-i18n'
 import type { PropType } from 'vue'
 import type { Locale } from 'date-fns'
-import DateUtils, { supportedLocales } from '~/services/utils/dateUtils'
+import type { supportedLocales } from '~/services/utils/dateUtils';
+import DateUtils from '~/services/utils/dateUtils'
 
 const props = defineProps({
   modelValue: {

+ 4 - 4
components/Ui/Form.vue

@@ -30,7 +30,7 @@ de quitter si des données ont été modifiées.
               :actions="actions"
               :validation-pending="validationPending || !isValid"
               @submit="submit"
-            ></UiButtonSubmit>
+            />
           </v-col>
         </v-row>
       </v-container>
@@ -53,7 +53,7 @@ de quitter si des données ont été modifiées.
               :validation-pending="validationPending || !isValid"
               :actions="actions"
               @submit="submit"
-            ></UiButtonSubmit>
+            />
           </v-col>
         </v-row>
       </v-container>
@@ -66,7 +66,7 @@ de quitter si des données ont été modifiées.
           {{ $t('caution') }}
         </v-card-title>
         <v-card-text>
-          <br />
+          <br >
           <p>{{ $t('quit_without_saving_warning') }}.</p>
         </v-card-text>
       </template>
@@ -98,7 +98,7 @@ import * as _ from 'lodash-es'
 import { FORM_FUNCTION, SUBMIT_TYPE, TYPE_ALERT } from '~/types/enum/enums'
 import { useFormStore } from '~/stores/form'
 import { useEntityManager } from '~/composables/data/useEntityManager'
-import ApiModel from '~/models/ApiModel'
+import type ApiModel from '~/models/ApiModel'
 import { usePageStore } from '~/stores/page'
 import type { AnyJson } from '~/types/data'
 import { useRefreshProfile } from '~/composables/data/useRefreshProfile'

+ 1 - 1
components/Ui/Form/Creation.vue

@@ -13,7 +13,7 @@
 <script setup lang="ts">
 import type { PropType } from 'vue'
 import type { RouteLocationRaw } from '@intlify/vue-router-bridge'
-import ApiModel from '~/models/ApiModel'
+import type ApiModel from '~/models/ApiModel'
 import type { AnyJson } from '~/types/data'
 import { SUBMIT_TYPE } from '~/types/enum/enums'
 import { useEntityManager } from '~/composables/data/useEntityManager'

+ 1 - 1
components/Ui/Form/Edition.vue

@@ -18,7 +18,7 @@ import type { PropType } from 'vue'
 import { useRoute } from 'vue-router'
 import type { RouteLocationRaw } from 'vue-router'
 import type { AsyncData } from '#app'
-import ApiModel from '~/models/ApiModel'
+import type ApiModel from '~/models/ApiModel'
 import type { AnyJson } from '~/types/data'
 import { SUBMIT_TYPE } from '~/types/enum/enums'
 import { useEntityFetch } from '~/composables/data/useEntityFetch'

+ 1 - 1
components/Ui/Help.vue

@@ -23,7 +23,7 @@
     </template>
 
     <div ref="slotDiv" v-click-out="onClickOutside" class="tooltip">
-      <slot></slot>
+      <slot/>
     </div>
   </v-tooltip>
 </template>

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

@@ -25,8 +25,8 @@ Liste déroulante avec autocompletion issue de Ap2i
 import { computed } from 'vue'
 import type { ComputedRef, Ref, PropType } from 'vue'
 import { useEntityFetch } from '~/composables/data/useEntityFetch'
-import ApiResource from '~/models/ApiResource'
-import ApiModel from '~/models/ApiModel'
+import type ApiResource from '~/models/ApiResource'
+import type ApiModel from '~/models/ApiModel'
 import type { AnyJson, AssociativeArray } from '~/types/data'
 
 const props = defineProps({

+ 3 - 4
components/Ui/Input/Image.vue

@@ -27,8 +27,7 @@ Assistant de création d'image
             align="center"
             justify="center"
           >
-            <v-progress-circular :indeterminate="true" color="neutral">
-            </v-progress-circular>
+            <v-progress-circular :indeterminate="true" color="neutral"/>
           </v-row>
 
           <div v-else>
@@ -67,7 +66,7 @@ Assistant de création d'image
                   type="file"
                   accept="image/*"
                   @change="uploadImage($event)"
-                />
+                >
                 {{ $t('upload_image') }}
               </button>
             </div>
@@ -95,7 +94,7 @@ Assistant de création d'image
 <script setup lang="ts">
 import { Cropper } from 'vue-advanced-cropper'
 import 'vue-advanced-cropper/dist/style.css'
-import { type Ref, ref, PropType } from 'vue'
+import { type Ref, ref  } from 'vue';
 import File from '~/models/Core/File'
 import { useEntityManager } from '~/composables/data/useEntityManager'
 import { useImageManager } from '~/composables/data/useImageManager'

+ 3 - 2
components/Ui/Input/Text.vue

@@ -1,5 +1,5 @@
 <!--
-Champs de saisie de texte, à placer dans un composant `UiForm`
+Champs de saisie de texte, à placer dans un composant UiForm
 
 @see https://vuetifyjs.com/en/components/text-fields/
 -->
@@ -28,7 +28,8 @@ Champs de saisie de texte, à placer dans un composant `UiForm`
 </template>
 
 <script setup lang="ts">
-import { type Ref, ref, PropType } from 'vue'
+import type { PropType, Ref  } from 'vue';
+import { ref  } from 'vue';
 import { useFieldViolation } from '~/composables/form/useFieldViolation'
 
 const props = defineProps({

+ 2 - 2
components/Ui/ItemFromUri.vue

@@ -14,12 +14,12 @@ Espace permettant de récupérer un item via une uri et de gérer son affichage
 <script setup lang="ts">
 // TODO: renommer en EntityFromUri? voir si ce component est encore nécessaire, ou si ça ne peut pas être une méthode de l'entity manager
 
-import { Query } from 'pinia-orm'
+import type { Query } from 'pinia-orm'
 import { computed } from 'vue'
 import type { ComputedRef } from 'vue'
 import UrlUtils from '~/services/utils/urlUtils'
 import { useEntityFetch } from '~/composables/data/useEntityFetch'
-import ApiResource from '~/models/ApiResource'
+import type ApiResource from '~/models/ApiResource'
 
 const props = defineProps({
   uri: {

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

@@ -7,7 +7,7 @@ Template de base d'un tableau interactif
 <template>
   <v-col cols="12" sm="12">
     <v-data-table :headers="headersWithItem" :items="items" class="elevation-1">
-      <template v-for="header in headersWithItem" #[header.item]="props">
+      <template v-for="(header, index) in headersWithItem" :key="index" #[header.item]="props">
         <slot :name="header.item" v-bind="props">
           {{ props.item[header.value] }}
         </slot>

+ 1 - 1
composables/data/useAp2iRequestService.ts

@@ -43,7 +43,7 @@ export const useAp2iRequestService = () => {
     options.headers = headers
 
     pending.value = true
-    console.log('Request : ' + request + ' (SSR: ' + process.server + ')')
+    console.log('Request : ' + request + ' (SSR: ' + import.meta.server + ')')
   }
 
   const onRequestError = function (_: FetchContext) {

+ 2 - 2
composables/data/useEntityFetch.ts

@@ -6,9 +6,9 @@ import type {
   AsyncDataRequestStatus,
 } from '#app/composables/asyncData'
 import { useEntityManager } from '~/composables/data/useEntityManager'
-import ApiResource from '~/models/ApiResource'
+import type ApiResource from '~/models/ApiResource'
 import type { Collection } from '~/types/data'
-import Query from '~/services/data/Query'
+import type Query from '~/services/data/Query'
 
 interface useEntityFetchReturnType {
   fetch: (

+ 1 - 1
composables/utils/useDownloadFile.ts

@@ -1,6 +1,6 @@
 import FileSaver from 'file-saver'
 import { useAp2iRequestService } from '~/composables/data/useAp2iRequestService'
-import File from '~/models/Core/File'
+import type File from '~/models/Core/File'
 
 export const useDownloadFile = async (file: File) => {
   const { apiRequestService } = useAp2iRequestService()

+ 3 - 8
eslint.config.mjs

@@ -1,3 +1,6 @@
+import globals from 'globals'
+import withNuxt from './.nuxt/eslint.config.mjs'
+
 // Polyfill for structuredClone if it doesn't exist
 if (typeof structuredClone !== 'function') {
   globalThis.structuredClone = function(obj) {
@@ -5,14 +8,6 @@ if (typeof structuredClone !== 'function') {
   };
 }
 
-import path from 'node:path'
-import { fileURLToPath } from 'node:url'
-import globals from 'globals'
-import withNuxt from './.nuxt/eslint.config.mjs'
-
-const __filename = fileURLToPath(import.meta.url)
-const __dirname = path.dirname(__filename)
-
 // Configuration de base personnalisée
 const customConfig = [
   {

+ 1 - 1
layouts/error.vue

@@ -21,7 +21,7 @@ const props = defineProps({
 })
 
 if (
-  process.client &&
+  import.meta.client &&
   props.error.statusCode === 404 &&
   process.env.NODE_ENV === 'production'
 ) {

+ 2 - 2
models/Access/MyProfile.ts

@@ -1,7 +1,7 @@
 import { Num, Uid, Attr, Bool, Str } from 'pinia-orm/dist/decorators'
 import type { Historical } from '~/types/interfaces'
-import Access from '~/models/Access/Access'
-import OrganizationProfile from '~/models/Organization/OrganizationProfile'
+import type Access from '~/models/Access/Access'
+import type OrganizationProfile from '~/models/Organization/OrganizationProfile'
 import ApiResource from '~/models/ApiResource'
 
 /**

+ 1 - 1
models/ApiResource.ts

@@ -4,7 +4,7 @@ import { Model } from 'pinia-orm'
  * Base class for resources that can be fetched from the API
  */
 class ApiResource extends Model {
-  // eslint-disable-next-line no-use-before-define
+   
   protected static _iriEncodedFields: Record<string, ApiResource>
   protected static _idField: string
 

+ 1 - 1
models/Core/Notification.ts

@@ -1,5 +1,5 @@
 import { Str, Uid, Attr } from 'pinia-orm/dist/decorators'
-import NotificationMessage from '~/models/Core/NotificationMessage'
+import type NotificationMessage from '~/models/Core/NotificationMessage'
 import ApiModel from '~/models/ApiModel'
 
 /**

+ 1 - 1
models/decorators.ts

@@ -1,4 +1,4 @@
-import ApiResource from '~/models/ApiResource'
+import type ApiResource from '~/models/ApiResource'
 
 /**
  * Decorates an ApiResource's property to signal it as a field that is provided

+ 7 - 8
nuxt.config.ts

@@ -138,7 +138,6 @@ export default defineNuxtConfig({
   },
 
   modules: [
-    // eslint-disable-next-line require-await
     async (_, nuxt) => {
       nuxt.hooks.hook('vite:extendConfig', (config) =>
         // @ts-expect-error A revoir après que les lignes aient été décommentées
@@ -177,9 +176,9 @@ export default defineNuxtConfig({
       drop: process.env.DEBUG ? [] : ['console', 'debugger'],
       tsconfigRaw: {
         compilerOptions: {
-          experimentalDecorators: true,
-        },
-      },
+          experimentalDecorators: true
+        }
+      }
     },
     ssr: {
       // with ssr enabled, this config is required to load vuetify properly
@@ -191,16 +190,16 @@ export default defineNuxtConfig({
       port: 443,
       hmr: {
         protocol: 'wss',
-        port: 24678,
-      },
-    },
+        port: 24678
+      }
+    }
   },
 
   // Hide the sourcemaps warnings with vuetify
   // @see https://github.com/vuetifyjs/vuetify-loader/issues/290#issuecomment-1435702713
   sourcemap: {
     server: false,
-    client: false,
+    client: false
   },
 
   i18n: {

+ 1 - 1
pages/parameters/attendance_booking_reasons/new.vue

@@ -8,7 +8,7 @@
         <template #default="{ entity }">
           <v-container :fluid="true" class="container">
             <v-row>
-              <v-col cols="12" sm="6"> </v-col>
+              <v-col cols="12" sm="6"/>
             </v-row>
             <v-row>
               <v-col cols="12" sm="6">

+ 1 - 1
pages/parameters/education_timings/new.vue

@@ -8,7 +8,7 @@
         <template #default="{ entity }">
           <v-container :fluid="true" class="container">
             <v-row>
-              <v-col cols="12" sm="6"> </v-col>
+              <v-col cols="12" sm="6"/>
             </v-row>
             <v-row>
               <v-col cols="12" sm="6">

+ 1 - 1
pages/parameters/subdomains/new.vue

@@ -58,7 +58,7 @@ import { SUBMIT_TYPE } from '~/types/enum/enums'
 import type { AnyJson } from '~/types/data'
 import SubdomainValidation from '~/services/validation/subdomainValidation'
 import { useSubdomainValidation } from '~/composables/form/validation/useSubdomainValidation'
-import Form from '~/components/Ui/Form.vue'
+import type Form from '~/components/Ui/Form.vue'
 
 definePageMeta({
   name: 'record_a_new_subdomain',

+ 1 - 1
pages/parameters/teaching.vue

@@ -38,7 +38,7 @@ import Cycle from '~/models/Education/Cycle'
 import { useOrganizationProfileStore } from '~/stores/organizationProfile'
 import type { AnyJson } from '~/types/data'
 import { useEnumFetch } from '~/composables/data/useEnumFetch'
-import ApiResource from '~/models/ApiResource'
+import type ApiResource from '~/models/ApiResource'
 import { TABLE_ACTION } from '~/types/enum/enums'
 
 definePageMeta({

+ 1 - 1
pages/parameters/website.vue

@@ -127,7 +127,7 @@ import { useOrganizationProfileStore } from '~/stores/organizationProfile'
 import Parameters from '~/models/Organization/Parameters'
 import { useEntityFetch } from '~/composables/data/useEntityFetch'
 import Subdomain from '~/models/Organization/Subdomain'
-import ApiResource from '~/models/ApiResource'
+import type ApiResource from '~/models/ApiResource'
 import EqualFilter from '~/services/data/Filters/EqualFilter'
 import Query from '~/services/data/Query'
 

+ 10 - 10
pages/subscription.vue

@@ -78,7 +78,7 @@ Page 'Mon abonnement'
                   <th>{{ $t('date') }}</th>
                   <th>{{ $t('taxExcludedAmount') }}</th>
                   <th>{{ $t('status') }}</th>
-                  <th></th>
+                  <th/>
                 </tr>
               </thead>
               <tbody>
@@ -132,13 +132,13 @@ Page 'Mon abonnement'
               sm="12"
             >
               <span class="theme-artist"
-                >Pour les orchestres, chorales, <br />compagnies et troupes
+                >Pour les orchestres, chorales, <br >compagnies et troupes
                 artistiques</span
               >
             </v-col>
             <v-col cols="12" lg="4" sm="12">
               <span class="theme-school"
-                >Pour les établissements d'enseignements <br />
+                >Pour les établissements d'enseignements <br >
                 artistiques*</span
               >
             </v-col>
@@ -193,7 +193,7 @@ Page 'Mon abonnement'
                         target="_blank"
                       >
                         {{ $t('to_know_more') }}
-                        <i class="fa-solid fa-greater-than small"></i>
+                        <i class="fa-solid fa-greater-than small"/>
                       </v-btn>
                     </v-col>
                     <v-col cols="12">
@@ -256,7 +256,7 @@ Page 'Mon abonnement'
                     >
                       <v-btn class="btn trialBtn" @click="startTrial">
                         {{ $t('try_premium_version') }}
-                        <i class="fa-solid fa-greater-than small"></i>
+                        <i class="fa-solid fa-greater-than small"/>
                       </v-btn>
                     </v-col>
                     <v-col
@@ -270,7 +270,7 @@ Page 'Mon abonnement'
                     >
                       <v-btn class="theme-artist btn" @click="subscription">
                         {{ $t('subscribe_to_the_offer') }}
-                        <i class="fa-solid fa-greater-than small"></i>
+                        <i class="fa-solid fa-greater-than small"/>
                       </v-btn>
                     </v-col>
 
@@ -297,7 +297,7 @@ Page 'Mon abonnement'
                             organizationProfile.isTrialActive
                           "
                         >
-                          <br />
+                          <br >
                           **Tarif
                           <span v-if="organizationProfile.isCmf"
                             >adhérent CMF</span
@@ -347,7 +347,7 @@ Page 'Mon abonnement'
                         target="_blank"
                       >
                         {{ $t('to_know_more') }}
-                        <i class="fa-solid fa-greater-than small"></i>
+                        <i class="fa-solid fa-greater-than small"/>
                       </v-btn>
                     </v-col>
                     <v-col cols="12">
@@ -387,7 +387,7 @@ Page 'Mon abonnement'
                     target="_blank"
                   >
                     acheter des credits SMS
-                    <i class="fa-solid fa-greater-than small"></i>
+                    <i class="fa-solid fa-greater-than small"/>
                   </v-btn>
                 </template>
               </LayoutPagesSubscriptionCard>
@@ -411,7 +411,7 @@ Page 'Mon abonnement'
                     target="_blank"
                   >
                     souscrire à l'option
-                    <i class="fa-solid fa-greater-than small"></i>
+                    <i class="fa-solid fa-greater-than small"/>
                   </v-btn>
                 </template>
               </LayoutPagesSubscriptionCard>

+ 1 - 1
services/data/Filters/EqualFilter.ts

@@ -1,7 +1,7 @@
 import type { Query as PiniaOrmQuery } from 'pinia-orm'
 import type { Ref } from 'vue'
 import type { ApiFilter } from '~/types/data'
-import ApiResource from '~/models/ApiResource'
+import type ApiResource from '~/models/ApiResource'
 import AbstractFilter from '~/services/data/Filters/AbstractFilter'
 import RefUtils from '~/services/utils/refUtils'
 

+ 1 - 1
services/data/Filters/InArrayFilter.ts

@@ -1,7 +1,7 @@
 import type { Query as PiniaOrmQuery } from 'pinia-orm'
 import type { Ref } from 'vue'
 import type { ApiFilter } from '~/types/data'
-import ApiResource from '~/models/ApiResource'
+import type ApiResource from '~/models/ApiResource'
 import AbstractFilter from '~/services/data/Filters/AbstractFilter'
 import RefUtils from '~/services/utils/refUtils'
 

+ 1 - 1
services/data/Filters/OrderBy.ts

@@ -1,6 +1,6 @@
 import type { Query as PiniaOrmQuery } from 'pinia-orm'
 import type { ApiFilter } from '~/types/data'
-import ApiResource from '~/models/ApiResource'
+import type ApiResource from '~/models/ApiResource'
 import { ORDER_BY_DIRECTION } from '~/types/enum/data'
 import StringUtils from '~/services/utils/stringUtils'
 

+ 1 - 1
services/data/Filters/PageFilter.ts

@@ -1,6 +1,6 @@
 import type { Query as PiniaOrmQuery } from 'pinia-orm'
 import type { ApiFilter } from '~/types/data'
-import ApiResource from '~/models/ApiResource'
+import type ApiResource from '~/models/ApiResource'
 import RefUtils from '~/services/utils/refUtils'
 
 export default class PageFilter implements ApiFilter {

+ 1 - 1
services/data/Filters/SearchFilter.ts

@@ -1,7 +1,7 @@
 import type { Query as PiniaOrmQuery } from 'pinia-orm'
 import type { Ref } from 'vue'
 import type { ApiFilter } from '~/types/data'
-import ApiResource from '~/models/ApiResource'
+import type ApiResource from '~/models/ApiResource'
 import { SEARCH_STRATEGY } from '~/types/enum/data'
 import AbstractFilter from '~/services/data/Filters/AbstractFilter'
 import RefUtils from '~/services/utils/refUtils'

+ 5 - 8
services/data/entityManager.ts

@@ -1,17 +1,16 @@
-import { Query as PiniaOrmQuery, Repository } from 'pinia-orm'
-import type { Collection as PiniaOrmCollection } from 'pinia-orm'
+import type { Query as PiniaOrmQuery, Repository, Collection as PiniaOrmCollection  } from 'pinia-orm'
 import { v4 as uuid4 } from 'uuid'
 import * as _ from 'lodash-es'
 import { computed } from 'vue'
-import ApiRequestService from './apiRequestService'
+import type ApiRequestService from './apiRequestService'
 import UrlUtils from '~/services/utils/urlUtils'
-import ApiModel from '~/models/ApiModel'
-import ApiResource from '~/models/ApiResource'
+import type ApiModel from '~/models/ApiModel'
+import type ApiResource from '~/models/ApiResource'
 import type { AnyJson, AssociativeArray, Collection } from '~/types/data.d'
 import modelsIndex from '~/models/models'
 import HydraNormalizer from '~/services/data/normalizer/hydraNormalizer'
 import ObjectUtils from '~/services/utils/objectUtils'
-import Query from '~/services/data/Query'
+import type Query from '~/services/data/Query'
 
 /**
  * Entity manager: make operations on the models defined with the Pinia-Orm library
@@ -78,7 +77,6 @@ class EntityManager {
    */
   // noinspection JSMethodCanBeStatic
   public cast(model: typeof ApiResource, instance: ApiResource): ApiResource {
-    // eslint-disable-next-line new-cap
     return new model(instance)
   }
 
@@ -252,7 +250,6 @@ class EntityManager {
     })
 
     // @ts-expect-error Needed to avoid 'Cannot stringify non POJO' occasional bugs
-    // eslint-disable-next-line
     res.toJSON = () => {
       return 'Computed result from fetchCollection at : ' + url
     }

+ 1 - 1
services/data/enumManager.ts

@@ -1,5 +1,5 @@
 import type { VueI18n } from 'vue-i18n'
-import ApiRequestService from './apiRequestService'
+import type ApiRequestService from './apiRequestService'
 import UrlUtils from '~/services/utils/urlUtils'
 import HydraNormalizer from '~/services/data/normalizer/hydraNormalizer'
 import type { Enum } from '~/types/data.d'

+ 1 - 1
services/data/imageManager.ts

@@ -1,4 +1,4 @@
-import ApiRequestService from './apiRequestService'
+import type ApiRequestService from './apiRequestService'
 import FileUtils from '~/services/utils/fileUtils'
 import { FILE_TYPE, FILE_VISIBILITY, IMAGE_SIZE } from '~/types/enum/enums'
 import type { AssociativeArray } from '~/types/data'

+ 2 - 2
services/data/normalizer/hydraNormalizer.ts

@@ -3,7 +3,7 @@ import type { AnyJson, ApiResponse, HydraMetadata } from '~/types/data'
 import UrlUtils from '~/services/utils/urlUtils'
 import { METADATA_TYPE } from '~/types/enum/data'
 import models from '~/models/models'
-import ApiResource from '~/models/ApiResource'
+import type ApiResource from '~/models/ApiResource'
 
 /**
  * Normalisation et dé-normalisation du format de données Hydra
@@ -173,7 +173,7 @@ class HydraNormalizer {
   protected static denormalizeEntity(model: typeof ApiResource, item: AnyJson) {
     item.id = this.getItemIdValue(model, item)
 
-    // eslint-disable-next-line new-cap
+     
     const instance = new model(item)
     const iriEncodedFields = model.getIriEncodedFields()
 

+ 0 - 1
services/layout/menuBuilder/abstractMenuBuilder.ts

@@ -127,7 +127,6 @@ abstract class AbstractMenuBuilder implements MenuBuilder {
 
   protected buildSubmenu(menuBuilder: typeof AbstractMenuBuilder) {
     // @ts-expect-error this method has to be called from non-abstract subclasses
-    // eslint-disable-next-line new-cap
     const builder = new menuBuilder(
       this.runtimeConfig,
       this.ability,

+ 1 - 1
services/layout/menuComposer.ts

@@ -49,7 +49,7 @@ export default class MenuComposer {
     layoutState: LayoutState,
   ) {
     for (const builderClass of MenuComposer.builders) {
-      // eslint-disable-next-line new-cap
+       
       const builder: MenuBuilder = new builderClass(
         runtimeConfig,
         ability,

+ 1 - 1
services/rights/abilityBuilder.ts

@@ -3,7 +3,7 @@ import * as _ from 'lodash-es'
 import type { MongoAbility } from '@casl/ability/dist/types/Ability'
 import RoleUtils from '~/services/rights/roleUtils'
 import type { AbilitiesType, AccessProfile } from '~/types/interfaces'
-import { ABILITIES } from '~/types/enum/enums'
+import type { ABILITIES } from '~/types/enum/enums'
 import type OrganizationProfile from '~/models/Organization/OrganizationProfile'
 
 interface ConditionParameters {

+ 1 - 1
services/sse/sseSource.ts

@@ -45,7 +45,7 @@ class SseSource {
     if (this.isConnected()) {
       throw new Error('SSE - Already subscribed to this event source')
     }
-    if (process.server) {
+    if (import.meta.server) {
       throw new Error('SSE - Cannot subscribe on server side')
     }
 

+ 1 - 1
services/validation/subdomainValidation.ts

@@ -1,4 +1,4 @@
-import ApiRequestService from '~/services/data/apiRequestService'
+import type ApiRequestService from '~/services/data/apiRequestService'
 
 export default class SubdomainValidation {
   private apiRequestService: ApiRequestService

+ 1 - 1
stores/page.ts

@@ -1,7 +1,7 @@
 import { defineStore } from 'pinia'
 import { ref } from 'vue'
 import type { Ref } from 'vue'
-import { TYPE_ALERT } from '~/types/enum/enums'
+import type { TYPE_ALERT } from '~/types/enum/enums'
 import type { Alert } from '~/types/interfaces'
 
 export const usePageStore = defineStore('page', () => {

+ 2 - 3
tests/units/services/data/entityManager.test.ts

@@ -1,11 +1,10 @@
 import { describe, test, vi, expect, beforeEach, afterEach } from 'vitest'
-import { Repository } from 'pinia-orm'
-import type { Element } from 'pinia-orm'
+import type { Repository, Element  } from 'pinia-orm'
 import { Str, Uid } from 'pinia-orm/dist/decorators'
 import EntityManager from '~/services/data/entityManager'
 import ApiResource from '~/models/ApiResource'
 import ApiModel from '~/models/ApiModel'
-import ApiRequestService from '~/services/data/apiRequestService'
+import type ApiRequestService from '~/services/data/apiRequestService'
 import { IdField } from '~/models/decorators'
 
 class DummyApiResource extends ApiResource {

+ 1 - 1
tests/units/services/data/enumManager.test.ts

@@ -1,6 +1,6 @@
 import { describe, test, it, expect, beforeEach } from 'vitest'
 import type { VueI18n } from 'vue-i18n'
-import ApiRequestService from '~/services/data/apiRequestService'
+import type ApiRequestService from '~/services/data/apiRequestService'
 import EnumManager from '~/services/data/enumManager'
 
 let apiRequestService: ApiRequestService

+ 1 - 1
tests/units/services/data/imageManager.test.ts

@@ -1,5 +1,5 @@
 import { vi, describe, test, expect, beforeEach, afterEach } from 'vitest'
-import ApiRequestService from '~/services/data/apiRequestService'
+import type ApiRequestService from '~/services/data/apiRequestService'
 import ImageManager from '~/services/data/imageManager'
 import 'blob-polyfill'
 

+ 1 - 1
tests/units/services/layout/menuBuilder/mainMenuBuilder.test.ts

@@ -6,7 +6,7 @@ import type { AccessProfile, organizationState } from '~/types/interfaces'
 import MainMenuBuilder from '~/services/layout/menuBuilder/mainMenuBuilder'
 import type { MenuGroup } from '~/types/layout'
 import { MENU_LINK_TYPE } from '~/types/enum/layout'
-import AbstractMenuBuilder from '~/services/layout/menuBuilder/abstractMenuBuilder'
+import type AbstractMenuBuilder from '~/services/layout/menuBuilder/abstractMenuBuilder'
 import AccessMenuBuilder from '~/services/layout/menuBuilder/accessMenuBuilder'
 import AgendaMenuBuilder from '~/services/layout/menuBuilder/agendaMenuBuilder'
 import EquipmentMenuBuilder from '~/services/layout/menuBuilder/equipmentMenuBuilder'

+ 2 - 2
tests/units/services/sse/sseSource.test.ts

@@ -117,11 +117,11 @@ describe('subscribe', () => {
     )
   })
   test('is server side', () => {
-    process.server = true
+    import.meta.server = true
     expect(() => sseSource.subscribe()).toThrowError(
       'SSE - Cannot subscribe on server side',
     )
-    process.server = false
+    import.meta.server = false
   })
   test('successful subscription', () => {
     onOpen = vi.fn(() => null)

+ 1 - 1
tests/units/services/validation/subdomainValidation.test.ts

@@ -1,6 +1,6 @@
 import { describe, expect, test, vi, beforeEach } from 'vitest'
 import SubdomainValidation from '~/services/validation/subdomainValidation'
-import ApiRequestService from '~/services/data/apiRequestService'
+import type ApiRequestService from '~/services/data/apiRequestService'
 import type { AssociativeArray } from '~/types/data'
 
 let subdomainValidation: SubdomainValidation

+ 1 - 1
types/data.d.ts

@@ -1,4 +1,4 @@
-import ApiResource from '~/models/ApiResource'
+import type ApiResource from '~/models/ApiResource'
 import type { EnumChoice } from '~/types/interfaces'
 import type {
   Query as PiniaOrmQuery,

+ 3 - 3
types/interfaces.d.ts

@@ -1,6 +1,6 @@
-import { Store } from 'pinia'
-import { AnyJson } from '~/types/enum/data'
-import { ABILITIES, GENDER, TYPE_ALERT } from '~/types/enum/enums'
+import type { Store } from 'pinia'
+import type { AnyJson } from '~/types/enum/data'
+import type { ABILITIES, GENDER, TYPE_ALERT } from '~/types/enum/enums'
 import { type ComputedRef, Ref } from '@vue/reactivity'
 import type { MenuGroup, MenuItem } from '~/types/layout'
 

+ 2 - 2
types/layout.d.ts

@@ -1,5 +1,5 @@
-import { MENU_LINK_TYPE } from '~/types/enum/layout'
-import { LINK_TARGET } from '~/types/enum/enums'
+import type { MENU_LINK_TYPE } from '~/types/enum/layout'
+import type { LINK_TARGET } from '~/types/enum/enums'
 
 interface IconItem {
   name?: string

+ 1 - 1
types/types.d.ts

@@ -1,4 +1,4 @@
-import { OrderDirection, Query, Repository } from 'pinia-orm'
+import type { OrderDirection, Query, Repository } from 'pinia-orm'
 
 export type RepositoryOrQuery<
   R extends Repository = Repository,