// AdminOrders — admin view of all orders with status edit. const { useState: useAdmOState, useEffect: useAdmOEffect } = React; const ADMIN_STATUSES = ['Posted', 'Pending', 'Completed', 'Cancelled']; function AdminOrders({ onNavigate }) { const [statusFilter, setStatusFilter] = useAdmOState('all'); const [page, setPage] = useAdmOState(1); const [items, setItems] = useAdmOState([]); const [total, setTotal] = useAdmOState(0); const [loading, setLoading] = useAdmOState(true); const [busyId, setBusyId] = useAdmOState(null); const [guestFilter, setGuestFilter] = useAdmOState(false); // false = regular, true = guest const load = async (p, sf, gf) => { setLoading(true); let url = `/api/admin/orders?page=${p}&page_size=20`; if (gf) { url += '&is_guest=true'; } else { if (sf && sf !== 'all') url += `&status=${sf}`; } try { const data = await api.get(url); if (!data.__unauthorized) { setItems(data.items || []); setTotal(data.total || 0); } } catch (_) {} finally { setLoading(false); } }; useAdmOEffect(() => { load(page, statusFilter, guestFilter); }, [page, statusFilter, guestFilter]); const setStatus = async (orderId, nextStatus) => { setBusyId(orderId); try { await api.post(`/api/admin/orders/${orderId}/status`, { status: nextStatus }); await load(page, statusFilter); } catch (e) { alert(e.message || 'Не удалось изменить статус'); } finally { setBusyId(null); } }; const totalPages = Math.max(1, Math.ceil(total / 20)); return (

Заказы

{!guestFilter && (
{['all', ...ADMIN_STATUSES].map(s => ( ))}
)} {loading ?
Загрузка...
: (
{items.map(o => ( ))} {items.length === 0 && ( )}
#ЮзерУслугаСуммаСтатусДатаДействия
#{o.order_id} {o.is_guest ? 📞 {o.guest_phone} : (o.user_name ? '@' + o.user_name : '#' + o.user_id) } {o.position_name} {o.price.toLocaleString('ru-RU')} ₽ {formatDisplay(o.date) || '—'} {o.is_guest ? ( ) : ( )}
Заказов нет
) } {totalPages > 1 && (
Стр. {page} из {totalPages}
)}
); } Object.assign(window, { AdminOrders });