diff options
Diffstat (limited to 'share/www/script')
| -rw-r--r-- | share/www/script/futon.browse.js | 37 | ||||
| -rw-r--r-- | share/www/script/futon.format.js | 19 | ||||
| -rw-r--r-- | share/www/script/futon.js | 20 | 
3 files changed, 60 insertions, 16 deletions
diff --git a/share/www/script/futon.browse.js b/share/www/script/futon.browse.js index e962ee9c..d5b860e2 100644 --- a/share/www/script/futon.browse.js +++ b/share/www/script/futon.browse.js @@ -189,7 +189,8 @@                  }                }, 100);              } -            $("#viewcode textarea").bind("input", updateDirtyState); +            $("#viewcode textarea").enableTabInsertion() +              .bind("input", updateDirtyState);              if ($.browser.msie || $.browser.safari) {                $("#viewcode textarea").bind("paste", updateDirtyState)                                       .bind("change", updateDirtyState) @@ -720,7 +721,7 @@            $(this).html($("<pre></pre>").html($.futon.formatJSON(page.doc, {html: true})))              .makeEditable({allowEmpty: false,                createInput: function(value) { -                return $("<textarea rows='8' cols='80' spellcheck='false'></textarea>"); +                return $("<textarea rows='8' cols='80' spellcheck='false'></textarea>").enableTabInsertion();                },                prepareInput: function(input) {                  $(input).makeResizable({vertical: true}); @@ -985,10 +986,10 @@            return;          } -        row.find("td").makeEditable({allowEmpty: true, +        row.find("td").makeEditable({acceptOnBlur: false, allowEmpty: true,            createInput: function(value) {              if ($("dl", this).length > 0 || $("code", this).text().length > 60) { -              return $("<textarea rows='8' cols='40' spellcheck='false'></textarea>"); +              return $("<textarea rows='1' cols='40' spellcheck='false'></textarea>");              }              return $("<input type='text' spellcheck='false'>");            }, @@ -998,12 +999,17 @@            },            prepareInput: function(input) {              if ($(input).is("textarea")) { -              $(input).makeResizable({vertical: true}); +              var height = Math.min(input.scrollHeight, document.body.clientHeight - 100); +              $(input).height(height).makeResizable({vertical: true}).enableTabInsertion();              }            },            accept: function(newValue) {              var fieldName = row.data("name"); -            doc[fieldName] = JSON.parse(newValue); +            try { +              doc[fieldName] = JSON.parse(newValue); +            } catch (err) { +              doc[fieldName] = newValue; +            }              page.isDirty = true;              if (fieldName == "_id") {                page.docId = page.doc._id = doc[fieldName]; @@ -1011,7 +1017,11 @@              }            },            populate: function(value) { -            return $.futon.formatJSON(doc[row.data("name")]); +            value = doc[row.data("name")]; +            if (typeof(value) == "string") { +              return value; +            } +            return $.futon.formatJSON(value);            },            validate: function(value) {              $("div.error", this).remove(); @@ -1024,12 +1034,7 @@                }                return true;              } catch (err) { -              var msg = err.message; -              if (msg == "parseJSON" || msg == "JSON.parse") { -                msg = "Please enter a valid JSON value (for example, \"string\")."; -              } -              $("<div class='error'></div>").text(msg).appendTo(this); -              return false; +              return true;              }            }          }); @@ -1046,7 +1051,11 @@              }              return list;            } else { -            return $($.futon.formatJSON(val, {html: true})); +            var html = $.futon.formatJSON(val, { +              html: true, +              escapeStrings: false +            }); +            return $(html);            }          }          var elem = render(value); diff --git a/share/www/script/futon.format.js b/share/www/script/futon.format.js index 7d70bfc2..674f5f8f 100644 --- a/share/www/script/futon.format.js +++ b/share/www/script/futon.format.js @@ -17,6 +17,7 @@      // JSON pretty printing      formatJSON: function(val, options) {        options = $.extend({ +        escapeStrings: true,          indent: 4,          linesep: "\n",          quoteKeys: true @@ -39,9 +40,14 @@            case "boolean":            case "number":            case "string": -            var retval = JSON.stringify(val); +            var retval = val; +            if (type == "string" && !options.escapeStrings) { +              retval = indentLines(retval, tab); +            } else { +              retval = escape(JSON.stringify(val)); +            }              if (options.html) { -              retval = "<code class='" + type + "'>" + escape(retval) + "</code>"; +              retval = "<code class='" + type + "'>" + retval + "</code>";              }              return retval; @@ -95,6 +101,14 @@          }        } +      function indentLines(text, tab) { +        var lines = text.split("\n"); +        for (var i in lines) { +          lines[i] = (i > 0 ? tab : "") + escape(lines[i]); +        } +        return lines.join("<br>"); +      } +        return format(val, 1);      }, @@ -112,4 +126,5 @@      }    }); +  })(jQuery); diff --git a/share/www/script/futon.js b/share/www/script/futon.js index f6b1d9f6..31f04a90 100644 --- a/share/www/script/futon.js +++ b/share/www/script/futon.js @@ -159,6 +159,26 @@      });    } +  $.fn.enableTabInsertion = function(chars) { +    chars = chars || "\t"; +    var width = chars.length; +    return this.keydown(function(evt) { +      if (evt.keyCode == 9) { +        var v = this.value; +        var start = this.selectionStart; +        var scrollTop = this.scrollTop; +        if (start !== undefined) { +          this.value = v.slice(0, start) + chars + v.slice(start); +          this.selectionStart = this.selectionEnd = start + width; +        } else { +          document.selection.createRange().text = chars; +          this.caretPos += width; +        } +        return false; +      } +    }); +  } +    $(document)      .ajaxStart(function() { $(this.body).addClass("loading"); })      .ajaxStop(function() { $(this.body).removeClass("loading"); });  | 
