diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 82459d2..ecac797 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,11 @@ X-editable changelog ============================= +Version 1.4.6 wip +---------------------------- +[bug #276] support id() and text() functions of select2 (vitalets) + + Version 1.4.5 Jun 23, 2013 ---------------------------- [enh #245] highlight element after update (vitalets) diff --git a/src/editable-form/editable-form-utils.js b/src/editable-form/editable-form-utils.js index 2c9457d..69ef2c7 100644 --- a/src/editable-form/editable-form-utils.js +++ b/src/editable-form/editable-form-utils.js @@ -139,7 +139,10 @@ return []; } - valueProp = valueProp || 'value'; + if (typeof(valueProp) !== "function") { + var idKey = valueProp || 'value'; + valueProp = function (e) { return e[idKey]; }; + } var isValArray = $.isArray(value), result = [], @@ -151,11 +154,11 @@ } else { /*jslint eqeq: true*/ if(isValArray) { - if($.grep(value, function(v){ return v == (o && typeof o === 'object' ? o[valueProp] : o); }).length) { + if($.grep(value, function(v){ return v == (o && typeof o === 'object' ? valueProp(o) : o); }).length) { result.push(o); } } else { - if(value == (o && typeof o === 'object' ? o[valueProp] : o)) { + if(value == (o && typeof o === 'object' ? valueProp(o) : o)) { result.push(o); } } diff --git a/src/inputs/select2/select2.js b/src/inputs/select2/select2.js index 8865c63..3ddaa2b 100644 --- a/src/inputs/select2/select2.js +++ b/src/inputs/select2/select2.js @@ -83,7 +83,7 @@ $(function(){ //detect whether it is multi-valued this.isMultiple = this.options.select2.tags || this.options.select2.multiple; - this.isRemote = ('ajax' in this.options.select2); + this.isRemote = ('ajax' in this.options.select2); }; $.fn.editableutils.inherit(Constructor, $.fn.editabletypes.abstractinput); @@ -108,16 +108,21 @@ $(function(){ this.$input.on('change', function() { $(this).closest('form').parent().triggerHandler('resize'); }); - } + } + + //store function that extracs ID from element + this.idFunc = this.$input.data('select2').opts.id; + this.formatSelection = this.$input.data('select2').opts.formatSelection; }, value2html: function(value, element) { - var text = '', data; + var text = '', data, + that = this; if(this.options.select2.tags) { //in tags mode just assign value data = value; } else if(this.sourceData) { - data = $.fn.editableutils.itemsByValue(value, this.sourceData, 'id'); + data = $.fn.editableutils.itemsByValue(value, this.sourceData, this.idFunc); } else { //can not get list of possible values (e.g. autotext for select2 with ajax source) } @@ -127,10 +132,10 @@ $(function(){ //collect selected data and show with separator text = []; $.each(data, function(k, v){ - text.push(v && typeof v === 'object' ? v.text : v); + text.push(v && typeof v === 'object' ? that.formatSelection(v) : v); }); } else if(data) { - text = data.text; + text = that.formatSelection(data); } text = $.isArray(text) ? text.join(this.options.viewseparator) : text; @@ -149,7 +154,7 @@ $(function(){ var item, items; //if sourceData loaded, use it to get text for display if(this.sourceData) { - items = $.fn.editableutils.itemsByValue(value, this.sourceData, 'id'); + items = $.fn.editableutils.itemsByValue(value, this.sourceData, this.idFunc); if(items.length) { item = items[0]; }