improve UI for importing json APIs

This commit is contained in:
Max Ogden
2011-07-25 18:21:16 -07:00
parent ce26ed6afb
commit 227ef010a4
3 changed files with 33 additions and 16 deletions

View File

@@ -292,7 +292,7 @@
Paste in an array of JSON objects representing the documents that you would like to insert into the database. Paste in an array of JSON objects representing the documents that you would like to insert into the database.
</p> </p>
<p class="info"> <p class="info">
<code>[{woo: pizza}]</code> <code>[{woo: pizza}, {tasty: muffins}]</code>
</p> </p>
<div class="menu-container data-table-cell-editor"> <div class="menu-container data-table-cell-editor">
<textarea class="data-table-cell-copypaste-editor" bind="textarea">{{value}}</textarea> <textarea class="data-table-cell-copypaste-editor" bind="textarea">{{value}}</textarea>
@@ -389,6 +389,9 @@
</script> </script>
<script type='text/mustache' class="jsonTreeTemplate"> <script type='text/mustache' class="jsonTreeTemplate">
<p class="info">
Please highlight the array of JSON objects to convert to documents.
</p>
<div id="document-container"> <div id="document-container">
<div id="document-editor"></div> <div id="document-editor"></div>
</div> </div>

View File

@@ -208,19 +208,32 @@ var util = function() {
} }
} }
// TODO refactor handlers so that they dont stack up as the tree gets bigger
function handleTreeClick(e) {
var clicked = $(e.target);
if (clicked.children('.array').length > 0) {
var field = clicked;
} else if (clicked.siblings('.array').length > 0) {
var field = clicked.parents('.doc-field:first');
} else {
var field = clicked.parents('.array').parents('.doc-field:first');
}
$('.chosen').removeClass('chosen');
field.addClass('chosen');
return false;
}
var createTreeNode = { var createTreeNode = {
"string": function (obj, key) { "string": function (obj, key) {
var val = $('<div class="doc-value string-type"></div>'); var val = $('<div class="doc-value string-type"></div>');
if (obj[key].length > 45) { if (obj[key].length > 45) {
val.append($('<span class="string-type"></span>') val.append($('<span class="string-type"></span>')
.click(function () { })
.text(obj[key].slice(0, 45))) .text(obj[key].slice(0, 45)))
.append( .append(
$('<span class="expand">...</span>') $('<span class="expand">...</span>')
.click(function () { .click(function () {
val.html('') val.html('')
.append($('<span class="string-type"></span>') .append($('<span class="string-type"></span>')
.click(function () { })
.text(obj[key].length ? obj[key] : " ") .text(obj[key].length ? obj[key] : " ")
) )
}) })
@@ -230,7 +243,6 @@ var util = function() {
var val = $('<div class="doc-value string-type"></div>'); var val = $('<div class="doc-value string-type"></div>');
val.append( val.append(
$('<span class="string-type"></span>') $('<span class="string-type"></span>')
.click(function () { })
.text(obj[key].length ? obj[key] : " ") .text(obj[key].length ? obj[key] : " ")
) )
} }
@@ -238,31 +250,32 @@ var util = function() {
} }
, "number": function (obj, key) { , "number": function (obj, key) {
var val = $('<div class="doc-value number"></div>') var val = $('<div class="doc-value number"></div>')
val.append($('<span class="number-type">' + obj[key] + '</span>').click(function () { })) val.append($('<span class="number-type">' + obj[key] + '</span>'))
return val; return val;
} }
, "null": function (obj, key) { , "null": function (obj, key) {
var val = $('<div class="doc-value null"></div>') var val = $('<div class="doc-value null"></div>')
val.append($('<span class="null-type">' + obj[key] + '</span>').click(function () { })) val.append($('<span class="null-type">' + obj[key] + '</span>'))
return val; return val;
} }
, "boolean": function (obj, key) { , "boolean": function (obj, key) {
var val = $('<div class="doc-value null"></div>') var val = $('<div class="fue null"></div>')
val.append($('<span class="null-type">' + obj[key] + '</span>').click(function () { })) val.append($('<span class="null-type">' + obj[key] + '</span>'))
return val; return val;
} }
, "array": function (obj, key, indent) { , "array": function (obj, key, indent) {
if (!indent) indent = 1; if (!indent) indent = 1;
var val = $('<div class="doc-value array"></div>') var val = $('<div class="doc-value array"></div>')
$('<span class="array-type">[</span><span class="expand" style="float:left">...</span><span class="array-type">]</span>') $('<span class="array-type">[</span><span class="expand" style="float:left">...</span><span class="array-type">]</span>')
.click(function (i, n) { .click(function (e) {
var n = $(this).parent(); var n = $(this).parent();
var cls = 'sub-'+key+'-'+indent var cls = 'sub-'+key+'-'+indent
n.html('') n.html('')
n.append('<span style="padding-left:'+((indent - 1) * 10)+'px" class="array-type">[</span>') n.append('<span style="padding-left:'+((indent - 1) * 10)+'px" class="array-type">[</span>')
for (i in obj[key]) { for (i in obj[key]) {
var field = $('<div class="doc-field"></div>').click(handleTreeClick);
n.append( n.append(
$('<div class="doc-field"></div>') field
.append('<div class="array-key '+cls+'" >'+i+'</div>') .append('<div class="array-key '+cls+'" >'+i+'</div>')
.append(createTreeNode[getType(obj[key][i])](obj[key], i, indent + 1)) .append(createTreeNode[getType(obj[key][i])](obj[key], i, indent + 1))
) )
@@ -277,13 +290,13 @@ var util = function() {
if (!indent) indent = 1; if (!indent) indent = 1;
var val = $('<div class="doc-value object"></div>') var val = $('<div class="doc-value object"></div>')
$('<span class="object-type">{</span><span class="expand" style="float:left">...</span><span class="object-type">}</span>') $('<span class="object-type">{</span><span class="expand" style="float:left">...</span><span class="object-type">}</span>')
.click(function (i, n) { .click(function (e) {
var n = $(this).parent(); var n = $(this).parent();
n.html('') n.html('')
n.append('<span style="padding-left:'+((indent - 1) * 10)+'px" class="object-type">{</span>') n.append('<span style="padding-left:'+((indent - 1) * 10)+'px" class="object-type">{</span>')
for (i in obj[key]) { for (i in obj[key]) {
var field = $('<div class="doc-field"></div>') var field = $('<div class="doc-field"></div>').click(handleTreeClick);
var p = $('<div class="id-space" style="margin-left:'+(indent * 10)+'px"/>') var p = $('<div class="id-space" style="margin-left:'+(indent * 10)+'px"/>');
var di = $('<div class="object-key">'+i+'</div>') var di = $('<div class="object-key">'+i+'</div>')
field.append(p) field.append(p)
.append(di) .append(di)
@@ -302,7 +315,7 @@ var util = function() {
function renderTree(doc) { function renderTree(doc) {
var d = $('div#document-editor'); var d = $('div#document-editor');
for (i in doc) { for (i in doc) {
var field = $('<div class="doc-field"></div>'); var field = $('<div class="doc-field"></div>').click(handleTreeClick);
$('<div class="id-space" />').appendTo(field); $('<div class="id-space" />').appendTo(field);
field.append('<div class="doc-key doc-key-base">'+i+'</div>') field.append('<div class="doc-key doc-key-base">'+i+'</div>')
field.append(createTreeNode[getType(doc[i])](doc, i)); field.append(createTreeNode[getType(doc[i])](doc, i));

View File

@@ -40,6 +40,7 @@ a.button span.icon.loading { background-image: url(images/loader.gif); }
.loading { background-image: url(images/loader.gif); background-repeat: no-repeat; padding-left: 15px; background-position: 0px 3px;} .loading { background-image: url(images/loader.gif); background-repeat: no-repeat; padding-left: 15px; background-position: 0px 3px;}
a.button:hover span.icon.loading { background-image: url(images/loader-blue.gif); } a.button:hover span.icon.loading { background-image: url(images/loader-blue.gif); }
#couchLogo {float: left; margin-right: 5px; margin-top: 3px} #couchLogo {float: left; margin-right: 5px; margin-top: 3px}
.chosen {border: 1px solid green}
.info { padding: 0px 0px 10px 0px} .info { padding: 0px 0px 10px 0px}
.menu-overlay { .menu-overlay {
position: fixed; position: fixed;
@@ -93,8 +94,8 @@ div#document-editor div.id-space {
border: none; float: left; margin: 3px 3px 0 3px; padding: 0; border: none; float: left; margin: 3px 3px 0 3px; padding: 0;
width: 15px; height: 15px; width: 15px; height: 15px;
} }
div#document-editor div.doc-field {width:100%; padding-bottom:2px;} div#document-editor div.doc-field {width:99%; padding-bottom:2px;}
div#document-editor div.doc-field, div.doc-value, div.doc-key {float:left;} div#document-editor div.doc-field, div.doc-value, div.doc-key {float:left; cursor:pointer; cursor: hand;}
div#document-editor div.doc-key {padding-right:5px;font-weight:bold;} div#document-editor div.doc-key {padding-right:5px;font-weight:bold;}
div#document-editor div.string-type { white-space: pre-wrap; color:#393;} div#document-editor div.string-type { white-space: pre-wrap; color:#393;}