@@ -66,6 +66,8 @@ export default function TourTabs({
6666 if ( onTourSelect ) {
6767 if ( courierId === null ) {
6868 onTourSelect ( null ) ; // Vue globale : afficher tous les tours
69+ } else if ( courierId === 'unassigned' ) {
70+ onTourSelect ( { courierId : 'unassigned' } ) ;
6971 } else {
7072 const selectedTour = displayTours . find ( t => t . courierId === courierId ) ;
7173 onTourSelect ( selectedTour ) ;
@@ -142,6 +144,19 @@ export default function TourTabs({
142144 return Array . from ( union . values ( ) ) ;
143145 } , [ allDemands , demandAssignments , unassignedDemands ] ) ;
144146
147+ const hasUnassigned = derivedUnassigned . length > 0 ;
148+
149+ // Si l'onglet N/A est sélectionné mais qu'il n'y a plus de demandes non assignées,
150+ // revenir automatiquement à la vue globale pour éviter un onglet vide.
151+ useEffect ( ( ) => {
152+ if ( selectedCourierId === 'unassigned' && ! hasUnassigned ) {
153+ setSelectedCourierId ( null ) ;
154+ if ( onTourSelect ) {
155+ onTourSelect ( null ) ;
156+ }
157+ }
158+ } , [ selectedCourierId , hasUnassigned , onTourSelect ] ) ;
159+
145160 const demandsForCourier = ( courierId ) =>
146161 allDemands . filter ( ( d ) => ( demandAssignments ?. [ d . id ] ?? null ) === courierId ) ;
147162
@@ -184,9 +199,12 @@ export default function TourTabs({
184199 setShowAssignModal ( false ) ;
185200 } ;
186201
187- const handleRemove = async ( demand ) => {
202+ const handleRemove = async ( demandOrId ) => {
188203 if ( ! onRemoveDemand ) return ;
189- await onRemoveDemand ( demand . id ) ;
204+ const demandId =
205+ demandOrId && typeof demandOrId === 'object' ? demandOrId . id : demandOrId ;
206+ if ( ! demandId ) return ;
207+ await onRemoveDemand ( demandId ) ;
190208 } ;
191209
192210 return (
@@ -234,6 +252,22 @@ export default function TourTabs({
234252 Vue globale
235253 </ span >
236254 </ button >
255+ { /* Onglet Non assignées (affiché uniquement s'il existe des demandes non assignées) */ }
256+ { hasUnassigned && (
257+ < button
258+ onClick = { ( ) => handleTabClick ( 'unassigned' ) }
259+ className = { `px-4 py-3 font-medium whitespace-nowrap transition-colors flex-shrink-0 ${
260+ selectedCourierId === 'unassigned'
261+ ? 'border-b-2 border-blue-500 text-blue-400'
262+ : 'text-gray-400 hover:text-white hover:bg-gray-700/50'
263+ } `}
264+ >
265+ < span className = "inline-flex items-center gap-2" >
266+ < Icon name = "na" className = "text-blue-400" />
267+ N/A
268+ </ span >
269+ </ button >
270+ ) }
237271
238272 { /* Onglets par coursier */ }
239273 { displayTours . map ( tour => (
@@ -278,6 +312,22 @@ export default function TourTabs({
278312 />
279313 ) }
280314 </ div >
315+ ) : selectedCourierId === 'unassigned' && hasUnassigned ? (
316+ < div className = "space-y-4" >
317+ < div className = "flex items-center gap-2" >
318+ < span className = "w-3 h-3 rounded-full bg-gray-500" />
319+ < h3 className = "text-lg font-semibold text-white" > Demandes non assignées</ h3 >
320+ </ div >
321+ < DemandAssignmentTable
322+ demands = { derivedUnassigned }
323+ assignments = { demandAssignments }
324+ courierOptions = { courierOptions }
325+ onReassign = { handleRequestReassign }
326+ onRemove = { handleRemove }
327+ isBusy = { isBusy }
328+ emptyMessage = "Aucune demande non assignée"
329+ />
330+ </ div >
281331 ) : (
282332 < div className = "space-y-4" >
283333 < div className = "flex items-center justify-between" >
0 commit comments