V5.0.0 //
-> Refonte du système de GESTION DES ROULEMENTS de matériels roulants -> Optimisation rendue BDD
This commit is contained in:
1 parent
f77d59ca1c
commit
4b771e546e
6 files changed
+310
-4182
No files matched your search
Generated
+185
-4164
File diff suppressed because it is too large.
Load diff
@@ -48,5 +48,8 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"supabase": "^2.115.0"
|
"supabase": "^2.115.0"
|
||||||
|
},
|
||||||
|
"overrides": {
|
||||||
|
"webpack": "^5.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -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>
|
||||||
)}
|
)}
|
||||||
|
|||||||
Reference in new issue
Block a user