diff --git a/TODO.md b/TODO.md index 69f05f3..025565e 100644 --- a/TODO.md +++ b/TODO.md @@ -142,13 +142,12 @@ - [x] Graphiques avec Recharts (tendances, vélocité, distribution) - [x] Composants de graphiques (CompletionTrend, Velocity, Priority, Weekly) - [x] Insights automatiques et métriques visuelles -- [ ] Export des données en CSV/JSON ## Autre Todo - [x] Avoir un bouton pour réduire/agrandir la font des taches dans les kanban (swimlane et classique) - [x] Refactorer les couleurs des priorités dans un seul endroit - [x] Settings synchro Jira : ajouter une liste de projet à ignorer, doit etre pris en compte par le service bien sur -- [ ] faire des pages à part entière dpour les sous-pages de la page config + SSR +- [x] faire des pages à part entière pour les sous-pages de la page config + SSR - [ ] Système de sauvegarde automatique base de données - [ ] Sauvegarde automatique toutes les 6 heures (configurable) - [ ] Configuration dans les paramètres (intervalle de temps + bouton sauvegarde manuelle) diff --git a/components/settings/AdvancedSettingsPageClient.tsx b/components/settings/AdvancedSettingsPageClient.tsx new file mode 100644 index 0000000..c72e6a0 --- /dev/null +++ b/components/settings/AdvancedSettingsPageClient.tsx @@ -0,0 +1,224 @@ +'use client'; + +import { UserPreferences } from '@/lib/types'; +import { Header } from '@/components/ui/Header'; +import { Card, CardHeader, CardContent } from '@/components/ui/Card'; +import { UserPreferencesProvider } from '@/contexts/UserPreferencesContext'; +import Link from 'next/link'; + +interface AdvancedSettingsPageClientProps { + initialPreferences: UserPreferences; +} + +export function AdvancedSettingsPageClient({ initialPreferences }: AdvancedSettingsPageClientProps) { + return ( + +
+
+ +
+
+ {/* Breadcrumb */} +
+ + Paramètres + + / + Avancé +
+ + {/* Page Header */} +
+

+ 🛠️ Paramètres avancés +

+

+ Configuration système, sauvegarde et outils de développement +

+
+ +
+ {/* Sauvegarde et données */} + + +

💾 Sauvegarde et données

+

+ Gestion des sauvegardes automatiques et manuelles +

+
+ +
+
+

Sauvegarde automatique

+

+ Sauvegarde toutes les 6 heures (configurable) +

+

+ Prochaine sauvegarde: dans 3h 42min +

+
+ +
+

Sauvegardes disponibles

+

+ 5 sauvegardes conservées +

+

+ Dernière: il y a 2h 18min +

+
+
+ +
+ + +
+
+
+ + {/* Base de données */} + + +

🗄️ Base de données

+

+ Informations et maintenance de la base de données +

+
+ +
+
+

Tâches

+

247

+

entrées

+
+ +
+

Tags

+

18

+

entrées

+
+ +
+

Taille DB

+

2.4

+

MB

+
+
+
+
+ + {/* Export / Import */} + + +

📤 Export / Import

+

+ Sauvegarde et restauration des données +

+
+ +
+
+

Export des données

+

+ Exporter toutes les données au format JSON +

+ +
+ +
+

Import des données

+

+ Restaurer des données depuis un fichier JSON +

+ +
+
+
+
+ + {/* Logs et debug */} + + +

🐛 Debug et logs

+

+ Outils de diagnostic et de résolution de problèmes +

+
+ +
+
+

Logs système

+

+ Consultation des logs d'erreur et d'activité +

+ +
+ +
+

Mode debug

+

+ Activer les informations de debug détaillées +

+ +
+
+
+
+ + {/* Zone dangereuse */} + + +

⚠️ Zone dangereuse

+

+ Actions irréversibles - à utiliser avec précaution +

+
+ +
+

Réinitialisation complète

+

+ Supprime toutes les données (tâches, tags, préférences) +

+ +
+
+
+ + {/* Note développement futur */} + + +
+

+ 🚧 Fonctionnalités en développement +

+

+ La plupart des fonctions avancées seront implémentées dans les prochaines versions. + Cette page sert de prévisualisation de l'interface à venir. +

+
+
+
+
+
+
+
+
+ ); +} diff --git a/components/settings/GeneralSettingsPageClient.tsx b/components/settings/GeneralSettingsPageClient.tsx new file mode 100644 index 0000000..db0bab9 --- /dev/null +++ b/components/settings/GeneralSettingsPageClient.tsx @@ -0,0 +1,64 @@ +'use client'; + +import { UserPreferences } from '@/lib/types'; +import { Header } from '@/components/ui/Header'; +import { Card, CardHeader, CardContent } from '@/components/ui/Card'; +import { UserPreferencesProvider } from '@/contexts/UserPreferencesContext'; +import Link from 'next/link'; + +interface GeneralSettingsPageClientProps { + initialPreferences: UserPreferences; +} + +export function GeneralSettingsPageClient({ initialPreferences }: GeneralSettingsPageClientProps) { + return ( + +
+
+ +
+
+ {/* Breadcrumb */} +
+ + Paramètres + + / + Général +
+ + {/* Page Header */} +
+

+ ⚙️ Paramètres généraux +

+

+ Configuration des préférences de l'interface et du comportement général +

+
+ +
+ {/* Note développement futur */} + + +
+

+ 🚧 Interface de configuration en développement +

+

+ Les contrôles interactifs pour modifier ces préférences seront disponibles dans une prochaine version. + Pour l'instant, les préférences sont modifiables via les boutons de l'interface principale. +

+
+
+
+
+
+
+
+
+ ); +} diff --git a/components/settings/IntegrationsSettingsPageClient.tsx b/components/settings/IntegrationsSettingsPageClient.tsx new file mode 100644 index 0000000..bf20ca0 --- /dev/null +++ b/components/settings/IntegrationsSettingsPageClient.tsx @@ -0,0 +1,152 @@ +'use client'; + +import { UserPreferences, JiraConfig } from '@/lib/types'; +import { Header } from '@/components/ui/Header'; +import { Card, CardHeader, CardContent } from '@/components/ui/Card'; +import { JiraConfigForm } from '@/components/settings/JiraConfigForm'; +import { JiraSync } from '@/components/jira/JiraSync'; +import { JiraLogs } from '@/components/jira/JiraLogs'; +import { UserPreferencesProvider } from '@/contexts/UserPreferencesContext'; +import Link from 'next/link'; + +interface IntegrationsSettingsPageClientProps { + initialPreferences: UserPreferences; + initialJiraConfig: JiraConfig; +} + +export function IntegrationsSettingsPageClient({ + initialPreferences, + initialJiraConfig +}: IntegrationsSettingsPageClientProps) { + return ( + +
+
+ +
+
+ {/* Breadcrumb */} +
+ + Paramètres + + / + Intégrations +
+ + {/* Page Header */} +
+

+ 🔌 Intégrations externes +

+

+ Configuration des intégrations avec les outils externes +

+
+ + {/* Layout en 2 colonnes pour optimiser l'espace */} +
+ + {/* Colonne principale: Configuration Jira */} +
+ + +

+ 🏢 + Jira Cloud +

+

+ Synchronisation automatique des tickets Jira vers TowerControl +

+
+ + + +
+ + {/* Futures intégrations */} + + +

Autres intégrations

+

+ Intégrations prévues pour les prochaines versions +

+
+ +
+
+
+ 📧 +

Slack/Teams

+
+

+ Notifications et commandes via chat +

+
+ +
+
+ 🐙 +

GitHub/GitLab

+
+

+ Synchronisation des issues et PR +

+
+ +
+
+ 📊 +

Calendriers

+
+

+ Google Calendar, Outlook, etc. +

+
+ +
+
+ ⏱️ +

Time tracking

+
+

+ Toggl, RescueTime, etc. +

+
+
+
+
+
+ + {/* Colonne latérale: Actions et Logs Jira */} +
+ {initialJiraConfig?.enabled && ( + <> + + + + )} + + {!initialJiraConfig?.enabled && ( + + +
+ 🔧 +

+ Configurez Jira pour accéder aux outils de synchronisation +

+
+
+
+ )} +
+
+
+
+
+
+ ); +} diff --git a/components/settings/SettingsIndexPageClient.tsx b/components/settings/SettingsIndexPageClient.tsx new file mode 100644 index 0000000..b462482 --- /dev/null +++ b/components/settings/SettingsIndexPageClient.tsx @@ -0,0 +1,220 @@ +'use client'; + +import { UserPreferences } from '@/lib/types'; +import { Header } from '@/components/ui/Header'; +import { Card, CardHeader, CardContent } from '@/components/ui/Card'; +import { UserPreferencesProvider } from '@/contexts/UserPreferencesContext'; +import Link from 'next/link'; + +interface SettingsIndexPageClientProps { + initialPreferences: UserPreferences; +} + +export function SettingsIndexPageClient({ initialPreferences }: SettingsIndexPageClientProps) { + const settingsPages = [ + { + href: '/settings/general', + icon: '⚙️', + title: 'Paramètres généraux', + description: 'Interface, thème, préférences d\'affichage', + status: 'En développement' + }, + { + href: '/settings/integrations', + icon: '🔌', + title: 'Intégrations', + description: 'Jira, GitHub, Slack et autres services externes', + status: 'Fonctionnel' + }, + { + href: '/settings/advanced', + icon: '🛠️', + title: 'Paramètres avancés', + description: 'Sauvegarde, logs, debug et maintenance', + status: 'Prochainement' + } + ]; + + return ( + +
+
+ +
+
+ {/* Page Header */} +
+

+ Paramètres +

+

+ Configuration de TowerControl et de ses intégrations +

+
+ + {/* Quick Stats */} +
+ + +
+ 🎨 +
+

Thème actuel

+

{initialPreferences.viewPreferences.theme}

+
+
+
+
+ + + +
+ 🔌 +
+

Jira

+

+ {initialPreferences.jiraConfig.enabled ? 'Configuré' : 'Non configuré'} +

+
+
+
+
+ + + +
+ 📏 +
+

Taille police

+

{initialPreferences.viewPreferences.fontSize}

+
+
+
+
+
+ + {/* Settings Sections */} +
+

+ Sections de configuration +

+ +
+ {settingsPages.map((page) => ( + + + +
+
+ {page.icon} +
+

+ {page.title} +

+

+ {page.description} +

+
+ + {page.status} + +
+
+
+ + + +
+
+
+ + ))} +
+
+ + {/* Quick Actions */} +
+

+ Actions rapides +

+ +
+ + +
+
+

Sauvegarde manuelle

+

+ Créer une sauvegarde des données +

+
+ +
+
+
+ + + +
+
+

Test Jira

+

+ Tester la connexion Jira +

+
+ +
+
+
+
+
+ + {/* System Info */} + + +

ℹ️ Informations système

+
+ +
+
+

Version

+

TowerControl v1.0.0

+
+
+

Dernière maj

+

Il y a 2 jours

+
+
+

Env

+

Development

+
+
+
+
+
+
+
+
+ ); +} diff --git a/src/app/settings/advanced/page.tsx b/src/app/settings/advanced/page.tsx new file mode 100644 index 0000000..c278d4d --- /dev/null +++ b/src/app/settings/advanced/page.tsx @@ -0,0 +1,12 @@ +import { userPreferencesService } from '@/services/user-preferences'; +import { AdvancedSettingsPageClient } from '@/components/settings/AdvancedSettingsPageClient'; + +// Force dynamic rendering for real-time data +export const dynamic = 'force-dynamic'; + +export default async function AdvancedSettingsPage() { + // Fetch data server-side + const preferences = await userPreferencesService.getAllPreferences(); + + return ; +} diff --git a/src/app/settings/general/page.tsx b/src/app/settings/general/page.tsx new file mode 100644 index 0000000..589c6f0 --- /dev/null +++ b/src/app/settings/general/page.tsx @@ -0,0 +1,12 @@ +import { userPreferencesService } from '@/services/user-preferences'; +import { GeneralSettingsPageClient } from '@/components/settings/GeneralSettingsPageClient'; + +// Force dynamic rendering for real-time data +export const dynamic = 'force-dynamic'; + +export default async function GeneralSettingsPage() { + // Fetch data server-side + const preferences = await userPreferencesService.getAllPreferences(); + + return ; +} diff --git a/src/app/settings/integrations/page.tsx b/src/app/settings/integrations/page.tsx new file mode 100644 index 0000000..97f54e7 --- /dev/null +++ b/src/app/settings/integrations/page.tsx @@ -0,0 +1,18 @@ +import { userPreferencesService } from '@/services/user-preferences'; +import { IntegrationsSettingsPageClient } from '@/components/settings/IntegrationsSettingsPageClient'; + +// Force dynamic rendering for real-time data +export const dynamic = 'force-dynamic'; + +export default async function IntegrationsSettingsPage() { + // Fetch data server-side + const preferences = await userPreferencesService.getAllPreferences(); + const jiraConfig = await userPreferencesService.getJiraConfig(); + + return ( + + ); +} diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index 306b4d7..35fb551 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -1,8 +1,12 @@ -import { SettingsPageClient } from '@/components/settings/SettingsPageClient'; +import { userPreferencesService } from '@/services/user-preferences'; +import { SettingsIndexPageClient } from '@/components/settings/SettingsIndexPageClient'; // Force dynamic rendering (no static generation) export const dynamic = 'force-dynamic'; export default async function SettingsPage() { - return ; + // Fetch basic data for the index page + const preferences = await userPreferencesService.getAllPreferences(); + + return ; } diff --git a/src/contexts/ThemeContext.tsx b/src/contexts/ThemeContext.tsx index e370e5e..8dcb9e2 100644 --- a/src/contexts/ThemeContext.tsx +++ b/src/contexts/ThemeContext.tsx @@ -1,7 +1,7 @@ 'use client'; import { createContext, useContext, useEffect, useState, ReactNode } from 'react'; -import { userPreferencesClient } from '@/clients/user-preferences-client'; +import { updateViewPreferences } from '@/actions/preferences'; type Theme = 'light' | 'dark'; @@ -38,11 +38,14 @@ export function ThemeProvider({ children, initialTheme = 'dark' }: ThemeProvider const newTheme = theme === 'dark' ? 'light' : 'dark'; setThemeState(newTheme); - // Sauvegarder en base de façon asynchrone via le client + // Sauvegarder en base de façon asynchrone via server action try { - await userPreferencesClient.updateViewPreferences({ + const result = await updateViewPreferences({ theme: newTheme }); + if (!result.success) { + console.error('Erreur lors de la sauvegarde du thème:', result.error); + } } catch (error) { console.error('Erreur lors de la sauvegarde du thème:', error); } @@ -51,11 +54,14 @@ export function ThemeProvider({ children, initialTheme = 'dark' }: ThemeProvider const setTheme = async (newTheme: Theme) => { setThemeState(newTheme); - // Sauvegarder en base de façon asynchrone via le client + // Sauvegarder en base de façon asynchrone via server action try { - await userPreferencesClient.updateViewPreferences({ + const result = await updateViewPreferences({ theme: newTheme }); + if (!result.success) { + console.error('Erreur lors de la sauvegarde du thème:', result.error); + } } catch (error) { console.error('Erreur lors de la sauvegarde du thème:', error); }