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
|
## 🔄 Flux de données
|
||||||
|
|
||||||
### Chargement initial :
|
### Chargement initial :
|
||||||
@ -129,9 +179,10 @@ La couleur du calendrier de groupe est maintenant visible dans :
|
|||||||
- Liste des calendriers (pastille à gauche)
|
- Liste des calendriers (pastille à gauche)
|
||||||
- Événements dans le calendrier (barre colorée)
|
- Événements dans le calendrier (barre colorée)
|
||||||
|
|
||||||
4. **`/vision`** - Page visioconférences
|
4. **`/vision`** - Page visioconférences ✨ **NOUVEAU**
|
||||||
- Calendrier des réunions
|
- Cercle coloré autour de l'icône groupe
|
||||||
- Événements du jour
|
- 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
|
5. **Widgets calendrier** - Tous les composants calendrier
|
||||||
- `calendar-widget.tsx`
|
- `calendar-widget.tsx`
|
||||||
@ -167,6 +218,20 @@ La couleur du calendrier de groupe est maintenant visible dans :
|
|||||||
4. Aller sur `/agenda`
|
4. Aller sur `/agenda`
|
||||||
5. ✅ Vérifier : Couleur visible dans le calendrier
|
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
|
## 📁 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)
|
- `app/api/groups/[groupId]/calendar/route.ts` (nouveau endpoint API)
|
||||||
|
|
||||||
### Fichiers modifiés :
|
### Fichiers modifiés :
|
||||||
|
|
||||||
|
#### 1. Gestion des couleurs :
|
||||||
|
|
||||||
- `components/groups/groups-table.tsx`
|
- `components/groups/groups-table.tsx`
|
||||||
- Import `Palette` de lucide-react
|
- Import `Palette` de lucide-react
|
||||||
- Ajout interface `calendarColor?` à Group
|
- Ajout interface `calendarColor?` à Group
|
||||||
@ -196,6 +264,32 @@ La couleur du calendrier de groupe est maintenant visible dans :
|
|||||||
- Dialog de sélection de couleur
|
- Dialog de sélection de couleur
|
||||||
- Affichage icône colorée
|
- 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
|
## 🔮 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
|
## 🐛 Problèmes connus
|
||||||
|
|
||||||
Aucun problème connu pour le moment.
|
Aucun problème connu pour le moment.
|
||||||
@ -261,5 +378,21 @@ Pour toute question ou problème :
|
|||||||
---
|
---
|
||||||
|
|
||||||
**Date de création** : 20 janvier 2026
|
**Date de création** : 20 janvier 2026
|
||||||
**Version** : 1.0
|
**Dernière mise à jour** : 21 janvier 2026
|
||||||
|
**Version** : 1.2
|
||||||
**Auteur** : Senior Developer Assistant
|
**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();
|
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(
|
const response = await fetch(
|
||||||
`${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/groups/${params.groupId}`,
|
`${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 { getServerSession } from "next-auth/next";
|
||||||
import { authOptions } from "@/app/api/auth/options";
|
import { authOptions } from "@/app/api/auth/options";
|
||||||
import { NextResponse } from "next/server";
|
import { NextResponse } from "next/server";
|
||||||
|
import { prisma } from "@/lib/prisma";
|
||||||
|
|
||||||
async function getAdminToken() {
|
async function getAdminToken() {
|
||||||
try {
|
try {
|
||||||
@ -63,7 +64,35 @@ export async function GET(req: Request, props: { params: Promise<{ userId: strin
|
|||||||
}
|
}
|
||||||
|
|
||||||
const groups = await groupsResponse.json();
|
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) {
|
} catch (error) {
|
||||||
console.error("Error in get user groups:", error);
|
console.error("Error in get user groups:", error);
|
||||||
return NextResponse.json({ error: "Internal server error" }, { status: 500 });
|
return NextResponse.json({ error: "Internal server error" }, { status: 500 });
|
||||||
|
|||||||
@ -31,6 +31,7 @@ interface Group {
|
|||||||
id: string;
|
id: string;
|
||||||
name: string;
|
name: string;
|
||||||
path: string;
|
path: string;
|
||||||
|
calendarColor?: string | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Mission {
|
interface Mission {
|
||||||
@ -1084,8 +1085,13 @@ export default function VisionPage() {
|
|||||||
>
|
>
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div className="flex items-center gap-3 flex-1">
|
<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">
|
<div
|
||||||
<Users className="h-5 w-5 text-blue-600" />
|
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>
|
||||||
<div className="flex-1 min-w-0">
|
<div className="flex-1 min-w-0">
|
||||||
<h3 className="font-medium text-gray-900 truncate">
|
<h3 className="font-medium text-gray-900 truncate">
|
||||||
|
|||||||
@ -35,7 +35,7 @@ services:
|
|||||||
# Optionnel: sauvegardes automatiques
|
# Optionnel: sauvegardes automatiques
|
||||||
# - ./backups:/backups
|
# - ./backups:/backups
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-neah_user}"]
|
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
|
||||||
interval: 10s
|
interval: 10s
|
||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 5
|
retries: 5
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user