Text facet's choice count limit is now configurable through preference page. Preference page needs polishing.

git-svn-id: http://google-refine.googlecode.com/svn/trunk@1127 7d457c2a-affb-35e4-300a-418c747d4874
This commit is contained in:
David Huynh 2010-08-02 01:49:10 +00:00
parent 965ef20790
commit 762a9f13eb
9 changed files with 263 additions and 7 deletions

View File

@ -116,6 +116,7 @@ public class GridworksServlet extends Butterfly {
{"mqlwrite", "com.metaweb.gridworks.commands.freebase.MQLWriteCommand"},
{"get-preference", "com.metaweb.gridworks.commands.GetPreferenceCommand"},
{"get-all-preferences", "com.metaweb.gridworks.commands.GetAllPreferencesCommand"},
{"set-preference", "com.metaweb.gridworks.commands.SetPreferenceCommand"},
};

View File

@ -9,6 +9,7 @@ import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONWriter;
import com.metaweb.gridworks.ProjectManager;
import com.metaweb.gridworks.browsing.DecoratedValue;
import com.metaweb.gridworks.browsing.FilteredRecords;
import com.metaweb.gridworks.browsing.FilteredRows;
@ -71,7 +72,7 @@ public class ListFacet implements Facet {
if (_errorMessage != null) {
writer.key("error"); writer.value(_errorMessage);
} else if (_choices.size() > 2000) {
} else if (_choices.size() > getLimit()) {
writer.key("error"); writer.value("Too many choices");
} else {
writer.key("choices"); writer.array();
@ -98,6 +99,23 @@ public class ListFacet implements Facet {
writer.endObject();
}
protected int getLimit() {
Object v = ProjectManager.singleton.getPreferenceStore().get("ui.browsing.listFacet.limit");
if (v != null) {
if (v instanceof Number) {
return ((Number) v).intValue();
} else {
try {
int n = Integer.parseInt(v.toString());
return n;
} catch (NumberFormatException e) {
// ignore
}
}
}
return 2000;
}
@Override
public void initializeFromJSON(Project project, JSONObject o) throws Exception {

View File

@ -0,0 +1,48 @@
package com.metaweb.gridworks.commands;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.JSONException;
import org.json.JSONWriter;
import com.metaweb.gridworks.ProjectManager;
import com.metaweb.gridworks.model.Project;
import com.metaweb.gridworks.preference.PreferenceStore;
public class GetAllPreferencesCommand extends Command {
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Project project = request.getParameter("project") != null ? getProject(request) : null;
PreferenceStore ps = project != null ?
project.getMetadata().getPreferenceStore() :
ProjectManager.singleton.getPreferenceStore();
try {
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type", "application/json");
JSONWriter writer = new JSONWriter(response.getWriter());
writer.object();
for (String key : ps.getKeys()) {
Object pref = ps.get(key);
if (pref == null || pref instanceof String || pref instanceof Number || pref instanceof Boolean) {
writer.key(key);
writer.value(pref);
}
}
writer.endObject();
} catch (JSONException e) {
respondException(response, e);
}
}
}

View File

@ -27,8 +27,7 @@ public class SetPreferenceCommand extends Command {
String valueString = request.getParameter("value");
try {
JSONTokener t = new JSONTokener(valueString);
Object o = t.nextValue();
Object o = valueString == null ? null : new JSONTokener(valueString).nextValue();
ps.put(prefName, PreferenceStore.loadObject(o));

View File

@ -5,6 +5,7 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.json.JSONException;
import org.json.JSONObject;
@ -16,13 +17,21 @@ public class PreferenceStore implements Jsonizable {
protected Map<String, Object> _prefs = new HashMap<String, Object>();
public void put(String key, Object value) {
_prefs.put(key, value);
if (value == null) {
_prefs.remove(key);
} else {
_prefs.put(key, value);
}
}
public Object get(String key) {
return _prefs.get(key);
}
public Set<String> getKeys() {
return _prefs.keySet();
}
@Override
public void write(JSONWriter writer, Properties options) throws JSONException {
writer.object();
@ -58,13 +67,12 @@ public class PreferenceStore implements Jsonizable {
}
}
@SuppressWarnings("unchecked")
static public Object loadObject(Object o) {
if (o instanceof JSONObject) {
try {
JSONObject obj2 = (JSONObject) o;
String className = obj2.getString("class");
Class klass = Class.forName(className);
Class<?> klass = Class.forName(className);
Method method = klass.getMethod("load", JSONObject.class);
return method.invoke(null, obj2);

View File

@ -6,7 +6,8 @@ var bundle = true;
var templatedFiles = {
// Requests with last path segments mentioned here
// will get served from .vt files with the same names
"project" : true
"project" : true,
"preferences" : true
};
/*
@ -113,6 +114,32 @@ function init() {
"styles/protograph/schema-alignment-dialog.css"
]
);
ClientSideResourceManager.addPaths(
"preferences/scripts",
module,
[
"externals/jquery-1.4.2.min.js",
"externals/jquery.cookie.js",
"externals/suggest/suggest-1.2.min.js",
"externals/jquery-ui/jquery-ui-1.8.custom.min.js",
"externals/imgareaselect/jquery.imgareaselect.js",
"externals/date.js",
"scripts/preferences.js"
]
);
ClientSideResourceManager.addPaths(
"preferences/styles",
module,
[
"externals/suggest/css/suggest-1.2.min.css",
"externals/jquery-ui/css/ui-lightness/jquery-ui-1.8.custom.css",
"styles/common.css",
"styles/jquery-ui-overrides.css",
"styles/preferences.css"
]
);
}
/*

View File

@ -0,0 +1,24 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Freebase Gridworks - Preferences</title>
<script type="text/javascript" src="wirings.js"></script>
$scriptInjection
<link rel="icon" type="image/png" href="images/favicon.png" />
$styleInjection
</head>
<body>
<div id="header">
<a id="logo" href="http://www.freebase.com/" title="Freebase"><img alt="Freebase" src="images/freebase-headerlogo.png" /></a>
<div id="path"><span class="app-path-section"><a href="./index.html">Gridworks</a></span><span class="app-path-section">Preferences</span></div>
</div>
<div id="body">
<div id="loading-message"><img src="images/large-spinner.gif" /> starting up ...</div>
</div>
</body>
</html>

View File

@ -0,0 +1,109 @@
var preferenceUIs = [];
function onLoad() {
$.post(
"/command/get-all-preferences",
null,
populatePreferences,
"json"
);
}
$(onLoad);
function populatePreferences(prefs) {
var body = $("#body").empty();
$('<h1>').text("Preferences").appendTo(body);
var table = $('<table>').addClass("preferences").html('<tr><th>Key</th><th>Value</th><td></td></tr>').appendTo(body)[0];
for (var k in prefs) {
var tr = table.insertRow(table.rows.length);
preferenceUIs.push(new PreferenceUI(tr, k, prefs[k]));
}
var trLast = table.insertRow(table.rows.length);
var tdLast0 = trLast.insertCell(0);
$('<button>').text("Add Preference").appendTo(tdLast0).click(function() {
var key = window.prompt("Preference Key");
if (key) {
var value = window.prompt("Preference Value");
if (value != null) {
var tr = table.insertRow(table.rows.length - 1);
preferenceUIs.push(new PreferenceUI(tr, key, value));
$.post(
"/command/set-preference",
{
name : key,
value : JSON.stringify(value)
},
function(o) {
if (o.code == "error") {
alert(o.message);
}
},
"json"
);
}
}
});
}
function PreferenceUI(tr, key, value) {
var self = this;
var td0 = tr.insertCell(0);
$(td0).text(key);
var td1 = tr.insertCell(1);
$(td1).text(value != null ? value : "");
var td2 = tr.insertCell(2);
$('<button>').text("Edit").appendTo(td2).click(function() {
var newValue = window.prompt("Value of preference key " + key, value);
if (newValue != null) {
$(td1).text(newValue);
$.post(
"/command/set-preference",
{
name : key,
value : JSON.stringify(newValue)
},
function(o) {
if (o.code == "error") {
alert(o.message);
}
},
"json"
);
}
});
$('<button>').text("Delete").appendTo(td2).click(function() {
if (window.confirm("Delete preference key " + key + "?")) {
$.post(
"/command/set-preference",
{
name : key
},
function(o) {
if (o.code == "ok") {
$(tr).remove();
for (var i = 0; i < preferenceUIs.length; i++) {
if (preferenceUIs[i] === self) {
preferenceUIs.splice(i, 1);
break;
}
}
} else if (o.code == "error") {
alert(o.message);
}
},
"json"
);
}
});
}

View File

@ -0,0 +1,22 @@
#body {
padding: 5em;
margin: 0;
}
#loading-message {
text-align: center;
font-size: 300%;
color: #aaa;
padding: 1in;
font-style: italic;
}
table.preferences th, table.preferences td {
padding: 3px;
}
table.preferences th {
background: #ddd;
}
table.preferences td {
background: #eee;
}