agenda finition
This commit is contained in:
parent
fdc7ea8b24
commit
77d96cedac
@ -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
|
||||
|
||||
@ -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}`,
|
||||
{
|
||||
|
||||
@ -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 });
|
||||
|
||||
@ -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">
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user