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;