// Co-Service Database Save Handler window.handleSaveRealCoService = async function(e) { if (e) e.preventDefault(); const headCategory = document.getElementById('serviceCategory').value; const coName = document.getElementById('serviceName').value.trim(); const image = document.getElementById('serviceImageBase64')?.value || ''; if (!headCategory || !coName) { alert("Please enter Co-Service Title."); return false; } try { const response = await fetch('/api/save_co_category.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ headCategory, coName, image }) }); const data = await response.json(); if (data.success) { closeModal('modalService'); if(typeof showToast === 'function') showToast(data.message || `Co-Service "${coName}" saved!`); await window.loadServicesMaster(); } else { alert("Error: " + data.message); } } catch (error) { console.error("Save Co-Service error:", error); alert("Server error while saving Co-Service."); } return false; }; // 5. FORM: Add Sub-Service Modal window.openSpecificSubServiceModal = function(coName) { openModal('modalService'); setTimeout(() => { const modal = document.getElementById('modalService'); if (!modal) return; document.getElementById('serviceId').value = ''; document.getElementById('serviceName').value = ''; document.getElementById('serviceBasePrice').value = '449'; document.getElementById('serviceTime').value = '45 mins'; document.getElementById('serviceStatus').value = 'Active'; document.getElementById('serviceHighlight').value = 'Doorstep standard certified service'; const title = modal.querySelector('h3'); if (title) title.innerHTML = ` Add Sub-Service under ${coName}`; const catSelect = document.getElementById('serviceCategory'); if (catSelect) { const catLabel = catSelect.previousElementSibling; if (catLabel) catLabel.innerText = 'Co-Service'; catSelect.innerHTML = ``; catSelect.value = coName; } const nameInput = document.getElementById('serviceName'); if (nameInput) { const nameLabel = nameInput.previousElementSibling; if (nameLabel) nameLabel.innerText = 'Sub-Service Title'; nameInput.placeholder = 'e.g. Door Lock Repair, Jet Cleaning'; } // Sabhi fields wapas visible karein const timeField = document.getElementById('serviceTime')?.closest('.grid'); if (timeField) timeField.style.display = ''; const highlightField = document.getElementById('serviceHighlight')?.closest('.grid'); if (highlightField) highlightField.style.display = ''; const imageField = document.getElementById('serviceImageFile')?.closest('div')?.parentElement; if (imageField) imageField.style.display = ''; const saveBtn = modal.querySelector('button[type="submit"]'); if (saveBtn) saveBtn.innerText = 'Save Sub-Service'; modal.querySelector('form').onsubmit = window.handleSaveSubServiceDB; }, 50); }; window.handleSaveSubServiceDB = async function(e) { if (e) e.preventDefault(); const payload = { id: document.getElementById('serviceId')?.value || '', headCategory: selectedMainCategory, coCategory: document.getElementById('serviceCategory')?.value || '', name: document.getElementById('serviceName')?.value.trim() || '', basePrice: parseInt(document.getElementById('serviceBasePrice')?.value) || 0, time: document.getElementById('serviceTime')?.value.trim() || '45 mins', status: document.getElementById('serviceStatus')?.value || 'Active', highlight: document.getElementById('serviceHighlight')?.value.trim() || '', image: document.getElementById('serviceImageBase64')?.value || '' // <--- Yeh yahan zaroori hai }; if (!payload.coCategory || !payload.name) { alert("Co-Service and Sub-Service Title are required."); return false; } try { const response = await fetch('/api/save_service.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); const data = await response.json(); if (data.success) { closeModal('modalService'); if (typeof showToast === 'function') { showToast(data.message || `Sub-Service "${payload.name}" saved!`); } await window.loadServicesMaster(); } else { alert("Error: " + data.message); } } catch (error) { console.error("Save Sub-Service error:", error); alert("Server error while saving Sub-Service."); } return false; }; // 6. 3-Tier Table Render Function (Database Sync ke sath) window.expandedCoServices = window.expandedCoServices || {}; window.renderServicesTable = function() { const tbody = document.getElementById('servicesTableBody'); const thead = tbody?.previousElementSibling; if (!tbody || !thead) return; thead.innerHTML = ` Image Co-Service & Sub-Services Parent Time Base Rate Status Actions `; const currentMain = selectedMainCategory || ''; const hObj = (window.headServices || []).find(h => h.name === currentMain); let currentCoList = []; if (hObj && window.coServices) { currentCoList = window.coServices.filter(c => c.head_id == hObj.id).map(c => c.name); } const allSubs = (services || []).filter(s => s.headCategory === currentMain || currentCoList.includes(s.category) || s.category === currentMain); allSubs.forEach(s => { const cName = s.coCategory || s.category; if (cName && !currentCoList.includes(cName) && cName !== currentMain) currentCoList.push(cName); }); if (currentCoList.length === 0) { tbody.innerHTML = `No Co-Services added yet under ${currentMain}. Click "+ Add Co-Service" to start.`; return; } let html = ''; currentCoList.forEach(coName => { const subInCo = allSubs.filter(f => (f.coCategory || f.category) === coName); if (window.expandedCoServices[coName] === undefined) window.expandedCoServices[coName] = true; const isExpanded = window.expandedCoServices[coName]; // ROW 1: CO-SERVICE (Yahan action buttons add karne hain) html += `
${coName} ${currentMain} - - Active // Co-Service Row Actions HTML: `; // ROW 2: SUB-SERVICES if (isExpanded) { if (subInCo.length === 0) { html += `No sub-services added under ${coName} yet.`; } else { subInCo.forEach(sub => { const stop = String(sub.status).includes('Stopped'); html += ` ${sub.name} ${coName} ${sub.time || '45 mins'} ₹${sub.basePrice || 0} ${stop ? 'Stopped' : 'Active'} `; }); } } }); tbody.innerHTML = html; }; window.toggleSubServices = function(coName) { window.expandedCoServices[coName] = !window.expandedCoServices[coName]; window.renderServicesTable(); }; // Auto load on start window.addEventListener('DOMContentLoaded', () => { window.loadServicesMaster(); }); window.loadServicesMaster(); })(); window.deleteMainService = async function(id, name) { if (!confirm(`Kya aap "${name}" Main Service ko delete karna chahte hain?`)) return; try { const response = await fetch('/api/delete_head_service.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ id: id }) }); const data = await response.json(); if (data.success) { if(typeof showToast === 'function') showToast(`Main Service deleted successfully!`); window.loadServicesMaster(); } else { alert("Error: " + data.message); } } catch (err) { alert("Server error while deleting."); } }; // Image file reader handler document.addEventListener('change', function(e) { if (e.target && e.target.id === 'serviceImageFile') { const file = e.target.files[0]; if (file) { const reader = new FileReader(); reader.onload = function(uploadEvt) { let base64Input = document.getElementById('serviceImageBase64'); if (!base64Input) { base64Input = document.createElement('input'); base64Input.type = 'hidden'; base64Input.id = 'serviceImageBase64'; e.target.closest('form').appendChild(base64Input); } base64Input.value = uploadEvt.target.result; }; reader.readAsDataURL(file); } } }); // Co-Service Save Handler Fix window.handleSaveRealCoService = async function(e) { if (e) e.preventDefault(); const headCategory = document.getElementById('serviceCategory')?.value || selectedMainCategory; const coName = document.getElementById('serviceName')?.value.trim() || ''; const image = document.getElementById('serviceImageBase64')?.value || ''; if (!headCategory || !coName) { alert("Please enter Co-Service Title."); return false; } try { const response = await fetch('/api/save_co_category.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ headCategory, coName, image }) }); const data = await response.json(); if (data.success) { closeModal('modalService'); if (typeof showToast === 'function') showToast(data.message || `Co-Service "${coName}" saved!`); await window.loadServicesMaster(); } else { alert("Error: " + data.message); } } catch (error) { console.error("Save Co-Service error:", error); alert("Server error while saving Co-Service."); } return false; }; // Co-Service Edit window.editCoService = function(coName) { alert("Edit Co-Service: " + coName); // Yahan aap edit modal open kar sakte hain }; // Co-Service Stop / Start Toggle window.toggleStopCoService = async function(coName) { if (!confirm(`Kya aap "${coName}" ka status change karna chahte hain?`)) return; try { const response = await fetch('/api/toggle_co_status.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ coName }) }); const data = await response.json(); if (data.success) { if (typeof showToast === 'function') showToast("Status updated!"); window.loadServicesMaster(); } else { alert("Error: " + data.message); } } catch (err) { console.error(err); alert("Server error."); } }; // Co-Service Delete window.deleteCoService = async function(coName) { if (!confirm(`Kya aap "${coName}" Co-Service ko delete karna chahte hain?`)) return; try { const response = await fetch('/api/delete_co_category.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ coName }) }); const data = await response.json(); if (data.success) { if (typeof showToast === 'function') showToast(`Co-Service deleted successfully!`); window.loadServicesMaster(); } else { alert("Error: " + data.message); } } catch (err) { console.error(err); alert("Server error while deleting."); } }; document.addEventListener('click', function(e) { // Agar kisi bhi button par "Save Co-Service" likha hai, toh ye automatic click sambhal lega if (e.target && (e.target.id === 'saveCoServiceBtn' || e.target.textContent.includes('Save Co-Service'))) { e.preventDefault(); if (typeof window.handleSaveRealCoService === 'function') { window.handleSaveRealCoService(e); } } }); window.handleSaveRealCoService = async function(e) { if (e) e.preventDefault(); const headCategory = document.getElementById('serviceCategory')?.value || selectedMainCategory; const coName = document.getElementById('serviceName')?.value.trim() || ''; // Image base64 grab karne ka secure tarika let image = ''; const fileInput = document.getElementById('serviceImageFile'); if (fileInput && fileInput.files && fileInput.files[0]) { const file = fileInput.files[0]; image = await new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = function(evt) { resolve(evt.target.result); }; reader.onerror = function() { reject(new Error('Image file could not be read.')); }; reader.readAsDataURL(file); }); } else { image = document.getElementById('serviceImageBase64')?.value || ''; } if (!headCategory || !coName) { alert("Please enter Co-Service Title."); return false; } try { const response = await fetch('/api/save_co_category.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ headCategory, coName, image }) }); const data = await response.json(); if (data.success) { closeModal('modalService'); if (typeof showToast === 'function') { showToast(data.message || `Co-Service "${coName}" saved!`); } else { alert(data.message || "Co-Service saved successfully!"); } await window.loadServicesMaster(); } else { alert("Error: " + data.message); } } catch (error) { console.error("Save Co-Service error:", error); alert("Server error while saving Co-Service."); } return false; }; document.addEventListener('click', function(e) { // Agar kisi bhi button par "Save Co-Service" likha hai, toh ye automatic click sambhal lega if (e.target && (e.target.id === 'saveCoServiceBtn' || e.target.textContent.includes('Save Co-Service'))) { e.preventDefault(); if (typeof window.handleSaveRealCoService === 'function') { window.handleSaveRealCoService(e); } } }); // 1. Main Service Edit करने का फंक्शन (इमेज और नाम बदलने के लिए) window.editMainService = async function(id) { const newName = prompt("नया सर्विस नाम दर्ज करें:"); if (!newName) return; // इमेज बदलने के लिए फाइल इनपुट प्रॉम्प्ट या नया इमेज चयन const input = document.createElement('input'); input.type = 'file'; input.accept = 'image/*'; input.onchange = async function(e) { const file = e.target.files[0]; const reader = new FileReader(); reader.onload = async function(uploadEvt) { const image = uploadEvt.target.result; // डेटा सर्वर पर अपडेट करने के लिए try { const response = await fetch('/api/update_head_service.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ id: id, name: newName, image: image }) }); const data = await response.json(); if (data.success) { if (typeof showToast === 'function') showToast("Service updated successfully!"); window.loadServicesMaster(); } else { alert("Error: " + data.message); } } catch (err) { alert("Server error during update."); } }; reader.readAsDataURL(file); }; input.click(); };