Skip to content

Commit ba83378

Browse files
claudeptimgraham
authored andcommitted
Fixed #29523 -- Removed jQuery usage in DateTimeShortcuts.js & collapse.js.
1 parent 9bcbda4 commit ba83378

File tree

5 files changed

+57
-55
lines changed

5 files changed

+57
-55
lines changed

django/contrib/admin/helpers.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,7 @@ def __init__(self, form, name=None, readonly_fields=(), fields=(), classes=(),
8181
def media(self):
8282
if 'collapse' in self.classes:
8383
extra = '' if settings.DEBUG else '.min'
84-
js = [
85-
'vendor/jquery/jquery%s.js' % extra,
86-
'jquery.init.js',
87-
'collapse%s.js' % extra,
88-
]
89-
return forms.Media(js=['admin/js/%s' % url for url in js])
84+
return forms.Media(js=['admin/js/collapse%s.js' % extra])
9085
return forms.Media()
9186

9287
def __iter__(self):

django/contrib/admin/static/admin/js/SelectFilter2.js

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -166,13 +166,7 @@ Requires jQuery, core.js, and SelectBox.js.
166166
// In horizontal mode, give the same height to the two boxes.
167167
var j_from_box = $('#' + field_id + '_from');
168168
var j_to_box = $('#' + field_id + '_to');
169-
var resize_filters = function() { j_to_box.height($(filter_p).outerHeight() + j_from_box.outerHeight()); };
170-
if (j_from_box.outerHeight() > 0) {
171-
resize_filters(); // This fieldset is already open. Resize now.
172-
} else {
173-
// This fieldset is probably collapsed. Wait for its 'show' event.
174-
j_to_box.closest('fieldset').one('show.fieldset', resize_filters);
175-
}
169+
j_to_box.height($(filter_p).outerHeight() + j_from_box.outerHeight());
176170
}
177171

178172
// Initial icon refresh

django/contrib/admin/static/admin/js/admin/DateTimeShortcuts.js

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@
6363
},
6464
// Add a warning when the time zone in the browser and backend do not match.
6565
addTimezoneWarning: function(inp) {
66-
var $ = django.jQuery;
6766
var warningClass = DateTimeShortcuts.timezoneWarningClass;
6867
var timezoneOffset = DateTimeShortcuts.timezoneOffset / 3600;
6968

@@ -73,7 +72,7 @@
7372
}
7473

7574
// Check if warning is already there.
76-
if ($(inp).siblings('.' + warningClass).length) {
75+
if (inp.parentNode.querySelectorAll('.' + warningClass).length) {
7776
return;
7877
}
7978

@@ -95,13 +94,11 @@
9594
}
9695
message = interpolate(message, [timezoneOffset]);
9796

98-
var $warning = $('<span>');
99-
$warning.attr('class', warningClass);
100-
$warning.text(message);
101-
102-
$(inp).parent()
103-
.append($('<br>'))
104-
.append($warning);
97+
var warning = document.createElement('span');
98+
warning.className = warningClass;
99+
warning.textContent = message;
100+
inp.parentNode.appendChild(document.createElement('br'));
101+
inp.parentNode.appendChild(warning);
105102
},
106103
// Add clock widget to a given field
107104
addClock: function(inp) {
@@ -115,7 +112,7 @@
115112
inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling);
116113
var now_link = document.createElement('a');
117114
now_link.setAttribute('href', "#");
118-
now_link.appendChild(document.createTextNode(gettext('Now')));
115+
now_link.textContent = gettext('Now');
119116
now_link.addEventListener('click', function(e) {
120117
e.preventDefault();
121118
DateTimeShortcuts.handleClockQuicklink(num, -1);
@@ -345,7 +342,7 @@
345342
e.preventDefault();
346343
DateTimeShortcuts.dismissCalendar(num);
347344
});
348-
django.jQuery(document).on('keyup', function(event) {
345+
document.addEventListener('keyup', function(event) {
349346
if (event.which === 27) {
350347
// ESC key closes popup
351348
DateTimeShortcuts.dismissCalendar(num);
Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,52 @@
11
/*global gettext*/
2-
(function($) {
2+
(function() {
33
'use strict';
4-
$(document).ready(function() {
4+
var closestElem = function(elem, tagName) {
5+
if (elem.nodeName === tagName.toUpperCase()) {
6+
return elem;
7+
}
8+
if (elem.parentNode.nodeName === 'BODY') {
9+
return null;
10+
}
11+
return elem.parentNode && closestElem(elem.parentNode, tagName);
12+
};
13+
14+
window.addEventListener('load', function() {
515
// Add anchor tag for Show/Hide link
6-
$("fieldset.collapse").each(function(i, elem) {
16+
var fieldsets = document.querySelectorAll('fieldset.collapse');
17+
for (var i = 0; i < fieldsets.length; i++) {
18+
var elem = fieldsets[i];
719
// Don't hide if fields in this fieldset have errors
8-
if ($(elem).find("div.errors").length === 0) {
9-
$(elem).addClass("collapsed").find("h2").first().append(' (<a id="fieldsetcollapser' +
10-
i + '" class="collapse-toggle" href="#">' + gettext("Show") +
11-
'</a>)');
20+
if (elem.querySelectorAll('div.errors').length === 0) {
21+
elem.classList.add('collapsed');
22+
var h2 = elem.querySelector('h2');
23+
var link = document.createElement('a');
24+
link.setAttribute('id', 'fieldsetcollapser' + i);
25+
link.setAttribute('class', 'collapse-toggle');
26+
link.setAttribute('href', '#');
27+
link.textContent = gettext('Show');
28+
h2.appendChild(document.createTextNode(' ('));
29+
h2.appendChild(link);
30+
h2.appendChild(document.createTextNode(')'));
1231
}
13-
});
32+
}
1433
// Add toggle to anchor tag
15-
$("fieldset.collapse a.collapse-toggle").on('click', function(ev) {
16-
if ($(this).closest("fieldset").hasClass("collapsed")) {
34+
var toggles = document.querySelectorAll('fieldset.collapse a.collapse-toggle');
35+
var toggleFunc = function(ev) {
36+
ev.preventDefault();
37+
var fieldset = closestElem(this, 'fieldset');
38+
if (fieldset.classList.contains('collapsed')) {
1739
// Show
18-
$(this).text(gettext("Hide")).closest("fieldset").removeClass("collapsed").trigger("show.fieldset", [$(this).attr("id")]);
40+
this.textContent = gettext('Hide');
41+
fieldset.classList.remove('collapsed');
1942
} else {
2043
// Hide
21-
$(this).text(gettext("Show")).closest("fieldset").addClass("collapsed").trigger("hide.fieldset", [$(this).attr("id")]);
44+
this.textContent = gettext('Show');
45+
fieldset.classList.add('collapsed');
2246
}
23-
return false;
24-
});
47+
};
48+
for (i = 0; i < toggles.length; i++) {
49+
toggles[i].addEventListener('click', toggleFunc);
50+
}
2551
});
26-
})(django.jQuery);
52+
})();

django/contrib/admin/widgets.py

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -51,33 +51,23 @@ def get_context(self, name, value, attrs):
5151

5252

5353
class AdminDateWidget(forms.DateInput):
54-
@property
55-
def media(self):
56-
extra = '' if settings.DEBUG else '.min'
54+
class Media:
5755
js = [
58-
'vendor/jquery/jquery%s.js' % extra,
59-
'jquery.init.js',
60-
'calendar.js',
61-
'admin/DateTimeShortcuts.js',
56+
'admin/js/calendar.js',
57+
'admin/js/admin/DateTimeShortcuts.js',
6258
]
63-
return forms.Media(js=["admin/js/%s" % path for path in js])
6459

6560
def __init__(self, attrs=None, format=None):
6661
attrs = {'class': 'vDateField', 'size': '10', **(attrs or {})}
6762
super().__init__(attrs=attrs, format=format)
6863

6964

7065
class AdminTimeWidget(forms.TimeInput):
71-
@property
72-
def media(self):
73-
extra = '' if settings.DEBUG else '.min'
66+
class Media:
7467
js = [
75-
'vendor/jquery/jquery%s.js' % extra,
76-
'jquery.init.js',
77-
'calendar.js',
78-
'admin/DateTimeShortcuts.js',
68+
'admin/js/calendar.js',
69+
'admin/js/admin/DateTimeShortcuts.js',
7970
]
80-
return forms.Media(js=["admin/js/%s" % path for path in js])
8171

8272
def __init__(self, attrs=None, format=None):
8373
attrs = {'class': 'vTimeField', 'size': '8', **(attrs or {})}

0 commit comments

Comments
 (0)