- Created help system (help.js, help.css) for all modules - Integrated help button in network-modes module - Fixed menu structure: removed empty Network Management category - Fixed all dashboard and modules page links - Added website deployment script - Created comprehensive documentation New Files: - DOCS/HELP_INTEGRATION_PLAN.md - DOCS/WEBSITE_DEPLOYMENT_GUIDE.md - EXAMPLES/help-button-integration.js - luci-app-secubox/htdocs/luci-static/resources/secubox/help.js - luci-app-secubox/htdocs/luci-static/resources/secubox/help.css - secubox-tools/deploy-website.sh Modified: - luci-app-network-modes: Added help button integration - luci-app-secubox: Fixed menu paths and module links 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
184 lines
5.5 KiB
JavaScript
184 lines
5.5 KiB
JavaScript
'use strict';
|
|
'require baseclass';
|
|
'require ui';
|
|
|
|
/**
|
|
* SecuBox Help System
|
|
* Provides centralized help/documentation access for all SecuBox modules
|
|
* Version: 1.0.0
|
|
*/
|
|
|
|
console.log('📖 SecuBox Help System v1.0.0 loaded');
|
|
|
|
return baseclass.extend({
|
|
/**
|
|
* Create a help button element
|
|
* @param {string} moduleName - Module identifier (e.g., 'network-modes')
|
|
* @param {string} position - Button position: 'header', 'footer', 'floating', 'badge'
|
|
* @param {object} options - Custom options
|
|
* @returns {Element} Help button element
|
|
*/
|
|
createHelpButton: function(moduleName, position, options) {
|
|
var opts = options || {};
|
|
var helpUrl = this.getHelpUrl(moduleName);
|
|
var buttonClass = 'sb-help-btn sb-help-' + position;
|
|
var target = opts.target || '_blank';
|
|
|
|
// Handle modal vs new tab
|
|
if (opts.modal) {
|
|
var self = this;
|
|
return E('button', {
|
|
'class': buttonClass,
|
|
'title': opts.title || _('View Help & Documentation'),
|
|
'style': opts.style || '',
|
|
'click': function(ev) {
|
|
ev.preventDefault();
|
|
self.openHelpModal(moduleName);
|
|
}
|
|
}, [
|
|
E('span', { 'class': 'sb-help-icon' }, opts.icon || '❓'),
|
|
opts.showLabel !== false ? E('span', { 'class': 'sb-help-label' }, opts.label || _('Help')) : null
|
|
]);
|
|
}
|
|
|
|
// Regular link button
|
|
return E('a', {
|
|
'class': buttonClass,
|
|
'href': helpUrl,
|
|
'target': target,
|
|
'title': opts.title || _('View Help & Documentation'),
|
|
'style': opts.style || ''
|
|
}, [
|
|
E('span', { 'class': 'sb-help-icon' }, opts.icon || '❓'),
|
|
opts.showLabel !== false ? E('span', { 'class': 'sb-help-label' }, opts.label || _('Help')) : null
|
|
]);
|
|
},
|
|
|
|
/**
|
|
* Get help URL for a module
|
|
* @param {string} moduleName - Module identifier
|
|
* @param {string} anchor - Optional anchor/section (e.g., '#features')
|
|
* @returns {string} Help page URL
|
|
*/
|
|
getHelpUrl: function(moduleName, anchor) {
|
|
var baseUrl = '/luci-static/secubox/';
|
|
var moduleMap = {
|
|
'secubox': 'index.html#modules',
|
|
'system-hub': 'demo-secubox-hub.html',
|
|
'network-modes': 'demo-network-modes.html',
|
|
'client-guardian': 'demo-client-guardian.html',
|
|
'bandwidth-manager': 'demo-bandwidth.html',
|
|
'cdn-cache': 'demo-cdn-cache.html',
|
|
'traffic-shaper': 'demo-traffic-shaper.html',
|
|
'wireguard-dashboard': 'demo-wireguard.html',
|
|
'crowdsec-dashboard': 'demo-crowdsec.html',
|
|
'netdata-dashboard': 'demo-netdata.html',
|
|
'netifyd-dashboard': 'demo-netifyd.html',
|
|
'auth-guardian': 'demo-auth.html',
|
|
'vhost-manager': 'demo-vhost.html',
|
|
'ksm-manager': 'demo-ksm-manager.html',
|
|
'media-flow': 'demo-media.html'
|
|
};
|
|
|
|
var url = baseUrl + (moduleMap[moduleName] || 'index.html');
|
|
return anchor ? url + anchor : url;
|
|
},
|
|
|
|
/**
|
|
* Open help in modal dialog with iframe
|
|
* @param {string} moduleName - Module identifier
|
|
* @param {object} options - Modal options
|
|
*/
|
|
openHelpModal: function(moduleName, options) {
|
|
var opts = options || {};
|
|
var helpUrl = this.getHelpUrl(moduleName);
|
|
var modalTitle = opts.title || _('Help & Documentation');
|
|
|
|
var iframe = E('iframe', {
|
|
'src': helpUrl,
|
|
'style': 'width: 100%; height: 70vh; border: none; border-radius: 8px; background: white;',
|
|
'frameborder': '0'
|
|
});
|
|
|
|
var modal = E('div', { 'style': 'min-height: 70vh;' }, [
|
|
iframe,
|
|
E('div', {
|
|
'class': 'right',
|
|
'style': 'margin-top: 1rem; display: flex; gap: 0.5rem; justify-content: flex-end;'
|
|
}, [
|
|
opts.showOpenButton !== false ? E('a', {
|
|
'class': 'btn cbi-button-neutral',
|
|
'href': helpUrl,
|
|
'target': '_blank'
|
|
}, [
|
|
'🔗 ',
|
|
_('Open in New Tab')
|
|
]) : null,
|
|
E('button', {
|
|
'class': 'btn cbi-button-action',
|
|
'click': ui.hideModal
|
|
}, _('Close'))
|
|
])
|
|
]);
|
|
|
|
ui.showModal(modalTitle, [modal]);
|
|
},
|
|
|
|
/**
|
|
* Create a quick help tooltip
|
|
* @param {string} text - Tooltip text
|
|
* @param {string} moduleName - Optional module for "Learn More" link
|
|
* @returns {Element} Tooltip element
|
|
*/
|
|
createTooltip: function(text, moduleName) {
|
|
var tooltip = E('span', {
|
|
'class': 'sb-help-tooltip',
|
|
'title': text
|
|
}, '❓');
|
|
|
|
if (moduleName) {
|
|
var self = this;
|
|
tooltip.addEventListener('click', function(ev) {
|
|
ev.preventDefault();
|
|
window.open(self.getHelpUrl(moduleName), '_blank');
|
|
});
|
|
}
|
|
|
|
return tooltip;
|
|
},
|
|
|
|
/**
|
|
* Check if help page exists (basic check)
|
|
* @param {string} moduleName - Module identifier
|
|
* @returns {boolean} True if help page is configured
|
|
*/
|
|
hasHelpPage: function(moduleName) {
|
|
var url = this.getHelpUrl(moduleName);
|
|
return url.indexOf('demo-') !== -1 || moduleName === 'secubox';
|
|
},
|
|
|
|
/**
|
|
* Get all available help pages
|
|
* @returns {object} Map of module names to help URLs
|
|
*/
|
|
getAllHelpPages: function() {
|
|
return {
|
|
'secubox': this.getHelpUrl('secubox'),
|
|
'system-hub': this.getHelpUrl('system-hub'),
|
|
'network-modes': this.getHelpUrl('network-modes'),
|
|
'client-guardian': this.getHelpUrl('client-guardian'),
|
|
'bandwidth-manager': this.getHelpUrl('bandwidth-manager'),
|
|
'cdn-cache': this.getHelpUrl('cdn-cache'),
|
|
'traffic-shaper': this.getHelpUrl('traffic-shaper'),
|
|
'wireguard-dashboard': this.getHelpUrl('wireguard-dashboard'),
|
|
'crowdsec-dashboard': this.getHelpUrl('crowdsec-dashboard'),
|
|
'netdata-dashboard': this.getHelpUrl('netdata-dashboard'),
|
|
'netifyd-dashboard': this.getHelpUrl('netifyd-dashboard'),
|
|
'auth-guardian': this.getHelpUrl('auth-guardian'),
|
|
'vhost-manager': this.getHelpUrl('vhost-manager'),
|
|
'ksm-manager': this.getHelpUrl('ksm-manager'),
|
|
'media-flow': this.getHelpUrl('media-flow')
|
|
};
|
|
}
|
|
});
|