fix(nav): stop the sidebar promising two pages that are not built, and surface one that is - #339
Merged
Merged
Conversation
…d surface one that is Two sidebar entries lead to a ComingSoonPage. Nothing distinguishes them from the live integrations beside them, so the click is a dead end: CI/CD and SIEM. They now carry a "Soon" badge — the mechanism already existed (getBadgeValue falls back to a static item.badge), it was simply never used. Badging rather than deleting is deliberate. The entries communicate roadmap, which is worth keeping; what is not worth keeping is a nav item that looks shipped. The opposite problem, on the same screen: /settings/integrations/api-keys is a 501-line page wired to /api/v1/api-keys — list, create, revoke, delete — with no navigation reference anywhere. Not in the sidebar, not among the cards on the integrations landing page, not linked from any other page. The only mentions of "api-keys" in the tree are the feature's own hooks, consumed by the MCP page. It is a working feature nobody can reach. It is now a card alongside the other integration categories. Scope note: this is the confirmed-unreachable subset, not a sweep. 107 pages are absent from the sidebar, but most are reached as tabs or sub-pages, and this codebase navigates through config objects (`router.push(category.href)`), so grep cannot answer "is this page reachable". Every automated pass I wrote produced a different number and each one was wrong in a different way. api-keys survived every check, including reading the landing page by hand.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Two problems on the same screen, in opposite directions.
The sidebar promises two things it does not have
/settings/integrations/cicdand/settings/integrations/siemrenderComingSoonPage— 20 lines each. Nothing in the nav distinguishes them from thelive integrations sitting beside them, so the click is a dead end.
They now carry a
Soonbadge. The mechanism already existed —getBadgeValue(dynamicBadges, url, item.badge)falls back to a staticitem.badge, andbadge?: stringis already on the nav item type. It had simplynever been used.
Badged rather than deleted, deliberately. The entries communicate roadmap,
which is worth keeping. What is not worth keeping is a nav item that looks
shipped.
And it hides one it does have
/settings/integrations/api-keysis 501 lines, wired to/api/v1/api-keys—list, create, revoke, delete — and has no navigation reference anywhere:
sidebar-data.tsThe only mentions of
api-keysin the tree are the feature's own hooks and types,consumed by the MCP page (which uses the hook, not the route). A working feature
nobody can reach. It is now a card alongside the other integration categories.
Scope — this is the confirmed subset, not a sweep
107 pages are absent from the sidebar. That number is real but not a list of
orphans: most are reached as tabs or sub-pages.
This codebase navigates through config objects —
router.push(category.href),router.push(`/assets/${listingSlug}`)— so grep cannot answer "is this pagereachable". Every automated pass I wrote produced a different number, and each
was wrong in a different way:
grep -Fwith an alternation, so the|was matched literallysecrets,tickets,trends) match anything`/assets/${slug}`— dynamic hrefsrouter.push(category.href)— href via variableapi-keysis the one that survived every pass and a hand read of the landingpage. That is why it is the only route this PR wires up.
Deciding the fate of the remaining pages — wire or delete — needs a product call
per cluster, not a regex.
Verification
tsc --noEmitclean,eslintclean on both changed files, prettier-formatted.