Add customization options to tailored navigation sidebar

What does this MR do and why?

Tailored navigation is the right default for most users. Showing only pinned items reduces cognitive load and avoids designing the sidebar around a narrow set of advanced workflows. Keeping a feature permanently visible is not the same as driving its adoption.

Admins, owners, and maintainers face a different problem. The change is disruptive to workflows they've built over time, and without clear context for why it happened, the experience feels like regression. The category structure was a mental map they'd internalized, and pinning alone doesn't fully replace it.

To bridge that gap, this MR adds a way to customize the tailored sidebar without giving up the pinned-only default. Users open a Customize sidebar dropdown — an ellipsis button in the group and project context header — rather than digging through the feature library modal. The control is a single-select listbox, so the options are mutually exclusive by construction. The choice is persisted in localStorage, and the dropdown only appears while the hide_unpinned_sidebar_items feature flag is active.

The listbox offers three navigation modes, ordered from least to most expansive:

  • Flat (Pinned only) — the default pinned-only flat list.
  • Organized (Pinned in categories) — pinned items grouped under their parent category. Each group is labelled with the category name, and the feature keeps its own icon rather than a category icon. Groups follow the natural navigation order, and items stay reorderable within a group. When the sidebar is collapsed to icons, the groups flatten into a single list of icons separated by dividers, since there's no category header to show.
  • Everything (All categories) — restores the full navigation category structure inline.

Selecting a mode fires a single internal event, select_sidebar_navigation_mode_in_sidebar_preferences. The event carries the chosen mode as a property — pinned_only, grouped_pins, or all_categories — so each option can be counted directly instead of being inferred from on/off toggle pairs.

References

Feedback : Feature library + tailored navigation (#604008 - closed) • Austin Regnery

Screenshots or screen recordings

Expanded Collapsed
Flat Default - Expanded.png Default - Rail.png
Organized Categorized_-_Expanded Categorized_-_Rail
Everything Full_-_Expanded Full_-_Rail

How to set up and validate locally

  1. Enable the hide_unpinned_sidebar_items feature flag.
  2. Visit a project or group; open the "Customize sidebar" control (ellipsis) in the sidebar context header.
  3. Select each mode and confirm:
    • Flat (Pinned only): pins shown as a flat list.
    • Organized (Pinned in categories): pins grouped under category headings; collapse one category and reload — each category keeps its own collapse state.
    • Everything (All categories): full navigation shown.
  4. Confirm the selection persists across reloads (localStorage).
  5. Screen reader: confirm the navigation list is announced with the context title only (not "Customize sidebar").

Note: Preferences are persisted to localStorage for now. DB-backed persistence (so the setting follows the user across browsers and devices) is deferred to a follow-up.

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.

Edited by Austin Regnery

Merge request reports

Loading
Loading