diff --git a/containers/libreportal/frontend/components/admin/ip-whitelist.css b/containers/libreportal/frontend/components/admin/config/css/ip-whitelist.css similarity index 100% rename from containers/libreportal/frontend/components/admin/ip-whitelist.css rename to containers/libreportal/frontend/components/admin/config/css/ip-whitelist.css diff --git a/containers/libreportal/frontend/components/admin/config-content.html b/containers/libreportal/frontend/components/admin/config/html/config-content.html similarity index 100% rename from containers/libreportal/frontend/components/admin/config-content.html rename to containers/libreportal/frontend/components/admin/config/html/config-content.html diff --git a/containers/libreportal/frontend/core/icons/config/backup.svg b/containers/libreportal/frontend/components/admin/config/icons/config/backup.svg similarity index 100% rename from containers/libreportal/frontend/core/icons/config/backup.svg rename to containers/libreportal/frontend/components/admin/config/icons/config/backup.svg diff --git a/containers/libreportal/frontend/core/icons/config/features.svg b/containers/libreportal/frontend/components/admin/config/icons/config/features.svg similarity index 100% rename from containers/libreportal/frontend/core/icons/config/features.svg rename to containers/libreportal/frontend/components/admin/config/icons/config/features.svg diff --git a/containers/libreportal/frontend/core/icons/config/general.svg b/containers/libreportal/frontend/components/admin/config/icons/config/general.svg similarity index 100% rename from containers/libreportal/frontend/core/icons/config/general.svg rename to containers/libreportal/frontend/components/admin/config/icons/config/general.svg diff --git a/containers/libreportal/frontend/core/icons/config/network.svg b/containers/libreportal/frontend/components/admin/config/icons/config/network.svg similarity index 100% rename from containers/libreportal/frontend/core/icons/config/network.svg rename to containers/libreportal/frontend/components/admin/config/icons/config/network.svg diff --git a/containers/libreportal/frontend/core/icons/config/security.svg b/containers/libreportal/frontend/components/admin/config/icons/config/security.svg similarity index 100% rename from containers/libreportal/frontend/core/icons/config/security.svg rename to containers/libreportal/frontend/components/admin/config/icons/config/security.svg diff --git a/containers/libreportal/frontend/core/icons/config/webui.svg b/containers/libreportal/frontend/components/admin/config/icons/config/webui.svg similarity index 100% rename from containers/libreportal/frontend/core/icons/config/webui.svg rename to containers/libreportal/frontend/components/admin/config/icons/config/webui.svg diff --git a/containers/libreportal/frontend/components/admin/config-core.js b/containers/libreportal/frontend/components/admin/config/js/config-core.js similarity index 100% rename from containers/libreportal/frontend/components/admin/config-core.js rename to containers/libreportal/frontend/components/admin/config/js/config-core.js diff --git a/containers/libreportal/frontend/components/admin/config-form.js b/containers/libreportal/frontend/components/admin/config/js/config-form.js similarity index 100% rename from containers/libreportal/frontend/components/admin/config-form.js rename to containers/libreportal/frontend/components/admin/config/js/config-form.js diff --git a/containers/libreportal/frontend/components/admin/config-manager.js b/containers/libreportal/frontend/components/admin/config/js/config-manager.js similarity index 95% rename from containers/libreportal/frontend/components/admin/config-manager.js rename to containers/libreportal/frontend/components/admin/config/js/config-manager.js index 881a33a..39f92be 100755 --- a/containers/libreportal/frontend/components/admin/config-manager.js +++ b/containers/libreportal/frontend/components/admin/config/js/config-manager.js @@ -44,8 +44,8 @@ if (typeof window.ConfigManager === 'undefined') { try { this.sidebar.populateSidebar(); } catch (e) {} // charts.js is the chart-rendering helper admin-overview pulls in. await Promise.all([ - lazyLoad('/components/admin/admin-overview.js'), - lazyLoad('/components/admin/charts.js') + lazyLoad('/components/admin/overview/js/admin-overview.js'), + lazyLoad('/components/admin/system/js/charts.js') ]); if (typeof AdminOverview !== 'undefined') { window.adminOverview = new AdminOverview('config-section'); @@ -60,7 +60,7 @@ if (typeof window.ConfigManager === 'undefined') { // a config category — render its own controller into the main pane. if (category === 'ssh-access') { try { this.sidebar.populateSidebar(); } catch (e) {} - await lazyLoad('/components/admin/ssh-page.js'); + await lazyLoad('/components/admin/ssh/js/ssh-page.js'); if (typeof SshPage !== 'undefined') { window.sshPage = new SshPage('config-section'); await window.sshPage.init(); @@ -76,9 +76,9 @@ if (typeof window.ConfigManager === 'undefined') { // we inject its content template, then init PeersPage. if (category === 'peers') { try { this.sidebar.populateSidebar(); } catch (e) {} - await lazyLoad('/components/admin/peers-page.js'); + await lazyLoad('/components/admin/peers/js/peers-page.js'); try { - const html = await fetch('/components/admin/peers-content.html').then(r => r.text()); + const html = await fetch('/components/admin/peers/html/peers-content.html').then(r => r.text()); configSection.innerHTML = html; } catch (e) { configSection.innerHTML = '
Enter your 16-digit Mullvad account number. A new WireGuard key will be generated locally @@ -3354,7 +3354,7 @@ class AppsManager { { name: 'TaskCommands', src: '/core/lib/task-commands.js' }, { name: 'TaskActions', src: '/core/lib/task-actions.js' }, { name: 'TaskRouter', src: '/core/lib/task-router.js' }, - { name: 'TasksManager', src: '/components/tasks/tasks-manager.js' } + { name: 'TasksManager', src: '/components/tasks/js/tasks-manager.js' } ]; for (const script of scripts) { diff --git a/containers/libreportal/frontend/components/apps/index.js b/containers/libreportal/frontend/components/apps/index.js index c9a7ce4..31efeb5 100644 --- a/containers/libreportal/frontend/components/apps/index.js +++ b/containers/libreportal/frontend/components/apps/index.js @@ -28,7 +28,7 @@ LP.features.register({ // Load the unified layout only if it isn't already present — preserves grid // state when moving between categories / back from app-detail (legacy behaviour). if (!document.querySelector('.apps-layout')) { - const html = await ctx.loadFragment('/components/apps/apps-unified-layout.html'); + const html = await ctx.loadFragment('/components/apps/core/html/apps-unified-layout.html'); ctx.setContent(html, 'Applications'); } diff --git a/containers/libreportal/frontend/components/apps/port-manager.css b/containers/libreportal/frontend/components/apps/port-manager/css/port-manager.css similarity index 100% rename from containers/libreportal/frontend/components/apps/port-manager.css rename to containers/libreportal/frontend/components/apps/port-manager/css/port-manager.css diff --git a/containers/libreportal/frontend/components/apps/port-manager.js b/containers/libreportal/frontend/components/apps/port-manager/js/port-manager.js similarity index 100% rename from containers/libreportal/frontend/components/apps/port-manager.js rename to containers/libreportal/frontend/components/apps/port-manager/js/port-manager.js diff --git a/containers/libreportal/frontend/components/apps/routing.css b/containers/libreportal/frontend/components/apps/routing/css/routing.css similarity index 100% rename from containers/libreportal/frontend/components/apps/routing.css rename to containers/libreportal/frontend/components/apps/routing/css/routing.css diff --git a/containers/libreportal/frontend/components/apps/routing-manager.js b/containers/libreportal/frontend/components/apps/routing/js/routing-manager.js similarity index 100% rename from containers/libreportal/frontend/components/apps/routing-manager.js rename to containers/libreportal/frontend/components/apps/routing/js/routing-manager.js diff --git a/containers/libreportal/frontend/components/apps/services.css b/containers/libreportal/frontend/components/apps/services/css/services.css similarity index 100% rename from containers/libreportal/frontend/components/apps/services.css rename to containers/libreportal/frontend/components/apps/services/css/services.css diff --git a/containers/libreportal/frontend/components/apps/services-manager.js b/containers/libreportal/frontend/components/apps/services/js/services-manager.js similarity index 100% rename from containers/libreportal/frontend/components/apps/services-manager.js rename to containers/libreportal/frontend/components/apps/services/js/services-manager.js diff --git a/containers/libreportal/frontend/components/apps/tools.css b/containers/libreportal/frontend/components/apps/tools/css/tools.css similarity index 100% rename from containers/libreportal/frontend/components/apps/tools.css rename to containers/libreportal/frontend/components/apps/tools/css/tools.css diff --git a/containers/libreportal/frontend/components/apps/tools-manager.js b/containers/libreportal/frontend/components/apps/tools/js/tools-manager.js similarity index 100% rename from containers/libreportal/frontend/components/apps/tools-manager.js rename to containers/libreportal/frontend/components/apps/tools/js/tools-manager.js diff --git a/containers/libreportal/frontend/components/backup/backup.css b/containers/libreportal/frontend/components/backup/css/backup.css similarity index 100% rename from containers/libreportal/frontend/components/backup/backup.css rename to containers/libreportal/frontend/components/backup/css/backup.css diff --git a/containers/libreportal/frontend/components/backup/backup-content.html b/containers/libreportal/frontend/components/backup/html/backup-content.html similarity index 100% rename from containers/libreportal/frontend/components/backup/backup-content.html rename to containers/libreportal/frontend/components/backup/html/backup-content.html diff --git a/containers/libreportal/frontend/components/backup/index.js b/containers/libreportal/frontend/components/backup/index.js index e0f5b88..5d7d67d 100644 --- a/containers/libreportal/frontend/components/backup/index.js +++ b/containers/libreportal/frontend/components/backup/index.js @@ -14,14 +14,14 @@ LP.features.register({ routes: ['/backup', '/backup*'], // Controllers the feature needs; lazy-loaded on first mount (idempotent). scripts: [ - '/components/backup/backup-schema.js', - '/components/backup/backup-page.js', + '/components/backup/js/backup-schema.js', + '/components/backup/js/backup-page.js', '/core/lib/backup-app-card.js', ], async mount(ctx) { await ctx.loadScripts(this.scripts); - const html = await ctx.loadFragment('/components/backup/backup-content.html'); + const html = await ctx.loadFragment('/components/backup/html/backup-content.html'); ctx.setContent(html, 'Backups'); if (typeof BackupPage === 'undefined') { throw new Error('BackupPage controller failed to load'); diff --git a/containers/libreportal/frontend/components/backup/backup-page.js b/containers/libreportal/frontend/components/backup/js/backup-page.js similarity index 100% rename from containers/libreportal/frontend/components/backup/backup-page.js rename to containers/libreportal/frontend/components/backup/js/backup-page.js diff --git a/containers/libreportal/frontend/components/backup/backup-schema.js b/containers/libreportal/frontend/components/backup/js/backup-schema.js similarity index 100% rename from containers/libreportal/frontend/components/backup/backup-schema.js rename to containers/libreportal/frontend/components/backup/js/backup-schema.js diff --git a/containers/libreportal/frontend/components/dashboard/dashboard.css b/containers/libreportal/frontend/components/dashboard/css/dashboard.css similarity index 100% rename from containers/libreportal/frontend/components/dashboard/dashboard.css rename to containers/libreportal/frontend/components/dashboard/css/dashboard.css diff --git a/containers/libreportal/frontend/components/dashboard/dashboard-content.html b/containers/libreportal/frontend/components/dashboard/html/dashboard-content.html similarity index 100% rename from containers/libreportal/frontend/components/dashboard/dashboard-content.html rename to containers/libreportal/frontend/components/dashboard/html/dashboard-content.html diff --git a/containers/libreportal/frontend/components/dashboard/index.js b/containers/libreportal/frontend/components/dashboard/index.js index c6ccc15..4e325d2 100644 --- a/containers/libreportal/frontend/components/dashboard/index.js +++ b/containers/libreportal/frontend/components/dashboard/index.js @@ -13,7 +13,7 @@ LP.features.register({ routes: ['/', '/dashboard'], async mount(ctx) { - const html = await ctx.loadFragment('/components/dashboard/dashboard-content.html'); + const html = await ctx.loadFragment('/components/dashboard/html/dashboard-content.html'); ctx.setContent(html, 'Dashboard'); // Render the installed-apps icon grid (handleDashboard's only post-render call). diff --git a/containers/libreportal/frontend/components/dashboard/dashboard.js b/containers/libreportal/frontend/components/dashboard/js/dashboard.js similarity index 100% rename from containers/libreportal/frontend/components/dashboard/dashboard.js rename to containers/libreportal/frontend/components/dashboard/js/dashboard.js diff --git a/containers/libreportal/frontend/components/tasks/tasks.css b/containers/libreportal/frontend/components/tasks/css/tasks.css similarity index 100% rename from containers/libreportal/frontend/components/tasks/tasks.css rename to containers/libreportal/frontend/components/tasks/css/tasks.css diff --git a/containers/libreportal/frontend/components/tasks/tasks-content.html b/containers/libreportal/frontend/components/tasks/html/tasks-content.html similarity index 100% rename from containers/libreportal/frontend/components/tasks/tasks-content.html rename to containers/libreportal/frontend/components/tasks/html/tasks-content.html diff --git a/containers/libreportal/frontend/components/tasks/index.js b/containers/libreportal/frontend/components/tasks/index.js index d217769..147ffef 100644 --- a/containers/libreportal/frontend/components/tasks/index.js +++ b/containers/libreportal/frontend/components/tasks/index.js @@ -11,7 +11,7 @@ LP.features.register({ routes: ['/tasks', '/tasks*'], async mount(ctx) { - const html = await ctx.loadFragment('/components/tasks/tasks-content.html'); + const html = await ctx.loadFragment('/components/tasks/html/tasks-content.html'); ctx.setContent(html, 'Tasks'); if (window.tasksManager) { diff --git a/containers/libreportal/frontend/components/tasks/tasks-manager.js b/containers/libreportal/frontend/components/tasks/js/tasks-manager.js similarity index 100% rename from containers/libreportal/frontend/components/tasks/tasks-manager.js rename to containers/libreportal/frontend/components/tasks/js/tasks-manager.js diff --git a/containers/libreportal/frontend/components/updater/updater.css b/containers/libreportal/frontend/components/updater/css/updater.css similarity index 100% rename from containers/libreportal/frontend/components/updater/updater.css rename to containers/libreportal/frontend/components/updater/css/updater.css diff --git a/containers/libreportal/frontend/components/updater/updater-content.html b/containers/libreportal/frontend/components/updater/html/updater-content.html similarity index 100% rename from containers/libreportal/frontend/components/updater/updater-content.html rename to containers/libreportal/frontend/components/updater/html/updater-content.html diff --git a/containers/libreportal/frontend/components/updater/index.js b/containers/libreportal/frontend/components/updater/index.js index d9d9c9f..7459809 100644 --- a/containers/libreportal/frontend/components/updater/index.js +++ b/containers/libreportal/frontend/components/updater/index.js @@ -9,11 +9,11 @@ LP.features.register({ id: 'updater', routes: ['/updater', '/updater*'], - scripts: ['/components/updater/updater-page.js'], + scripts: ['/components/updater/js/updater-page.js'], async mount(ctx) { await ctx.loadScripts(this.scripts); - const html = await ctx.loadFragment('/components/updater/updater-content.html'); + const html = await ctx.loadFragment('/components/updater/html/updater-content.html'); ctx.setContent(html, 'Updates'); if (typeof UpdaterPage === 'undefined') { throw new Error('UpdaterPage controller failed to load'); diff --git a/containers/libreportal/frontend/components/updater/updater-page.js b/containers/libreportal/frontend/components/updater/js/updater-page.js similarity index 100% rename from containers/libreportal/frontend/components/updater/updater-page.js rename to containers/libreportal/frontend/components/updater/js/updater-page.js diff --git a/containers/libreportal/frontend/core/boot/system-loader.js b/containers/libreportal/frontend/core/boot/system-loader.js index 0866044..9c95e89 100755 --- a/containers/libreportal/frontend/core/boot/system-loader.js +++ b/containers/libreportal/frontend/core/boot/system-loader.js @@ -41,16 +41,16 @@ class SystemLoader { scripts: [ '/core/lib/config-options.js', '/core/lib/config-shared.js', - '/components/admin/config-validator.js', - '/components/admin/toggle-manager.js', - '/components/admin/config-core.js', - '/components/admin/domain-manager.js', - '/components/admin/ip-whitelist-manager.js', - '/components/admin/config-renderer.js', - '/components/admin/config-sidebar.js', - '/components/admin/config-form.js', - '/components/admin/config-utils.js', - '/components/admin/config-manager.js' + '/components/admin/config/js/config-validator.js', + '/components/admin/config/js/toggle-manager.js', + '/components/admin/config/js/config-core.js', + '/components/admin/config/js/domain-manager.js', + '/components/admin/config/js/ip-whitelist-manager.js', + '/components/admin/config/js/config-renderer.js', + '/components/admin/config/js/config-sidebar.js', + '/components/admin/config/js/config-form.js', + '/components/admin/config/js/config-utils.js', + '/components/admin/config/js/config-manager.js' ] }); @@ -174,7 +174,7 @@ class SystemLoader { '/core/lib/task-global-functions.js', '/core/lib/task-manager.js', '/core/lib/task-parameter-preserve.js', - '/components/tasks/tasks-manager.js' + '/components/tasks/js/tasks-manager.js' ] }); @@ -204,13 +204,13 @@ class SystemLoader { global: 'appsManager', dependencies: ['data'], scripts: [ - '/components/apps/port-manager.js', + '/components/apps/port-manager/js/port-manager.js', '/core/lib/task-manager.js', // Add TaskManager for backup functionality '/core/lib/backup-app-card.js', - '/components/apps/services-manager.js', - '/components/apps/tools-manager.js', - '/components/apps/routing-manager.js', - '/components/apps/apps-manager.js' + '/components/apps/services/js/services-manager.js', + '/components/apps/tools/js/tools-manager.js', + '/components/apps/routing/js/routing-manager.js', + '/components/apps/core/js/apps-manager.js' ] }); @@ -232,7 +232,7 @@ class SystemLoader { }, global: 'appTabbedManager', dependencies: [], - script: '/components/apps/app-tabbed-manager.js' + script: '/components/apps/core/js/app-tabbed-manager.js' }); // console.log('TEST: Components added. Total components:', this.components.size); diff --git a/containers/libreportal/frontend/core/kernel/spa.js b/containers/libreportal/frontend/core/kernel/spa.js index 6ca27c7..40064d9 100755 --- a/containers/libreportal/frontend/core/kernel/spa.js +++ b/containers/libreportal/frontend/core/kernel/spa.js @@ -341,7 +341,7 @@ class LibrePortalSPAClean { try { // console.log('📄 SPA: Fetching dashboard content...'); - const html = await this.fetchContent('/components/dashboard/dashboard-content.html'); + const html = await this.fetchContent('/components/dashboard/html/dashboard-content.html'); // console.log('📄 SPA: Dashboard content fetched, loading...'); this.loadContent(html, 'Dashboard'); // console.log('📄 SPA: Dashboard content loaded'); @@ -362,10 +362,10 @@ class LibrePortalSPAClean { // backup-page.js + backup-app-card.js are loaded on first navigation. // loadScript is idempotent — subsequent /backup navigations are no-ops. await Promise.all([ - this.loadScript('/components/backup/backup-page.js'), + this.loadScript('/components/backup/js/backup-page.js'), this.loadScript('/core/lib/backup-app-card.js') ]); - const html = await this.fetchContent('/components/backup/backup-content.html'); + const html = await this.fetchContent('/components/backup/html/backup-content.html'); this.loadContent(html, 'Backups'); if (typeof BackupPage !== 'undefined') { window.backupPage = new BackupPage(); @@ -409,7 +409,7 @@ class LibrePortalSPAClean { // Ensure unified layout is loaded (like the old SPA) if (!document.querySelector('.apps-layout')) { //console.log('📄 Loading apps layout HTML...'); - const html = await this.fetchContent('/components/apps/apps-unified-layout.html'); + const html = await this.fetchContent('/components/apps/core/html/apps-unified-layout.html'); this.loadContent(html, 'Applications'); } else { //console.log('📄 Apps layout already exists, skipping HTML load'); @@ -477,7 +477,7 @@ class LibrePortalSPAClean { } try { - const html = await this.fetchContent('/components/apps/apps-unified-layout.html'); + const html = await this.fetchContent('/components/apps/core/html/apps-unified-layout.html'); this.loadContent(html, appName); // Will be updated after app data loads // AppTabbedManager should already be initialized by SystemLoader @@ -502,7 +502,7 @@ class LibrePortalSPAClean { window.configCategory = window.adminCategoryFromPath(window.location.pathname); try { - const html = await this.fetchContent('/components/admin/config-content.html'); + const html = await this.fetchContent('/components/admin/config/html/config-content.html'); this.loadContent(html, 'Admin'); if (window.configManager) { @@ -535,7 +535,7 @@ class LibrePortalSPAClean { //console.log('📋 Loading tasks...'); try { - const html = await this.fetchContent('/components/tasks/tasks-content.html'); + const html = await this.fetchContent('/components/tasks/html/tasks-content.html'); this.loadContent(html, 'Tasks'); // Tasks manager should already be initialized by SystemLoader diff --git a/containers/libreportal/frontend/index.html b/containers/libreportal/frontend/index.html index d084a2f..60c3f30 100755 --- a/containers/libreportal/frontend/index.html +++ b/containers/libreportal/frontend/index.html @@ -16,27 +16,27 @@ - - - - - - + + + + + + - - + + - - + + - - - - + + + + - +