Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

develop to main #187

Merged
merged 20 commits into from
Dec 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
c937aa0
FEAT ITEM-402-front-empecher-la-creation-de-nouvelles-v-alert-si-une-…
EryneKL Nov 26, 2024
44e8ce8
FEAT ITEM-402-front-empecher-la-creation-de-nouvelles-v-alert-si-une-…
EryneKL Nov 27, 2024
508150d
Merge branch 'develop' into ITEM-402-front-empecher-la-creation-de-no…
EryneKL Nov 28, 2024
04b9abd
Merge pull request #182 from abes-esr/ITEM-402-front-empecher-la-crea…
SamuelQuetin Nov 29, 2024
3d0469e
ITEM-366 Ajouter bouton stop dans le tableau de bord et de l'appel au ws
Dec 3, 2024
a1e31bb
FEAT ITEM-413-front-afficher-plusieurs-messages-en-meme-temps-sans-qu…
EryneKL Dec 4, 2024
5f068c8
FEAT ITEM-413-front-afficher-plusieurs-messages-en-meme-temps-sans-qu…
EryneKL Dec 4, 2024
5af2751
TEM-371 FEAT : Afficher état dans tableau de bord avec bonne couleur
Dec 5, 2024
3595fbb
ITEM-425 archivage
Dec 5, 2024
d7c2d22
FIX ITEM-423-front-rediriger-vers-le-tableau-de-bord-recouvrement-a-l…
EryneKL Dec 5, 2024
cef5246
Merge pull request #184 from abes-esr/ITEM-423-front-rediriger-vers-l…
pierre-maraval Dec 5, 2024
37ffd1b
ITEM-370 ajout condition pour Affichage des fichiers
Dec 5, 2024
96ed613
Merge remote-tracking branch 'origin/develop' into ITEM-331-BOUTON-ST…
Dec 5, 2024
ca18206
FIX ITEM-413-front-afficher-plusieurs-messages-en-meme-temps-sans-qui…
EryneKL Dec 5, 2024
659541b
Merge pull request #183 from abes-esr/ITEM-413-front-afficher-plusieu…
SamuelQuetin Dec 5, 2024
caa287e
Merge pull request #185 from abes-esr/ITEM-331-BOUTON-STOP-TRAITEMENT
EryneKL Dec 5, 2024
e1de0a4
FIX ITEM-413-front-afficher-plusieurs-messages-en-meme-temps-sans-qui…
EryneKL Dec 5, 2024
7143ef7
Refactor : modification intitulé état traitement annulé
pierre-maraval Dec 5, 2024
998b6ef
FIX ITEM-413-front-afficher-plusieurs-messages-en-meme-temps-sans-qui…
EryneKL Dec 5, 2024
42c2d90
Merge pull request #186 from abes-esr/ITEM-413-front-afficher-plusieu…
SamuelQuetin Dec 5, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
170 changes: 99 additions & 71 deletions src/App.vue
Original file line number Diff line number Diff line change
@@ -1,40 +1,46 @@
<template>
<v-app class="h-100 overflow-hidden">
<maintenance/>
<nav>
<Header @logout-success="onLogout" @toggle-drawer="toggleDrawer"/>
<Navbar :drawer="drawer" @close="drawer = false"/>
</nav>
<v-main class="d-flex flex-column overflow-auto">
<div class="error-stack">
<v-alert
v-for="(error, index) in errorStack"
:key="index"
color="error"
icon="$error"
:title="error.message"
variant="flat"
border="start"
class="mb-2 custom-alert"
closable
@click:close="closeAlert(index)"
>
{{ error.description }}
</v-alert>
</div>
<div style="flex-grow: 10;">
<router-view v-slot="{ Component }">
<component
:is="Component"
@backendError="addError"
@backendSuccess="clearErrors"
/>
</router-view>
</div>
<InfoAppBanner v-if="!authenticated"/>
<Footer style="flex-basis: 0;"/>
</v-main>
</v-app>
<v-app class="h-100 overflow-hidden">
<maintenance/>
<nav>
<Header @logout-success="onLogout" @toggle-drawer="toggleDrawer"/>
<Navbar :drawer="drawer" @close="drawer = false" />
</nav>
<v-main class="d-flex flex-column overflow-auto">
<div class="notificationContainer">
<v-slide-y-transition group>
<v-alert
class="alertMessage"
v-for="notification in errorsNetworkList"
:key="notification[0]"
>
<p class="mb-4">{{ notification[1].message }}</p>
<p class="mb-4">{{ notification[1].description }}</p>
<div style="text-align: right"><v-btn @click="removeNotification(notification[0])" value="Fermer le message d'erreur">FERMER</v-btn></div>
</v-alert>
<v-alert
class="alertMessage"
v-for="notification in errorsList"
:key="notification[0]"
>
<p class="mb-4">{{ notification[1].message }}</p>
<p class="mb-4">{{ notification[1].description }}</p>
<div style="text-align: right"><v-btn @click="removeNotification(notification[0])" value="Fermer le message d'erreur">FERMER</v-btn></div>
</v-alert>
</v-slide-y-transition>
</div>
<div style="flex-grow: 10;">
<router-view v-slot="{ Component }">
<component
:is="Component"
@backendError="addError"
@backendSuccess="clearErrors"
/>
</router-view>
</div>
<InfoAppBanner v-if="!authenticated" />
<Footer style="flex-basis: 0;" />
</v-main>
</v-app>
</template>

<script setup>
Expand All @@ -49,9 +55,16 @@ import { useAuthStore } from '@/store/authStore';
import { useRoute } from 'vue-router';
import Maintenance from '@/components/Structure/Maintenance.vue';

const errorStack = ref([]);
const drawer = ref(false);

const alertType = ref(null)

const errorsList = ref(new Map())

const errorsNetworkList = ref(new Map())

let isErrorNetwork = false

const authStore = useAuthStore();

const authenticated = computed(() => {
Expand All @@ -68,24 +81,28 @@ watch(
message: 'Erreur réseau',
description: 'Service indisponible : merci de réessayer ultérieurement.'
};
errorStack.value.push(newError);
const notificationId = self.crypto.randomUUID()
errorsList.value.set(notificationId, newError)
}
},
{ immediate: true } // Option pour exécuter le watcher dès le montage du composant
);

function addError(error) {
const notificationId = self.crypto.randomUUID()
alertType.value = "error"
let newError = {
message: 'Erreur',
description: ''
};
if (!error.response) {
newError.message = 'Erreur réseau : ' + error.code;
newError.description = 'Service indisponible : merci de réessayer ultérieurement.';
} else {
if (error.response.status === HttpStatusCode.NotFound) {
newError.message = 'Impossible de récupérer les données';
newError.description = 'Vérifiez que vos urls d\'appel au serveur sont correctes ainsi que vos clés d\'autorisation ' + '(' + error.config.url + ')';
}
if(!error.response){
isErrorNetwork = true
newError.message = 'Erreur réseau : ' + error.code
newError.description = 'Service indisponible : merci de réessayer ultérieurement.'
}else{
if (error.response.status === HttpStatusCode.NotFound){
newError.message = 'Impossible de récupérer les données'
newError.description = 'Vérifiez que vos urls d\'appel au serveur sont correctes ainsi que vos clés d\'autorisation ' + '(' + error.config.url + ')'
}
if (error.response.status === HttpStatusCode.Forbidden) {
newError.message = 'Accès rejeté';
Expand All @@ -99,8 +116,7 @@ function addError(error) {
newError.message = 'Accès rejeté';
newError.description = 'Mauvaise requête : contrôlez les paramètres de votre requête et observez les logs du serveur pour plus d\'informations ' + '(' + error.config.url + ')';
}
if (error.response.status.toString()
.startsWith('5')) {
if (error.response.status.toString().startsWith('5')) {
newError.message = 'Problème de disponibilité du serveur';
newError.description = 'Retentez plus tard. Vérifiez la disponibilité de la base de donnée (Etat des serveurs) en cliquant en bas à gauche sur l\'icone de paramètres. Si le problème perdure, contactez l\'assistance';
}
Expand All @@ -114,15 +130,7 @@ function addError(error) {
if (error.request.url) {
newError.description = 'Problème de disponibilité du fichier demandé';
}
errorStack.value.push(newError);
}

function clearErrors() {
errorStack.value = [];
}

function closeAlert(index) {
errorStack.value.splice(index, 1);
addNotification(notificationId, newError)
}

function onLogout() {
Expand All @@ -132,33 +140,53 @@ function onLogout() {
function toggleDrawer() {
drawer.value = !drawer.value;
}

function addNotification(notificationId, message) {
if (isErrorNetwork) {
errorsNetworkList.value.set(notificationId, message)
setTimeout(() => removeNotification(notificationId), 9000) // impose un timeout au v-alert pour que les alertes de type ERR_NETWORK ne surchargent pas la Map errorsList
isErrorNetwork = false;
} else {
errorsList.value.set(notificationId, message)
}
}

function removeNotification(notificationId) {
if (notificationId != null) {
errorsList.value.delete(notificationId)
errorsNetworkList.value.delete(notificationId)
}
}

function clearErrors() {
errorsNetworkList.value.clear();
}

</script>

<style>
/*Declaré en global*/


/* Style des card contenant les choix proposés aux utilisateurs et utilisatrices */
.custom-card-title {
background-color: v-bind('$vuetify.theme.current.colors.primary');
color: v-bind('$vuetify.theme.current.colors.textColor');
}

.error-stack {
/* Style du container comprenant les messages d'erreur */
.notificationContainer {
position: fixed;
top: 64px; /* Ajustez cette valeur en fonction de la hauteur de votre barre de navigation */
left: 0;
right: 0;
z-index: 100;
padding: 10px;
top: 80px;
right: 10px;
display: grid;
grid-gap: 0.5em;
z-index: 99;
}

.custom-alert {
background-color: #FFEBEE !important; /* Fond rouge clair */
color: #B71C1C !important; /* Texte rouge foncé */
opacity: 1 !important; /* Assurez-vous que l'alerte est complètement opaque */
/* Permet d'avoir le bon formatage du message d'erreur sur la page de connexion */
.alertMessage {
background-color: rgb(var(--v-theme-error));
color: white;
}

.custom-alert :deep(.v-alert__close) {
color: #B71C1C !important; /* Assure que le bouton de fermeture est de la même couleur que le texte */
}
</style>
4 changes: 2 additions & 2 deletions src/components/MenuDownloadFile.vue
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,8 @@ const isEnrichiAvailable = computed(() =>
(idEtatCurrentDemande.value >= 4 && props.demande.type === 'MODIF') ||
(idEtatCurrentDemande.value >= 5 && props.demande.type === 'SUPP')
)
const isResultatAvailable = computed(() => idEtatCurrentDemande.value >= 7 && idEtatCurrentDemande.value !== 8)
const isSauvegardeAvailable = computed(() => idEtatCurrentDemande.value >= 7)
const isResultatAvailable = computed(() => idEtatCurrentDemande.value >= 7 && idEtatCurrentDemande.value !== 8 && props.demande.pourcentageProgressionTraitement > 0)
const isSauvegardeAvailable = computed(() => idEtatCurrentDemande.value >= 7 && props.demande.pourcentageProgressionTraitement > 0)

onMounted(() => {
itemService.getEtatsDemande()
Expand Down
25 changes: 25 additions & 0 deletions src/components/Supp/BtnStop.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<template>
<v-btn icon="mdi-stop" variant="plain" @click="click">
</v-btn>
<dialog-confirmation-stop v-model="dialog" :id="id" @stop="emits('stop')">
</dialog-confirmation-stop>
</template>
<script setup>
import DialogConfirmationStop from "@/components/Supp/DialogConfirmationStop.vue";
import {ref} from "vue";

const emits = defineEmits(['stop'])
const props = defineProps({
id:{
required:true,
type:Number
}
})
const dialog = ref(false);

function click() {
dialog.value = true
}


</script>
33 changes: 33 additions & 0 deletions src/components/Supp/DialogConfirmationStop.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<template>
<v-dialog v-model="dialog" width="500">
<v-card>
<v-card-title>Confirmation</v-card-title>
<v-card-text>
Voulez vous vraiment stopper le traitement sur la demande N°{{id}} ?
</v-card-text>
<v-card-actions>
<v-btn @click="dialog=false">Refuser</v-btn>
<v-btn @click="stopDemande">Confirmer</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</template>
<script setup>
import itemService from "@/service/ItemService";

const emits = defineEmits(['stop'])
const dialog = defineModel();
const props = defineProps({
id:{
required:true,
type:Number
}
})

function stopDemande(){
itemService.stopDemande(props.id).finally(() => {
dialog.value = false;
emits('stop');
});
}
</script>
7 changes: 5 additions & 2 deletions src/plugins/vuetify.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ const itemLightTheme = {
disabled: '#808080',
archived: '#795548',
saisised: '#333333',
waited: '#EC6839'
waited: '#FFC400',
stopped: '#EC6839'
},
variables: {
'border-color': '#000000',
Expand Down Expand Up @@ -86,7 +87,8 @@ const itemDarkTheme = {
disabled: '#808080',
archived: '#795548',
saisised: '#333333',
waited: '#EC6839'
waited: '#FFC400',
stopped: '#EC6839'
},
variables: {
'border-color': '#FFFFFF',
Expand Down Expand Up @@ -129,6 +131,7 @@ const itemRngTheme = {
archived: generateRandomHexColor(),
saisised: generateRandomHexColor(),
waited: generateRandomHexColor(),
stopped: generateRandomHexColor()
}
}

Expand Down
5 changes: 4 additions & 1 deletion src/service/ItemService.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ export class ItemService {
}

login(login, password) {
const url = import.meta.env.VITE_API_URL + `signin`;
//console.info('appel:' + url);

return this.client.post(`signin`, {username: login, password: password})
Expand Down Expand Up @@ -167,6 +166,10 @@ export class ItemService {
return response.data
})
}

stopDemande(id) {
return this.client.patch('stopDemandeSupp/' + id);
}
}

export default new ItemService()
26 changes: 8 additions & 18 deletions src/views/Recouvrement/RecouvSteps.vue
Original file line number Diff line number Diff line change
Expand Up @@ -63,28 +63,17 @@
</v-stepper-window-item>
</v-stepper-window>
</v-stepper>
<v-dialog
v-model="dialog"
width="500"
>
<v-card>
<v-card-title class="headline" primary-title>Traitement validé</v-card-title>
<v-card-text>Votre demande est en cours de traitement.<br/>Un mail vous sera envoyé quand celui-ci sera
terminé.
<br>Vous pouvez retrouver l'ensemble de vos demandes sur votre tableau de bord ITEM. Rubrique "Gérer mes
taux de recouvrement".
</v-card-text>
<v-divider></v-divider>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="primary" @click="router.push('recouvrement-tableau')" aria-label="OK">OK</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-col>
</v-row>
</v-col>
</v-container>
<dialog-lancer-traitement v-model="dialog"
:is-loading="isLoading"
rubrique="Gérer mes recouvrements"
route="recouvrement-tableau"
body="Voulez-vous démarrer le traitement de votre demande de recouvrement ?"
@launch="isLoading = false">
</dialog-lancer-traitement>
<dialog-suppression v-model="suppDialog" :demande="demande" return-to-accueil></dialog-suppression>
</template>

Expand All @@ -96,6 +85,7 @@ import itemService from '@/service/ItemService';
import router from '@/router';
import DialogSuppression from '@/components/Dialog/DialogSuppression.vue';
import RecapDemande from '@/components/RecapDemande.vue';
import DialogLancerTraitement from '@/components/Dialog/DialogLancerTraitement.vue'

const props = defineProps({id : {type: String}});
const emits = defineEmits(['backendError']);
Expand Down
Loading
Loading