Skip to content
Extraits de code Groupes Projets
Valider ed284819 rédigé par Mohsine's avatar Mohsine
Parcourir les fichiers

Merge branch 'feature/VSN-1172' into 'develop'

Resolve VSN-1172 "Feature/Integrate temporary trip generation function"

Closes VSN-1172

See merge request !295
parents 5f5aa149 22df097f
Branches
Étiquettes v0.0.90
1 requête de fusion!295Resolve VSN-1172 "Feature/Integrate temporary trip generation function"
Pipeline #22051 réussi avec l'étape
in 32 secondes
......@@ -23,5 +23,8 @@ export const circuitEndpoints = {
add: endpointPrefix + "/trip-driver-assignments/add",
update: (id: string) => endpointPrefix + `/trip-driver-assignments/update/${id}`,
},
trip: {
generateTripsTemp: (circuitId: string) => endpointPrefix + `/trip/generate-trips-tmp/${circuitId}`,
}
},
};
......@@ -11,6 +11,7 @@ type CircuitStore = {
circuits: Circuit[];
circuit: Circuit | null;
loading: boolean;
generateTripsLoading: boolean;
error: string | null;
totalElements: number;
lastUsedCircuitParams: SearchCircuitParams | null;
......@@ -20,12 +21,14 @@ type CircuitStore = {
toggleActive: (circuitCode: string) => Promise<void>;
updateCircuitStatus: (id: string, circuitState: CircuitState) => Promise<void>;
autocompleteCircuits: (circuitCode?: string) => Promise<CircuitAutocompleteResponse[]>;
generateTrips: (circuitId: string) => Promise<void>;
};
export const useCircuitStore = create<CircuitStore>((set, get) => ({
circuits: [],
circuit: null,
loading: false,
generateTripsLoading: false,
error: null,
totalElements: 0,
lastUsedCircuitParams: null,
......@@ -143,4 +146,14 @@ export const useCircuitStore = create<CircuitStore>((set, get) => ({
throw error;
}
},
generateTrips: async (circuitId: string) => {
set({ generateTripsLoading: true, error: null });
try {
await axiosInstance.get(circuitEndpoints.circuit.trip.generateTripsTemp(circuitId));
set({ generateTripsLoading: false });
} catch (error: any) {
set({ error: error.message || 'Erreur lors de la génération des trajets', generateTripsLoading: false });
throw error;
}
}
}));
\ No newline at end of file
......@@ -34,6 +34,8 @@ import { usePassengersCircuitStore } from "@/shared/api/stores/circuit-service/p
import type { IPassengerList } from "@/shared/types/passenger"
import type { AddPassengersToCircuitResponse } from "@/shared/types/circuit"
import { enqueueSnackbar } from 'notistack'
import { AddButton } from "@/shared/components/table/styles"
import { useCircuitStore } from "@/shared/api/stores/circuit-service/circuitStore"
export interface UsagerSelector {
id: string;
......@@ -58,16 +60,17 @@ const circuitUsagerConfig: TableConfig<UsagerSelector> = {
export default function CircuitUsager( {circuitId}: {circuitId: string} ) {
const router = useRouter()
const { generateTrips, generateTripsLoading } = useCircuitStore()
const [deleteDialogOpen, setDeleteDialogOpen] = useState(false)
const [userToDelete, setUserToDelete] = useState<string | null>(null)
const [selectedUsers, setSelectedUsers] = useState<string[]>([])
const [showScheduleAmendment, setShowScheduleAmendment] = useState(false)
const [generateTripsDialogOpen, setGenerateTripsDialogOpen] = useState(false)
const [selectedUsagerForAmendment, setSelectedUsagerForAmendment] = useState<UsagerForAmendment>({
id: '',
firstName: '',
lastName: '',
})
const {
passengers,
loading: passengersLoading,
......@@ -245,6 +248,22 @@ export default function CircuitUsager( {circuitId}: {circuitId: string} ) {
}
}, [addPassengersToCircuit, circuitId])
const handleGenerateTrips = useCallback(() => {
setGenerateTripsDialogOpen(true)
}, [])
const handleConfirmGenerateTrips = useCallback(async () => {
try {
await generateTrips(circuitId)
setGenerateTripsDialogOpen(false)
enqueueSnackbar("Génération des trajets effectuée avec succès", { variant: 'success' });
} catch (error: any) {
enqueueSnackbar(error.message || 'Erreur lors de la génération des trajets', { variant: 'error' });
}
}, [generateTrips, circuitId])
if (showScheduleAmendment) {
return (
<ScheduleAmendment
......@@ -258,14 +277,30 @@ export default function CircuitUsager( {circuitId}: {circuitId: string} ) {
return (
<Box>
<Stack direction="row" alignItems="center" justifyContent="space-between" gap="8px" py={2}>
<UserSelector
<UserSelector
users={usagers}
selectedUsers={selectedUsers}
onUserSelection={handleUserSelection}
loading={passengersLoading || addPassengersLoading}
/>
/>
<Stack direction="row" alignItems="center" gap="8px">
<CustomTooltip title={"Générer les trajets"} arrow>
<AddButton variant="contained" onClick={handleGenerateTrips} disabled={generateTripsLoading || !addedUsagersForTable.length}>
Générer les trajets
</AddButton>
</CustomTooltip>
<Box
sx={{
borderLeft: 1,
height: 30,
borderColor: (theme) => theme.palette.text.disabled,
mx: 1,
}}
/>
<CustomTooltip title="Refresh" arrow>
<IconButton onClick={handleResetFilters} sx={iconButtonStyles}>
<FontAwesome icon={faRotate} width={16} />
......@@ -305,6 +340,13 @@ export default function CircuitUsager( {circuitId}: {circuitId: string} ) {
onConfirm={confirmDeleteDocument}
onCancel={() => setDeleteDialogOpen(false)}
/>
<ConfirmDialog
open={generateTripsDialogOpen}
title="Confirmation de génération des trajets"
content="Êtes-vous sûr de vouloir générer les trajets ?"
onConfirm={handleConfirmGenerateTrips}
onCancel={() => setGenerateTripsDialogOpen(false)}
/>
</Box>
)
}
\ No newline at end of file
0% ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter