V5.0.0 //

-> Refonte du système de GESTION DES ROULEMENTS de matériels roulants
-> Optimisation rendue BDD
This commit is contained in:
AdminGit committed 2026-10-03 21:54:39 +02:00
1 parent f77d59ca1c
commit 4b771e546e
6 files changed
+310 -4182

No files matched your search

+185 -4164
View File
File diff suppressed because it is too large. Load diff
+3
View File
@@ -48,5 +48,8 @@
}, },
"devDependencies": { "devDependencies": {
"supabase": "^2.115.0" "supabase": "^2.115.0"
},
"overrides": {
"webpack": "^5.0.0"
} }
} }
+3 -3
View File
@@ -317,7 +317,7 @@ export default function CreerPerturbation() {
} }
]; ];
const { data, error } = await updateHoraireComposition(horaireTarget.id, newComp); const { error } = await updateHoraireComposition(horaireTarget.id, newComp);
if (error) throw error; if (error) throw error;
setHoraires(prev => prev.map(h => h.id === horaireTarget.id ? { ...h, composition_train: newComp } : h)); setHoraires(prev => prev.map(h => h.id === horaireTarget.id ? { ...h, composition_train: newComp } : h));
@@ -362,7 +362,7 @@ export default function CreerPerturbation() {
try { try {
for (const h of selectedHoraires) { for (const h of selectedHoraires) {
const arrets = perturbationsArretsMap[h.id] || []; const arrets = perturbationsArretsMap[h.id] || [];
const payload = buildPayload({ const { payload, modificationsParcours } = buildPayload({
selectedHoraire: h, selectedHoraire: h,
cause, cause,
causeDetails, causeDetails,
@@ -374,7 +374,7 @@ export default function CreerPerturbation() {
scopedRegionId, scopedRegionId,
}); });
const { error } = await createPerturbation(payload); const { error } = await createPerturbation(payload, modificationsParcours);
if (error) { if (error) {
alert(`Erreur lors de la création pour le train ${h.numero_train} : ` + (error.message || 'Erreur')); alert(`Erreur lors de la création pour le train ${h.numero_train} : ` + (error.message || 'Erreur'));
setSaving(false); setSaving(false);
@@ -275,7 +275,7 @@ export default function ModifierPerturbation() {
} }
]; ];
const { data, error } = await updateHoraireComposition(horaireTarget.id, newComp); const { error } = await updateHoraireComposition(horaireTarget.id, newComp);
if (error) throw error; if (error) throw error;
setHoraires(prev => prev.map(h => h.id === horaireTarget.id ? { ...h, composition_train: newComp } : h)); setHoraires(prev => prev.map(h => h.id === horaireTarget.id ? { ...h, composition_train: newComp } : h));
@@ -315,7 +315,7 @@ export default function ModifierPerturbation() {
setSaving(true); setSaving(true);
try { try {
const payload = buildPayload({ const { payload, modificationsParcours } = buildPayload({
selectedHoraire, selectedHoraire,
cause, cause,
causeDetails, causeDetails,
@@ -327,7 +327,7 @@ export default function ModifierPerturbation() {
scopedRegionId, scopedRegionId,
}); });
const { error } = await updatePerturbation(perturbationId, payload); const { error } = await updatePerturbation(perturbationId, payload, modificationsParcours);
if (error) { if (error) {
alert('Erreur lors de la mise à jour : ' + (error.message || 'Erreur')); alert('Erreur lors de la mise à jour : ' + (error.message || 'Erreur'));
} else { } else {
+58 -6
View File
@@ -70,16 +70,27 @@ export default function CreerTravaux() {
const el = tabsRef.current; const el = tabsRef.current;
if (!el) return; if (!el) return;
const handleTabChange = (e) => { const handleTabChange = (e) => {
if (e.detail?.selectedKey) { const key = e.detail?.selectedKey || e.detail?.tabName || e.detail?.value;
setActiveTabKey(e.detail.selectedKey); if (key) {
setActiveTabKey(key);
} }
}; };
el.addEventListener('tabChange', handleTabChange);
el.addEventListener('wcsTabsChange', handleTabChange);
el.addEventListener('wcsChange', handleTabChange); el.addEventListener('wcsChange', handleTabChange);
return () => { return () => {
el.removeEventListener('tabChange', handleTabChange);
el.removeEventListener('wcsTabsChange', handleTabChange);
el.removeEventListener('wcsChange', handleTabChange); el.removeEventListener('wcsChange', handleTabChange);
}; };
}, []); }, []);
useEffect(() => {
if (tabsRef.current) {
tabsRef.current.selectedKey = activeTabKey;
}
}, [activeTabKey]);
const handleSearchHoraires = useCallback(async () => { const handleSearchHoraires = useCallback(async () => {
setLoadingHoraires(true); setLoadingHoraires(true);
setShowResults(true); setShowResults(true);
@@ -231,10 +242,10 @@ export default function CreerTravaux() {
{/* Navigation par Onglets WCS */} {/* Navigation par Onglets WCS */}
<div className="mb-4"> <div className="mb-4">
<wcs-tabs ref={tabsRef} selected-key={activeTabKey}> <wcs-tabs ref={tabsRef} selected-key={activeTabKey} headers-only="true">
<wcs-tab header="1. Général & Ligne" item-key="general"></wcs-tab> <wcs-tab header="1. Général & Ligne" item-key="general" onClick={() => setActiveTabKey('general')}></wcs-tab>
<wcs-tab header="2. Calendrier & Période" item-key="calendrier"></wcs-tab> <wcs-tab header="2. Calendrier & Période" item-key="calendrier" onClick={() => setActiveTabKey('calendrier')}></wcs-tab>
<wcs-tab header={`3. Substitutions (${horairesSelectionnes.length})`} item-key="substitutions"></wcs-tab> <wcs-tab header={`3. Substitutions (${horairesSelectionnes.length})`} item-key="substitutions" onClick={() => setActiveTabKey('substitutions')}></wcs-tab>
</wcs-tabs> </wcs-tabs>
</div> </div>
@@ -289,6 +300,17 @@ export default function CreerTravaux() {
placeholder="Détaillez les impacts prévus, motifs techniques, gares concernées..." placeholder="Détaillez les impacts prévus, motifs techniques, gares concernées..."
/> />
</div> </div>
<div className="d-flex justify-content-end mt-4 pt-3 border-top">
<wcs-button
mode="stroked"
className="wcs-primary"
onClick={() => setActiveTabKey('calendrier')}
>
<span>Étape suivante : Calendrier & Période</span>
<wcs-mat-icon icon="arrow_forward" size="s" class="ml-1"></wcs-mat-icon>
</wcs-button>
</div>
</wcs-card-body> </wcs-card-body>
</wcs-card> </wcs-card>
)} )}
@@ -382,6 +404,25 @@ export default function CreerTravaux() {
})} })}
</div> </div>
</div> </div>
<div className="d-flex justify-content-between mt-4 pt-3 border-top">
<wcs-button
mode="stroked"
className="wcs-secondary"
onClick={() => setActiveTabKey('general')}
>
<wcs-mat-icon icon="arrow_back" size="s" class="mr-1"></wcs-mat-icon>
<span>Précédent : Général</span>
</wcs-button>
<wcs-button
mode="stroked"
className="wcs-primary"
onClick={() => setActiveTabKey('substitutions')}
>
<span>Étape suivante : Substitutions</span>
<wcs-mat-icon icon="arrow_forward" size="s" class="ml-1"></wcs-mat-icon>
</wcs-button>
</div>
</wcs-card-body> </wcs-card-body>
</wcs-card> </wcs-card>
)} )}
@@ -534,6 +575,17 @@ export default function CreerTravaux() {
)} )}
</div> </div>
)} )}
<div className="d-flex justify-content-start mt-4 pt-3 border-top">
<wcs-button
mode="stroked"
className="wcs-secondary"
onClick={() => setActiveTabKey('calendrier')}
>
<wcs-mat-icon icon="arrow_back" size="s" class="mr-1"></wcs-mat-icon>
<span>Précédent : Calendrier & Période</span>
</wcs-button>
</div>
</wcs-card-body> </wcs-card-body>
</wcs-card> </wcs-card>
)} )}
+58 -6
View File
@@ -73,16 +73,27 @@ export default function ModifierTravaux() {
const el = tabsRef.current; const el = tabsRef.current;
if (!el) return; if (!el) return;
const handleTabChange = (e) => { const handleTabChange = (e) => {
if (e.detail?.selectedKey) { const key = e.detail?.selectedKey || e.detail?.tabName || e.detail?.value;
setActiveTabKey(e.detail.selectedKey); if (key) {
setActiveTabKey(key);
} }
}; };
el.addEventListener('tabChange', handleTabChange);
el.addEventListener('wcsTabsChange', handleTabChange);
el.addEventListener('wcsChange', handleTabChange); el.addEventListener('wcsChange', handleTabChange);
return () => { return () => {
el.removeEventListener('tabChange', handleTabChange);
el.removeEventListener('wcsTabsChange', handleTabChange);
el.removeEventListener('wcsChange', handleTabChange); el.removeEventListener('wcsChange', handleTabChange);
}; };
}, []); }, []);
useEffect(() => {
if (tabsRef.current) {
tabsRef.current.selectedKey = activeTabKey;
}
}, [activeTabKey]);
const loadTravail = useCallback(async () => { const loadTravail = useCallback(async () => {
setLoading(true); setLoading(true);
try { try {
@@ -290,10 +301,10 @@ export default function ModifierTravaux() {
{/* Navigation par Onglets WCS */} {/* Navigation par Onglets WCS */}
<div className="mb-4"> <div className="mb-4">
<wcs-tabs ref={tabsRef} selected-key={activeTabKey}> <wcs-tabs ref={tabsRef} selected-key={activeTabKey} headers-only="true">
<wcs-tab header="1. Général & Ligne" item-key="general"></wcs-tab> <wcs-tab header="1. Général & Ligne" item-key="general" onClick={() => setActiveTabKey('general')}></wcs-tab>
<wcs-tab header="2. Calendrier & Période" item-key="calendrier"></wcs-tab> <wcs-tab header="2. Calendrier & Période" item-key="calendrier" onClick={() => setActiveTabKey('calendrier')}></wcs-tab>
<wcs-tab header={`3. Substitutions (${horairesSelectionnes.length})`} item-key="substitutions"></wcs-tab> <wcs-tab header={`3. Substitutions (${horairesSelectionnes.length})`} item-key="substitutions" onClick={() => setActiveTabKey('substitutions')}></wcs-tab>
</wcs-tabs> </wcs-tabs>
</div> </div>
@@ -348,6 +359,17 @@ export default function ModifierTravaux() {
placeholder="Détaillez les impacts prévus, motifs techniques, gares concernées..." placeholder="Détaillez les impacts prévus, motifs techniques, gares concernées..."
/> />
</div> </div>
<div className="d-flex justify-content-end mt-4 pt-3 border-top">
<wcs-button
mode="stroked"
className="wcs-primary"
onClick={() => setActiveTabKey('calendrier')}
>
<span>Étape suivante : Calendrier & Période</span>
<wcs-mat-icon icon="arrow_forward" size="s" class="ml-1"></wcs-mat-icon>
</wcs-button>
</div>
</wcs-card-body> </wcs-card-body>
</wcs-card> </wcs-card>
)} )}
@@ -441,6 +463,25 @@ export default function ModifierTravaux() {
})} })}
</div> </div>
</div> </div>
<div className="d-flex justify-content-between mt-4 pt-3 border-top">
<wcs-button
mode="stroked"
className="wcs-secondary"
onClick={() => setActiveTabKey('general')}
>
<wcs-mat-icon icon="arrow_back" size="s" class="mr-1"></wcs-mat-icon>
<span>Précédent : Général</span>
</wcs-button>
<wcs-button
mode="stroked"
className="wcs-primary"
onClick={() => setActiveTabKey('substitutions')}
>
<span>Étape suivante : Substitutions</span>
<wcs-mat-icon icon="arrow_forward" size="s" class="ml-1"></wcs-mat-icon>
</wcs-button>
</div>
</wcs-card-body> </wcs-card-body>
</wcs-card> </wcs-card>
)} )}
@@ -593,6 +634,17 @@ export default function ModifierTravaux() {
)} )}
</div> </div>
)} )}
<div className="d-flex justify-content-start mt-4 pt-3 border-top">
<wcs-button
mode="stroked"
className="wcs-secondary"
onClick={() => setActiveTabKey('calendrier')}
>
<wcs-mat-icon icon="arrow_back" size="s" class="mr-1"></wcs-mat-icon>
<span>Précédent : Calendrier & Période</span>
</wcs-button>
</div>
</wcs-card-body> </wcs-card-body>
</wcs-card> </wcs-card>
)} )}