diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 42c3e8e..1832990 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -4,6 +4,7 @@ X-editable changelog Version 1.3.1 wip ---------------------------- +[enh] 'display' method: added param 'response' allowing to show text directly from server (vitalets) [enh] new util method `$.fn.editableutils.itemsByValue` to easily get selected items for sourced-inputs (vitalets) [enh] convert newlines to <br> in error message for more pretty display (vitalets) [enh #57] remove css height for textarea (vitalets) diff --git a/src/element/editable-element.js b/src/element/editable-element.js index 6276a99..762c25b 100644 --- a/src/element/editable-element.js +++ b/src/element/editable-element.js @@ -112,18 +112,20 @@ Makes editable any HTML element on the page. Applied as jQuery method. Can call custom display method from options. Can return deferred object. @method render() + @param {mixed} response server response (if exist) to pass into display function */ - render: function() { + render: function(response) { //do not display anything if(this.options.display === false) { return; } + //if it is input with source, we pass callback in third param to be called when source is loaded if(this.input.options.hasOwnProperty('source')) { - return this.input.value2html(this.value, this.$element[0], this.options.display); + return this.input.value2html(this.value, this.$element[0], this.options.display, response); //if display method defined --> use it } else if(typeof this.options.display === 'function') { - return this.options.display.call(this.$element[0], this.value); + return this.options.display.call(this.$element[0], this.value, response); //else use input's original value2html() method } else { return this.input.value2html(this.value, this.$element[0]); @@ -298,8 +300,7 @@ Makes editable any HTML element on the page. Applied as jQuery method. this.$element.removeClass('editable-unsaved'); } - // this.hide(); - this.setValue(params.newValue); + this.setValue(params.newValue, false, params.response); /** Fired when new value was submitted. You can use <code>$(this).data('editable')</code> to access to editable instance @@ -329,7 +330,7 @@ Makes editable any HTML element on the page. Applied as jQuery method. @param {mixed} value new value @param {boolean} convertStr whether to convert value from string to internal format **/ - setValue: function(value, convertStr) { + setValue: function(value, convertStr, response) { if(convertStr) { this.value = this.input.str2value(value); } else { @@ -338,7 +339,7 @@ Makes editable any HTML element on the page. Applied as jQuery method. if(this.container) { this.container.option('value', this.value); } - $.when(this.render()) + $.when(this.render(response)) .then($.proxy(function() { this.handleEmpty(); }, this)); @@ -547,11 +548,21 @@ Makes editable any HTML element on the page. Applied as jQuery method. value: null, /** Callback to perform custom displaying of value in element's text. - If `null`, default input's value2html() will be called. + If `null`, default input's display used. If `false`, no displaying methods will be called, element's text will never change. Runs under element's scope. - Second parameter __sourceData__ is passed for inputs with source (select, checklist). To get currently selected items - use `$.fn.editableutils.itemsByValue(value, sourceData)` function. + _Parameters:_ + + * `value` current value to be displayed + * `response` server response (if display called after ajax submit), since 1.3.1 + + For **inputs with source** (select, checklist) parameters are different: + + * `value` current value to be displayed + * `sourceData` array of items for current input (e.g. dropdown items) + * `response` server response (if display called after ajax submit), since 1.3.1 + + To get currently selected items use `$.fn.editableutils.itemsByValue(value, sourceData)`. @property display @type function|boolean @@ -565,9 +576,9 @@ Makes editable any HTML element on the page. Applied as jQuery method. if(checked.length) { $.each(checked, function(i, v) { html.push($.fn.editableutils.escape(v.text)); }); - $(element).html(html.join(', ')); + $(this).html(html.join(', ')); } else { - $(element).empty(); + $(this).empty(); } } **/ diff --git a/src/inputs/list.js b/src/inputs/list.js index 34d704d..4e28ae6 100644 --- a/src/inputs/list.js +++ b/src/inputs/list.js @@ -34,12 +34,12 @@ List - abstract class for inputs that have source option loaded from js array or return null; //can't set value by text }, - value2html: function (value, element, display) { + value2html: function (value, element, display, response) { var deferred = $.Deferred(), success = function () { if(typeof display === 'function') { //custom display method - display.call(element, value, this.sourceData); + display.call(element, value, this.sourceData, response); } else { this.value2htmlFinal(value, element); } diff --git a/test/unit/select.js b/test/unit/select.js index c011aff..ba6e4c8 100644 --- a/test/unit/select.js +++ b/test/unit/select.js @@ -546,12 +546,19 @@ $(function () { }); asyncTest("'display' callback", function () { - var e = $('<a href="#" data-type="select" data-value="2" data-url="post.php"></a>').appendTo(fx).editable({ + var req = 0, + e = $('<a href="#" data-type="select" data-value="2" data-url="post.php"></a>').appendTo(fx).editable({ pk: 1, source: groups, - display: function(value, sourceData) { + display: function(value, sourceData, response) { var els = $.grep(sourceData, function(o) {return o.value == value;}); $(this).text('qq' + els[0].text); + if(req == 0) { + ok(response === undefined, 'response param undefined on first request'); + req++; + } else { + ok(response.success, 'response param ok on second request'); + } } }), selected = 3; diff --git a/test/unit/text.js b/test/unit/text.js index 801ef04..d151912 100644 --- a/test/unit/text.js +++ b/test/unit/text.js @@ -395,8 +395,9 @@ $(function () { asyncTest("'display' callback", function () { var newText = 'cd<e>;"', e = $('<a href="#" data-pk="1" data-url="post.php" data-name="text1">abc</a>').appendTo(fx).editable({ - display: function(value) { + display: function(value, response) { ok(this === e[0], 'scope is ok'); + ok(response.success, 'response param ok'); $(this).text('qq'+value); } });