// 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();
};