314 lines
8.5 KiB
Markdown
314 lines
8.5 KiB
Markdown
# SWOT Manager - Development Book
|
|
|
|
Application de gestion d'ateliers SWOT pour entretiens managériaux.
|
|
|
|
## Stack Technique
|
|
|
|
- **Framework**: Next.js 15 (App Router)
|
|
- **Styling**: Tailwind CSS + CSS Variables theming
|
|
- **Auth**: NextAuth.js v5
|
|
- **Database**: PostgreSQL + Prisma
|
|
- **Drag & Drop**: @hello-pangea/dnd (fork maintenu de react-beautiful-dnd)
|
|
- **State**: React Context + Server Actions
|
|
|
|
---
|
|
|
|
## Phase 1 : Setup Initial
|
|
|
|
- [x] Initialiser Next.js 15 avec TypeScript
|
|
- [x] Configurer Tailwind CSS avec le système de CSS Variables
|
|
- [x] Setup ESLint + Prettier
|
|
- [x] Créer la structure de dossiers
|
|
```
|
|
src/
|
|
├── app/
|
|
│ ├── api/
|
|
│ ├── (auth)/
|
|
│ │ ├── login/
|
|
│ │ └── register/
|
|
│ ├── sessions/
|
|
│ │ ├── [id]/
|
|
│ │ └── new/
|
|
│ └── layout.tsx
|
|
├── components/
|
|
│ ├── ui/ # Composants réutilisables
|
|
│ ├── swot/ # Composants SWOT
|
|
│ └── layout/ # Header, Sidebar, etc.
|
|
├── services/ # Logique métier + DB
|
|
├── lib/ # Types, utils
|
|
├── contexts/ # React Contexts
|
|
└── actions/ # Server Actions
|
|
```
|
|
- [x] Configurer les CSS Variables pour le theming (light/dark)
|
|
|
|
---
|
|
|
|
## Phase 2 : Base de Données
|
|
|
|
- [x] Installer et configurer Prisma
|
|
- [x] Créer le schéma de base de données :
|
|
```prisma
|
|
model User {
|
|
id String @id @default(cuid())
|
|
email String @unique
|
|
name String?
|
|
password String
|
|
sessions Session[]
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
}
|
|
|
|
model Session {
|
|
id String @id @default(cuid())
|
|
title String
|
|
collaborator String # Nom du collaborateur évalué
|
|
date DateTime @default(now())
|
|
userId String
|
|
user User @relation(fields: [userId], references: [id])
|
|
items SwotItem[]
|
|
actions Action[]
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
}
|
|
|
|
enum SwotCategory {
|
|
STRENGTH
|
|
WEAKNESS
|
|
OPPORTUNITY
|
|
THREAT
|
|
}
|
|
|
|
model SwotItem {
|
|
id String @id @default(cuid())
|
|
content String
|
|
category SwotCategory
|
|
order Int @default(0)
|
|
sessionId String
|
|
session Session @relation(fields: [sessionId], references: [id], onDelete: Cascade)
|
|
actionLinks ActionLink[]
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
}
|
|
|
|
model Action {
|
|
id String @id @default(cuid())
|
|
title String
|
|
description String?
|
|
priority Int @default(0) # 0=low, 1=medium, 2=high
|
|
status String @default("todo") # todo, in_progress, done
|
|
dueDate DateTime?
|
|
sessionId String
|
|
session Session @relation(fields: [sessionId], references: [id], onDelete: Cascade)
|
|
links ActionLink[]
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
}
|
|
|
|
model ActionLink {
|
|
id String @id @default(cuid())
|
|
actionId String
|
|
action Action @relation(fields: [actionId], references: [id], onDelete: Cascade)
|
|
swotItemId String
|
|
swotItem SwotItem @relation(fields: [swotItemId], references: [id], onDelete: Cascade)
|
|
|
|
@@unique([actionId, swotItemId])
|
|
}
|
|
```
|
|
- [x] Générer le client Prisma
|
|
- [x] Créer les migrations initiales
|
|
- [x] Créer le service database.ts (pool de connexion)
|
|
|
|
---
|
|
|
|
## Phase 3 : Authentification
|
|
|
|
- [x] Installer NextAuth.js v5
|
|
- [x] Configurer le provider Credentials (email/password)
|
|
- [x] Créer les pages :
|
|
- [x] `/login` - Page de connexion
|
|
- [x] `/register` - Page d'inscription
|
|
- [x] Créer le service auth.ts
|
|
- [x] Protéger les routes avec middleware
|
|
- [x] Créer le composant AuthProvider
|
|
|
|
---
|
|
|
|
## Phase 4 : Layout & Navigation
|
|
|
|
- [x] Créer le layout principal avec :
|
|
- [x] Header avec navigation et user menu
|
|
- [x] Theme toggle (dark/light)
|
|
- [x] Créer les composants UI de base :
|
|
- [x] Button
|
|
- [x] Card
|
|
- [x] Input
|
|
- [x] Modal
|
|
- [x] Badge
|
|
- [x] Créer la page d'accueil `/` - Dashboard avec liste des sessions
|
|
|
|
---
|
|
|
|
## Phase 5 : Gestion des Sessions SWOT
|
|
|
|
- [x] Créer le service `sessions.ts`
|
|
- [x] Créer les Server Actions pour les sessions :
|
|
- [x] `createSession`
|
|
- [x] `updateSession`
|
|
- [x] `deleteSession`
|
|
- [x] `getSession`
|
|
- [x] `getUserSessions`
|
|
- [x] Créer les pages :
|
|
- [x] `/sessions` - Liste des sessions
|
|
- [x] `/sessions/new` - Création de session
|
|
- [x] `/sessions/[id]` - Vue détaillée de la session SWOT
|
|
- [x] Créer les composants :
|
|
- [x] `SessionCard` - Carte de session dans la liste
|
|
- [x] `SessionForm` - Formulaire création/édition
|
|
|
|
---
|
|
|
|
## Phase 6 : Matrice SWOT Interactive
|
|
|
|
- [x] Installer @hello-pangea/dnd
|
|
- [x] Créer les composants SWOT :
|
|
- [x] `SwotBoard` - Container principal de la matrice
|
|
- [x] `SwotQuadrant` - Un quadrant (S, W, O, T)
|
|
- [x] `SwotCard` - Une carte dans un quadrant
|
|
- [x] `SwotCardForm` - Formulaire ajout/édition de carte
|
|
- [x] Implémenter le drag & drop :
|
|
- [x] Réorganisation dans un même quadrant
|
|
- [x] Déplacement entre quadrants
|
|
- [x] Créer les Server Actions pour les items :
|
|
- [x] `createSwotItem`
|
|
- [x] `updateSwotItem`
|
|
- [x] `deleteSwotItem`
|
|
- [x] `reorderSwotItems`
|
|
- [x] Édition inline des cartes
|
|
|
|
---
|
|
|
|
## Phase 7 : Système de Liaison & Actions
|
|
|
|
- [x] Créer le mode "liaison" :
|
|
- [x] Bouton pour activer le mode liaison
|
|
- [x] Sélection multiple d'items SWOT
|
|
- [x] Visualisation des items sélectionnés (highlight)
|
|
- [x] Créer les composants Actions :
|
|
- [x] `ActionPanel` - Panneau des actions croisées
|
|
- [x] `ActionCard` - Une action avec ses liens
|
|
- [x] `ActionForm` - Formulaire création/édition d'action
|
|
- [x] `LinkedItemsBadges` - Badges des items liés
|
|
- [x] Créer les Server Actions pour les actions :
|
|
- [x] `createAction`
|
|
- [x] `updateAction`
|
|
- [x] `deleteAction`
|
|
- [x] `linkItemToAction`
|
|
- [x] `unlinkItemFromAction`
|
|
- [x] Visualisation des liens sur la matrice (highlight on hover)
|
|
|
|
---
|
|
|
|
## Phase 8 : Roadmap & Priorisation
|
|
|
|
- [ ] Créer la vue Roadmap :
|
|
- [ ] `RoadmapView` - Vue timeline des actions
|
|
- [ ] Filtres par statut, priorité
|
|
- [ ] Tri par date d'échéance
|
|
- [ ] Drag & drop pour réordonner les priorités
|
|
- [ ] Mise à jour du statut des actions (todo → in_progress → done)
|
|
- [ ] Vue Kanban alternative des actions
|
|
|
|
---
|
|
|
|
## Phase 9 : Export & Partage
|
|
|
|
- [ ] Export PDF de la matrice SWOT
|
|
- [ ] Export PDF de la roadmap
|
|
- [ ] Génération de lien de partage en lecture seule
|
|
- [ ] Copie au format texte pour coller dans un email
|
|
|
|
---
|
|
|
|
## Phase 10 : Polish & UX
|
|
|
|
- [ ] Animations et transitions fluides
|
|
- [ ] États de chargement (skeletons)
|
|
- [ ] Messages de confirmation et toasts
|
|
- [ ] Raccourcis clavier :
|
|
- [ ] `N` - Nouvelle carte
|
|
- [ ] `Escape` - Annuler
|
|
- [ ] `Enter` - Valider
|
|
- [ ] Responsive design (tablette minimum)
|
|
- [ ] Mode présentation (masquer les contrôles)
|
|
|
|
---
|
|
|
|
## Phase 11 : Bonus (Optionnel)
|
|
|
|
- [ ] Templates de sessions SWOT prédéfinis
|
|
- [ ] Collaboration temps réel (plusieurs personnes sur la même session)
|
|
- [ ] Historique des modifications
|
|
- [ ] Import depuis Miro/Trello
|
|
- [ ] Intégration calendrier pour les échéances
|
|
- [ ] Notifications par email pour les deadlines
|
|
|
|
---
|
|
|
|
## Notes Techniques
|
|
|
|
### Structure des Server Actions
|
|
|
|
```typescript
|
|
// actions/swot-items.ts
|
|
'use server'
|
|
|
|
import { swotService } from '@/services/swot';
|
|
import { revalidatePath } from 'next/cache';
|
|
|
|
export async function createSwotItem(sessionId: string, data: CreateSwotItemInput) {
|
|
const item = await swotService.createItem(sessionId, data);
|
|
revalidatePath(`/sessions/${sessionId}`);
|
|
return { success: true, data: item };
|
|
}
|
|
```
|
|
|
|
### Pattern de Liaison
|
|
|
|
```typescript
|
|
// Mode liaison : state dans le composant parent
|
|
const [linkMode, setLinkMode] = useState(false);
|
|
const [selectedItems, setSelectedItems] = useState<string[]>([]);
|
|
|
|
// Quand 2+ items sélectionnés, proposer création d'action
|
|
if (selectedItems.length >= 2) {
|
|
// Ouvrir modal de création d'action avec items pré-sélectionnés
|
|
}
|
|
```
|
|
|
|
### Visualisation des Liens
|
|
|
|
- Au hover d'une action : highlight des items liés
|
|
- Au hover d'un item : highlight des actions liées
|
|
- Couleurs par type de croisement (SO, ST, WO, WT)
|
|
|
|
---
|
|
|
|
## Commandes Utiles
|
|
|
|
```bash
|
|
# Lancer le dev server
|
|
npm run dev
|
|
|
|
# Prisma
|
|
npx prisma migrate dev --name <name>
|
|
npx prisma generate
|
|
npx prisma studio
|
|
|
|
# Build
|
|
npm run build
|
|
|
|
# Lint
|
|
npm run lint
|
|
```
|
|
|