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 && (
<>
+