Move the settings disclosure to the sidebar footer
What does this MR do and why?
Behind the hide_unpinned_sidebar_items feature flag, the settings disclosure currently renders in the sidebar's context header, and only falls back to the footer when the sidebar is icon-only. This MR makes the footer the single placement for every panel and viewport.
Settings is a destination like Help, not a property of the context header. Putting it in the footer gives it a stable home, and the footer has room for a text label where the header did not.
The frontend change is largely a deletion: showHeaderSettingsDisclosure and the header <portal-target> go away, leaving the footer target gated on the flag alone.
super_sidebar.vue— one portal target, at the top of the footer and outside the scrolling nav container, so settings stays put as the nav scrolls.sidebar_menu.vue— drops thesettingsInHeaderprop and its:icon-only-togglebinding.menu_section.vue— drops the now-deadiconOnlyToggleprop;toggleTooltiploses its header branch.
The disclosure and Help are now structurally identical: a GlDisclosureDropdown wrapping a GlNavItem toggle with an icon, a label, and a right-placed tooltip when the sidebar is collapsed. The one intended difference is that settings binds :selected="item.is_active", so the button shows the navigation's active state on any settings page.
Footer order: settings leads the footer. The trial widget and the Manage organization button render between it and Help when they are present, so for a trial user or an organization admin the order is Settings → Trial → Manage organization → Help. This is intended: settings anchors the top of the footer rather than sitting against Help.
Visible change: iconOnlyToggle forced an icon-only gear in the expanded sidebar because header space was tight. In the footer the label fits, so the button is labelled at expanded width and icon-only (with tooltip) when collapsed — matching Help.
With the flag off, the sidebar is unchanged.
Scope note: disclosure labels merged in
!270748 (merged) ("Name the panel in the settings disclosure button") has been merged into this branch, so this MR's diff now also carries that work:
- a new
Sidebars::Menu#disclosure_title, serialized as adisclosure_titlefield disclosure_titleoverrides on the group and project settings menus- the matching
.potstrings
That field is serialized for those panels whether or not the flag is on; it is only read when the disclosure renders.
The admin and organization admin overrides were part of !270748 (merged) but have been deferred to the MRs that route those panels through the disclosure, so they ship alongside the behavior that reads them.
Stack (1 of 3): this MR → Admin area (!265260) → user settings (!265262). Each MR targets the branch below it.
Three further MRs have already been merged up into the stack and no longer need separate review: disclosure labels (!270748 (merged)) into this MR, organization admin (!265261 (merged)) into !265260, and settings pins (!265263 (merged)) into !265262.
References
- Builds on: !258763 (merged)
- Merged in: !270748 (merged)
- Rollout issue: #604888
- Related: #621643
Screenshots or screen recordings
Group
| Before | After |
|---|---|
![]() |
![]() |
![]() |
![]() |
Project
| Before | After |
|---|---|
![]() |
![]() |
![]() |
![]() |
How to set up and validate locally
-
Enable the feature flag in the Rails console:
Feature.enable(:hide_unpinned_sidebar_items) -
Visit any project or group.
-
Confirm Settings renders at the top of the sidebar footer, with its gear icon and a text label.
-
Scroll the navigation and confirm Settings stays in place.
-
Visit a settings page and confirm the button shows as selected.
-
Collapse the sidebar to icon-only and confirm Settings becomes an icon with a tooltip, like Help.
-
Disable the flag and confirm the sidebar is unchanged.
MR acceptance checklist
Evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.







