From 4f621e3973969b4ad0d57d9d124098ba627a13ea Mon Sep 17 00:00:00 2001 From: jwed Date: Sat, 29 Aug 2026 11:31:54 -0400 Subject: [PATCH] Declare the Captive Portal page in the manifest MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The page and all nine of its routes exist and nothing links to them, on dev and equally on production at 6287054. It is not a dev-only gap. One manifest row, no source, no routes, no migration. It goes here rather than in a shell migration because syncNavFolder() PRUNES nav rows the manifest does not declare — a hand-inserted row would be deleted by the next app:install, which is pinned by a negative-control test in the shell so nobody rediscovers it. Held: this repo is on .promote-hold for Plan 1 BYOD quotas, unrelated to this screen. Committed, not promoted; the row appears the moment the hold lifts. Permission is unifi.auth, which the portal route group requires — NOT unifi.settings. A person can legitimately hold unifi.settings and be 403'd here. --- composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.json b/composer.json index 40bff5c..1c5ea23 100644 --- a/composer.json +++ b/composer.json @@ -29,6 +29,7 @@ { "label": "Devices", "route_name": "unifi.devices", "icon": "cpu-chip", "permission": "unifi.stats", "sort_order": 3 }, { "label": "Clients", "route_name": "unifi.clients", "icon": "users", "permission": "unifi.stats", "sort_order": 4 }, { "label": "WiFi Networks", "route_name": "unifi.wifi", "icon": "wifi", "permission": "unifi.manage", "sort_order": 5 }, + { "label": "Captive Portal", "route_name": "unifi.portal.settings", "icon": "shield-check", "permission": "unifi.auth", "sort_order": 6 }, { "label": "Settings", "route_name": "unifi.settings", "icon": "cog-6-tooth", "permission": "unifi.settings", "sort_order": 99 } ], "permissions": [