feat: enhance Jira dashboard with advanced filtering and sprint details

- Updated `TODO.md` to mark several tasks as complete, including anomaly detection and sprint detail integration.
- Enhanced `VelocityChart` to support click events for sprint details, improving user interaction.
- Added `FilterBar` and `AnomalyDetectionPanel` components to `JiraDashboardPageClient` for advanced filtering capabilities.
- Implemented state management for selected sprints and modal display for detailed sprint information.
- Introduced new types for advanced filtering in `types.ts`, expanding the filtering options available in the analytics.
This commit is contained in:
Julien Froidefond
2025-09-19 10:13:48 +02:00
parent b7707d7651
commit 3dd6e0fd1c
17 changed files with 2879 additions and 68 deletions

View File

@@ -0,0 +1,88 @@
'use server';
import { jiraAnomalyDetection, JiraAnomaly, AnomalyDetectionConfig } from '@/services/jira-anomaly-detection';
import { JiraAnalyticsService, JiraAnalyticsConfig } from '@/services/jira-analytics';
import { userPreferencesService } from '@/services/user-preferences';
export interface AnomalyDetectionResult {
success: boolean;
data?: JiraAnomaly[];
error?: string;
}
/**
* Détecte les anomalies dans les métriques Jira actuelles
*/
export async function detectJiraAnomalies(forceRefresh = false): Promise<AnomalyDetectionResult> {
try {
// Récupérer la config Jira
const jiraConfig = await userPreferencesService.getJiraConfig();
if (!jiraConfig?.baseUrl || !jiraConfig?.email || !jiraConfig?.apiToken || !jiraConfig?.projectKey) {
return {
success: false,
error: 'Configuration Jira incomplète'
};
}
// Récupérer les analytics actuelles
if (!jiraConfig.baseUrl || !jiraConfig.projectKey) {
return { success: false, error: 'Configuration Jira incomplète' };
}
const analyticsService = new JiraAnalyticsService(jiraConfig as JiraAnalyticsConfig);
const analytics = await analyticsService.getProjectAnalytics(forceRefresh);
// Détecter les anomalies
const anomalies = await jiraAnomalyDetection.detectAnomalies(analytics);
return {
success: true,
data: anomalies
};
} catch (error) {
console.error('❌ Erreur lors de la détection d\'anomalies:', error);
return {
success: false,
error: error instanceof Error ? error.message : 'Erreur inconnue'
};
}
}
/**
* Met à jour la configuration de détection d'anomalies
*/
export async function updateAnomalyDetectionConfig(config: Partial<AnomalyDetectionConfig>) {
try {
jiraAnomalyDetection.updateConfig(config);
return {
success: true,
data: jiraAnomalyDetection.getConfig()
};
} catch (error) {
console.error('❌ Erreur lors de la mise à jour de la config:', error);
return {
success: false,
error: error instanceof Error ? error.message : 'Erreur inconnue'
};
}
}
/**
* Récupère la configuration actuelle de détection d'anomalies
*/
export async function getAnomalyDetectionConfig() {
try {
return {
success: true,
data: jiraAnomalyDetection.getConfig()
};
} catch (error) {
console.error('❌ Erreur lors de la récupération de la config:', error);
return {
success: false,
error: error instanceof Error ? error.message : 'Erreur inconnue'
};
}
}