fix: premjesti kalendar widget u Layout, popravi PDF toast i Servisi danas

- TaskCalendarPortal u Layout.astro (van AnimatedPage transforma) pa fixed
  pozicija uvijek prati viewport rub bez probijanja sadržaja
- Kalendar widgeta panel koristi clipping wrapper (overflow:hidden + animirana
  width) umjesto translate3d — potpuno skriva sjenu i border kad je zatvoren
- Serviser vidi samo svoje taskove, supervisor vidi sve; neprijavljeni korisnik
  ne vidi widget (return null)
- FleetDashboardShell sluša calendar:open-task event i otvara TaskServiceRecordsModal
- Servisi danas broji Taskove (scheduled_date=danas, status aktivan/servis)
  umjesto Servisnih zapisa
- downloadGeneratedPdfByUrl hvata grešku i prikazuje Toast (npr. PDF nije
  dostupan ili je istekao)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
mariomitte
2026-07-19 15:27:20 +02:00
parent 0c9e1b7d50
commit fe7edf5643
5 changed files with 91 additions and 17 deletions

View File

@@ -6,7 +6,6 @@ import WorkOrderModal from './WorkOrderModal';
import TaskCreateModal from './TaskCreateModal';
import TaskServiceRecordsModal from './TaskServiceRecordsModal';
import WorkOrderDetailModal from './WorkOrderDetailModal';
import TaskCalendarWidget from './TaskCalendarWidget';
import SyncLogPanel from './SyncLogPanel';
import ServiceRecordForm from '../fleet/ServiceRecordForm';
import ServicePhotoUpload from '../fleet/ServicePhotoUpload';
@@ -145,6 +144,15 @@ export default function FleetDashboardShell({ initialSection = 'dashboard', page
hydrateServiceContext();
}, []);
useEffect(() => {
function onCalendarOpenTask(event) {
const task = event?.detail?.task;
if (task) setSelectedTask(task);
}
window.addEventListener('calendar:open-task', onCalendarOpenTask);
return () => window.removeEventListener('calendar:open-task', onCalendarOpenTask);
}, []);
useEffect(() => {
const nextSection = String(resolvedInitialSection || 'dashboard');
setActiveSection(nextSection);
@@ -593,12 +601,6 @@ export default function FleetDashboardShell({ initialSection = 'dashboard', page
return (
<AnimatedPage className="min-h-screen">
{hasMounted && (
<TaskCalendarWidget
tasks={tasks}
onTaskClick={(task) => setSelectedTask(task)}
/>
)}
<main className="min-w-0">
<DashboardTopbar
activeSection={activeSection}