Browse Source

apply prettier

Olivier Massot 6 months ago
parent
commit
90b3e6a006

+ 2 - 3
README.md

@@ -72,16 +72,15 @@ Attention, sur les environnements de test, il faut utiliser nvm pour exécuter l
 Pour activer le mode maintenance en production :
 
     # (éditer les dates et heures de la maintenance, ligne 75)
-    nano /var/opentalent/git/app/public/maintenance.html  
+    nano /var/opentalent/git/app/public/maintenance.html
 
     # activer la maintenance
     touch /var/opentalent/git/app/.maintenance
 
-Pour le désactiver : 
+Pour le désactiver :
 
     rm /var/opentalent/git/app/.maintenance
 
-
 > Les Ips internes sont exclues du mode maintenance
 
 ## Autres

+ 0 - 2
components/Layout/AlertBar/Cotisation.vue

@@ -74,7 +74,6 @@ const alert: ComputedRef<Alert | null> = computed(() => {
   return mapping[cotisation.value.alertState as ALERT_STATE_COTISATION]
 })
 
-
 /**
  * Redirige l'utilisateur vers la page des cotisations
  */
@@ -122,7 +121,6 @@ const openCmfSubscriptionPage = () => {
     '_blank',
   )
 }
-
 </script>
 
 <style scoped lang="scss">

+ 1 - 1
components/Layout/Dialog.vue

@@ -48,7 +48,7 @@ const props = defineProps({
   contentClass: {
     type: String,
     required: false,
-    default: ''
+    default: '',
   },
   theme: {
     type: String,

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

@@ -76,9 +76,7 @@ header principal (configuration, paramètres du compte...)
               :href="!isInternalLink(action) ? action.to : undefined"
               :to="isInternalLink(action) ? action.to : undefined"
             >
-              <v-list-item-title
-                class="text-body-2"
-              >
+              <v-list-item-title class="text-body-2">
                 {{ $t(action.label) }}
               </v-list-item-title>
             </v-list-item>

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

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

+ 2 - 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 cols="2" class="pt-1" />
       <v-col cols="9" class="pt-1">
         <i class="fa fa-circle-info" />
         {{
@@ -57,7 +57,7 @@ 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 type { supportedLocales } from '~/services/utils/dateUtils';
+import type { supportedLocales } from '~/services/utils/dateUtils'
 import DateUtils from '~/services/utils/dateUtils'
 
 const i18n = useI18n()

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

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

+ 6 - 2
components/Layout/Parameters/Table.vue

@@ -20,7 +20,11 @@ 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, index) in columnsDefinitions" :key="index" class="cycle-editable-cell">
+          <td
+            v-for="(col, index) in columnsDefinitions"
+            :key="index"
+            class="cycle-editable-cell"
+          >
             {{ item[col.property] }}
           </td>
 
@@ -69,7 +73,7 @@ A data table for the parameters page
           <td>
             <i>{{ i18n.t('nothing_to_show') }}</i>
           </td>
-          <td/>
+          <td />
         </tr>
       </tbody>
     </v-table>

+ 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>

+ 2 - 4
components/Ui/Button/Submit.vue

@@ -8,7 +8,7 @@
   >
     {{ $t(mainAction) }}
 
-    <v-divider v-if="hasOtherActions" class="ml-3" :vertical="true"/>
+    <v-divider v-if="hasOtherActions" class="ml-3" :vertical="true" />
 
     <v-menu
       v-if="hasOtherActions"
@@ -34,9 +34,7 @@
           dense
           class="subAction"
         >
-          <v-list-item-title
-            @click="submitAction(action)"
-          >
+          <v-list-item-title @click="submitAction(action)">
             {{ $t(action) }}
           </v-list-item-title>
         </v-list-item>

+ 8 - 4
components/Ui/DataTable.vue

@@ -13,7 +13,11 @@ Tableau interactif conçu pour l'affichage d'une collection d'entités
       :loading="$fetchState.pending"
       class="elevation-1"
     >
-      <template v-for="(header, index) in headersWithItem" :key="index" #[header.item]="slotProps">
+      <template
+        v-for="(header, index) in headersWithItem"
+        :key="index"
+        #[header.item]="slotProps"
+      >
         <slot :name="header.item" v-bind="slotProps">
           {{ slotProps.item[header.value] }}
         </slot>
@@ -52,9 +56,9 @@ const props = defineProps({
 const { parent, model, headers } = toRefs(props)
 
 interface TableHeader {
-  value: string;
-  item?: string;
-  [key: string]: string | undefined;
+  value: string
+  item?: string
+  [key: string]: string | undefined
 }
 
 const headersWithItem = computed(() => {

+ 1 - 1
components/Ui/DatePicker.vue

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

+ 7 - 3
components/Ui/Form.vue

@@ -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>
@@ -247,8 +247,12 @@ const submit = async (next: string | null = null) => {
       onSaveAndQuitAction(actionArgs)
     }
   } catch (error: unknown) {
-
-    const err = error as { response?: { status: number, data: { violations?: Array<{ message: string, propertyPath: string }> } } }
+    const err = error as {
+      response?: {
+        status: number
+        data: { violations?: Array<{ message: string; propertyPath: string }> }
+      }
+    }
     if (
       err.response &&
       err.response.status === 422 &&

+ 1 - 1
components/Ui/Help.vue

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

+ 4 - 4
components/Ui/Image.vue

@@ -106,16 +106,16 @@ const refresh = () => {
 defineExpose({ refresh })
 
 interface FetchResult {
-  data: Ref<string | null>;
-  pending: Ref<boolean>;
-  refresh: () => void;
+  data: Ref<string | null>
+  pending: Ref<boolean>
+  refresh: () => void
 }
 
 const {
   data: imageSrc,
   pending,
   refresh: refreshImage,
-} = await fetch(fileId, props.size, defaultImagePath) as FetchResult
+} = (await fetch(fileId, props.size, defaultImagePath)) as FetchResult
 
 /**
  * Si l'id change, on recharge l'image

+ 3 - 1
components/Ui/Input/Autocomplete.vue

@@ -59,7 +59,9 @@ const props = defineProps({
    * v-model
    */
   modelValue: {
-    type: [String, Number, Object, Array] as PropType<string | number | object | Array<unknown>>,
+    type: [String, Number, Object, Array] as PropType<
+      string | number | object | Array<unknown>
+    >,
     required: false,
     default: null,
   },

+ 3 - 1
components/Ui/Input/AutocompleteWithAPI.vue

@@ -44,7 +44,9 @@ const props = defineProps({
     default: null,
   },
   searchFunction: {
-    type: Function as PropType<(research: string, field?: string) => Promise<Array<unknown>>>,
+    type: Function as PropType<
+      (research: string, field?: string) => Promise<Array<unknown>>
+    >,
     required: true,
   },
   data: {

+ 18 - 11
components/Ui/Input/Image.vue

@@ -27,7 +27,7 @@ Assistant de création d'image
             align="center"
             justify="center"
           >
-            <v-progress-circular :indeterminate="true" color="neutral"/>
+            <v-progress-circular :indeterminate="true" color="neutral" />
           </v-row>
 
           <div v-else>
@@ -66,7 +66,7 @@ Assistant de création d'image
                   type="file"
                   accept="image/*"
                   @change="uploadImage($event)"
-                >
+                />
                 {{ $t('upload_image') }}
               </button>
             </div>
@@ -94,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  } 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'
@@ -104,15 +104,15 @@ import FileUtils from '~/services/utils/fileUtils'
 
 interface CropperChangeEvent {
   coordinates: {
-    left: number;
-    top: number;
-    width: number;
-    height: number;
-  };
+    left: number
+    top: number
+    width: number
+    height: number
+  }
 }
 
 interface UploadResponse {
-  fileId: number;
+  fileId: number
 }
 
 const props = defineProps({
@@ -242,7 +242,12 @@ const defaultPosition = () => {
 /**
  * @see https://advanced-cropper.github.io/vue-advanced-cropper/components/cropper.html#defaultsize
  */
-const defaultSize = (params: { imageSize?: { width: number; height: number }, visibleArea?: { width: number; height: number } } | null): { width: number; height: number } | null => {
+const defaultSize = (
+  params: {
+    imageSize?: { width: number; height: number }
+    visibleArea?: { width: number; height: number }
+  } | null,
+): { width: number; height: number } | null => {
   if (!params) {
     return null
   }
@@ -354,7 +359,9 @@ const uploadImage = async (event: Event) => {
  * Lorsque le cropper change de position / taille, on met à jour les coordonnées
  * @param newCoordinates
  */
-const onCropperChange = ({ coordinates: newCoordinates }: CropperChangeEvent) => {
+const onCropperChange = ({
+  coordinates: newCoordinates,
+}: CropperChangeEvent) => {
   cropperConfig.value = newCoordinates
 }
 

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

@@ -80,10 +80,10 @@ const onInput = (
     countryChoice,
   }: {
     number: {
-      national: string | number;
+      national: string | number
       international: string | number
-    };
-    valid: boolean;
+    }
+    valid: boolean
     countryChoice: Record<string, unknown>
   },
 ) => {

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

@@ -28,11 +28,11 @@ Champs de saisie de texte, à placer dans un composant UiForm
 </template>
 
 <script setup lang="ts">
-import type { PropType, Ref  } from 'vue';
-import { ref  } from 'vue';
+import type { PropType, Ref } from 'vue'
+import { ref } from 'vue'
 import { useFieldViolation } from '~/composables/form/useFieldViolation'
 
-type ValidationRule = (value: string | number | null) => boolean | string;
+type ValidationRule = (value: string | number | null) => boolean | string
 
 const props = defineProps({
   /**

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

@@ -7,7 +7,11 @@ 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, index) in headersWithItem" :key="index" #[header.item]="slotProps">
+      <template
+        v-for="(header, index) in headersWithItem"
+        :key="index"
+        #[header.item]="slotProps"
+      >
         <slot :name="header.item" v-bind="slotProps">
           {{ slotProps.item[header.value] }}
         </slot>
@@ -18,9 +22,9 @@ Template de base d'un tableau interactif
 
 <script setup lang="ts">
 interface TableHeader {
-  value: string;
-  item?: string;
-  [key: string]: unknown;
+  value: string
+  item?: string
+  [key: string]: unknown
 }
 
 const props = defineProps({

+ 4 - 4
eslint.config.mjs

@@ -3,9 +3,9 @@ import withNuxt from './.nuxt/eslint.config.mjs'
 
 // Polyfill for structuredClone if it doesn't exist
 if (typeof structuredClone !== 'function') {
-  globalThis.structuredClone = function(obj) {
-    return JSON.parse(JSON.stringify(obj));
-  };
+  globalThis.structuredClone = function (obj) {
+    return JSON.parse(JSON.stringify(obj))
+  }
 }
 
 // Configuration de base personnalisée
@@ -80,7 +80,7 @@ const customConfig = [
       '@typescript-eslint/no-explicit-any': 0,
       'require-await': 0,
     },
-  }
+  },
 ]
 
 // Utiliser withNuxt avec l'option standalone: false pour éviter les conflits

+ 0 - 1
models/ApiResource.ts

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

+ 8 - 8
nuxt.config.ts

@@ -169,16 +169,16 @@ export default defineNuxtConfig({
     '@nuxt/image',
     'nuxt-prepare',
     'nuxt-vitalizer',
-    '@nuxt/eslint'
+    '@nuxt/eslint',
   ],
   vite: {
     esbuild: {
       drop: process.env.DEBUG ? [] : ['console', 'debugger'],
       tsconfigRaw: {
         compilerOptions: {
-          experimentalDecorators: true
-        }
-      }
+          experimentalDecorators: true,
+        },
+      },
     },
     ssr: {
       // with ssr enabled, this config is required to load vuetify properly
@@ -190,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 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 cols="12" sm="6" />
             </v-row>
             <v-row>
               <v-col cols="12" sm="6">

+ 380 - 380
pages/subscription.vue

@@ -24,403 +24,403 @@ Page 'Mon abonnement'
           </v-container>
         </UiExpansionPanel>
 
-      <UiExpansionPanel
-        v-if="dolibarrAccount && dolibarrAccount.contract"
-        title="service_detail"
-        icon="fas fa-info"
-      >
-        <v-container fluid class="container">
-          <v-row>
-            <v-col
-              v-for="line in dolibarrAccount.contract.lines"
-              :key="line.id"
-              cols="12"
-              lg="12"
-            >
-              <strong>{{ line.serviceLabel }}</strong> - {{ $t('until') }} :
-              {{ $d(line.dateEnd) }}
-            </v-col>
-
-            <v-col v-if="ability.can('manage', 'texto')" cols="12" lg="12">
-              <strong>{{ $t('remaining_sms_credit') }}</strong> -
-              <span
-                v-if="
-                  !mobytPending && mobytStatus !== null && mobytStatus.active
-                "
+        <UiExpansionPanel
+          v-if="dolibarrAccount && dolibarrAccount.contract"
+          title="service_detail"
+          icon="fas fa-info"
+        >
+          <v-container fluid class="container">
+            <v-row>
+              <v-col
+                v-for="line in dolibarrAccount.contract.lines"
+                :key="line.id"
+                cols="12"
+                lg="12"
               >
-                {{
-                  mobytStatus.money.toLocaleString($i18n.locale, {
-                    style: 'currency',
-                    currency: 'EUR',
-                  })
-                }}
-                {{
-                  i18n.t('convert_price_to_sms', {
-                    nb_sms: mobytStatus.amount,
-                  })
-                }}
-              </span>
-            </v-col>
-          </v-row>
-        </v-container>
-      </UiExpansionPanel>
-
-      <UiExpansionPanel
-        v-if="showDolibarrPanel"
-        title="bills"
-        icon="fas fa-file"
-      >
-        <v-container :fluid="true" class="container">
-          <v-row>
-            <v-table v-if="dolibarrAccount !== null">
-              <thead>
-                <tr>
-                  <th>{{ $t('reference') }}</th>
-                  <th>{{ $t('date') }}</th>
-                  <th>{{ $t('taxExcludedAmount') }}</th>
-                  <th>{{ $t('status') }}</th>
-                  <th/>
-                </tr>
-              </thead>
-              <tbody>
-                <tr v-for="bill in dolibarrAccount.bills" :key="bill.id">
-                  <td>{{ bill.ref }}</td>
-                  <td>{{ $d(bill.date) }}</td>
-                  <td>
-                    {{
-                      bill.taxExcludedAmount.toLocaleString($i18n.locale, {
-                        style: 'currency',
-                        currency: 'EUR',
-                      })
-                    }}
-                  </td>
-                  <td>
-                    {{ bill.paid === true ? $t('paid') : $t('unpaid') }}
-                  </td>
-                  <td>
-                    <a
-                      class="clickable"
-                      @click="downloadDolibarrBill(bill.ref)"
-                    >
-                      {{ $t('download') }}
-                    </a>
-                  </td>
-                </tr>
-              </tbody>
-            </v-table>
-          </v-row>
-        </v-container>
-      </UiExpansionPanel>
-
-      <UiExpansionPanel
-        v-if="!organizationProfile.isManagerProduct"
-        title="opentalent_offers"
-        icon="fas fa-plus"
-      >
-        <v-container fluid class="container">
-          <v-row
-            v-if="!md && mdAndUp && !organizationProfile.isSchool"
-            class="offer_title"
-          >
-            <v-col
-              cols="12"
-              :lg="
-                organizationProfile.isArtistPremiumProduct &&
-                !organizationProfile.isTrialActive
-                  ? 4
-                  : 8
-              "
-              sm="12"
+                <strong>{{ line.serviceLabel }}</strong> - {{ $t('until') }} :
+                {{ $d(line.dateEnd) }}
+              </v-col>
+
+              <v-col v-if="ability.can('manage', 'texto')" cols="12" lg="12">
+                <strong>{{ $t('remaining_sms_credit') }}</strong> -
+                <span
+                  v-if="
+                    !mobytPending && mobytStatus !== null && mobytStatus.active
+                  "
+                >
+                  {{
+                    mobytStatus.money.toLocaleString($i18n.locale, {
+                      style: 'currency',
+                      currency: 'EUR',
+                    })
+                  }}
+                  {{
+                    i18n.t('convert_price_to_sms', {
+                      nb_sms: mobytStatus.amount,
+                    })
+                  }}
+                </span>
+              </v-col>
+            </v-row>
+          </v-container>
+        </UiExpansionPanel>
+
+        <UiExpansionPanel
+          v-if="showDolibarrPanel"
+          title="bills"
+          icon="fas fa-file"
+        >
+          <v-container :fluid="true" class="container">
+            <v-row>
+              <v-table v-if="dolibarrAccount !== null">
+                <thead>
+                  <tr>
+                    <th>{{ $t('reference') }}</th>
+                    <th>{{ $t('date') }}</th>
+                    <th>{{ $t('taxExcludedAmount') }}</th>
+                    <th>{{ $t('status') }}</th>
+                    <th />
+                  </tr>
+                </thead>
+                <tbody>
+                  <tr v-for="bill in dolibarrAccount.bills" :key="bill.id">
+                    <td>{{ bill.ref }}</td>
+                    <td>{{ $d(bill.date) }}</td>
+                    <td>
+                      {{
+                        bill.taxExcludedAmount.toLocaleString($i18n.locale, {
+                          style: 'currency',
+                          currency: 'EUR',
+                        })
+                      }}
+                    </td>
+                    <td>
+                      {{ bill.paid === true ? $t('paid') : $t('unpaid') }}
+                    </td>
+                    <td>
+                      <a
+                        class="clickable"
+                        @click="downloadDolibarrBill(bill.ref)"
+                      >
+                        {{ $t('download') }}
+                      </a>
+                    </td>
+                  </tr>
+                </tbody>
+              </v-table>
+            </v-row>
+          </v-container>
+        </UiExpansionPanel>
+
+        <UiExpansionPanel
+          v-if="!organizationProfile.isManagerProduct"
+          title="opentalent_offers"
+          icon="fas fa-plus"
+        >
+          <v-container fluid class="container">
+            <v-row
+              v-if="!md && mdAndUp && !organizationProfile.isSchool"
+              class="offer_title"
             >
-              <span class="theme-artist"
-                >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 >
-                artistiques*</span
+              <v-col
+                cols="12"
+                :lg="
+                  organizationProfile.isArtistPremiumProduct &&
+                  !organizationProfile.isTrialActive
+                    ? 4
+                    : 8
+                "
+                sm="12"
               >
-            </v-col>
-          </v-row>
-
-          <v-row class="card-container">
-            <v-col
-              v-if="
-                organizationProfile.isArtistProduct ||
-                organizationProfile.isTrialActive
-              "
-              lg="4"
-              sm="12"
-              md="6"
-            >
-              <LayoutPagesSubscriptionCard
-                class="artistCard"
-                title="Logiciel Artist Standard"
-                :extra-header="
-                  organizationProfile.isArtistProduct
-                    ? 'Votre version actuelle'
-                    : undefined
+                <span class="theme-artist"
+                  >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 />
+                  artistiques*</span
+                >
+              </v-col>
+            </v-row>
+
+            <v-row class="card-container">
+              <v-col
+                v-if="
+                  organizationProfile.isArtistProduct ||
+                  organizationProfile.isTrialActive
                 "
-                color="artist"
-                :list="listCheck.artist"
+                lg="4"
+                sm="12"
+                md="6"
               >
-                <template #card.subTitle>
-                  <div class="priceBlock">
-                    <span v-if="organizationProfile.isCmf"
-                      ><strong>{{ $t('price_include_cmf') }}*</strong></span
-                    >
-                    <span v-else
-                      ><span class="price">{{
-                        formatCurrency(14.0, 'EUR')
-                      }}</span>
-                      TTC/mois*</span
-                    >
-                  </div>
-                </template>
-                <template #card.action>
-                  <v-row>
-                    <v-col
+                <LayoutPagesSubscriptionCard
+                  class="artistCard"
+                  title="Logiciel Artist Standard"
+                  :extra-header="
+                    organizationProfile.isArtistProduct
+                      ? 'Votre version actuelle'
+                      : undefined
+                  "
+                  color="artist"
+                  :list="listCheck.artist"
+                >
+                  <template #card.subTitle>
+                    <div class="priceBlock">
+                      <span v-if="organizationProfile.isCmf"
+                        ><strong>{{ $t('price_include_cmf') }}*</strong></span
+                      >
+                      <span v-else
+                        ><span class="price">{{
+                          formatCurrency(14.0, 'EUR')
+                        }}</span>
+                        TTC/mois*</span
+                      >
+                    </div>
+                  </template>
+                  <template #card.action>
+                    <v-row>
+                      <v-col
+                        v-if="
+                          !organizationProfile.isArtistProduct &&
+                          !organizationProfile.isTrialActive
+                        "
+                        cols="12"
+                      >
+                        <v-btn
+                          class="theme-artist btn"
+                          href="https://logiciels.opentalent.fr/opentalent-artist"
+                          target="_blank"
+                        >
+                          {{ $t('to_know_more') }}
+                          <i class="fa-solid fa-greater-than small" />
+                        </v-btn>
+                      </v-col>
+                      <v-col cols="12">
+                        <span
+                          v-if="organizationProfile.isCmf"
+                          class="special_conditions"
+                        >
+                          *En cas de non-réadhésion, il reste accessible au
+                          tarif public de 14€ TTC/mois (Tarif 2025. Abonnement
+                          payable annuellement).
+                        </span>
+                        <span v-else class="special_conditions">
+                          *Tarif public 2025. Abonnement payable annuellement.
+                        </span>
+                      </v-col>
+                    </v-row>
+                  </template>
+                </LayoutPagesSubscriptionCard>
+              </v-col>
+
+              <v-col v-if="organizationProfile.isArtist" lg="4" sm="12" md="6">
+                <LayoutPagesSubscriptionCard
+                  class="artistCard"
+                  title="Logiciel Artist Premium*"
+                  :extra-header="
+                    organizationProfile.isArtistPremiumProduct
+                      ? organizationProfile.isTrialActive
+                        ? `Version en cours d'essai J-${organizationProfile.trialCountDown}`
+                        : 'Votre version actuelle'
+                      : '1 mois d\'essai offert'
+                  "
+                  color="artist"
+                  :list="listCheck.artistPremium"
+                >
+                  <template #card.subTitle>
+                    <div
                       v-if="
-                        !organizationProfile.isArtistProduct &&
-                        !organizationProfile.isTrialActive
+                        !organizationProfile.isArtistPremiumProduct ||
+                        organizationProfile.isTrialActive
                       "
-                      cols="12"
+                      class="priceBlock"
                     >
-                      <v-btn
-                        class="theme-artist btn"
-                        href="https://logiciels.opentalent.fr/opentalent-artist"
-                        target="_blank"
+                      <span class="price">{{
+                        organizationProfile.isCmf
+                          ? formatCurrency(7.5, 'EUR')
+                          : formatCurrency(18.0, 'EUR')
+                      }}</span>
+                      TTC/mois**
+                    </div>
+                  </template>
+                  <template #card.action>
+                    <v-row>
+                      <v-col
+                        v-if="
+                          !organizationProfile.isArtistPremiumProduct &&
+                          (accessProfileStore.isAdmin ||
+                            accessProfileStore.isCaMember)
+                        "
+                        cols="12"
+                      >
+                        <v-btn class="btn trialBtn" @click="startTrial">
+                          {{ $t('try_premium_version') }}
+                          <i class="fa-solid fa-greater-than small" />
+                        </v-btn>
+                      </v-col>
+                      <v-col
+                        v-if="
+                          (!organizationProfile.isArtistPremiumProduct ||
+                            organizationProfile.isTrialActive) &&
+                          (accessProfileStore.isAdmin ||
+                            accessProfileStore.isCaMember)
+                        "
+                        cols="12"
                       >
-                        {{ $t('to_know_more') }}
-                        <i class="fa-solid fa-greater-than small"/>
-                      </v-btn>
-                    </v-col>
-                    <v-col cols="12">
-                      <span
-                        v-if="organizationProfile.isCmf"
-                        class="special_conditions"
+                        <v-btn class="theme-artist btn" @click="subscription">
+                          {{ $t('subscribe_to_the_offer') }}
+                          <i class="fa-solid fa-greater-than small" />
+                        </v-btn>
+                      </v-col>
+
+                      <v-col
+                        v-if="
+                          organizationProfile.isTrialActive &&
+                          (accessProfileStore.isAdmin ||
+                            accessProfileStore.isCaMember)
+                        "
+                        cols="12"
                       >
-                        *En cas de non-réadhésion, il reste accessible au tarif
-                        public de 14€ TTC/mois (Tarif 2025. Abonnement payable
-                        annuellement).
-                      </span>
-                      <span v-else class="special_conditions">
-                        *Tarif public 2025. Abonnement payable annuellement.
-                      </span>
-                    </v-col>
-                  </v-row>
-                </template>
-              </LayoutPagesSubscriptionCard>
-            </v-col>
-
-            <v-col v-if="organizationProfile.isArtist" lg="4" sm="12" md="6">
-              <LayoutPagesSubscriptionCard
-                class="artistCard"
-                title="Logiciel Artist Premium*"
-                :extra-header="
-                  organizationProfile.isArtistPremiumProduct
-                    ? organizationProfile.isTrialActive
-                      ? `Version en cours d'essai J-${organizationProfile.trialCountDown}`
-                      : 'Votre version actuelle'
-                    : '1 mois d\'essai offert'
+                        <v-btn class="stop_btn" @click="showStopTrialDialog">
+                          {{ $t('stop_trial') }}
+                        </v-btn>
+                      </v-col>
+                      <v-col cols="12">
+                        <span class="special_conditions">
+                          *Convient aux petites écoles sans besoins spécifiques
+                          de gestion pédagogique, de facturation, etc. Pour une
+                          solution complète optez pour Opentalent School
+                          <span
+                            v-if="
+                              !organizationProfile.isArtistPremiumProduct ||
+                              organizationProfile.isTrialActive
+                            "
+                          >
+                            <br />
+                            **Tarif
+                            <span v-if="organizationProfile.isCmf"
+                              >adhérent CMF</span
+                            ><span v-else>public</span> 2025. Abonnement payable
+                            annuellement.
+                          </span>
+                        </span>
+                      </v-col>
+                    </v-row>
+                  </template>
+                </LayoutPagesSubscriptionCard>
+              </v-col>
+
+              <v-col
+                lg="4"
+                sm="12"
+                md="6"
+                :offset="
+                  !md && mdAndUp ? (organizationProfile.isSchool ? 4 : 0) : 0
                 "
-                color="artist"
-                :list="listCheck.artistPremium"
               >
-                <template #card.subTitle>
-                  <div
-                    v-if="
-                      !organizationProfile.isArtistPremiumProduct ||
-                      organizationProfile.isTrialActive
-                    "
-                    class="priceBlock"
-                  >
-                    <span class="price">{{
-                      organizationProfile.isCmf
-                        ? formatCurrency(7.5, 'EUR')
-                        : formatCurrency(18.0, 'EUR')
-                    }}</span>
-                    TTC/mois**
-                  </div>
-                </template>
-                <template #card.action>
-                  <v-row>
-                    <v-col
-                      v-if="
-                        !organizationProfile.isArtistPremiumProduct &&
-                        (accessProfileStore.isAdmin ||
-                          accessProfileStore.isCaMember)
-                      "
-                      cols="12"
-                    >
-                      <v-btn class="btn trialBtn" @click="startTrial">
-                        {{ $t('try_premium_version') }}
-                        <i class="fa-solid fa-greater-than small"/>
-                      </v-btn>
-                    </v-col>
-                    <v-col
-                      v-if="
-                        (!organizationProfile.isArtistPremiumProduct ||
-                          organizationProfile.isTrialActive) &&
-                        (accessProfileStore.isAdmin ||
-                          accessProfileStore.isCaMember)
+                <LayoutPagesSubscriptionCard
+                  class="schoolCard"
+                  :title="
+                    !organizationProfile.isSchool
+                      ? 'Logiciel School Standard / Premium'
+                      : organizationProfile.isSchoolPremiumProduct
+                        ? 'Logiciel School Premium'
+                        : 'Logiciel School Standard'
+                  "
+                  :sub-title="!organizationProfile.isSchool ? 'Sur devis' : ''"
+                  :extra-header="
+                    organizationProfile.isSchool
+                      ? 'Votre version actuelle'
+                      : undefined
+                  "
+                  color="school"
+                  :list="listCheck.school"
+                >
+                  <template #card.action>
+                    <v-row>
+                      <v-col cols="12">
+                        <v-btn
+                          v-if="!organizationProfile.isSchool"
+                          class="theme-school btn"
+                          href="https://logiciels.opentalent.fr/opentalent-school"
+                          target="_blank"
+                        >
+                          {{ $t('to_know_more') }}
+                          <i class="fa-solid fa-greater-than small" />
+                        </v-btn>
+                      </v-col>
+                      <v-col cols="12">
+                        <span class="special_conditions">
+                          *Extranet disponible uniquement dans la version
+                          Opentalent School Premium
+                        </span>
+                      </v-col>
+                    </v-row>
+                  </template>
+                </LayoutPagesSubscriptionCard>
+              </v-col>
+            </v-row>
+          </v-container>
+        </UiExpansionPanel>
+
+        <UiExpansionPanel title="opentalent_options" icon="fas fa-plus">
+          <v-container fluid class="container card-container">
+            <v-row cols="12">
+              <v-col lg="3" sm="12" md="6">
+                <LayoutPagesSubscriptionCard
+                  class="optionsCard"
+                  title="SMS"
+                  sub-title="Option payante"
+                  color="primary"
+                  :list="listCheck.sms"
+                >
+                  <template #card.action>
+                    <v-btn
+                      class="theme-primary btn"
+                      :href="
+                        runtimeConfig.public.fileStorageBaseUrl +
+                        (organizationProfile.isCmf
+                          ? '/Bon_de_commande/Achat_SMS_CMF.pdf'
+                          : '/Bon_de_commande/Achat_SMS_Public.pdf')
                       "
-                      cols="12"
+                      target="_blank"
                     >
-                      <v-btn class="theme-artist btn" @click="subscription">
-                        {{ $t('subscribe_to_the_offer') }}
-                        <i class="fa-solid fa-greater-than small"/>
-                      </v-btn>
-                    </v-col>
+                      acheter des credits SMS
+                      <i class="fa-solid fa-greater-than small" />
+                    </v-btn>
+                  </template>
+                </LayoutPagesSubscriptionCard>
+              </v-col>
 
-                    <v-col
-                      v-if="
-                        organizationProfile.isTrialActive &&
-                        (accessProfileStore.isAdmin ||
-                          accessProfileStore.isCaMember)
+              <v-col lg="3" sm="12" md="6">
+                <LayoutPagesSubscriptionCard
+                  class="optionsCard"
+                  title="Nom de domaine"
+                  sub-title="Option payante"
+                  color="primary"
+                  :list="listCheck.domain"
+                >
+                  <template #card.action>
+                    <v-btn
+                      class="theme-primary btn"
+                      :href="
+                        runtimeConfig.public.fileStorageBaseUrl +
+                        '/Bon_de_commande/Nom_de_domaine.pdf'
                       "
-                      cols="12"
+                      target="_blank"
                     >
-                      <v-btn class="stop_btn" @click="showStopTrialDialog">
-                        {{ $t('stop_trial') }}
-                      </v-btn>
-                    </v-col>
-                    <v-col cols="12">
-                      <span class="special_conditions">
-                        *Convient aux petites écoles sans besoins spécifiques de
-                        gestion pédagogique, de facturation, etc. Pour une
-                        solution complète optez pour Opentalent School
-                        <span
-                          v-if="
-                            !organizationProfile.isArtistPremiumProduct ||
-                            organizationProfile.isTrialActive
-                          "
-                        >
-                          <br >
-                          **Tarif
-                          <span v-if="organizationProfile.isCmf"
-                            >adhérent CMF</span
-                          ><span v-else>public</span> 2025. Abonnement payable
-                          annuellement.
-                        </span>
-                      </span>
-                    </v-col>
-                  </v-row>
-                </template>
-              </LayoutPagesSubscriptionCard>
-            </v-col>
-
-            <v-col
-              lg="4"
-              sm="12"
-              md="6"
-              :offset="
-                !md && mdAndUp ? (organizationProfile.isSchool ? 4 : 0) : 0
-              "
-            >
-              <LayoutPagesSubscriptionCard
-                class="schoolCard"
-                :title="
-                  !organizationProfile.isSchool
-                    ? 'Logiciel School Standard / Premium'
-                    : organizationProfile.isSchoolPremiumProduct
-                      ? 'Logiciel School Premium'
-                      : 'Logiciel School Standard'
-                "
-                :sub-title="!organizationProfile.isSchool ? 'Sur devis' : ''"
-                :extra-header="
-                  organizationProfile.isSchool
-                    ? 'Votre version actuelle'
-                    : undefined
-                "
-                color="school"
-                :list="listCheck.school"
-              >
-                <template #card.action>
-                  <v-row>
-                    <v-col cols="12">
-                      <v-btn
-                        v-if="!organizationProfile.isSchool"
-                        class="theme-school btn"
-                        href="https://logiciels.opentalent.fr/opentalent-school"
-                        target="_blank"
-                      >
-                        {{ $t('to_know_more') }}
-                        <i class="fa-solid fa-greater-than small"/>
-                      </v-btn>
-                    </v-col>
-                    <v-col cols="12">
-                      <span class="special_conditions">
-                        *Extranet disponible uniquement dans la version
-                        Opentalent School Premium
-                      </span>
-                    </v-col>
-                  </v-row>
-                </template>
-              </LayoutPagesSubscriptionCard>
-            </v-col>
-          </v-row>
-        </v-container>
-      </UiExpansionPanel>
-
-      <UiExpansionPanel title="opentalent_options" icon="fas fa-plus">
-        <v-container fluid class="container card-container">
-          <v-row cols="12">
-            <v-col lg="3" sm="12" md="6">
-              <LayoutPagesSubscriptionCard
-                class="optionsCard"
-                title="SMS"
-                sub-title="Option payante"
-                color="primary"
-                :list="listCheck.sms"
-              >
-                <template #card.action>
-                  <v-btn
-                    class="theme-primary btn"
-                    :href="
-                      runtimeConfig.public.fileStorageBaseUrl +
-                      (organizationProfile.isCmf
-                        ? '/Bon_de_commande/Achat_SMS_CMF.pdf'
-                        : '/Bon_de_commande/Achat_SMS_Public.pdf')
-                    "
-                    target="_blank"
-                  >
-                    acheter des credits SMS
-                    <i class="fa-solid fa-greater-than small"/>
-                  </v-btn>
-                </template>
-              </LayoutPagesSubscriptionCard>
-            </v-col>
-
-            <v-col lg="3" sm="12" md="6">
-              <LayoutPagesSubscriptionCard
-                class="optionsCard"
-                title="Nom de domaine"
-                sub-title="Option payante"
-                color="primary"
-                :list="listCheck.domain"
-              >
-                <template #card.action>
-                  <v-btn
-                    class="theme-primary btn"
-                    :href="
-                      runtimeConfig.public.fileStorageBaseUrl +
-                      '/Bon_de_commande/Nom_de_domaine.pdf'
-                    "
-                    target="_blank"
-                  >
-                    souscrire à l'option
-                    <i class="fa-solid fa-greater-than small"/>
-                  </v-btn>
-                </template>
-              </LayoutPagesSubscriptionCard>
-            </v-col>
-          </v-row>
-        </v-container>
-      </UiExpansionPanel>
-    </v-expansion-panels>
+                      souscrire à l'option
+                      <i class="fa-solid fa-greater-than small" />
+                    </v-btn>
+                  </template>
+                </LayoutPagesSubscriptionCard>
+              </v-col>
+            </v-row>
+          </v-container>
+        </UiExpansionPanel>
+      </v-expansion-panels>
     </LayoutContainer>
 
     <LayoutDialogTrialAlreadyDid

+ 13 - 12
public/maintenance.html

@@ -1,10 +1,10 @@
 <!-- public/maintenance.html -->
-<!DOCTYPE html>
+<!doctype html>
 <html>
   <head>
     <title>Site en maintenance</title>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <style>
       body {
         font-family: Arial, sans-serif;
@@ -63,20 +63,21 @@
   </head>
   <body>
     <div class="maintenance-container">
-      <img src="/images/logos/Logo_Opentalent_Griffe.png" alt="Opentalent Logo" class="logo">
-      <h1>
-        Site en maintenance
-      </h1>
+      <img
+        src="/images/logos/Logo_Opentalent_Griffe.png"
+        alt="Opentalent Logo"
+        class="logo"
+      />
+      <h1>Site en maintenance</h1>
       <p>
-        Notre site est actuellement en maintenance. Nous travaillons à améliorer votre
-        expérience et serons de retour très bientôt. Veuillez revenir plus tard.
+        Notre site est actuellement en maintenance. Nous travaillons à améliorer
+        votre expérience et serons de retour très bientôt. Veuillez revenir plus
+        tard.
       </p>
       <div class="maintenance-date">
         Date de maintenance : mercredi 04 juin, de 12h00 à 13h00
       </div>
-      <div class="status-indicator">
-        Maintenance en cours
-      </div>
+      <div class="status-indicator">Maintenance en cours</div>
     </div>
   </body>
 </html>

+ 5 - 1
services/data/entityManager.ts

@@ -1,4 +1,8 @@
-import type { Query as PiniaOrmQuery, Repository, 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'

+ 0 - 1
services/data/normalizer/hydraNormalizer.ts

@@ -178,7 +178,6 @@ class HydraNormalizer {
   protected static denormalizeEntity(model: typeof ApiResource, item: AnyJson) {
     item.id = this.getItemIdValue(model, item)
 
-
     const instance = new model(item)
     const iriEncodedFields = model.getIriEncodedFields()
 

+ 0 - 1
services/layout/menuComposer.ts

@@ -54,7 +54,6 @@ export default class MenuComposer {
     layoutState: LayoutState,
   ) {
     for (const builderClass of MenuComposer.builders) {
-
       const builder: MenuBuilder = new builderClass(
         runtimeConfig,
         ability,

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

@@ -1,5 +1,5 @@
 import { describe, test, vi, expect, beforeEach, afterEach } from 'vitest'
-import type { Repository, 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'