From b75a5efe71e55ae64654206f9f529cfa54b808d5 Mon Sep 17 00:00:00 2001 From: David Huynh Date: Mon, 6 Jun 2011 18:49:36 +0000 Subject: [PATCH] Applied patch for Issue 222: save favorite transforms. git-svn-id: http://google-refine.googlecode.com/svn/trunk@2079 7d457c2a-affb-35e4-300a-418c747d4874 --- .../src/com/google/refine/ProjectManager.java | 1 + .../expr/GetExpressionHistoryCommand.java | 3 + .../expr/GetStarredExpressionsCommand.java | 44 +++++++++ .../expr/ToggleStarredExpressionCommand.java | 51 ++++++++++ .../com/google/refine/preference/TopList.java | 13 ++- .../webapp/modules/core/MOD-INF/controller.js | 3 + .../dialogs/expression-preview-dialog.html | 4 + .../dialogs/expression-preview-dialog.js | 92 +++++++++++++++++-- .../dialogs/expression-preview-dialog.less | 9 +- 9 files changed, 209 insertions(+), 11 deletions(-) create mode 100644 main/src/com/google/refine/commands/expr/GetStarredExpressionsCommand.java create mode 100644 main/src/com/google/refine/commands/expr/ToggleStarredExpressionCommand.java diff --git a/main/src/com/google/refine/ProjectManager.java b/main/src/com/google/refine/ProjectManager.java index e94b7b7ea..fc3e405de 100644 --- a/main/src/com/google/refine/ProjectManager.java +++ b/main/src/com/google/refine/ProjectManager.java @@ -466,5 +466,6 @@ public abstract class ProjectManager { */ static protected void preparePreferenceStore(PreferenceStore ps) { ps.put("scripting.expressions", new TopList(s_expressionHistoryMax)); + ps.put("scripting.starred-expressions", new TopList(Integer.MAX_VALUE)); } } diff --git a/main/src/com/google/refine/commands/expr/GetExpressionHistoryCommand.java b/main/src/com/google/refine/commands/expr/GetExpressionHistoryCommand.java index 103c25c50..a2078be05 100644 --- a/main/src/com/google/refine/commands/expr/GetExpressionHistoryCommand.java +++ b/main/src/com/google/refine/commands/expr/GetExpressionHistoryCommand.java @@ -67,6 +67,7 @@ public class GetExpressionHistoryCommand extends Command { localExpressions = localExpressions.size() > 20 ? localExpressions.subList(0, 20) : localExpressions; List globalExpressions = toExpressionList(ProjectManager.singleton.getPreferenceStore().get("scripting.expressions")); + Set starredExpressions = new HashSet(((TopList)ProjectManager.singleton.getPreferenceStore().get("scripting.starred-expressions")).getList()); Set done = new HashSet(); @@ -81,6 +82,7 @@ public class GetExpressionHistoryCommand extends Command { writer.object(); writer.key("code"); writer.value(s); writer.key("global"); writer.value(false); + writer.key("starred"); writer.value(starredExpressions.contains(s)); writer.endObject(); done.add(s); } @@ -89,6 +91,7 @@ public class GetExpressionHistoryCommand extends Command { writer.object(); writer.key("code"); writer.value(s); writer.key("global"); writer.value(true); + writer.key("starred"); writer.value(starredExpressions.contains(s)); writer.endObject(); } } diff --git a/main/src/com/google/refine/commands/expr/GetStarredExpressionsCommand.java b/main/src/com/google/refine/commands/expr/GetStarredExpressionsCommand.java new file mode 100644 index 000000000..b489d248b --- /dev/null +++ b/main/src/com/google/refine/commands/expr/GetStarredExpressionsCommand.java @@ -0,0 +1,44 @@ +package com.google.refine.commands.expr; + +import java.io.IOException; +import java.util.List; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.json.JSONWriter; + +import com.google.refine.ProjectManager; +import com.google.refine.commands.Command; +import com.google.refine.preference.TopList; + + +public class GetStarredExpressionsCommand extends Command { + + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + try { + List starredExpressions = ((TopList)ProjectManager.singleton.getPreferenceStore().get("scripting.starred-expressions")).getList(); + + response.setCharacterEncoding("UTF-8"); + response.setHeader("Content-Type", "application/json"); + + JSONWriter writer = new JSONWriter(response.getWriter()); + writer.object(); + writer.key("expressions"); + writer.array(); + for (String s : starredExpressions) { + writer.object(); + writer.key("code"); writer.value(s); + writer.endObject(); + } + writer.endArray(); + writer.endObject(); + } catch (Exception e) { + respondException(response, e); + } + } +} diff --git a/main/src/com/google/refine/commands/expr/ToggleStarredExpressionCommand.java b/main/src/com/google/refine/commands/expr/ToggleStarredExpressionCommand.java new file mode 100644 index 000000000..263b35444 --- /dev/null +++ b/main/src/com/google/refine/commands/expr/ToggleStarredExpressionCommand.java @@ -0,0 +1,51 @@ + +package com.google.refine.commands.expr; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.json.JSONWriter; + +import com.google.refine.ProjectManager; +import com.google.refine.commands.Command; +import com.google.refine.preference.TopList; + +public class ToggleStarredExpressionCommand extends Command { + + @Override + public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + String expression = request.getParameter("expression"); + + TopList starredExpressions = ((TopList) ProjectManager.singleton.getPreferenceStore().get( + "scripting.starred-expressions")); + + if (starredExpressions.getList().contains(expression)) + starredExpressions.remove(expression); + else + starredExpressions.add(expression); + + if(request.getParameter("returnList") != null) + try { + response.setCharacterEncoding("UTF-8"); + response.setHeader("Content-Type", "application/json"); + + JSONWriter writer = new JSONWriter(response.getWriter()); + writer.object(); + writer.key("expressions"); + writer.array(); + for (String s : starredExpressions) { + writer.object(); + writer.key("code"); + writer.value(s); + writer.endObject(); + } + writer.endArray(); + writer.endObject(); + } catch (Exception e) { + respondException(response, e); + } + } +} diff --git a/main/src/com/google/refine/preference/TopList.java b/main/src/com/google/refine/preference/TopList.java index 40ec7b14e..04db58ad5 100644 --- a/main/src/com/google/refine/preference/TopList.java +++ b/main/src/com/google/refine/preference/TopList.java @@ -34,6 +34,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package com.google.refine.preference; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Properties; @@ -46,7 +47,7 @@ import org.json.JSONWriter; import com.google.refine.Jsonizable; -public class TopList implements Jsonizable { +public class TopList implements Jsonizable, Iterable { private static final long serialVersionUID = 2666669643063493350L; final protected int _top; @@ -68,6 +69,11 @@ public class TopList implements Jsonizable { _list.remove(_list.size() - 1); } } + + public void remove(String element) + { + _list.remove(element); + } @Override public void write(JSONWriter writer, Properties options) throws JSONException { @@ -102,4 +108,9 @@ public class TopList implements Jsonizable { _list.add(a.getString(i)); } } + + @Override + public Iterator iterator() { + return _list.iterator(); + } } diff --git a/main/webapp/modules/core/MOD-INF/controller.js b/main/webapp/modules/core/MOD-INF/controller.js index 7df81b749..f52ae7b0f 100644 --- a/main/webapp/modules/core/MOD-INF/controller.js +++ b/main/webapp/modules/core/MOD-INF/controller.js @@ -120,9 +120,12 @@ function registerCommands() { RS.registerCommand(module, "get-expression-language-info", new Packages.com.google.refine.commands.expr.GetExpressionLanguageInfoCommand()); RS.registerCommand(module, "get-expression-history", new Packages.com.google.refine.commands.expr.GetExpressionHistoryCommand()); + RS.registerCommand(module, "get-starred-expressions", new Packages.com.google.refine.commands.expr.GetStarredExpressionsCommand()); + RS.registerCommand(module, "toggle-starred-expression", new Packages.com.google.refine.commands.expr.ToggleStarredExpressionCommand()); RS.registerCommand(module, "log-expression", new Packages.com.google.refine.commands.expr.LogExpressionCommand()); RS.registerCommand(module, "preview-expression", new Packages.com.google.refine.commands.expr.PreviewExpressionCommand()); + RS.registerCommand(module, "get-preference", new Packages.com.google.refine.commands.GetPreferenceCommand()); RS.registerCommand(module, "get-all-preferences", new Packages.com.google.refine.commands.GetAllPreferencesCommand()); RS.registerCommand(module, "set-preference", new Packages.com.google.refine.commands.SetPreferenceCommand()); diff --git a/main/webapp/modules/core/scripts/dialogs/expression-preview-dialog.html b/main/webapp/modules/core/scripts/dialogs/expression-preview-dialog.html index 9638ee102..c2cbbf650 100644 --- a/main/webapp/modules/core/scripts/dialogs/expression-preview-dialog.html +++ b/main/webapp/modules/core/scripts/dialogs/expression-preview-dialog.html @@ -14,6 +14,7 @@
@@ -22,6 +23,9 @@ + diff --git a/main/webapp/modules/core/scripts/dialogs/expression-preview-dialog.js b/main/webapp/modules/core/scripts/dialogs/expression-preview-dialog.js index 51bf28ce1..dcc3c5480 100644 --- a/main/webapp/modules/core/scripts/dialogs/expression-preview-dialog.js +++ b/main/webapp/modules/core/scripts/dialogs/expression-preview-dialog.js @@ -119,6 +119,7 @@ ExpressionPreviewDialog.Widget = function( $("#expression-preview-tabs").tabs(); $("#expression-preview-tabs-history").css("display", ""); + $("#expression-preview-tabs-starred").css("display", ""); $("#expression-preview-tabs-help").css("display", ""); this._elmts.expressionPreviewLanguageSelect[0].value = language; @@ -140,6 +141,7 @@ ExpressionPreviewDialog.Widget = function( this.update(); this._renderExpressionHistoryTab(); + this._renderStarredExpressionsTab(); this._renderHelpTab(); }; @@ -266,15 +268,93 @@ ExpressionPreviewDialog.Widget.prototype._renderExpressionHistory = function(dat var table = $( '' + - '' + + '' + '
FromExpression
FromExpression
' ).appendTo($('
').addClass("expression-preview-table-wrapper").appendTo(elmt))[0]; - var renderEntry = function(entry) { - var tr = table.insertRow(table.rows.length); + var renderEntry = function(self,tr,entry) { + $(tr).empty(); var o = Scripting.parse(entry.code); + $(' ') + .addClass(entry.starred ? "data-table-star-on" : "data-table-star-off") + .appendTo(tr.insertCell(0)) + .click(function() { + $.post( + "/command/core/toggle-starred-expression", + { expression: entry.code }, + function(data) { + entry.starred = !entry.starred; + renderEntry(self,tr,entry); + self._renderStarredExpressionsTab(); + }, + "json" + ); + }); - $('Reuse').appendTo(tr.insertCell(0)).click(function() { + $('Reuse').appendTo(tr.insertCell(1)).click(function() { + self._elmts.expressionPreviewTextarea[0].value = o.expression; + self._elmts.expressionPreviewLanguageSelect[0].value = o.language; + + $("#expression-preview-tabs").tabs('option', 'selected', 0); + + self._elmts.expressionPreviewTextarea.select().focus(); + + self.update(); + }); + + + $(tr.insertCell(2)).html(entry.global ? "Other projects" : "This project"); + $(tr.insertCell(3)).text(o.language + ":"); + $(tr.insertCell(4)).text(o.expression); + }; + + for (var i = 0; i < data.expressions.length; i++) { + var tr = table.insertRow(table.rows.length); + var entry = data.expressions[i]; + renderEntry(self,tr,entry); + } + +}; + +ExpressionPreviewDialog.Widget.prototype._renderStarredExpressionsTab = function() { + var self = this; + $.getJSON( + "/command/core/get-starred-expressions", + null, + function(data) { + self._renderStarredExpressions(data); + }, + "json" + ); +}; + +ExpressionPreviewDialog.Widget.prototype._renderStarredExpressions = function(data) { + var self = this; + var elmt = this._elmts.expressionPreviewStarredContainer.empty().width(this._tabContentWidth); + + var table = $( + '' + + '' + + '
Expression
' + ).appendTo($('
').addClass("expression-preview-table-wrapper").appendTo(elmt))[0]; + + var renderEntry = function(entry) { + var tr = table.insertRow(table.rows.length); + var o = Scripting.parse(entry.code); + + $('Remove').appendTo(tr.insertCell(0)).click(function() { + $.post( + "/command/core/toggle-starred-expression", + { expression: entry.code, returnList: true }, + function(data) { + self._renderStarredExpressions(data); + self._renderExpressionHistoryTab(); + }, + "json" + ); + }); + + $('Reuse').appendTo(tr.insertCell(1)).click(function() { self._elmts.expressionPreviewTextarea[0].value = o.expression; self._elmts.expressionPreviewLanguageSelect[0].value = o.language; @@ -285,7 +365,6 @@ ExpressionPreviewDialog.Widget.prototype._renderExpressionHistory = function(dat self.update(); }); - $(tr.insertCell(1)).html(entry.global ? "Other projects" : "This project"); $(tr.insertCell(2)).text(o.language + ":"); $(tr.insertCell(3)).text(o.expression); }; @@ -294,8 +373,7 @@ ExpressionPreviewDialog.Widget.prototype._renderExpressionHistory = function(dat var entry = data.expressions[i]; renderEntry(entry); } -}; - +} ExpressionPreviewDialog.Widget.prototype._scheduleUpdate = function() { if (this._timerID !== null) { window.clearTimeout(this._timerID); diff --git a/main/webapp/modules/core/styles/dialogs/expression-preview-dialog.less b/main/webapp/modules/core/styles/dialogs/expression-preview-dialog.less index fd81fee17..bb56a702a 100644 --- a/main/webapp/modules/core/styles/dialogs/expression-preview-dialog.less +++ b/main/webapp/modules/core/styles/dialogs/expression-preview-dialog.less @@ -52,21 +52,24 @@ textarea.expression-preview-code { #expression-preview-tabs-preview, #expression-preview-tabs-help, -#expression-preview-tabs-history { +#expression-preview-tabs-history, +#expression-preview-tabs-starred { padding: @padding_tight; overflow: hidden; } #expression-preview-tabs-preview > div, #expression-preview-tabs-help > div, -#expression-preview-tabs-history > div { +#expression-preview-tabs-history > div, +#expression-preview-tabs-starred { height: 200px; overflow: auto; } #expression-preview-tabs-preview td, #expression-preview-tabs-preview th, #expression-preview-tabs-help td, #expression-preview-tabs-help th, -#expression-preview-tabs-history td, #expression-preview-tabs-history th { +#expression-preview-tabs-history td, #expression-preview-tabs-history th, +#expression-preview-tabs-starred td, #expression-preview-tabs-starred th { padding: @padding_tight; }