- 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.
114 lines
3.5 KiB
TypeScript
114 lines
3.5 KiB
TypeScript
'use server';
|
|
|
|
import { JiraAnalyticsService, JiraAnalyticsConfig } from '@/services/jira-analytics';
|
|
import { JiraAdvancedFiltersService } from '@/services/jira-advanced-filters';
|
|
import { userPreferencesService } from '@/services/user-preferences';
|
|
import { AvailableFilters, JiraAnalyticsFilters, JiraAnalytics } from '@/lib/types';
|
|
|
|
export interface FiltersResult {
|
|
success: boolean;
|
|
data?: AvailableFilters;
|
|
error?: string;
|
|
}
|
|
|
|
export interface FilteredAnalyticsResult {
|
|
success: boolean;
|
|
data?: JiraAnalytics;
|
|
error?: string;
|
|
}
|
|
|
|
/**
|
|
* Récupère les filtres disponibles depuis les données Jira
|
|
*/
|
|
export async function getAvailableJiraFilters(): Promise<FiltersResult> {
|
|
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 toutes les issues du projet pour extraire les filtres
|
|
if (!jiraConfig.baseUrl || !jiraConfig.projectKey) {
|
|
return { success: false, error: 'Configuration Jira incomplète' };
|
|
}
|
|
|
|
const analyticsService = new JiraAnalyticsService(jiraConfig as JiraAnalyticsConfig);
|
|
|
|
// Récupérer la liste des issues pour extraire les filtres
|
|
const allIssues = await analyticsService.getAllProjectIssues();
|
|
|
|
// Extraire les filtres disponibles
|
|
const availableFilters = JiraAdvancedFiltersService.extractAvailableFilters(allIssues);
|
|
|
|
return {
|
|
success: true,
|
|
data: availableFilters
|
|
};
|
|
} catch (error) {
|
|
console.error('❌ Erreur lors de la récupération des filtres:', error);
|
|
return {
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Erreur inconnue'
|
|
};
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Applique des filtres aux analytics et retourne les données filtrées
|
|
*/
|
|
export async function getFilteredJiraAnalytics(filters: Partial<JiraAnalyticsFilters>): Promise<FilteredAnalyticsResult> {
|
|
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 originales
|
|
if (!jiraConfig.baseUrl || !jiraConfig.projectKey) {
|
|
return { success: false, error: 'Configuration Jira incomplète' };
|
|
}
|
|
|
|
const analyticsService = new JiraAnalyticsService(jiraConfig as JiraAnalyticsConfig);
|
|
const originalAnalytics = await analyticsService.getProjectAnalytics();
|
|
|
|
// Si aucun filtre actif, retourner les données originales
|
|
if (!JiraAdvancedFiltersService.hasActiveFilters(filters)) {
|
|
return {
|
|
success: true,
|
|
data: originalAnalytics
|
|
};
|
|
}
|
|
|
|
// Récupérer toutes les issues pour appliquer les filtres
|
|
const allIssues = await analyticsService.getAllProjectIssues();
|
|
|
|
// Appliquer les filtres
|
|
const filteredAnalytics = JiraAdvancedFiltersService.applyFiltersToAnalytics(
|
|
originalAnalytics,
|
|
filters,
|
|
allIssues
|
|
);
|
|
|
|
return {
|
|
success: true,
|
|
data: filteredAnalytics
|
|
};
|
|
} catch (error) {
|
|
console.error('❌ Erreur lors du filtrage des analytics:', error);
|
|
return {
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Erreur inconnue'
|
|
};
|
|
}
|
|
}
|