Fixed #24405 -- Made admin related object JavaScript overridable
Consolidated it in one file and move the DOM related stuff to the template so it is easily overridable. To override the popup behavior you need to add handlers for the custom events triggered in the admin_change_form_document_ready template block.
This commit is contained in:
parent
80e3444eca
commit
0decef337f
|
@ -27,14 +27,16 @@ function windowname_to_id(text) {
|
||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
|
|
||||||
function showAdminPopup(triggeringLink, name_regexp) {
|
function showAdminPopup(triggeringLink, name_regexp, add_popup) {
|
||||||
var name = triggeringLink.id.replace(name_regexp, '');
|
var name = triggeringLink.id.replace(name_regexp, '');
|
||||||
name = id_to_windowname(name);
|
name = id_to_windowname(name);
|
||||||
var href = triggeringLink.href;
|
var href = triggeringLink.href;
|
||||||
if (href.indexOf('?') == -1) {
|
if (add_popup) {
|
||||||
href += '?_popup=1';
|
if (href.indexOf('?') == -1) {
|
||||||
} else {
|
href += '?_popup=1';
|
||||||
href += '&_popup=1';
|
} else {
|
||||||
|
href += '&_popup=1';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes');
|
var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes');
|
||||||
win.focus();
|
win.focus();
|
||||||
|
@ -42,7 +44,7 @@ function showAdminPopup(triggeringLink, name_regexp) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function showRelatedObjectLookupPopup(triggeringLink) {
|
function showRelatedObjectLookupPopup(triggeringLink) {
|
||||||
return showAdminPopup(triggeringLink, /^lookup_/);
|
return showAdminPopup(triggeringLink, /^lookup_/, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
function dismissRelatedLookupPopup(win, chosenId) {
|
function dismissRelatedLookupPopup(win, chosenId) {
|
||||||
|
@ -57,12 +59,22 @@ function dismissRelatedLookupPopup(win, chosenId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function showRelatedObjectPopup(triggeringLink) {
|
function showRelatedObjectPopup(triggeringLink) {
|
||||||
var name = triggeringLink.id.replace(/^(change|add|delete)_/, '');
|
return showAdminPopup(triggeringLink, /^(change|add|delete)_/, false);
|
||||||
name = id_to_windowname(name);
|
}
|
||||||
var href = triggeringLink.href;
|
|
||||||
var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes');
|
function updateRelatedObjectLinks(triggeringLink) {
|
||||||
win.focus();
|
var $this = django.jQuery(triggeringLink);
|
||||||
return false;
|
var siblings = $this.nextAll('.change-related, .delete-related');
|
||||||
|
if (!siblings.length) return;
|
||||||
|
var value = $this.val();
|
||||||
|
if (value) {
|
||||||
|
siblings.each(function() {
|
||||||
|
var elm = django.jQuery(this);
|
||||||
|
elm.attr('href', elm.attr('data-href-template').replace('__fk__', value));
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
siblings.removeAttr('href');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function dismissAddRelatedObjectPopup(win, newId, newRepr) {
|
function dismissAddRelatedObjectPopup(win, newId, newRepr) {
|
||||||
|
@ -72,13 +84,10 @@ function dismissAddRelatedObjectPopup(win, newId, newRepr) {
|
||||||
newRepr = html_unescape(newRepr);
|
newRepr = html_unescape(newRepr);
|
||||||
var name = windowname_to_id(win.name);
|
var name = windowname_to_id(win.name);
|
||||||
var elem = document.getElementById(name);
|
var elem = document.getElementById(name);
|
||||||
var o;
|
|
||||||
if (elem) {
|
if (elem) {
|
||||||
var elemName = elem.nodeName.toUpperCase();
|
var elemName = elem.nodeName.toUpperCase();
|
||||||
if (elemName == 'SELECT') {
|
if (elemName == 'SELECT') {
|
||||||
o = new Option(newRepr, newId);
|
elem.options[elem.options.length] = new Option(newRepr, newId, true, true);
|
||||||
elem.options[elem.options.length] = o;
|
|
||||||
o.selected = true;
|
|
||||||
} else if (elemName == 'INPUT') {
|
} else if (elemName == 'INPUT') {
|
||||||
if (elem.className.indexOf('vManyToManyRawIdAdminField') != -1 && elem.value) {
|
if (elem.className.indexOf('vManyToManyRawIdAdminField') != -1 && elem.value) {
|
||||||
elem.value += ',' + newId;
|
elem.value += ',' + newId;
|
||||||
|
@ -90,7 +99,7 @@ function dismissAddRelatedObjectPopup(win, newId, newRepr) {
|
||||||
django.jQuery(elem).trigger('change');
|
django.jQuery(elem).trigger('change');
|
||||||
} else {
|
} else {
|
||||||
var toId = name + "_to";
|
var toId = name + "_to";
|
||||||
o = new Option(newRepr, newId);
|
var o = new Option(newRepr, newId);
|
||||||
SelectBox.add_to_cache(toId, o);
|
SelectBox.add_to_cache(toId, o);
|
||||||
SelectBox.redisplay(toId);
|
SelectBox.redisplay(toId);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
django.jQuery(function($){
|
|
||||||
function updateLinks() {
|
|
||||||
var $this = $(this);
|
|
||||||
var siblings = $this.nextAll('.change-related, .delete-related');
|
|
||||||
if (!siblings.length) return;
|
|
||||||
var value = $this.val();
|
|
||||||
if (value) {
|
|
||||||
siblings.each(function(){
|
|
||||||
var elm = $(this);
|
|
||||||
elm.attr('href', elm.attr('data-href-template').replace('__fk__', value));
|
|
||||||
});
|
|
||||||
} else siblings.removeAttr('href');
|
|
||||||
}
|
|
||||||
var container = $(document);
|
|
||||||
container.on('change', '.related-widget-wrapper select', updateLinks);
|
|
||||||
container.find('.related-widget-wrapper select').each(updateLinks);
|
|
||||||
container.on('click', '.related-widget-wrapper-link', function(event){
|
|
||||||
if (this.href) {
|
|
||||||
showRelatedObjectPopup(this);
|
|
||||||
}
|
|
||||||
event.preventDefault();
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -73,12 +73,39 @@
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
$('.add-another').click(function(e) {
|
$('.add-another').click(function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
showAddAnotherPopup(this);
|
var event = $.Event('django:add-another-related');
|
||||||
|
$(this).trigger(event);
|
||||||
|
if (!event.isDefaultPrevented()) {
|
||||||
|
showAddAnotherPopup(this);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
$('.related-lookup').click(function(e) {
|
$('.related-lookup').click(function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
showRelatedObjectLookupPopup(this);
|
var event = $.Event('django:lookup-related');
|
||||||
|
$(this).trigger(event);
|
||||||
|
if (!event.isDefaultPrevented()) {
|
||||||
|
showRelatedObjectLookupPopup(this);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
$('body').on('click', '.related-widget-wrapper-link', function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
if (this.href) {
|
||||||
|
var event = $.Event('django:show-related', {href: this.href});
|
||||||
|
$(this).trigger(event);
|
||||||
|
if (!event.isDefaultPrevented()) {
|
||||||
|
showRelatedObjectPopup(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$('body').on('change', '.related-widget-wrapper select', function(e) {
|
||||||
|
var event = $.Event('django:update-related');
|
||||||
|
$(this).trigger(event);
|
||||||
|
if (!event.isDefaultPrevented()) {
|
||||||
|
updateRelatedObjectLinks(this);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$('.related-widget-wrapper select').trigger('change');
|
||||||
|
|
||||||
{% if adminform and add %}
|
{% if adminform and add %}
|
||||||
$('form#{{ opts.model_name }}_form :input:visible:enabled:first').focus()
|
$('form#{{ opts.model_name }}_form :input:visible:enabled:first').focus()
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
@ -10,7 +10,7 @@ from django.contrib.admin.templatetags.admin_static import static
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
from django.db.models.deletion import CASCADE
|
from django.db.models.deletion import CASCADE
|
||||||
from django.forms.utils import flatatt
|
from django.forms.utils import flatatt
|
||||||
from django.forms.widgets import Media, RadioFieldRenderer
|
from django.forms.widgets import RadioFieldRenderer
|
||||||
from django.template.loader import render_to_string
|
from django.template.loader import render_to_string
|
||||||
from django.utils import six
|
from django.utils import six
|
||||||
from django.utils.encoding import force_text
|
from django.utils.encoding import force_text
|
||||||
|
@ -272,8 +272,7 @@ class RelatedFieldWidgetWrapper(forms.Widget):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def media(self):
|
def media(self):
|
||||||
media = Media(js=['admin/js/related-widget-wrapper.js'])
|
return self.widget.media
|
||||||
return self.widget.media + media
|
|
||||||
|
|
||||||
def get_related_url(self, info, action, *args):
|
def get_related_url(self, info, action, *args):
|
||||||
return reverse("admin:%s_%s_%s" % (info + (action,)),
|
return reverse("admin:%s_%s_%s" % (info + (action,)),
|
||||||
|
|
Loading…
Reference in New Issue