Fixed #36055 -- Prevented overlap of object-tools buttons and page header in the admin.
@ -808,19 +808,19 @@ a.deletelink:focus, a.deletelink:hover {
|
|||||||
/* OBJECT TOOLS */
|
/* OBJECT TOOLS */
|
||||||
|
|
||||||
.object-tools {
|
.object-tools {
|
||||||
font-size: 0.625rem;
|
padding: 0;
|
||||||
font-weight: bold;
|
overflow: hidden;
|
||||||
padding-left: 0;
|
text-align: right;
|
||||||
float: right;
|
margin: 0 0 15px;
|
||||||
position: relative;
|
|
||||||
margin-top: -48px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.object-tools li {
|
.object-tools li {
|
||||||
display: block;
|
display: inline-block;
|
||||||
float: left;
|
height: auto;
|
||||||
margin-left: 5px;
|
}
|
||||||
height: 1rem;
|
|
||||||
|
.object-tools li + li {
|
||||||
|
margin-left: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.object-tools a {
|
.object-tools a {
|
||||||
|
@ -442,19 +442,7 @@ input[type="submit"], button {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.object-tools {
|
.object-tools {
|
||||||
float: none;
|
text-align: left;
|
||||||
margin: 0 0 15px;
|
|
||||||
padding: 0;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.object-tools li {
|
|
||||||
height: auto;
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.object-tools li + li {
|
|
||||||
margin-left: 15px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Forms */
|
/* Forms */
|
||||||
|
@ -34,15 +34,6 @@
|
|||||||
background-position: calc(100% - 8px) 9px;
|
background-position: calc(100% - 8px) 9px;
|
||||||
}
|
}
|
||||||
|
|
||||||
[dir="rtl"] .object-tools li {
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
[dir="rtl"] .object-tools li + li {
|
|
||||||
margin-left: 0;
|
|
||||||
margin-right: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
[dir="rtl"] .dashboard .module table td a {
|
[dir="rtl"] .dashboard .module table td a {
|
||||||
padding-left: 0;
|
padding-left: 0;
|
||||||
padding-right: 16px;
|
padding-right: 16px;
|
||||||
@ -72,6 +63,11 @@
|
|||||||
margin-left: 0;
|
margin-left: 0;
|
||||||
margin-right: 0;
|
margin-right: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[dir="rtl"] .object-tools {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
[dir="rtl"] .aligned .vCheckboxLabel {
|
[dir="rtl"] .aligned .vCheckboxLabel {
|
||||||
padding: 1px 5px 0 0;
|
padding: 1px 5px 0 0;
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,12 @@ th {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.object-tools {
|
.object-tools {
|
||||||
float: left;
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.object-tools li + li {
|
||||||
|
margin-right: 15px;
|
||||||
|
margin-left: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
thead th:first-child,
|
thead th:first-child,
|
||||||
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 110 KiB After Width: | Height: | Size: 87 KiB |
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 74 KiB |
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 54 KiB |
@ -973,6 +973,12 @@ class Restaurant(models.Model):
|
|||||||
city = models.ForeignKey(City, models.CASCADE)
|
city = models.ForeignKey(City, models.CASCADE)
|
||||||
name = models.CharField(max_length=100)
|
name = models.CharField(max_length=100)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = (
|
||||||
|
"very very very very very very very very very "
|
||||||
|
"loooooooooooooooooooooooooooooooooooooooooong name"
|
||||||
|
)
|
||||||
|
|
||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
return "/dummy/%s/" % self.pk
|
return "/dummy/%s/" % self.pk
|
||||||
|
|
||||||
|
@ -126,6 +126,7 @@ from .models import (
|
|||||||
Song,
|
Song,
|
||||||
State,
|
State,
|
||||||
Story,
|
Story,
|
||||||
|
Subscriber,
|
||||||
SuperSecretHideout,
|
SuperSecretHideout,
|
||||||
SuperVillain,
|
SuperVillain,
|
||||||
Telegram,
|
Telegram,
|
||||||
@ -6955,6 +6956,37 @@ class SeleniumTests(AdminSeleniumTestCase):
|
|||||||
with self.wait_page_loaded():
|
with self.wait_page_loaded():
|
||||||
save_button.click()
|
save_button.click()
|
||||||
|
|
||||||
|
@screenshot_cases(["desktop_size", "mobile_size", "rtl", "dark", "high_contrast"])
|
||||||
|
def test_long_header_with_object_tools_layout(self):
|
||||||
|
from selenium.webdriver.common.by import By
|
||||||
|
|
||||||
|
self.admin_login(
|
||||||
|
username="super", password="secret", login_url=reverse("admin:index")
|
||||||
|
)
|
||||||
|
s = Subscriber.objects.create(name="a " * 40, email="b " * 80)
|
||||||
|
self.selenium.get(
|
||||||
|
self.live_server_url
|
||||||
|
+ reverse("admin:admin_views_subscriber_change", args=(s.pk,))
|
||||||
|
)
|
||||||
|
header = self.selenium.find_element(By.CSS_SELECTOR, "div#content h2")
|
||||||
|
self.assertGreater(len(header.text), 100)
|
||||||
|
object_tools = self.selenium.find_elements(
|
||||||
|
By.CSS_SELECTOR, "div#content ul.object-tools li"
|
||||||
|
)
|
||||||
|
self.assertGreater(len(object_tools), 0)
|
||||||
|
self.take_screenshot("change_form")
|
||||||
|
|
||||||
|
self.selenium.get(
|
||||||
|
self.live_server_url + reverse("admin:admin_views_restaurant_changelist")
|
||||||
|
)
|
||||||
|
header = self.selenium.find_element(By.CSS_SELECTOR, "div#content h1")
|
||||||
|
self.assertGreater(len(header.text), 100)
|
||||||
|
object_tools = self.selenium.find_elements(
|
||||||
|
By.CSS_SELECTOR, "div#content ul.object-tools li"
|
||||||
|
)
|
||||||
|
self.assertGreater(len(object_tools), 0)
|
||||||
|
self.take_screenshot("change_list")
|
||||||
|
|
||||||
|
|
||||||
@override_settings(ROOT_URLCONF="admin_views.urls")
|
@override_settings(ROOT_URLCONF="admin_views.urls")
|
||||||
class ReadonlyTest(AdminFieldExtractionMixin, TestCase):
|
class ReadonlyTest(AdminFieldExtractionMixin, TestCase):
|
||||||
|