From 30dce3b3d5dfb9b68a407cc29aea16fbf7620208 Mon Sep 17 00:00:00 2001 From: David Huynh Date: Fri, 26 Feb 2010 21:56:41 +0000 Subject: [PATCH] Made range facet more robust against bad expressions. Centralized code that updates components of the UI. Show "Working..." indicator if anything takes more than 500ms. git-svn-id: http://google-refine.googlecode.com/svn/trunk@142 7d457c2a-affb-35e4-300a-418c747d4874 --- .../gridworks/browsing/facets/RangeFacet.java | 50 +++--- .../commands/edit/ApplyOperationsCommand.java | 6 +- .../gridworks/process/ProcessManager.java | 4 + src/main/webapp/scripts/project.js | 157 +++++++++++++++++- .../webapp/scripts/project/browsing-engine.js | 9 +- .../scripts/project/data-table-cell-ui.js | 49 +++--- .../project/data-table-column-header-ui.js | 65 +++++--- .../webapp/scripts/project/data-table-view.js | 90 +++------- .../webapp/scripts/project/history-widget.js | 44 ++--- src/main/webapp/scripts/project/list-facet.js | 9 +- .../webapp/scripts/project/process-widget.js | 80 ++++++--- .../webapp/scripts/project/range-facet.js | 51 +++--- .../webapp/scripts/project/recon-dialog.js | 20 +-- .../scripts/project/schema-alignment.js | 26 +-- .../scripts/project/text-search-facet.js | 3 +- src/main/webapp/styles/process.css | 2 +- 16 files changed, 403 insertions(+), 262 deletions(-) diff --git a/src/main/java/com/metaweb/gridworks/browsing/facets/RangeFacet.java b/src/main/java/com/metaweb/gridworks/browsing/facets/RangeFacet.java index 7b39c60d2..d5960d8d4 100644 --- a/src/main/java/com/metaweb/gridworks/browsing/facets/RangeFacet.java +++ b/src/main/java/com/metaweb/gridworks/browsing/facets/RangeFacet.java @@ -42,31 +42,35 @@ public class RangeFacet implements Facet { writer.key("name"); writer.value(_name); writer.key("expression"); writer.value(_expression); writer.key("columnName"); writer.value(_columnName); - writer.key("min"); writer.value(_min); - writer.key("max"); writer.value(_max); - writer.key("step"); writer.value(_step); - - writer.key("bins"); writer.array(); - for (int b : _bins) { - writer.value(b); - } - writer.endArray(); - - writer.key("baseBins"); writer.array(); - for (int b : _baseBins) { - writer.value(b); - } - writer.endArray(); - writer.key("mode"); writer.value(_mode); - if ("min".equals(_mode)) { - writer.key("from"); writer.value(_from); - } else if ("max".equals(_mode)) { - writer.key("to"); writer.value(_to); - } else { - writer.key("from"); writer.value(_from); - writer.key("to"); writer.value(_to); + + if (!Double.isInfinite(_min) && !Double.isInfinite(_max)) { + writer.key("min"); writer.value(_min); + writer.key("max"); writer.value(_max); + writer.key("step"); writer.value(_step); + + writer.key("bins"); writer.array(); + for (int b : _bins) { + writer.value(b); + } + writer.endArray(); + + writer.key("baseBins"); writer.array(); + for (int b : _baseBins) { + writer.value(b); + } + writer.endArray(); + + if ("min".equals(_mode)) { + writer.key("from"); writer.value(_from); + } else if ("max".equals(_mode)) { + writer.key("to"); writer.value(_to); + } else { + writer.key("from"); writer.value(_from); + writer.key("to"); writer.value(_to); + } } + writer.endObject(); } diff --git a/src/main/java/com/metaweb/gridworks/commands/edit/ApplyOperationsCommand.java b/src/main/java/com/metaweb/gridworks/commands/edit/ApplyOperationsCommand.java index f14299d89..4279a128a 100644 --- a/src/main/java/com/metaweb/gridworks/commands/edit/ApplyOperationsCommand.java +++ b/src/main/java/com/metaweb/gridworks/commands/edit/ApplyOperationsCommand.java @@ -35,7 +35,11 @@ public class ApplyOperationsCommand extends Command { reconstructOperation(project, obj); } - respond(response, "{ \"code\" : \"pending\" }"); + if (project.processManager.hasPending()) { + respond(response, "{ \"code\" : \"pending\" }"); + } else { + respond(response, "{ \"code\" : \"ok\" }"); + } } catch (JSONException e) { respondException(response, e); } diff --git a/src/main/java/com/metaweb/gridworks/process/ProcessManager.java b/src/main/java/com/metaweb/gridworks/process/ProcessManager.java index e2c23a3ca..209c795da 100644 --- a/src/main/java/com/metaweb/gridworks/process/ProcessManager.java +++ b/src/main/java/com/metaweb/gridworks/process/ProcessManager.java @@ -47,6 +47,10 @@ public class ProcessManager implements Jsonizable { } } + public boolean hasPending() { + return _processes.size() > 0; + } + public void onDoneProcess(Process p) { _processes.remove(p); update(); diff --git a/src/main/webapp/scripts/project.js b/src/main/webapp/scripts/project.js index 0af9c0950..f791fb341 100644 --- a/src/main/webapp/scripts/project.js +++ b/src/main/webapp/scripts/project.js @@ -1,6 +1,16 @@ var theProject; var ui = {}; +var Gridworks = { +}; + +Gridworks.reportException = function(e) { + if (window.console) { + console.log(e); + } +}; + + function onLoad() { var params = URL.getParameters(); if ("project" in params) { @@ -8,7 +18,7 @@ function onLoad() { id: parseInt(params.project) }; - reinitializeProjectData(initializeUI); + Gridworks.reinitializeProjectData(initializeUI); } } $(onLoad); @@ -44,7 +54,7 @@ function initializeUI() { ui.menuBar = new MenuBar(ui.menuBarPanel); } -function reinitializeProjectData(f) { +Gridworks.reinitializeProjectData = function(f) { Ajax.chainGetJSON( "/command/get-project-metadata?" + $.param({ project: theProject.id }), null, function(data) { @@ -63,13 +73,150 @@ function reinitializeProjectData(f) { ); } -function cellIndexToColumn(index) { +/* + * Utility state functions + */ + +Gridworks.createUpdateFunction = function(options, onFinallyDone) { + var functions = []; + var pushFunction = function(f) { + var index = functions.length; + functions.push(function() { + f(functions[index + 1]); + }); + }; + + pushFunction(function(onDone) { + ui.historyWidget.update(onDone); + }); + if (options["everythingChanged"] || options["modelsChanged"]) { + pushFunction(Gridworks.reinitializeProjectData); + } + if (options["everythingChanged"] || options["modelsChanged"] || options["rowsChanged"] || options["cellsChanged"] || options["engineChanged"]) { + pushFunction(function(onDone) { + ui.dataTableView.update(onDone); + }); + pushFunction(function(onDone) { + ui.browsingEngine.update(onDone); + }); + } + + functions.push(onFinallyDone || function() {}); + + return functions[0]; +}; + +Gridworks.update = function(options, onFinallyDone) { + var done = false; + var dismissBusy = null; + + Gridworks.createUpdateFunction(options, function() { + done = true; + if (dismissBusy) { + dismissBusy(); + } + if (onFinallyDone) { + onFinallyDone(); + } + })(); + + window.setTimeout(function() { + if (!done) { + dismissBusy = DialogSystem.showBusy(); + } + }, 500); +}; + +Gridworks.postProcess = function(command, params, body, updateOptions, callbacks) { + params = params || {}; + params.project = theProject.id; + + body = body || {}; + body.engine = JSON.stringify(ui.browsingEngine.getJSON()); + + updateOptions = updateOptions || {}; + callbacks = callbacks || {}; + + var done = false; + var dismissBusy = null; + + function onDone(o) { + done = true; + if (dismissBusy) { + dismissBusy(); + } + + if (o.code == "error") { + if ("onError" in callbacks) { + try { + callbacks["onError"](o); + } catch (e) { + Gridworks.reportException(e); + } + } + } else { + if ("onDone" in callbacks) { + try { + callbacks["onDone"](o); + } catch (e) { + Gridworks.reportException(e); + } + } + + if (o.code == "ok") { + Gridworks.update(updateOptions, callbacks["onFinallyDone"]); + } else if (o.code == "pending") { + if ("onPending" in callbacks) { + try { + callbacks["onPending"](o); + } catch (e) { + Gridworks.reportException(e); + } + } + ui.processWidget.update(updateOptions, callbacks["onFinallyDone"]); + } + } + } + + $.post( + "/command/" + command + "?" + $.param(params), + body, + onDone, + "json" + ); + + window.setTimeout(function() { + if (!done) { + dismissBusy = DialogSystem.showBusy(); + } + }, 500); +}; + +/* + * Utility model functions + */ + +Gridworks.cellIndexToColumn = function(cellIndex) { var columns = theProject.columnModel.columns; for (var i = 0; i < columns.length; i++) { var column = columns[i]; - if (column.cellIndex == index) { + if (column.cellIndex == cellIndex) { return column; } } return null; -} \ No newline at end of file +}; + +Gridworks.fetchRows = function(start, limit, onDone) { + $.post( + "/command/get-rows?" + $.param({ project: theProject.id, start: start, limit: limit }), + { engine: JSON.stringify(ui.browsingEngine.getJSON()) }, + function(data) { + theProject.rowModel = data; + if (onDone) { + onDone(); + } + }, + "json" + ); +}; diff --git a/src/main/webapp/scripts/project/browsing-engine.js b/src/main/webapp/scripts/project/browsing-engine.js index d6cdf8ade..5fca33f0a 100644 --- a/src/main/webapp/scripts/project/browsing-engine.js +++ b/src/main/webapp/scripts/project/browsing-engine.js @@ -50,12 +50,11 @@ BrowsingEngine.prototype.removeFacet = function(facet) { } if (update) { - this.update(); - ui.dataTableView.update(true); + Gridworks.update({ engineChanged: true }, onFinallyDone); } }; -BrowsingEngine.prototype.update = function() { +BrowsingEngine.prototype.update = function(onDone) { var self = this; $.post( @@ -67,6 +66,10 @@ BrowsingEngine.prototype.update = function() { for (var i = 0; i < facetData.length; i++) { self._facets[i].facet.updateState(facetData[i]); } + + if (onDone) { + onDone(); + } }, "json" ); diff --git a/src/main/webapp/scripts/project/data-table-cell-ui.js b/src/main/webapp/scripts/project/data-table-cell-ui.js index 55b0ab503..c8812c38e 100644 --- a/src/main/webapp/scripts/project/data-table-cell-ui.js +++ b/src/main/webapp/scripts/project/data-table-cell-ui.js @@ -159,16 +159,16 @@ DataTableCellUI.prototype._doJudgment = function(judgment, params) { params.row = this._rowIndex; params.cell = this._cellIndex; params.judgment = judgment; - this.doPostThenUpdate("recon-judge-one-cell", params); + this._postProcessOneCell("recon-judge-one-cell", params); }; DataTableCellUI.prototype._doJudgmentForSimilarCells = function(judgment, params) { params = params || {}; - params.columnName = cellIndexToColumn(this._cellIndex).headerLabel; + params.columnName = Gridworks.cellIndexToColumn(this._cellIndex).headerLabel; params.similarValue = this._cell.v; params.judgment = judgment; - ui.dataTableView.doPostThenUpdate("recon-judge-similar-cells", params); + this._postProcessSeveralCells("recon-judge-similar-cells", params); }; DataTableCellUI.prototype._searchForMatch = function() { @@ -203,14 +203,14 @@ DataTableCellUI.prototype._searchForMatch = function() { }; if (checkSimilar[0].checked) { params.similarValue = self._cell.v; - params.columnName = cellIndexToColumn(self._cellIndex).headerLabel; + params.columnName = Gridworks.cellIndexToColumn(self._cellIndex).headerLabel; - ui.dataTableView.doPostThenUpdate("recon-judge-similar-cells", params); + self._postProcessSeveralCells("recon-judge-similar-cells", params); } else { params.row = self._rowIndex; params.cell = self._cellIndex; - self.doPostThenUpdate("recon-judge-one-cell", params); + self._postProcessOneCell("recon-judge-one-cell", params); } DialogSystem.dismissUntil(level - 1); @@ -225,36 +225,29 @@ DataTableCellUI.prototype._searchForMatch = function() { input.focus().data("suggest").textchange(); }; -DataTableCellUI.prototype.createUpdateFunction = function(onBefore) { +DataTableCellUI.prototype._postProcessOneCell = function(command, params) { var self = this; - return function(data) { - if (data.code == "ok") { - var onDone = function() { + + Gridworks.postProcess( + command, + params, + null, + {}, + { + onDone: function(o) { self._cell = data.cell; self._render(); - ui.historyWidget.update(); - }; - } else { - var onDone = function() { - ui.processWidget.update(); } } - - if (onBefore) { - onBefore(onDone); - } else { - onDone(); - } - }; + ); }; -DataTableCellUI.prototype.doPostThenUpdate = function(command, params) { - params.project = theProject.id; - $.post( - "/command/" + command + "?" + $.param(params), +DataTableCellUI.prototype._postProcessSeveralCells = function(command, params) { + Gridworks.postProcess( + command, + params, null, - this.createUpdateFunction(), - "json" + { cellsChanged: true } ); }; diff --git a/src/main/webapp/scripts/project/data-table-column-header-ui.js b/src/main/webapp/scripts/project/data-table-column-header-ui.js index 4b58ff7f1..f765cd97e 100644 --- a/src/main/webapp/scripts/project/data-table-column-header-ui.js +++ b/src/main/webapp/scripts/project/data-table-column-header-ui.js @@ -375,9 +375,11 @@ DataTableColumnHeaderUI.prototype._doFilterByExpressionPrompt = function(express }; DataTableColumnHeaderUI.prototype._doTextTransform = function(expression) { - this._dataTableView.doPostThenUpdate( + Gridworks.postProcess( "do-text-transform", - { columnName: this._column.headerLabel, expression: expression } + { columnName: this._column.headerLabel, expression: expression }, + null, + { cellsChanged: true } ); }; @@ -446,23 +448,29 @@ DataTableColumnHeaderUI.prototype._doReconcile = function() { }; DataTableColumnHeaderUI.prototype._doReconDiscardJudgments = function() { - this._dataTableView.doPostThenUpdate( + Gridworks.postProcess( "recon-discard-judgments", - { columnName: this._column.headerLabel } + { columnName: this._column.headerLabel }, + null, + { cellsChanged: true } ); }; DataTableColumnHeaderUI.prototype._doReconMatchBestCandidates = function() { - this._dataTableView.doPostThenUpdate( + Gridworks.postProcess( "recon-match-best-candidates", - { columnName: this._column.headerLabel } + { columnName: this._column.headerLabel }, + null, + { cellsChanged: true } ); }; DataTableColumnHeaderUI.prototype._doReconMarkNewTopics = function(shareNewTopics) { - this._dataTableView.doPostThenUpdate( + Gridworks.postProcess( "recon-mark-new-topics", - { columnName: this._column.headerLabel, shareNewTopics: shareNewTopics } + { columnName: this._column.headerLabel, shareNewTopics: shareNewTopics }, + null, + { cellsChanged: true } ); }; @@ -480,7 +488,7 @@ DataTableColumnHeaderUI.prototype._doSearchToMatch = function() { var input = $('').appendTo($('

').appendTo(body)); input.suggest({}).bind("fb-select", function(e, data) { - self._dataTableView.doPostThenUpdate( + Gridworks.postProcess( "recon-match-specific-topic-to-cells", { columnName: self._column.headerLabel, @@ -488,8 +496,11 @@ DataTableColumnHeaderUI.prototype._doSearchToMatch = function() { topicGUID: data.guid, topicName: data.name, types: $.map(data.type, function(elmt) { return elmt.id; }).join(",") - } + }, + null, + { cellsChanged: true } ); + DialogSystem.dismissUntil(level - 1); }); @@ -510,15 +521,16 @@ DataTableColumnHeaderUI.prototype._doAddColumn = function(initialExpression) { function(expression) { var headerLabel = window.prompt("Enter header label for new column:"); if (headerLabel != null) { - self._dataTableView.doPostThenUpdate( - "add-column", + Gridworks.postProcess( + "add-column", { baseColumnName: self._column.headerLabel, expression: expression, headerLabel: headerLabel, columnInsertIndex: self._columnIndex + 1 }, - true + null, + { modelsChanged: true } ); } } @@ -526,23 +538,28 @@ DataTableColumnHeaderUI.prototype._doAddColumn = function(initialExpression) { }; DataTableColumnHeaderUI.prototype._doRemoveColumn = function() { - this._dataTableView.doPostThenUpdate( - "remove-column", - { columnName: this._column.headerLabel }, - true + Gridworks.postProcess( + "remove-column", + { + columnName: this._column.headerLabel + }, + null, + { modelsChanged: true } ); }; DataTableColumnHeaderUI.prototype._doJoinMultiValueCells = function() { var separator = window.prompt("Enter separator to use between values", ", "); if (separator != null) { - this._dataTableView.doPostThenUpdate( - "join-multi-value-cells", + Gridworks.postProcess( + "join-multi-value-cells", { columnName: this._column.headerLabel, keyColumnName: theProject.columnModel.keyColumnName, separator: separator - } + }, + null, + { rowsChanged: true } ); } }; @@ -550,14 +567,16 @@ DataTableColumnHeaderUI.prototype._doJoinMultiValueCells = function() { DataTableColumnHeaderUI.prototype._doSplitMultiValueCells = function() { var separator = window.prompt("What separator currently separates the values?", ","); if (separator != null) { - this._dataTableView.doPostThenUpdate( - "split-multi-value-cells", + Gridworks.postProcess( + "split-multi-value-cells", { columnName: this._column.headerLabel, keyColumnName: theProject.columnModel.keyColumnName, separator: separator, mode: "plain" - } + }, + null, + { rowsChanged: true } ); } }; diff --git a/src/main/webapp/scripts/project/data-table-view.js b/src/main/webapp/scripts/project/data-table-view.js index aa3b1f4db..0dea3793d 100644 --- a/src/main/webapp/scripts/project/data-table-view.js +++ b/src/main/webapp/scripts/project/data-table-view.js @@ -5,15 +5,8 @@ function DataTableView(div) { this._showRows(0); } -DataTableView.prototype.update = function(reset) { - if (reset) { - var self = this; - reinitializeProjectData(function() { - self._showRows(0); - }); - } else { - this._showRows(theProject.rowModel.start); - } +DataTableView.prototype.update = function(onDone) { + this._showRows(0, onDone); }; DataTableView.prototype.render = function() { @@ -72,7 +65,7 @@ DataTableView.prototype.render = function() { } else { a.text(pageSize).addClass("action").click(function(evt) { self._pageSize = pageSize; - self.update(true); + self.update(); }); } }; @@ -205,6 +198,8 @@ DataTableView.prototype.render = function() { var rows = theProject.rowModel.rows; var renderRow = function(tr, r, row, even) { + $(tr).empty(); + var cells = row.cells; var tdStar = tr.insertCell(tr.cells.length); @@ -213,25 +208,19 @@ DataTableView.prototype.render = function() { .appendTo(tdStar) .click(function() { var newStarred = !row.starred; - $.post( - "/command/annotate-one-row?" + $.param({ project: theProject.id, row: row.i, starred: newStarred }), + + Gridworks.postProcess( + "annotate-one-row", + { row: row.i, starred: newStarred }, null, - function(o) { - if (o.code == "ok") { + {}, + { onDone: function(o) { row.starred = newStarred; - - $(tr).empty(); - renderRow(tr, r, row, even); - - ui.historyWidget.update(); - } else { - ui.processWidget.update(); } }, "json" ); - }); var tdIndex = tr.insertCell(tr.cells.length); @@ -273,20 +262,13 @@ DataTableView.prototype.render = function() { DataTableView.prototype._showRows = function(start, onDone) { var self = this; - - $.post( - "/command/get-rows?" + $.param({ project: theProject.id, start: start, limit: this._pageSize }), - { engine: JSON.stringify(ui.browsingEngine.getJSON()) }, - function(data) { - theProject.rowModel = data; - self.render(); - - if (onDone) { - onDone(); - } - }, - "json" - ); + Gridworks.fetchRows(start, this._pageSize, function() { + self.render(); + + if (onDone) { + onDone(); + } + }); }; DataTableView.prototype._onClickPreviousPage = function(elmt, evt) { @@ -330,50 +312,18 @@ DataTableView.prototype._createMenuForAllColumns = function(elmt) { { label: "Star Rows", click: function() { - self.doPostThenUpdate("annotate-rows", { "starred" : "true" }, false); + Gridworks.postProcess("annotate-rows", { "starred" : "true" }, null, { rowMetadataChanged: true }); } }, { label: "Unstar Rows", click: function() { - self.doPostThenUpdate("annotate-rows", { "starred" : "false" }, false); + Gridworks.postProcess("annotate-rows", { "starred" : "false" }, null, { rowMetadataChanged: true }); } } ], elmt); }; -DataTableView.prototype.createUpdateFunction = function(onBefore) { - var self = this; - return function(data) { - if (data.code == "ok") { - var onDone = function() { - self.update(); - ui.historyWidget.update(); - }; - } else { - var onDone = function() { - ui.processWidget.update(); - } - } - - if (onBefore) { - onBefore(onDone); - } else { - onDone(); - } - }; -}; - -DataTableView.prototype.doPostThenUpdate = function(command, params, updateColumnModel) { - params.project = theProject.id; - $.post( - "/command/" + command + "?" + $.param(params), - { engine: JSON.stringify(ui.browsingEngine.getJSON()) }, - this.createUpdateFunction(updateColumnModel ? reinitializeProjectData : undefined), - "json" - ); -}; - DataTableView.promptExpressionOnVisibleRows = function(column, title, expression, onDone) { var rowIndices = []; var values = []; diff --git a/src/main/webapp/scripts/project/history-widget.js b/src/main/webapp/scripts/project/history-widget.js index 3fe4911a5..b67ef4c68 100644 --- a/src/main/webapp/scripts/project/history-widget.js +++ b/src/main/webapp/scripts/project/history-widget.js @@ -10,6 +10,10 @@ HistoryWidget.prototype.update = function(onDone) { function(data) { self._data = data; self._render(); + + if (onDone) { + onDone(); + } } ); }; @@ -88,18 +92,12 @@ HistoryWidget.prototype._render = function() { HistoryWidget.prototype._onClickHistoryEntry = function(evt, entry, lastDoneID) { var self = this; - $.post( - "/command/undo-redo?" + $.param({ project: theProject.id, lastDoneID: lastDoneID }), + + Gridworks.postProcess( + "undo-redo", + { lastDoneID: lastDoneID }, null, - function(data) { - if (data.code == "ok") { - self.update(); - ui.dataTableView.update(true); - } else { - // update process UI - } - }, - "json" + { everythingChanged: true } ); }; @@ -218,18 +216,22 @@ HistoryWidget.prototype._showApplyOperationsDialog = function(json) { return; } - DialogSystem.dismissUntil(level - 1); - - $.post( - "/command/apply-operations?" + $.param({ project: theProject.id }), + Gridworks.postProcess( + "apply-operations", + {}, { operations: JSON.stringify(json) }, - function(data) { - self.update(); - ui.dataTableView.update(true); - ui.processWidget.update(); - }, - "json" + { everythingChanged: true }, + { + onDone: function(o) { + if (o.code == "pending") { + // Something might have already been done and so it's good to update + Gridworks.update({ everythingChanged: true }); + } + } + } ); + + DialogSystem.dismissUntil(level - 1); }).appendTo(footer); $('').text("Cancel").click(function() { diff --git a/src/main/webapp/scripts/project/list-facet.js b/src/main/webapp/scripts/project/list-facet.js index ec4f1db1c..9af3b81ee 100644 --- a/src/main/webapp/scripts/project/list-facet.js +++ b/src/main/webapp/scripts/project/list-facet.js @@ -162,12 +162,6 @@ ListFacet.prototype.render = function() { self.render(); }).appendTo(footerDiv); } - - $('').html(" • ").appendTo(footerDiv); - - $('').addClass("action").text("refresh").click(function() { - ui.browsingEngine.update(); - }).appendTo(footerDiv); } }; @@ -204,6 +198,5 @@ ListFacet.prototype._remove = function() { }; ListFacet.prototype._updateRest = function() { - ui.browsingEngine.update(); - ui.dataTableView.update(true); + Gridworks.update({ engineChanged: true }); }; diff --git a/src/main/webapp/scripts/project/process-widget.js b/src/main/webapp/scripts/project/process-widget.js index d3e0eb664..e48d34bfb 100644 --- a/src/main/webapp/scripts/project/process-widget.js +++ b/src/main/webapp/scripts/project/process-widget.js @@ -2,10 +2,23 @@ function ProcessWidget(div) { this._div = div; this._timerID = null; this._processCount = 0; - this.update(); + + this._updateOptions = {}; + this._onDones = []; + + this.update({}); } -ProcessWidget.prototype.update = function() { +ProcessWidget.prototype.update = function(updateOptions, onDone) { + for (var n in updateOptions) { + if (updateOptions.hasOwnProperty(n)) { + this._updateOptions[n] = updateOptions[n]; + } + } + if (onDone) { + this._onDones.push(onDone); + } + if (this._timerID != null) { return; } @@ -25,41 +38,56 @@ ProcessWidget.prototype._render = function() { this._div.empty(); - var bodyDiv = $('
').addClass("process-panel-inner").appendTo(this._div); if (this._data.processes.length == 0) { this._div.hide(); + } else { + this._div.show(); - if (this._processCount > 0) { - this._processCount = 0; + var bodyDiv = $('
').addClass("process-panel-inner").appendTo(this._div); + $('') + .css("float", "right") + .css("margin-left", "10px") + .css("margin-bottom", "10px") + .css("opacity", "0.3") + .appendTo(bodyDiv); + + var renderProcess = function(process) { + var div = $('
').addClass("process-panel-entry").appendTo(bodyDiv); - ui.historyWidget.update(); - ui.dataTableView.update(true); - } - return; - } - this._processCount = this._data.processes.length; - - this._div.show(); - - var renderProcess = function(process) { - var div = $('
').addClass("process-panel-entry").appendTo(bodyDiv); + if (process.status == "pending") { + div.text(process.description + " (pending)"); + } else { + div.text(process.description + " (" + process.progress + "%)"); + } + }; - if (process.status == "pending") { - div.text(process.description + " (pending)"); - } else { - div.text(process.description + " (" + process.progress + "%)"); + var processes = this._data.processes; + for (var i = 0; i < processes.length; i++) { + renderProcess(processes[i]); } - }; - - var processes = this._data.processes; - for (var i = 0; i < processes.length; i++) { - renderProcess(processes[i]); } - if (processes.length > 0 && this._timerID == null) { + if (this._data.processes.length > 0 && this._timerID == null) { this._timerID = window.setTimeout(function() { self._timerID = null; self.update(); }, 500); + } else { + + var updateOptions = this._updateOptions; + var onDones = this._onDones; + + this._updateOptions = {}; + this._onDones = []; + + Gridworks.update(updateOptions, function() { + for (var i = 0; i < onDones.length; i++) { + try { + onDones[i](); + } catch (e) { + Gridworks.reportException(e); + } + } + }); } }; diff --git a/src/main/webapp/scripts/project/range-facet.js b/src/main/webapp/scripts/project/range-facet.js index 0de190340..37357ed5a 100644 --- a/src/main/webapp/scripts/project/range-facet.js +++ b/src/main/webapp/scripts/project/range-facet.js @@ -7,6 +7,7 @@ function RangeFacet(div, config, options) { this._to = ("to" in this._config) ? this._config.to : null; this._timerID = null; + this._error = false; this._initializedUI = false; } @@ -93,6 +94,10 @@ RangeFacet.prototype._initializeUI = function() { var bodyDiv = $('
').addClass("facet-range-body").appendTo(container); + if (this._error) { + return; + } + this._histogramDiv = $('
').addClass("facet-range-histogram").appendTo(bodyDiv); this._sliderDiv = $('
').addClass("facet-range-slider").appendTo(bodyDiv); this._statusDiv = $('
').addClass("facet-range-status").appendTo(bodyDiv); @@ -157,26 +162,30 @@ RangeFacet.prototype._setRangeIndicators = function() { }; RangeFacet.prototype.updateState = function(data) { - this._config.min = data.min; - this._config.max = data.max; - this._config.step = data.step; - this._baseBins = data.baseBins; - this._bins = data.bins; - - switch (this._config.mode) { - case "min": - this._from = Math.max(data.from, this._config.min); - break; - case "max": - this._to = Math.min(data.to, this._config.max); - break; - default: - this._from = Math.max(data.from, this._config.min); - if ("to" in data) { + if ("min" in data && "max" in data) { + this._config.min = data.min; + this._config.max = data.max; + this._config.step = data.step; + this._baseBins = data.baseBins; + this._bins = data.bins; + + switch (this._config.mode) { + case "min": + this._from = Math.max(data.from, this._config.min); + break; + case "max": this._to = Math.min(data.to, this._config.max); - } else { - this._to = data.max; + break; + default: + this._from = Math.max(data.from, this._config.min); + if ("to" in data) { + this._to = Math.min(data.to, this._config.max); + } else { + this._to = data.max; + } } + } else { + this._error = true; } this.render(); @@ -187,6 +196,9 @@ RangeFacet.prototype.render = function() { this._initializeUI(); this._initializedUI = true; } + if (this._error) { + return; + } this._sliderDiv.slider("option", "min", this._config.min); this._sliderDiv.slider("option", "max", this._config.max); @@ -249,6 +261,5 @@ RangeFacet.prototype._scheduleUpdate = function() { }; RangeFacet.prototype._updateRest = function() { - ui.browsingEngine.update(); - ui.dataTableView.update(true); + Gridworks.update({ engineChanged: true }); }; diff --git a/src/main/webapp/scripts/project/recon-dialog.js b/src/main/webapp/scripts/project/recon-dialog.js index aa2e3fdb6..a28855f30 100644 --- a/src/main/webapp/scripts/project/recon-dialog.js +++ b/src/main/webapp/scripts/project/recon-dialog.js @@ -69,24 +69,18 @@ ReconDialog.prototype._createDialog = function() { alert("Please specify a type."); } else { DialogSystem.dismissUntil(level - 1); - $.post( - "/command/reconcile?" + $.param({ - project: theProject.id, + + Gridworks.postProcess( + "reconcile", + { columnName: self._column.headerLabel, typeID: type.id, typeName: type.name, autoMatch: autoMatchCheckbox[0].checked, minScore: minScoreInput[0].value - }), - { engine: JSON.stringify(ui.browsingEngine.getJSON()) }, - function(data) { - if (data.code != "error") { - ui.processWidget.update(); - } else { - alert(data.message); - } - }, - "json" + }, + null, + { cellsChanged: true } ); } }).appendTo(footer); diff --git a/src/main/webapp/scripts/project/schema-alignment.js b/src/main/webapp/scripts/project/schema-alignment.js index dffe607a4..da2886d66 100644 --- a/src/main/webapp/scripts/project/schema-alignment.js +++ b/src/main/webapp/scripts/project/schema-alignment.js @@ -162,26 +162,16 @@ SchemaAlignmentDialog.prototype._constructFooter = function(footer) { $('').html("  OK  ").click(function() { var protograph = self.getJSON(); - $.post( - "/command/save-protograph?" + $.param({ project: theProject.id }), + Gridworks.postProcess( + "save-protograph", + {}, { protograph: JSON.stringify(protograph) }, - function(data) { - if (data.code == "error") { - alert("Failed to save protograph"); - return; - } else if (data.code == "ok") { - ui.historyWidget.update(); - } else { - ui.processWidget.update(); + { + onDone: function() { + DialogSystem.dismissUntil(self._level - 1); + theProject.protograph = protograph; } - - DialogSystem.dismissUntil(self._level - 1); - - theProject.protograph = protograph; - - self._onDone(protograph); - }, - "json" + } ); }).appendTo(footer); diff --git a/src/main/webapp/scripts/project/text-search-facet.js b/src/main/webapp/scripts/project/text-search-facet.js index 149388837..d2387151d 100644 --- a/src/main/webapp/scripts/project/text-search-facet.js +++ b/src/main/webapp/scripts/project/text-search-facet.js @@ -81,6 +81,5 @@ TextSearchFacet.prototype._scheduleUpdate = function() { }; TextSearchFacet.prototype._updateRest = function() { - ui.browsingEngine.update(); - ui.dataTableView.update(true); + Gridworks.update({ engineChanged: true }); }; diff --git a/src/main/webapp/styles/process.css b/src/main/webapp/styles/process.css index eeea3668e..42700e196 100644 --- a/src/main/webapp/styles/process.css +++ b/src/main/webapp/styles/process.css @@ -11,8 +11,8 @@ max-height: 70px; overflow: auto; padding: 10px; - background: #fffee0; margin: 0 auto; text-align: left; + background: #fffee0; }