| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- (function ($) {
- "use strict";
- window.chainedm2m = function () {
- return {
- fireEvent: function (element, event) {
- var evt, rtn;
- if (document.createEventObject) {
- // dispatch for IE
- evt = document.createEventObject();
- rtn = element.fireEvent('on' + event, evt);
- } else {
- // dispatch for firefox + others
- evt = document.createEvent("HTMLEvents");
- evt.initEvent(event, true, true); // event type,bubbling,cancelable
- rtn = !element.dispatchEvent(evt);
- }
- return rtn;
- },
- dismissRelatedLookupPopup: function(win, chosenId) {
- var name = windowname_to_id(win.name),
- elem = document.getElementById(name);
- if (elem.className.indexOf('vManyToManyRawIdAdminField') !== -1 && elem.value) {
- elem.value += ',' + chosenId;
- } else {
- elem.value = chosenId;
- }
- fireEvent(elem, 'change');
- win.close();
- },
- fill_field: function (val, initial_value, elem_id, url, initial_parent, auto_choose) {
- var $selectField = $(elem_id),
- $selectedto = $(elem_id + '_to'),
- cache_to = elem_id.replace('#', '') + '_to',
- cache_from = elem_id.replace('#', '') + '_from';
- if (!$selectField.length) {
- $selectField = $(elem_id + '_from');
- }
- function trigger_chosen_updated() {
- if ($.fn.chosen !== undefined) {
- $selectField.trigger('chosen:updated');
- }
- }
- // SelectBox is a global var from djangojs "admin/js/SelectBox.js"
- // Clear cache to avoid the elements duplication
- if (typeof SelectBox !== 'undefined') {
- if (typeof SelectBox.cache[cache_to] !== 'undefined') {
- SelectBox.cache[cache_to].splice(0);
- }
- if (typeof SelectBox.cache[cache_from] !== 'undefined') {
- SelectBox.cache[cache_from].splice(0);
- }
- }
- if (!val || val === '') {
- $selectField.html('');
- $selectedto.html('');
- trigger_chosen_updated();
- return;
- }
- // Make sure that these are always an arrays
- val = [].concat(val);
- initial_parent = [].concat(initial_parent);
- var target_url = url + "/" + val + "/",
- options = [],
- selectedoptions = [];
- $.getJSON(target_url, function (j) {
- var i, width;
- auto_choose = j.length === 1 && auto_choose;
- var selected_values = {};
- // if val and initial_parent have any common values, we need to set selected options.
- if ($(val).filter(initial_parent).length >= 0 && initial_value) {
- for (i = 0; i < initial_value.length; i = i + 1) {
- selected_values[initial_value[i]] = true;
- }
- }
- // select values which were previously selected (for many2many - many2many chain)
- $(elem_id + ' option:selected').each(function () {
- selected_values[$(this).val()] = true;
- });
- $.each(j, function (index, optionData) {
- var option = $('<option></option>')
- .attr('value', optionData.value)
- .text(optionData.display)
- .attr('title', optionData.display);
- if (auto_choose === "true" || auto_choose === "True") {
- auto_choose = true;
- } else if (auto_choose === "false" || auto_choose === "False") {
- auto_choose = false;
- }
- if (auto_choose || selected_values[optionData.value] === true) {
- if ($selectedto.length) {
- selectedoptions.push(option);
- } else {
- option.prop('selected', true);
- options.push(option);
- }
- } else {
- options.push(option);
- }
- });
- $selectField.html(options);
- if ($selectedto.length) {
- $selectedto.html(selectedoptions);
- var node;
- // SelectBox is a global var from djangojs "admin/js/SelectBox.js"
- for (i = 0, j = selectedoptions.length; i < j; i = i + 1) {
- node = selectedoptions[i];
- SelectBox.cache[cache_to].push({value: node.prop("value"), text: node.prop("text"), displayed: 1});
- }
- for (i = 0, j = options.length; i < j; i = i + 1) {
- node = options[i];
- SelectBox.cache[cache_from].push({value: node.prop("value"), text: node.prop("text"), displayed: 1});
- }
- }
- width = $selectField.outerWidth();
- if (navigator.appVersion.indexOf("MSIE") !== -1) {
- $selectField.width(width + 'px');
- }
- $selectField.trigger('change');
- trigger_chosen_updated();
- });
- },
- init: function (chainfield, url, id, value, auto_choose) {
- var fill_field, val, initial_parent = $(chainfield).val(),
- initial_value = value;
- if (!$(chainfield).hasClass("chained")) {
- val = $(chainfield).val();
- this.fill_field(val, initial_value, id, url, initial_parent, auto_choose);
- }
- fill_field = this.fill_field;
- $(chainfield).change(function () {
- var prefix, start_value, this_val, localID = id;
- if (localID.indexOf("__prefix__") > -1) {
- prefix = $(this).attr("id").match(/\d+/)[0];
- localID = localID.replace("__prefix__", prefix);
- }
- start_value = $(localID).val();
- this_val = $(this).val();
- fill_field(this_val, initial_value, localID, url, initial_parent, auto_choose);
- });
- // allait en bas, hors du documentready
- if (typeof(dismissAddAnotherPopup) !== 'undefined') {
- var oldDismissAddAnotherPopup = dismissAddAnotherPopup;
- dismissAddAnotherPopup = function (win, newId, newRepr) {
- oldDismissAddAnotherPopup(win, newId, newRepr);
- if ("#" + windowname_to_id(win.name) === chainfield) {
- $(chainfield).change();
- }
- };
- }
- if (typeof(dismissRelatedLookupPopup) !== 'undefined') {
- var oldDismissRelatedLookupPopup = dismissRelatedLookupPopup;
- dismissRelatedLookupPopup = function (win, chosenId) {
- oldDismissRelatedLookupPopup(win, chosenId);
- if ("#" + windowname_to_id(win.name) === chainfield) {
- $(chainfield).change();
- }
- };
- }
- }
- };
- }();
- }(jQuery || django.jQuery));
|