summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaude Paroz <claude@2xlibre.net>2019-05-11 12:30:19 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2019-05-17 07:46:45 +0200
commite286987a27271c8ee7eb6e4d4332b563c4e6094b (patch)
tree329f6d0e597728252a22d72e3db1012c89f0c039
parent59ffafa1d2f466fa7aacbe74fe2787b2004b7871 (diff)
Fixed #30459 -- Delegated hide/show JS toggle to parent div.
Co-authored-by: Carlton Gibson <carlton.gibson@noumenal.es>
-rw-r--r--django/contrib/admin/static/admin/js/collapse.js31
-rw-r--r--django/contrib/admin/static/admin/js/collapse.min.js5
-rw-r--r--docs/releases/2.2.2.txt3
-rw-r--r--tests/admin_inlines/admin.py18
-rw-r--r--tests/admin_inlines/tests.py18
5 files changed, 56 insertions, 19 deletions
diff --git a/django/contrib/admin/static/admin/js/collapse.js b/django/contrib/admin/static/admin/js/collapse.js
index 3123878e10..20e7030e7e 100644
--- a/django/contrib/admin/static/admin/js/collapse.js
+++ b/django/contrib/admin/static/admin/js/collapse.js
@@ -30,23 +30,26 @@
h2.appendChild(document.createTextNode(')'));
}
}
- // Add toggle to anchor tag
- var toggles = document.querySelectorAll('fieldset.collapse a.collapse-toggle');
+ // Add toggle to hide/show anchor tag
var toggleFunc = function(ev) {
- ev.preventDefault();
- var fieldset = closestElem(this, 'fieldset');
- if (fieldset.classList.contains('collapsed')) {
- // Show
- this.textContent = gettext('Hide');
- fieldset.classList.remove('collapsed');
- } else {
- // Hide
- this.textContent = gettext('Show');
- fieldset.classList.add('collapsed');
+ if (ev.target.matches('.collapse-toggle')) {
+ ev.preventDefault();
+ ev.stopPropagation();
+ var fieldset = closestElem(ev.target, 'fieldset');
+ if (fieldset.classList.contains('collapsed')) {
+ // Show
+ ev.target.textContent = gettext('Hide');
+ fieldset.classList.remove('collapsed');
+ } else {
+ // Hide
+ ev.target.textContent = gettext('Show');
+ fieldset.classList.add('collapsed');
+ }
}
};
- for (i = 0; i < toggles.length; i++) {
- toggles[i].addEventListener('click', toggleFunc);
+ var inlineDivs = document.querySelectorAll('fieldset.module');
+ for (i = 0; i < inlineDivs.length; i++) {
+ inlineDivs[i].addEventListener('click', toggleFunc);
}
});
})();
diff --git a/django/contrib/admin/static/admin/js/collapse.min.js b/django/contrib/admin/static/admin/js/collapse.min.js
index 6f59280e5a..9e16a21eb9 100644
--- a/django/contrib/admin/static/admin/js/collapse.min.js
+++ b/django/contrib/admin/static/admin/js/collapse.min.js
@@ -1,2 +1,3 @@
-(function(){var e=function(a,b){return a.nodeName===b.toUpperCase()?a:"BODY"===a.parentNode.nodeName?null:a.parentNode&&e(a.parentNode,b)};window.addEventListener("load",function(){for(var a=document.querySelectorAll("fieldset.collapse"),b=0;b<a.length;b++){var c=a[b];if(0===c.querySelectorAll("div.errors").length){c.classList.add("collapsed");c=c.querySelector("h2");var d=document.createElement("a");d.setAttribute("id","fieldsetcollapser"+b);d.setAttribute("class","collapse-toggle");d.setAttribute("href",
-"#");d.textContent=gettext("Show");c.appendChild(document.createTextNode(" ("));c.appendChild(d);c.appendChild(document.createTextNode(")"))}}a=document.querySelectorAll("fieldset.collapse a.collapse-toggle");c=function(a){a.preventDefault();a=e(this,"fieldset");a.classList.contains("collapsed")?(this.textContent=gettext("Hide"),a.classList.remove("collapsed")):(this.textContent=gettext("Show"),a.classList.add("collapsed"))};for(b=0;b<a.length;b++)a[b].addEventListener("click",c)})})();
+(function(){var e=function(b,a){return b.nodeName===a.toUpperCase()?b:"BODY"===b.parentNode.nodeName?null:b.parentNode&&e(b.parentNode,a)};window.addEventListener("load",function(){for(var b=document.querySelectorAll("fieldset.collapse"),a=0;a<b.length;a++){var c=b[a];if(0===c.querySelectorAll("div.errors").length){c.classList.add("collapsed");c=c.querySelector("h2");var d=document.createElement("a");d.setAttribute("id","fieldsetcollapser"+a);d.setAttribute("class","collapse-toggle");d.setAttribute("href",
+"#");d.textContent=gettext("Show");c.appendChild(document.createTextNode(" ("));c.appendChild(d);c.appendChild(document.createTextNode(")"))}}b=function(a){if(a.target.matches(".collapse-toggle")){a.preventDefault();a.stopPropagation();var b=e(a.target,"fieldset");b.classList.contains("collapsed")?(a.target.textContent=gettext("Hide"),b.classList.remove("collapsed")):(a.target.textContent=gettext("Show"),b.classList.add("collapsed"))}};c=document.querySelectorAll("fieldset.module");for(a=0;a<c.length;a++)c[a].addEventListener("click",
+b)})})();
diff --git a/docs/releases/2.2.2.txt b/docs/releases/2.2.2.txt
index f474039ff9..928624a753 100644
--- a/docs/releases/2.2.2.txt
+++ b/docs/releases/2.2.2.txt
@@ -9,4 +9,5 @@ Django 2.2.2 fixes several bugs in 2.2.1.
Bugfixes
========
-* ...
+* Fixed a regression in Django 2.2 that stopped Show/Hide toggles working on
+ dynamically added admin inlines (:ticket:`30459`).
diff --git a/tests/admin_inlines/admin.py b/tests/admin_inlines/admin.py
index b5f343a55b..dd2624943e 100644
--- a/tests/admin_inlines/admin.py
+++ b/tests/admin_inlines/admin.py
@@ -3,13 +3,14 @@ from django.contrib import admin
from django.db import models
from .models import (
- Author, BinaryTree, CapoFamiglia, Chapter, ChildModel1, ChildModel2,
+ Author, BinaryTree, CapoFamiglia, Chapter, Child, ChildModel1, ChildModel2,
Consigliere, EditablePKBook, ExtraTerrestrial, Fashionista, Holder,
Holder2, Holder3, Holder4, Inner, Inner2, Inner3, Inner4Stacked,
Inner4Tabular, NonAutoPKBook, NonAutoPKBookChild, Novel,
NovelReadonlyChapter, ParentModelWithCustomPk, Poll, Profile,
ProfileCollection, Question, ReadOnlyInline, ShoppingWeakness, Sighting,
- SomeChildModel, SomeParentModel, SottoCapo, Title, TitleCollection,
+ SomeChildModel, SomeParentModel, SottoCapo, Teacher, Title,
+ TitleCollection,
)
site = admin.AdminSite(name="admin")
@@ -235,6 +236,18 @@ class SomeChildModelInline(admin.TabularInline):
readonly_fields = ('readonly_field',)
+class StudentInline(admin.StackedInline):
+ model = Child
+ extra = 1
+ fieldsets = [
+ ('Name', {'fields': ('name',), 'classes': ('collapse',)}),
+ ]
+
+
+class TeacherAdmin(admin.ModelAdmin):
+ inlines = [StudentInline]
+
+
site.register(TitleCollection, inlines=[TitleInline])
# Test bug #12561 and #12778
# only ModelAdmin media
@@ -257,3 +270,4 @@ site.register(BinaryTree, inlines=[BinaryTreeAdmin])
site.register(ExtraTerrestrial, inlines=[SightingInline])
site.register(SomeParentModel, inlines=[SomeChildModelInline])
site.register([Question, Inner4Stacked, Inner4Tabular])
+site.register(Teacher, TeacherAdmin)
diff --git a/tests/admin_inlines/tests.py b/tests/admin_inlines/tests.py
index 736c2eab89..09fcd0f300 100644
--- a/tests/admin_inlines/tests.py
+++ b/tests/admin_inlines/tests.py
@@ -1024,3 +1024,21 @@ class SeleniumTests(AdminSeleniumTestCase):
self.wait_until_visible(field_name)
hide_links[hide_index].click()
self.wait_until_invisible(field_name)
+
+ def test_added_stacked_inline_with_collapsed_fields(self):
+ self.admin_login(username='super', password='secret')
+ self.selenium.get(self.live_server_url + reverse('admin:admin_inlines_teacher_add'))
+ self.selenium.find_element_by_link_text('Add another Child').click()
+ test_fields = ['#id_child_set-0-name', '#id_child_set-1-name']
+ show_links = self.selenium.find_elements_by_link_text('SHOW')
+ self.assertEqual(len(show_links), 2)
+ for show_index, field_name in enumerate(test_fields, 0):
+ self.wait_until_invisible(field_name)
+ show_links[show_index].click()
+ self.wait_until_visible(field_name)
+ hide_links = self.selenium.find_elements_by_link_text('HIDE')
+ self.assertEqual(len(hide_links), 2)
+ for hide_index, field_name in enumerate(test_fields, 0):
+ self.wait_until_visible(field_name)
+ hide_links[hide_index].click()
+ self.wait_until_invisible(field_name)