agenda finition

This commit is contained in:
alma 2026-01-21 00:15:11 +01:00
parent fdc7ea8b24
commit 77d96cedac
5 changed files with 205 additions and 8 deletions

View File

@ -88,6 +88,56 @@ const colorPalette = [
---
### 4. **Suppression automatique du calendrier** (`/app/api/groups/[groupId]/route.ts`) ✨ **NOUVEAU**
#### Modifications au DELETE endpoint :
Lorsqu'un groupe est supprimé, le calendrier associé est maintenant automatiquement supprimé :
1. **Récupération du nom du groupe**
- Appel à Keycloak avant suppression pour obtenir le nom du groupe
2. **Suppression du calendrier**
- Recherche du calendrier nommé `"Groupe: {nom}"`
- Suppression via `prisma.calendar.deleteMany()`
- Logs en cas de succès ou d'échec
3. **Suppression du groupe**
- Suppression du groupe de Keycloak
- Même si la suppression du calendrier échoue, le groupe est quand même supprimé
#### Impact :
- ✅ Plus de calendriers orphelins dans la base
- ✅ Nettoyage automatique de la base de données
- ✅ Agenda plus propre après suppression de groupes
---
### 5. **Enrichissement API groupes utilisateur** (`/app/api/users/[userId]/groups/route.ts`) ✨ **NOUVEAU**
#### Modifications au GET endpoint :
L'API qui récupère les groupes d'un utilisateur enrichit maintenant les données avec les couleurs des calendriers :
1. **Récupération des groupes**
- Appel à Keycloak pour obtenir les groupes de l'utilisateur
2. **Enrichissement avec couleurs**
- Pour chaque groupe, recherche du calendrier associé dans Prisma
- Ajout de la propriété `calendarColor` à chaque groupe
- Valeur `null` si pas de calendrier trouvé
3. **Retour enrichi**
- Les groupes retournés contiennent maintenant `calendarColor`
- Visible immédiatement dans la page Vision
#### Impact :
- ✅ La page Vision affiche les bonnes couleurs
- ✅ Pas besoin de requêtes supplémentaires côté client
- ✅ Une seule API call pour tout charger
---
## 🔄 Flux de données
### Chargement initial :
@ -129,9 +179,10 @@ La couleur du calendrier de groupe est maintenant visible dans :
- Liste des calendriers (pastille à gauche)
- Événements dans le calendrier (barre colorée)
4. **`/vision`** - Page visioconférences
- Calendrier des réunions
- Événements du jour
4. **`/vision`** - Page visioconférences ✨ **NOUVEAU**
- Cercle coloré autour de l'icône groupe
- Icône en blanc si couleur personnalisée, en bleu sinon
- Couleur par défaut : `#DBEAFE` (bleu clair)
5. **Widgets calendrier** - Tous les composants calendrier
- `calendar-widget.tsx`
@ -167,6 +218,20 @@ La couleur du calendrier de groupe est maintenant visible dans :
4. Aller sur `/agenda`
5. ✅ Vérifier : Couleur visible dans le calendrier
### Test 5 : Affichage dans Vision ✨ **NOUVEAU**
1. Modifier la couleur d'un groupe
2. Aller sur `/vision`
3. ✅ Vérifier : Le cercle autour de l'icône du groupe a la bonne couleur
4. ✅ Vérifier : L'icône est en blanc si couleur personnalisée
### Test 6 : Suppression du calendrier ✨ **NOUVEAU**
1. Créer un nouveau groupe
2. Vérifier dans `/agenda` que le calendrier est créé
3. Supprimer le groupe dans `/missions/equipe`
4. Aller sur `/agenda`
5. ✅ Vérifier : Le calendrier du groupe a été supprimé
6. ✅ Vérifier : Aucune erreur dans la console
---
## 📁 Fichiers modifiés
@ -175,6 +240,9 @@ La couleur du calendrier de groupe est maintenant visible dans :
- `app/api/groups/[groupId]/calendar/route.ts` (nouveau endpoint API)
### Fichiers modifiés :
#### 1. Gestion des couleurs :
- `components/groups/groups-table.tsx`
- Import `Palette` de lucide-react
- Ajout interface `calendarColor?` à Group
@ -196,6 +264,32 @@ La couleur du calendrier de groupe est maintenant visible dans :
- Dialog de sélection de couleur
- Affichage icône colorée
#### 2. Affichage dans Vision : ✨ **NOUVEAU**
- `app/vision/page.tsx`
- Ajout `calendarColor?` à interface `Group`
- Modification affichage du cercle groupe pour utiliser `group.calendarColor`
- Style dynamique : couleur personnalisée ou défaut `#DBEAFE`
- Icône blanche si couleur personnalisée, bleue sinon
#### 3. Suppression automatique : ✨ **NOUVEAU**
- `app/api/groups/[groupId]/route.ts`
- Endpoint DELETE modifié
- Import `prisma` et `logger`
- Récupération des détails du groupe avant suppression
- Suppression du calendrier associé via `prisma.calendar.deleteMany()`
- Logs détaillés
#### 4. Enrichissement API : ✨ **NOUVEAU**
- `app/api/users/[userId]/groups/route.ts`
- Import `prisma`
- Endpoint GET enrichi
- Recherche du calendrier pour chaque groupe
- Ajout de `calendarColor` aux données retournées
- Gestion d'erreurs pour chaque groupe
---
## 🔮 Améliorations futures possibles
@ -231,6 +325,29 @@ La couleur du calendrier de groupe est maintenant visible dans :
---
## 🐛 Problèmes résolus
### ✅ Problème 1 : Calendriers orphelins après suppression de groupe
**Symptôme** : Quand on supprimait un groupe, son calendrier restait dans la base de données et s'affichait dans l'agenda.
**Solution** : Modification du endpoint DELETE pour supprimer automatiquement le calendrier associé lors de la suppression du groupe.
**Commit** : Ajout de la suppression automatique dans `/app/api/groups/[groupId]/route.ts`
---
### ✅ Problème 2 : Couleurs non visibles dans la page Vision
**Symptôme** : Les couleurs de calendrier personnalisées n'apparaissaient pas dans `/vision`, tous les groupes avaient la même couleur bleue.
**Solution** :
1. Enrichissement de l'API `/api/users/[userId]/groups` pour inclure `calendarColor`
2. Modification de l'interface `Group` dans `vision/page.tsx`
3. Affichage dynamique des couleurs dans l'UI
**Commit** : Enrichissement API et affichage dans Vision
---
## 🐛 Problèmes connus
Aucun problème connu pour le moment.
@ -261,5 +378,21 @@ Pour toute question ou problème :
---
**Date de création** : 20 janvier 2026
**Version** : 1.0
**Dernière mise à jour** : 21 janvier 2026
**Version** : 1.2
**Auteur** : Senior Developer Assistant
### 📝 Changelog
#### v1.2 (21 janvier 2026)
- ✨ Ajout : Suppression automatique du calendrier lors de la suppression d'un groupe
- ✨ Ajout : Affichage des couleurs dans la page Vision (`/vision`)
- 🔧 Modification : Enrichissement de l'API `/api/users/[userId]/groups` avec les couleurs
- 📚 Documentation : Ajout de nouveaux tests et problèmes résolus
#### v1.1 (20 janvier 2026)
- 🐛 Fix : Problèmes de déploiement Docker
- 📚 Documentation : Ajout du guide de déploiement
#### v1.0 (20 janvier 2026)
- ✨ Version initiale avec modification des couleurs de calendrier

View File

@ -144,6 +144,35 @@ export async function DELETE(req: Request, props: { params: Promise<{ groupId: s
const token = await getAdminToken();
// Get group details first to find the calendar name
const groupResponse = await fetch(
`${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/groups/${params.groupId}`,
{
headers: {
Authorization: `Bearer ${token}`,
},
}
);
if (groupResponse.ok) {
const group = await groupResponse.json();
const groupName = group.name;
// Delete the associated calendar from database
try {
await prisma.calendar.deleteMany({
where: {
name: `Groupe: ${groupName}`,
},
});
logger.info('Group calendar deleted', { groupName, groupId: params.groupId });
} catch (calendarError) {
logger.error('Failed to delete group calendar', { groupName, error: calendarError });
// Continue with group deletion even if calendar deletion fails
}
}
// Delete the group from Keycloak
const response = await fetch(
`${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/groups/${params.groupId}`,
{

View File

@ -1,6 +1,7 @@
import { getServerSession } from "next-auth/next";
import { authOptions } from "@/app/api/auth/options";
import { NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";
async function getAdminToken() {
try {
@ -63,7 +64,35 @@ export async function GET(req: Request, props: { params: Promise<{ userId: strin
}
const groups = await groupsResponse.json();
return NextResponse.json(groups);
// Enrich groups with calendar colors from database
const enrichedGroups = await Promise.all(
groups.map(async (group: any) => {
try {
const calendar = await prisma.calendar.findFirst({
where: {
name: `Groupe: ${group.name}`,
},
select: {
color: true,
},
});
return {
...group,
calendarColor: calendar?.color || null,
};
} catch (error) {
console.error(`Error fetching calendar color for group ${group.name}:`, error);
return {
...group,
calendarColor: null,
};
}
})
);
return NextResponse.json(enrichedGroups);
} catch (error) {
console.error("Error in get user groups:", error);
return NextResponse.json({ error: "Internal server error" }, { status: 500 });

View File

@ -31,6 +31,7 @@ interface Group {
id: string;
name: string;
path: string;
calendarColor?: string | null;
}
interface Mission {
@ -1084,8 +1085,13 @@ export default function VisionPage() {
>
<div className="flex items-center justify-between">
<div className="flex items-center gap-3 flex-1">
<div className="h-10 w-10 rounded-full bg-blue-100 flex items-center justify-center">
<Users className="h-5 w-5 text-blue-600" />
<div
className="h-10 w-10 rounded-full flex items-center justify-center"
style={{
backgroundColor: group.calendarColor || '#DBEAFE',
}}
>
<Users className="h-5 w-5" style={{ color: group.calendarColor ? '#ffffff' : '#2563EB' }} />
</div>
<div className="flex-1 min-w-0">
<h3 className="font-medium text-gray-900 truncate">

View File

@ -35,7 +35,7 @@ services:
# Optionnel: sauvegardes automatiques
# - ./backups:/backups
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-neah_user}"]
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
interval: 10s
timeout: 5s
retries: 5