mirror of
https://gitlab.crans.org/bde/nk20
synced 2024-12-23 16:02:25 +00:00
163 lines
5.0 KiB
JavaScript
163 lines
5.0 KiB
JavaScript
|
/*
|
||
|
This script garantees that this will be called once in django admin.
|
||
|
However, its the callback's responsability to clean up if the
|
||
|
element was cloned with data - which should be the case.
|
||
|
*/
|
||
|
|
||
|
;(function ($) {
|
||
|
$.fn.getFormPrefix = function() {
|
||
|
/* Get the form prefix for a field.
|
||
|
*
|
||
|
* For example:
|
||
|
*
|
||
|
* $(':input[name$=owner]').getFormsetPrefix()
|
||
|
*
|
||
|
* Would return an empty string for an input with name 'owner' but would return
|
||
|
* 'inline_model-0-' for an input named 'inline_model-0-owner'.
|
||
|
*/
|
||
|
var parts = $(this).attr('name').split('-');
|
||
|
var prefix = '';
|
||
|
|
||
|
for (var i in parts) {
|
||
|
var testPrefix = parts.slice(0, -i).join('-');
|
||
|
if (! testPrefix.length) continue;
|
||
|
testPrefix += '-';
|
||
|
|
||
|
var result = $(':input[name^=' + testPrefix + ']')
|
||
|
|
||
|
if (result.length) {
|
||
|
return testPrefix;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return '';
|
||
|
}
|
||
|
|
||
|
$.fn.getFormPrefixes = function() {
|
||
|
/*
|
||
|
* Get the form prefixes for a field, from the most specific to the least.
|
||
|
*
|
||
|
* For example:
|
||
|
*
|
||
|
* $(':input[name$=owner]').getFormPrefixes()
|
||
|
*
|
||
|
* Would return:
|
||
|
* - [''] for an input named 'owner'.
|
||
|
* - ['inline_model-0-', ''] for an input named 'inline_model-0-owner' (i.e. nested with a nested inline).
|
||
|
* - ['sections-0-items-0-', 'sections-0-', ''] for an input named 'sections-0-items-0-product'
|
||
|
* (i.e. nested multiple time with django-nested-admin).
|
||
|
*/
|
||
|
var parts = $(this).attr('name').split('-').slice(0, -1);
|
||
|
var prefixes = [];
|
||
|
|
||
|
for (i = 0; i < parts.length; i += 2) {
|
||
|
var testPrefix = parts.slice(0, -i || parts.length).join('-');
|
||
|
if (!testPrefix.length)
|
||
|
continue;
|
||
|
|
||
|
testPrefix += '-';
|
||
|
|
||
|
var result = $(':input[name^=' + testPrefix + ']')
|
||
|
|
||
|
if (result.length)
|
||
|
prefixes.push(testPrefix);
|
||
|
}
|
||
|
|
||
|
prefixes.push('');
|
||
|
|
||
|
return prefixes;
|
||
|
}
|
||
|
|
||
|
var initialized = [];
|
||
|
|
||
|
function initialize(element) {
|
||
|
if (typeof element === 'undefined' || typeof element === 'number') {
|
||
|
element = this;
|
||
|
}
|
||
|
|
||
|
if (window.__dal__initListenerIsSet !== true || initialized.indexOf(element) >= 0) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$(element).trigger('autocompleteLightInitialize');
|
||
|
initialized.push(element);
|
||
|
}
|
||
|
|
||
|
if (!window.__dal__initialize) {
|
||
|
window.__dal__initialize = initialize;
|
||
|
|
||
|
$(document).ready(function () {
|
||
|
$('[data-autocomplete-light-function=select2]:not([id*="__prefix__"])').each(initialize);
|
||
|
});
|
||
|
|
||
|
$(document).bind('DOMNodeInserted', function (e) {
|
||
|
$(e.target).find('[data-autocomplete-light-function=select2]').each(initialize);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// using jQuery
|
||
|
function getCookie(name) {
|
||
|
var cookieValue = null;
|
||
|
if (document.cookie && document.cookie != '') {
|
||
|
var cookies = document.cookie.split(';');
|
||
|
for (var i = 0; i < cookies.length; i++) {
|
||
|
var cookie = $.trim(cookies[i]);
|
||
|
// Does this cookie string begin with the name we want?
|
||
|
if (cookie.substring(0, name.length + 1) == (name + '=')) {
|
||
|
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return cookieValue;
|
||
|
}
|
||
|
|
||
|
document.csrftoken = getCookie('csrftoken');
|
||
|
if (document.csrftoken === null) {
|
||
|
// Try to get CSRF token from DOM when cookie is missing
|
||
|
var $csrf = $('form :input[name="csrfmiddlewaretoken"]');
|
||
|
if ($csrf.length > 0) {
|
||
|
document.csrftoken = $csrf[0].value;
|
||
|
}
|
||
|
}
|
||
|
})(yl.jQuery);
|
||
|
|
||
|
// Does the same thing as django's admin/js/autocomplete.js, but uses yl.jQuery.
|
||
|
(function($) {
|
||
|
'use strict';
|
||
|
var init = function($element, options) {
|
||
|
var settings = $.extend({
|
||
|
ajax: {
|
||
|
data: function(params) {
|
||
|
return {
|
||
|
term: params.term,
|
||
|
page: params.page
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
}, options);
|
||
|
$element.select2(settings);
|
||
|
};
|
||
|
|
||
|
$.fn.djangoAdminSelect2 = function(options) {
|
||
|
var settings = $.extend({}, options);
|
||
|
$.each(this, function(i, element) {
|
||
|
var $element = $(element);
|
||
|
init($element, settings);
|
||
|
});
|
||
|
return this;
|
||
|
};
|
||
|
|
||
|
$(function() {
|
||
|
// Initialize all autocomplete widgets except the one in the template
|
||
|
// form used when a new formset is added.
|
||
|
$('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2();
|
||
|
});
|
||
|
|
||
|
$(document).on('formset:added', (function() {
|
||
|
return function(event, $newFormset) {
|
||
|
return $newFormset.find('.admin-autocomplete').djangoAdminSelect2();
|
||
|
};
|
||
|
})(this));
|
||
|
}(yl.jQuery));
|