254 lines
6.2 KiB
JavaScript
254 lines
6.2 KiB
JavaScript
|
if (!window['django_select2']) {
|
||
|
// This JS file can be included multiple times. So, as not to overwrite previous states, we run this only once.
|
||
|
|
||
|
window.django_select2 = {
|
||
|
MULTISEPARATOR: String.fromCharCode(31), // We use this unprintable char as separator,
|
||
|
// since this can't be entered by user.
|
||
|
get_url_params: function (term, page, context) {
|
||
|
var field_id = jQuery(this).data('field_id'),
|
||
|
res = {
|
||
|
'term': term,
|
||
|
'page': page,
|
||
|
'context': context
|
||
|
};
|
||
|
if (field_id) {
|
||
|
res['field_id'] = field_id;
|
||
|
}
|
||
|
return res;
|
||
|
},
|
||
|
process_results: function (data, page, context) {
|
||
|
var results;
|
||
|
if (data.err && data.err.toLowerCase() === 'nil') {
|
||
|
results = {
|
||
|
'results': data.results
|
||
|
};
|
||
|
if (context) {
|
||
|
results['context'] = context;
|
||
|
}
|
||
|
if (data.more === true || data.more === false) {
|
||
|
results['more'] = data.more;
|
||
|
}
|
||
|
} else {
|
||
|
results = {'results':[]};
|
||
|
}
|
||
|
if (results.results) {
|
||
|
jQuery(this).data('results', results.results);
|
||
|
} else {
|
||
|
jQuery(this).removeData('results');
|
||
|
}
|
||
|
return results;
|
||
|
},
|
||
|
onValChange: function () {
|
||
|
django_select2.updateText(jQuery(this));
|
||
|
},
|
||
|
prepareValText: function (vals, txts, isMultiple) {
|
||
|
var data = []
|
||
|
jQuery(vals).each(function (index) {
|
||
|
data.push({id: this, text: txts[index]});
|
||
|
});
|
||
|
if (isMultiple) {
|
||
|
return data;
|
||
|
} else {
|
||
|
if (data.length > 0) {
|
||
|
return data[0];
|
||
|
} else {
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
updateText: function ($e) {
|
||
|
var val = $e.select2('val'), data = $e.select2('data'), txt = $e.txt(), isMultiple = !!$e.attr('multiple'),
|
||
|
diff;
|
||
|
|
||
|
if (val || val === 0) { // Means value is set. A numerical 0 is also a valid value.
|
||
|
if (isMultiple) {
|
||
|
if (val.length !== txt.length) {
|
||
|
txt = [];
|
||
|
jQuery(val).each(function (idx) {
|
||
|
var i, value = this, id;
|
||
|
|
||
|
for (i in data) {
|
||
|
id = data [i].id;
|
||
|
if (id instanceof String) {
|
||
|
id = id.valueOf();
|
||
|
}
|
||
|
if (id == value) {
|
||
|
txt.push(data[i].text);
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
} else {
|
||
|
txt = data.text;
|
||
|
}
|
||
|
$e.txt(txt);
|
||
|
} else {
|
||
|
$e.txt('');
|
||
|
}
|
||
|
},
|
||
|
getValText: function ($e) {
|
||
|
var val = $e.select2('val'), res = $e.data('results'), txt = $e.txt(), isMultiple = !!$e.attr('multiple'),
|
||
|
f, id = $e.attr('id');
|
||
|
if (val || val === 0) { // Means value is set. A numerical 0 is also a valid value.
|
||
|
|
||
|
if (!isMultiple) {
|
||
|
val = [val];
|
||
|
if (txt || txt === 0) {
|
||
|
txt = [txt];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (txt === 0 || (txt && val.length === txt.length)) {
|
||
|
return [val, txt];
|
||
|
}
|
||
|
|
||
|
f = $e.data('userGetValText');
|
||
|
if (f) {
|
||
|
txt = f($e, val, isMultiple);
|
||
|
if (txt || txt === 0) {
|
||
|
return [val, txt];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (res) {
|
||
|
txt = [];
|
||
|
jQuery(val).each(function (idx) {
|
||
|
var i, value = this;
|
||
|
|
||
|
for (i in res) {
|
||
|
if (res[i].id == value) {
|
||
|
val[idx] = res[i].id; // To set it to correct data type.
|
||
|
txt.push(res[i].text);
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
if (txt || txt === 0) {
|
||
|
return [val, txt];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return null;
|
||
|
},
|
||
|
onInit: function (e, callback) {
|
||
|
e = jQuery(e);
|
||
|
var id = e.attr('id'), data = null, val = e.select2('val');
|
||
|
|
||
|
if (!val && val !== 0) {
|
||
|
val = e.data('initVal');
|
||
|
}
|
||
|
|
||
|
if (val || val === 0) {
|
||
|
// Value is set so need to get the text.
|
||
|
data = django_select2.getValText(e);
|
||
|
if (data && data[0]) {
|
||
|
data = django_select2.prepareValText(data[0], data[1], !!e.attr('multiple'));
|
||
|
}
|
||
|
}
|
||
|
if (!data) {
|
||
|
e.val(null); // Nulling out set value so as not to confuse users.
|
||
|
}
|
||
|
callback(data); // Change for 2.3.x
|
||
|
django_select2.updateText(e);
|
||
|
},
|
||
|
createSearchChoice: function(term, data) {
|
||
|
if (!data || jQuery(data).filter(function () {
|
||
|
return this.text.localeCompare(term) === 0;
|
||
|
}).length === 0) {
|
||
|
return {
|
||
|
id: term,
|
||
|
text: term
|
||
|
};
|
||
|
}
|
||
|
},
|
||
|
onMultipleHiddenChange: function () {
|
||
|
var $e = jQuery(this), valContainer = $e.data('valContainer'), name = $e.data('name'), vals = $e.val();
|
||
|
valContainer.empty();
|
||
|
if (vals) {
|
||
|
vals = vals.split(django_select2.MULTISEPARATOR);
|
||
|
jQuery(vals).each(function () {
|
||
|
var inp = jQuery('<input type="hidden">').appendTo(valContainer);
|
||
|
inp.attr('name', name);
|
||
|
inp.val(this);
|
||
|
});
|
||
|
}
|
||
|
},
|
||
|
initMultipleHidden: function ($e) {
|
||
|
var valContainer;
|
||
|
|
||
|
$e.data('name', $e.attr('name'));
|
||
|
$e.attr('name', '');
|
||
|
|
||
|
valContainer = jQuery('<div>').insertAfter($e).css({'display': 'none'});
|
||
|
$e.data('valContainer', valContainer);
|
||
|
|
||
|
$e.change(django_select2.onMultipleHiddenChange);
|
||
|
if ($e.val()) {
|
||
|
$e.change();
|
||
|
}
|
||
|
},
|
||
|
convertArrToStr: function (arr) {
|
||
|
return arr.join(django_select2.MULTISEPARATOR);
|
||
|
},
|
||
|
runInContextHelper: function (f, id) {
|
||
|
return function () {
|
||
|
var args = Array.prototype.slice.call(arguments, 0);
|
||
|
return f.apply(jQuery('#' + id).get(0), args);
|
||
|
}
|
||
|
},
|
||
|
logErr: function () {
|
||
|
if (console && console.error) {
|
||
|
args = Array.prototype.slice.call(arguments);
|
||
|
console.error.apply(console, args);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
(function (isDebug) { // Only used for debugging.
|
||
|
if (isDebug) {
|
||
|
for (var i in django_select2) {
|
||
|
var f = django_select2[i];
|
||
|
if (typeof(f) == "function") {
|
||
|
django_select2[i] = (function (i, f) {
|
||
|
return function () {
|
||
|
console.log('Function ' + i + ' called for object: ', this);
|
||
|
return f.apply(this, arguments);
|
||
|
};
|
||
|
}(i, f));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}(false));
|
||
|
|
||
|
(function( $ ){
|
||
|
// This sets or gets the text lables for an element. It merely takes care returing array or single
|
||
|
// value, based on if element is multiple type.
|
||
|
$.fn.txt = function(val) {
|
||
|
if (typeof(val) !== 'undefined') {
|
||
|
if (val) {
|
||
|
if (val instanceof Array) {
|
||
|
if (this.attr('multiple')) {
|
||
|
val = django_select2.convertArrToStr(val);
|
||
|
} else {
|
||
|
val = val[0]
|
||
|
}
|
||
|
}
|
||
|
this.attr('txt', val);
|
||
|
} else {
|
||
|
this.removeAttr('txt');
|
||
|
}
|
||
|
return this;
|
||
|
} else {
|
||
|
val = this.attr('txt');
|
||
|
if (this.attr('multiple')) {
|
||
|
if (val) {
|
||
|
val = val.split(django_select2.MULTISEPARATOR);
|
||
|
} else {
|
||
|
val = [];
|
||
|
}
|
||
|
}
|
||
|
return val;
|
||
|
}
|
||
|
};
|
||
|
})( jQuery );
|
||
|
}
|