diff --git a/src/pages/HousekeepingPage.tsx b/src/pages/HousekeepingPage.tsx index 3fa7db2..6697be1 100644 --- a/src/pages/HousekeepingPage.tsx +++ b/src/pages/HousekeepingPage.tsx @@ -652,6 +652,25 @@ function TaskCard({ task, onStatusChange, onReport, slug }: { const [minibarLoading, setMinibarLoading] = useState(false) const [minibarQty, setMinibarQty] = useState>({}) const [minibarSaving, setMinibarSaving] = useState(false) + const [minibarItemId, setMinibarItemId] = useState(null) // checklist item id named "минибар" + const [minibarItemExpanded, setMinibarItemExpanded] = useState(false) + + // Auto-open checklist when task is in progress + useEffect(() => { + if (task.status === 'in_progress') { + setDetailOpen(true) + setDetailTab('checklist') + setChecklistLoading(true) + api.checklists.getTaskChecklist(slug, task.id) + .then(cl => { + setChecklist(cl) + const mb = cl.items.find(i => /минибар/i.test(i.text)) + setMinibarItemId(mb?.id ?? null) + }) + .catch(() => {}) + .finally(() => setChecklistLoading(false)) + } + }, []) // eslint-disable-line react-hooks/exhaustive-deps const openDetail = async (tab: 'checklist' | 'minibar') => { setDetailTab(tab) @@ -661,6 +680,8 @@ function TaskCard({ task, onStatusChange, onReport, slug }: { try { const cl = await api.checklists.getTaskChecklist(slug, task.id) setChecklist(cl) + const mb = cl.items.find(i => /минибар/i.test(i.text)) + setMinibarItemId(mb?.id ?? null) } catch { /* ignore */ } finally { setChecklistLoading(false) } @@ -680,6 +701,43 @@ function TaskCard({ task, onStatusChange, onReport, slug }: { } } + const openMinibarForItem = async () => { + setMinibarItemExpanded(true) + if (minibarItems.length === 0) { + setMinibarLoading(true) + try { + const [items, cons] = await Promise.all([ + api.minibar.listItems(slug), + api.minibar.getTaskConsumptions(slug, task.id), + ]) + setMinibarItems(items) + setConsumptions(cons) + } catch { /* ignore */ } finally { + setMinibarLoading(false) + } + } + } + + const confirmMinibarFromChecklist = async () => { + if (Object.values(minibarQty).some(q => q > 0)) await submitMinibar() + setMinibarCheckedLocal(true) + try { + await api.housekeeping.update(slug, task.id, { minibar_checked: true }) + } catch { setMinibarCheckedLocal(false) } + if (minibarItemId) { + try { + await api.checklists.completeItem(slug, task.id, minibarItemId) + setChecklist(prev => prev ? { + ...prev, + items: prev.items.map(i => i.id === minibarItemId + ? { ...i, completedAt: new Date().toISOString(), completedBy: 'Вы' } + : i), + } : null) + } catch { /* ignore */ } + } + setMinibarItemExpanded(false) + } + const toggleChecklistItem = async (itemId: string, completed: boolean) => { if (!checklist) return try { @@ -991,6 +1049,74 @@ function TaskCard({ task, onStatusChange, onReport, slug }: { )} {!checklistLoading && checklist && checklist.items.map(item => { const done = !!item.completedAt + const isMbItem = item.id === minibarItemId + + // Special minibar checklist item + if (isMbItem) { + return ( +
+ + {minibarItemExpanded && !done && ( +
+ {minibarLoading &&
} + {!minibarLoading && minibarItems.map(mi => { + const qty = minibarQty[mi.id] ?? 0 + return ( +
+ {mi.name} + {Number(mi.price).toFixed(0)} руб. +
+ + {qty} + +
+
+ ) + })} + {consumptions.length > 0 && ( +
+

Уже записано:

+ {consumptions.map(c => ( +
+ {c.itemName} × {c.quantity} + +
+ ))} +
+ )} + +
+ )} +
+ ) + } + + // Regular checklist item return ( ) @@ -1117,36 +1236,26 @@ function TaskCard({ task, onStatusChange, onReport, slug }: { Начать )} - {task.status === 'in_progress' && !completingOpen && ( - - )} - {!reportOpen && !completingOpen && ( - - )} - {!reportOpen && !completingOpen && ( - + {task.status === 'in_progress' && !completingOpen && !reportOpen && ( + <> + + + )}