/** * script.js - ไฟล์ JavaScript สำหรับเชื่อมต่อกับ PHP API */ // สร้างอินสแตนซ์ของ TreeManager let treeManager; // เก็บไว้ตรวจสอบความเปลี่ยนแปลง let lastSavedData = ''; // ฟังก์ชันเริ่มต้นการทำงาน document.addEventListener('DOMContentLoaded', () => { // สร้าง TreeManager initTreeManager(); // เพิ่ม event listeners สำหรับปุ่มต่างๆ setupEventListeners(); // โหลดข้อมูลจาก API loadTreeDataFromAPI(); }); /** * สร้าง TreeManager */ function initTreeManager() { // กำหนดค่าเริ่มต้น const config = { containerId: 'tree-container', limitedDepth: true, maxDepth: 3, levelNames: { 1: 'Stage', 2: 'Area', 3: 'Zone' }, outputId: 'json-output' }; // สร้าง TreeManager instance treeManager = new TreeManager(config); } /** * เพิ่ม event listeners */ function setupEventListeners() { // ปุ่มเพิ่มรายการระดับบนสุด document.getElementById('add-root-btn').addEventListener('click', () => { treeManager.addRootNode('รายการใหม่'); saveTreeData(); }); // ปุ่มยุบทั้งหมด document.getElementById('collapse-all-btn').addEventListener('click', () => { treeManager.collapseAll(); }); // ปุ่มขยายทั้งหมด document.getElementById('expand-all-btn').addEventListener('click', () => { treeManager.expandAll(); }); // ปุ่มบันทึก document.getElementById('save-btn').addEventListener('click', () => { saveTreeData(); }); // ปุ่มรีเฟรช document.getElementById('refresh-btn').addEventListener('click', () => { loadTreeDataFromAPI(); }); // ตั้งเวลาบันทึกอัตโนมัติทุก 1 นาที setInterval(saveTreeDataIfChanged, 60000); } /** * บันทึกข้อมูลถ้ามีการเปลี่ยนแปลง */ function saveTreeDataIfChanged() { const currentData = JSON.stringify(treeManager.getTreeData()); if (currentData !== lastSavedData) { saveTreeData(); } } /** * โหลดข้อมูลจาก API */ async function loadTreeDataFromAPI() { try { // แสดงข้อความโหลด showMessage('กำลังโหลดข้อมูล...', 'info'); // เรียกใช้ API const response = await fetch('api.php?action=export_tree'); const result = await response.json(); if (result.status === 'success') { // นำข้อมูลมาใช้กับ TreeManager treeManager.setTreeData(result.data); // เก็บข้อมูลเพื่อเปรียบเทียบการเปลี่ยนแปลง lastSavedData = JSON.stringify(treeManager.getTreeData()); showMessage('โหลดข้อมูลสำเร็จ', 'success'); } else { // ถ้าไม่มีข้อมูล หรือเกิดข้อผิดพลาด showMessage('ไม่พบข้อมูล หรือเกิดข้อผิดพลาด - สร้างโครงสร้างเริ่มต้น', 'warning'); treeManager.generateInitialStructure(); } } catch (error) { console.error('เกิดข้อผิดพลาดในการโหลดข้อมูล:', error); showMessage('เกิดข้อผิดพลาดในการโหลดข้อมูล - สร้างโครงสร้างเริ่มต้น', 'error'); treeManager.generateInitialStructure(); } } /** * บันทึกข้อมูลไปยัง API */ async function saveTreeData() { try { // แสดงข้อความกำลังบันทึก showMessage('กำลังบันทึกข้อมูล...', 'info'); // ดึงข้อมูลจาก TreeManager const treeData = treeManager.getTreeData(); // เรียกใช้ API const response = await fetch('api.php?action=import_tree', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(treeData) }); const result = await response.json(); if (result.status === 'success') { // บันทึกข้อมูลที่บันทึกล่าสุด lastSavedData = JSON.stringify(treeData); showMessage('บันทึกข้อมูลสำเร็จ', 'success'); } else { showMessage('เกิดข้อผิดพลาดในการบันทึกข้อมูล: ' + (result.message || 'ไม่ทราบสาเหตุ'), 'error'); } } catch (error) { console.error('เกิดข้อผิดพลาดในการบันทึกข้อมูล:', error); showMessage('เกิดข้อผิดพลาดในการบันทึกข้อมูล: ' + error.message, 'error'); } } /** * แสดงข้อความแจ้งเตือน * @param {string} message ข้อความ * @param {string} type ประเภท ('success', 'info', 'warning', 'error') */ function showMessage(message, type) { const messageContainer = document.getElementById('message-container'); if (!messageContainer) return; // สร้าง element สำหรับข้อความ const messageElement = document.createElement('div'); messageElement.className = `alert alert-${type}`; messageElement.textContent = message; // ล้างข้อความเก่า messageContainer.innerHTML = ''; // เพิ่มข้อความใหม่ messageContainer.appendChild(messageElement); // ซ่อนข้อความหลังจาก 3 วินาที ยกเว้นกรณี error if (type !== 'error') { setTimeout(() => { messageElement.style.opacity = '0'; setTimeout(() => { messageContainer.innerHTML = ''; }, 500); }, 3000); } } /** * สร้าง External ID * @returns {string} External ID */ function generateExternalId() { return 'ext_' + Date.now() + '_' + Math.floor(Math.random() * 1000); } /** * ฟังก์ชันสำหรับนำ ID ของโหนดไปใช้กับระบบอื่น * @param {number} nodeId ID ของโหนด */ async function useNodeWithExternalSystem(nodeId) { try { // โหลดข้อมูลโหนด const response = await fetch(`api.php?action=get_node&id=${nodeId}`); const result = await response.json(); if (result.status === 'success') { const node = result.data; // ตรวจสอบว่าเป็นโหนดระดับที่ 3 (Zone) หรือไม่ if (node.level === 3) { // ตรวจสอบว่ามี external_id หรือไม่ if (!node.external_id) { // สร้าง external_id ถ้าไม่มี const externalId = generateExternalId(); // อัพเดตโหนด await updateNodeExternalId(nodeId, externalId); // อัพเดตข้อมูล node node.external_id = externalId; } // ทำงานกับ external_id console.log(`นำ Zone ID: ${node.id} (External ID: ${node.external_id}) ไปใช้กับระบบอื่น`); // ตัวอย่างการใช้งาน - แสดงรายละเอียด showZoneDetails(node); } else { showMessage('โหนดที่เลือกไม่ใช่ Zone (ระดับ 3)', 'warning'); } } else { showMessage('ไม่พบข้อมูลโหนด', 'error'); } } catch (error) { console.error('เกิดข้อผิดพลาด:', error); showMessage('เกิดข้อผิดพลาดในการเรียกใช้งาน: ' + error.message, 'error'); } } /** * อัพเดต External ID ของโหนด * @param {number} nodeId ID ของโหนด * @param {string} externalId External ID ใหม่ */ async function updateNodeExternalId(nodeId, externalId) { try { // ข้อมูลที่ต้องการอัพเดต const updateData = { id: nodeId, external_id: externalId }; // เรียกใช้ API const response = await fetch('api.php?action=update_node', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(updateData) }); const result = await response.json(); if (result.status !== 'success') { console.error('ไม่สามารถอัพเดต External ID:', result.message); } } catch (error) { console.error('เกิดข้อผิดพลาดในการอัพเดต External ID:', error); } } /** * แสดงรายละเอียดของ Zone * @param {Object} zone ข้อมูลของ Zone */ function showZoneDetails(zone) { // รับ element สำหรับแสดงรายละเอียด const detailsContainer = document.getElementById('zone-details'); if (!detailsContainer) return; // สร้าง HTML สำหรับแสดงรายละเอียด detailsContainer.innerHTML = `
| Database ID: | ${zone.id} |
|---|---|
| ชื่อ: | ${zone.name} |
| External ID: | ${zone.external_id || '(ไม่มี)'} |
| ระดับ: | ${zone.level} (Zone) |