fix(luci-app-secubox-admin): fix WidgetRenderer constructor error

Fixed TypeError "WidgetRenderer is not a constructor" in dashboard.js
by removing the 'new' keyword. LuCI's baseclass.extend() creates callable
classes that should not be instantiated with 'new'.

Changes:
- dashboard.js: Changed from 'new WidgetRenderer({...})' to 'WidgetRenderer({...})'
- Added comprehensive try-catch error handling with fallback error display
- Incremented PKG_RELEASE: 5 → 6
- Updated DEPLOY_UPDATES.md with v1.0.0-6 details

This fix allows the widget system to initialize properly on the dashboard.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
CyberMind-FR 2026-01-04 14:59:10 +01:00
parent 9536a89744
commit 1c5d8eb29f
3 changed files with 35 additions and 13 deletions

View File

@ -69,11 +69,17 @@ ubus -S call luci.secubox check_updates
### Package Versions
- `secubox-core`: 0.8.0-6
- `luci-app-secubox-admin`: 1.0.0-5
- `luci-app-secubox-admin`: 1.0.0-6
### Recent Fixes
**v1.0.0-5** (Latest):
**v1.0.0-6** (Latest):
- Fixed WidgetRenderer constructor error
- Changed from `new WidgetRenderer({...})` to `WidgetRenderer({...})`
- Added comprehensive error handling with try-catch and fallback error display
- baseclass-extended classes should not be called with `new` keyword
**v1.0.0-5**:
- Added graceful RPC fallback with L.resolveDefault()
- Pages now load with empty data instead of crashing when backend not deployed
- Fixes "No related RPC reply" errors

View File

@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-secubox-admin
PKG_VERSION:=1.0.0
PKG_RELEASE:=5
PKG_RELEASE:=6
PKG_LICENSE:=MIT
PKG_MAINTAINER:=CyberMind <contact@cybermind.fr>

View File

@ -198,19 +198,35 @@ return view.extend({
initializeWidgets: function(apps) {
// Cleanup existing widget renderer
if (this.widgetRenderer) {
this.widgetRenderer.destroy();
try {
this.widgetRenderer.destroy();
} catch (e) {
console.error('Error destroying widget renderer:', e);
}
}
// Create new widget renderer
this.widgetRenderer = new WidgetRenderer({
containerId: 'dashboard-widgets-container',
apps: apps,
defaultRefreshInterval: 30,
gridMode: 'auto'
});
try {
// Create new widget renderer instance
// WidgetRenderer is a baseclass-extended class, call it directly
this.widgetRenderer = WidgetRenderer({
containerId: 'dashboard-widgets-container',
apps: apps,
defaultRefreshInterval: 30,
gridMode: 'auto'
});
// Render widgets
this.widgetRenderer.render();
// Render widgets
if (this.widgetRenderer && this.widgetRenderer.render) {
this.widgetRenderer.render();
}
} catch (e) {
console.error('Error initializing widgets:', e);
// Render error message in widget container
var container = document.getElementById('dashboard-widgets-container');
if (container) {
container.innerHTML = '<div class="alert alert-warning">Widget system initialization failed. Please refresh the page.</div>';
}
}
},
pollData: function() {