secubox-openwrt/package/secubox/luci-app-secubox-admin/htdocs/luci-static/resources/secubox-admin/components.js
CyberMind-FR e7c9411d79 feat: Release v0.8.2 - Admin Control Center, Documentation Mirror & Docker Automation
This release adds major new features for SecuBox management and deployment:

## New Features

### 1. LuCI Admin Control Center (luci-app-secubox-admin)
- Unified admin dashboard for managing all SecuBox appstore plugins
- **Control Panel**: Real-time stats, system health, alerts, quick actions
- **Apps Manager**: Browse catalog, install/remove apps with search & filtering
- **App Settings**: Per-app configuration, start/stop controls
- **System Health**: Live monitoring (CPU, RAM, disk) with auto-refresh
- **System Logs**: Centralized log viewer with download capability
- Fully integrated with existing RPCD backend (luci.secubox)
- Mobile-responsive design with polished UI components

### 2. Documentation Mirror in SecuBox Bonus
- Integrated complete development documentation into luci-app-secubox-bonus
- 64+ documentation files now available offline at /luci-static/secubox/docs/
- Beautiful landing page (index-main.html) with 4 sections:
  - Development guides & references
  - Live module demos
  - Tutorials & blog posts
  - Marketing campaign pages
- Accessible locally on router without internet connection

### 3. Automated Docker Plugin Installation
- Enhanced secubox-appstore CLI with full Docker automation
- One-click installation from web UI now fully automated:
  - Auto-detects Docker runtime from catalog
  - Discovers and executes control scripts (*ctl install)
  - Pulls Docker images automatically
  - Creates directories and configures UCI
  - Enables init services
- No manual CLI steps required for Docker apps
- Works for all Docker apps: AdGuard Home, Mail-in-a-Box, Nextcloud, etc.

### 4. Mail-in-a-Box Plugin
- New Docker-based email server plugin (secubox-app-mailinabox)
- Complete package with:
  - UCI configuration (8 port mappings, feature flags)
  - Control script (mailinaboxctl) with install/check/update/status/logs
  - Procd init script with auto-restart
  - Catalog manifest (category: hosting, maturity: beta)
- Network mode: host (required for mail server)
- Persistent storage: mail, SSL, data, DNS volumes

## Improvements

### Build System
- Updated local-build.sh to include luci-app-* packages from package/secubox/
- Now automatically discovers and builds luci-app-secubox-admin and similar packages
- Fixed Makefile include paths for feed structure

### Package Releases
- Incremented PKG_RELEASE for all 31 SecuBox packages
- Ensures clean upgrade path from previous versions

### Catalog Updates
- Mail-in-a-Box entry moved from "productivity" to "hosting" category
- Status changed to "beta" reflecting community Docker image maturity
- Storage requirement increased: 1024MB → 2048MB
- Added port 25 accessibility note

## Files Changed

### New Packages (2)
- package/secubox/luci-app-secubox-admin/ (12 files)
- package/secubox/secubox-app-mailinabox/ (4 files)

### Enhanced Packages (1)
- package/secubox/luci-app-secubox-bonus/ (65 new docs files)

### Modified Core (3)
- package/secubox/secubox-core/root/usr/sbin/secubox-appstore
- package/secubox/secubox-core/root/usr/share/secubox/catalog.json
- secubox-tools/local-build.sh

### All Makefiles (31 packages)
- Incremented PKG_RELEASE for clean upgrade path

## Technical Details

**Admin Control Center Architecture:**
- Frontend: 5 views (dashboard, apps, settings, health, logs)
- API: Wrapper around luci.secubox RPCD methods
- Components: Reusable UI library (cards, badges, alerts, loaders)
- Styling: Common + admin-specific CSS with responsive design
- Auto-refresh: Polling for live updates (5-30s intervals)

**Docker Automation Flow:**
```
Web UI → RPCD → secubox-appstore CLI → opkg install → *ctl install →
docker pull → directories → UCI config → init enable → ✓ Ready
```

**Access Points:**
- Admin Control: http://router/cgi-bin/luci/admin/secubox/admin/
- Documentation: http://router/luci-static/secubox/index-main.html
- Demos: http://router/luci-static/secubox/demo-*.html

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-04 08:29:31 +01:00

85 lines
2.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'use strict';
'require baseclass';
return baseclass.extend({
// Stat card widget
renderStatCard: function(icon, value, label, color) {
return E('div', { 'class': 'stat-card ' + (color || '') }, [
E('div', { 'class': 'stat-icon' }, icon),
E('div', { 'class': 'stat-value' }, value),
E('div', { 'class': 'stat-label' }, label)
]);
},
// Status badge
renderStatusBadge: function(status) {
var statusMap = {
'running': { class: 'badge-success', text: 'Running' },
'stopped': { class: 'badge-warning', text: 'Stopped' },
'available': { class: 'badge-secondary', text: 'Available' },
'error': { class: 'badge-danger', text: 'Error' }
};
var config = statusMap[status] || statusMap['available'];
return E('span', { 'class': 'badge ' + config.class }, config.text);
},
// App card
renderAppCard: function(app, status, onInstall, onRemove, onConfigure) {
var self = this;
return E('div', { 'class': 'app-card' }, [
E('div', { 'class': 'app-icon' }, app.icon || '📦'),
E('div', { 'class': 'app-info' }, [
E('h3', {}, app.name),
E('p', { 'class': 'app-description' }, app.description),
E('div', { 'class': 'app-meta' }, [
E('span', { 'class': 'app-category' }, app.category),
self.renderStatusBadge(status.status)
])
]),
E('div', { 'class': 'app-actions' },
status.installed ? [
E('button', {
'class': 'btn btn-sm btn-primary',
'click': onConfigure
}, 'Configure'),
E('button', {
'class': 'btn btn-sm btn-danger',
'click': onRemove
}, 'Remove')
] : [
E('button', {
'class': 'btn btn-sm btn-success',
'click': onInstall
}, 'Install')
]
)
]);
},
// Loading spinner
renderLoader: function(message) {
return E('div', { 'class': 'loader-container' }, [
E('div', { 'class': 'loader' }),
E('p', {}, message || 'Loading...')
]);
},
// Alert box
renderAlert: function(type, message, dismissible) {
var box = E('div', { 'class': 'alert alert-' + type }, [
E('span', {}, message)
]);
if (dismissible) {
box.appendChild(E('button', {
'class': 'alert-close',
'click': function() { box.remove(); }
}, '×'));
}
return box;
}
});