diff --git a/components/kanban/TaskCard.tsx b/components/kanban/TaskCard.tsx index c07354f..6aa01de 100644 --- a/components/kanban/TaskCard.tsx +++ b/components/kanban/TaskCard.tsx @@ -6,6 +6,7 @@ import { Card } from '@/components/ui/Card'; import { Badge } from '@/components/ui/Badge'; import { TagDisplay } from '@/components/ui/TagDisplay'; import { useTasksContext } from '@/contexts/TasksContext'; +import { useUserPreferences } from '@/contexts/UserPreferencesContext'; import { useDraggable } from '@dnd-kit/core'; import { getPriorityConfig, getPriorityColorHex } from '@/lib/status-config'; @@ -23,6 +24,14 @@ export function TaskCard({ task, onDelete, onEdit, onUpdateTitle, compactView = const [showTooltip, setShowTooltip] = useState(false); const timeoutRef = useRef(null); const { tags: availableTags } = useTasksContext(); + const { preferences } = useUserPreferences(); + + // Helper pour construire l'URL Jira + const getJiraTicketUrl = (jiraKey: string): string => { + const baseUrl = preferences.jiraConfig.baseUrl; + if (!baseUrl || !jiraKey) return ''; + return `${baseUrl}/browse/${jiraKey}`; + }; // Configuration du draggable const { @@ -374,9 +383,29 @@ export function TaskCard({ task, onDelete, onEdit, onUpdateTitle, compactView =
{task.source !== 'manual' && task.source && ( - - {task.source === 'jira' && task.jiraKey ? task.jiraKey : task.source} - + task.source === 'jira' && task.jiraKey ? ( + preferences.jiraConfig.baseUrl ? ( + e.stopPropagation()} + className="hover:scale-105 transition-transform" + > + + {task.jiraKey} + + + ) : ( + + {task.jiraKey} + + ) + ) : ( + + {task.source} + + ) )} {task.jiraProject && ( diff --git a/lib/types.ts b/lib/types.ts index d47701c..864ca22 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -78,10 +78,17 @@ export interface ColumnVisibility { [key: string]: TaskStatus[] | undefined; } +export interface JiraConfig { + baseUrl?: string; + email?: string; + enabled: boolean; +} + export interface UserPreferences { kanbanFilters: KanbanFilters; viewPreferences: ViewPreferences; columnVisibility: ColumnVisibility; + jiraConfig: JiraConfig; } // Interface pour les logs de synchronisation diff --git a/services/user-preferences.ts b/services/user-preferences.ts index a4f4149..d22f388 100644 --- a/services/user-preferences.ts +++ b/services/user-preferences.ts @@ -1,5 +1,6 @@ -import { TaskStatus, KanbanFilters, ViewPreferences, ColumnVisibility, UserPreferences } from '@/lib/types'; +import { TaskStatus, KanbanFilters, ViewPreferences, ColumnVisibility, UserPreferences, JiraConfig } from '@/lib/types'; import { prisma } from './database'; +import { getConfig } from '@/lib/config'; // Valeurs par défaut const DEFAULT_PREFERENCES: UserPreferences = { @@ -21,6 +22,9 @@ const DEFAULT_PREFERENCES: UserPreferences = { }, columnVisibility: { hiddenStatuses: [] + }, + jiraConfig: { + enabled: false } }; @@ -161,31 +165,51 @@ class UserPreferencesService { } } + /** + * Récupère la configuration Jira depuis les variables d'environnement + */ + async getJiraConfig(): Promise { + try { + const config = getConfig(); + return { + baseUrl: config.integrations.jira.baseUrl, + email: config.integrations.jira.email, + enabled: config.integrations.jira.enabled + }; + } catch (error) { + console.warn('Erreur lors de la récupération de la config Jira:', error); + return DEFAULT_PREFERENCES.jiraConfig; + } + } + /** * Récupère toutes les préférences utilisateur */ async getAllPreferences(): Promise { - const [kanbanFilters, viewPreferences, columnVisibility] = await Promise.all([ + const [kanbanFilters, viewPreferences, columnVisibility, jiraConfig] = await Promise.all([ this.getKanbanFilters(), this.getViewPreferences(), - this.getColumnVisibility() + this.getColumnVisibility(), + this.getJiraConfig() ]); return { kanbanFilters, viewPreferences, - columnVisibility + columnVisibility, + jiraConfig }; } /** - * Sauvegarde toutes les préférences utilisateur + * Sauvegarde toutes les préférences utilisateur (jiraConfig ignorée car elle vient des env vars) */ async saveAllPreferences(preferences: UserPreferences): Promise { await Promise.all([ this.saveKanbanFilters(preferences.kanbanFilters), this.saveViewPreferences(preferences.viewPreferences), this.saveColumnVisibility(preferences.columnVisibility) + // jiraConfig n'est pas sauvegardée car elle vient des variables d'environnement ]); }