Skip to content

Commit 4c4c153

Browse files
authored
Story 2230: Update Mobile Navigation UI & Header Refactor (#2305)
1 parent 2613a92 commit 4c4c153

11 files changed

Lines changed: 595 additions & 544 deletions

File tree

config/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@
180180
"django.contrib.messages.context_processors.messages",
181181
"core.context_processors.current_version",
182182
"core.context_processors.active_nav_item",
183+
"core.context_processors.header_context",
183184
"core.context_processors.debug",
184185
],
185186
"loaders": [

core/context_processors.py

Lines changed: 52 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
from dataclasses import dataclass
12
from enum import StrEnum
23

34
from django.conf import settings
5+
from django.urls import reverse
46

57
from versions.models import Version
68

@@ -18,24 +20,59 @@ class NavItem(StrEnum):
1820
RELEASES = "releases"
1921

2022

23+
_PATH_MAP = {
24+
"/doc/libs/": NavItem.LIBRARIES, # special case - handle first
25+
"/doc/": NavItem.LEARN,
26+
"/docs/": NavItem.LEARN,
27+
"/boost-development/": NavItem.LEARN,
28+
"/news/": NavItem.NEWS,
29+
"/community/": NavItem.COMMUNITY,
30+
"/library/": NavItem.LIBRARIES,
31+
"/libraries/": NavItem.LIBRARIES,
32+
"/releases/": NavItem.RELEASES,
33+
}
34+
35+
36+
def _get_active_nav_item(request):
37+
"""Determines the active nav item based on the request path."""
38+
for prefix, item in _PATH_MAP.items():
39+
if request.path.startswith(prefix):
40+
return item
41+
return "home"
42+
43+
2144
def active_nav_item(request):
2245
"""Custom context processor that adds the active nav item to the context"""
23-
default_nav_item = "home"
24-
path_map = {
25-
"/doc/libs/": NavItem.LIBRARIES, # special case - handle first
26-
"/doc/": NavItem.LEARN,
27-
"/docs/": NavItem.LEARN,
28-
"/boost-development/": NavItem.LEARN,
29-
"/news/": NavItem.NEWS,
30-
"/community/": NavItem.COMMUNITY,
31-
"/library/": NavItem.LIBRARIES,
32-
"/libraries/": NavItem.LIBRARIES,
33-
"/releases/": NavItem.RELEASES,
46+
return {"active_nav_item": _get_active_nav_item(request)}
47+
48+
49+
@dataclass
50+
class NavLink:
51+
"""A single header navigation link."""
52+
53+
label: str
54+
url: str
55+
nav_id: str = ""
56+
is_unread: bool = False
57+
58+
59+
def header_context(request):
60+
"""Context processor for header nav links."""
61+
nav_links = [
62+
NavLink(label="Libraries", url=reverse("libraries"), nav_id="libraries"),
63+
NavLink(label="Learn", url=reverse("docs"), nav_id="learn"),
64+
NavLink(label="Community", url=reverse("community"), nav_id="community"),
65+
NavLink(
66+
label="Posts", url=reverse("news"), nav_id="news", is_unread=True
67+
), # TODO: update is_unread based on actual unread state
68+
NavLink(
69+
label="Download", url=reverse("releases-most-recent"), nav_id="releases"
70+
),
71+
]
72+
return {
73+
"nav_links": nav_links,
74+
"releases_url": reverse("releases-most-recent"),
3475
}
35-
for prefix, item in path_map.items():
36-
if request.path.startswith(prefix):
37-
return {"active_nav_item": item}
38-
return {"active_nav_item": default_nav_item}
3976

4077

4178
def debug(request):

0 commit comments

Comments
 (0)