From 75ab4ae3e4a423c0f85cd87a2237453fd43bfba8 Mon Sep 17 00:00:00 2001 From: Christopher Lenz Date: Wed, 14 Jan 2009 13:41:32 +0000 Subject: Refactor the inline editing Javascript code in Futon to make it reusable. git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@734390 13f79535-47bb-0310-9956-ffa450edef68 --- share/www/script/jquery.editinline.js | 104 ++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 share/www/script/jquery.editinline.js (limited to 'share/www/script/jquery.editinline.js') diff --git a/share/www/script/jquery.editinline.js b/share/www/script/jquery.editinline.js new file mode 100644 index 00000000..bd91e7e1 --- /dev/null +++ b/share/www/script/jquery.editinline.js @@ -0,0 +1,104 @@ +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. + +(function($) { + + $.fn.makeEditable = function(options) { + options = $.extend({ + allowEmpty: true, + acceptLabel: "", + cancelLabel: "", + toolTip: "Double click to edit", + + // callbacks + begin: function() { return true }, + accept: function(newValue, oldValue) {}, + cancel: function(oldValue) {}, + createInput: function(value) { return $("") }, + prepareInput: function(input) {}, + end: function(keyCode) {}, + populate: function(value) { return value }, + validate: function() { return true } + }, options || {}); + + return this.each(function() { + var elem = $(this); + elem.attr("title", options.toolTip).dblclick(function() { + var oldHtml = elem.html(); + var oldText = options.populate($.trim(elem.text())); + + if (!options.begin.apply(elem[0], [oldText])) { + return; + } + + var input = options.createInput.apply(elem[0], [oldText]) + .addClass("editinline").val(oldText) + .dblclick(function() { return false; }) + .keydown(function(evt) { + switch (evt.keyCode) { + case 13: { // return + if (!input.is("textarea")) applyChange(evt.keyCode); + break; + } + case 27: { // escape + cancelChange(evt.keyCode); + break; + } + case 9: { // tab + if (!input.is("textarea")) { + applyChange(evt.keyCode); + return false; + } + } + } + }); + + function applyChange(keyCode) { + var newText = input.val(); + if (newText == oldText) { + cancelChange(keyCode); + return true; + } + if ((!options.allowEmpty && !newText.length) || + !options.validate.apply(elem[0], [newText])) { + input.addClass("invalid"); + return false; + } + input.remove(); + tools.remove(); + options.accept.apply(elem[0], [newText, oldText]); + elem.removeClass("editinline-container") + options.end.apply(elem[0], [keyCode]); + return true; + } + + function cancelChange(keyCode) { + options.cancel.apply(elem[0], [oldText]); + elem.html(oldHtml).removeClass("editinline-container"); + options.end.apply(elem[0], [keyCode]); + } + + var tools = $(""); + $("") + .text(options.acceptLabel).click(applyChange).appendTo(tools); + $("") + .text(options.cancelLabel).click(cancelChange).appendTo(tools) + + elem.html("").append(tools).append(input) + .addClass("editinline-container"); + options.prepareInput.apply(elem[0], [input[0]]); + input.each(function() { this.focus(); this.select(); }); + }); + }); + } + +})(jQuery); -- cgit v1.2.3