// Configuration let config = { apiBaseUrl: 'https://biz.payfrit.com/api', businessId: null, servicePointId: null, stationId: null, stationName: null, stationColor: null, refreshInterval: 5000, }; // State let orders = []; let stations = []; let refreshTimer = null; // Status ID mapping const STATUS = { NEW: 1, PREPARING: 2, READY: 3, COMPLETED: 4 }; const STATUS_NAMES = { 1: 'New', 2: 'Preparing', 3: 'Ready', 4: 'Completed' }; // Initialize document.addEventListener('DOMContentLoaded', () => { loadConfig(); checkStationSelection(); }); // Load config from localStorage function loadConfig() { // Get business ID from portal's shared localStorage (same key portal uses) const portalBusinessId = localStorage.getItem('payfrit_portal_business'); if (portalBusinessId && !isNaN(parseInt(portalBusinessId))) { config.businessId = parseInt(portalBusinessId); } // Load KDS-specific settings const saved = localStorage.getItem('kds_config'); if (saved) { try { const parsed = JSON.parse(saved); config.servicePointId = parsed.servicePointId || null; config.stationId = parsed.stationId || null; config.stationName = parsed.stationName || null; config.stationColor = parsed.stationColor || null; config.refreshInterval = (parsed.refreshInterval || 5) * 1000; } catch (e) { console.error('Failed to load config:', e); } } document.getElementById('businessIdInput').value = config.businessId || ''; document.getElementById('servicePointIdInput').value = config.servicePointId || ''; document.getElementById('refreshIntervalInput').value = config.refreshInterval / 1000; // If no business ID, show config panel if (!config.businessId) { toggleConfig(); } } function saveConfigToStorage() { // Save KDS-specific settings only (businessId comes from portal) localStorage.setItem('kds_config', JSON.stringify({ servicePointId: config.servicePointId, stationId: config.stationId, stationName: config.stationName, stationColor: config.stationColor, refreshInterval: config.refreshInterval / 1000 })); } // Check if station selection is needed async function checkStationSelection() { if (!config.businessId) { console.log('[KDS] No businessId, cannot start'); return; } console.log('[KDS] Starting with businessId:', config.businessId, 'stationId:', config.stationId); // Load business name await loadBusinessName(); // If station already selected (including 0 for "all"), start KDS if (config.stationId !== null && config.stationId !== undefined) { updateStationBadge(); startAutoRefresh(); return; } // Load stations to see if we need to show picker await loadStations(); if (stations.length > 0) { showStationSelection(); } else { // No stations configured, default to all orders config.stationId = 0; updateStationBadge(); startAutoRefresh(); } } // Load business name from API async function loadBusinessName() { if (!config.businessId) return; try { const response = await fetch(`${config.apiBaseUrl}/businesses/get.cfm`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ BusinessID: config.businessId }) }); const data = await response.json(); if (data.OK && data.BUSINESS) { document.getElementById('businessName').textContent = data.BUSINESS.BusinessName || 'Kitchen Display System'; } } catch (e) { console.error('Failed to load business name:', e); } } // Load stations from API async function loadStations() { if (!config.businessId) return; try { const response = await fetch(`${config.apiBaseUrl}/stations/list.cfm`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ BusinessID: config.businessId }) }); const data = await response.json(); if (data.OK) { stations = data.STATIONS || []; } } catch (e) { console.error('Failed to load stations:', e); } } // Show station selection overlay async function showStationSelection() { if (stations.length === 0) { await loadStations(); } const overlay = document.getElementById('stationOverlay'); const buttons = document.getElementById('stationButtons'); let html = ` `; stations.forEach(s => { const color = s.StationColor || '#666'; html += ` `; }); buttons.innerHTML = html; overlay.classList.remove('hidden'); } // Select a station function selectStation(stationId, stationName, stationColor) { config.stationId = stationId || null; config.stationName = stationName; config.stationColor = stationColor; // Save to localStorage localStorage.setItem('kds_config', JSON.stringify({ businessId: config.businessId, servicePointId: config.servicePointId, stationId: config.stationId, stationName: config.stationName, stationColor: config.stationColor, refreshInterval: config.refreshInterval / 1000 })); // Hide overlay and start document.getElementById('stationOverlay').classList.add('hidden'); updateStationBadge(); startAutoRefresh(); } // Update station badge in header function updateStationBadge() { const badge = document.getElementById('stationBadge'); if (config.stationId && config.stationName) { const color = config.stationColor || '#3b82f6'; badge.innerHTML = `${escapeHtml(config.stationName)}`; } else { badge.innerHTML = `All Stations`; } } // Save config to localStorage function saveConfig() { const businessId = parseInt(document.getElementById('businessIdInput').value) || null; const servicePointId = parseInt(document.getElementById('servicePointIdInput').value) || null; const refreshInterval = parseInt(document.getElementById('refreshIntervalInput').value) || 5; if (!businessId) { alert('Business ID is required'); return; } config.businessId = businessId; config.servicePointId = servicePointId; config.refreshInterval = refreshInterval * 1000; config.stationId = null; // Reset station selection when changing business config.stationName = null; config.stationColor = null; localStorage.setItem('kds_config', JSON.stringify({ businessId: config.businessId, servicePointId: config.servicePointId, stationId: null, stationName: null, stationColor: null, refreshInterval: refreshInterval })); toggleConfig(); location.reload(); } // Toggle config panel function toggleConfig() { const panel = document.getElementById('configPanel'); panel.classList.toggle('show'); } // Start auto-refresh function startAutoRefresh() { if (!config.businessId) return; loadOrders(); if (refreshTimer) clearInterval(refreshTimer); refreshTimer = setInterval(loadOrders, config.refreshInterval); } // Load orders from API async function loadOrders() { if (!config.businessId) return; try { const url = `${config.apiBaseUrl}/orders/listForKDS.cfm`; const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ BusinessID: config.businessId, ServicePointID: config.servicePointId || 0, StationID: config.stationId || 0 }) }); const data = await response.json(); if (data.OK) { orders = data.ORDERS || []; renderOrders(); updateStatus(true, `${orders.length} active orders`); } else { updateStatus(false, `Error: ${data.MESSAGE || data.ERROR}`); } } catch (error) { console.error('Failed to load orders:', error); updateStatus(false, 'Connection error'); } } // Update status indicator function updateStatus(isConnected, message) { const dot = document.getElementById('statusDot'); const text = document.getElementById('statusText'); if (isConnected) { dot.classList.remove('error'); text.textContent = message || 'Connected'; } else { dot.classList.add('error'); text.textContent = message || 'Disconnected'; } } // Render orders to DOM function renderOrders() { const grid = document.getElementById('ordersGrid'); console.log('renderOrders called, orders count:', orders.length); if (orders.length === 0) { grid.innerHTML = `
New orders will appear here automatically