class LoggerMenu { constructor() { // no external data files for logger – all static } // 1) Server‐side: return the static menuData getAllMenuData() { return { logLevels: [ { value: 'error', label: 'Error', description: 'Only error messages' }, { value: 'warn', label: 'Warn', description: 'Warning and error messages' }, { value: 'info', label: 'Info', description: 'Info, warning and error messages' }, { value: 'debug', label: 'Debug', description: 'All messages including debug' } ] }; } // 2) Client‐side: inject the dropdown options getDataInjectionCode(nodeName) { return ` // Logger data loader for ${nodeName} window.EVOLV.nodes.${nodeName}.loggerMenu.loadData = function(node) { const data = window.EVOLV.nodes.${nodeName}.menuData.logger; const sel = document.getElementById('node-input-logLevel'); if (!sel) return; sel.innerHTML = ''; data.logLevels.forEach(l => { const opt = document.createElement('option'); opt.value = l.value; opt.textContent = l.label; opt.title = l.description; sel.appendChild(opt); }); sel.value = node.logLevel || 'info'; }; `; } getHtmlInjectionCode(nodeName) { const tpl = `

Internal logging

`.replace(/`/g,'\\`').replace(/\$/g,'\\$'); return ` // Logger HTML injection for ${nodeName} window.EVOLV.nodes.${nodeName}.loggerMenu.injectHtml = function() { const ph = document.getElementById('logger-fields-placeholder'); if (ph && !ph.hasChildNodes()) { ph.innerHTML = \`${tpl}\`; } }; `; } // 3) Client‐side: wire up the enable‐toggle behavior getEventInjectionCode(nodeName) { return ` // Logger event wiring for ${nodeName} window.EVOLV.nodes.${nodeName}.loggerMenu.wireEvents = function(node) { const chk = document.getElementById('node-input-enableLog'); const row = document.getElementById('row-logLevel'); if (!chk || !row) return; const toggle = () => { row.style.display = chk.checked ? 'block' : 'none'; }; chk.checked = node.enableLog || false; toggle(); chk.addEventListener('change', toggle); }; `; } // 4) Client‐side: save logic getSaveInjectionCode(nodeName) { return ` // Logger Save injection for ${nodeName} window.EVOLV.nodes.${nodeName}.loggerMenu.saveEditor = function(node) { console.log('Saving logger properties for ${nodeName}…'); const chk = document.getElementById('node-input-enableLog'); const sel = document.getElementById('node-input-logLevel'); node.enableLog = chk ? chk.checked : false; node.logLevel = sel ? sel.value : 'info'; const errors = []; if (node.enableLog && !node.logLevel) { errors.push('Log level must be selected when logging is enabled.'); } errors.forEach(e => RED.notify(e,'error')); // --- DEBUG: what was saved --- console.log('→ loggerMenu.saveEditor result:', { enableLog: node.enableLog, logLevel: node.logLevel }); return errors.length === 0; }; `; } // 5) Compose everything into one client‐side payload getClientInitCode(nodeName) { const dataCode = this.getDataInjectionCode(nodeName); const eventCode = this.getEventInjectionCode(nodeName); const saveCode = this.getSaveInjectionCode(nodeName); const htmlCode = this.getHtmlInjectionCode(nodeName); return ` // --- LoggerMenu for ${nodeName} --- window.EVOLV.nodes.${nodeName}.loggerMenu = window.EVOLV.nodes.${nodeName}.loggerMenu || {}; ${htmlCode} ${dataCode} ${eventCode} ${saveCode} // oneditprepare calls this window.EVOLV.nodes.${nodeName}.loggerMenu.initEditor = function(node) { // ------------------ BELOW sequence is important! ------------------------------- this.injectHtml(); this.loadData(node); this.wireEvents(node); }; `; } } module.exports = LoggerMenu;