/** * Module Manager - จัดการโมดูลต่างๆ ในตัวแก้ไข */ (function(global) { 'use strict'; /** * คลาส ModuleManager * จัดการการโหลดและเริ่มต้นโมดูลต่างๆ */ class ModuleManager { constructor(editor) { this.editor = editor; this.modules = {}; this.moduleOrder = []; this.loadedModules = new Set(); this.initializedModules = new Set(); } /** * ลงทะเบียนโมดูล * @param {string} name - ชื่อโมดูล * @param {Object} module - ออบเจกต์โมดูล * @param {Array} dependencies - โมดูลที่ต้องการ (optional) */ register(name, module, dependencies = []) { if (this.modules[name]) { console.warn(`Module '${name}' is already registered`); return; } this.modules[name] = { instance: null, moduleClass: module, dependencies, loaded: false, initialized: false }; // เพิ่มในลำดับโหลดหากยังไม่มี if (!this.moduleOrder.includes(name)) { this.moduleOrder.push(name); } } /** * โหลดโมดูล * @param {string} name - ชื่อโมดูล */ load(name) { if (!this.modules[name]) { console.error(`Module '${name}' is not registered`); return false; } if (this.loadedModules.has(name)) { console.warn(`Module '${name}' is already loaded`); return true; } const moduleInfo = this.modules[name]; // ตรวจสอบการพึ่งพา for (const dep of moduleInfo.dependencies) { if (!this.loadedModules.has(dep)) { if (!this.load(dep)) { console.error(`Failed to load dependency '${dep}' for module '${name}'`); return false; } } } try { // สร้างอินสแตนซ์โมดูล moduleInfo.instance = new moduleInfo.moduleClass(this.editor); moduleInfo.loaded = true; this.loadedModules.add(name); // ส่งเหตุการณ์ this.editor.emit('module:loaded', {name}); if (this.editor.config.debug) { console.log(`Module loaded: ${name}`); } return true; } catch (error) { console.error(`Failed to load module '${name}':`, error); return false; } } /** * เริ่มต้นโมดูล * @param {string} name - ชื่อโมดูล */ init(name) { if (!this.modules[name]) { console.error(`Module '${name}' is not registered`); return false; } if (!this.loadedModules.has(name)) { if (!this.load(name)) { return false; } } if (this.initializedModules.has(name)) { console.warn(`Module '${name}' is already initialized`); return true; } const moduleInfo = this.modules[name]; try { // เรียกเมธอด init ถ้ามี if (typeof moduleInfo.instance.init === 'function') { moduleInfo.instance.init(); } moduleInfo.initialized = true; this.initializedModules.add(name); // ส่งเหตุการณ์ this.editor.emit('module:initialized', {name}); if (this.editor.config.debug) { console.log(`Module initialized: ${name}`); } return true; } catch (error) { console.error(`Failed to initialize module '${name}':`, error); return false; } } /** * โหลดและเริ่มต้นโมดูลทั้งหมด */ loadAll() { for (const name of this.moduleOrder) { this.load(name); } } /** * เริ่มต้นโมดูลทั้งหมด */ initAll() { for (const name of this.moduleOrder) { this.init(name); } } /** * รับอินสแตนซ์โมดูล * @param {string} name - ชื่อโมดูล * @returns {Object} อินสแตนซ์โมดูล */ get(name) { if (!this.modules[name]) { console.error(`Module '${name}' is not registered`); return null; } return this.modules[name].instance; } /** * ตรวจสอบว่าโมดูลถูกโหลดแล้วหรือไม่ * @param {string} name - ชื่อโมดูล * @returns {boolean} ถูกโหลดแล้วหรือไม่ */ isLoaded(name) { return this.loadedModules.has(name); } /** * ตรวจสอบว่าโมดูลถูกเริ่มต้นแล้วหรือไม่ * @param {string} name - ชื่อโมดูล * @returns {boolean} ถูกเริ่มต้นแล้วหรือไม่ */ isInitialized(name) { return this.initializedModules.has(name); } /** * ถอนการโหลดโมดูล * @param {string} name - ชื่อโมดูล */ unload(name) { if (!this.modules[name]) { console.error(`Module '${name}' is not registered`); return false; } if (!this.loadedModules.has(name)) { console.warn(`Module '${name}' is not loaded`); return true; } const moduleInfo = this.modules[name]; try { // เรียกเมธอด destroy ถ้ามี if (moduleInfo.instance && typeof moduleInfo.instance.destroy === 'function') { moduleInfo.instance.destroy(); } moduleInfo.instance = null; moduleInfo.loaded = false; moduleInfo.initialized = false; this.loadedModules.delete(name); this.initializedModules.delete(name); // ส่งเหตุการณ์ this.editor.emit('module:unloaded', {name}); if (this.editor.config.debug) { console.log(`Module unloaded: ${name}`); } return true; } catch (error) { console.error(`Failed to unload module '${name}':`, error); return false; } } /** * รับชื่อโมดูลทั้งหมด * @returns {Array} ชื่อโมดูลทั้งหมด */ getModuleNames() { return [...this.moduleOrder]; } /** * รับข้อมูลโมดูลทั้งหมด * @returns {Object} ข้อมูลโมดูลทั้งหมด */ getModulesInfo() { const info = {}; for (const name of this.moduleOrder) { const moduleInfo = this.modules[name]; info[name] = { loaded: this.loadedModules.has(name), initialized: this.initializedModules.has(name), dependencies: moduleInfo.dependencies }; } return info; } } // เปิดเผยคลาส ModuleManager ทั่วโลก global.ModuleManager = ModuleManager; })(typeof window !== 'undefined' ? window : this);