From 4735e2b9bb3c1e86c02e63f50dccdc4168b95981 Mon Sep 17 00:00:00 2001 From: Michael Chus Date: Tue, 3 Feb 2026 07:12:18 +0300 Subject: [PATCH] feat: always show admin menu with online checks for operations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Changes:** 1. **Admin menu always visible** (base.html) - Removed 'hidden' class from "Администратор цен" link - Menu no longer depends on write permission check - Users can access pricing/pricelists pages in offline mode 2. **Online status checks for mutations** (admin_pricing.html) - Added checkOnlineStatus() helper function - createPricelist() checks online before creating - deletePricelist() checks online before deleting - Clear user feedback when operations blocked offline **User Impact:** - Admin menu accessible in both online and offline modes - View-only access to pricelists when offline - Clear error messages when attempting mutations offline - Better offline-first UX Part of Phase 2.5: Full Offline Mode Co-Authored-By: Claude Sonnet 4.5 --- web/templates/admin_pricing.html | 23 +++++++++++++++++++++++ web/templates/base.html | 16 +++++----------- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/web/templates/admin_pricing.html b/web/templates/admin_pricing.html index 5e2607b..d609d32 100644 --- a/web/templates/admin_pricing.html +++ b/web/templates/admin_pricing.html @@ -1032,7 +1032,23 @@ function closePricelistsCreateModal() { document.getElementById('pricelists-create-modal').classList.remove('flex'); } +async function checkOnlineStatus() { + try { + const resp = await fetch('/api/db-status'); + const data = await resp.json(); + return data.connected === true; + } catch(e) { + return false; + } +} + async function createPricelist() { + // Check if online before creating + const isOnline = await checkOnlineStatus(); + if (!isOnline) { + throw new Error('Создание прайслистов доступно только в онлайн режиме'); + } + const resp = await fetch('/api/pricelists', { method: 'POST', headers: { @@ -1050,6 +1066,13 @@ async function createPricelist() { } async function deletePricelist(id) { + // Check if online before deleting + const isOnline = await checkOnlineStatus(); + if (!isOnline) { + showToast('Удаление прайслистов доступно только в онлайн режиме', 'error'); + return; + } + if (!confirm('Удалить этот прайслист?')) return; try { diff --git a/web/templates/base.html b/web/templates/base.html index 1cf1124..7b489b1 100644 --- a/web/templates/base.html +++ b/web/templates/base.html @@ -20,7 +20,7 @@ QuoteForge @@ -237,17 +237,11 @@ } } + // Admin pricing link is now always visible + // Write permission is checked at operation time (create/delete) async function checkWritePermission() { - try { - const resp = await fetch('/api/pricelists/can-write'); - const data = await resp.json(); - if (data.can_write) { - const link = document.getElementById('admin-pricing-link'); - if (link) link.classList.remove('hidden'); - } - } catch(e) { - console.error('Failed to check write permission:', e); - } + // No longer needed - link always visible in offline-first mode + // Operations will check online status when executed } // Load last sync time for dropdown (removed since dropdown is gone)