feat: enhance JiraDashboard with initial analytics support
- Updated `JiraDashboardPageClient` to accept `initialAnalytics`, allowing for server-side analytics retrieval. - Modified `useJiraAnalytics` to initialize state with `initialAnalytics`, improving data handling. - Adjusted `CollaborationMatrix` to manage client-side rendering and analytics data processing, preventing hydration errors. - Enhanced `page.tsx` to fetch analytics based on Jira configuration, ensuring data is available for the dashboard.
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
'use client';
|
||||
|
||||
import React from 'react';
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import { JiraAnalytics } from '@/lib/types';
|
||||
import { Card } from '@/components/ui/Card';
|
||||
|
||||
@@ -23,10 +23,16 @@ interface CollaborationData {
|
||||
}
|
||||
|
||||
export function CollaborationMatrix({ analytics, className }: CollaborationMatrixProps) {
|
||||
// Analyser les patterns de collaboration basés sur les données existantes
|
||||
const collaborationData: CollaborationData[] = analytics.teamMetrics.issuesDistribution.map(assignee => {
|
||||
// Simuler des collaborations basées sur les données réelles
|
||||
const totalTickets = assignee.totalIssues;
|
||||
const [collaborationData, setCollaborationData] = useState<CollaborationData[]>([]);
|
||||
const [isClient, setIsClient] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
setIsClient(true);
|
||||
|
||||
// Analyser les patterns de collaboration basés sur les données existantes
|
||||
const data: CollaborationData[] = analytics.teamMetrics.issuesDistribution.map(assignee => {
|
||||
// Simuler des collaborations basées sur les données réelles
|
||||
const totalTickets = assignee.totalIssues;
|
||||
|
||||
// Générer des partenaires de collaboration réalistes
|
||||
const otherAssignees = analytics.teamMetrics.issuesDistribution.filter(a => a.assignee !== assignee.assignee);
|
||||
@@ -67,13 +73,25 @@ export function CollaborationMatrix({ analytics, className }: CollaborationMatri
|
||||
};
|
||||
});
|
||||
|
||||
// Statistiques globales
|
||||
const avgCollaboration = collaborationData.reduce((sum, d) => sum + d.collaborationScore, 0) / collaborationData.length;
|
||||
const avgIsolation = collaborationData.reduce((sum, d) => sum + d.isolation, 0) / collaborationData.length;
|
||||
const mostCollaborative = collaborationData.reduce((max, current) =>
|
||||
current.collaborationScore > max.collaborationScore ? current : max, collaborationData[0]);
|
||||
const mostIsolated = collaborationData.reduce((max, current) =>
|
||||
current.isolation > max.isolation ? current : max, collaborationData[0]);
|
||||
setCollaborationData(data);
|
||||
}, [analytics]);
|
||||
|
||||
// Ne pas rendre côté serveur pour éviter l'erreur d'hydratation
|
||||
if (!isClient) {
|
||||
return (
|
||||
<div className={className}>
|
||||
<div className="animate-pulse bg-gray-200 dark:bg-gray-700 rounded-lg h-96" />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
// Statistiques globales
|
||||
const avgCollaboration = collaborationData.reduce((sum, d) => sum + d.collaborationScore, 0) / collaborationData.length;
|
||||
const avgIsolation = collaborationData.reduce((sum, d) => sum + d.isolation, 0) / collaborationData.length;
|
||||
const mostCollaborative = collaborationData.reduce((max, current) =>
|
||||
current.collaborationScore > max.collaborationScore ? current : max, collaborationData[0]);
|
||||
const mostIsolated = collaborationData.reduce((max, current) =>
|
||||
current.isolation > max.isolation ? current : max, collaborationData[0]);
|
||||
|
||||
// Couleur d'intensité
|
||||
const getIntensityColor = (intensity: 'low' | 'medium' | 'high') => {
|
||||
|
||||
Reference in New Issue
Block a user