From 79145c58e4e6b9b3ec7d9b256b0ea924c2bbb8e4 Mon Sep 17 00:00:00 2001 From: mariomitte Date: Sat, 1 Aug 2026 08:09:45 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20prika=C5=BEi=20shared=20putne=20naloge?= =?UTF-8?q?=20u=20kontekstu=20i=20filtriraj=20zatvorene=20u=20dropdownu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - scopedWorkOrders: u context modu uključi i putne naloge koji su dodijeljeni taskovima kontekstne dizalice (cross-crane shared WO), a ne samo one čiji vehicle === hydratedSelectedVehicleId - selectedTaskWorkOrders: prikaži samo otvorene naloge (status != closed) u dropdownu za dodjelu putnog naloga tasku - Ažuriran emptyMessage tablice da sugerira prebacivanje na 'svi nalozi' Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../dashboard/FleetDashboardShell.jsx | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/frontend/src/components/dashboard/FleetDashboardShell.jsx b/frontend/src/components/dashboard/FleetDashboardShell.jsx index 8a9253e..6b424a2 100644 --- a/frontend/src/components/dashboard/FleetDashboardShell.jsx +++ b/frontend/src/components/dashboard/FleetDashboardShell.jsx @@ -423,8 +423,19 @@ export default function FleetDashboardShell({ initialSection = 'dashboard', page if (!hydratedSelectedVehicleId) { return []; } - return codeSorted.filter((order) => String(order.vehicle) === String(hydratedSelectedVehicleId)); - }, [workOrders, workOrderScope, hydratedSelectedVehicleId, user?.id, user?.is_serviser, user?.is_team_member, workOrderCodeSortDirection]); + // Collect work order IDs that are directly assigned to tasks of the context crane. + // This covers cross-crane shared work orders: a WO created for crane A can be + // assigned to a task of crane B — it should still appear in crane B's context view. + const contextTaskWorkOrderIds = new Set( + tasks + .filter((t) => String(t.vehicle || '') === String(hydratedSelectedVehicleId) && t.work_order) + .map((t) => String(t.work_order)) + ); + return codeSorted.filter( + (order) => String(order.vehicle) === String(hydratedSelectedVehicleId) + || contextTaskWorkOrderIds.has(String(order.id)) + ); + }, [workOrders, tasks, workOrderScope, hydratedSelectedVehicleId, user?.id, user?.is_serviser, user?.is_team_member, workOrderCodeSortDirection]); const pageSize = 10; const totalPages = Math.max(1, Math.ceil(scopedWorkOrders.length / pageSize)); const latestWorkOrders = useMemo( @@ -541,8 +552,11 @@ export default function FleetDashboardShell({ initialSection = 'dashboard', page }, [serviceRecords, selectedTask?.id]); const selectedTaskWorkOrders = useMemo(() => { if (!selectedTask) return []; - // Show ALL work orders — cross-crane sharing is allowed so no vehicle filter. - return [...workOrders].sort((a, b) => String(b.date || '').localeCompare(String(a.date || ''))); + // Only open work orders in the dropdown — closed ones cannot receive new tasks. + // Cross-crane sharing allowed: no vehicle filter. + return [...workOrders] + .filter((order) => String(order.status || '').toLowerCase() !== 'closed') + .sort((a, b) => String(b.date || '').localeCompare(String(a.date || ''))); }, [selectedTask, workOrders]); useEffect(() => { @@ -945,7 +959,7 @@ export default function FleetDashboardShell({ initialSection = 'dashboard', page workOrderScope === 'context' ? (!hydratedSelectedVehicleId ? 'Odaberite dizalicu za prikaz putnih naloga iz servisnog konteksta.' - : 'Nema dostupnih putnih naloga za odabrani servisni kontekst.') + : 'Nema dostupnih putnih naloga za odabrani servisni kontekst. Možete prebaciti na prikaz svih naloga.') : 'Nema dostupnih putnih naloga.' } renderRow={(workOrder) => (