From e1feec436a9a2803f4c28d784b2c6d3c25fd0d88 Mon Sep 17 00:00:00 2001 From: David Huynh Date: Thu, 20 May 2010 05:49:13 +0000 Subject: [PATCH] Made data table view render "rows" or "records" depending on the mode. Got rid of "show dependent rows" and replaced it with 2 radio buttons for the 2 modes: row-based vs. record-based. git-svn-id: http://google-refine.googlecode.com/svn/trunk@831 7d457c2a-affb-35e4-300a-418c747d4874 --- .../commands/project/GetModelsCommand.java | 1 + .../commands/row/GetRowsCommand.java | 92 ++++++++----------- .../metaweb/gridworks/model/ColumnModel.java | 3 - .../metaweb/gridworks/model/RecordModel.java | 17 +++- src/main/webapp/scripts/project.js | 9 +- .../webapp/scripts/project/browsing-engine.js | 24 ++--- .../webapp/scripts/views/data-table-view.js | 5 +- src/main/webapp/styles/project/browsing.css | 13 +++ 8 files changed, 86 insertions(+), 78 deletions(-) diff --git a/src/main/java/com/metaweb/gridworks/commands/project/GetModelsCommand.java b/src/main/java/com/metaweb/gridworks/commands/project/GetModelsCommand.java index 9ec870c7d..c437cbf3b 100644 --- a/src/main/java/com/metaweb/gridworks/commands/project/GetModelsCommand.java +++ b/src/main/java/com/metaweb/gridworks/commands/project/GetModelsCommand.java @@ -29,6 +29,7 @@ public class GetModelsCommand extends Command { writer.object(); writer.key("columnModel"); project.columnModel.write(writer, options); + writer.key("recordModel"); project.recordModel.write(writer, options); writer.key("protograph"); if (project.protograph == null) { writer.value(null); diff --git a/src/main/java/com/metaweb/gridworks/commands/row/GetRowsCommand.java b/src/main/java/com/metaweb/gridworks/commands/row/GetRowsCommand.java index 5d762682f..c49e3e4d2 100644 --- a/src/main/java/com/metaweb/gridworks/commands/row/GetRowsCommand.java +++ b/src/main/java/com/metaweb/gridworks/commands/row/GetRowsCommand.java @@ -46,47 +46,7 @@ public class GetRowsCommand extends Command { JSONWriter writer = new JSONWriter(response.getWriter()); writer.object(); - RowAccumulator acc = new RowAccumulator(start, limit) { - JSONWriter writer; - Properties options; - - public RowAccumulator init(JSONWriter writer, Properties options) { - this.writer = writer; - this.options = options; - - return this; - } - - @Override - public boolean internalVisit(Project project, int rowIndex, Row row) { - try { - options.put("rowIndex", rowIndex); - row.write(writer, options); - } catch (JSONException e) { - } - return false; - } - - @Override - protected boolean internalVisit(Project project, Record record) { - options.put("recordIndex", record.recordIndex); - - for (int r = record.fromRowIndex; r < record.toRowIndex; r++) { - try { - Row row = project.rows.get(r); - - options.put("rowIndex", r); - - row.write(writer, options); - - } catch (JSONException e) { - } - - options.remove("recordIndex"); - } - return false; - } - }.init(writer, options); + RowWritingVisitor acc = new RowWritingVisitor(start, limit, writer, options); if (engine.getMode() == Mode.RowBased) { FilteredRows filteredRows = engine.getAllFilteredRows(); @@ -119,44 +79,66 @@ public class GetRowsCommand extends Command { } } - static protected class RowAccumulator implements RowVisitor, RecordVisitor { - final public int start; - final public int limit; + static protected class RowWritingVisitor implements RowVisitor, RecordVisitor { + final int start; + final int limit; + final JSONWriter writer; + final Properties options; public int total; - public RowAccumulator(int start, int limit) { + public RowWritingVisitor(int start, int limit, JSONWriter writer, Properties options) { this.start = start; this.limit = limit; + this.writer = writer; + this.options = options; } public boolean visit(Project project, int rowIndex, Row row) { - boolean r = false; - if (total >= start && total < start + limit) { - r = internalVisit(project, rowIndex, row); + internalVisit(project, rowIndex, row); } total++; - return r; + + return false; } @Override public boolean visit(Project project, Record record) { - boolean r = false; - if (total >= start && total < start + limit) { - r = internalVisit(project, record); + internalVisit(project, record); } total++; - return r; + + return false; } - protected boolean internalVisit(Project project, int rowIndex, Row row) { + public boolean internalVisit(Project project, int rowIndex, Row row) { + try { + options.put("rowIndex", rowIndex); + row.write(writer, options); + } catch (JSONException e) { + } return false; } protected boolean internalVisit(Project project, Record record) { - return false; + options.put("recordIndex", record.recordIndex); + + for (int r = record.fromRowIndex; r < record.toRowIndex; r++) { + try { + Row row = project.rows.get(r); + + options.put("rowIndex", r); + + row.write(writer, options); + + } catch (JSONException e) { + } + + options.remove("recordIndex"); + } + return false; } } } diff --git a/src/main/java/com/metaweb/gridworks/model/ColumnModel.java b/src/main/java/com/metaweb/gridworks/model/ColumnModel.java index 0fa2e9ad9..31095b6f0 100644 --- a/src/main/java/com/metaweb/gridworks/model/ColumnModel.java +++ b/src/main/java/com/metaweb/gridworks/model/ColumnModel.java @@ -28,7 +28,6 @@ public class ColumnModel implements Jsonizable { transient protected Map _cellIndexToColumn; transient protected List _rootColumnGroups; transient protected List _columnNames; - transient boolean _hasDependentRows; public ColumnModel() { internalInitialize(); @@ -129,8 +128,6 @@ public class ColumnModel implements Jsonizable { writer.object(); - writer.key("hasDependentRows"); writer.value(_hasDependentRows); - writer.key("columns"); writer.array(); for (Column column : columns) { diff --git a/src/main/java/com/metaweb/gridworks/model/RecordModel.java b/src/main/java/com/metaweb/gridworks/model/RecordModel.java index 8fa38872d..0676be70f 100644 --- a/src/main/java/com/metaweb/gridworks/model/RecordModel.java +++ b/src/main/java/com/metaweb/gridworks/model/RecordModel.java @@ -4,10 +4,15 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Properties; +import org.json.JSONException; +import org.json.JSONWriter; + +import com.metaweb.gridworks.Jsonizable; import com.metaweb.gridworks.expr.ExpressionUtils; -public class RecordModel { +public class RecordModel implements Jsonizable { final static public class CellDependency { final public int rowIndex; final public int cellIndex; @@ -52,6 +57,14 @@ public class RecordModel { return null; } + synchronized public void write(JSONWriter writer, Properties options) + throws JSONException { + + writer.object(); + writer.key("hasRecords"); writer.value(_records.size() < _rowDependencies.size()); + writer.endObject(); + } + static protected class KeyedGroup { int[] cellIndices; int keyCellIndex; @@ -110,8 +123,6 @@ public class RecordModel { } } Collections.sort(rowDependency.contextRows); - - columnModel._hasDependentRows = true; } else { rowDependency.recordIndex = recordIndex++; } diff --git a/src/main/webapp/scripts/project.js b/src/main/webapp/scripts/project.js index 66780562b..d94f34c70 100644 --- a/src/main/webapp/scripts/project.js +++ b/src/main/webapp/scripts/project.js @@ -141,11 +141,10 @@ Gridworks.reinitializeProjectData = function(f) { }, "/command/get-models?" + $.param({ project: theProject.id }), null, function(data) { - theProject.columnModel = data.columnModel; - theProject.protograph = data.protograph; - - for (var i = 0; i < theProject.columnModel.columns.length; i++) { - theProject.columnModel.columns[i].collapsed = false; + for (var n in data) { + if (data.hasOwnProperty(n)) { + theProject[n] = data[n]; + } } }, f diff --git a/src/main/webapp/scripts/project/browsing-engine.js b/src/main/webapp/scripts/project/browsing-engine.js index 755196f15..1f1662f1c 100644 --- a/src/main/webapp/scripts/project/browsing-engine.js +++ b/src/main/webapp/scripts/project/browsing-engine.js @@ -60,6 +60,13 @@ BrowsingEngine.prototype._initializeUI = function() { '

by choosing a facet or filter method from the menus at the top of each column.

' + '

Not sure how to get started? Watch these screencasts.

' + '' + + '
' + + 'Browse by ' + + '' + + '' + + '' + + '' + + '
' + '
' + '
' + ' refreshing facets ...' + @@ -76,9 +83,6 @@ BrowsingEngine.prototype._initializeUI = function() { 'Remove All' + '' + '' + - '' + - ' show dependent rows' + - '' + '
' + '' + '
    ' @@ -92,7 +96,11 @@ BrowsingEngine.prototype._initializeUI = function() { }); this._elmts.facets.disableSelection(); - this._elmts.includeDependentRowsCheck.change(function() { + $("#browsing-panel-mode-" + + (theProject.recordModel.hasRecords ? 'record-based' : 'row-based')).attr("checked", "checked"); + + this._elmts.modeSelectors.buttonset(); + this._elmts.modeSelectors.find("input").change(function() { Gridworks.update({ engineChanged: true }); }); @@ -119,7 +127,7 @@ BrowsingEngine.prototype._updateFacetOrder = function() { BrowsingEngine.prototype.getJSON = function(keepUnrestrictedFacets, except) { var a = { facets: [], - includeDependent: this._elmts.includeDependentRowsCheck[0].checked + mode: this._elmts.modeSelectors.find("input:checked")[0].value }; for (var i = 0; i < this._facets.length; i++) { var facet = this._facets[i]; @@ -212,12 +220,6 @@ BrowsingEngine.prototype.update = function(onDone) { self._elmts.header.show(); self._elmts.controls.css("visibility", "visible"); - if (theProject.columnModel.hasDependentRows) { - self._elmts.dependentRowControls.show(); - } else { - self._elmts.dependentRowControls.hide(); - } - self.resize(); } else { self._elmts.help.show(); diff --git a/src/main/webapp/scripts/views/data-table-view.js b/src/main/webapp/scripts/views/data-table-view.js index c9d2e78de..e339cf0f9 100644 --- a/src/main/webapp/scripts/views/data-table-view.js +++ b/src/main/webapp/scripts/views/data-table-view.js @@ -105,7 +105,10 @@ DataTableView.prototype._renderPagingControls = function(pageSizeControls, pagin for (var i = 0; i < sizes.length; i++) { renderPageSize(i); } - $(' rows').appendTo(pageSizeControls); + + $('') + .text(theProject.rowModel.mode == "record-based" ? ' records' : ' rows') + .appendTo(pageSizeControls); }; DataTableView.prototype._renderDataTable = function(table) { diff --git a/src/main/webapp/styles/project/browsing.css b/src/main/webapp/styles/project/browsing.css index c350f47de..574c606aa 100644 --- a/src/main/webapp/styles/project/browsing.css +++ b/src/main/webapp/styles/project/browsing.css @@ -1,3 +1,15 @@ +.browsing-panel-modes { + margin: 1em 0; + text-align: center; +} +.browsing-panel-modes .ui-button .ui-button-text { + line-height: 1.0; + text-decoration: line-through; +} +.browsing-panel-modes .ui-button.ui-state-active .ui-button-text { + text-decoration: none; +} + .browsing-panel-header { position: relative; display: none; @@ -20,6 +32,7 @@ .browsing-panel-indicator img { vertical-align: text-top; } + .browsing-panel-controls { visibility: hidden; }