summaryrefslogtreecommitdiff
path: root/share/www/script/jquery.editinline.js
diff options
context:
space:
mode:
authorChristopher Lenz <cmlenz@apache.org>2009-01-14 13:41:32 +0000
committerChristopher Lenz <cmlenz@apache.org>2009-01-14 13:41:32 +0000
commit75ab4ae3e4a423c0f85cd87a2237453fd43bfba8 (patch)
tree2bb07fcfb9a9458cd998b38598ae726c3c2d22fc /share/www/script/jquery.editinline.js
parent54986fe78df83e75b369c5a0c3049f36f96f1ba1 (diff)
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
Diffstat (limited to 'share/www/script/jquery.editinline.js')
-rw-r--r--share/www/script/jquery.editinline.js104
1 files changed, 104 insertions, 0 deletions
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 $("<input type='text'>") },
+ 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 = $("<span class='editinline-tools'></span>");
+ $("<button type='button' class='apply'></button>")
+ .text(options.acceptLabel).click(applyChange).appendTo(tools);
+ $("<button type='button' class='cancel'></button>")
+ .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);