script.js

11.57 KB
06/05/2025 14:22
JS
script.js
/**
 * 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 = `
        <div class="zone-detail-card">
            <h3>รายละเอียด Zone</h3>
            <table class="zone-detail-table">
                <tr>
                    <th>Database ID:</th>
                    <td>${zone.id}</td>
                </tr>
                <tr>
                    <th>ชื่อ:</th>
                    <td>${zone.name}</td>
                </tr>
                <tr>
                    <th>External ID:</th>
                    <td>${zone.external_id || '(ไม่มี)'}</td>
                </tr>
                <tr>
                    <th>ระดับ:</th>
                    <td>${zone.level} (Zone)</td>
                </tr>
            </table>
            <div class="zone-detail-actions">
                <button class="btn" onclick="linkToExternalSystem('${zone.id}', '${zone.external_id}')">
                    เชื่อมต่อกับระบบอื่น
                </button>
            </div>
        </div>
    `;

  // แสดง container
  detailsContainer.style.display = 'block';
}

/**
 * เชื่อมต่อกับระบบอื่น (ตัวอย่าง)
 * @param {string} zoneId ID ของ Zone
 * @param {string} externalId External ID ของ Zone
 */
function linkToExternalSystem(zoneId, externalId) {
  // ตัวอย่างการสร้าง URL สำหรับระบบอื่น
  const url = `external-system.php?zone_id=${zoneId}&external_id=${externalId}`;

  // แสดงข้อความ
  showMessage(`กำลังเชื่อมต่อกับระบบอื่น: Zone ID ${zoneId}, External ID ${externalId}`, 'info');

  // เปิด URL ในแท็บใหม่ (ตัวอย่าง)
  // window.open(url, '_blank');

  console.log(`เชื่อมต่อกับ URL: ${url}`);
}