|
<script type="text/javascript" src="{% url 'admin:jsi18n' %}"></script> |
|
<script type="text/javascript" nonce="{{ spec.request.csp_nonce }}"> |
|
django.jQuery('document').ready(function () { |
|
django.jQuery('.admindatefilter #{{ choices.0.system_name }}-form input[type="submit"]').click(function(event) { |
|
event.preventDefault(); |
|
var form = django.jQuery(this).closest('div.admindatefilter').find('form'); |
|
var query_string = django.jQuery('input#{{ choices.0.system_name }}-query-string').val(); |
|
var form_data = form.serialize(); |
|
var amp = query_string === "?" ? "" : "&"; // avoid leading ?& combination |
|
window.location = window.location.pathname + query_string + amp + form_data; |
|
}); |
|
|
|
django.jQuery('.admindatefilter #{{ choices.0.system_name }}-form input[type="reset"]').click(function() { |
|
var form = django.jQuery(this).closest('div.admindatefilter').find('form'); |
|
var query_string = form.find('input#{{ choices.0.system_name }}-query-string').val(); |
|
window.location = window.location.pathname + query_string; |
|
}); |
|
}); |
|
{% comment %} |
|
// Code below makes sure that the DateTimeShortcuts.js is loaded exactly once |
|
// regardless the presence of AdminDateWidget |
|
// How it worked: |
|
// - First Django loads the model formset with predefined widgets for different |
|
// field types. If there's a date based field, then it loads the AdminDateWidget |
|
// and it's required media to context under {{media.js}} in admin/change_list.html. |
|
// (Note: it accumulates media in django.forms.widgets.Media object, |
|
// which prevents duplicates, but the DateRangeFilter is not included yet |
|
// since it's not model field related. |
|
// List of predefined widgets is in django.contrib.admin.options.FORMFIELD_FOR_DBFIELD_DEFAULTS) |
|
// - After that Django starts rendering forms, which have the {{form.media}} |
|
// tag. Only then the DjangoRangeFilter.get_media is called and rendered, |
|
// which creates the duplicates. |
|
// How it works: |
|
// - first step is the same, if there's a AdminDateWidget to be loaded then |
|
// nothing changes |
|
// - DOM gets rendered and if the AdminDateWidget was rendered then |
|
// the DateTimeShortcuts.js is initiated which sets the window.DateTimeShortcuts. |
|
// Otherwise, the window.DateTimeShortcuts is undefined. |
|
// - The lines below check if the DateTimeShortcuts has been set and if not |
|
// then the DateTimeShortcuts.js and calendar.js is rendered |
|
// |
|
// https://github.com/silentsokolov/django-admin-rangefilter/issues/9 |
|
// |
|
// Django 2.1 |
|
// https://github.com/silentsokolov/django-admin-rangefilter/issues/21 |
|
{% endcomment %} |
|
function embedScript(url) { |
|
return new Promise(function pr(resolve, reject) { |
|
var newScript = document.createElement("script"); |
|
newScript.type = "text/javascript"; |
|
newScript.src = url; |
|
newScript.onload = resolve; |
|
if ("{{ spec.request.csp_nonce }}" !== "") { |
|
newScript.setAttribute("nonce", "{{ spec.request.csp_nonce }}"); |
|
} |
|
document.head.appendChild(newScript); |
|
}); |
|
} |
|
|
|
django.jQuery('document').ready(function () { |
|
if (!('DateTimeShortcuts' in window)) { |
|
var promiseList = []; |
|
|
|
{% for m in spec.form.js %} |
|
promiseList.push(embedScript("{{ m }}")); |
|
{% endfor %} |
|
|
|
Promise.all(promiseList).then(function() { |
|
django.jQuery('.datetimeshortcuts').remove(); |
|
if ('DateTimeShortcuts' in window) { |
|
window.DateTimeShortcuts.init(); |
|
} |
|
}); |
|
} |
|
}); |
|
</script> |