diff --git a/README.md b/README.md index c572dba..48eb530 100644 --- a/README.md +++ b/README.md @@ -193,31 +193,204 @@ JIRA_API_TOKEN="votre_token_api" ``` towercontrol/ ├── src/ -│ ├── app/ # Pages Next.js 15 (App Router) +│ ├── app/ # Next.js 15 App Router (pages & routes) │ │ ├── api/ # API Routes (endpoints complexes) -│ │ ├── daily/ # Page daily notes -│ │ ├── tags/ # Page gestion tags -│ │ └── settings/ # Page configuration +│ │ │ ├── analytics/ # Endpoints d'analytics +│ │ │ ├── auth/ # Authentification (NextAuth) +│ │ │ ├── backups/ # Gestion des sauvegardes +│ │ │ ├── daily/ # API daily notes +│ │ │ ├── jira/ # API intégration Jira +│ │ │ ├── notes/ # API notes markdown +│ │ │ ├── tags/ # API gestion tags +│ │ │ ├── tasks/ # API tâches +│ │ │ ├── tfs/ # API intégration TFS +│ │ │ └── user-preferences/ # API préférences utilisateur +│ │ ├── daily/ # Page daily notes (/daily) +│ │ ├── jira-dashboard/ # Dashboard Jira (/jira-dashboard) +│ │ ├── kanban/ # Page Kanban (/kanban) +│ │ ├── manager/ # Page manager +│ │ ├── notes/ # Page notes (/notes) +│ │ ├── profile/ # Page profil utilisateur +│ │ ├── settings/ # Page configuration (/settings) +│ │ │ ├── advanced/ # Paramètres avancés +│ │ │ ├── backup/ # Gestion backups +│ │ │ ├── general/ # Paramètres généraux +│ │ │ └── integrations/ # Config intégrations +│ │ ├── weekly-manager/ # Page weekly manager +│ │ ├── layout.tsx # Layout principal +│ │ ├── page.tsx # Page d'accueil (/) +│ │ └── globals.css # Styles globaux + variables CSS +│ │ │ ├── actions/ # Server Actions (mutations rapides) -│ └── contexts/ # Contexts React globaux -├── components/ -│ ├── ui/ # Composants UI de base -│ ├── kanban/ # Composants Kanban -│ ├── daily/ # Composants Daily notes -│ └── forms/ # Formulaires réutilisables -├── services/ # Services backend (logique métier) -│ ├── database.ts # Pool Prisma -│ ├── tasks.ts # CRUD tâches -│ ├── tags.ts # CRUD tags -│ ├── daily.ts # Daily notes -│ ├── jira.ts # Intégration Jira -│ └── user-preferences.ts # Préférences utilisateur -├── clients/ # Clients HTTP frontend -├── hooks/ # Hooks React personnalisés -├── lib/ # Utilitaires et types -└── prisma/ # Schéma et migrations DB +│ │ ├── backup.ts # Actions sauvegardes +│ │ ├── daily.ts # Actions daily notes +│ │ ├── jira-analytics.ts # Actions analytics Jira +│ │ ├── preferences.ts # Actions préférences +│ │ ├── tags.ts # Actions tags +│ │ ├── tasks.ts # Actions tâches +│ │ └── tfs.ts # Actions TFS +│ │ +│ ├── components/ # Composants React (UI uniquement) +│ │ ├── ui/ # Composants UI de base réutilisables +│ │ │ ├── Button.tsx # Boutons +│ │ │ ├── Input.tsx # Inputs +│ │ │ ├── Modal.tsx # Modales +│ │ │ ├── Badge.tsx # Badges +│ │ │ ├── Card.tsx # Cartes +│ │ │ └── ... # Autres composants UI +│ │ ├── kanban/ # Composants Kanban spécifiques +│ │ │ ├── Board.tsx # Board principal +│ │ │ ├── Column.tsx # Colonne Kanban +│ │ │ ├── TaskCard.tsx # Carte de tâche +│ │ │ ├── filters/ # Composants de filtrage +│ │ │ └── ... # Autres composants Kanban +│ │ ├── daily/ # Composants Daily notes +│ │ ├── dashboard/ # Composants dashboard +│ │ ├── forms/ # Formulaires réutilisables +│ │ ├── jira/ # Composants intégration Jira +│ │ ├── settings/ # Composants paramètres +│ │ └── charts/ # Composants graphiques +│ │ +│ ├── services/ # Services backend (logique métier) +│ │ ├── core/ # Services core +│ │ │ ├── database.ts # Pool Prisma (unique point d'accès DB) +│ │ │ ├── system-info.ts # Infos système +│ │ │ └── user-preferences.ts # Préférences utilisateur +│ │ ├── task-management/ # Gestion des tâches +│ │ │ ├── tasks.ts # CRUD tâches +│ │ │ ├── tags.ts # CRUD tags +│ │ │ └── daily.ts # Daily notes +│ │ ├── integrations/ # Intégrations externes +│ │ │ ├── jira/ # Intégration Jira +│ │ │ │ ├── jira.ts # Client Jira API +│ │ │ │ ├── analytics.ts # Analytics Jira +│ │ │ │ ├── scheduler.ts # Planification sync +│ │ │ │ └── ... # Autres services Jira +│ │ │ └── tfs/ # Intégration TFS +│ │ ├── analytics/ # Services d'analytics +│ │ │ ├── analytics.ts # Analytics générales +│ │ │ ├── metrics.ts # Métriques +│ │ │ └── ... # Autres analytics +│ │ └── data-management/ # Gestion des données +│ │ ├── backup.ts # Sauvegardes +│ │ └── backup-scheduler.ts # Planification backups +│ │ +│ ├── clients/ # Clients HTTP frontend +│ │ ├── base/ # Client HTTP de base +│ │ │ └── http-client.ts # Client HTTP réutilisable +│ │ ├── tasks-client.ts # Client API tâches +│ │ ├── tags-client.ts # Client API tags +│ │ ├── daily-client.ts # Client API daily +│ │ ├── jira-client.ts # Client API Jira +│ │ └── backup-client.ts # Client API backups +│ │ +│ ├── hooks/ # Hooks React personnalisés +│ │ ├── useTasks.ts # Hook gestion tâches +│ │ ├── useTags.ts # Hook gestion tags +│ │ ├── useDaily.ts # Hook daily notes +│ │ ├── useDragAndDrop.ts # Hook drag & drop +│ │ └── ... # Autres hooks +│ │ +│ ├── contexts/ # Contexts React globaux +│ │ ├── ThemeContext.tsx # Gestion thème dark/light +│ │ ├── TasksContext.tsx # Context tâches +│ │ ├── UserPreferencesContext.tsx # Préférences utilisateur +│ │ └── ... # Autres contexts +│ │ +│ ├── lib/ # Utilitaires et configuration +│ │ ├── types.ts # Types TypeScript partagés +│ │ ├── utils.ts # Fonctions utilitaires +│ │ ├── config.ts # Configuration app +│ │ ├── status-config.ts # Configuration statuts Kanban +│ │ ├── tag-colors.ts # Configuration couleurs tags +│ │ └── ... # Autres utilitaires +│ │ +│ ├── types/ # Types TypeScript spécifiques +│ │ └── next-auth.d.ts # Types NextAuth +│ │ +│ └── middleware.ts # Middleware Next.js (auth, etc.) +│ +├── prisma/ # Prisma ORM +│ ├── schema.prisma # Schéma de base de données +│ └── migrations/ # Migrations SQL +│ +├── scripts/ # Scripts utilitaires +│ ├── backup-manager.ts # Gestion backups +│ ├── seed-data.ts # Données de test +│ └── ... # Autres scripts +│ +├── public/ # Assets statiques +│ └── icons/ # Icônes +│ +├── data/ # Données locales +│ ├── dev.db # Base SQLite développement +│ ├── prod.db # Base SQLite production +│ └── backups/ # Sauvegardes automatiques +│ +└── [fichiers racine] # Config projet (package.json, etc.) ``` +### Explication détaillée des dossiers + +#### 📁 `src/app/` - Pages et routes Next.js + +- **Pages publiques** : Routes Next.js qui génèrent les pages (`page.tsx`) +- **API Routes** : Endpoints HTTP dans `/api` pour les opérations complexes +- **Client Components** : Composants client séparés (`*PageClient.tsx`) pour l'hydratation +- **Layout** : Layout global avec providers (Theme, Auth, etc.) + +#### 📁 `src/actions/` - Server Actions + +- **Mutations rapides** : Actions serveur pour les mutations simples (CRUD) +- **Cache intelligent** : Révalidation automatique avec `revalidatePath()` +- **UX optimisée** : Utilisation avec `useTransition` pour les états de chargement + +#### 📁 `src/components/` - Composants React (UI uniquement) + +- **Règle stricte** : AUCUNE logique métier, uniquement présentation +- **Organisation par domaine** : `kanban/`, `daily/`, `jira/`, etc. +- **Composants UI réutilisables** : Dans `ui/` pour la cohérence visuelle +- **Formulaires** : Dans `forms/` pour la réutilisation + +#### 📁 `src/services/` - Logique métier backend + +- **Point unique d'accès DB** : `core/database.ts` (Pool Prisma) +- **Séparation par domaine** : `task-management/`, `integrations/`, `analytics/` +- **Règle stricte** : TOUTE la logique métier ici, jamais dans les composants +- **Services métier** : CRUD, calculs, validations, intégrations externes + +#### 📁 `src/clients/` - Clients HTTP frontend + +- **Client HTTP de base** : `base/http-client.ts` avec gestion erreurs/tokens +- **Clients par domaine** : Un client par API (tasks, tags, jira, etc.) +- **Règle stricte** : Uniquement requêtes HTTP, pas de logique métier + +#### 📁 `src/hooks/` - Hooks React personnalisés + +- **Orchestration UI** : Gestion état React, appels API via clients +- **Logique UI uniquement** : Pas de logique métier, uniquement coordination + +#### 📁 `src/contexts/` - Contexts React globaux + +- **État global** : Thème, préférences, tâches, etc. +- **Providers** : Utilisés dans le layout principal + +#### 📁 `src/lib/` - Utilitaires et configuration + +- **Types partagés** : `types.ts` pour la cohérence TypeScript +- **Configurations** : Statuts Kanban, couleurs tags, etc. +- **Helpers** : Fonctions utilitaires (dates, formatting, etc.) + +#### 📁 `prisma/` - Base de données + +- **Schéma** : Définition des modèles (`schema.prisma`) +- **Migrations** : Historique des changements de schéma + +#### 📁 `scripts/` - Scripts utilitaires + +- **Opérations** : Backups, seeding, maintenance +- **Exécution** : Via `pnpm run ` + ### Stack technique - **Frontend** : Next.js 15, React 19, TypeScript, Tailwind CSS diff --git a/src/components/ui/PriorityBadge.tsx b/src/components/ui/PriorityBadge.tsx index 6042b65..a45b91c 100644 --- a/src/components/ui/PriorityBadge.tsx +++ b/src/components/ui/PriorityBadge.tsx @@ -3,7 +3,7 @@ import { getPriorityConfig } from '@/lib/status-config'; interface PriorityBadgeProps { - priority: 'low' | 'medium' | 'high'; + priority: 'low' | 'medium' | 'high' | 'urgent'; className?: string; } diff --git a/src/components/ui/TaskCard.tsx b/src/components/ui/TaskCard.tsx index 05be673..ec2257e 100644 --- a/src/components/ui/TaskCard.tsx +++ b/src/components/ui/TaskCard.tsx @@ -6,6 +6,8 @@ import { TagDisplay } from './TagDisplay'; import { formatDateForDisplay } from '@/lib/date-utils'; import emojiRegex from 'emoji-regex'; import { getTaskEmoji } from '@/lib/task-emoji'; +import { getPriorityColor, getPriorityColorHex } from '@/lib/status-config'; +import type { TaskPriority } from '@/lib/types'; interface TaskCardProps extends HTMLAttributes { // Variants @@ -206,17 +208,6 @@ const TaskCard = forwardRef( return {}; }; - // Couleurs de priorité - const getPriorityColor = (priority: string) => { - const colors = { - low: '#10b981', // green - medium: '#f59e0b', // amber - high: '#ef4444', // red - urgent: '#dc2626', // red-600 - }; - return colors[priority as keyof typeof colors] || colors.medium; - }; - // Utiliser getTaskEmoji avec les propriétés de la tâche disponibles const taskEmoji = getTaskEmoji( { @@ -234,7 +225,9 @@ const TaskCard = forwardRef( const titleWithoutEmojis = title.replace(emojiRegex(), '').trim(); const sourceStyles = getSourceStyles(); - const priorityColor = getPriorityColor(priority); + // Utiliser les fonctions de status-config pour obtenir la couleur de priorité correcte + const priorityColorValue = getPriorityColor(priority as TaskPriority); + const priorityColor = getPriorityColorHex(priorityColorValue); // Vue compacte if (variant === 'compact') {