Skip to content

Commit e9a6058

Browse files
committed
Fixed #36529 -- Added support for the admin navigation sidebar on mobile screens.
1 parent 1285de5 commit e9a6058

File tree

3 files changed

+49
-6
lines changed

3 files changed

+49
-6
lines changed

django/contrib/admin/static/admin/css/nav_sidebar.css

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,13 +117,18 @@
117117
}
118118

119119
@media (max-width: 767px) {
120-
#nav-sidebar, #toggle-nav-sidebar {
121-
display: none;
120+
#container > .main.shifted {
121+
overflow-x: hidden;
122+
flex: 0 1 auto;
122123
}
123124

124-
.main > #nav-sidebar + .content,
125-
.main.shifted > #nav-sidebar + .content {
126-
max-width: 100%;
125+
.main.shifted #nav-sidebar {
126+
flex: none;
127+
}
128+
129+
#nav-sidebar {
130+
width: calc(100% - 23px);
131+
height: 100%;
127132
}
128133
}
129134

django/contrib/admin/static/admin/js/nav_sidebar.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22
{
33
const toggleNavSidebar = document.getElementById('toggle-nav-sidebar');
44
if (toggleNavSidebar !== null) {
5+
const isMobile = window.innerWidth <= 768;
56
const navSidebar = document.getElementById('nav-sidebar');
67
const main = document.getElementById('main');
7-
let navSidebarIsOpen = localStorage.getItem('django.admin.navSidebarIsOpen');
8+
let navSidebarIsOpen = isMobile ? false : localStorage.getItem('django.admin.navSidebarIsOpen');
89
if (navSidebarIsOpen === null) {
910
navSidebarIsOpen = 'true';
1011
}

tests/admin_views/test_nav_sidebar.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,3 +232,40 @@ def test_sidebar_filter_persists(self):
232232
filter_input = self.selenium.find_element(By.CSS_SELECTOR, "#nav-filter")
233233
filter_input.send_keys("users")
234234
self.assertEqual(self.selenium.execute_script(filter_value_script), "users")
235+
236+
def test_sidebar_state_ignore_on_mobile(self):
237+
from selenium.webdriver.common.by import By
238+
239+
def get_nav_sidebar():
240+
return self.selenium.find_element(By.ID, "nav-sidebar")
241+
242+
def get_users_link():
243+
return self.selenium.find_element(By.CSS_SELECTOR, "#auth-user a")
244+
245+
self.selenium.get(
246+
self.live_server_url + reverse("test_with_sidebar:auth_user_changelist")
247+
)
248+
with self.mobile_size():
249+
self.assertIsNone(
250+
self.selenium.execute_script(
251+
"return localStorage.getItem('django.admin.navSidebarIsOpen')"
252+
)
253+
)
254+
users_link = get_users_link()
255+
users_link.click()
256+
nav_sidebar = get_nav_sidebar()
257+
self.assertFalse(nav_sidebar.is_displayed())
258+
toggle_button = self.selenium.find_element(
259+
By.CSS_SELECTOR, "#toggle-nav-sidebar"
260+
)
261+
toggle_button.click()
262+
self.assertEqual(
263+
self.selenium.execute_script(
264+
"return localStorage.getItem('django.admin.navSidebarIsOpen')"
265+
),
266+
"true",
267+
)
268+
users_link = get_users_link()
269+
users_link.click()
270+
nav_sidebar = get_nav_sidebar()
271+
self.assertFalse(nav_sidebar.is_displayed())

0 commit comments

Comments
 (0)