feat: enhance Jira filters and dashboard functionality

- Added new test scripts in `package.json` for story points and Jira fields validation.
- Updated `JiraDashboardPageClient` to utilize raw analytics for filtering, improving data handling with active filters.
- Introduced a loading state in `FilterBar` with visual feedback for filter application, enhancing user experience.
- Refactored `useJiraFilters` to support local filtering based on initial analytics, streamlining filter management.
- Enhanced `JiraAnalyticsService` to calculate story points based on issue types, improving accuracy in analytics.
This commit is contained in:
Julien Froidefond
2025-09-26 11:54:41 +02:00
parent bd7ede412e
commit 7de060566f
8 changed files with 448 additions and 54 deletions

View File

@@ -8,6 +8,7 @@ import { filterAnalyticsByPeriod, getPeriodInfo, type PeriodFilter } from '@/lib
import { Header } from '@/components/ui/Header';
import { Card, CardHeader, CardContent } from '@/components/ui/Card';
import { Button } from '@/components/ui/Button';
import { Badge } from '@/components/ui/Badge';
import { VelocityChart } from '@/components/jira/VelocityChart';
import { TeamDistributionChart } from '@/components/jira/TeamDistributionChart';
import { CycleTimeChart } from '@/components/jira/CycleTimeChart';
@@ -40,7 +41,7 @@ export function JiraDashboardPageClient({ initialJiraConfig, initialAnalytics }:
filteredAnalytics,
applyFilters,
hasActiveFilters
} = useJiraFilters();
} = useJiraFilters(rawAnalytics);
const [selectedPeriod, setSelectedPeriod] = useState<PeriodFilter>('current');
const [selectedSprint, setSelectedSprint] = useState<SprintVelocity | null>(null);
const [showSprintModal, setShowSprintModal] = useState(false);
@@ -48,6 +49,9 @@ export function JiraDashboardPageClient({ initialJiraConfig, initialAnalytics }:
// Filtrer les analytics selon la période sélectionnée et les filtres avancés
const analytics = useMemo(() => {
// Si on a des filtres actifs ET des analytics filtrées, utiliser celles-ci
// Sinon utiliser les analytics brutes
// Si on est en train de charger les filtres, garder les données originales
const baseAnalytics = hasActiveFilters && filteredAnalytics ? filteredAnalytics : rawAnalytics;
if (!baseAnalytics) return null;
return filterAnalyticsByPeriod(baseAnalytics, selectedPeriod);
@@ -303,6 +307,11 @@ export function JiraDashboardPageClient({ initialJiraConfig, initialAnalytics }:
<span className="text-sm font-normal text-[var(--muted-foreground)]">
({periodInfo.label})
</span>
{hasActiveFilters && (
<Badge className="bg-purple-100 text-purple-800 text-xs">
🔍 Filtré
</Badge>
)}
</h2>
<div className="grid grid-cols-2 lg:grid-cols-4 gap-4">
<div className="text-center">
@@ -347,6 +356,7 @@ export function JiraDashboardPageClient({ initialJiraConfig, initialAnalytics }:
availableFilters={availableFilters}
activeFilters={activeFilters}
onFiltersChange={applyFilters}
isLoading={false}
/>
{/* Détection d'anomalies */}