Преглед изворни кода

Merge branch 'hotfix/V8-7468-mettre-en-place-le-systme-de-con' into develop

Olivier Massot пре 5 месеци
родитељ
комит
9341907f3a

+ 48 - 0
components/Layout/Dialog/RefreshNeeded.vue

@@ -0,0 +1,48 @@
+<!--
+Une boite de dialogue signalant que la page doit être rechargée (par exemple
+parce que le accessProfile a été modifié dans un autre onglet).
+-->
+<template>
+  <LazyLayoutDialog :show="showRefreshNeededDialog" theme="info">
+    <template #dialogType>{{ $t('information') }}</template>
+    <template #dialogTitle>{{ $t('refresh_needed') }}</template>
+    <template #dialogText>
+      <v-card-text class="text">
+        <p>
+          {{ $t('refresh_needed_message') }}
+        </p>
+      </v-card-text>
+    </template>
+    <template #dialogBtn>
+      <v-btn class="submitBtn theme-info" @click="refreshPage">
+        {{ $t('refresh_page') }}
+      </v-btn>
+    </template>
+  </LazyLayoutDialog>
+</template>
+
+<script setup lang="ts">
+import { useAccessProfileStore } from '~/stores/accessProfile'
+
+const accessProfileUpdated = ref(false)
+
+const accessProfileStore = useAccessProfileStore()
+const pageStore = usePageStore()
+
+const showRefreshNeededDialog = computed(
+  () => accessProfileUpdated.value && !pageStore.loading,
+)
+
+onMounted(() => {
+  accessProfileStore.$subscribe(() => {
+    accessProfileUpdated.value = true
+  })
+})
+
+const refreshPage = () => {
+  pageStore.loading = true
+  window.location.reload()
+}
+</script>
+
+<style scoped lang="scss"></style>

+ 5 - 1
i18n/lang/fr.json

@@ -763,5 +763,9 @@
   "try_premium_version": "Essayer la version premium",
   "subscribe_to_the_offer": "Souscrire à l'offre",
   "to_know_more": "En savoir plus",
-  "placeListMenuKey": "Lieu"
+  "placeListMenuKey": "Lieu",
+  "information": "Information",
+  "refresh_needed": "Actualisation requise",
+  "refresh_needed_message": "La page a besoin d'être actualisée pour afficher les dernières modifications.",
+  "refresh_page": "Actualiser la page"
 }

+ 2 - 0
layouts/default.vue

@@ -6,6 +6,8 @@
     <v-app>
       <LayoutLoadingScreen />
 
+      <LayoutDialogRefreshNeeded />
+
       <LayoutHeader />
 
       <LayoutMainMenu>

+ 2 - 0
layouts/parameters.vue

@@ -6,6 +6,8 @@
     <v-app>
       <LayoutLoadingScreen />
 
+      <LayoutDialogRefreshNeeded />
+
       <LayoutHeader />
 
       <LayoutParametersMenu />

+ 1 - 1
middleware/routing.global.ts

@@ -19,7 +19,7 @@ export default defineNuxtRouteMiddleware((to, _) => {
     const runtimeConfig = useRuntimeConfig()
     if (
       runtimeConfig.public.env === 'production' &&
-      (name === 'cmf_licence_page')
+      name === 'cmf_licence_page'
     ) {
       const { redirectToHome } = useRedirect()
       redirectToHome()

+ 29 - 0
pages/dev/poc_refresh_needed.vue

@@ -0,0 +1,29 @@
+<!--
+La boite de dialogue 'RefreshNeeded' est supposé s'afficher dès lors
+que l'accessProfile est modifié.
+-->
+
+<template>
+  <div>
+    <h1>POC Refresh Needed</h1>
+
+    <LayoutDialogRefreshNeeded />
+
+    <v-btn @click="onUpdateClick">Update profile</v-btn>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { useAccessProfileStore } from '~/stores/accessProfile'
+
+definePageMeta({
+  layout: false,
+})
+
+const accessProfile = useAccessProfileStore()
+
+const onUpdateClick = () => {
+  accessProfile.setActivityYear(accessProfile.activityYear + 1)
+  console.log('activity year updated to ' + accessProfile.activityYear)
+}
+</script>

+ 11 - 2
plugins/init.server.ts

@@ -9,6 +9,7 @@ export default defineNuxtPlugin(async () => {
     return
   }
 
+  const runtimeConfig = useRuntimeConfig()
   const { redirectToLogout } = useRedirect()
 
   const bearer: CookieRef<string | null> = useCookie('BEARER') ?? null
@@ -17,13 +18,21 @@ export default defineNuxtPlugin(async () => {
     useCookie('SwitchAccessId') ?? null
 
   if (accessCookieId.value === null || Number.isNaN(accessCookieId.value)) {
-    redirectToLogout()
+    if (runtimeConfig.public.env === 'production') {
+      redirectToLogout()
+    } else {
+      console.error('Missing access id')
+    }
     return
   }
 
   const accessId: number = parseInt(accessCookieId.value)
   if (isNaN(accessId)) {
-    redirectToLogout()
+    if (runtimeConfig.public.env === 'production') {
+      redirectToLogout()
+    } else {
+      console.error('Invalid access id')
+    }
     return
   }
 

+ 5 - 0
stores/accessProfile.ts

@@ -160,6 +160,10 @@ export const useAccessProfileStore = defineStore('accessProfile', () => {
     setFamilyAccesses(Array.from(profile.familyAccesses))
   }
 
+  const setActivityYear = (year: number) => {
+    activityYear.value = year
+  }
+
   const setHistorical = (past: boolean, present: boolean, future: boolean) => {
     historical.value = <Historical>{
       past,
@@ -213,6 +217,7 @@ export const useAccessProfileStore = defineStore('accessProfile', () => {
     setFamilyAccesses,
     initiateProfile,
     setProfile,
+    setActivityYear,
     setHistorical,
     setHistoricalRange,
     preferencesId,

+ 7 - 1
stores/sse.ts

@@ -17,7 +17,13 @@ export const useSseStore = defineStore('sse', () => {
     switch (event.operation) {
       case 'update':
       case 'create':
-        em.save(instance, true)
+        if (model.entity === 'my_profile') {
+          const accessProfileStore = useAccessProfileStore()
+          accessProfileStore.initiateProfile(instance)
+        } else {
+          // Cas générique d'une entité standard
+          em.save(instance, true)
+        }
         break
 
       case 'delete':