From 8ad1f40601942bc1b095313108625dd07cdacd22 Mon Sep 17 00:00:00 2001 From: mariomitte Date: Thu, 6 Aug 2026 20:46:20 +0200 Subject: [PATCH] fix: restore calendar ZIP archive actions Bring back the calendar widget controls for triggering monthly ZIP archive generation for service tasks and work orders, including the modal actions and loading states. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../dashboard/TaskCalendarWidget.jsx | 83 ++++++++++++++++++- 1 file changed, 82 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/dashboard/TaskCalendarWidget.jsx b/frontend/src/components/dashboard/TaskCalendarWidget.jsx index 58d7a1c..294eb4a 100644 --- a/frontend/src/components/dashboard/TaskCalendarWidget.jsx +++ b/frontend/src/components/dashboard/TaskCalendarWidget.jsx @@ -1,8 +1,10 @@ import { useEffect, useMemo, useState } from 'preact/hooks'; import { getStatusLabel } from '../../stores/taskStore'; import { + downloadMonthlyServiceTasksArchive, downloadMonthlyCostsReport, downloadMonthlyServiserReport, + downloadMonthlyWorkOrdersArchive, fetchMonthlyCostInvoices, fetchMonthlyServicerEntries, upsertMonthlyServicerEntry, @@ -89,6 +91,9 @@ export default function TaskCalendarWidget({ tasks = [], notes = [], workOrders const [manualEntryDraft, setManualEntryDraft] = useState(null); const [manualEntryError, setManualEntryError] = useState(''); const [savingManualEntry, setSavingManualEntry] = useState(false); + const [bulkDownloadOpen, setBulkDownloadOpen] = useState(false); + const [downloadingAllTasks, setDownloadingAllTasks] = useState(false); + const [downloadingAllWorkOrders, setDownloadingAllWorkOrders] = useState(false); const reportOpen = reportType !== null; const panelWidth = reportOpen ? 920 : 300; @@ -341,6 +346,9 @@ export default function TaskCalendarWidget({ tasks = [], notes = [], workOrders function toggleReport(type) { setReportType((prev) => (prev === type ? null : type)); setManualEntryTarget(null); + if (type !== 'servicer') { + setBulkDownloadOpen(false); + } } async function handleDownload() { @@ -357,6 +365,28 @@ export default function TaskCalendarWidget({ tasks = [], notes = [], workOrders } } + async function handleDownloadAllTasksArchive() { + if (downloadingAllTasks) return; + setDownloadingAllTasks(true); + try { + await downloadMonthlyServiceTasksArchive(viewYear, viewMonth + 1); + setBulkDownloadOpen(false); + } finally { + setDownloadingAllTasks(false); + } + } + + async function handleDownloadAllWorkOrdersArchive() { + if (downloadingAllWorkOrders) return; + setDownloadingAllWorkOrders(true); + try { + await downloadMonthlyWorkOrdersArchive(viewYear, viewMonth + 1); + setBulkDownloadOpen(false); + } finally { + setDownloadingAllWorkOrders(false); + } + } + function handleServicerRowClick(row) { if (!row?.clickable) return; setManualEntryTarget(row); @@ -631,8 +661,17 @@ export default function TaskCalendarWidget({ tasks = [], notes = [], workOrders disabled={downloading} className="rounded-md bg-indigo-600 px-3 py-1.5 text-xs font-medium text-white hover:bg-indigo-700 disabled:opacity-60" > - {downloading ? 'Preuzimanje...' : 'Preuzmi DOCX'} + {downloading ? 'Preuzimanje...' : reportType === 'servicer' ? 'Preuzmi mjesečni izvještaj' : 'Preuzmi DOCX'} + {reportType === 'servicer' && ( + + )}

@@ -825,6 +864,48 @@ export default function TaskCalendarWidget({ tasks = [], notes = [], workOrders )} + + {bulkDownloadOpen && reportType === 'servicer' && ( +

+
+
+
+

Preuzmi ZIP arhivu

+

+ {MONTH_NAMES[viewMonth]} {viewYear} +

+
+ +
+ +
+ + +
+
+
+ )} )}