From b958565e19700220ae3fea78d4b4250c01814daf Mon Sep 17 00:00:00 2001 From: Colin Young Date: Wed, 16 Jan 2013 16:00:32 -0600 Subject: [PATCH 1/6] Ensure method option actually works. --- js/jquery.jeditable.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/js/jquery.jeditable.js b/js/jquery.jeditable.js index bee2845..32612d5 100644 --- a/js/jquery.jeditable.js +++ b/js/jquery.jeditable.js @@ -81,6 +81,7 @@ jQuery.fn.editable = function(target, options, callback) { height : 'auto', event : 'click', onblur : 'cancel', + method : 'POST', loadtype : 'GET', loadtext : 'Loading...', loaddata : {}, @@ -277,10 +278,15 @@ jQuery.fn.editable = function(target, options, callback) { /* show the saving indicator */ jQuery(self).html(settings.indicator); - jQuery.post(settings.target, submitdata, function(str) { - self.innerHTML = str; - self.editing = false; - callback.apply(self, [self.innerHTML, settings]); + jQuery.ajax({ + type : settings.method, + url : settings.target, + data : submitdata, + success: function(string) { + self.innerHTML = str; + self.editing = false; + callback.apply(self, [self.innerHTML, settings]); + } }); } From d429ff0b10227373aad2080eb32ad1c9f6dcc72d Mon Sep 17 00:00:00 2001 From: Colin Young Date: Sun, 20 Jan 2013 16:54:36 -0600 Subject: [PATCH 2/6] Fix an error in editing. --- js/jquery.jeditable.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/jquery.jeditable.js b/js/jquery.jeditable.js index 32612d5..098706d 100644 --- a/js/jquery.jeditable.js +++ b/js/jquery.jeditable.js @@ -283,7 +283,7 @@ jQuery.fn.editable = function(target, options, callback) { url : settings.target, data : submitdata, success: function(string) { - self.innerHTML = str; + self.innerHTML = string; self.editing = false; callback.apply(self, [self.innerHTML, settings]); } From 528dd8f5710aa945cc863e97fe6e3f23e562a6d5 Mon Sep 17 00:00:00 2001 From: Colin Young Date: Mon, 21 Jan 2013 14:31:22 -0600 Subject: [PATCH 3/6] Revert to existing text if the loadurl is not found. --- js/jquery.jeditable.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/js/jquery.jeditable.js b/js/jquery.jeditable.js index 098706d..c414b3b 100644 --- a/js/jquery.jeditable.js +++ b/js/jquery.jeditable.js @@ -187,9 +187,14 @@ jQuery.fn.editable = function(target, options, callback) { url : settings.loadurl, data : loaddata, success: function(string) { - window.clearTimeout(t); - content.apply(f, [string, settings, self]); + content.apply(f, [string, settings, self]); + }, + complete: function() { + window.clearTimeout(t); i.disabled = false; + }, + error: function() { + $(f).find(settings.type).val(self.revert); } }); } else if (settings.data) { From 37e06665955508db347bc8cd6b6e4cc3dc550a58 Mon Sep 17 00:00:00 2001 From: Colin Young Date: Mon, 21 Jan 2013 21:36:43 -0600 Subject: [PATCH 4/6] Add error classes if things don't write. --- js/jquery.jeditable.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/js/jquery.jeditable.js b/js/jquery.jeditable.js index c414b3b..b4b3606 100644 --- a/js/jquery.jeditable.js +++ b/js/jquery.jeditable.js @@ -194,7 +194,7 @@ jQuery.fn.editable = function(target, options, callback) { i.disabled = false; }, error: function() { - $(f).find(settings.type).val(self.revert); + $(f).find('input,textarea').val(self.revert); } }); } else if (settings.data) { @@ -287,10 +287,16 @@ jQuery.fn.editable = function(target, options, callback) { type : settings.method, url : settings.target, data : submitdata, + beforeSend: function() { + $(self).removeClass('error') + }, success: function(string) { self.innerHTML = string; self.editing = false; callback.apply(self, [self.innerHTML, settings]); + }, + error: function(xhr, text, error) { + $(self).addClass('error') } }); } @@ -299,6 +305,7 @@ jQuery.fn.editable = function(target, options, callback) { }); function reset() { + $(self).removeClass('error'); self.innerHTML = self.revert; self.editing = false; } @@ -348,6 +355,7 @@ jQuery.editable = { if (settings.height != 'none') { input.height(settings.height); } /* https://bugzilla.mozilla.org/show_bug.cgi?id=236791 */ //input[0].setAttribute('autocomplete','off'); + input.attr('type', settings.type); input.attr('autocomplete','off'); jQuery(this).append(input); return(input); From bb114522904b461e8b5da291b0d84359a20774b2 Mon Sep 17 00:00:00 2001 From: Colin Young Date: Wed, 20 Feb 2013 10:54:50 -0600 Subject: [PATCH 5/6] Ensure that editable gets set. --- js/jquery.jeditable.js | 615 +++++++++++++++++++++-------------------- 1 file changed, 308 insertions(+), 307 deletions(-) diff --git a/js/jquery.jeditable.js b/js/jquery.jeditable.js index b4b3606..6a44968 100644 --- a/js/jquery.jeditable.js +++ b/js/jquery.jeditable.js @@ -64,364 +64,365 @@ * @param String options[select] true or false, when true text is highlighted * */ +jQuery(function() { + jQuery.fn.editable = function(target, options, callback) { -jQuery.fn.editable = function(target, options, callback) { - - /* prevent elem has no properties error */ - if (this.length === 0) { - return(this); - } + /* prevent elem has no properties error */ + if (this.length === 0) { + return(this); + } - var settings = { - target : target, - name : 'value', - id : 'id', - type : 'text', - width : 'auto', - height : 'auto', - event : 'click', - onblur : 'cancel', - method : 'POST', - loadtype : 'GET', - loadtext : 'Loading...', - loaddata : {}, - submitdata : {} - }; + var settings = { + target : target, + name : 'value', + id : 'id', + type : 'text', + width : 'auto', + height : 'auto', + event : 'click', + onblur : 'cancel', + method : 'POST', + loadtype : 'GET', + loadtext : 'Loading...', + loaddata : {}, + submitdata : {} + }; - if(options) { - jQuery.extend(settings, options); - } + if(options) { + jQuery.extend(settings, options); + } - /* setup some functions */ - var plugin = jQuery.editable.types[settings.type].plugin || function() { }; - var submit = jQuery.editable.types[settings.type].submit || function() { }; - var buttons = jQuery.editable.types[settings.type].buttons - || jQuery.editable.types['defaults'].buttons; - var content = jQuery.editable.types[settings.type].content - || jQuery.editable.types['defaults'].content; - var element = jQuery.editable.types[settings.type].element - || jQuery.editable.types['defaults'].element; + /* setup some functions */ + var plugin = jQuery.editable.types[settings.type].plugin || function() { }; + var submit = jQuery.editable.types[settings.type].submit || function() { }; + var buttons = jQuery.editable.types[settings.type].buttons + || jQuery.editable.types['defaults'].buttons; + var content = jQuery.editable.types[settings.type].content + || jQuery.editable.types['defaults'].content; + var element = jQuery.editable.types[settings.type].element + || jQuery.editable.types['defaults'].element; - callback = callback || function() { }; + callback = callback || function() { }; - jQuery(this).attr('title', settings.tooltip); + jQuery(this).attr('title', settings.tooltip); - /* temporary fix for auto width and height */ - settings.autowidth = 'auto' == settings.width; - settings.autoheight = 'auto' == settings.height; + /* temporary fix for auto width and height */ + settings.autowidth = 'auto' == settings.width; + settings.autoheight = 'auto' == settings.height; - jQuery(this)[settings.event](function(e) { + jQuery(this)[settings.event](function(e) { - /* save this to self because this changes when scope changes */ - var self = this; + /* save this to self because this changes when scope changes */ + var self = this; - /* prevent throwing an exeption if edit field is clicked again */ - if (self.editing) { - return; - } + /* prevent throwing an exeption if edit field is clicked again */ + if (self.editing) { + return; + } - /* figure out how wide and tall we are */ - if (settings.width != 'none') { - settings.width = - settings.autowidth ? jQuery(self).width() : settings.width; - } - if (settings.height != 'none') { - settings.height = - settings.autoheight ? jQuery(self).height() : settings.height; - } + /* figure out how wide and tall we are */ + if (settings.width != 'none') { + settings.width = + settings.autowidth ? jQuery(self).width() : settings.width; + } + if (settings.height != 'none') { + settings.height = + settings.autoheight ? jQuery(self).height() : settings.height; + } - self.editing = true; - self.revert = jQuery(self).html(); - self.innerHTML = ''; + self.editing = true; + self.revert = jQuery(self).html(); + self.innerHTML = ''; - /* create the form object */ - var f = document.createElement('form'); + /* create the form object */ + var f = document.createElement('form'); - /* apply css or style or both */ - if (settings.cssclass) { - if ('inherit' == settings.cssclass) { - jQuery(f).attr('class', jQuery(self).attr('class')); - } else { - jQuery(f).attr('class', settings.cssclass); + /* apply css or style or both */ + if (settings.cssclass) { + if ('inherit' == settings.cssclass) { + jQuery(f).attr('class', jQuery(self).attr('class')); + } else { + jQuery(f).attr('class', settings.cssclass); + } } - } - if (settings.style) { - if ('inherit' == settings.style) { - jQuery(f).attr('style', jQuery(self).attr('style')); - /* IE needs the second line or display wont be inherited */ - jQuery(f).css('display', jQuery(self).css('display')); - } else { - jQuery(f).attr('style', settings.style); + if (settings.style) { + if ('inherit' == settings.style) { + jQuery(f).attr('style', jQuery(self).attr('style')); + /* IE needs the second line or display wont be inherited */ + jQuery(f).css('display', jQuery(self).css('display')); + } else { + jQuery(f).attr('style', settings.style); + } } - } - /* Add main input element to form and store it in i. */ - var i = element.apply(f, [settings, self]); + /* Add main input element to form and store it in i. */ + var i = element.apply(f, [settings, self]); - /* maintain bc with 1.1.1 and earlier versions */ - if (settings.getload) { - settings.loadurl = settings.getload; - settings.loadtype = 'GET'; - } else if (settings.postload) { - settings.loadurl = settings.postload; - settings.loadtype = 'POST'; - } + /* maintain bc with 1.1.1 and earlier versions */ + if (settings.getload) { + settings.loadurl = settings.getload; + settings.loadtype = 'GET'; + } else if (settings.postload) { + settings.loadurl = settings.postload; + settings.loadtype = 'POST'; + } - /* set input content via POST, GET, given data or existing value */ - if (settings.loadurl) { - var t = setTimeout(function() { - i.disabled = true; - content.apply(f, [settings.loadtext, settings, self]); - }, 100); + /* set input content via POST, GET, given data or existing value */ + if (settings.loadurl) { + var t = setTimeout(function() { + i.disabled = true; + content.apply(f, [settings.loadtext, settings, self]); + }, 100); - var loaddata = {}; - loaddata[settings.id] = self.id; - if (jQuery.isFunction(settings.loaddata)) { - jQuery.extend(loaddata, settings.loaddata.apply(self, [self.revert, settings])); - } else { - jQuery.extend(loaddata, settings.loaddata); - } - jQuery.ajax({ - type : settings.loadtype, - url : settings.loadurl, - data : loaddata, - success: function(string) { - content.apply(f, [string, settings, self]); - }, - complete: function() { - window.clearTimeout(t); - i.disabled = false; - }, - error: function() { - $(f).find('input,textarea').val(self.revert); - } - }); - } else if (settings.data) { - var str = settings.data; - if (jQuery.isFunction(settings.data)) { - var str = settings.data.apply(self, [self.revert, settings]); + var loaddata = {}; + loaddata[settings.id] = self.id; + if (jQuery.isFunction(settings.loaddata)) { + jQuery.extend(loaddata, settings.loaddata.apply(self, [self.revert, settings])); + } else { + jQuery.extend(loaddata, settings.loaddata); + } + jQuery.ajax({ + type : settings.loadtype, + url : settings.loadurl, + data : loaddata, + success: function(string) { + content.apply(f, [string, settings, self]); + }, + complete: function() { + window.clearTimeout(t); + i.disabled = false; + }, + error: function() { + $(f).find('input,textarea').val(self.revert); + } + }); + } else if (settings.data) { + var str = settings.data; + if (jQuery.isFunction(settings.data)) { + var str = settings.data.apply(self, [self.revert, settings]); + } + content.apply(f, [str, settings, self]); + } else { + content.apply(f, [self.revert, settings, self]); } - content.apply(f, [str, settings, self]); - } else { - content.apply(f, [self.revert, settings, self]); - } - i.name = settings.name; + i.name = settings.name; - /* add buttons to the form */ - buttons.apply(f, [settings, self]); + /* add buttons to the form */ + buttons.apply(f, [settings, self]); - /* add created form to self */ - self.appendChild(f); + /* add created form to self */ + self.appendChild(f); - /* highlight input contents when requested */ - if (settings.select) { - i.select(); - } + /* highlight input contents when requested */ + if (settings.select) { + i.select(); + } - /* attach 3rd party plugin if requested */ - plugin.apply(f, [settings, self]); + /* attach 3rd party plugin if requested */ + plugin.apply(f, [settings, self]); - /* focus to first visible form element */ - jQuery(":input:visible:enabled:first", f).focus(); + /* focus to first visible form element */ + jQuery(":input:visible:enabled:first", f).focus(); - /* discard changes if pressing esc */ - jQuery(i).keydown(function(e) { - if (e.keyCode == 27) { - e.preventDefault(); - reset(); - } - }); - - /* discard, submit or nothing with changes when clicking outside */ - /* do nothing is usable when navigating with tab */ - var t; - if ('cancel' == settings.onblur) { - jQuery(i).blur(function(e) { - t = setTimeout(reset, 500); - }); - } else if ('submit' == settings.onblur) { - jQuery(i).blur(function(e) { - jQuery(f).submit(); - }); - } else { - jQuery(i).blur(function(e) { - /* TODO: maybe something here */ + /* discard changes if pressing esc */ + jQuery(i).keydown(function(e) { + if (e.keyCode == 27) { + e.preventDefault(); + reset(); + } }); - } - jQuery(f).submit(function(e) { - - if (t) { - clearTimeout(t); + /* discard, submit or nothing with changes when clicking outside */ + /* do nothing is usable when navigating with tab */ + var t; + if ('cancel' == settings.onblur) { + jQuery(i).blur(function(e) { + t = setTimeout(reset, 500); + }); + } else if ('submit' == settings.onblur) { + jQuery(i).blur(function(e) { + jQuery(f).submit(); + }); + } else { + jQuery(i).blur(function(e) { + /* TODO: maybe something here */ + }); } - /* do no submit */ - e.preventDefault(); + jQuery(f).submit(function(e) { + + if (t) { + clearTimeout(t); + } + + /* do no submit */ + e.preventDefault(); - /* if this input type has a call before submit hook, call it */ - submit.apply(f, [settings, self]); + /* if this input type has a call before submit hook, call it */ + submit.apply(f, [settings, self]); - /* check if given target is function */ - if (jQuery.isFunction(settings.target)) { - var str = settings.target.apply(self, [jQuery(i).val(), settings]); - self.innerHTML = str; - self.editing = false; - callback.apply(self, [self.innerHTML, settings]); - } else { - /* add edited content and id of edited element to POST */ - var submitdata = {}; - submitdata[i.name] = jQuery(i).val(); - submitdata[settings.id] = self.id; - /* add extra data to be POST:ed */ - if (jQuery.isFunction(settings.submitdata)) { - jQuery.extend(submitdata, settings.submitdata.apply(self, [self.revert, settings])); + /* check if given target is function */ + if (jQuery.isFunction(settings.target)) { + var str = settings.target.apply(self, [jQuery(i).val(), settings]); + self.innerHTML = str; + self.editing = false; + callback.apply(self, [self.innerHTML, settings]); } else { - jQuery.extend(submitdata, settings.submitdata); - } + /* add edited content and id of edited element to POST */ + var submitdata = {}; + submitdata[i.name] = jQuery(i).val(); + submitdata[settings.id] = self.id; + /* add extra data to be POST:ed */ + if (jQuery.isFunction(settings.submitdata)) { + jQuery.extend(submitdata, settings.submitdata.apply(self, [self.revert, settings])); + } else { + jQuery.extend(submitdata, settings.submitdata); + } - /* show the saving indicator */ - jQuery(self).html(settings.indicator); - jQuery.ajax({ - type : settings.method, - url : settings.target, - data : submitdata, - beforeSend: function() { - $(self).removeClass('error') - }, - success: function(string) { - self.innerHTML = string; - self.editing = false; - callback.apply(self, [self.innerHTML, settings]); - }, - error: function(xhr, text, error) { - $(self).addClass('error') - } - }); - } + /* show the saving indicator */ + jQuery(self).html(settings.indicator); + jQuery.ajax({ + type : settings.method, + url : settings.target, + data : submitdata, + beforeSend: function() { + $(self).removeClass('error') + }, + success: function(string) { + self.innerHTML = string; + self.editing = false; + callback.apply(self, [self.innerHTML, settings]); + }, + error: function(xhr, text, error) { + $(self).addClass('error') + } + }); + } - return false; - }); + return false; + }); - function reset() { - $(self).removeClass('error'); - self.innerHTML = self.revert; - self.editing = false; - } + function reset() { + $(self).removeClass('error'); + self.innerHTML = self.revert; + self.editing = false; + } - }); + }); - return(this); -}; + return(this); + }; -/** - * - */ + /** + * + */ -jQuery.editable = { - types: { - defaults: { - element : function(settings, original) { - var input = jQuery(''); - jQuery(this).append(input); - return(input); - }, - content : function(string, settings, original) { - jQuery(':input:first', this).val(string); - }, - buttons : function(settings, original) { - if (settings.submit) { - var submit = jQuery(''); - submit.val(settings.submit); - jQuery(this).append(submit); - } - if (settings.cancel) { - var cancel = jQuery(''); - cancel.val(settings.cancel); - jQuery(this).append(cancel); + jQuery.editable = { + types: { + defaults: { + element : function(settings, original) { + var input = jQuery(''); + jQuery(this).append(input); + return(input); + }, + content : function(string, settings, original) { + jQuery(':input:first', this).val(string); + }, + buttons : function(settings, original) { + if (settings.submit) { + var submit = jQuery(''); + submit.val(settings.submit); + jQuery(this).append(submit); + } + if (settings.cancel) { + var cancel = jQuery(''); + cancel.val(settings.cancel); + jQuery(this).append(cancel); - jQuery(cancel).click(function() { - jQuery(original).html(original.revert); - original.editing = false; - }); + jQuery(cancel).click(function() { + jQuery(original).html(original.revert); + original.editing = false; + }); + } } - } - }, - text: { - element : function(settings, original) { - var input = jQuery(''); - if (settings.width != 'none') { input.width(settings.width); } - if (settings.height != 'none') { input.height(settings.height); } - /* https://bugzilla.mozilla.org/show_bug.cgi?id=236791 */ - //input[0].setAttribute('autocomplete','off'); - input.attr('type', settings.type); - input.attr('autocomplete','off'); - jQuery(this).append(input); - return(input); - } - }, - textarea: { - element : function(settings, original) { - var textarea = jQuery('