diff --git a/frontend/src/components/dashboard/FleetDashboardShell.jsx b/frontend/src/components/dashboard/FleetDashboardShell.jsx index ef1d971..bd80e42 100644 --- a/frontend/src/components/dashboard/FleetDashboardShell.jsx +++ b/frontend/src/components/dashboard/FleetDashboardShell.jsx @@ -91,6 +91,13 @@ function formatCost(value) { return `${numeric.toFixed(2)} EUR`; } +function normalizeComparableId(value) { + if (value && typeof value === 'object') { + return value.id ?? value.pk ?? ''; + } + return value ?? ''; +} + const PAGE_MODE_TO_SECTION = { dashboard: 'dashboard', 'work-orders': 'work-orders', @@ -344,14 +351,31 @@ export default function FleetDashboardShell({ initialSection = 'dashboard', page }); const scopedWorkOrders = useMemo(() => { const sorted = [...workOrders].sort((a, b) => String(b.date || '').localeCompare(String(a.date || ''))); + const isServiserUser = Boolean(user?.is_serviser); + const isSupervisorUser = Boolean(user?.is_team_member) && !Boolean(user?.is_serviser); + const currentUserId = normalizeComparableId(user?.id); + + const roleScoped = sorted.filter((order) => { + if (!isServiserUser || isSupervisorUser) { + return true; + } + if (!currentUserId) { + return false; + } + const creatorCandidates = [order?.creator, order?.creator_id]; + return creatorCandidates.some((candidate) => ( + String(normalizeComparableId(candidate)) === String(currentUserId) + )); + }); + if (workOrderScope === 'all') { - return sorted; + return roleScoped; } if (!hydratedSelectedVehicleId) { return []; } - return sorted.filter((order) => String(order.vehicle) === String(hydratedSelectedVehicleId)); - }, [workOrders, workOrderScope, hydratedSelectedVehicleId]); + return roleScoped.filter((order) => String(order.vehicle) === String(hydratedSelectedVehicleId)); + }, [workOrders, workOrderScope, hydratedSelectedVehicleId, user?.id, user?.is_serviser, user?.is_team_member]); const pageSize = 10; const totalPages = Math.max(1, Math.ceil(scopedWorkOrders.length / pageSize)); const latestWorkOrders = useMemo( @@ -1214,6 +1238,13 @@ export default function FleetDashboardShell({ initialSection = 'dashboard', page setSelectedServiceRecord(updatedRecord); fetchFleetDashboardData({ silent: true }); }} + onOpenPhotoUpload={(record) => { + const targetId = record?.id ?? selectedServiceRecord?.id; + if (!targetId) return; + setSelectedServiceRecord(null); + setServiceRecordBackTask(null); + setPhotoUpload({ open: true, serviceRecordId: targetId }); + }} onBack={serviceRecordBackTask ? () => { setSelectedServiceRecord(null); diff --git a/frontend/src/components/fleet/ServiceRecordDetailModal.jsx b/frontend/src/components/fleet/ServiceRecordDetailModal.jsx index 077d451..5af354f 100644 --- a/frontend/src/components/fleet/ServiceRecordDetailModal.jsx +++ b/frontend/src/components/fleet/ServiceRecordDetailModal.jsx @@ -34,6 +34,7 @@ export default function ServiceRecordDetailModal({ serviceRecord, onClose, onUpdated, + onOpenPhotoUpload = null, onBack = null, backLabel = 'Natrag', }) { @@ -411,6 +412,14 @@ export default function ServiceRecordDetailModal({ )} {editMode && ( <> +