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>
Updated package version from 0.6.1-0 to 0.7.0-1 to reflect:
- Fixed appstore race condition causing empty initial load
- Fixed RPC expect parameter for getAppstoreApps
- Improved error handling in apps and modules views
- Added debug logging for troubleshooting
- Fixed modules render data flow
Updated API version from 0.3.1 to 0.7.0
🤖 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>
Updated package version from 0.4.1-3 to 0.5.0-1
Updated API version from 0.2.2 to 0.5.0
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Updated package version from 0.4.0-1 to 0.5.0-1 to reflect:
- Fixed ACL permissions (seccubox_logs, collect_debug)
- Fixed API module imports in all views
- Added missing API methods (getAllData, getCpu alias)
- Added utility functions (formatKB, getStatusClass, getTempClass)
- Resolved multiple "function not defined" errors
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added utility functions that views depend on:
- formatKB() - Format kilobytes with automatic unit conversion (KB/MB/GB/TB)
- getStatusClass() - Return CSS class based on percentage thresholds
(good: <50%, info: 50-74%, warning: 75-89%, critical: >=90%)
- getTempClass() - Return CSS class based on temperature in Celsius
(good: <60°C, info: 60-69°C, warning: 70-79°C, critical: >=80°C)
Resolves "API.formatKB is not a function", "API.getStatusClass is not a function",
and "API.getTempClass is not a function" errors.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Added getAllData() method to fetch all system stats in one call
- Added getCpu() alias for getCPU() for consistency with view expectations
- getAllData() returns a combined object with stats, cpu, memory, disk, network, processes, and system data
This resolves "API.getAllData is not a function" and "API.getCpu is not a function" errors
by ensuring the API exports match what the views are calling.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Changed from 'require netdata-dashboard.api as api' to 'require netdata-dashboard/api as API'
- Updated all api. references to API. in realtime.js, system.js, network.js, and processes.js
- Resolves "api.getAllData is not a function" and "api.getCpu is not a function" errors
The dot notation (netdata-dashboard.api) doesn't work with LuCI's module loader.
The correct syntax uses slash (netdata-dashboard/api) and follows the convention
of uppercase API for consistency with other modules.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Added seccubox_logs to read permissions
- Added collect_debug to read permissions
- Resolves "Access denied" error for seccubox_logs endpoint
Note: The method name has a typo (seccubox instead of secubox) but
keeping it for consistency with the existing RPC handler implementation.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Changed from L.require('client-guardian.api') to 'require client-guardian/api as API'
- Updated all api. references to API. in both files
- Resolves "api.getLogs is not a function" and "api.getAlerts is not a function" errors
The L.require() pattern doesn't work properly with async module loading in LuCI.
Using the proper 'require' directive ensures the module is loaded correctly.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Added 'require uci' to fix "uci is not defined" error
- Ensures UCI configuration can be loaded properly
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
The previous config used commented-out format which didn't actually
disable the packages, causing them to be built and fail.
Changes:
- Changed from: echo "# CONFIG_PACKAGE_lucihttp is not set"
- Changed to: echo "CONFIG_PACKAGE_lucihttp=n"
- Same for cgi-io
- Added CONFIG_BROKEN=y to allow missing dependencies
This matches the local-build.sh approach and prevents SDK from trying
to compile these problematic packages that our scripts don't need.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Changed default OpenWrt version from 25.12.0-rc1 to 24.10.5 to match
local-build.sh configuration and ensure stable builds by default.
Changes in both workflows:
- build-openwrt-packages.yml: default and env fallback
- build-secubox-images.yml: default and env fallback
- Reordered options to show 24.10.5 first
Users can still manually select other versions when triggering workflows.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
The packages were being copied to the SDK but not enabled in .config,
causing no artifacts to be generated for these packages.
Changes:
- Add CONFIG_PACKAGE_secubox-app=m to SDK .config
- Add CONFIG_PACKAGE_luci-theme-secubox=m to SDK .config
This ensures both packages are built when running the package build workflow.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>