From 1c5d8eb29f77bff89d1f804766c3fdf3d5908aaa Mon Sep 17 00:00:00 2001 From: CyberMind-FR Date: Sun, 4 Jan 2026 14:59:10 +0100 Subject: [PATCH] fix(luci-app-secubox-admin): fix WidgetRenderer constructor error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- DEPLOY_UPDATES.md | 10 ++++-- .../secubox/luci-app-secubox-admin/Makefile | 2 +- .../resources/view/secubox-admin/dashboard.js | 36 +++++++++++++------ 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/DEPLOY_UPDATES.md b/DEPLOY_UPDATES.md index a12e4a15..1b18455b 100644 --- a/DEPLOY_UPDATES.md +++ b/DEPLOY_UPDATES.md @@ -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 diff --git a/package/secubox/luci-app-secubox-admin/Makefile b/package/secubox/luci-app-secubox-admin/Makefile index 07dfc2b6..f199a7c3 100644 --- a/package/secubox/luci-app-secubox-admin/Makefile +++ b/package/secubox/luci-app-secubox-admin/Makefile @@ -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 diff --git a/package/secubox/luci-app-secubox-admin/htdocs/luci-static/resources/view/secubox-admin/dashboard.js b/package/secubox/luci-app-secubox-admin/htdocs/luci-static/resources/view/secubox-admin/dashboard.js index db958186..13c7534d 100644 --- a/package/secubox/luci-app-secubox-admin/htdocs/luci-static/resources/view/secubox-admin/dashboard.js +++ b/package/secubox/luci-app-secubox-admin/htdocs/luci-static/resources/view/secubox-admin/dashboard.js @@ -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 = '
Widget system initialization failed. Please refresh the page.
'; + } + } }, pollData: function() {