Added debugMode flag that checks URL hash or localStorage setting.
Debug logging only outputs when enabled via:
- URL: /#/admin/secubox/apps#debug
- Console: localStorage.setItem('secubox_debug', 'true')
All debug logs prefixed with [AppStore] or [Modules] for clarity.
Warnings and errors remain in production for critical issues.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added a modal footer with a Close button in the app details view.
The footer includes:
- Styled separator line with border-top
- Right-aligned Close button
- Calls ui.hideModal() on click
This provides a clear way to dismiss the modal without needing to
click outside or use the escape key.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Fixed appstore showing "No applications match the selected filter" by correcting
the RPC declaration expect parameter.
Issue: The RPC declaration had:
expect: { apps: [], categories: {} }
This caused the RPC framework to return only the apps array instead of the full
response object, resulting in:
- data = Array(5) instead of { apps: [...], categories: {...} }
- data.apps = undefined
- data.categories = undefined
Fix: Changed to:
expect: { }
This returns the full response object as-is from the backend, allowing proper
access to both data.apps and data.categories properties.
Also added extensive debug logging to troubleshoot the data flow.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Fixed issue where first page load would show empty apps/modules list, requiring
a refresh to display data.
Changes:
- Added error handling in refreshData() for both apps.js and modules.js
- Added null/empty data checks before storing results
- Fixed render() to use data parameter first, then fallback to cached instance data
- Added console logging for debugging empty responses
- Added user-friendly error notifications when API calls fail
The render function now properly uses:
var apps = (data && data.apps) || this.appsData || [];
var modules = (data && data.modules) || this.modulesData || [];
This ensures the data passed from load() is used on first render, preventing
the empty state on initial page load.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>