'use client'; /** * Étape 1: Sélection et configuration du template de phases * Interface de choix du type de chantier avec preview des phases incluses */ import React, { useState, useEffect } from 'react'; import { Card } from 'primereact/card'; import { Button } from 'primereact/button'; import { Tag } from 'primereact/tag'; import { Badge } from 'primereact/badge'; import { Skeleton } from 'primereact/skeleton'; import { ScrollPanel } from 'primereact/scrollpanel'; import { Divider } from 'primereact/divider'; import { ProgressBar } from 'primereact/progressbar'; import { InputText } from 'primereact/inputtext'; import { Dropdown } from 'primereact/dropdown'; import { Message } from 'primereact/message'; import { TypeChantierTemplate, WizardConfiguration } from '../PhaseGenerationWizard'; import { Chantier } from '../../../types/btp'; interface TemplateSelectionStepProps { templates: TypeChantierTemplate[]; loading: boolean; configuration: WizardConfiguration; onConfigurationChange: (config: WizardConfiguration) => void; chantier?: Chantier; } const TemplateSelectionStep: React.FC = ({ templates, loading, configuration, onConfigurationChange, chantier }) => { const [searchFilter, setSearchFilter] = useState(''); const [categorieFilter, setCategorieFilter] = useState(''); const [complexiteFilter, setComplexiteFilter] = useState(''); const [selectedTemplate, setSelectedTemplate] = useState(configuration.typeChantier); // Options de filtrage const categorieOptions = [ { label: 'Toutes catégories', value: '' }, { label: 'Résidentiel', value: 'RESIDENTIEL' }, { label: 'Commercial', value: 'COMMERCIAL' }, { label: 'Industriel', value: 'INDUSTRIEL' }, { label: 'Infrastructure', value: 'INFRASTRUCTURE' }, { label: 'Rénovation', value: 'RENOVATION' } ]; const complexiteOptions = [ { label: 'Toutes complexités', value: '' }, { label: 'Simple', value: 'SIMPLE' }, { label: 'Moyenne', value: 'MOYENNE' }, { label: 'Complexe', value: 'COMPLEXE' }, { label: 'Expert', value: 'EXPERT' } ]; // Filtrer les templates const filteredTemplates = templates.filter(template => { let matches = true; if (searchFilter) { const search = searchFilter.toLowerCase(); matches = matches && ( template.nom.toLowerCase().includes(search) || template.description.toLowerCase().includes(search) || template.tags.some(tag => tag.toLowerCase().includes(search)) ); } if (categorieFilter) { matches = matches && template.categorie === categorieFilter; } if (complexiteFilter) { matches = matches && template.complexiteMetier === complexiteFilter; } return matches; }); // Sélectionner un template const selectTemplate = (template: TypeChantierTemplate) => { setSelectedTemplate(template); const newConfig = { ...configuration, typeChantier: template, phasesSelectionnees: template.phases, // Par défaut, toutes les phases sont sélectionnées // Préserver les valeurs du chantier si elles existent, sinon utiliser celles du template budgetGlobal: configuration.budgetGlobal || template.budgetGlobalEstime, dureeGlobale: configuration.dureeGlobale || template.dureeGlobaleEstimee }; onConfigurationChange(newConfig); }; // Template de carte de template const templateCard = (template: TypeChantierTemplate) => { const isSelected = selectedTemplate?.id === template.id; const complexiteSeverityMap = { 'SIMPLE': 'success', 'MOYENNE': 'info', 'COMPLEXE': 'warning', 'EXPERT': 'danger' } as const; const cardHeader = (
{template.nom}

{template.description}

{isSelected && ( )}
); const cardFooter = (
); return ( selectTemplate(template)} >
{template.nombreTotalPhases} phases
{template.dureeGlobaleEstimee} jours
{new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', minimumFractionDigits: 0 }).format(template.budgetGlobalEstime)}
Catégories:
{template.phases.slice(0, 3).map((phase, index) => ( ))} {template.phases.length > 3 && ( )}
{template.tags.length > 0 && (
{template.tags.slice(0, 2).map((tag, index) => ( {tag} ))} {template.tags.length > 2 && ( +{template.tags.length - 2} )}
)}
); }; // Prévisualisation du template sélectionné const previewPanel = () => { if (!selectedTemplate) return null; return (
Prévisualisation: {selectedTemplate.nom}
Phases incluses
{selectedTemplate.nombreTotalPhases}
phases + sous-phases
Durée estimée
{selectedTemplate.dureeGlobaleEstimee}
jours ouvrés
Budget estimé
{new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', minimumFractionDigits: 0 }).format(selectedTemplate.budgetGlobalEstime)}
estimation globale
Phases principales ({selectedTemplate.phases.length})
{selectedTemplate.phases.map((phase, index) => (
{phase.nom}
{phase.dureeEstimee}j • {phase.sousPhases.length} sous-phases
))}
Caractéristiques du template
Catégorie:
Complexité:
{selectedTemplate.tags.length > 0 && (
Tags:
{selectedTemplate.tags.map((tag, index) => ( {tag} ))}
)}
); }; return (

Sélection du Template de Chantier

{/* Informations du chantier */} {chantier && (
Informations du chantier
Nom : {chantier.nom}
{chantier.typeChantier && (
Type : {chantier.typeChantier}
)} {chantier.surface && (
Surface : {chantier.surface} m²
)}
{chantier.montantPrevu && (
Budget prévu : {chantier.montantPrevu.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR' })}
)} {chantier.dateDebut && (
Date de début : {new Date(chantier.dateDebut).toLocaleDateString('fr-FR')}
)} {chantier.dateFinPrevue && (
Date de fin prévue : {new Date(chantier.dateFinPrevue).toLocaleDateString('fr-FR')}
)}
Ces informations seront utilisées pour personnaliser les phases générées
)} {/* Filtres */}
setSearchFilter(e.target.value)} placeholder="Rechercher un template..." className="w-full" />
setCategorieFilter(e.value)} placeholder="Filtrer par catégorie" className="w-full" />
setComplexiteFilter(e.value)} placeholder="Filtrer par complexité" className="w-full" />
{/* Liste des templates */} {loading ? (
{[1, 2, 3, 4].map((item) => (
))}
) : filteredTemplates.length === 0 ? ( ) : (
{filteredTemplates.map((template) => (
{templateCard(template)}
))}
)} {/* Prévisualisation */} {previewPanel()}
); }; export default TemplateSelectionStep;