![David Huynh](/assets/img/avatar_default.png)
git-svn-id: http://google-refine.googlecode.com/svn/trunk@104 7d457c2a-affb-35e4-300a-418c747d4874
472 lines
18 KiB
JavaScript
472 lines
18 KiB
JavaScript
function DataTableColumnHeaderUI(dataTableView, column, columnIndex, td) {
|
|
this._dataTableView = dataTableView;
|
|
this._column = column;
|
|
this._columnIndex = columnIndex;
|
|
this._td = td;
|
|
|
|
this._render();
|
|
}
|
|
|
|
DataTableColumnHeaderUI.prototype._render = function() {
|
|
var self = this;
|
|
var td = this._td;
|
|
|
|
var headerTable = document.createElement("table");
|
|
$(headerTable).addClass("column-header-layout").attr("cellspacing", "0").attr("cellpadding", "0").attr("width", "100%").appendTo(td);
|
|
|
|
var headerTableRow = headerTable.insertRow(0);
|
|
var headerLeft = headerTableRow.insertCell(0);
|
|
var headerRight = headerTableRow.insertCell(1);
|
|
|
|
$('<span></span>').html(this._column.headerLabel).appendTo(headerLeft);
|
|
|
|
$(headerRight).attr("width", "1%");
|
|
$('<img src="/images/menu-dropdown.png" />').addClass("column-header-menu").appendTo(headerRight).click(function() {
|
|
self._createMenuForColumnHeader(this);
|
|
});
|
|
};
|
|
|
|
DataTableColumnHeaderUI.prototype._createMenuForColumnHeader = function(elmt) {
|
|
self = this;
|
|
MenuSystem.createAndShowStandardMenu([
|
|
{
|
|
label: "Edit",
|
|
submenu: [
|
|
{ "heading" : "Cell Content Transformations" },
|
|
{
|
|
label: "To Titlecase",
|
|
click: function() { self._doTextTransform("toTitlecase(value)"); }
|
|
},
|
|
{
|
|
label: "To Uppercase",
|
|
click: function() { self._doTextTransform("toUppercase(value)"); }
|
|
},
|
|
{
|
|
label: "To Lowercase",
|
|
click: function() { self._doTextTransform("toLowercase(value)"); }
|
|
},
|
|
{},
|
|
{
|
|
label: "Custom Expression ...",
|
|
click: function() { self._doTextTransformPrompt(); }
|
|
},
|
|
{ "heading" : "Column Operations" },
|
|
{
|
|
label: "Add Column Based on This Column ...",
|
|
click: function() { self._doAddColumn("value"); }
|
|
},
|
|
{
|
|
label: "Remove This Column",
|
|
click: function() { self._doRemoveColumn(); }
|
|
},
|
|
{ "heading" : "Advanced Transformations" },
|
|
{
|
|
label: "Split Multi-Value Cells ...",
|
|
click: function() { self._doSplitMultiValueCells(); }
|
|
},
|
|
{
|
|
label: "Join Multi-Value Cells ...",
|
|
click: function() { self._doJoinMultiValueCells(); }
|
|
}
|
|
]
|
|
},
|
|
{
|
|
label: "Filter",
|
|
tooltip: "Filter rows by this column's cell content or characteristics",
|
|
submenu: [
|
|
{
|
|
label: "Text Facet",
|
|
click: function() {
|
|
ui.browsingEngine.addFacet(
|
|
"list",
|
|
{
|
|
"name" : self._column.headerLabel,
|
|
"columnName" : self._column.headerLabel,
|
|
"expression" : "value"
|
|
}
|
|
);
|
|
}
|
|
},
|
|
{
|
|
label: "Custom Text Facet ...",
|
|
click: function() { self._doFilterByExpressionPrompt("value", "list"); }
|
|
},
|
|
{},
|
|
{
|
|
label: "Numeric Facet",
|
|
click: function() {
|
|
ui.browsingEngine.addFacet(
|
|
"range",
|
|
{
|
|
"name" : self._column.headerLabel,
|
|
"columnName" : self._column.headerLabel,
|
|
"expression" : "value",
|
|
"mode" : "range",
|
|
"min" : 0,
|
|
"max" : 1
|
|
},
|
|
{
|
|
}
|
|
);
|
|
}
|
|
},
|
|
{
|
|
label: "Custom Numeric Facet ...",
|
|
click: function() { self._doFilterByExpressionPrompt("value", "range"); }
|
|
},
|
|
{},
|
|
{
|
|
label: "Text Search",
|
|
click: function() {
|
|
ui.browsingEngine.addFacet(
|
|
"text",
|
|
{
|
|
"name" : self._column.headerLabel,
|
|
"columnName" : self._column.headerLabel,
|
|
"mode" : "text",
|
|
"caseSensitive" : false
|
|
}
|
|
);
|
|
}
|
|
},
|
|
{
|
|
label: "Regular Expression Search",
|
|
click: function() {
|
|
ui.browsingEngine.addFacet(
|
|
"text",
|
|
{
|
|
"name" : self._column.headerLabel + " (regex)",
|
|
"columnName" : self._column.headerLabel,
|
|
"mode" : "regex",
|
|
"caseSensitive" : true
|
|
}
|
|
);
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
label: "View",
|
|
tooltip: "Collapse/expand columns to make viewing the data more convenient",
|
|
submenu: [
|
|
{
|
|
label: "Collapse This Column",
|
|
click: function() {
|
|
theProject.columnModel.columns[self._columnIndex].collapsed = true;
|
|
self._dataTableView.render();
|
|
}
|
|
},
|
|
{
|
|
label: "Collapse All Other Columns",
|
|
click: function() {
|
|
for (var i = 0; i < theProject.columnModel.columns.length; i++) {
|
|
if (i != self._columnIndex) {
|
|
theProject.columnModel.columns[i].collapsed = true;
|
|
}
|
|
}
|
|
self._dataTableView.render();
|
|
}
|
|
},
|
|
{
|
|
label: "Collapse All Columns To Right",
|
|
click: function() {
|
|
for (var i = self._columnIndex + 1; i < theProject.columnModel.columns.length; i++) {
|
|
theProject.columnModel.columns[i].collapsed = true;
|
|
}
|
|
self._dataTableView.render();
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{},
|
|
{
|
|
label: "Reconcile",
|
|
tooltip: "Match this column's cells to topics on Freebase",
|
|
submenu: [
|
|
{
|
|
label: "Start Reconciling ...",
|
|
tooltip: "Reconcile text in this column with topics on Freebase",
|
|
click: function() {
|
|
self._doReconcile();
|
|
}
|
|
},
|
|
{},
|
|
{
|
|
label: "Approve Best Candidates",
|
|
tooltip: "Approve best reconciliaton candidate per cell in this column for all current filtered rows",
|
|
click: function() {
|
|
self._doApproveBestCandidates();
|
|
}
|
|
},
|
|
{
|
|
label: "Approve As New Topics",
|
|
tooltip: "Set to create new topics for cells in this column for all current filtered rows",
|
|
click: function() {
|
|
self._doApproveNewTopics();
|
|
}
|
|
},
|
|
{
|
|
label: "Discard Reconciliation Results",
|
|
tooltip: "Discard reconciliaton results in this column for all current filtered rows",
|
|
click: function() {
|
|
self._doDiscardReconResults();
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
label: "Reconcile Filter",
|
|
tooltip: "Match this column's cells to topics on Freebase",
|
|
submenu: [
|
|
{
|
|
label: "By Judgment",
|
|
click: function() {
|
|
ui.browsingEngine.addFacet(
|
|
"list",
|
|
{
|
|
"name" : self._column.headerLabel + ": judgment",
|
|
"columnName" : self._column.headerLabel,
|
|
"expression" : "cell.recon.judgment"
|
|
},
|
|
{
|
|
"scroll" : false
|
|
}
|
|
);
|
|
}
|
|
},
|
|
{},
|
|
{
|
|
label: "Best Candidate's Relevance Score",
|
|
click: function() {
|
|
ui.browsingEngine.addFacet(
|
|
"range",
|
|
{
|
|
"name" : self._column.headerLabel + ": best candidate's relevance score",
|
|
"columnName" : self._column.headerLabel,
|
|
"expression" : "cell.recon.best.score",
|
|
"mode" : "range"
|
|
},
|
|
{
|
|
}
|
|
);
|
|
}
|
|
},
|
|
{
|
|
label: "Best Candidate's Type Match",
|
|
click: function() {
|
|
ui.browsingEngine.addFacet(
|
|
"list",
|
|
{
|
|
"name" : self._column.headerLabel + ": best candidate's type match",
|
|
"columnName" : self._column.headerLabel,
|
|
"expression" : "cell.recon.features.typeMatch"
|
|
},
|
|
{
|
|
"scroll" : false
|
|
}
|
|
);
|
|
}
|
|
},
|
|
{
|
|
label: "Best Candidate's Name Match",
|
|
click: function() {
|
|
ui.browsingEngine.addFacet(
|
|
"list",
|
|
{
|
|
"name" : self._column.headerLabel + ": best candidate's name match",
|
|
"columnName" : self._column.headerLabel,
|
|
"expression" : "cell.recon.features.nameMatch"
|
|
},
|
|
{
|
|
"scroll" : false
|
|
}
|
|
);
|
|
}
|
|
},
|
|
{},
|
|
{
|
|
label: "Best Candidate's Name Edit Distance",
|
|
click: function() {
|
|
ui.browsingEngine.addFacet(
|
|
"range",
|
|
{
|
|
"name" : self._column.headerLabel + ": best candidate's name edit distance",
|
|
"columnName" : self._column.headerLabel,
|
|
"expression" : "cell.recon.features.nameLevenshtein",
|
|
"mode" : "range"
|
|
},
|
|
{
|
|
}
|
|
);
|
|
}
|
|
},
|
|
{
|
|
label: "Best Candidate's Name Word Similarity",
|
|
click: function() {
|
|
ui.browsingEngine.addFacet(
|
|
"range",
|
|
{
|
|
"name" : self._column.headerLabel + ": best candidate's name word similarity",
|
|
"columnName" : self._column.headerLabel,
|
|
"expression" : "cell.recon.features.nameWordDistance",
|
|
"mode" : "range"
|
|
},
|
|
{
|
|
}
|
|
);
|
|
}
|
|
},
|
|
{},
|
|
{
|
|
label: "Best Candidate's Types",
|
|
click: function() {
|
|
ui.browsingEngine.addFacet(
|
|
"list",
|
|
{
|
|
"name" : self._column.headerLabel + ": best candidate's types",
|
|
"columnName" : self._column.headerLabel,
|
|
"expression" : "cell.recon.best.type"
|
|
}
|
|
);
|
|
}
|
|
}
|
|
]
|
|
}
|
|
], elmt, { width: "120px", horizontal: false });
|
|
};
|
|
|
|
DataTableColumnHeaderUI.prototype._doFilterByExpressionPrompt = function(expression, type) {
|
|
var self = this;
|
|
DataTableView.promptExpressionOnVisibleRows(
|
|
this._column,
|
|
"Custom Filter on " + this._column.headerLabel,
|
|
expression,
|
|
function(expression) {
|
|
var config = {
|
|
"name" : self._column.headerLabel + ": " + expression,
|
|
"columnName" : self._column.headerLabel,
|
|
"expression" : expression
|
|
};
|
|
if (type == "range") {
|
|
config.mode = "range";
|
|
}
|
|
|
|
ui.browsingEngine.addFacet(type, config);
|
|
}
|
|
);
|
|
};
|
|
|
|
DataTableColumnHeaderUI.prototype._doTextTransform = function(expression) {
|
|
this._dataTableView.doPostThenUpdate(
|
|
"do-text-transform",
|
|
{ columnName: this._column.headerLabel, expression: expression }
|
|
);
|
|
};
|
|
|
|
DataTableColumnHeaderUI.prototype._doTextTransformPrompt = function() {
|
|
var self = this;
|
|
DataTableView.promptExpressionOnVisibleRows(
|
|
this._column,
|
|
"Custom Transform on " + this._column.headerLabel,
|
|
"value",
|
|
function(expression) {
|
|
self._doTextTransform(expression);
|
|
}
|
|
);
|
|
};
|
|
|
|
DataTableColumnHeaderUI.prototype._doReconcile = function() {
|
|
var self = this;
|
|
$.post(
|
|
"/command/guess-types-of-column?" + $.param({ project: theProject.id, columnName: this._column.headerLabel }),
|
|
null,
|
|
function(data) {
|
|
new ReconDialog(self._column, data.code == "ok" ? data.types : []);
|
|
},
|
|
"json"
|
|
);
|
|
|
|
};
|
|
|
|
DataTableColumnHeaderUI.prototype._doDiscardReconResults = function() {
|
|
this._dataTableView.doPostThenUpdate(
|
|
"discard-reconcile",
|
|
{ columnName: this._column.headerLabel }
|
|
);
|
|
};
|
|
|
|
DataTableColumnHeaderUI.prototype._doApproveBestCandidates = function() {
|
|
this._dataTableView.doPostThenUpdate(
|
|
"approve-reconcile",
|
|
{ columnName: this._column.headerLabel }
|
|
);
|
|
};
|
|
|
|
DataTableColumnHeaderUI.prototype._doApproveNewTopics = function() {
|
|
this._dataTableView.doPostThenUpdate(
|
|
"approve-new-reconcile",
|
|
{ columnName: this._column.headerLabel }
|
|
);
|
|
};
|
|
|
|
DataTableColumnHeaderUI.prototype._doAddColumn = function(initialExpression) {
|
|
var self = this;
|
|
DataTableView.promptExpressionOnVisibleRows(
|
|
this._column,
|
|
"Add Column Based on Column " + this._column.headerLabel,
|
|
initialExpression,
|
|
function(expression) {
|
|
var headerLabel = window.prompt("Enter header label for new column:");
|
|
if (headerLabel != null) {
|
|
self._dataTableView.doPostThenUpdate(
|
|
"add-column",
|
|
{
|
|
baseColumnName: self._column.headerLabel,
|
|
expression: expression,
|
|
headerLabel: headerLabel,
|
|
columnInsertIndex: self._columnIndex + 1
|
|
},
|
|
true
|
|
);
|
|
}
|
|
}
|
|
);
|
|
};
|
|
|
|
DataTableColumnHeaderUI.prototype._doRemoveColumn = function() {
|
|
this._dataTableView.doPostThenUpdate(
|
|
"remove-column",
|
|
{ columnName: this._column.headerLabel },
|
|
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",
|
|
{
|
|
columnName: this._column.headerLabel,
|
|
keyColumnName: theProject.columnModel.keyColumnName,
|
|
separator: separator
|
|
}
|
|
);
|
|
}
|
|
};
|
|
|
|
DataTableColumnHeaderUI.prototype._doSplitMultiValueCells = function() {
|
|
var separator = window.prompt("What separator currently separates the values?", ", ");
|
|
if (separator != null) {
|
|
this._dataTableView.doPostThenUpdate(
|
|
"split-multi-value-cells",
|
|
{
|
|
columnName: this._column.headerLabel,
|
|
keyColumnName: theProject.columnModel.keyColumnName,
|
|
separator: separator,
|
|
mode: "plain"
|
|
}
|
|
);
|
|
}
|
|
};
|