mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-11-04 01:12:08 +01: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));
 |