secubox-openwrt/luci-app-secubox/htdocs/luci-static/resources/view/secubox/modules-debug.js
2025-12-29 09:03:49 +01:00

104 lines
3.5 KiB
JavaScript

'use strict';
'require view';
'require rpc';
'require secubox/theme as Theme';
'require secubox/api as API';
'require secubox/nav as SecuNav';
Theme.init();
var callModules = rpc.declare({
object: 'luci.secubox',
method: 'modules',
expect: { modules: [] }
});
return view.extend({
statusData: {},
load: function() {
return Promise.all([
API.getStatus(),
callModules()
]).then(L.bind(function(res) {
this.statusData = res[0] || {};
return res[1] || [];
}, this)).catch(function(err) {
console.error('=== MODULES DEBUG: RPC ERROR ===', err);
return [];
});
},
render: function(modules) {
modules = modules || [];
var running = modules.filter(function(m) { return m.running; }).length;
var installed = modules.filter(function(m) { return m.installed; }).length;
return E('div', { 'class': 'secubox-modules-debug' }, [
E('link', { 'rel': 'stylesheet', 'href': L.resource('secubox/common.css') }),
E('link', { 'rel': 'stylesheet', 'href': L.resource('secubox/secubox.css') }),
SecuNav.renderTabs('modules'),
this.renderHeader(modules.length, running, installed),
modules.length ? this.renderModuleGrid(modules) : this.renderEmptyState()
]);
},
renderHeader: function(total, running, installed) {
var status = this.statusData || {};
return E('div', { 'class': 'sh-page-header sh-page-header-lite' }, [
E('div', {}, [
E('h2', { 'class': 'sh-page-title' }, [
E('span', { 'class': 'sh-page-title-icon' }, '🧪'),
_('Modules Debug Console')
]),
E('p', { 'class': 'sh-page-subtitle' },
_('Inspect raw module data returned by the SecuBox RPC backend.'))
]),
E('div', { 'class': 'sh-header-meta' }, [
this.renderHeaderChip('🏷️', _('Version'), status.version || _('Unknown')),
this.renderHeaderChip('📦', _('Total'), total),
this.renderHeaderChip('🟢', _('Running'), running, running ? 'success' : ''),
this.renderHeaderChip('💾', _('Installed'), installed)
])
]);
},
renderModuleGrid: function(modules) {
return E('div', { 'class': 'cbi-map' }, [
E('div', { 'class': 'secubox-debug-grid' }, modules.map(function(m) {
return E('div', { 'class': 'secubox-debug-card' }, [
E('div', { 'class': 'secubox-debug-card-title' }, m.name || _('Unnamed module')),
E('div', { 'class': 'secubox-debug-card-desc' }, m.description || _('No description provided.')),
E('div', { 'class': 'secubox-debug-card-meta' }, [
E('span', { 'class': 'secubox-debug-pill ' + (m.running ? 'running' : m.installed ? 'installed' : 'missing') },
m.running ? _('Running') : m.installed ? _('Installed') : _('Not Installed')),
m.category ? E('span', { 'class': 'secubox-debug-pill neutral' }, m.category) : ''
]),
E('pre', { 'class': 'secubox-debug-json' }, JSON.stringify(m, null, 2))
]);
}))
]);
},
renderEmptyState: function() {
return E('div', { 'class': 'cbi-map' }, [
E('div', { 'class': 'secubox-empty-state' }, [
E('div', { 'class': 'secubox-empty-icon' }, '📭'),
E('div', { 'class': 'secubox-empty-title' }, _('No modules found')),
E('p', { 'class': 'secubox-empty-text' }, _('RPC returned an empty list. Verify luci.secubox modules API.'))
])
]);
},
renderHeaderChip: function(icon, label, value, tone) {
return E('div', { 'class': 'sh-header-chip' + (tone ? ' ' + tone : '') }, [
E('span', { 'class': 'sh-chip-icon' }, icon),
E('div', { 'class': 'sh-chip-text' }, [
E('span', { 'class': 'sh-chip-label' }, label),
E('strong', {}, value.toString())
])
]);
}
});