Cleaned up code formatting in .js, .html, .vt, .css, .less files.

git-svn-id: http://google-refine.googlecode.com/svn/trunk@2185 7d457c2a-affb-35e4-300a-418c747d4874
This commit is contained in:
David Huynh 2011-08-04 20:37:14 +00:00
parent c9db107d7e
commit bad7266534
90 changed files with 10939 additions and 10920 deletions

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,89 +29,89 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
function init() {
Packages.com.google.refine.freebase.oauth.FreebaseProvider.register();
Packages.com.google.refine.freebase.oauth.FreebaseProvider.register();
var RS = Packages.com.google.refine.RefineServlet;
RS.registerClassMapping(
"com.google.refine.model.changes.DataExtensionChange",
"com.google.refine.freebase.model.changes.DataExtensionChange");
RS.registerClassMapping(
"com.google.refine.operations.SaveProtographOperation$ProtographChange",
"com.google.refine.freebase.operations.SaveProtographOperation$ProtographChange");
var RS = Packages.com.google.refine.RefineServlet;
RS.registerClassMapping(
"com.google.refine.model.changes.DataExtensionChange",
"com.google.refine.freebase.model.changes.DataExtensionChange");
RS.registerClassMapping(
"com.google.refine.operations.SaveProtographOperation$ProtographChange",
"com.google.refine.freebase.operations.SaveProtographOperation$ProtographChange");
// TODO(dfhuynh): Temporary hack until we know how the core module can resolve our module's classes
RS.cacheClass(Packages.com.google.refine.freebase.model.changes.DataExtensionChange);
RS.cacheClass(Packages.com.google.refine.freebase.operations.SaveProtographOperation$ProtographChange);
// TODO(dfhuynh): Temporary hack until we know how the core module can resolve our module's classes
RS.cacheClass(Packages.com.google.refine.freebase.model.changes.DataExtensionChange);
RS.cacheClass(Packages.com.google.refine.freebase.operations.SaveProtographOperation$ProtographChange);
RS.registerCommand(module, "extend-data", new Packages.com.google.refine.freebase.commands.ExtendDataCommand());
RS.registerCommand(module, "preview-extend-data", new Packages.com.google.refine.freebase.commands.PreviewExtendDataCommand());
RS.registerCommand(module, "extend-data", new Packages.com.google.refine.freebase.commands.ExtendDataCommand());
RS.registerCommand(module, "preview-extend-data", new Packages.com.google.refine.freebase.commands.PreviewExtendDataCommand());
RS.registerCommand(module, "preview-protograph", new Packages.com.google.refine.freebase.commands.PreviewProtographCommand());
RS.registerCommand(module, "save-protograph", new Packages.com.google.refine.freebase.commands.SaveProtographCommand());
RS.registerCommand(module, "preview-protograph", new Packages.com.google.refine.freebase.commands.PreviewProtographCommand());
RS.registerCommand(module, "save-protograph", new Packages.com.google.refine.freebase.commands.SaveProtographCommand());
RS.registerCommand(module, "check-authorization", new Packages.com.google.refine.freebase.commands.auth.CheckAuthorizationCommand());
RS.registerCommand(module, "authorize", new Packages.com.google.refine.freebase.commands.auth.AuthorizeCommand());
RS.registerCommand(module, "deauthorize", new Packages.com.google.refine.freebase.commands.auth.DeAuthorizeCommand());
RS.registerCommand(module, "user-badges", new Packages.com.google.refine.freebase.commands.auth.GetUserBadgesCommand());
RS.registerCommand(module, "check-authorization", new Packages.com.google.refine.freebase.commands.auth.CheckAuthorizationCommand());
RS.registerCommand(module, "authorize", new Packages.com.google.refine.freebase.commands.auth.AuthorizeCommand());
RS.registerCommand(module, "deauthorize", new Packages.com.google.refine.freebase.commands.auth.DeAuthorizeCommand());
RS.registerCommand(module, "user-badges", new Packages.com.google.refine.freebase.commands.auth.GetUserBadgesCommand());
RS.registerCommand(module, "upload-data", new Packages.com.google.refine.freebase.commands.UploadDataCommand());
RS.registerCommand(module, "import-qa-data", new Packages.com.google.refine.freebase.commands.ImportQADataCommand());
RS.registerCommand(module, "mqlread", new Packages.com.google.refine.freebase.commands.MQLReadCommand());
RS.registerCommand(module, "mqlwrite", new Packages.com.google.refine.freebase.commands.MQLWriteCommand());
RS.registerCommand(module, "upload-data", new Packages.com.google.refine.freebase.commands.UploadDataCommand());
RS.registerCommand(module, "import-qa-data", new Packages.com.google.refine.freebase.commands.ImportQADataCommand());
RS.registerCommand(module, "mqlread", new Packages.com.google.refine.freebase.commands.MQLReadCommand());
RS.registerCommand(module, "mqlwrite", new Packages.com.google.refine.freebase.commands.MQLWriteCommand());
var OR = Packages.com.google.refine.operations.OperationRegistry;
var OR = Packages.com.google.refine.operations.OperationRegistry;
OR.registerOperation(module, "extend-data", Packages.com.google.refine.freebase.operations.ExtendDataOperation);
OR.registerOperation(module, "import-qa-data", Packages.com.google.refine.freebase.operations.ImportQADataOperation);
OR.registerOperation(module, "save-protograph", Packages.com.google.refine.freebase.operations.SaveProtographOperation); // for backward compatibility
OR.registerOperation(module, "save-schema-alignment-skeleton", Packages.com.google.refine.freebase.operations.SaveProtographOperation);
OR.registerOperation(module, "extend-data", Packages.com.google.refine.freebase.operations.ExtendDataOperation);
OR.registerOperation(module, "import-qa-data", Packages.com.google.refine.freebase.operations.ImportQADataOperation);
OR.registerOperation(module, "save-protograph", Packages.com.google.refine.freebase.operations.SaveProtographOperation); // for backward compatibility
OR.registerOperation(module, "save-schema-alignment-skeleton", Packages.com.google.refine.freebase.operations.SaveProtographOperation);
var RC = Packages.com.google.refine.model.recon.ReconConfig;
var RC = Packages.com.google.refine.model.recon.ReconConfig;
RC.registerReconConfig(module, "strict", Packages.com.google.refine.freebase.model.recon.StrictReconConfig);
RC.registerReconConfig(module, "extend", Packages.com.google.refine.freebase.model.recon.DataExtensionReconConfig);
RC.registerReconConfig(module, "strict", Packages.com.google.refine.freebase.model.recon.StrictReconConfig);
RC.registerReconConfig(module, "extend", Packages.com.google.refine.freebase.model.recon.DataExtensionReconConfig);
var ER = Packages.com.google.refine.exporters.ExporterRegistry;
var ER = Packages.com.google.refine.exporters.ExporterRegistry;
ER.registerExporter("tripleloader", new Packages.com.google.refine.freebase.ProtographTransposeExporter.TripleLoaderExporter());
ER.registerExporter("mqlwrite", new Packages.com.google.refine.freebase.ProtographTransposeExporter.MqlwriteLikeExporter());
ER.registerExporter("tripleloader", new Packages.com.google.refine.freebase.ProtographTransposeExporter.TripleLoaderExporter());
ER.registerExporter("mqlwrite", new Packages.com.google.refine.freebase.ProtographTransposeExporter.MqlwriteLikeExporter());
var FCR = Packages.com.google.refine.grel.ControlFunctionRegistry;
var FCR = Packages.com.google.refine.grel.ControlFunctionRegistry;
FCR.registerFunction("mqlKeyQuote", new Packages.com.google.refine.freebase.expr.MqlKeyQuote());
FCR.registerFunction("mqlKeyUnquote", new Packages.com.google.refine.freebase.expr.MqlKeyUnquote());
FCR.registerFunction("mqlKeyQuote", new Packages.com.google.refine.freebase.expr.MqlKeyQuote());
FCR.registerFunction("mqlKeyUnquote", new Packages.com.google.refine.freebase.expr.MqlKeyUnquote());
Packages.com.google.refine.model.Project.
registerOverlayModel("freebaseProtograph", Packages.com.google.refine.freebase.protograph.Protograph);
Packages.com.google.refine.model.Project.
registerOverlayModel("freebaseProtograph", Packages.com.google.refine.freebase.protograph.Protograph);
ClientSideResourceManager.addPaths(
"project/scripts",
module,
[
"scripts/extension.js",
ClientSideResourceManager.addPaths(
"project/scripts",
module,
[
"scripts/extension.js",
"scripts/util/sign.js",
"scripts/util/freebase.js",
"scripts/util/sign.js",
"scripts/util/freebase.js",
"scripts/dialogs/freebase-loading-dialog.js",
"scripts/dialogs/extend-data-preview-dialog.js",
"scripts/dialogs/freebase-loading-dialog.js",
"scripts/dialogs/extend-data-preview-dialog.js",
"scripts/dialogs/schema-alignment/dialog.js",
"scripts/dialogs/schema-alignment/ui-node.js",
"scripts/dialogs/schema-alignment/ui-link.js"
]
);
"scripts/dialogs/schema-alignment/dialog.js",
"scripts/dialogs/schema-alignment/ui-node.js",
"scripts/dialogs/schema-alignment/ui-link.js"
]
);
ClientSideResourceManager.addPaths(
"project/styles",
module,
[
"styles/dialogs/freebase-loading-dialog.less",
"styles/dialogs/extend-data-preview-dialog.less",
"styles/dialogs/schema-alignment-dialog.less"
]
);
ClientSideResourceManager.addPaths(
"project/styles",
module,
[
"styles/dialogs/freebase-loading-dialog.less",
"styles/dialogs/extend-data-preview-dialog.less",
"styles/dialogs/schema-alignment-dialog.less"
]
);
}

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,368 +29,368 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
function ExtendDataPreviewDialog(column, columnIndex, rowIndices, onDone) {
this._column = column;
this._columnIndex = columnIndex;
this._rowIndices = rowIndices;
this._onDone = onDone;
this._extension = { properties: [] };
this._column = column;
this._columnIndex = columnIndex;
this._rowIndices = rowIndices;
this._onDone = onDone;
this._extension = { properties: [] };
var self = this;
this._dialog = $(DOM.loadHTML("freebase", "scripts/dialogs/extend-data-preview-dialog.html"));
this._elmts = DOM.bind(this._dialog);
this._elmts.dialogHeader.text("Add Columns from Freebase Based on Column " + column.name);
this._elmts.resetButton.click(function() {
self._extension.properties = [];
self._update();
});
var self = this;
this._dialog = $(DOM.loadHTML("freebase", "scripts/dialogs/extend-data-preview-dialog.html"));
this._elmts = DOM.bind(this._dialog);
this._elmts.dialogHeader.text("Add Columns from Freebase Based on Column " + column.name);
this._elmts.resetButton.click(function() {
self._extension.properties = [];
self._update();
});
this._elmts.okButton.click(function() {
if (self._extension.properties.length === 0) {
alert("Please add some properties first.");
} else {
DialogSystem.dismissUntil(self._level - 1);
self._onDone(self._extension);
}
});
this._elmts.cancelButton.click(function() {
DialogSystem.dismissUntil(self._level - 1);
});
this._elmts.okButton.click(function() {
if (self._extension.properties.length === 0) {
alert("Please add some properties first.");
} else {
DialogSystem.dismissUntil(self._level - 1);
self._onDone(self._extension);
}
});
this._elmts.cancelButton.click(function() {
DialogSystem.dismissUntil(self._level - 1);
});
var dismissBusy = DialogSystem.showBusy();
var type = (column.reconConfig) && (column.reconConfig.type) ? column.reconConfig.type.id : "/common/topic";
var dismissBusy = DialogSystem.showBusy();
var type = (column.reconConfig) && (column.reconConfig.type) ? column.reconConfig.type.id : "/common/topic";
ExtendDataPreviewDialog.getAllProperties(type, function(properties) {
dismissBusy();
self._show(properties);
});
ExtendDataPreviewDialog.getAllProperties(type, function(properties) {
dismissBusy();
self._show(properties);
});
}
ExtendDataPreviewDialog.getAllProperties = function(typeID, onDone) {
var done = false;
var done = false;
$.getJSON(
Refine.refineHelperService + "/get_properties_of_type?type=" + typeID + "&callback=?",
null,
function(data) {
if (done) return;
done = true;
$.getJSON(
Refine.refineHelperService + "/get_properties_of_type?type=" + typeID + "&callback=?",
null,
function(data) {
if (done) return;
done = true;
var allProperties = [];
for (var i = 0; i < data.properties.length; i++) {
var property = data.properties[i];
var property2 = {
id: property.id,
name: property.name
};
if ("id2" in property) {
property2.expected = property.schema2;
property2.properties = [{
id: property.id2,
name: property.name2,
expected: property.expects
}];
} else {
property2.expected = property.expects;
}
allProperties.push(property2);
}
allProperties.sort(function(a, b) { return a.name.localeCompare(b.name); });
onDone(allProperties);
var allProperties = [];
for (var i = 0; i < data.properties.length; i++) {
var property = data.properties[i];
var property2 = {
id: property.id,
name: property.name
};
if ("id2" in property) {
property2.expected = property.schema2;
property2.properties = [{
id: property.id2,
name: property.name2,
expected: property.expects
}];
} else {
property2.expected = property.expects;
}
);
allProperties.push(property2);
}
allProperties.sort(function(a, b) { return a.name.localeCompare(b.name); });
window.setTimeout(function() {
if (done) return;
onDone(allProperties);
}
);
done = true;
onDone([]);
}, 7000); // time to give up?
window.setTimeout(function() {
if (done) return;
done = true;
onDone([]);
}, 7000); // time to give up?
};
ExtendDataPreviewDialog.prototype._show = function(properties) {
this._level = DialogSystem.showDialog(this._dialog);
this._level = DialogSystem.showDialog(this._dialog);
var n = this._elmts.suggestedPropertyContainer.offset().top +
this._elmts.suggestedPropertyContainer.outerHeight(true) -
this._elmts.addPropertyInput.offset().top;
var n = this._elmts.suggestedPropertyContainer.offset().top +
this._elmts.suggestedPropertyContainer.outerHeight(true) -
this._elmts.addPropertyInput.offset().top;
this._elmts.previewContainer.height(Math.floor(n));
this._elmts.previewContainer.height(Math.floor(n));
var self = this;
var container = this._elmts.suggestedPropertyContainer;
var renderSuggestedProperty = function(property) {
var label = ("properties" in property) ? (property.name + " &raquo; " + property.properties[0].name) : property.name;
var div = $('<div>').addClass("suggested-property").appendTo(container);
var self = this;
var container = this._elmts.suggestedPropertyContainer;
var renderSuggestedProperty = function(property) {
var label = ("properties" in property) ? (property.name + " &raquo; " + property.properties[0].name) : property.name;
var div = $('<div>').addClass("suggested-property").appendTo(container);
$('<a>')
.attr("href", "javascript:{}")
.html(label)
.appendTo(div)
.click(function() {
self._addProperty(property);
});
};
for (var i = 0; i < properties.length; i++) {
renderSuggestedProperty(properties[i]);
}
var suggestConfig = {
type: '/type/property'
};
if ((this._column.reconConfig) && (this._column.reconConfig.type)) {
suggestConfig.ac_param = { schema: this._column.reconConfig.type.id };
}
this._elmts.addPropertyInput.suggestP(suggestConfig).bind("fb-select", function(evt, data) {
var expected = data.expected_type;
self._addProperty({
id : data.id,
name: data.name,
expected: {
id: expected.id,
name: expected.name
}
});
$('<a>')
.attr("href", "javascript:{}")
.html(label)
.appendTo(div)
.click(function() {
self._addProperty(property);
});
};
for (var i = 0; i < properties.length; i++) {
renderSuggestedProperty(properties[i]);
}
var suggestConfig = {
type: '/type/property'
};
if ((this._column.reconConfig) && (this._column.reconConfig.type)) {
suggestConfig.ac_param = { schema: this._column.reconConfig.type.id };
}
this._elmts.addPropertyInput.suggestP(suggestConfig).bind("fb-select", function(evt, data) {
var expected = data.expected_type;
self._addProperty({
id : data.id,
name: data.name,
expected: {
id: expected.id,
name: expected.name
}
});
});
};
ExtendDataPreviewDialog.prototype._update = function() {
this._elmts.previewContainer.empty().text("Querying Freebase ...");
this._elmts.previewContainer.empty().text("Querying Freebase ...");
var self = this;
var params = {
project: theProject.id,
columnName: this._column.name
};
var self = this;
var params = {
project: theProject.id,
columnName: this._column.name
};
$.post(
"/command/freebase/preview-extend-data?" + $.param(params),
{
rowIndices: JSON.stringify(this._rowIndices),
extension: JSON.stringify(this._extension)
},
function(data) {
self._renderPreview(data);
},
"json"
);
$.post(
"/command/freebase/preview-extend-data?" + $.param(params),
{
rowIndices: JSON.stringify(this._rowIndices),
extension: JSON.stringify(this._extension)
},
function(data) {
self._renderPreview(data);
},
"json"
);
};
ExtendDataPreviewDialog.prototype._addProperty = function(p) {
var addSeveralToList = function(properties, oldProperties) {
for (var i = 0; i < properties.length; i++) {
addToList(properties[i], oldProperties);
}
};
var addToList = function(property, oldProperties) {
for (var i = 0; i < oldProperties.length; i++) {
var oldProperty = oldProperties[i];
if (oldProperty.id == property.id) {
if ("included" in property) {
oldProperty.included = "included" in oldProperty ?
(oldProperty.included || property.included) :
property.included;
}
if ("properties" in property) {
if ("properties" in oldProperty) {
addSeveralToList(property.properties, oldProperty.properties);
} else {
oldProperty.properties = property.properties;
}
}
return;
}
var addSeveralToList = function(properties, oldProperties) {
for (var i = 0; i < properties.length; i++) {
addToList(properties[i], oldProperties);
}
};
var addToList = function(property, oldProperties) {
for (var i = 0; i < oldProperties.length; i++) {
var oldProperty = oldProperties[i];
if (oldProperty.id == property.id) {
if ("included" in property) {
oldProperty.included = "included" in oldProperty ?
(oldProperty.included || property.included) :
property.included;
}
oldProperties.push(property);
};
if ("properties" in property) {
if ("properties" in oldProperty) {
addSeveralToList(property.properties, oldProperty.properties);
} else {
oldProperty.properties = property.properties;
}
}
return;
}
}
addToList(p, this._extension.properties);
oldProperties.push(property);
};
this._update();
addToList(p, this._extension.properties);
this._update();
};
ExtendDataPreviewDialog.prototype._renderPreview = function(data) {
var self = this;
var container = this._elmts.previewContainer.empty();
if (data.code == "error") {
container.text("Error.");
return;
}
var self = this;
var container = this._elmts.previewContainer.empty();
if (data.code == "error") {
container.text("Error.");
return;
}
var table = $('<table>')[0];
var trHead = table.insertRow(table.rows.length);
$('<th>').appendTo(trHead).text(this._column.name);
var table = $('<table>')[0];
var trHead = table.insertRow(table.rows.length);
$('<th>').appendTo(trHead).text(this._column.name);
var renderColumnHeader = function(column) {
var th = $('<th>').appendTo(trHead);
var renderColumnHeader = function(column) {
var th = $('<th>').appendTo(trHead);
$('<span>').html(column.names.join(" &raquo; ")).appendTo(th);
$('<br>').appendTo(th);
$('<span>').html(column.names.join(" &raquo; ")).appendTo(th);
$('<br>').appendTo(th);
$('<a href="javascript:{}"></a>')
.text("remove")
.addClass("action")
.attr("title", "Remove this column")
.click(function() {
self._removeProperty(column.path);
}).appendTo(th);
$('<a href="javascript:{}"></a>')
.text("remove")
.addClass("action")
.attr("title", "Remove this column")
.click(function() {
self._removeProperty(column.path);
}).appendTo(th);
$('<a href="javascript:{}"></a>')
.text("constrain")
.addClass("action")
.attr("title", "Add constraints to this column")
.click(function() {
self._constrainProperty(column.path);
}).appendTo(th);
};
for (var c = 0; c < data.columns.length; c++) {
renderColumnHeader(data.columns[c]);
}
$('<a href="javascript:{}"></a>')
.text("constrain")
.addClass("action")
.attr("title", "Add constraints to this column")
.click(function() {
self._constrainProperty(column.path);
}).appendTo(th);
};
for (var c = 0; c < data.columns.length; c++) {
renderColumnHeader(data.columns[c]);
}
for (var r = 0; r < data.rows.length; r++) {
var tr = table.insertRow(table.rows.length);
var row = data.rows[r];
for (var r = 0; r < data.rows.length; r++) {
var tr = table.insertRow(table.rows.length);
var row = data.rows[r];
for (var c = 0; c < row.length; c++) {
var td = tr.insertCell(tr.cells.length);
var cell = row[c];
if (cell !== null) {
if ($.isPlainObject(cell)) {
$('<a>').attr("href", "http://www.freebase.com/view" + cell.id).text(cell.name).appendTo(td);
} else {
$('<span>').text(cell).appendTo(td);
}
}
for (var c = 0; c < row.length; c++) {
var td = tr.insertCell(tr.cells.length);
var cell = row[c];
if (cell !== null) {
if ($.isPlainObject(cell)) {
$('<a>').attr("href", "http://www.freebase.com/view" + cell.id).text(cell.name).appendTo(td);
} else {
$('<span>').text(cell).appendTo(td);
}
}
}
}
container.append(table);
container.append(table);
};
ExtendDataPreviewDialog.prototype._removeProperty = function(path) {
var removeFromList = function(path, index, properties) {
var id = path[index];
var removeFromList = function(path, index, properties) {
var id = path[index];
for (var i = properties.length - 1; i >= 0; i--) {
var property = properties[i];
if (property.id == id) {
if (index === path.length - 1) {
if ("included" in property) {
delete property.included;
}
} else if ("properties" in property && property.properties.length > 0) {
removeFromList(path, index + 1, property.properties);
}
if (!("properties" in property) || property.properties.length === 0) {
properties.splice(i, 1);
}
return;
}
for (var i = properties.length - 1; i >= 0; i--) {
var property = properties[i];
if (property.id == id) {
if (index === path.length - 1) {
if ("included" in property) {
delete property.included;
}
} else if ("properties" in property && property.properties.length > 0) {
removeFromList(path, index + 1, property.properties);
}
};
removeFromList(path, 0, this._extension.properties);
if (!("properties" in property) || property.properties.length === 0) {
properties.splice(i, 1);
}
this._update();
return;
}
}
};
removeFromList(path, 0, this._extension.properties);
this._update();
};
ExtendDataPreviewDialog.prototype._findProperty = function(path) {
var find = function(path, index, properties) {
var id = path[index];
var find = function(path, index, properties) {
var id = path[index];
for (var i = properties.length - 1; i >= 0; i--) {
var property = properties[i];
if (property.id == id) {
if (index === path.length - 1) {
return property;
} else if ("properties" in property && property.properties.length > 0) {
return find(path, index + 1, property.properties);
}
break;
}
for (var i = properties.length - 1; i >= 0; i--) {
var property = properties[i];
if (property.id == id) {
if (index === path.length - 1) {
return property;
} else if ("properties" in property && property.properties.length > 0) {
return find(path, index + 1, property.properties);
}
break;
}
}
return null;
};
return null;
};
return find(path, 0, this._extension.properties);
return find(path, 0, this._extension.properties);
};
ExtendDataPreviewDialog.prototype._constrainProperty = function(path) {
var self = this;
var property = this._findProperty(path);
var self = this;
var property = this._findProperty(path);
var frame = DialogSystem.createDialog();
frame.width("500px");
var frame = DialogSystem.createDialog();
frame.width("500px");
var header = $('<div></div>').addClass("dialog-header").text("Constrain " + path.join(" > ")).appendTo(frame);
var body = $('<div></div>').addClass("dialog-body").appendTo(frame);
var footer = $('<div></div>').addClass("dialog-footer").appendTo(frame);
var header = $('<div></div>').addClass("dialog-header").text("Constrain " + path.join(" > ")).appendTo(frame);
var body = $('<div></div>').addClass("dialog-body").appendTo(frame);
var footer = $('<div></div>').addClass("dialog-footer").appendTo(frame);
body.html(
'<div class="grid-layout layout-normal layout-full"><table>' +
'<tr><td>' +
'Enter MQL query constraints as JSON' +
'</td></tr>' +
'<tr><td>' +
'<textarea style="width: 100%; height: 300px; font-family: monospace;" bind="textarea"></textarea>' +
'</td></tr>' +
'</table></div>'
);
var bodyElmts = DOM.bind(body);
body.html(
'<div class="grid-layout layout-normal layout-full"><table>' +
'<tr><td>' +
'Enter MQL query constraints as JSON' +
'</td></tr>' +
'<tr><td>' +
'<textarea style="width: 100%; height: 300px; font-family: monospace;" bind="textarea"></textarea>' +
'</td></tr>' +
'</table></div>'
);
var bodyElmts = DOM.bind(body);
if ("constraints" in property) {
bodyElmts.textarea[0].value = JSON.stringify(property.constraints, null, 2);
} else {
bodyElmts.textarea[0].value = JSON.stringify({ "limit" : 10 }, null, 2);
if ("constraints" in property) {
bodyElmts.textarea[0].value = JSON.stringify(property.constraints, null, 2);
} else {
bodyElmts.textarea[0].value = JSON.stringify({ "limit" : 10 }, null, 2);
}
footer.html(
'<button class="button" bind="okButton">&nbsp;&nbsp;OK&nbsp;&nbsp;</button>' +
'<button class="button" bind="cancelButton">Cancel</button>'
);
var footerElmts = DOM.bind(footer);
var level = DialogSystem.showDialog(frame);
var dismiss = function() {
DialogSystem.dismissUntil(level - 1);
};
footerElmts.cancelButton.click(dismiss);
footerElmts.okButton.click(function() {
try {
var o = JSON.parse(bodyElmts.textarea[0].value);
if (o === undefined) {
alert("Please ensure that the JSON you enter is valid.");
return;
}
if ($.isArray(o) && o.length == 1) {
o = o[0];
}
if (!$.isPlainObject(o)) {
alert("The JSON you enter must be an object, that is, it is of this form { ... }.");
return;
}
property.constraints = o;
dismiss();
self._update();
} catch (e) {
//console.log(e);
}
});
footer.html(
'<button class="button" bind="okButton">&nbsp;&nbsp;OK&nbsp;&nbsp;</button>' +
'<button class="button" bind="cancelButton">Cancel</button>'
);
var footerElmts = DOM.bind(footer);
var level = DialogSystem.showDialog(frame);
var dismiss = function() {
DialogSystem.dismissUntil(level - 1);
};
footerElmts.cancelButton.click(dismiss);
footerElmts.okButton.click(function() {
try {
var o = JSON.parse(bodyElmts.textarea[0].value);
if (o === undefined) {
alert("Please ensure that the JSON you enter is valid.");
return;
}
if ($.isArray(o) && o.length == 1) {
o = o[0];
}
if (!$.isPlainObject(o)) {
alert("The JSON you enter must be an object, that is, it is of this form { ... }.");
return;
}
property.constraints = o;
dismiss();
self._update();
} catch (e) {
//console.log(e);
}
});
bodyElmts.textarea.focus();
bodyElmts.textarea.focus();
};

View File

@ -19,7 +19,8 @@
<tr><td>Source ID (optional)</td>
<td colspan="2"><input type="text" size="60" id="freebase-loading-source-id" bind="source_id" /></td>
</tr>
<tr><td colspan="3">
<tr>
<td colspan="3">
<p class="body-text">Note: Your data will only be loaded into
<a href="http://www.sandbox-freebase.com/" target="_blank">Sandbox</a>.
Sandbox is where everyone can experiment with Freebase technologies without disruption

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,218 +29,219 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
function FreebaseLoadingDialog() {
this._createDialog();
this._signedin = false;
this._createDialog();
this._signedin = false;
}
FreebaseLoadingDialog.prototype._createDialog = function() {
var self = this;
var dialog = $(DOM.loadHTML("freebase", "scripts/dialogs/freebase-loading-dialog.html"));
this._elmts = DOM.bind(dialog);
this._elmts.cancelButton.click(function() { self._dismiss(); });
var self = this;
var dialog = $(DOM.loadHTML("freebase", "scripts/dialogs/freebase-loading-dialog.html"));
this._elmts = DOM.bind(dialog);
this._elmts.cancelButton.click(function() { self._dismiss(); });
var provider = "www.freebase.com";
var authorization = this._elmts.authorization;
var loadButton = this._elmts.loadButton;
var provider = "www.freebase.com";
var authorization = this._elmts.authorization;
var loadButton = this._elmts.loadButton;
var check_authorization = function(cont) {
$.get("/command/freebase/check-authorization/" + provider, function(data) {
if ("status" in data && data.code == "/api/status/ok") {
authorization.html('Signed in as: <a target="_new" href="http://www.freebase.com/view/user/' + data.username + '">' + data.username + '</a> | <a href="javascript:{}" bind="signout">Sign Out</a>').show();
DOM.bind(authorization).signout.click(function() {
self._signedin = false;
loadButton.attr("disabled","disabled");
$("#freebase-loading-graph-selector-freebase").attr("disabled","disabled").button("refresh");
Sign.signout(check_authorization,provider);
});
loadButton.unbind().click(function() {
self._load();
});
var check_authorization = function(cont) {
$.get("/command/freebase/check-authorization/" + provider, function(data) {
if ("status" in data && data.code == "/api/status/ok") {
authorization.html('Signed in as: <a target="_new" href="http://www.freebase.com/view/user/' + data.username + '">' + data.username + '</a> | <a href="javascript:{}" bind="signout">Sign Out</a>').show();
DOM.bind(authorization).signout.click(function() {
self._signedin = false;
loadButton.attr("disabled","disabled");
$("#freebase-loading-graph-selector-freebase").attr("disabled","disabled").button("refresh");
Sign.signout(check_authorization,provider);
});
loadButton.unbind().click(function() {
self._load();
});
self._signedin = true;
$("#freebase-loading-source-name").keyup();
self._signedin = true;
$("#freebase-loading-source-name").keyup();
if (typeof cont == "function") cont(data);
if (typeof cont == "function") cont(data);
} else {
authorization.html('<a href="javascript:{}" bind="signin">Sign into Freebase</a> to enable loading').show();
self._signedin = false;
$("#freebase-loading-source-name").keyup();
DOM.bind(authorization).signin.click(function() {
Sign.signin(function() {
check_authorization(cont);
},provider);
});
}
},"json");
};
var make_topic = function(new_topic_id, topic_type, cont) {
var mql_query = [{
"create": "unless_exists",
"name": new_topic_id,
"a:type": topic_type,
"b:type": "/common/topic",
"id": null,
"guid": null
}];
$.post("/command/freebase/mqlwrite/" + provider,
{ "query" : JSON.stringify(mql_query) },
function(data) {
if ("status" in data && data.code == "/api/status/ok") {
self._elmts.source_id.val(data.result[0].id);
if (typeof cont == "function") cont();
} else {
self._show_error("Error creating new topic", data);
}
},
"json"
);
};
var show_triples = function(cont) {
$.post(
"/command/freebase/preview-protograph?" + $.param({ project: theProject.id }),
{
protograph: JSON.stringify(theProject.overlayModels.freebaseProtograph || {}),
engine: JSON.stringify(ui.browsingEngine.getJSON())
},
function(data) {
if ("tripleloader" in data) {
self._elmts.functionalCase.show();
self._level = DialogSystem.showDialog(dialog);
self._elmts.functionalTabs.tabs();
self._elmts.previewContainer.text(data.tripleloader).show();
self._elmts.source_name.keyup(function() {
if (self._signedin && $(this).val() != "") {
loadButton.removeAttr("disabled").removeClass("button-disabled");
} else {
authorization.html('<a href="javascript:{}" bind="signin">Sign into Freebase</a> to enable loading').show();
self._signedin = false;
$("#freebase-loading-source-name").keyup();
DOM.bind(authorization).signin.click(function() {
Sign.signin(function() {
check_authorization(cont);
},provider);
});
loadButton.attr("disabled","disabled").addClass("button-disabled");
}
},"json");
};
});
var make_topic = function(new_topic_id, topic_type, cont) {
var mql_query = [{
"create": "unless_exists",
"name": new_topic_id,
"a:type": topic_type,
"b:type": "/common/topic",
"id": null,
"guid": null
}];
self._elmts.source_id.suggest({
"type": "/dataworld/information_source",
"suggest_new": "Click here to add a new information source"
}).bind("fb-select", function(e, data) {
self._elmts.source_id.val(data.id);
}).bind("fb-select-new", function(e, val) {
make_topic(val, "/dataworld/information_source");
});
$.post("/command/freebase/mqlwrite/" + provider,
{ "query" : JSON.stringify(mql_query) },
$.getJSON(
"/command/core/get-preference?" + $.param({ project: theProject.id, name: "freebase.load.jobName" }),
null,
function(data) {
if ("status" in data && data.code == "/api/status/ok") {
self._elmts.source_id.val(data.result[0].id);
if (typeof cont == "function") cont();
} else {
self._show_error("Error creating new topic", data);
}
},
"json"
);
};
self._elmts.source_name[0].value = (data.value) ? data.value : theProject.metadata.name;
}
);
var show_triples = function(cont) {
$.post(
"/command/freebase/preview-protograph?" + $.param({ project: theProject.id }),
{
protograph: JSON.stringify(theProject.overlayModels.freebaseProtograph || {}),
engine: JSON.stringify(ui.browsingEngine.getJSON())
},
function(data) {
if ("tripleloader" in data) {
self._elmts.functionalCase.show();
self._level = DialogSystem.showDialog(dialog);
if (typeof cont == "function") cont();
} else {
self._elmts.unalignedCase.show();
self._level = DialogSystem.showDialog(dialog);
self._elmts.functionalTabs.tabs();
self._elmts.alignButton.click(function() {
self._dismiss();
FreebaseExtension.handlers.editSchemaAlignment(false);
});
self._end();
}
},
"json"
);
};
self._elmts.previewContainer.text(data.tripleloader).show();
self._elmts.source_name.keyup(function() {
if (self._signedin && $(this).val() != "") {
loadButton.removeAttr("disabled").removeClass("button-disabled");
} else {
loadButton.attr("disabled","disabled").addClass("button-disabled");
}
});
self._elmts.source_id.suggest({
"type": "/dataworld/information_source",
"suggest_new": "Click here to add a new information source"
}).bind("fb-select", function(e, data) {
self._elmts.source_id.val(data.id);
}).bind("fb-select-new", function(e, val) {
make_topic(val, "/dataworld/information_source");
});
$.getJSON(
"/command/core/get-preference?" + $.param({ project: theProject.id, name: "freebase.load.jobName" }),
null,
function(data) {
self._elmts.source_name[0].value = (data.value) ? data.value : theProject.metadata.name;
}
);
if (typeof cont == "function") cont();
} else {
self._elmts.unalignedCase.show();
self._level = DialogSystem.showDialog(dialog);
self._elmts.alignButton.click(function() {
self._dismiss();
FreebaseExtension.handlers.editSchemaAlignment(false);
});
self._end();
}
},
"json"
);
};
show_triples(check_authorization);
show_triples(check_authorization);
};
FreebaseLoadingDialog.prototype._load = function() {
var self = this;
var qa = self._elmts.qaCheckbox.is(':checked');
var self = this;
var qa = self._elmts.qaCheckbox.is(':checked');
var get_refinery_url = function(url) {
return "http://refinery.freebaseapps.com/load/" + url.split("/").slice(-1)[0];
var get_refinery_url = function(url) {
return "http://refinery.freebaseapps.com/load/" + url.split("/").slice(-1)[0];
};
var doLoad = function() {
var dismissBusy = DialogSystem.showBusy();
$.post(
"/command/freebase/upload-data",
{
"project" : theProject.id,
"qa" : qa,
"engine" : JSON.stringify(ui.browsingEngine.getJSON()),
"source_name" : self._elmts.source_name.val(),
"source_id" : self._elmts.source_id.val()
},
function(data) {
dismissBusy();
var body = self._elmts.dialogBody;
if ("status" in data && typeof data.status == "object" && "code" in data.status && data.status.code == 200) {
self._elmts.tripleCountSpan.text(data.result.added);
self._elmts.refineryLink.attr("href", get_refinery_url(data.result.status_url));
self._elmts.functionalCase.hide();
self._elmts.loadedCase.show();
self._end();
} else {
self._show_error("Error loading data",data);
}
},
"json"
);
};
if (qa) {
var dialog = $(DOM.loadHTML("freebase", "scripts/dialogs/confirm-qa-dialog.html"));
var elmts = DOM.bind(dialog);
var level = DialogSystem.showDialog(dialog);
var dismiss = function() {
DialogSystem.dismissUntil(level - 1);
};
var doLoad = function() {
var dismissBusy = DialogSystem.showBusy();
$.post("/command/freebase/upload-data",
{
project: theProject.id,
"qa" : qa,
"engine" : JSON.stringify(ui.browsingEngine.getJSON()),
"source_name" : self._elmts.source_name.val(),
"source_id" : self._elmts.source_id.val()
},
function(data) {
dismissBusy();
var body = self._elmts.dialogBody;
if ("status" in data && typeof data.status == "object" && "code" in data.status && data.status.code == 200) {
self._elmts.tripleCountSpan.text(data.result.added);
self._elmts.refineryLink.attr("href", get_refinery_url(data.result.status_url));
self._elmts.functionalCase.hide();
self._elmts.loadedCase.show();
self._end();
} else {
self._show_error("Error loading data",data);
}
},
"json"
);
};
if (qa) {
var dialog = $(DOM.loadHTML("freebase", "scripts/dialogs/confirm-qa-dialog.html"));
var elmts = DOM.bind(dialog);
var level = DialogSystem.showDialog(dialog);
var dismiss = function() {
DialogSystem.dismissUntil(level - 1);
};
elmts.okButton.click(function() {
doLoad();
dismiss();
});
elmts.cancelButton.click(function() {
dismiss();
});
} else {
doLoad();
}
elmts.okButton.click(function() {
doLoad();
dismiss();
});
elmts.cancelButton.click(function() {
dismiss();
});
} else {
doLoad();
}
};
FreebaseLoadingDialog.prototype._dismiss = function() {
DialogSystem.dismissUntil(this._level - 1);
DialogSystem.dismissUntil(this._level - 1);
};
FreebaseLoadingDialog.prototype._show_error = function(msg, error) {
this._elmts.dialogBody.children().hide();
this._elmts.errorCase.show();
this._elmts.errorMessage.text(msg);
this._elmts.errorDetails.html(
(('message' in error) ? '<p>' + error.message + '</p>' : '<pre>' + JSON.stringify(error, null, 2) + '</pre>') +
(('stack' in error) ? '<pre>' + error.stack.replace(/\\n/g,'\n').replace(/\\t/g,'\t') + '</pre>' : "")
);
this._end();
console.log(error);
this._elmts.dialogBody.children().hide();
this._elmts.errorCase.show();
this._elmts.errorMessage.text(msg);
this._elmts.errorDetails.html(
(('message' in error) ? '<p>' + error.message + '</p>' : '<pre>' + JSON.stringify(error, null, 2) + '</pre>') +
(('stack' in error) ? '<pre>' + error.stack.replace(/\\n/g,'\n').replace(/\\t/g,'\t') + '</pre>' : "")
);
this._end();
console.log(error);
};
FreebaseLoadingDialog.prototype._end = function() {
var self = this;
this._elmts.loadButton.text("Close").removeAttr("disabled").removeClass("button-disabled").unbind().click(function() {
self._dismiss();
});
this._elmts.cancelButton.hide();
this._elmts.authorization.hide();
var self = this;
this._elmts.loadButton.text("Close").removeAttr("disabled").removeClass("button-disabled").unbind().click(function() {
self._dismiss();
});
this._elmts.cancelButton.hide();
this._elmts.authorization.hide();
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,283 +29,283 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
var SchemaAlignment = {};
SchemaAlignment.autoAlign = function() {
var protograph = {};
var protograph = {};
var columns = theProject.columnModel.columns;
var columns = theProject.columnModel.columns;
var typedCandidates = [];
var candidates = [];
var typedCandidates = [];
var candidates = [];
for (var c = 0; c < columns.length; c++) {
var column = columns[c];
var typed = (column.reconConfig) &&
ReconciliationManager.isFreebaseIdOrMid(column.reconConfig.identifierSpace) &&
ReconciliationManager.isFreebaseId(column.reconConfig.schemaSpace);
for (var c = 0; c < columns.length; c++) {
var column = columns[c];
var typed = (column.reconConfig) &&
ReconciliationManager.isFreebaseIdOrMid(column.reconConfig.identifierSpace) &&
ReconciliationManager.isFreebaseId(column.reconConfig.schemaSpace);
var candidate = {
status: "unbound",
typed: typed,
index: c,
column: column
};
var candidate = {
status: "unbound",
typed: typed,
index: c,
column: column
};
candidates.push(candidate);
if (typed) {
typedCandidates.push(candidate);
}
candidates.push(candidate);
if (typed) {
typedCandidates.push(candidate);
}
}
if (typedCandidates.length > 0) {
} else {
var queries = {};
for (var i = 0; i < candidates.length; i++) {
var candidate = candidates[i];
var name = SchemaAlignment._cleanName(candidate.column.name);
var key = "t" + i + ":search";
queries[key] = {
"query" : name,
"limit" : 10,
"type" : "/type/type,/type/property",
"type_strict" : "any"
};
}
if (typedCandidates.length > 0) {
} else {
var queries = {};
for (var i = 0; i < candidates.length; i++) {
var candidate = candidates[i];
var name = SchemaAlignment._cleanName(candidate.column.name);
var key = "t" + i + ":search";
queries[key] = {
"query" : name,
"limit" : 10,
"type" : "/type/type,/type/property",
"type_strict" : "any"
};
}
SchemaAlignment._batchSearch(queries, function(result) {
console.log(result);
});
}
SchemaAlignment._batchSearch(queries, function(result) {
console.log(result);
});
}
};
SchemaAlignment._batchSearch = function(queries, onDone) {
var keys = [];
for (var n in queries) {
if (queries.hasOwnProperty(n)) {
keys.push(n);
}
var keys = [];
for (var n in queries) {
if (queries.hasOwnProperty(n)) {
keys.push(n);
}
}
var result = {};
var args = [];
var makeBatch = function(keyBatch) {
var batch = {};
for (var k = 0; k < keyBatch.length; k++) {
var key = keyBatch[k];
batch[key] = queries[key];
}
var result = {};
var args = [];
var makeBatch = function(keyBatch) {
var batch = {};
for (var k = 0; k < keyBatch.length; k++) {
var key = keyBatch[k];
batch[key] = queries[key];
}
args.push("http://api.freebase.com/api/service/search?" +
$.param({ "queries" : JSON.stringify(batch) }) + "&callback=?");
args.push("http://api.freebase.com/api/service/search?" +
$.param({ "queries" : JSON.stringify(batch) }) + "&callback=?");
args.push(null); // no data
args.push(function(data) {
for (var k = 0; k < keyBatch.length; k++) {
var key = keyBatch[k];
result[key] = data[key];
}
});
};
for (var i = 0; i < keys.length; i += 10) {
makeBatch(keys.slice(i, i + 10));
}
args.push(function() {
onDone(result);
args.push(null); // no data
args.push(function(data) {
for (var k = 0; k < keyBatch.length; k++) {
var key = keyBatch[k];
result[key] = data[key];
}
});
};
Ajax.chainGetJSON.apply(null, args);
for (var i = 0; i < keys.length; i += 10) {
makeBatch(keys.slice(i, i + 10));
}
args.push(function() {
onDone(result);
});
Ajax.chainGetJSON.apply(null, args);
};
SchemaAlignment._cleanName = function(s) {
return s.replace(/\W/g, " ").replace(/\s+/g, " ").toLowerCase();
return s.replace(/\W/g, " ").replace(/\s+/g, " ").toLowerCase();
};
SchemaAlignment.createNewRootNode = function() {
var rootNode = null;
var links = [];
var columns = theProject.columnModel.columns;
for (var i = 0; i < columns.length; i++) {
var column = columns[i];
var target = {
nodeType: "cell-as-topic",
columnName: column.name,
createForNoReconMatch: true
};
if ((column.reconConfig) &&
ReconciliationManager.isFreebaseIdOrMid(column.reconConfig.identifierSpace) &&
ReconciliationManager.isFreebaseId(column.reconConfig.schemaSpace) &&
(column.reconConfig.type)) {
var rootNode = null;
var links = [];
var columns = theProject.columnModel.columns;
for (var i = 0; i < columns.length; i++) {
var column = columns[i];
var target = {
nodeType: "cell-as-topic",
columnName: column.name,
createForNoReconMatch: true
};
if ((column.reconConfig) &&
ReconciliationManager.isFreebaseIdOrMid(column.reconConfig.identifierSpace) &&
ReconciliationManager.isFreebaseId(column.reconConfig.schemaSpace) &&
(column.reconConfig.type)) {
target.type = {
id: column.reconConfig.type.id,
name: column.reconConfig.type.name
};
}
if (column.name == theProject.columnModel.keyColumnName) {
rootNode = target;
} else {
links.push({
property: null,
target: target
});
}
target.type = {
id: column.reconConfig.type.id,
name: column.reconConfig.type.name
};
}
rootNode = rootNode || { nodeType: "cell-as-topic" };
rootNode.links = links;
if (column.name == theProject.columnModel.keyColumnName) {
rootNode = target;
} else {
links.push({
property: null,
target: target
});
}
}
return rootNode;
rootNode = rootNode || { nodeType: "cell-as-topic" };
rootNode.links = links;
return rootNode;
};
function SchemaAlignmentDialog(protograph, onDone) {
this._onDone = onDone;
this._hasUnsavedChanges = false;
this._onDone = onDone;
this._hasUnsavedChanges = false;
this._createDialog();
this._reset(protograph, true);
this._createDialog();
this._reset(protograph, true);
}
SchemaAlignmentDialog.prototype._reset = function(protograph, initial) {
this._originalProtograph = protograph || { rootNodes: [] };
this._protograph = cloneDeep(this._originalProtograph); // this is what can be munched on
this._originalProtograph = protograph || { rootNodes: [] };
this._protograph = cloneDeep(this._originalProtograph); // this is what can be munched on
if (!this._protograph.rootNodes.length) {
this._protograph.rootNodes.push(SchemaAlignment.createNewRootNode());
}
if (!this._protograph.rootNodes.length) {
this._protograph.rootNodes.push(SchemaAlignment.createNewRootNode());
}
$(this._nodeTable).empty();
$(this._nodeTable).empty();
this._nodeUIs = [];
for (var i = 0; i < this._protograph.rootNodes.length; i++) {
this._nodeUIs.push(new SchemaAlignmentDialog.UINode(
this,
this._protograph.rootNodes[i],
this._nodeTable,
{
expanded: true,
mustBeCellTopic: true
}
));
}
this._nodeUIs = [];
for (var i = 0; i < this._protograph.rootNodes.length; i++) {
this._nodeUIs.push(new SchemaAlignmentDialog.UINode(
this,
this._protograph.rootNodes[i],
this._nodeTable,
{
expanded: true,
mustBeCellTopic: true
}
));
}
this.preview(initial);
this.preview(initial);
};
SchemaAlignmentDialog.prototype._save = function(onDone) {
var self = this;
var protograph = this.getJSON();
var self = this;
var protograph = this.getJSON();
Refine.postProcess(
"freebase",
"save-protograph",
{},
{ protograph: JSON.stringify(protograph) },
{},
{
onDone: function() {
theProject.overlayModels.freebaseProtograph = protograph;
Refine.postProcess(
"freebase",
"save-protograph",
{},
{ protograph: JSON.stringify(protograph) },
{},
{
onDone: function() {
theProject.overlayModels.freebaseProtograph = protograph;
self._elmts.statusIndicator.hide();
self._hasUnsavedChanges = false;
self._elmts.statusIndicator.hide();
self._hasUnsavedChanges = false;
if (onDone) onDone();
}
}
);
if (onDone) onDone();
}
}
);
};
SchemaAlignmentDialog.prototype._createDialog = function() {
var self = this;
var frame = $(DOM.loadHTML("freebase", "scripts/dialogs/schema-alignment/schema-alignment-dialog.html"));
var elmts = this._elmts = DOM.bind(frame);
var self = this;
var frame = $(DOM.loadHTML("freebase", "scripts/dialogs/schema-alignment/schema-alignment-dialog.html"));
var elmts = this._elmts = DOM.bind(frame);
this._level = DialogSystem.showDialog(frame);
this._level = DialogSystem.showDialog(frame);
var dismiss = function() {
DialogSystem.dismissUntil(self._level - 1);
};
var dismiss = function() {
DialogSystem.dismissUntil(self._level - 1);
};
elmts.saveButton.click(function() {
self._save();
});
elmts.saveAndLoadButton.click(function() {
self._save(function() {
dismiss();
FreebaseExtension.handlers.loadIntoFreebase();
});
});
elmts.resetButton.click(function() {
self._reset(null);
});
elmts.closeButton.click(function() {
if (!self._hasUnsavedChanges || window.confirm("There are unsaved changes. Close anyway?")) {
dismiss();
}
elmts.saveButton.click(function() {
self._save();
});
elmts.saveAndLoadButton.click(function() {
self._save(function() {
dismiss();
FreebaseExtension.handlers.loadIntoFreebase();
});
});
elmts.resetButton.click(function() {
self._reset(null);
});
elmts.closeButton.click(function() {
if (!self._hasUnsavedChanges || window.confirm("There are unsaved changes. Close anyway?")) {
dismiss();
}
});
$("#schema-alignment-tabs").tabs();
$("#schema-alignment-tabs-preview-mqllike").css("display", "");
$("#schema-alignment-tabs-preview-tripleloader").css("display", "");
$("#schema-alignment-tabs").tabs();
$("#schema-alignment-tabs-preview-mqllike").css("display", "");
$("#schema-alignment-tabs-preview-tripleloader").css("display", "");
this._previewPanes = $(".schema-alignment-dialog-preview");
this._previewPanes = $(".schema-alignment-dialog-preview");
this._canvas = $(".schema-alignment-dialog-canvas");
this._nodeTable = $('<table></table>').addClass("schema-alignment-table-layout").appendTo(this._canvas)[0];
this._canvas = $(".schema-alignment-dialog-canvas");
this._nodeTable = $('<table></table>').addClass("schema-alignment-table-layout").appendTo(this._canvas)[0];
};
SchemaAlignmentDialog.prototype.getJSON = function() {
var rootNodes = [];
for (var i = 0; i < this._nodeUIs.length; i++) {
var node = this._nodeUIs[i].getJSON();
if (node !== null) {
rootNodes.push(node);
}
var rootNodes = [];
for (var i = 0; i < this._nodeUIs.length; i++) {
var node = this._nodeUIs[i].getJSON();
if (node !== null) {
rootNodes.push(node);
}
}
return {
rootNodes: rootNodes
};
return {
rootNodes: rootNodes
};
};
SchemaAlignmentDialog.prototype.preview = function(initial) {
var self = this;
var self = this;
this._previewPanes.empty();
if (!(initial)) {
this._elmts.statusIndicator.show().text("There are unsaved changes.");
this._hasUnsavedChanges = true;
}
this._previewPanes.empty();
if (!(initial)) {
this._elmts.statusIndicator.show().text("There are unsaved changes.");
this._hasUnsavedChanges = true;
}
var protograph = this.getJSON();
$.post(
"/command/freebase/preview-protograph?" + $.param({ project: theProject.id }),
{ protograph: JSON.stringify(protograph), engine: JSON.stringify(ui.browsingEngine.getJSON()) },
function(data) {
if ("mqllike" in data) {
$(self._previewPanes[0]).text(JSON.stringify(data.mqllike, null, 2));
}
if ("tripleloader" in data) {
$(self._previewPanes[1]).text(data.tripleloader);
}
},
"json"
);
var protograph = this.getJSON();
$.post(
"/command/freebase/preview-protograph?" + $.param({ project: theProject.id }),
{ protograph: JSON.stringify(protograph), engine: JSON.stringify(ui.browsingEngine.getJSON()) },
function(data) {
if ("mqllike" in data) {
$(self._previewPanes[0]).text(JSON.stringify(data.mqllike, null, 2));
}
if ("tripleloader" in data) {
$(self._previewPanes[1]).text(data.tripleloader);
}
},
"json"
);
};
SchemaAlignmentDialog._findColumn = function(cellIndex) {
var columns = theProject.columnModel.columns;
for (var i = 0; i < columns.length; i++) {
var column = columns[i];
if (column.cellIndex == cellIndex) {
return column;
}
var columns = theProject.columnModel.columns;
for (var i = 0; i < columns.length; i++) {
var column = columns[i];
if (column.cellIndex == cellIndex) {
return column;
}
return null;
}
return null;
};

View File

@ -7,20 +7,20 @@
<a href="http://code.google.com/p/google-refine/wiki/SchemaAlignment" target="_blank">Find out more ...</a>
</p>
<div id="schema-alignment-tabs" class="refine-tabs">
<ul>
<li><a href="#schema-alignment-tabs-protograph">Skeleton</a></li>
<li><a href="#schema-alignment-tabs-preview-mqllike">MQL-like Preview</a></li>
<li><a href="#schema-alignment-tabs-preview-tripleloader">TripleLoader Preview</a></li>
</ul>
<div id="schema-alignment-tabs-protograph">
<div class="schema-alignment-dialog-canvas"></div>
</div>
<div id="schema-alignment-tabs-preview-mqllike" style="display: none;">
<div class="schema-alignment-dialog-preview"></div>
</div>
<div id="schema-alignment-tabs-preview-tripleloader" style="display: none;">
<div class="schema-alignment-dialog-preview"></div>
</div>
<ul>
<li><a href="#schema-alignment-tabs-protograph">Skeleton</a></li>
<li><a href="#schema-alignment-tabs-preview-mqllike">MQL-like Preview</a></li>
<li><a href="#schema-alignment-tabs-preview-tripleloader">TripleLoader Preview</a></li>
</ul>
<div id="schema-alignment-tabs-protograph">
<div class="schema-alignment-dialog-canvas"></div>
</div>
<div id="schema-alignment-tabs-preview-mqllike" style="display: none;">
<div class="schema-alignment-dialog-preview"></div>
</div>
<div id="schema-alignment-tabs-preview-tripleloader" style="display: none;">
<div class="schema-alignment-dialog-preview"></div>
</div>
</div>
</div>
<div class="dialog-footer" bind="dialogFooter"><div class="grid-layout layout-normal layout-full"><table><tr>

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,354 +29,354 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
SchemaAlignmentDialog.UILink = function(dialog, link, table, options, parentUINode) {
this._dialog = dialog;
this._link = link;
this._options = options;
this._parentUINode = parentUINode;
this._dialog = dialog;
this._link = link;
this._options = options;
this._parentUINode = parentUINode;
// Make sure target node is there
this._link.target = this._link.target || { nodeType: "cell-as-value" }
// Make sure target node is there
this._link.target = this._link.target || { nodeType: "cell-as-value" }
this._tr = table.insertRow(table.rows.length);
this._tdMain = this._tr.insertCell(0);
this._tdToggle = this._tr.insertCell(1);
this._tdDetails = this._tr.insertCell(2);
this._tr = table.insertRow(table.rows.length);
this._tdMain = this._tr.insertCell(0);
this._tdToggle = this._tr.insertCell(1);
this._tdDetails = this._tr.insertCell(2);
$(this._tdMain).addClass("schema-alignment-link-main").attr("width", "250").addClass("padded");
$(this._tdToggle).addClass("schema-alignment-link-toggle").attr("width", "1%").addClass("padded");
$(this._tdDetails).addClass("schema-alignment-link-details").attr("width", "90%");
$(this._tdMain).addClass("schema-alignment-link-main").attr("width", "250").addClass("padded");
$(this._tdToggle).addClass("schema-alignment-link-toggle").attr("width", "1%").addClass("padded");
$(this._tdDetails).addClass("schema-alignment-link-details").attr("width", "90%");
this._collapsedDetailDiv = $('<div></div>').appendTo(this._tdDetails).addClass("padded").html("...");
this._expandedDetailDiv = $('<div></div>').appendTo(this._tdDetails).addClass("schema-alignment-detail-container");
var self = this;
var show = function() {
if (self._options.expanded) {
self._collapsedDetailDiv.hide();
self._expandedDetailDiv.show();
} else {
self._collapsedDetailDiv.show();
self._expandedDetailDiv.hide();
}
};
show();
$(this._tdToggle).html("&nbsp;");
$('<img />')
.attr("src", this._options.expanded ? "images/expanded.png" : "images/collapsed.png")
.appendTo(this._tdToggle)
.click(function() {
self._options.expanded = !self._options.expanded;
$(this).attr("src", self._options.expanded ? "images/expanded.png" : "images/collapsed.png");
this._collapsedDetailDiv = $('<div></div>').appendTo(this._tdDetails).addClass("padded").html("...");
this._expandedDetailDiv = $('<div></div>').appendTo(this._tdDetails).addClass("schema-alignment-detail-container");
var self = this;
var show = function() {
if (self._options.expanded) {
self._collapsedDetailDiv.hide();
self._expandedDetailDiv.show();
} else {
self._collapsedDetailDiv.show();
self._expandedDetailDiv.hide();
}
};
show();
});
$(this._tdToggle).html("&nbsp;");
$('<img />')
.attr("src", this._options.expanded ? "images/expanded.png" : "images/collapsed.png")
.appendTo(this._tdToggle)
.click(function() {
self._options.expanded = !self._options.expanded;
$(this).attr("src", self._options.expanded ? "images/expanded.png" : "images/collapsed.png");
show();
});
this._renderMain();
this._renderDetails();
this._renderMain();
this._renderDetails();
};
SchemaAlignmentDialog.UILink.prototype._renderMain = function() {
$(this._tdMain).empty();
$(this._tdMain).empty();
var label = this._link.property !== null ?
(this._link.property.id + ((this._link.condition) ? " [?]" : "")) :
"property?";
var label = this._link.property !== null ?
(this._link.property.id + ((this._link.condition) ? " [?]" : "")) :
"property?";
var self = this;
var self = this;
$('<img />')
.attr("title", "remove property")
.attr("src", "images/close.png")
.css("cursor", "pointer")
.prependTo(this._tdMain)
.click(function() {
window.setTimeout(function() {
self._parentUINode.removeLink(self);
self._tr.parentNode.removeChild(self._tr);
self._dialog.preview();
}, 100);
});
$('<img />')
.attr("title", "remove property")
.attr("src", "images/close.png")
.css("cursor", "pointer")
.prependTo(this._tdMain)
.click(function() {
window.setTimeout(function() {
self._parentUINode.removeLink(self);
self._tr.parentNode.removeChild(self._tr);
self._dialog.preview();
}, 100);
});
var a = $('<a href="javascript:{}"></a>')
.addClass("schema-alignment-link-tag")
.html(label)
.appendTo(this._tdMain)
.click(function(evt) {
self._startEditProperty(this);
});
var a = $('<a href="javascript:{}"></a>')
.addClass("schema-alignment-link-tag")
.html(label)
.appendTo(this._tdMain)
.click(function(evt) {
self._startEditProperty(this);
});
$('<img />').attr("src", "images/arrow-start.png").prependTo(a);
$('<img />').attr("src", "images/arrow-end.png").appendTo(a);
$('<img />').attr("src", "images/arrow-start.png").prependTo(a);
$('<img />').attr("src", "images/arrow-end.png").appendTo(a);
};
SchemaAlignmentDialog.UILink.prototype._renderDetails = function() {
if (this._targetUI) {
this._targetUI.dispose();
}
if (this._tableDetails) {
this._tableDetails.remove();
}
if (this._targetUI) {
this._targetUI.dispose();
}
if (this._tableDetails) {
this._tableDetails.remove();
}
this._tableDetails = $('<table></table>').addClass("schema-alignment-table-layout").appendTo(this._expandedDetailDiv);
this._targetUI = new SchemaAlignmentDialog.UINode(
this._dialog,
this._link.target,
this._tableDetails[0],
{ expanded: "links" in this._link.target && this._link.target.links.length > 0 });
this._tableDetails = $('<table></table>').addClass("schema-alignment-table-layout").appendTo(this._expandedDetailDiv);
this._targetUI = new SchemaAlignmentDialog.UINode(
this._dialog,
this._link.target,
this._tableDetails[0],
{ expanded: "links" in this._link.target && this._link.target.links.length > 0 });
};
SchemaAlignmentDialog.UILink.prototype._startEditProperty = function(elmt) {
var sourceTypeID = this._parentUINode.getExpectedType();
var targetNode = this._targetUI._node;
var targetTypeID = "type" in targetNode && targetNode.type !== null ? targetNode.type.id : null;
var targetTypeName = "columnNames" in targetNode ? targetNode.columnNames[0] : null;
var sourceTypeID = this._parentUINode.getExpectedType();
var targetNode = this._targetUI._node;
var targetTypeID = "type" in targetNode && targetNode.type !== null ? targetNode.type.id : null;
var targetTypeName = "columnNames" in targetNode ? targetNode.columnNames[0] : null;
if (sourceTypeID !== null) {
var self = this;
var dismissBusy = DialogSystem.showBusy();
var instanceCount = 0;
var outgoing = [];
var incoming = [];
var onDone = function(properties) {
dismissBusy();
self._showPropertySuggestPopup(
elmt,
properties
);
};
SchemaAlignmentDialog.UILink._getPropertiesOfType(
sourceTypeID,
targetTypeID,
targetTypeName,
onDone
);
} else {
this._showPropertySuggestPopup(elmt, []);
}
};
SchemaAlignmentDialog.UILink._getPropertiesOfType = function(typeID, targetTypeID, targetTypeName, onDone) {
var done = false;
var params = {
"type" : typeID
};
if (targetTypeID !== null) {
params.expects = targetTypeID;
} else if (targetTypeName !== null) {
params.expects = targetTypeName;
}
$.getJSON(
Refine.refineHelperService + "/get_properties_of_type?" + $.param(params) + "&callback=?",
null,
function(data) {
if (done) return;
done = true;
onDone(data.properties || []);
}
);
window.setTimeout(function() {
if (done) return;
done = true;
onDone([]);
}, 7000); // time to give up?
};
SchemaAlignmentDialog.UILink.prototype._showPropertySuggestPopup = function(elmt, suggestions) {
self = this;
var menu = MenuSystem.createMenu().width("350px");
var commitProperty = function(p) {
window.setTimeout(function() { MenuSystem.dismissAll(); }, 100);
if ("id2" in p) {
// self._targetUI.dispose();
self._link.property = {
id: p.id,
name: p.name
};
self._link.target = {
nodeType: "anonymous",
links: [{
property: {
id: p.id2,
name: p.name2
},
target: self._link.target
}]
};
self._renderDetails();
} else {
self._link.property = {
id: p.id,
name: p.name
};
}
var conditionColumnName = conditionalSelect[0].value;
if (conditionColumnName != "") {
self._link.condition = { columnName: conditionColumnName };
} else {
delete self._link.condition;
}
self._configureTarget();
};
var divConditional = $('<div>')
.addClass("schema-alignment-link-menu-section")
.html("Assert link when 'true' is found in column<br/>").appendTo(menu);
var conditionalSelect = $('<select>').appendTo(divConditional);
$('<option>')
.text("(always assert)")
.attr("value", "")
.attr("name", "schema-alignment-link-menu-condition")
.appendTo(conditionalSelect);
for (var c = 0; c < theProject.columnModel.columns.length; c++) {
var column = theProject.columnModel.columns[c];
var option = $('<option>')
.text(column.name)
.attr("value", column.name)
.attr("name", "schema-alignment-link-menu-condition")
.appendTo(conditionalSelect);
if ((self._link.condition) && column.name == self._link.condition.columnName) {
option.attr("selected", "true");
}
}
var divSearch;
if (suggestions.length > 0) {
divSearch = $('<div>')
.addClass("schema-alignment-link-menu-section")
.css("margin-bottom", "2em")
.html('<div>Search for a property or pick one below</div>').appendTo(menu);
var createSuggestion = function(suggestion) {
var menuItem = MenuSystem.createMenuItem().appendTo(menu);
$('<span>')
.text(suggestion.name)
.attr("title", suggestion.id)
.appendTo(menuItem);
if ("name2" in suggestion) {
$('<span>').html(" &raquo; ").appendTo(menuItem);
$('<span>')
.text(suggestion.name2)
.attr("title", suggestion.id2)
.appendTo(menuItem);
}
menuItem.click(function() {
commitProperty(suggestion);
});
};
for (var i = 0; i < suggestions.length && i < 10; i++) {
createSuggestion(suggestions[i]);
}
} else {
divSearch = $('<div>')
.addClass("schema-alignment-link-menu-section-last")
.html('<div>Search for a property</div>').appendTo(menu);
}
var input = $('<input />').appendTo($('<div>').appendTo(divSearch));
MenuSystem.showMenu(menu, function(){});
MenuSystem.positionMenuAboveBelow(menu, $(elmt));
var suggestOptions = {
type : '/type/property'
};
var sourceTypeID = this._parentUINode.getExpectedType();
if (sourceTypeID !== null) {
suggestOptions.ac_param = { schema: sourceTypeID };
}
input.suggestP(suggestOptions).bind("fb-select", function(e, data) { commitProperty(data); });
input[0].focus();
};
SchemaAlignmentDialog.UILink.prototype.getJSON = function() {
if ("property" in this._link && this._link.property !== null &&
"target" in this._link && this._link.target !== null) {
var targetJSON = this._targetUI.getJSON();
if (targetJSON !== null) {
var json = {
property: cloneDeep(this._link.property),
target: targetJSON
};
if (this._link.condition) {
json.condition = cloneDeep(this._link.condition);
}
return json;
}
}
return null;
};
SchemaAlignmentDialog.UILink.prototype._configureTarget = function() {
if (sourceTypeID !== null) {
var self = this;
var dismissBusy = DialogSystem.showBusy();
$.getJSON(
"http://api.freebase.com/api/service/mqlread?query=" + JSON.stringify({
query: {
"id" : this._link.property.id,
"type" : "/type/property",
"expected_type" : {
"id" : null,
"name" : null,
"/freebase/type_hints/mediator" : null
}
}
}) + "&callback=?",
null,
function(o) {
dismissBusy();
var instanceCount = 0;
var outgoing = [];
var incoming = [];
if ("result" in o) {
var expected_type = o.result.expected_type;
self._link.target.type = {
id: expected_type.id,
name: expected_type.name
};
if (expected_type["/freebase/type_hints/mediator"] === true) {
self._link.target.nodeType = "anonymous";
} else if (expected_type.id == "/type/key") {
self._link.target.nodeType = "cell-as-key";
} else if (expected_type.id.match(/^\/type\//)) {
self._link.target.nodeType = "cell-as-value";
} else if (!("topic" in self._link.target)) {
self._link.target.nodeType = "cell-as-topic";
self._link.target.createForNoReconMatch = true;
}
var onDone = function(properties) {
dismissBusy();
self._targetUI.render();
}
self._showPropertySuggestPopup(
elmt,
properties
);
};
self._renderMain();
self._dialog.preview();
},
"jsonp"
SchemaAlignmentDialog.UILink._getPropertiesOfType(
sourceTypeID,
targetTypeID,
targetTypeName,
onDone
);
} else {
this._showPropertySuggestPopup(elmt, []);
}
};
SchemaAlignmentDialog.UILink._getPropertiesOfType = function(typeID, targetTypeID, targetTypeName, onDone) {
var done = false;
var params = {
"type" : typeID
};
if (targetTypeID !== null) {
params.expects = targetTypeID;
} else if (targetTypeName !== null) {
params.expects = targetTypeName;
}
$.getJSON(
Refine.refineHelperService + "/get_properties_of_type?" + $.param(params) + "&callback=?",
null,
function(data) {
if (done) return;
done = true;
onDone(data.properties || []);
}
);
window.setTimeout(function() {
if (done) return;
done = true;
onDone([]);
}, 7000); // time to give up?
};
SchemaAlignmentDialog.UILink.prototype._showPropertySuggestPopup = function(elmt, suggestions) {
self = this;
var menu = MenuSystem.createMenu().width("350px");
var commitProperty = function(p) {
window.setTimeout(function() { MenuSystem.dismissAll(); }, 100);
if ("id2" in p) {
// self._targetUI.dispose();
self._link.property = {
id: p.id,
name: p.name
};
self._link.target = {
nodeType: "anonymous",
links: [{
property: {
id: p.id2,
name: p.name2
},
target: self._link.target
}]
};
self._renderDetails();
} else {
self._link.property = {
id: p.id,
name: p.name
};
}
var conditionColumnName = conditionalSelect[0].value;
if (conditionColumnName != "") {
self._link.condition = { columnName: conditionColumnName };
} else {
delete self._link.condition;
}
self._configureTarget();
};
var divConditional = $('<div>')
.addClass("schema-alignment-link-menu-section")
.html("Assert link when 'true' is found in column<br/>").appendTo(menu);
var conditionalSelect = $('<select>').appendTo(divConditional);
$('<option>')
.text("(always assert)")
.attr("value", "")
.attr("name", "schema-alignment-link-menu-condition")
.appendTo(conditionalSelect);
for (var c = 0; c < theProject.columnModel.columns.length; c++) {
var column = theProject.columnModel.columns[c];
var option = $('<option>')
.text(column.name)
.attr("value", column.name)
.attr("name", "schema-alignment-link-menu-condition")
.appendTo(conditionalSelect);
if ((self._link.condition) && column.name == self._link.condition.columnName) {
option.attr("selected", "true");
}
}
var divSearch;
if (suggestions.length > 0) {
divSearch = $('<div>')
.addClass("schema-alignment-link-menu-section")
.css("margin-bottom", "2em")
.html('<div>Search for a property or pick one below</div>').appendTo(menu);
var createSuggestion = function(suggestion) {
var menuItem = MenuSystem.createMenuItem().appendTo(menu);
$('<span>')
.text(suggestion.name)
.attr("title", suggestion.id)
.appendTo(menuItem);
if ("name2" in suggestion) {
$('<span>').html(" &raquo; ").appendTo(menuItem);
$('<span>')
.text(suggestion.name2)
.attr("title", suggestion.id2)
.appendTo(menuItem);
}
menuItem.click(function() {
commitProperty(suggestion);
});
};
for (var i = 0; i < suggestions.length && i < 10; i++) {
createSuggestion(suggestions[i]);
}
} else {
divSearch = $('<div>')
.addClass("schema-alignment-link-menu-section-last")
.html('<div>Search for a property</div>').appendTo(menu);
}
var input = $('<input />').appendTo($('<div>').appendTo(divSearch));
MenuSystem.showMenu(menu, function(){});
MenuSystem.positionMenuAboveBelow(menu, $(elmt));
var suggestOptions = {
type : '/type/property'
};
var sourceTypeID = this._parentUINode.getExpectedType();
if (sourceTypeID !== null) {
suggestOptions.ac_param = { schema: sourceTypeID };
}
input.suggestP(suggestOptions).bind("fb-select", function(e, data) { commitProperty(data); });
input[0].focus();
};
SchemaAlignmentDialog.UILink.prototype.getJSON = function() {
if ("property" in this._link && this._link.property !== null &&
"target" in this._link && this._link.target !== null) {
var targetJSON = this._targetUI.getJSON();
if (targetJSON !== null) {
var json = {
property: cloneDeep(this._link.property),
target: targetJSON
};
if (this._link.condition) {
json.condition = cloneDeep(this._link.condition);
}
return json;
}
}
return null;
};
SchemaAlignmentDialog.UILink.prototype._configureTarget = function() {
var self = this;
var dismissBusy = DialogSystem.showBusy();
$.getJSON(
"http://api.freebase.com/api/service/mqlread?query=" + JSON.stringify({
query: {
"id" : this._link.property.id,
"type" : "/type/property",
"expected_type" : {
"id" : null,
"name" : null,
"/freebase/type_hints/mediator" : null
}
}
}) + "&callback=?",
null,
function(o) {
dismissBusy();
if ("result" in o) {
var expected_type = o.result.expected_type;
self._link.target.type = {
id: expected_type.id,
name: expected_type.name
};
if (expected_type["/freebase/type_hints/mediator"] === true) {
self._link.target.nodeType = "anonymous";
} else if (expected_type.id == "/type/key") {
self._link.target.nodeType = "cell-as-key";
} else if (expected_type.id.match(/^\/type\//)) {
self._link.target.nodeType = "cell-as-value";
} else if (!("topic" in self._link.target)) {
self._link.target.nodeType = "cell-as-topic";
self._link.target.createForNoReconMatch = true;
}
self._targetUI.render();
}
self._renderMain();
self._dialog.preview();
},
"jsonp"
);
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,117 +29,117 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
var FreebaseExtension = { handlers: {} };
FreebaseExtension.handlers.editSchemaAlignment = function() {
new SchemaAlignmentDialog(theProject.overlayModels.freebaseProtograph, function(newProtograph) {});
new SchemaAlignmentDialog(theProject.overlayModels.freebaseProtograph, function(newProtograph) {});
};
FreebaseExtension.handlers.loadIntoFreebase = function() {
new FreebaseLoadingDialog();
new FreebaseLoadingDialog();
};
FreebaseExtension.handlers.browseToDataLoad = function() {
// The form has to be created as part of the click handler. If you create it
// inside the getJSON success handler, it won't work.
// The form has to be created as part of the click handler. If you create it
// inside the getJSON success handler, it won't work.
var form = document.createElement("form");
$(form)
.css("display", "none")
.attr("method", "GET")
.attr("target", "dataload");
var form = document.createElement("form");
$(form)
.css("display", "none")
.attr("method", "GET")
.attr("target", "dataload");
document.body.appendChild(form);
var w = window.open("about:blank", "dataload");
document.body.appendChild(form);
var w = window.open("about:blank", "dataload");
$.getJSON(
"/command/core/get-preference?" + $.param({ project: theProject.id, name: "freebase.load.jobID" }),
null,
function(data) {
if (data.value == null) {
alert("You have not tried to load the data in this project into Freebase yet.");
} else {
$(form).attr("action", "http://refinery.freebaseapps.com/load/" + data.value);
form.submit();
w.focus();
}
document.body.removeChild(form);
}
);
$.getJSON(
"/command/core/get-preference?" + $.param({ project: theProject.id, name: "freebase.load.jobID" }),
null,
function(data) {
if (data.value == null) {
alert("You have not tried to load the data in this project into Freebase yet.");
} else {
$(form).attr("action", "http://refinery.freebaseapps.com/load/" + data.value);
form.submit();
w.focus();
}
document.body.removeChild(form);
}
);
};
FreebaseExtension.handlers.importQAData = function() {
Refine.postProcess(
"freebase-extension",
"import-qa-data",
{},
{},
{ cellsChanged: true }
);
Refine.postProcess(
"freebase-extension",
"import-qa-data",
{},
{},
{ cellsChanged: true }
);
};
ExtensionBar.addExtensionMenu({
"id" : "freebase",
"label" : "Freebase",
"submenu" : [
{
"id" : "freebase/schema-alignment",
label: "Align to Freebase's schemas...",
click: function() { FreebaseExtension.handlers.editSchemaAlignment(false); }
},
{
"id" : "freebase/load-info-freebase",
label: "Load into Freebase...",
click: function() { FreebaseExtension.handlers.loadIntoFreebase(); }
},
{},
{
"id" : "freebase/browse-load",
label: "Browse data load details...",
click: function() { FreebaseExtension.handlers.browseToDataLoad(); }
},
{
"id" : "freebase/import-qa-data",
label: "Import QA data",
click: function() { FreebaseExtension.handlers.importQAData(); }
}
]
"id" : "freebase",
"label" : "Freebase",
"submenu" : [
{
"id" : "freebase/schema-alignment",
label: "Align to Freebase's schemas...",
click: function() { FreebaseExtension.handlers.editSchemaAlignment(false); }
},
{
"id" : "freebase/load-info-freebase",
label: "Load into Freebase...",
click: function() { FreebaseExtension.handlers.loadIntoFreebase(); }
},
{},
{
"id" : "freebase/browse-load",
label: "Browse data load details...",
click: function() { FreebaseExtension.handlers.browseToDataLoad(); }
},
{
"id" : "freebase/import-qa-data",
label: "Import QA data",
click: function() { FreebaseExtension.handlers.importQAData(); }
}
]
});
DataTableColumnHeaderUI.extendMenu(function(column, columnHeaderUI, menu) {
var columnIndex = Refine.columnNameToColumnIndex(column.name);
var doAddColumnFromFreebase = function() {
var o = DataTableView.sampleVisibleRows(column);
new ExtendDataPreviewDialog(
column,
columnIndex,
o.rowIndices,
function(extension) {
Refine.postProcess(
"freebase",
"extend-data",
{
baseColumnName: column.name,
columnInsertIndex: columnIndex + 1
},
{
extension: JSON.stringify(extension)
},
{ rowsChanged: true, modelsChanged: true }
);
}
var columnIndex = Refine.columnNameToColumnIndex(column.name);
var doAddColumnFromFreebase = function() {
var o = DataTableView.sampleVisibleRows(column);
new ExtendDataPreviewDialog(
column,
columnIndex,
o.rowIndices,
function(extension) {
Refine.postProcess(
"freebase",
"extend-data",
{
baseColumnName: column.name,
columnInsertIndex: columnIndex + 1
},
{
extension: JSON.stringify(extension)
},
{ rowsChanged: true, modelsChanged: true }
);
};
MenuSystem.insertAfter(
menu,
[ "core/edit-column", "core/add-column-by-fetching-urls" ],
{
id: "freebase/add-columns-from-freebase",
label: "Add columns from Freebase ...",
click: doAddColumnFromFreebase
}
}
);
};
MenuSystem.insertAfter(
menu,
[ "core/edit-column", "core/add-column-by-fetching-urls" ],
{
id: "freebase/add-columns-from-freebase",
label: "Add columns from Freebase ...",
click: doAddColumnFromFreebase
}
);
});

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,35 +29,35 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
var Freebase = {};
Freebase.mqlread = function(query, options, onDone) {
var params = {};
var queryEnv = {
"query": query
};
var params = {};
var queryEnv = {
"query": query
};
if (options) {
for (var n in options) {
if (options.hasOwnProperty(n)) {
var v = options[n];
if (typeof v != "string") {
v = JSON.stringify(v);
}
queryEnv[n] = v;
}
if (options) {
for (var n in options) {
if (options.hasOwnProperty(n)) {
var v = options[n];
if (typeof v != "string") {
v = JSON.stringify(v);
}
queryEnv[n] = v;
}
}
}
params.query = JSON.stringify(queryEnv);
params.query = JSON.stringify(queryEnv);
$.getJSON(
"http://api.freebase.com/api/service/mqlread?" + $.param(params) + "&callback=?",
null,
onDone,
"jsonp"
);
$.getJSON(
"http://api.freebase.com/api/service/mqlread?" + $.param(params) + "&callback=?",
null,
onDone,
"jsonp"
);
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,125 +29,124 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
if (typeof window.Sign == 'undefined') {
window.Sign = {
window_position: function() {
var position = {};
if (typeof window.Sign == 'undefined') {
window.Sign = {
window_position: function() {
var position = {};
if (typeof(window.innerWidth) == 'number') {
// Non-IE
position.width = window.outerWidth;
position.height = window.outerHeight;
position.top = window.screenY;
position.left = window.screenX;
} else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
// IE 6+ in 'standards compliant mode'
position.width = document.body.clientWidth;
position.height = document.body.clientHeight;
position.top = window.screenTop;
position.left = window.screenLeft;
if (typeof(window.innerWidth) == 'number') {
// Non-IE
position.width = window.outerWidth;
position.height = window.outerHeight;
position.top = window.screenY;
position.left = window.screenX;
} else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
// IE 6+ in 'standards compliant mode'
position.width = document.body.clientWidth;
position.height = document.body.clientHeight;
position.top = window.screenTop;
position.left = window.screenLeft;
}
return position;
},
popup : function(url, width, height, windowname) {
width = width || 700;
height = height || 500;
var pos = window.Sign.window_position();
var left = Math.floor((pos.width - width) / 2) + pos.left;
var top = Math.floor((pos.height - height) / 2) + pos.top;
// Chrome might fix this bug, but until then add some padding
// to the height of the popup for the urlbar
var is_chrome = /chrome/.test(navigator.userAgent.toLowerCase());
if (is_chrome) {
height += 50;
}
var params = {
width: width,
height: height,
top: top,
left: left,
directories: 'no',
location: 'no',
menubar: 'no',
resizable: 'no',
scrollbars: 'yes',
status: 'no',
toolbar: 'no'
};
var params_list = [];
for (var key in params) {
if (params.hasOwnProperty(key)) {
params_list.push(key + "=" + params[key]);
}
}
return position;
},
return window.open(url, windowname || "", params_list.join(","));
},
popup : function(url, width, height, windowname) {
width = width || 700;
height = height || 500;
signintize : function(cont) {
$('.signedin').show();
$('.signedout').hide();
if (window.user) {
$('.user').html('<a href="http://freebase.com/view' + window.user.id + '">' + window.user.username + '</a>');
}
if (typeof cont == 'function') cont();
},
var pos = window.Sign.window_position();
var left = Math.floor((pos.width - width) / 2) + pos.left;
var top = Math.floor((pos.height - height) / 2) + pos.top;
signin : function(success, provider, width, height) {
var newwin = window.Sign.popup("/command/freebase/authorize/" + provider, width, height);
// Chrome might fix this bug, but until then add some padding
// to the height of the popup for the urlbar
var is_chrome = /chrome/.test(navigator.userAgent.toLowerCase());
if (is_chrome) {
height += 50;
if (newwin !== null) {
newwin.opener = window;
}
window.onauthorization = function() {
if (typeof success == 'undefined') {
window.location.reload();
} else {
$.ajax({
url: "/command/freebase/check-authorization/" + provider,
dataType: "json",
success: function(data) {
window.user = data;
window.Sign.signintize(success);
}
});
}
};
var params = {
width: width,
height: height,
top: top,
left: left,
directories: 'no',
location: 'no',
menubar: 'no',
resizable: 'no',
scrollbars: 'yes',
status: 'no',
toolbar: 'no'
};
if (window.focus && newwin !== null) {
newwin.focus();
}
var params_list = [];
for (var key in params) {
if (params.hasOwnProperty(key)) {
params_list.push(key + "=" + params[key]);
}
}
return false;
},
return window.open(url, windowname || "", params_list.join(","));
},
signoutize : function(cont) {
$('.signedin').hide();
$('.signedout').show();
if (typeof cont == 'function') cont();
},
signintize : function(cont) {
$('.signedin').show();
$('.signedout').hide();
if (window.user) {
$('.user').html('<a href="http://freebase.com/view' + window.user.id + '">' + window.user.username + '</a>');
}
if (typeof cont == 'function') cont();
},
signin : function(success, provider, width, height) {
var newwin = window.Sign.popup("/command/freebase/authorize/" + provider, width, height);
if (newwin !== null) {
newwin.opener = window;
}
window.onauthorization = function() {
signout : function(success,provider) {
$.ajax({
url: "/command/freebase/deauthorize/" + provider,
success: function() {
if (typeof success == 'undefined') {
window.location.reload();
} else {
$.ajax({
url: "/command/freebase/check-authorization/" + provider,
dataType: "json",
success: function(data) {
window.user = data;
window.Sign.signintize(success);
}
});
window.Sign.signoutize(success);
}
};
if (window.focus && newwin !== null) {
newwin.focus();
}
return false;
},
signoutize : function(cont) {
$('.signedin').hide();
$('.signedout').show();
if (typeof cont == 'function') cont();
},
signout : function(success,provider) {
$.ajax({
url: "/command/freebase/deauthorize/" + provider,
success: function() {
if (typeof success == 'undefined') {
window.location.reload();
} else {
window.Sign.signoutize(success);
}
}
});
}
};
}
});
}
};
}

View File

@ -34,38 +34,38 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@import-less url("../theme.less");
.extend-data-preview-dialog .suggested-property-container {
border: 1px solid #aaa;
padding: 5px;
overflow: auto;
height: 375px;
}
border: 1px solid #aaa;
padding: 5px;
overflow: auto;
height: 375px;
}
.extend-data-preview-dialog .suggested-property {
padding: 5px;
}
padding: 5px;
}
.extend-data-preview-dialog input.property-suggest {
display: block;
padding: 2%;
width: 96%;
}
display: block;
padding: 2%;
width: 96%;
}
.extend-data-preview-dialog .preview-container {
border: 1px solid #aaa;
overflow: auto;
}
border: 1px solid #aaa;
overflow: auto;
}
.extend-data-preview-dialog .preview-container table {
border-collapse: collapse;
}
border-collapse: collapse;
}
.extend-data-preview-dialog .preview-container td, .extend-data-preview-dialog .preview-container th {
padding: 3px 5px;
border-bottom: 1px solid #ddd;
border-right: 1px solid #ddd;
}
padding: 3px 5px;
border-bottom: 1px solid #ddd;
border-right: 1px solid #ddd;
}
.extend-data-preview-dialog .preview-container th img {
vertical-align: top;
margin-left: 5px;
}
vertical-align: top;
margin-left: 5px;
}

View File

@ -35,43 +35,43 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.freebase-loading-dialog-functional-tab-panel {
height: 400px !important;
}
}
.freebase-loading-tripleloader-data {
width: 99%;
overflow: scroll;
border: 1px solid #aaa;
white-space: pre;
padding: 0.3em 0.5em 0.5em 0.5em;
font-family: monospace;
}
width: 99%;
overflow: scroll;
border: 1px solid #aaa;
white-space: pre;
padding: 0.3em 0.5em 0.5em 0.5em;
font-family: monospace;
}
.freebase-loading-tripleloader-message {
height: 400px;
overflow: auto;
border: 1px solid #aaa;
padding: 1em;
}
height: 400px;
overflow: auto;
border: 1px solid #aaa;
padding: 1em;
}
.freebase-loading-tripleloader-message h2 {
font-size: 150%;
font-weight: normal;
}
}
.freebase-loading-tripleloader-message h2 span {
font-size; 130%;
font-weight: bold;
}
}
.freebase-loading-tripleloader-message h4 {
font-size: 120%;
margin-top: 2em;
font-weight: normal;
}
}
.freebase-loading-tripleloader-message a {
font-size: 120%;
font-weight: bold;
}
}
.freebase-loading-authorization {
margin: 0em 2em;
@ -80,13 +80,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
background-color: #fff;
-moz-border-radius: 0.8em;
-webkit-border-radius: 0.8em;
}
}
.freebase-loading-tripleloader-info {
margin-bottom: 0.5em;
}
}
.freebase-loading-tripleloader-info textarea {
width: 99%;
height: 5em;
}
}

View File

@ -34,86 +34,86 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@import-less url("../theme.less");
.schema-alignment-dialog-canvas {
height: 375px;
overflow: auto;
padding: 10px;
margin-top: 3px;
background: white;
}
height: 375px;
overflow: auto;
padding: 10px;
margin-top: 3px;
background: white;
}
table.schema-alignment-table-layout {
border-collapse: collapse;
margin: 0px;
padding: 0px;
margin-bottom: 1em;
}
border-collapse: collapse;
margin: 0px;
padding: 0px;
margin-bottom: 1em;
}
table.schema-alignment-table-layout .padded {
padding: 3px 6px;
}
padding: 3px 6px;
}
div.schema-alignment-detail-container {
border-left: 3px solid #eee;
}
border-left: 3px solid #eee;
}
td.schema-alignment-node-main, td.schema-alignment-link-main {
white-space: pre;
width: 300px;
}
white-space: pre;
width: 300px;
}
td.schema-alignment-node-toggle, td.schema-alignment-link-toggle {
white-space: pre;
width: 1%;
}
white-space: pre;
width: 1%;
}
td.schema-alignment-node-toggle img, td.schema-alignment-link-toggle img {
cursor: pointer;
vertical-align: middle;
padding: 2px;
}
cursor: pointer;
vertical-align: middle;
padding: 2px;
}
td.schema-alignment-node-details, td.schema-alignment-link-details {
width: 90%;
}
width: 90%;
}
a.schema-alignment-node-tag {
padding: 3px 6px;
background: #ddd;
text-decoration: none;
color: black;
-moz-border-radius: 10px;
}
padding: 3px 6px;
background: #ddd;
text-decoration: none;
color: black;
-moz-border-radius: 10px;
}
a.schema-alignment-node-tag:hover {
background: #888;
color: white;
}
background: #888;
color: white;
}
.schema-alignment-node-column {
font-weight: bold;
}
font-weight: bold;
}
a.schema-alignment-link-tag {
padding: 3px 6px;
text-decoration: none;
color: black;
}
padding: 3px 6px;
text-decoration: none;
color: black;
}
a.schema-alignment-link-tag:hover {
color: #88f;
}
color: #88f;
}
div.schema-alignment-dialog-preview {
height: 400px;
overflow: auto;
background: white;
padding: 10px;
margin-top: 3px;
white-space: pre;
font-family: monospace;
font-size: 9pt;
}
height: 400px;
overflow: auto;
background: white;
padding: 10px;
margin-top: 3px;
white-space: pre;
font-family: monospace;
font-size: 9pt;
}
.schema-alignment-status-indicator {
color: #red;
}
color: #red;
}
/*--------------------------------------------------
* Node dialog
@ -121,18 +121,18 @@ div.schema-alignment-dialog-preview {
*/
.schema-align-node-dialog-node-type {
padding: 0.25em;
background: #ddf;
}
padding: 0.25em;
background: #ddf;
}
.schema-align-node-dialog-node-type input {
vertical-align: text-bottom;
}
vertical-align: text-bottom;
}
.schema-alignment-node-dialog-column-list {
height: 300px;
width: 200px;
overflow: auto;
border: 1px solid #ddd;
}
height: 300px;
width: 200px;
overflow: auto;
border: 1px solid #ddd;
}
/*--------------------------------------------------
* Link dialog
@ -140,10 +140,10 @@ div.schema-alignment-dialog-preview {
*/
.schema-alignment-link-menu-section {
padding: 8px;
border-bottom: 1px solid #ddd;
}
padding: 8px;
border-bottom: 1px solid #ddd;
}
.schema-alignment-link-menu-section-last {
padding: 8px;
}
padding: 8px;
}

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,7 +29,7 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
var html = "text/html";
var encoding = "UTF-8";
@ -39,43 +39,43 @@ var version = "0.2";
* Function invoked to initialize the extension.
*/
function init() {
// Packages.java.lang.System.err.println("Initializing gData extension");
// Packages.java.lang.System.err.println(module.getMountPoint());
//Packages.java.lang.System.err.println("Initializing gData extension");
//Packages.java.lang.System.err.println(module.getMountPoint());
var RS = Packages.com.google.refine.RefineServlet;
RS.registerCommand(module, "authorize", Packages.com.google.refine.extension.gdata.AuthorizeCommand());
RS.registerCommand(module, "authorize2", Packages.com.google.refine.extension.gdata.AuthorizeCommand2());
RS.registerCommand(module, "deauthorize", Packages.com.google.refine.extension.gdata.DeAuthorizeCommand());
var RS = Packages.com.google.refine.RefineServlet;
RS.registerCommand(module, "authorize", Packages.com.google.refine.extension.gdata.AuthorizeCommand());
RS.registerCommand(module, "authorize2", Packages.com.google.refine.extension.gdata.AuthorizeCommand2());
RS.registerCommand(module, "deauthorize", Packages.com.google.refine.extension.gdata.DeAuthorizeCommand());
// Register importer and exporter
var IM = Packages.com.google.refine.importing.ImportingManager;
IM.registerFormat("service/gdata", "GData services"); // generic format, no parser to handle it
IM.registerFormat("service/gdata/spreadsheet", "Google spreadsheets", false, "GoogleSpreadsheetParserUI",
new Packages.com.google.refine.extension.gdata.GDataImporter());
IM.registerUrlRewriter(new Packages.com.google.refine.extension.gdata.GDataUrlRewriter())
IM.registerUrlRewriter(new Packages.com.google.refine.extension.gdata.FusionTablesUrlRewriter())
// Register importer and exporter
var IM = Packages.com.google.refine.importing.ImportingManager;
IM.registerFormat("service/gdata", "GData services"); // generic format, no parser to handle it
IM.registerFormat("service/gdata/spreadsheet", "Google spreadsheets", false, "GoogleSpreadsheetParserUI",
new Packages.com.google.refine.extension.gdata.GDataImporter());
IM.registerUrlRewriter(new Packages.com.google.refine.extension.gdata.GDataUrlRewriter())
IM.registerUrlRewriter(new Packages.com.google.refine.extension.gdata.FusionTablesUrlRewriter())
// Packages.com.google.refine.exporters.ExporterRegistry.registerExporter(
// "gdata-exporter", new Packages.com.google.refine.extension.gdata.GDataExporter());
//Packages.com.google.refine.exporters.ExporterRegistry.registerExporter(
//"gdata-exporter", new Packages.com.google.refine.extension.gdata.GDataExporter());
// Script files to inject into /project page
var ClientSideResourceManager = Packages.com.google.refine.ClientSideResourceManager;
ClientSideResourceManager.addPaths(
"project/scripts",
module,
[
"scripts/project-injection.js"
]
);
// Script files to inject into /project page
var ClientSideResourceManager = Packages.com.google.refine.ClientSideResourceManager;
ClientSideResourceManager.addPaths(
"project/scripts",
module,
[
"scripts/project-injection.js"
]
);
// Style files to inject into /project page
ClientSideResourceManager.addPaths(
"project/styles",
module,
[
"styles/project-injection.less"
]
);
// Style files to inject into /project page
ClientSideResourceManager.addPaths(
"project/styles",
module,
[
"styles/project-injection.less"
]
);
}
@ -83,16 +83,16 @@ function init() {
* Function invoked to handle each request in a custom way.
*/
function process(path, request, response) {
// Analyze path and handle this request yourself.
// Analyze path and handle this request yourself.
if (path == "/" || path == "") {
var context = {};
// here's how to pass things into the .vt templates
context.version = version;
send(request, response, "index.vt", context);
}
if (path == "/" || path == "") {
var context = {};
// here's how to pass things into the .vt templates
context.version = version;
send(request, response, "index.vt", context);
}
}
function send(request, response, template, context) {
butterfly.sendTextFromTemplate(request, response, context, template, encoding, html);
butterfly.sendTextFromTemplate(request, response, context, template, encoding, html);
}

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,24 +29,24 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
function init() {
var libPath = new Packages.java.io.File(module.getPath(), "MOD-INF/lib/jython/").getCanonicalPath();
var libPath = new Packages.java.io.File(module.getPath(), "MOD-INF/lib/jython/").getCanonicalPath();
var S = Packages.java.lang.System;
var currentLibPath = S.getProperty("python.path");
if (currentLibPath == null) {
currentLibPath = libPath;
} else if (currentLibPath.indexOf(libPath) < 0) {
currentLibPath = currentLibPath + Packages.java.io.File.pathSeparator + libPath;
}
S.setProperty("python.path", currentLibPath);
var S = Packages.java.lang.System;
var currentLibPath = S.getProperty("python.path");
if (currentLibPath == null) {
currentLibPath = libPath;
} else if (currentLibPath.indexOf(libPath) < 0) {
currentLibPath = currentLibPath + Packages.java.io.File.pathSeparator + libPath;
}
S.setProperty("python.path", currentLibPath);
Packages.com.google.refine.expr.MetaParser.registerLanguageParser(
"jython",
"Jython",
Packages.com.google.refine.jython.JythonEvaluable.createParser(),
"return value"
);
Packages.com.google.refine.expr.MetaParser.registerLanguageParser(
"jython",
"Jython",
Packages.com.google.refine.jython.JythonEvaluable.createParser(),
"return value"
);
}

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,7 +29,7 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
var html = "text/html";
var encoding = "UTF-8";
@ -39,45 +39,45 @@ var ClientSideResourceManager = Packages.com.google.refine.ClientSideResourceMan
* Function invoked to initialize the extension.
*/
function init() {
// Packages.java.lang.System.err.println("Initializing sample extension");
// Packages.java.lang.System.err.println(module.getMountPoint());
// Packages.java.lang.System.err.println("Initializing sample extension");
// Packages.java.lang.System.err.println(module.getMountPoint());
// Script files to inject into /project page
ClientSideResourceManager.addPaths(
"project/scripts",
module,
[
"scripts/project-injection.js"
]
);
// Script files to inject into /project page
ClientSideResourceManager.addPaths(
"project/scripts",
module,
[
"scripts/project-injection.js"
]
);
// Style files to inject into /project page
ClientSideResourceManager.addPaths(
"project/styles",
module,
[
"styles/project-injection.less"
]
);
// Style files to inject into /project page
ClientSideResourceManager.addPaths(
"project/styles",
module,
[
"styles/project-injection.less"
]
);
}
/*
* Function invoked to handle each request in a custom way.
*/
function process(path, request, response) {
// Analyze path and handle this request yourself.
// Analyze path and handle this request yourself.
if (path == "/" || path == "") {
var context = {};
// here's how to pass things into the .vt templates
context.someList = ["Superior","Michigan","Huron","Erie","Ontario"];
context.someString = "foo";
context.someInt = Packages.com.google.refine.sampleExtension.SampleUtil.stringArrayLength(context.someList);
if (path == "/" || path == "") {
var context = {};
// here's how to pass things into the .vt templates
context.someList = ["Superior","Michigan","Huron","Erie","Ontario"];
context.someString = "foo";
context.someInt = Packages.com.google.refine.sampleExtension.SampleUtil.stringArrayLength(context.someList);
send(request, response, "index.vt", context);
}
send(request, response, "index.vt", context);
}
}
function send(request, response, template, context) {
butterfly.sendTextFromTemplate(request, response, context, template, encoding, html);
butterfly.sendTextFromTemplate(request, response, context, template, encoding, html);
}

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,7 +29,7 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
var html = "text/html";
var encoding = "UTF-8";
@ -37,529 +37,529 @@ var ClientSideResourceManager = Packages.com.google.refine.ClientSideResourceMan
var bundle = false;
var templatedFiles = {
// Requests with last path segments mentioned here
// will get served from .vt files with the same names
"import" : true,
"index" : true,
"preferences" : true,
"project" : true
// Requests with last path segments mentioned here
// will get served from .vt files with the same names
"import" : true,
"index" : true,
"preferences" : true,
"project" : true
};
function registerCommands() {
var RS = Packages.com.google.refine.RefineServlet;
var RS = Packages.com.google.refine.RefineServlet;
RS.registerCommand(module, "get-version", new Packages.com.google.refine.commands.GetVersionCommand());
RS.registerCommand(module, "get-version", new Packages.com.google.refine.commands.GetVersionCommand());
RS.registerCommand(module, "get-importing-configuration", new Packages.com.google.refine.commands.importing.GetImportingConfigurationCommand());
RS.registerCommand(module, "create-importing-job", new Packages.com.google.refine.commands.importing.CreateImportingJobCommand());
RS.registerCommand(module, "get-importing-job-status", new Packages.com.google.refine.commands.importing.GetImportingJobStatusCommand());
RS.registerCommand(module, "importing-controller", new Packages.com.google.refine.commands.importing.ImportingControllerCommand());
RS.registerCommand(module, "get-importing-configuration", new Packages.com.google.refine.commands.importing.GetImportingConfigurationCommand());
RS.registerCommand(module, "create-importing-job", new Packages.com.google.refine.commands.importing.CreateImportingJobCommand());
RS.registerCommand(module, "get-importing-job-status", new Packages.com.google.refine.commands.importing.GetImportingJobStatusCommand());
RS.registerCommand(module, "importing-controller", new Packages.com.google.refine.commands.importing.ImportingControllerCommand());
RS.registerCommand(module, "create-project-from-upload", new Packages.com.google.refine.commands.project.CreateProjectCommand());
RS.registerCommand(module, "import-project", new Packages.com.google.refine.commands.project.ImportProjectCommand());
RS.registerCommand(module, "export-project", new Packages.com.google.refine.commands.project.ExportProjectCommand());
RS.registerCommand(module, "export-rows", new Packages.com.google.refine.commands.project.ExportRowsCommand());
RS.registerCommand(module, "create-project-from-upload", new Packages.com.google.refine.commands.project.CreateProjectCommand());
RS.registerCommand(module, "import-project", new Packages.com.google.refine.commands.project.ImportProjectCommand());
RS.registerCommand(module, "export-project", new Packages.com.google.refine.commands.project.ExportProjectCommand());
RS.registerCommand(module, "export-rows", new Packages.com.google.refine.commands.project.ExportRowsCommand());
RS.registerCommand(module, "get-project-metadata", new Packages.com.google.refine.commands.project.GetProjectMetadataCommand());
RS.registerCommand(module, "get-all-project-metadata", new Packages.com.google.refine.commands.workspace.GetAllProjectMetadataCommand());
RS.registerCommand(module, "get-project-metadata", new Packages.com.google.refine.commands.project.GetProjectMetadataCommand());
RS.registerCommand(module, "get-all-project-metadata", new Packages.com.google.refine.commands.workspace.GetAllProjectMetadataCommand());
RS.registerCommand(module, "delete-project", new Packages.com.google.refine.commands.project.DeleteProjectCommand());
RS.registerCommand(module, "rename-project", new Packages.com.google.refine.commands.project.RenameProjectCommand());
RS.registerCommand(module, "delete-project", new Packages.com.google.refine.commands.project.DeleteProjectCommand());
RS.registerCommand(module, "rename-project", new Packages.com.google.refine.commands.project.RenameProjectCommand());
RS.registerCommand(module, "get-models", new Packages.com.google.refine.commands.project.GetModelsCommand());
RS.registerCommand(module, "get-rows", new Packages.com.google.refine.commands.row.GetRowsCommand());
RS.registerCommand(module, "get-processes", new Packages.com.google.refine.commands.history.GetProcessesCommand());
RS.registerCommand(module, "get-history", new Packages.com.google.refine.commands.history.GetHistoryCommand());
RS.registerCommand(module, "get-operations", new Packages.com.google.refine.commands.history.GetOperationsCommand());
RS.registerCommand(module, "get-columns-info", new Packages.com.google.refine.commands.column.GetColumnsInfoCommand());
RS.registerCommand(module, "get-scatterplot", new Packages.com.google.refine.commands.browsing.GetScatterplotCommand());
RS.registerCommand(module, "get-models", new Packages.com.google.refine.commands.project.GetModelsCommand());
RS.registerCommand(module, "get-rows", new Packages.com.google.refine.commands.row.GetRowsCommand());
RS.registerCommand(module, "get-processes", new Packages.com.google.refine.commands.history.GetProcessesCommand());
RS.registerCommand(module, "get-history", new Packages.com.google.refine.commands.history.GetHistoryCommand());
RS.registerCommand(module, "get-operations", new Packages.com.google.refine.commands.history.GetOperationsCommand());
RS.registerCommand(module, "get-columns-info", new Packages.com.google.refine.commands.column.GetColumnsInfoCommand());
RS.registerCommand(module, "get-scatterplot", new Packages.com.google.refine.commands.browsing.GetScatterplotCommand());
RS.registerCommand(module, "undo-redo", new Packages.com.google.refine.commands.history.UndoRedoCommand());
RS.registerCommand(module, "apply-operations", new Packages.com.google.refine.commands.history.ApplyOperationsCommand());
RS.registerCommand(module, "cancel-processes", new Packages.com.google.refine.commands.history.CancelProcessesCommand());
RS.registerCommand(module, "undo-redo", new Packages.com.google.refine.commands.history.UndoRedoCommand());
RS.registerCommand(module, "apply-operations", new Packages.com.google.refine.commands.history.ApplyOperationsCommand());
RS.registerCommand(module, "cancel-processes", new Packages.com.google.refine.commands.history.CancelProcessesCommand());
RS.registerCommand(module, "compute-facets", new Packages.com.google.refine.commands.browsing.ComputeFacetsCommand());
RS.registerCommand(module, "compute-clusters", new Packages.com.google.refine.commands.browsing.ComputeClustersCommand());
RS.registerCommand(module, "compute-facets", new Packages.com.google.refine.commands.browsing.ComputeFacetsCommand());
RS.registerCommand(module, "compute-clusters", new Packages.com.google.refine.commands.browsing.ComputeClustersCommand());
RS.registerCommand(module, "edit-one-cell", new Packages.com.google.refine.commands.cell.EditOneCellCommand());
RS.registerCommand(module, "text-transform", new Packages.com.google.refine.commands.cell.TextTransformCommand());
RS.registerCommand(module, "mass-edit", new Packages.com.google.refine.commands.cell.MassEditCommand());
RS.registerCommand(module, "join-multi-value-cells", new Packages.com.google.refine.commands.cell.JoinMultiValueCellsCommand());
RS.registerCommand(module, "split-multi-value-cells", new Packages.com.google.refine.commands.cell.SplitMultiValueCellsCommand());
RS.registerCommand(module, "fill-down", new Packages.com.google.refine.commands.cell.FillDownCommand());
RS.registerCommand(module, "blank-down", new Packages.com.google.refine.commands.cell.BlankDownCommand());
RS.registerCommand(module, "transpose-columns-into-rows", new Packages.com.google.refine.commands.cell.TransposeColumnsIntoRowsCommand());
RS.registerCommand(module, "transpose-rows-into-columns", new Packages.com.google.refine.commands.cell.TransposeRowsIntoColumnsCommand());
RS.registerCommand(module, "edit-one-cell", new Packages.com.google.refine.commands.cell.EditOneCellCommand());
RS.registerCommand(module, "text-transform", new Packages.com.google.refine.commands.cell.TextTransformCommand());
RS.registerCommand(module, "mass-edit", new Packages.com.google.refine.commands.cell.MassEditCommand());
RS.registerCommand(module, "join-multi-value-cells", new Packages.com.google.refine.commands.cell.JoinMultiValueCellsCommand());
RS.registerCommand(module, "split-multi-value-cells", new Packages.com.google.refine.commands.cell.SplitMultiValueCellsCommand());
RS.registerCommand(module, "fill-down", new Packages.com.google.refine.commands.cell.FillDownCommand());
RS.registerCommand(module, "blank-down", new Packages.com.google.refine.commands.cell.BlankDownCommand());
RS.registerCommand(module, "transpose-columns-into-rows", new Packages.com.google.refine.commands.cell.TransposeColumnsIntoRowsCommand());
RS.registerCommand(module, "transpose-rows-into-columns", new Packages.com.google.refine.commands.cell.TransposeRowsIntoColumnsCommand());
RS.registerCommand(module, "add-column", new Packages.com.google.refine.commands.column.AddColumnCommand());
RS.registerCommand(module, "add-column-by-fetching-urls", new Packages.com.google.refine.commands.column.AddColumnByFetchingURLsCommand());
RS.registerCommand(module, "remove-column", new Packages.com.google.refine.commands.column.RemoveColumnCommand());
RS.registerCommand(module, "rename-column", new Packages.com.google.refine.commands.column.RenameColumnCommand());
RS.registerCommand(module, "move-column", new Packages.com.google.refine.commands.column.MoveColumnCommand());
RS.registerCommand(module, "split-column", new Packages.com.google.refine.commands.column.SplitColumnCommand());
RS.registerCommand(module, "reorder-columns", new Packages.com.google.refine.commands.column.ReorderColumnsCommand());
RS.registerCommand(module, "add-column", new Packages.com.google.refine.commands.column.AddColumnCommand());
RS.registerCommand(module, "add-column-by-fetching-urls", new Packages.com.google.refine.commands.column.AddColumnByFetchingURLsCommand());
RS.registerCommand(module, "remove-column", new Packages.com.google.refine.commands.column.RemoveColumnCommand());
RS.registerCommand(module, "rename-column", new Packages.com.google.refine.commands.column.RenameColumnCommand());
RS.registerCommand(module, "move-column", new Packages.com.google.refine.commands.column.MoveColumnCommand());
RS.registerCommand(module, "split-column", new Packages.com.google.refine.commands.column.SplitColumnCommand());
RS.registerCommand(module, "reorder-columns", new Packages.com.google.refine.commands.column.ReorderColumnsCommand());
RS.registerCommand(module, "denormalize", new Packages.com.google.refine.commands.row.DenormalizeCommand());
RS.registerCommand(module, "denormalize", new Packages.com.google.refine.commands.row.DenormalizeCommand());
RS.registerCommand(module, "reconcile", new Packages.com.google.refine.commands.recon.ReconcileCommand());
RS.registerCommand(module, "recon-match-best-candidates", new Packages.com.google.refine.commands.recon.ReconMatchBestCandidatesCommand());
RS.registerCommand(module, "recon-mark-new-topics", new Packages.com.google.refine.commands.recon.ReconMarkNewTopicsCommand());
RS.registerCommand(module, "recon-discard-judgments", new Packages.com.google.refine.commands.recon.ReconDiscardJudgmentsCommand());
RS.registerCommand(module, "recon-match-specific-topic-to-cells", new Packages.com.google.refine.commands.recon.ReconMatchSpecificTopicCommand());
RS.registerCommand(module, "recon-judge-one-cell", new Packages.com.google.refine.commands.recon.ReconJudgeOneCellCommand());
RS.registerCommand(module, "recon-judge-similar-cells", new Packages.com.google.refine.commands.recon.ReconJudgeSimilarCellsCommand());
RS.registerCommand(module, "recon-clear-one-cell", new Packages.com.google.refine.commands.recon.ReconClearOneCellCommand());
RS.registerCommand(module, "recon-clear-similar-cells", new Packages.com.google.refine.commands.recon.ReconClearSimilarCellsCommand());
RS.registerCommand(module, "recon-copy-across-columns", new Packages.com.google.refine.commands.recon.ReconCopyAcrossColumnsCommand());
RS.registerCommand(module, "reconcile", new Packages.com.google.refine.commands.recon.ReconcileCommand());
RS.registerCommand(module, "recon-match-best-candidates", new Packages.com.google.refine.commands.recon.ReconMatchBestCandidatesCommand());
RS.registerCommand(module, "recon-mark-new-topics", new Packages.com.google.refine.commands.recon.ReconMarkNewTopicsCommand());
RS.registerCommand(module, "recon-discard-judgments", new Packages.com.google.refine.commands.recon.ReconDiscardJudgmentsCommand());
RS.registerCommand(module, "recon-match-specific-topic-to-cells", new Packages.com.google.refine.commands.recon.ReconMatchSpecificTopicCommand());
RS.registerCommand(module, "recon-judge-one-cell", new Packages.com.google.refine.commands.recon.ReconJudgeOneCellCommand());
RS.registerCommand(module, "recon-judge-similar-cells", new Packages.com.google.refine.commands.recon.ReconJudgeSimilarCellsCommand());
RS.registerCommand(module, "recon-clear-one-cell", new Packages.com.google.refine.commands.recon.ReconClearOneCellCommand());
RS.registerCommand(module, "recon-clear-similar-cells", new Packages.com.google.refine.commands.recon.ReconClearSimilarCellsCommand());
RS.registerCommand(module, "recon-copy-across-columns", new Packages.com.google.refine.commands.recon.ReconCopyAcrossColumnsCommand());
RS.registerCommand(module, "guess-types-of-column", new Packages.com.google.refine.commands.recon.GuessTypesOfColumnCommand());
RS.registerCommand(module, "guess-types-of-column", new Packages.com.google.refine.commands.recon.GuessTypesOfColumnCommand());
RS.registerCommand(module, "annotate-one-row", new Packages.com.google.refine.commands.row.AnnotateOneRowCommand());
RS.registerCommand(module, "annotate-rows", new Packages.com.google.refine.commands.row.AnnotateRowsCommand());
RS.registerCommand(module, "remove-rows", new Packages.com.google.refine.commands.row.RemoveRowsCommand());
RS.registerCommand(module, "reorder-rows", new Packages.com.google.refine.commands.row.ReorderRowsCommand());
RS.registerCommand(module, "annotate-one-row", new Packages.com.google.refine.commands.row.AnnotateOneRowCommand());
RS.registerCommand(module, "annotate-rows", new Packages.com.google.refine.commands.row.AnnotateRowsCommand());
RS.registerCommand(module, "remove-rows", new Packages.com.google.refine.commands.row.RemoveRowsCommand());
RS.registerCommand(module, "reorder-rows", new Packages.com.google.refine.commands.row.ReorderRowsCommand());
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-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());
RS.registerCommand(module, "open-workspace-dir", new Packages.com.google.refine.commands.OpenWorkspaceDirCommand());
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());
RS.registerCommand(module, "open-workspace-dir", new Packages.com.google.refine.commands.OpenWorkspaceDirCommand());
}
function registerOperations() {
var OR = Packages.com.google.refine.operations.OperationRegistry;
var OR = Packages.com.google.refine.operations.OperationRegistry;
OR.registerOperation(module, "text-transform", Packages.com.google.refine.operations.cell.TextTransformOperation);
OR.registerOperation(module, "mass-edit", Packages.com.google.refine.operations.cell.MassEditOperation);
OR.registerOperation(module, "text-transform", Packages.com.google.refine.operations.cell.TextTransformOperation);
OR.registerOperation(module, "mass-edit", Packages.com.google.refine.operations.cell.MassEditOperation);
OR.registerOperation(module, "multivalued-cell-join", Packages.com.google.refine.operations.cell.MultiValuedCellJoinOperation);
OR.registerOperation(module, "multivalued-cell-split", Packages.com.google.refine.operations.cell.MultiValuedCellSplitOperation);
OR.registerOperation(module, "fill-down", Packages.com.google.refine.operations.cell.FillDownOperation);
OR.registerOperation(module, "blank-down", Packages.com.google.refine.operations.cell.BlankDownOperation);
OR.registerOperation(module, "transpose-columns-into-rows", Packages.com.google.refine.operations.cell.TransposeColumnsIntoRowsOperation);
OR.registerOperation(module, "transpose-rows-into-columns", Packages.com.google.refine.operations.cell.TransposeRowsIntoColumnsOperation);
OR.registerOperation(module, "multivalued-cell-join", Packages.com.google.refine.operations.cell.MultiValuedCellJoinOperation);
OR.registerOperation(module, "multivalued-cell-split", Packages.com.google.refine.operations.cell.MultiValuedCellSplitOperation);
OR.registerOperation(module, "fill-down", Packages.com.google.refine.operations.cell.FillDownOperation);
OR.registerOperation(module, "blank-down", Packages.com.google.refine.operations.cell.BlankDownOperation);
OR.registerOperation(module, "transpose-columns-into-rows", Packages.com.google.refine.operations.cell.TransposeColumnsIntoRowsOperation);
OR.registerOperation(module, "transpose-rows-into-columns", Packages.com.google.refine.operations.cell.TransposeRowsIntoColumnsOperation);
OR.registerOperation(module, "column-addition", Packages.com.google.refine.operations.column.ColumnAdditionOperation);
OR.registerOperation(module, "column-removal", Packages.com.google.refine.operations.column.ColumnRemovalOperation);
OR.registerOperation(module, "column-rename", Packages.com.google.refine.operations.column.ColumnRenameOperation);
OR.registerOperation(module, "column-move", Packages.com.google.refine.operations.column.ColumnMoveOperation);
OR.registerOperation(module, "column-split", Packages.com.google.refine.operations.column.ColumnSplitOperation);
OR.registerOperation(module, "column-addition-by-fetching-urls", Packages.com.google.refine.operations.column.ColumnAdditionByFetchingURLsOperation);
OR.registerOperation(module, "column-reorder", Packages.com.google.refine.operations.column.ColumnReorderOperation);
OR.registerOperation(module, "column-addition", Packages.com.google.refine.operations.column.ColumnAdditionOperation);
OR.registerOperation(module, "column-removal", Packages.com.google.refine.operations.column.ColumnRemovalOperation);
OR.registerOperation(module, "column-rename", Packages.com.google.refine.operations.column.ColumnRenameOperation);
OR.registerOperation(module, "column-move", Packages.com.google.refine.operations.column.ColumnMoveOperation);
OR.registerOperation(module, "column-split", Packages.com.google.refine.operations.column.ColumnSplitOperation);
OR.registerOperation(module, "column-addition-by-fetching-urls", Packages.com.google.refine.operations.column.ColumnAdditionByFetchingURLsOperation);
OR.registerOperation(module, "column-reorder", Packages.com.google.refine.operations.column.ColumnReorderOperation);
OR.registerOperation(module, "row-removal", Packages.com.google.refine.operations.row.RowRemovalOperation);
OR.registerOperation(module, "row-star", Packages.com.google.refine.operations.row.RowStarOperation);
OR.registerOperation(module, "row-flag", Packages.com.google.refine.operations.row.RowFlagOperation);
OR.registerOperation(module, "row-reorder", Packages.com.google.refine.operations.row.RowReorderOperation);
OR.registerOperation(module, "row-removal", Packages.com.google.refine.operations.row.RowRemovalOperation);
OR.registerOperation(module, "row-star", Packages.com.google.refine.operations.row.RowStarOperation);
OR.registerOperation(module, "row-flag", Packages.com.google.refine.operations.row.RowFlagOperation);
OR.registerOperation(module, "row-reorder", Packages.com.google.refine.operations.row.RowReorderOperation);
OR.registerOperation(module, "recon", Packages.com.google.refine.operations.recon.ReconOperation);
OR.registerOperation(module, "recon-mark-new-topics", Packages.com.google.refine.operations.recon.ReconMarkNewTopicsOperation);
OR.registerOperation(module, "recon-match-best-candidates", Packages.com.google.refine.operations.recon.ReconMatchBestCandidatesOperation);
OR.registerOperation(module, "recon-discard-judgments", Packages.com.google.refine.operations.recon.ReconDiscardJudgmentsOperation);
OR.registerOperation(module, "recon-match-specific-topic-to-cells", Packages.com.google.refine.operations.recon.ReconMatchSpecificTopicOperation);
OR.registerOperation(module, "recon-judge-similar-cells", Packages.com.google.refine.operations.recon.ReconJudgeSimilarCellsOperation);
OR.registerOperation(module, "recon-clear-similar-cells", Packages.com.google.refine.operations.recon.ReconClearSimilarCellsOperation);
OR.registerOperation(module, "recon-copy-across-columns", Packages.com.google.refine.operations.recon.ReconCopyAcrossColumnsOperation);
OR.registerOperation(module, "recon", Packages.com.google.refine.operations.recon.ReconOperation);
OR.registerOperation(module, "recon-mark-new-topics", Packages.com.google.refine.operations.recon.ReconMarkNewTopicsOperation);
OR.registerOperation(module, "recon-match-best-candidates", Packages.com.google.refine.operations.recon.ReconMatchBestCandidatesOperation);
OR.registerOperation(module, "recon-discard-judgments", Packages.com.google.refine.operations.recon.ReconDiscardJudgmentsOperation);
OR.registerOperation(module, "recon-match-specific-topic-to-cells", Packages.com.google.refine.operations.recon.ReconMatchSpecificTopicOperation);
OR.registerOperation(module, "recon-judge-similar-cells", Packages.com.google.refine.operations.recon.ReconJudgeSimilarCellsOperation);
OR.registerOperation(module, "recon-clear-similar-cells", Packages.com.google.refine.operations.recon.ReconClearSimilarCellsOperation);
OR.registerOperation(module, "recon-copy-across-columns", Packages.com.google.refine.operations.recon.ReconCopyAcrossColumnsOperation);
}
function registerImporting() {
var IM = Packages.com.google.refine.importing.ImportingManager;
var IM = Packages.com.google.refine.importing.ImportingManager;
/*
* Formats and their UI class names and parsers:
* - UI class names are used on the client-side in Javascript to instantiate code that lets the user
* configure the parser's options.
* - Parsers are server-side code that do the actual parsing. Because they have access to the raw files,
* they also generate defaults for the client-side UIs to initialize.
*/
/*
* Formats and their UI class names and parsers:
* - UI class names are used on the client-side in Javascript to instantiate code that lets the user
* configure the parser's options.
* - Parsers are server-side code that do the actual parsing. Because they have access to the raw files,
* they also generate defaults for the client-side UIs to initialize.
*/
IM.registerFormat("text", "Text files"); // generic format, no parser to handle it
IM.registerFormat("text/line-based", "Line-based text files", "LineBasedParserUI",
new Packages.com.google.refine.importers.LineBasedImporter());
IM.registerFormat("text/line-based/*sv", "CSV / TSV / separator-based files", "SeparatorBasedParserUI",
new Packages.com.google.refine.importers.SeparatorBasedImporter());
IM.registerFormat("text/line-based/fixed-width", "Fixed-width field text files", "FixedWidthParserUI",
new Packages.com.google.refine.importers.FixedWidthImporter());
IM.registerFormat("text", "Text files"); // generic format, no parser to handle it
IM.registerFormat("text/line-based", "Line-based text files", "LineBasedParserUI",
new Packages.com.google.refine.importers.LineBasedImporter());
IM.registerFormat("text/line-based/*sv", "CSV / TSV / separator-based files", "SeparatorBasedParserUI",
new Packages.com.google.refine.importers.SeparatorBasedImporter());
IM.registerFormat("text/line-based/fixed-width", "Fixed-width field text files", "FixedWidthParserUI",
new Packages.com.google.refine.importers.FixedWidthImporter());
IM.registerFormat("text/xml", "XML files", "XmlParserUI", new Packages.com.google.refine.importers.XmlImporter());
IM.registerFormat("text/xml/xlsx", "Excel (.xlsx) files", "ExcelParserUI", new Packages.com.google.refine.importers.ExcelImporter());
IM.registerFormat("text/xml/rdf", "RDF/XML files", "RdfParserUI", new Packages.com.google.refine.importers.RdfTripleImporter());
IM.registerFormat("text/json", "JSON files", "JsonParserUI", new Packages.com.google.refine.importers.JsonImporter());
IM.registerFormat("text/marc", "MARC files");
IM.registerFormat("text/xml", "XML files", "XmlParserUI", new Packages.com.google.refine.importers.XmlImporter());
IM.registerFormat("text/xml/xlsx", "Excel (.xlsx) files", "ExcelParserUI", new Packages.com.google.refine.importers.ExcelImporter());
IM.registerFormat("text/xml/rdf", "RDF/XML files", "RdfParserUI", new Packages.com.google.refine.importers.RdfTripleImporter());
IM.registerFormat("text/json", "JSON files", "JsonParserUI", new Packages.com.google.refine.importers.JsonImporter());
IM.registerFormat("text/marc", "MARC files");
IM.registerFormat("binary", "Binary files"); // generic format, no parser to handle it
IM.registerFormat("binary/xls", "Excel files", "ExcelParserUI", new Packages.com.google.refine.importers.ExcelImporter());
IM.registerFormat("binary", "Binary files"); // generic format, no parser to handle it
IM.registerFormat("binary/xls", "Excel files", "ExcelParserUI", new Packages.com.google.refine.importers.ExcelImporter());
IM.registerFormat("service", "Services"); // generic format, no parser to handle it
IM.registerFormat("service", "Services"); // generic format, no parser to handle it
/*
* Extension to format mappings
*/
IM.registerExtension(".txt", "text/line-based");
IM.registerExtension(".csv", "text/line-based/*sv");
IM.registerExtension(".tsv", "text/line-based/*sv");
/*
* Extension to format mappings
*/
IM.registerExtension(".txt", "text/line-based");
IM.registerExtension(".csv", "text/line-based/*sv");
IM.registerExtension(".tsv", "text/line-based/*sv");
IM.registerExtension(".xml", "text/xml");
IM.registerExtension(".rdf", "text/xml/rdf");
IM.registerExtension(".xml", "text/xml");
IM.registerExtension(".rdf", "text/xml/rdf");
IM.registerExtension(".json", "text/json");
IM.registerExtension(".js", "text/json");
IM.registerExtension(".json", "text/json");
IM.registerExtension(".js", "text/json");
IM.registerExtension(".xls", "binary/xls");
IM.registerExtension(".xlsx", "text/xml/xlsx");
IM.registerExtension(".xls", "binary/xls");
IM.registerExtension(".xlsx", "text/xml/xlsx");
IM.registerExtension(".marc", "text/marc");
IM.registerExtension(".mrc", "text/marc");
IM.registerExtension(".marc", "text/marc");
IM.registerExtension(".mrc", "text/marc");
/*
* Mime type to format mappings
*/
IM.registerMimeType("text/plain", "text/line-based");
IM.registerMimeType("text/csv", "text/line-based/*sv");
IM.registerMimeType("text/x-csv", "text/line-based/*sv");
IM.registerMimeType("text/tab-separated-value", "text/line-based/*sv");
/*
* Mime type to format mappings
*/
IM.registerMimeType("text/plain", "text/line-based");
IM.registerMimeType("text/csv", "text/line-based/*sv");
IM.registerMimeType("text/x-csv", "text/line-based/*sv");
IM.registerMimeType("text/tab-separated-value", "text/line-based/*sv");
IM.registerMimeType("text/fixed-width", "text/line-based/fixed-width");
IM.registerMimeType("text/fixed-width", "text/line-based/fixed-width");
IM.registerMimeType("application/msexcel", "binary/xls");
IM.registerMimeType("application/x-msexcel", "binary/xls");
IM.registerMimeType("application/x-ms-excel", "binary/xls");
IM.registerMimeType("application/vnd.ms-excel", "binary/xls");
IM.registerMimeType("application/x-excel", "binary/xls");
IM.registerMimeType("application/xls", "binary/xls");
IM.registerMimeType("application/x-xls", "text/xml/xlsx");
IM.registerMimeType("application/msexcel", "binary/xls");
IM.registerMimeType("application/x-msexcel", "binary/xls");
IM.registerMimeType("application/x-ms-excel", "binary/xls");
IM.registerMimeType("application/vnd.ms-excel", "binary/xls");
IM.registerMimeType("application/x-excel", "binary/xls");
IM.registerMimeType("application/xls", "binary/xls");
IM.registerMimeType("application/x-xls", "text/xml/xlsx");
IM.registerMimeType("application/json", "text/json");
IM.registerMimeType("text/json", "text/json");
IM.registerMimeType("application/json", "text/json");
IM.registerMimeType("text/json", "text/json");
IM.registerMimeType("application/rdf+xml", "text/xml/rdf");
IM.registerMimeType("application/rdf+xml", "text/xml/rdf");
IM.registerMimeType("application/marc", "text/marc");
IM.registerMimeType("application/marc", "text/marc");
/*
* Format guessers: these take a format derived from extensions or mime-types,
* look at the actual files' content, and try to guess a better format.
*/
IM.registerFormatGuesser("text", new Packages.com.google.refine.importers.TextFormatGuesser());
IM.registerFormatGuesser("text/line-based", new Packages.com.google.refine.importers.LineBasedFormatGuesser());
/*
* Format guessers: these take a format derived from extensions or mime-types,
* look at the actual files' content, and try to guess a better format.
*/
IM.registerFormatGuesser("text", new Packages.com.google.refine.importers.TextFormatGuesser());
IM.registerFormatGuesser("text/line-based", new Packages.com.google.refine.importers.LineBasedFormatGuesser());
/*
* Controllers: these implement high-level UI flows for importing data. For example, the default
* controller lets the user specify one or more source files, either local or remote or on the clipboard,
* lets the user select which files to actually import in case any of the original file is an archive
* containing several files, and then lets the user configure parsing options.
*/
IM.registerController(
module,
"default-importing-controller",
new Packages.com.google.refine.importing.DefaultImportingController()
);
/*
* Controllers: these implement high-level UI flows for importing data. For example, the default
* controller lets the user specify one or more source files, either local or remote or on the clipboard,
* lets the user select which files to actually import in case any of the original file is an archive
* containing several files, and then lets the user configure parsing options.
*/
IM.registerController(
module,
"default-importing-controller",
new Packages.com.google.refine.importing.DefaultImportingController()
);
}
/*
* This optional function is invoked from the module's init() Java function.
*/
function init() {
// Packages.java.lang.System.err.println("Initializing by script " + module);
// Packages.java.lang.System.err.println("Initializing by script " + module);
registerCommands();
registerOperations();
registerImporting();
registerCommands();
registerOperations();
registerImporting();
var RC = Packages.com.google.refine.model.recon.ReconConfig;
RC.registerReconConfig(module, "standard-service", Packages.com.google.refine.model.recon.StandardReconConfig);
var RC = Packages.com.google.refine.model.recon.ReconConfig;
RC.registerReconConfig(module, "standard-service", Packages.com.google.refine.model.recon.StandardReconConfig);
ClientSideResourceManager.addPaths(
"index/scripts",
module,
[
"externals/jquery-1.4.2.min.js",
"externals/jquery.cookie.js",
"externals/jquery.eventstack-0.3.js",
"externals/jquery-ui/jquery-ui-1.8.custom.min.js",
"externals/date.js",
ClientSideResourceManager.addPaths(
"index/scripts",
module,
[
"externals/jquery-1.4.2.min.js",
"externals/jquery.cookie.js",
"externals/jquery.eventstack-0.3.js",
"externals/jquery-ui/jquery-ui-1.8.custom.min.js",
"externals/date.js",
"scripts/util/misc.js",
"scripts/util/url.js",
"scripts/util/string.js",
"scripts/util/ajax.js",
"scripts/util/menu.js",
"scripts/util/dialog.js",
"scripts/util/dom.js",
"scripts/util/misc.js",
"scripts/util/url.js",
"scripts/util/string.js",
"scripts/util/ajax.js",
"scripts/util/menu.js",
"scripts/util/dialog.js",
"scripts/util/dom.js",
"scripts/index.js",
"scripts/index/create-project-ui.js",
"scripts/index/open-project-ui.js",
"scripts/index/import-project-ui.js",
"scripts/index.js",
"scripts/index/create-project-ui.js",
"scripts/index/open-project-ui.js",
"scripts/index/import-project-ui.js",
"scripts/index/default-importing-controller/controller.js",
"scripts/index/default-importing-controller/file-selection-panel.js",
"scripts/index/default-importing-controller/parsing-panel.js",
"scripts/index/default-importing-controller/controller.js",
"scripts/index/default-importing-controller/file-selection-panel.js",
"scripts/index/default-importing-controller/parsing-panel.js",
"scripts/index/default-importing-sources/sources.js",
"scripts/index/parser-interfaces/preview-table.js",
"scripts/index/parser-interfaces/separator-based-parser-ui.js",
"scripts/index/parser-interfaces/line-based-parser-ui.js",
"scripts/index/parser-interfaces/fixed-width-parser-ui.js",
"scripts/index/parser-interfaces/excel-parser-ui.js",
"scripts/index/parser-interfaces/xml-parser-ui.js",
"scripts/index/parser-interfaces/json-parser-ui.js"
]
);
"scripts/index/default-importing-sources/sources.js",
"scripts/index/parser-interfaces/preview-table.js",
"scripts/index/parser-interfaces/separator-based-parser-ui.js",
"scripts/index/parser-interfaces/line-based-parser-ui.js",
"scripts/index/parser-interfaces/fixed-width-parser-ui.js",
"scripts/index/parser-interfaces/excel-parser-ui.js",
"scripts/index/parser-interfaces/xml-parser-ui.js",
"scripts/index/parser-interfaces/json-parser-ui.js"
]
);
ClientSideResourceManager.addPaths(
"index/styles",
module,
[
"externals/jquery-ui/css/ui-lightness/jquery-ui-1.8.custom.css",
"styles/jquery-ui-overrides.less",
"styles/common.less",
"styles/pure.css",
"styles/index.less",
"styles/index/create-project-ui.less",
"styles/index/open-project-ui.less",
"styles/index/import-project-ui.less",
ClientSideResourceManager.addPaths(
"index/styles",
module,
[
"externals/jquery-ui/css/ui-lightness/jquery-ui-1.8.custom.css",
"styles/jquery-ui-overrides.less",
"styles/common.less",
"styles/pure.css",
"styles/index.less",
"styles/index/create-project-ui.less",
"styles/index/open-project-ui.less",
"styles/index/import-project-ui.less",
"styles/index/default-importing-controller.less",
"styles/index/default-importing-file-selection-panel.less",
"styles/index/default-importing-parsing-panel.less",
"styles/index/default-importing-controller.less",
"styles/index/default-importing-file-selection-panel.less",
"styles/index/default-importing-parsing-panel.less",
"styles/index/default-importing-sources.less",
"styles/views/data-table-view.less", // for the preview table's styles
"styles/index/fixed-width-parser-ui.less",
"styles/index/xml-parser-ui.less",
"styles/index/json-parser-ui.less"
]
);
"styles/index/default-importing-sources.less",
"styles/views/data-table-view.less", // for the preview table's styles
"styles/index/fixed-width-parser-ui.less",
"styles/index/xml-parser-ui.less",
"styles/index/json-parser-ui.less"
]
);
ClientSideResourceManager.addPaths(
"project/scripts",
module,
[
"externals/jquery-1.4.2.min.js",
"externals/jquery.cookie.js",
"externals/jquery.eventstack-0.3.js",
"externals/suggest/suggest-1.2.1.min.js",
"externals/jquery-ui/jquery-ui-1.8.custom.min.js",
"externals/imgareaselect/jquery.imgareaselect.js",
"externals/date.js",
ClientSideResourceManager.addPaths(
"project/scripts",
module,
[
"externals/jquery-1.4.2.min.js",
"externals/jquery.cookie.js",
"externals/jquery.eventstack-0.3.js",
"externals/suggest/suggest-1.2.1.min.js",
"externals/jquery-ui/jquery-ui-1.8.custom.min.js",
"externals/imgareaselect/jquery.imgareaselect.js",
"externals/date.js",
"scripts/project.js",
"scripts/project.js",
"scripts/util/misc.js",
"scripts/util/url.js",
"scripts/util/string.js",
"scripts/util/ajax.js",
"scripts/util/menu.js",
"scripts/util/dialog.js",
"scripts/util/dom.js",
"scripts/util/custom-suggest.js",
"scripts/util/misc.js",
"scripts/util/url.js",
"scripts/util/string.js",
"scripts/util/ajax.js",
"scripts/util/menu.js",
"scripts/util/dialog.js",
"scripts/util/dom.js",
"scripts/util/custom-suggest.js",
"scripts/widgets/histogram-widget.js",
"scripts/widgets/slider-widget.js",
"scripts/widgets/histogram-widget.js",
"scripts/widgets/slider-widget.js",
"scripts/project/browsing-engine.js",
"scripts/project/history-panel.js",
"scripts/project/process-panel.js",
"scripts/project/extension-bar.js",
"scripts/project/summary-bar.js",
"scripts/project/exporters.js",
"scripts/project/scripting.js",
"scripts/project/browsing-engine.js",
"scripts/project/history-panel.js",
"scripts/project/process-panel.js",
"scripts/project/extension-bar.js",
"scripts/project/summary-bar.js",
"scripts/project/exporters.js",
"scripts/project/scripting.js",
"scripts/facets/list-facet.js",
"scripts/facets/range-facet.js",
"scripts/facets/timerange-facet.js",
"scripts/facets/scatterplot-facet.js",
"scripts/facets/text-search-facet.js",
"scripts/facets/list-facet.js",
"scripts/facets/range-facet.js",
"scripts/facets/timerange-facet.js",
"scripts/facets/scatterplot-facet.js",
"scripts/facets/text-search-facet.js",
"scripts/views/data-table/data-table-view.js",
"scripts/views/data-table/cell-ui.js",
"scripts/views/data-table/column-header-ui.js",
"scripts/views/data-table/menu-facets.js",
"scripts/views/data-table/menu-edit-cells.js",
"scripts/views/data-table/menu-edit-column.js",
"scripts/views/data-table/menu-reconcile.js",
"scripts/views/data-table/data-table-view.js",
"scripts/views/data-table/cell-ui.js",
"scripts/views/data-table/column-header-ui.js",
"scripts/views/data-table/menu-facets.js",
"scripts/views/data-table/menu-edit-cells.js",
"scripts/views/data-table/menu-edit-column.js",
"scripts/views/data-table/menu-reconcile.js",
"scripts/reconciliation/recon-manager.js",
"scripts/reconciliation/recon-dialog.js",
"scripts/reconciliation/freebase-query-panel.js",
"scripts/reconciliation/standard-service-panel.js",
"scripts/reconciliation/recon-manager.js",
"scripts/reconciliation/recon-dialog.js",
"scripts/reconciliation/freebase-query-panel.js",
"scripts/reconciliation/standard-service-panel.js",
"scripts/dialogs/expression-preview-dialog.js",
"scripts/dialogs/clustering-dialog.js",
"scripts/dialogs/scatterplot-dialog.js",
"scripts/dialogs/templating-exporter-dialog.js",
"scripts/dialogs/column-reordering-dialog.js"
]
);
"scripts/dialogs/expression-preview-dialog.js",
"scripts/dialogs/clustering-dialog.js",
"scripts/dialogs/scatterplot-dialog.js",
"scripts/dialogs/templating-exporter-dialog.js",
"scripts/dialogs/column-reordering-dialog.js"
]
);
ClientSideResourceManager.addPaths(
"project/styles",
module,
[
"externals/suggest/css/suggest-1.2.1.min.css",
"externals/jquery-ui/css/ui-lightness/jquery-ui-1.8.custom.css",
"externals/imgareaselect/css/imgareaselect-default.css",
ClientSideResourceManager.addPaths(
"project/styles",
module,
[
"externals/suggest/css/suggest-1.2.1.min.css",
"externals/jquery-ui/css/ui-lightness/jquery-ui-1.8.custom.css",
"externals/imgareaselect/css/imgareaselect-default.css",
"styles/jquery-ui-overrides.less",
"styles/common.less",
"styles/pure.css",
"styles/jquery-ui-overrides.less",
"styles/common.less",
"styles/pure.css",
"styles/util/menu.less",
"styles/util/dialog.less",
"styles/util/custom-suggest.less",
"styles/util/menu.less",
"styles/util/dialog.less",
"styles/util/custom-suggest.less",
"styles/project.less",
"styles/project/sidebar.less",
"styles/project/facets.less",
"styles/project/process.less",
"styles/project.less",
"styles/project/sidebar.less",
"styles/project/facets.less",
"styles/project/process.less",
"styles/widgets/histogram-widget.less",
"styles/widgets/slider-widget.less",
"styles/widgets/histogram-widget.less",
"styles/widgets/slider-widget.less",
"styles/views/data-table-view.less",
"styles/views/data-table-view.less",
"styles/dialogs/expression-preview-dialog.less",
"styles/dialogs/clustering-dialog.less",
"styles/dialogs/scatterplot-dialog.less",
"styles/dialogs/column-reordering-dialog.less",
"styles/dialogs/expression-preview-dialog.less",
"styles/dialogs/clustering-dialog.less",
"styles/dialogs/scatterplot-dialog.less",
"styles/dialogs/column-reordering-dialog.less",
"styles/reconciliation/recon-dialog.less",
"styles/reconciliation/standard-service-panel.less"
]
);
"styles/reconciliation/recon-dialog.less",
"styles/reconciliation/standard-service-panel.less"
]
);
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/jquery-ui-overrides.less",
"styles/common.less",
"styles/pure.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/jquery-ui-overrides.less",
"styles/common.less",
"styles/pure.css"
]
);
}
/*
* This is the function that is invoked by Butterfly
*/
function process(path, request, response) {
if (path == "wirings.js") {
var wirings = butterfly.getWirings(request);
butterfly.sendString(
request,
response,
"var ModuleWirings = " + butterfly.toJSONString(wirings) + ";",
encoding,
"text/javascript"
);
} else {
if (path == "/" || path == "") {
path = "/index";
} else if (path.endsWith("/")) {
path = path.substring(0, path.length - 1);
}
var slash = path.lastIndexOf("/");
var lastSegment = slash >= 0 ? path.substring(slash + 1) : path;
if (path.endsWith("-bundle.js")) {
lastSegment = lastSegment.substring(0, lastSegment.length - "-bundle.js".length);
response.setContentType("text/javascript");
response.setCharacterEncoding(encoding);
var output = response.getWriter();
try {
var paths = ClientSideResourceManager.getPaths(lastSegment + "/scripts");
for each (var qualifiedPath in paths) {
var input = null;
try {
var url = qualifiedPath.module.getResource(qualifiedPath.path);
var urlConnection = url.openConnection();
input = new Packages.java.io.BufferedReader(
new Packages.java.io.InputStreamReader(urlConnection.getInputStream()));
output.write("/* ===== ");
output.write(qualifiedPath.fullPath);
output.write(" ===== */\n\n");
Packages.org.apache.commons.io.IOUtils.copy(input, output);
output.write("\n\n");
} catch (e) {
// silent
} finally {
if (input != null) input.close();
}
}
} catch (e) {
// silent
} finally {
butterfly.responded();
}
return true;
} else {
if (lastSegment in templatedFiles) {
var context = {};
var params = new Packages.java.util.Properties();
var e = request.getParameterNames();
while (e.hasMoreElements()) {
var name = e.nextElement();
params.put(name, request.getParameterValues(name)[0]);
}
context.params = params;
context.projectID = request.getParameter("project");
var styles = ClientSideResourceManager.getPaths(lastSegment + "/styles");
var styleInjection = [];
for each (var qualifiedPath in styles) {
styleInjection.push(
'<link type="text/css" rel="stylesheet" href="' + qualifiedPath.fullPath + '" />');
}
context.styleInjection = styleInjection.join("\n");
if (bundle) {
context.scriptInjection = '<script type="text/javascript" src="' + path + '-bundle.js"></script>';
} else {
var scripts = ClientSideResourceManager.getPaths(lastSegment + "/scripts");
var scriptInjection = [];
for each (var qualifiedPath in scripts) {
scriptInjection.push(
'<script type="text/javascript" src="' + qualifiedPath.fullPath + '"></script>');
}
context.scriptInjection = scriptInjection.join("\n");
}
send(request, response, path + ".vt", context);
}
}
if (path == "wirings.js") {
var wirings = butterfly.getWirings(request);
butterfly.sendString(
request,
response,
"var ModuleWirings = " + butterfly.toJSONString(wirings) + ";",
encoding,
"text/javascript"
);
} else {
if (path == "/" || path == "") {
path = "/index";
} else if (path.endsWith("/")) {
path = path.substring(0, path.length - 1);
}
var slash = path.lastIndexOf("/");
var lastSegment = slash >= 0 ? path.substring(slash + 1) : path;
if (path.endsWith("-bundle.js")) {
lastSegment = lastSegment.substring(0, lastSegment.length - "-bundle.js".length);
response.setContentType("text/javascript");
response.setCharacterEncoding(encoding);
var output = response.getWriter();
try {
var paths = ClientSideResourceManager.getPaths(lastSegment + "/scripts");
for each (var qualifiedPath in paths) {
var input = null;
try {
var url = qualifiedPath.module.getResource(qualifiedPath.path);
var urlConnection = url.openConnection();
input = new Packages.java.io.BufferedReader(
new Packages.java.io.InputStreamReader(urlConnection.getInputStream()));
output.write("/* ===== ");
output.write(qualifiedPath.fullPath);
output.write(" ===== */\n\n");
Packages.org.apache.commons.io.IOUtils.copy(input, output);
output.write("\n\n");
} catch (e) {
// silent
} finally {
if (input != null) input.close();
}
}
} catch (e) {
// silent
} finally {
butterfly.responded();
}
return true;
} else {
if (lastSegment in templatedFiles) {
var context = {};
var params = new Packages.java.util.Properties();
var e = request.getParameterNames();
while (e.hasMoreElements()) {
var name = e.nextElement();
params.put(name, request.getParameterValues(name)[0]);
}
context.params = params;
context.projectID = request.getParameter("project");
var styles = ClientSideResourceManager.getPaths(lastSegment + "/styles");
var styleInjection = [];
for each (var qualifiedPath in styles) {
styleInjection.push(
'<link type="text/css" rel="stylesheet" href="' + qualifiedPath.fullPath + '" />');
}
context.styleInjection = styleInjection.join("\n");
if (bundle) {
context.scriptInjection = '<script type="text/javascript" src="' + path + '-bundle.js"></script>';
} else {
var scripts = ClientSideResourceManager.getPaths(lastSegment + "/scripts");
var scriptInjection = [];
for each (var qualifiedPath in scripts) {
scriptInjection.push(
'<script type="text/javascript" src="' + qualifiedPath.fullPath + '"></script>');
}
context.scriptInjection = scriptInjection.join("\n");
}
send(request, response, path + ".vt", context);
}
}
}
}
function send(request, response, template, context) {
butterfly.sendTextFromTemplate(request, response, context, template, encoding, html);
butterfly.sendTextFromTemplate(request, response, context, template, encoding, html);
}

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -34,141 +34,141 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
var GoogleRefineVersion;
var Refine = {
actionAreas: []
actionAreas: []
};
Refine.selectActionArea = function(id) {
$('.action-area-tab').removeClass('selected');
$('.action-area-tab-body').css('visibility', 'hidden').css('z-index', '100');
$('.action-area-tab').removeClass('selected');
$('.action-area-tab-body').css('visibility', 'hidden').css('z-index', '100');
for (var i = 0; i < Refine.actionAreas.length; i++) {
var actionArea = Refine.actionAreas[i];
if (id == actionArea.id) {
actionArea.tabElmt.addClass('selected');
actionArea.bodyElmt.css('visibility', 'visible').css('z-index', '110');;
}
for (var i = 0; i < Refine.actionAreas.length; i++) {
var actionArea = Refine.actionAreas[i];
if (id == actionArea.id) {
actionArea.tabElmt.addClass('selected');
actionArea.bodyElmt.css('visibility', 'visible').css('z-index', '110');;
}
}
};
$(function() {
var isThereNewRelease = function() {
var thisRevision = GoogleRefineVersion.revision;
var isThereNewRelease = function() {
var thisRevision = GoogleRefineVersion.revision;
var revision_pattern = /r([0-9]+)/;
var revision_pattern = /r([0-9]+)/;
if (!revision_pattern.test(thisRevision)) { // probably "trunk"
return false;
}
if (!revision_pattern.test(thisRevision)) { // probably "trunk"
return false;
}
var latestRevision = GoogleRefineReleases.releases[0].revision;
var latestRevision = GoogleRefineReleases.releases[0].revision;
var thisRev = parseInt(revision_pattern.exec(thisRevision)[1],10);
var latestRev = parseInt(revision_pattern.exec(GoogleRefineReleases.releases[0].revision)[1],10);
var thisRev = parseInt(revision_pattern.exec(thisRevision)[1],10);
var latestRev = parseInt(revision_pattern.exec(GoogleRefineReleases.releases[0].revision)[1],10);
return latestRev > thisRev;
};
return latestRev > thisRev;
};
var showVersion = function() {
$.getJSON(
var showVersion = function() {
$.getJSON(
"/command/core/get-version",
null,
function(data) {
GoogleRefineVersion = data;
GoogleRefineVersion = data;
$("#google-refine-version").text("Version " + GoogleRefineVersion.full_version);
$("#google-refine-version").text("Version " + GoogleRefineVersion.full_version);
var script = $('<script></script>')
.attr("src", "http://google-refine.googlecode.com/svn/support/releases.js")
.attr("type", "text/javascript")
.appendTo(document.body);
var script = $('<script></script>')
.attr("src", "http://google-refine.googlecode.com/svn/support/releases.js")
.attr("type", "text/javascript")
.appendTo(document.body);
var poll = function() {
if ("releases" in window) {
if (isThereNewRelease()) {
var container = $('<div id="notification-container">')
.appendTo(document.body)
var notification = $('<div id="notification">')
.text('New version! ')
.appendTo(container)
$('<a>')
.addClass('notification-action')
.attr("href", releases.homepage)
.text('Download ' + releases.releases[0].description + ' now.')
.appendTo(notification);
}
} else {
window.setTimeout(poll, 1000);
}
};
window.setTimeout(poll, 1000);
var poll = function() {
if ("releases" in window) {
if (isThereNewRelease()) {
var container = $('<div id="notification-container">')
.appendTo(document.body)
var notification = $('<div id="notification">')
.text('New version! ')
.appendTo(container)
$('<a>')
.addClass('notification-action')
.attr("href", releases.homepage)
.text('Download ' + releases.releases[0].description + ' now.')
.appendTo(notification);
}
} else {
window.setTimeout(poll, 1000);
}
};
window.setTimeout(poll, 1000);
}
);
};
);
};
var resize = function() {
var leftPanelWidth = 150;
// px
var width = $(window).width();
var height = $(window).height();
var headerHeight = $('#header').outerHeight();
var panelHeight = height - headerHeight;
var resize = function() {
var leftPanelWidth = 150;
// px
var width = $(window).width();
var height = $(window).height();
var headerHeight = $('#header').outerHeight();
var panelHeight = height - headerHeight;
$('.main-layout-panel')
.css("top", headerHeight + "px")
.css("bottom", "0px")
.css("height", panelHeight + "px")
.css("visibility", "visible");
$('.main-layout-panel')
.css("top", headerHeight + "px")
.css("bottom", "0px")
.css("height", panelHeight + "px")
.css("visibility", "visible");
$('#left-panel')
.css("left", "0px")
.css("width", leftPanelWidth + "px");
var leftPanelBodyHPaddings = 10;
// px
var leftPanelBodyVPaddings = 0;
// px
$('#left-panel-body')
.css("margin-left", leftPanelBodyHPaddings + "px")
.css("margin-top", leftPanelBodyVPaddings + "px")
.css("width", ($('#left-panel').width() - leftPanelBodyHPaddings) + "px")
.css("height", ($('#left-panel').height() - leftPanelBodyVPaddings) + "px");
$('#left-panel')
.css("left", "0px")
.css("width", leftPanelWidth + "px");
var leftPanelBodyHPaddings = 10;
// px
var leftPanelBodyVPaddings = 0;
// px
$('#left-panel-body')
.css("margin-left", leftPanelBodyHPaddings + "px")
.css("margin-top", leftPanelBodyVPaddings + "px")
.css("width", ($('#left-panel').width() - leftPanelBodyHPaddings) + "px")
.css("height", ($('#left-panel').height() - leftPanelBodyVPaddings) + "px");
$('#right-panel')
.css("left", leftPanelWidth + "px")
.css("width", (width - leftPanelWidth) + "px");
$('#right-panel')
.css("left", leftPanelWidth + "px")
.css("width", (width - leftPanelWidth) + "px");
var rightPanelBodyHPaddings = 5;
// px
var rightPanelBodyVPaddings = 5;
// px
$('#right-panel-body')
.css("margin-left", rightPanelBodyHPaddings + "px")
.css("margin-top", rightPanelBodyVPaddings + "px")
.css("width", ($('#right-panel').width() - rightPanelBodyHPaddings) + "px")
.css("height", ($('#right-panel').height() - rightPanelBodyVPaddings) + "px");
};
$(window).bind("resize", resize);
window.setTimeout(resize, 50); // for Chrome, give the window some time to layout first
var rightPanelBodyHPaddings = 5;
// px
var rightPanelBodyVPaddings = 5;
// px
$('#right-panel-body')
.css("margin-left", rightPanelBodyHPaddings + "px")
.css("margin-top", rightPanelBodyVPaddings + "px")
.css("width", ($('#right-panel').width() - rightPanelBodyHPaddings) + "px")
.css("height", ($('#right-panel').height() - rightPanelBodyVPaddings) + "px");
};
$(window).bind("resize", resize);
window.setTimeout(resize, 50); // for Chrome, give the window some time to layout first
var renderActionArea = function(actionArea) {
actionArea.bodyElmt = $('<div>')
.addClass('action-area-tab-body')
.appendTo('#right-panel-body');
var renderActionArea = function(actionArea) {
actionArea.bodyElmt = $('<div>')
.addClass('action-area-tab-body')
.appendTo('#right-panel-body');
actionArea.tabElmt = $('<li>')
.addClass('action-area-tab')
.text(actionArea.label)
.appendTo($('#action-area-tabs'))
.click(function() {
Refine.selectActionArea(actionArea.id);
});
actionArea.tabElmt = $('<li>')
.addClass('action-area-tab')
.text(actionArea.label)
.appendTo($('#action-area-tabs'))
.click(function() {
Refine.selectActionArea(actionArea.id);
});
actionArea.ui = new actionArea.uiClass(actionArea.bodyElmt);
};
actionArea.ui = new actionArea.uiClass(actionArea.bodyElmt);
};
for (var i = 0; i < Refine.actionAreas.length; i++) {
renderActionArea(Refine.actionAreas[i]);
}
Refine.selectActionArea('create-project');
for (var i = 0; i < Refine.actionAreas.length; i++) {
renderActionArea(Refine.actionAreas[i]);
}
Refine.selectActionArea('create-project');
showVersion();
showVersion();
});

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,113 +29,113 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
Refine.CreateProjectUI = function(elmt) {
var self = this;
var self = this;
this._elmt = elmt;
this._sourceSelectionUIs = [];
this._customPanels = [];
this._controllers = [];
this._elmt = elmt;
this._sourceSelectionUIs = [];
this._customPanels = [];
this._controllers = [];
$.post(
"/command/core/get-importing-configuration",
null,
function(data) {
Refine.importingConfig = data.config;
self._initializeUI();
},
"json"
);
$.post(
"/command/core/get-importing-configuration",
null,
function(data) {
Refine.importingConfig = data.config;
self._initializeUI();
},
"json"
);
};
Refine.CreateProjectUI.controllers = [];
Refine.CreateProjectUI.prototype._initializeUI = function() {
this._sourceSelectionElmt =
$(DOM.loadHTML("core", "scripts/index/create-project-ui-source-selection.html")).appendTo(this._elmt);
this._sourceSelectionElmt =
$(DOM.loadHTML("core", "scripts/index/create-project-ui-source-selection.html")).appendTo(this._elmt);
this._sourceSelectionElmts = DOM.bind(this._sourceSelectionElmt);
this._sourceSelectionElmts = DOM.bind(this._sourceSelectionElmt);
for (var i = 0; i < Refine.CreateProjectUI.controllers.length; i++) {
this._controllers.push(new Refine.CreateProjectUI.controllers[i](this));
}
for (var i = 0; i < Refine.CreateProjectUI.controllers.length; i++) {
this._controllers.push(new Refine.CreateProjectUI.controllers[i](this));
}
};
Refine.CreateProjectUI.prototype.addSourceSelectionUI = function(sourceSelectionUI) {
var self = this;
var self = this;
var headerContainer = $('#create-project-ui-source-selection-tabs');
var bodyContainer = $('#create-project-ui-source-selection-tab-bodies');
var headerContainer = $('#create-project-ui-source-selection-tabs');
var bodyContainer = $('#create-project-ui-source-selection-tab-bodies');
sourceSelectionUI._divBody = $('<div>')
.addClass('create-project-ui-source-selection-tab-body')
.appendTo(bodyContainer)
.hide();
sourceSelectionUI._divBody = $('<div>')
.addClass('create-project-ui-source-selection-tab-body')
.appendTo(bodyContainer)
.hide();
sourceSelectionUI._divHeader = $('<div>')
.addClass('create-project-ui-source-selection-tab')
.text(sourceSelectionUI.label)
.appendTo(headerContainer)
.click(function() { self.selectImportSource(sourceSelectionUI.id); });
sourceSelectionUI._divHeader = $('<div>')
.addClass('create-project-ui-source-selection-tab')
.text(sourceSelectionUI.label)
.appendTo(headerContainer)
.click(function() { self.selectImportSource(sourceSelectionUI.id); });
sourceSelectionUI.ui.attachUI(sourceSelectionUI._divBody);
sourceSelectionUI.ui.attachUI(sourceSelectionUI._divBody);
this._sourceSelectionUIs.push(sourceSelectionUI);
this._sourceSelectionUIs.push(sourceSelectionUI);
if (this._sourceSelectionUIs.length == 1) {
self.selectImportSource(sourceSelectionUI.id);
}
if (this._sourceSelectionUIs.length == 1) {
self.selectImportSource(sourceSelectionUI.id);
}
};
Refine.CreateProjectUI.prototype.selectImportSource = function(id) {
for (var i = 0; i < this._sourceSelectionUIs.length; i++) {
var sourceSelectionUI = this._sourceSelectionUIs[i];
if (sourceSelectionUI.id == id) {
$('.create-project-ui-source-selection-tab-body').hide();
$('.create-project-ui-source-selection-tab').removeClass('selected');
for (var i = 0; i < this._sourceSelectionUIs.length; i++) {
var sourceSelectionUI = this._sourceSelectionUIs[i];
if (sourceSelectionUI.id == id) {
$('.create-project-ui-source-selection-tab-body').hide();
$('.create-project-ui-source-selection-tab').removeClass('selected');
sourceSelectionUI._divBody.show();
sourceSelectionUI._divHeader.addClass('selected');
sourceSelectionUI._divBody.show();
sourceSelectionUI._divHeader.addClass('selected');
sourceSelectionUI.ui.focus();
sourceSelectionUI.ui.focus();
break;
}
break;
}
}
};
Refine.CreateProjectUI.prototype.addCustomPanel = function() {
var div = $('<div>')
.addClass('create-project-ui-panel')
.appendTo(this._elmt);
var div = $('<div>')
.addClass('create-project-ui-panel')
.appendTo(this._elmt);
var innerDiv = $('<div>')
.addClass('relative-frame')
.appendTo(div);
var innerDiv = $('<div>')
.addClass('relative-frame')
.appendTo(div);
this._customPanels.push(div);
this._customPanels.push(div);
return innerDiv;
return innerDiv;
};
Refine.CreateProjectUI.prototype.showCustomPanel = function(div) {
var parent = div.parent();
for (var i = 0; i < this._customPanels.length; i++) {
var panel = this._customPanels[i];
if (panel[0] === parent[0]) {
$('.create-project-ui-panel').css('visibility', 'hidden');
this._sourceSelectionElmt.css('visibility', 'hidden');
panel.css('visibility', 'visible');
break;
}
var parent = div.parent();
for (var i = 0; i < this._customPanels.length; i++) {
var panel = this._customPanels[i];
if (panel[0] === parent[0]) {
$('.create-project-ui-panel').css('visibility', 'hidden');
this._sourceSelectionElmt.css('visibility', 'hidden');
panel.css('visibility', 'visible');
break;
}
}
};
Refine.CreateProjectUI.prototype.showSourceSelectionPanel = function() {
$('.create-project-ui-panel').css('visibility', 'hidden');
this._sourceSelectionElmt.css('visibility', 'visible');
$('.create-project-ui-panel').css('visibility', 'hidden');
this._sourceSelectionElmt.css('visibility', 'visible');
};
Refine.actionAreas.push({

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,26 +29,26 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
Refine.DefaultImportingController = function(createProjectUI) {
this._createProjectUI = createProjectUI;
this._createProjectUI = createProjectUI;
this._progressPanel = createProjectUI.addCustomPanel();
this._progressPanel.html(DOM.loadHTML("core", "scripts/index/default-importing-controller/progress-panel.html"));
this._progressPanel = createProjectUI.addCustomPanel();
this._progressPanel.html(DOM.loadHTML("core", "scripts/index/default-importing-controller/progress-panel.html"));
this._errorPanel = createProjectUI.addCustomPanel();
this._errorPanel.html(DOM.loadHTML("core", "scripts/index/default-importing-controller/error-panel.html"));
this._errorPanel = createProjectUI.addCustomPanel();
this._errorPanel.html(DOM.loadHTML("core", "scripts/index/default-importing-controller/error-panel.html"));
this._fileSelectionPanel = createProjectUI.addCustomPanel();
this._parsingPanel = createProjectUI.addCustomPanel();
this._fileSelectionPanel = createProjectUI.addCustomPanel();
this._parsingPanel = createProjectUI.addCustomPanel();
for (var i = 0; i < Refine.DefaultImportingController.sources.length; i++) {
var sourceSelectionUI = Refine.DefaultImportingController.sources[i];
sourceSelectionUI.ui = new sourceSelectionUI.uiClass(this);
for (var i = 0; i < Refine.DefaultImportingController.sources.length; i++) {
var sourceSelectionUI = Refine.DefaultImportingController.sources[i];
sourceSelectionUI.ui = new sourceSelectionUI.uiClass(this);
createProjectUI.addSourceSelectionUI(sourceSelectionUI);
}
createProjectUI.addSourceSelectionUI(sourceSelectionUI);
}
};
Refine.CreateProjectUI.controllers.push(Refine.DefaultImportingController);
@ -56,287 +56,287 @@ Refine.DefaultImportingController.sources = [];
Refine.DefaultImportingController.parserUIs = {};
Refine.DefaultImportingController.prototype._startOver = function() {
this._disposeFileSelectionPanel();
this._disposeFileSelectionPanel();
this._disposeFileSelectionPanel();
this._disposeFileSelectionPanel();
delete this._fileSelectionPanelElmts;
delete this._parsingPanelElmts;
delete this._fileSelectionPanelElmts;
delete this._parsingPanelElmts;
delete this._jobID;
delete this._job;
delete this._extensions;
delete this._jobID;
delete this._job;
delete this._extensions;
delete this._format;
delete this._parserOptions;
delete this._projectName;
delete this._format;
delete this._parserOptions;
delete this._projectName;
this._createProjectUI.showSourceSelectionPanel();
this._createProjectUI.showSourceSelectionPanel();
};
Refine.DefaultImportingController.prototype.startImportJob = function(form, progressMessage, callback) {
var self = this;
$.post(
"/command/core/create-importing-job",
null,
function(data) {
var jobID = self._jobID = data.jobID;
var self = this;
$.post(
"/command/core/create-importing-job",
null,
function(data) {
var jobID = self._jobID = data.jobID;
form.attr("method", "post")
.attr("enctype", "multipart/form-data")
.attr("accept-charset", "UTF-8")
.attr("target", "default-importing-iframe")
.attr("action", "/command/core/importing-controller?" + $.param({
"controller": "core/default-importing-controller",
"jobID": jobID,
"subCommand": "load-raw-data"
}));
form[0].submit();
form.attr("method", "post")
.attr("enctype", "multipart/form-data")
.attr("accept-charset", "UTF-8")
.attr("target", "default-importing-iframe")
.attr("action", "/command/core/importing-controller?" + $.param({
"controller": "core/default-importing-controller",
"jobID": jobID,
"subCommand": "load-raw-data"
}));
form[0].submit();
var start = new Date();
var timerID = window.setInterval(
function() {
self._pollImportJob(
start, jobID, timerID,
function(job) {
return job.config.hasData;
},
function(jobID, job) {
self._job = job;
self._onImportJobReady();
if (callback) {
callback(jobID, job);
}
}
);
},
1000
);
self._initializeImportProgressPanel(progressMessage, function() {
// stop the iframe
$('#default-importing-iframe')[0].contentWindow.stop();
var start = new Date();
var timerID = window.setInterval(
function() {
self._pollImportJob(
start, jobID, timerID,
function(job) {
return job.config.hasData;
},
function(jobID, job) {
self._job = job;
self._onImportJobReady();
if (callback) {
callback(jobID, job);
}
}
);
},
1000
);
self._initializeImportProgressPanel(progressMessage, function() {
// stop the iframe
$('#default-importing-iframe')[0].contentWindow.stop();
// stop the timed polling
window.clearInterval(timerID);
// stop the timed polling
window.clearInterval(timerID);
// explicitly cancel the import job
$.post("/command/core/cancel-importing-job?" + $.param({ "jobID": jobID }));
// explicitly cancel the import job
$.post("/command/core/cancel-importing-job?" + $.param({ "jobID": jobID }));
self._createProjectUI.showSourceSelectionPanel();
});
},
"json"
);
self._createProjectUI.showSourceSelectionPanel();
});
},
"json"
);
};
Refine.DefaultImportingController.prototype._initializeImportProgressPanel = function(progressMessage, onCancel) {
var self = this;
var self = this;
this._createProjectUI.showCustomPanel(this._progressPanel);
this._createProjectUI.showCustomPanel(this._progressPanel);
$('#default-importing-progress-message').text(progressMessage);
$('#default-importing-progress-bar-body').css("width", "0%");
$('#default-importing-progress-message-left').text('Starting');
$('#default-importing-progress-message-center').empty();
$('#default-importing-progress-message-right').empty();
$('#default-importing-progress-timing').empty();
$('#default-importing-progress-message').text(progressMessage);
$('#default-importing-progress-bar-body').css("width", "0%");
$('#default-importing-progress-message-left').text('Starting');
$('#default-importing-progress-message-center').empty();
$('#default-importing-progress-message-right').empty();
$('#default-importing-progress-timing').empty();
$('#default-importing-progress-cancel-button').unbind().click(onCancel);
$('#default-importing-progress-cancel-button').unbind().click(onCancel);
};
Refine.DefaultImportingController.prototype._pollImportJob = function(start, jobID, timerID, checkDone, callback) {
var self = this;
$.post(
"/command/core/get-importing-job-status?" + $.param({ "jobID": jobID }),
null,
function(data) {
if (!(data)) {
self._showImportJobError("Unknown error");
window.clearInterval(timerID);
return;
} else if (data.code == "error" || !("job" in data)) {
self._showImportJobError(data.message || "Unknown error");
window.clearInterval(timerID);
return;
}
var self = this;
$.post(
"/command/core/get-importing-job-status?" + $.param({ "jobID": jobID }),
null,
function(data) {
if (!(data)) {
self._showImportJobError("Unknown error");
window.clearInterval(timerID);
return;
} else if (data.code == "error" || !("job" in data)) {
self._showImportJobError(data.message || "Unknown error");
window.clearInterval(timerID);
return;
}
var job = data.job;
if (checkDone(job)) {
$('#default-importing-progress-message').text('Done.');
var job = data.job;
if (checkDone(job)) {
$('#default-importing-progress-message').text('Done.');
window.clearInterval(timerID);
if (callback) {
callback(jobID, job);
}
window.clearInterval(timerID);
if (callback) {
callback(jobID, job);
}
} else {
var progress = job.config.progress;
if (progress.percent > 0) {
var secondsSpent = (new Date().getTime() - start.getTime()) / 1000;
var secondsRemaining = (100 / progress.percent) * secondsSpent - secondsSpent;
$('#default-importing-progress-bar-body')
.removeClass('indefinite')
.css("width", progress.percent + "%");
if (secondsRemaining > 1) {
if (secondsRemaining > 60) {
$('#default-importing-progress-timing').text(
Math.ceil(secondsRemaining / 60) + " minutes remaining");
} else {
var progress = job.config.progress;
if (progress.percent > 0) {
var secondsSpent = (new Date().getTime() - start.getTime()) / 1000;
var secondsRemaining = (100 / progress.percent) * secondsSpent - secondsSpent;
$('#default-importing-progress-bar-body')
.removeClass('indefinite')
.css("width", progress.percent + "%");
if (secondsRemaining > 1) {
if (secondsRemaining > 60) {
$('#default-importing-progress-timing').text(
Math.ceil(secondsRemaining / 60) + " minutes remaining");
} else {
$('#default-importing-progress-timing').text(
Math.ceil(secondsRemaining) + " seconds remaining");
}
} else {
$('#default-importing-progress-timing').text('almost done ...');
}
} else {
$('#default-importing-progress-bar-body').addClass('indefinite');
$('#default-importing-progress-timing').empty();
}
$('#default-importing-progress-message').text(progress.message);
$('#default-importing-progress-timing').text(
Math.ceil(secondsRemaining) + " seconds remaining");
}
},
"json"
);
} else {
$('#default-importing-progress-timing').text('almost done ...');
}
} else {
$('#default-importing-progress-bar-body').addClass('indefinite');
$('#default-importing-progress-timing').empty();
}
$('#default-importing-progress-message').text(progress.message);
}
},
"json"
);
};
Refine.DefaultImportingController.prototype._showImportJobError = function(message, stack) {
var self = this;
var self = this;
$('#default-importing-error-message').text(message);
$('#default-importing-error-stack').text(stack || 'No technical details.');
$('#default-importing-error-message').text(message);
$('#default-importing-error-stack').text(stack || 'No technical details.');
this._createProjectUI.showCustomPanel(this._errorPanel);
$('#default-importing-error-ok-button').unbind().click(function() {
self._createProjectUI.showSourceSelectionPanel();
});
this._createProjectUI.showCustomPanel(this._errorPanel);
$('#default-importing-error-ok-button').unbind().click(function() {
self._createProjectUI.showSourceSelectionPanel();
});
};
Refine.DefaultImportingController.prototype._onImportJobReady = function() {
this._prepareData();
if (this._job.config.retrievalRecord.files.length > 1) {
this._showFileSelectionPanel();
} else {
this._showParsingPanel(false);
}
this._prepareData();
if (this._job.config.retrievalRecord.files.length > 1) {
this._showFileSelectionPanel();
} else {
this._showParsingPanel(false);
}
};
Refine.DefaultImportingController.prototype._prepareData = function() {
var extensionMap = {};
var extensionList = [];
var extensionMap = {};
var extensionList = [];
var files = this._job.config.retrievalRecord.files;
var fileSelection = this._job.config.fileSelection;
for (var i = 0; i < files.length; i++) {
var file = files[i];
file.selected = false;
var files = this._job.config.retrievalRecord.files;
var fileSelection = this._job.config.fileSelection;
for (var i = 0; i < files.length; i++) {
var file = files[i];
file.selected = false;
var slash = file.fileName.lastIndexOf('/');
var dot = file.fileName.lastIndexOf('.');
if (dot > slash + 1) {
var extension = file.fileName.substring(dot);
if (extension in extensionMap) {
extensionMap[extension].count++;
} else {
extensionMap[extension] = { extension: extension, count: 1 };
extensionList.push(extensionMap[extension]);
}
}
}
for (var i = 0; i < fileSelection.length; i++) {
files[fileSelection[i]].selected = true;
var slash = file.fileName.lastIndexOf('/');
var dot = file.fileName.lastIndexOf('.');
if (dot > slash + 1) {
var extension = file.fileName.substring(dot);
if (extension in extensionMap) {
extensionMap[extension].count++;
} else {
extensionMap[extension] = { extension: extension, count: 1 };
extensionList.push(extensionMap[extension]);
}
}
}
for (var i = 0; i < fileSelection.length; i++) {
files[fileSelection[i]].selected = true;
}
extensionList.sort(function(a, b) {
return b.count - a.count;
});
this._extensions = extensionList;
extensionList.sort(function(a, b) {
return b.count - a.count;
});
this._extensions = extensionList;
};
Refine.DefaultImportingController.prototype._ensureFormatParserUIHasInitializationData = function(format, onDone) {
if (!(format in this._parserOptions)) {
var self = this;
var dismissBusy = DialogSystem.showBusy("Inspecting selected files ...");
$.post(
"/command/core/importing-controller?" + $.param({
"controller": "core/default-importing-controller",
"jobID": this._jobID,
"subCommand": "initialize-parser-ui",
"format": format
}),
null,
function(data) {
dismissBusy();
if (!(format in this._parserOptions)) {
var self = this;
var dismissBusy = DialogSystem.showBusy("Inspecting selected files ...");
$.post(
"/command/core/importing-controller?" + $.param({
"controller": "core/default-importing-controller",
"jobID": this._jobID,
"subCommand": "initialize-parser-ui",
"format": format
}),
null,
function(data) {
dismissBusy();
if (data.options) {
self._parserOptions[format] = data.options;
onDone();
}
},
"json"
);
} else {
onDone();
}
if (data.options) {
self._parserOptions[format] = data.options;
onDone();
}
},
"json"
);
} else {
onDone();
}
};
Refine.DefaultImportingController.prototype.updateFormatAndOptions = function(options, callback) {
var self = this;
$.post(
"/command/core/importing-controller?" + $.param({
"controller": "core/default-importing-controller",
"jobID": this._jobID,
"subCommand": "update-format-and-options"
}),
{
"format" : this._format,
"options" : JSON.stringify(options)
},
callback,
"json"
);
var self = this;
$.post(
"/command/core/importing-controller?" + $.param({
"controller": "core/default-importing-controller",
"jobID": this._jobID,
"subCommand": "update-format-and-options"
}),
{
"format" : this._format,
"options" : JSON.stringify(options)
},
callback,
"json"
);
};
Refine.DefaultImportingController.prototype.getPreviewData = function(callback, numRows) {
var self = this;
var result = {};
var self = this;
var result = {};
$.post(
"/command/core/get-models?" + $.param({ "importingJobID" : this._jobID }),
$.post(
"/command/core/get-models?" + $.param({ "importingJobID" : this._jobID }),
null,
function(data) {
for (var n in data) {
if (data.hasOwnProperty(n)) {
result[n] = data[n];
}
}
$.post(
"/command/core/get-rows?" + $.param({
"importingJobID" : self._jobID,
"start" : 0,
"limit" : numRows || 100 // More than we parse for preview anyway
}),
null,
function(data) {
for (var n in data) {
if (data.hasOwnProperty(n)) {
result[n] = data[n];
}
// Un-pool objects
for (var r = 0; r < data.rows.length; r++) {
var row = data.rows[r];
for (var c = 0; c < row.cells.length; c++) {
var cell = row.cells[c];
if ((cell) && ("r" in cell)) {
cell.r = data.pool.recons[cell.r];
}
}
}
$.post(
"/command/core/get-rows?" + $.param({
"importingJobID" : self._jobID,
"start" : 0,
"limit" : numRows || 100 // More than we parse for preview anyway
}),
null,
function(data) {
// Un-pool objects
for (var r = 0; r < data.rows.length; r++) {
var row = data.rows[r];
for (var c = 0; c < row.cells.length; c++) {
var cell = row.cells[c];
if ((cell) && ("r" in cell)) {
cell.r = data.pool.recons[cell.r];
}
}
}
result.rowModel = data;
callback(result);
},
"jsonp"
);
result.rowModel = data;
callback(result);
},
"json"
);
"jsonp"
);
},
"json"
);
};
Refine.DefaultImportingController.prototype._createProject = function() {
@ -352,44 +352,44 @@ Refine.DefaultImportingController.prototype._createProject = function() {
var options = this._formatParserUI.getOptions();
options.projectName = projectName;
$.post(
"/command/core/importing-controller?" + $.param({
"controller": "core/default-importing-controller",
"jobID": this._jobID,
"subCommand": "create-project"
}),
{
"format" : this._format,
"options" : JSON.stringify(options)
},
function() {
var start = new Date();
var timerID = window.setInterval(
function() {
self._pollImportJob(
start,
self._jobID,
timerID,
function(job) {
return "projectID" in job.config;
},
function(jobID, job) {
document.location = "project?project=" + job.config.projectID;
}
);
},
1000
);
self._initializeImportProgressPanel("Creating project ...", function() {
// stop the timed polling
window.clearInterval(timerID);
"/command/core/importing-controller?" + $.param({
"controller": "core/default-importing-controller",
"jobID": this._jobID,
"subCommand": "create-project"
}),
{
"format" : this._format,
"options" : JSON.stringify(options)
},
function() {
var start = new Date();
var timerID = window.setInterval(
function() {
self._pollImportJob(
start,
self._jobID,
timerID,
function(job) {
return "projectID" in job.config;
},
function(jobID, job) {
document.location = "project?project=" + job.config.projectID;
}
);
},
1000
);
self._initializeImportProgressPanel("Creating project ...", function() {
// stop the timed polling
window.clearInterval(timerID);
// explicitly cancel the import job
$.post("/command/core/cancel-importing-job?" + $.param({ "jobID": jobID }));
// explicitly cancel the import job
$.post("/command/core/cancel-importing-job?" + $.param({ "jobID": jobID }));
self._createProjectUI.showSourceSelectionPanel();
});
},
"json"
self._createProjectUI.showSourceSelectionPanel();
});
},
"json"
);
}
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,286 +29,286 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
Refine.DefaultImportingController.prototype._showFileSelectionPanel = function() {
var self = this;
var self = this;
this._prepareFileSelectionPanel();
this._prepareFileSelectionPanel();
this._fileSelectionPanelElmts.nextButton.click(function() {
self._commitFileSelection();
});
this._renderFileSelectionPanel();
this._createProjectUI.showCustomPanel(this._fileSelectionPanel);
this._fileSelectionPanelElmts.nextButton.click(function() {
self._commitFileSelection();
});
this._renderFileSelectionPanel();
this._createProjectUI.showCustomPanel(this._fileSelectionPanel);
};
Refine.DefaultImportingController.prototype._disposeFileSelectionPanel = function() {
if (this._fileSelectionPanelResizer) {
$(window).unbind("resize", this._fileSelectionPanelResizer);
}
this._fileSelectionPanel.unbind().empty();
if (this._fileSelectionPanelResizer) {
$(window).unbind("resize", this._fileSelectionPanelResizer);
}
this._fileSelectionPanel.unbind().empty();
};
Refine.DefaultImportingController.prototype._prepareFileSelectionPanel = function() {
var self = this;
var self = this;
this._fileSelectionPanel.unbind().empty().html(
DOM.loadHTML("core", "scripts/index/default-importing-controller/file-selection-panel.html"));
this._fileSelectionPanel.unbind().empty().html(
DOM.loadHTML("core", "scripts/index/default-importing-controller/file-selection-panel.html"));
this._fileSelectionPanelElmts = DOM.bind(this._fileSelectionPanel);
this._fileSelectionPanelElmts.startOverButton.click(function() {
self._startOver();
});
this._fileSelectionPanelElmts = DOM.bind(this._fileSelectionPanel);
this._fileSelectionPanelElmts.startOverButton.click(function() {
self._startOver();
});
this._fileSelectionPanelResizer = function() {
var elmts = self._fileSelectionPanelElmts;
var width = self._fileSelectionPanel.width();
var height = self._fileSelectionPanel.height();
var headerHeight = elmts.wizardHeader.outerHeight(true);
var controlPanelWidth = 350;
this._fileSelectionPanelResizer = function() {
var elmts = self._fileSelectionPanelElmts;
var width = self._fileSelectionPanel.width();
var height = self._fileSelectionPanel.height();
var headerHeight = elmts.wizardHeader.outerHeight(true);
var controlPanelWidth = 350;
elmts.controlPanel
.css("left", "0px")
.css("top", headerHeight + "px")
.css("width", (controlPanelWidth - DOM.getHPaddings(elmts.controlPanel)) + "px")
.css("height", (height - headerHeight - DOM.getVPaddings(elmts.controlPanel)) + "px");
elmts.controlPanel
.css("left", "0px")
.css("top", headerHeight + "px")
.css("width", (controlPanelWidth - DOM.getHPaddings(elmts.controlPanel)) + "px")
.css("height", (height - headerHeight - DOM.getVPaddings(elmts.controlPanel)) + "px");
elmts.filePanel
.css("left", controlPanelWidth + "px")
.css("top", headerHeight + "px")
.css("width", (width - controlPanelWidth - DOM.getHPaddings(elmts.filePanel)) + "px")
.css("height", (height - headerHeight - DOM.getVPaddings(elmts.filePanel)) + "px");
};
elmts.filePanel
.css("left", controlPanelWidth + "px")
.css("top", headerHeight + "px")
.css("width", (width - controlPanelWidth - DOM.getHPaddings(elmts.filePanel)) + "px")
.css("height", (height - headerHeight - DOM.getVPaddings(elmts.filePanel)) + "px");
};
$(window).resize(this._fileSelectionPanelResizer);
this._fileSelectionPanelResizer();
$(window).resize(this._fileSelectionPanelResizer);
this._fileSelectionPanelResizer();
};
Refine.DefaultImportingController.prototype._renderFileSelectionPanel = function() {
this._renderFileSelectionPanelFileTable();
this._renderFileSelectionPanelControlPanel();
this._renderFileSelectionPanelFileTable();
this._renderFileSelectionPanelControlPanel();
};
Refine.DefaultImportingController.prototype._renderFileSelectionPanelFileTable = function() {
var self = this;
var self = this;
this._fileSelectionPanelElmts.filePanel.empty();
this._fileSelectionPanelElmts.filePanel.empty();
var fileTable = $('<table><tr><th></th><th>Name</th><th>Mime-type</th><th>Format</th><th>Size</th></tr></table>')
.appendTo(this._fileSelectionPanelElmts.filePanel)[0];
var fileTable = $('<table><tr><th></th><th>Name</th><th>Mime-type</th><th>Format</th><th>Size</th></tr></table>')
.appendTo(this._fileSelectionPanelElmts.filePanel)[0];
var files = this._job.config.retrievalRecord.files;
var renderFile = function(fileRecord, index) {
var tr = fileTable.insertRow(fileTable.rows.length);
$(tr).addClass(index % 2 == 0 ? 'even' : 'odd');
var files = this._job.config.retrievalRecord.files;
var renderFile = function(fileRecord, index) {
var tr = fileTable.insertRow(fileTable.rows.length);
$(tr).addClass(index % 2 == 0 ? 'even' : 'odd');
var tdSelect = $('<td>').appendTo(tr);
var checkbox = $('<input>')
.attr("type", "checkbox")
.attr("index", index)
.appendTo(tdSelect)
.click(function() {
files[index].selected = this.checked;
self._updateFileSelectionSummary();
});
if (fileRecord.selected) {
checkbox.attr("checked", "checked");
}
$('<td>').text(fileRecord.fileName).addClass("default-importing-file-selection-filename").appendTo(tr);
$('<td>').text(fileRecord.declaredMimeType || fileRecord.mimeType || "unknown").appendTo(tr);
$('<td>').text(fileRecord.format || "unknown").appendTo(tr);
$('<td>').text(fileRecord.size + " bytes").appendTo(tr);
};
for (var i = 0; i < files.length; i++) {
renderFile(files[i], i);
var tdSelect = $('<td>').appendTo(tr);
var checkbox = $('<input>')
.attr("type", "checkbox")
.attr("index", index)
.appendTo(tdSelect)
.click(function() {
files[index].selected = this.checked;
self._updateFileSelectionSummary();
});
if (fileRecord.selected) {
checkbox.attr("checked", "checked");
}
$('<td>').text(fileRecord.fileName).addClass("default-importing-file-selection-filename").appendTo(tr);
$('<td>').text(fileRecord.declaredMimeType || fileRecord.mimeType || "unknown").appendTo(tr);
$('<td>').text(fileRecord.format || "unknown").appendTo(tr);
$('<td>').text(fileRecord.size + " bytes").appendTo(tr);
};
for (var i = 0; i < files.length; i++) {
renderFile(files[i], i);
}
};
Refine.DefaultImportingController.prototype._renderFileSelectionPanelControlPanel = function() {
var self = this;
var files = this._job.config.retrievalRecord.files;
var self = this;
var files = this._job.config.retrievalRecord.files;
this._fileSelectionPanelElmts.extensionContainer.empty();
this._fileSelectionPanelElmts.selectAllButton.unbind().click(function(evt) {
for (var i = 0; i < files.length; i++) {
files[i].selected = true;
}
self._fileSelectionPanelElmts.filePanel.find("input").attr("checked", "checked");
self._updateFileSelectionSummary();
});
this._fileSelectionPanelElmts.unselectAllButton.unbind().click(function(evt) {
for (var i = 0; i < files.length; i++) {
files[i].selected = false;
}
self._fileSelectionPanelElmts.filePanel.find("input").removeAttr("checked");
self._updateFileSelectionSummary();
});
var table = $('<table></table>')
.appendTo(this._fileSelectionPanelElmts.extensionContainer)[0];
var renderExtension = function(extension) {
var tr = table.insertRow(table.rows.length);
$('<td>').text(extension.extension).appendTo(tr);
$('<td>').text(extension.count + (extension.count > 1 ? " files" : " file")).appendTo(tr);
$('<button>')
.text("Select")
.addClass("button")
.appendTo($('<td>').appendTo(tr))
.click(function() {
for (var i = 0; i < files.length; i++) {
var file = files[i];
if (!file.selected) {
if (file.fileName.endsWith(extension.extension)) {
file.selected = true;
self._fileSelectionPanelElmts.filePanel
.find("input[index='" + i + "']")
.attr("checked", "checked");
}
}
}
self._updateFileSelectionSummary();
});
$('<button>')
.text("Unselect")
.addClass("button")
.appendTo($('<td>').appendTo(tr))
.click(function() {
for (var i = 0; i < files.length; i++) {
var file = files[i];
if (file.selected) {
if (file.fileName.endsWith(extension.extension)) {
file.selected = false;
self._fileSelectionPanelElmts.filePanel
.find("input[index='" + i + "']")
.removeAttr("checked");
}
}
}
self._updateFileSelectionSummary();
});
};
for (var i = 0; i < this._extensions.length; i++) {
renderExtension(this._extensions[i]);
this._fileSelectionPanelElmts.extensionContainer.empty();
this._fileSelectionPanelElmts.selectAllButton.unbind().click(function(evt) {
for (var i = 0; i < files.length; i++) {
files[i].selected = true;
}
self._fileSelectionPanelElmts.filePanel.find("input").attr("checked", "checked");
self._updateFileSelectionSummary();
});
this._fileSelectionPanelElmts.unselectAllButton.unbind().click(function(evt) {
for (var i = 0; i < files.length; i++) {
files[i].selected = false;
}
self._fileSelectionPanelElmts.filePanel.find("input").removeAttr("checked");
self._updateFileSelectionSummary();
});
this._updateFileSelectionSummary();
var table = $('<table></table>')
.appendTo(this._fileSelectionPanelElmts.extensionContainer)[0];
this._fileSelectionPanelElmts.regexInput.unbind().keyup(function() {
var count = 0;
var elmts = self._fileSelectionPanelElmts.filePanel
.find(".default-importing-file-selection-filename")
.removeClass("highlighted");
try {
var regex = new RegExp(this.value);
elmts.each(function() {
if (regex.test($(this).text())) {
$(this).addClass("highlighted");
count++;
}
});
} catch (e) {
// Ignore
var renderExtension = function(extension) {
var tr = table.insertRow(table.rows.length);
$('<td>').text(extension.extension).appendTo(tr);
$('<td>').text(extension.count + (extension.count > 1 ? " files" : " file")).appendTo(tr);
$('<button>')
.text("Select")
.addClass("button")
.appendTo($('<td>').appendTo(tr))
.click(function() {
for (var i = 0; i < files.length; i++) {
var file = files[i];
if (!file.selected) {
if (file.fileName.endsWith(extension.extension)) {
file.selected = true;
self._fileSelectionPanelElmts.filePanel
.find("input[index='" + i + "']")
.attr("checked", "checked");
}
}
self._fileSelectionPanelElmts.regexSummary.text(count + (count == 1 ? " match" : " matches"));
}
self._updateFileSelectionSummary();
});
this._fileSelectionPanelElmts.selectRegexButton.unbind().click(function() {
self._fileSelectionPanelElmts.filePanel
.find(".default-importing-file-selection-filename")
.removeClass("highlighted");
try {
var regex = new RegExp(self._fileSelectionPanelElmts.regexInput[0].value);
for (var i = 0; i < files.length; i++) {
var file = files[i];
if (!file.selected) {
if (regex.test(file.fileName)) {
file.selected = true;
self._fileSelectionPanelElmts.filePanel
.find("input[index='" + i + "']")
.attr("checked", "checked");
}
}
}
self._updateFileSelectionSummary();
} catch (e) {
// Ignore
$('<button>')
.text("Unselect")
.addClass("button")
.appendTo($('<td>').appendTo(tr))
.click(function() {
for (var i = 0; i < files.length; i++) {
var file = files[i];
if (file.selected) {
if (file.fileName.endsWith(extension.extension)) {
file.selected = false;
self._fileSelectionPanelElmts.filePanel
.find("input[index='" + i + "']")
.removeAttr("checked");
}
}
}
self._updateFileSelectionSummary();
});
this._fileSelectionPanelElmts.unselectRegexButton.unbind().click(function() {
self._fileSelectionPanelElmts.filePanel
.find(".default-importing-file-selection-filename")
.removeClass("highlighted");
try {
var regex = new RegExp(self._fileSelectionPanelElmts.regexInput[0].value);
for (var i = 0; i < files.length; i++) {
var file = files[i];
if (file.selected) {
if (regex.test(file.fileName)) {
file.selected = false;
self._fileSelectionPanelElmts.filePanel
.find("input[index='" + i + "']")
.removeAttr("checked");
}
}
}
self._updateFileSelectionSummary();
} catch (e) {
// Ignore
};
for (var i = 0; i < this._extensions.length; i++) {
renderExtension(this._extensions[i]);
}
this._updateFileSelectionSummary();
this._fileSelectionPanelElmts.regexInput.unbind().keyup(function() {
var count = 0;
var elmts = self._fileSelectionPanelElmts.filePanel
.find(".default-importing-file-selection-filename")
.removeClass("highlighted");
try {
var regex = new RegExp(this.value);
elmts.each(function() {
if (regex.test($(this).text())) {
$(this).addClass("highlighted");
count++;
}
});
});
} catch (e) {
// Ignore
}
self._fileSelectionPanelElmts.regexSummary.text(count + (count == 1 ? " match" : " matches"));
});
this._fileSelectionPanelElmts.selectRegexButton.unbind().click(function() {
self._fileSelectionPanelElmts.filePanel
.find(".default-importing-file-selection-filename")
.removeClass("highlighted");
try {
var regex = new RegExp(self._fileSelectionPanelElmts.regexInput[0].value);
for (var i = 0; i < files.length; i++) {
var file = files[i];
if (!file.selected) {
if (regex.test(file.fileName)) {
file.selected = true;
self._fileSelectionPanelElmts.filePanel
.find("input[index='" + i + "']")
.attr("checked", "checked");
}
}
}
self._updateFileSelectionSummary();
} catch (e) {
// Ignore
}
});
this._fileSelectionPanelElmts.unselectRegexButton.unbind().click(function() {
self._fileSelectionPanelElmts.filePanel
.find(".default-importing-file-selection-filename")
.removeClass("highlighted");
try {
var regex = new RegExp(self._fileSelectionPanelElmts.regexInput[0].value);
for (var i = 0; i < files.length; i++) {
var file = files[i];
if (file.selected) {
if (regex.test(file.fileName)) {
file.selected = false;
self._fileSelectionPanelElmts.filePanel
.find("input[index='" + i + "']")
.removeAttr("checked");
}
}
}
self._updateFileSelectionSummary();
} catch (e) {
// Ignore
}
});
};
Refine.DefaultImportingController.prototype._updateFileSelectionSummary = function() {
var fileSelection = [];
var files = this._job.config.retrievalRecord.files;
for (var i = 0; i < files.length; i++) {
if (files[i].selected) {
fileSelection.push(i);
}
var fileSelection = [];
var files = this._job.config.retrievalRecord.files;
for (var i = 0; i < files.length; i++) {
if (files[i].selected) {
fileSelection.push(i);
}
this._job.config.fileSelection = fileSelection;
this._fileSelectionPanelElmts.summary.text(fileSelection.length + " of " + files.length + " files selected");
}
this._job.config.fileSelection = fileSelection;
this._fileSelectionPanelElmts.summary.text(fileSelection.length + " of " + files.length + " files selected");
};
Refine.DefaultImportingController.prototype._commitFileSelection = function() {
if (this._job.config.fileSelection.length == 0) {
alert("Please select at least one file.");
if (this._job.config.fileSelection.length == 0) {
alert("Please select at least one file.");
return;
}
var self = this;
var dismissBusy = DialogSystem.showBusy("Inspecting selected files ...");
$.post(
"/command/core/importing-controller?" + $.param({
"controller": "core/default-importing-controller",
"jobID": this._jobID,
"subCommand": "update-file-selection"
}),
{
"fileSelection" : JSON.stringify(this._job.config.fileSelection)
},
function(data) {
if (!(data)) {
self._showImportJobError("Unknown error");
window.clearInterval(timerID);
return;
}
} else if (data.code == "error" || !("job" in data)) {
self._showImportJobError(data.message || "Unknown error");
window.clearInterval(timerID);
return;
}
var self = this;
var dismissBusy = DialogSystem.showBusy("Inspecting selected files ...");
$.post(
"/command/core/importing-controller?" + $.param({
"controller": "core/default-importing-controller",
"jobID": this._jobID,
"subCommand": "update-file-selection"
}),
{
"fileSelection" : JSON.stringify(this._job.config.fileSelection)
},
function(data) {
if (!(data)) {
self._showImportJobError("Unknown error");
window.clearInterval(timerID);
return;
} else if (data.code == "error" || !("job" in data)) {
self._showImportJobError(data.message || "Unknown error");
window.clearInterval(timerID);
return;
}
dismissBusy();
dismissBusy();
// Different files might be selected. We start over again.
delete this._parserOptions;
// Different files might be selected. We start over again.
delete this._parserOptions;
self._job = data.job;
self._showParsingPanel(true);
},
"json"
);
self._job = data.job;
self._showParsingPanel(true);
},
"json"
);
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,158 +29,158 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
Refine.DefaultImportingController.prototype._showParsingPanel = function(hasFileSelection) {
var self = this;
var self = this;
if (!(this._format)) {
this._format = this._job.config.rankedFormats[0];
}
if (!(this._parserOptions)) {
this._parserOptions = {};
}
if (!(this._format)) {
this._format = this._job.config.rankedFormats[0];
}
if (!(this._parserOptions)) {
this._parserOptions = {};
}
this._prepareParsingPanel();
this._parsingPanelElmts.nextButton.click(function() {
self._createProject();
this._prepareParsingPanel();
this._parsingPanelElmts.nextButton.click(function() {
self._createProject();
});
if (hasFileSelection) {
this._parsingPanelElmts.previousButton.click(function() {
self._createProjectUI.showCustomPanel(self._fileSelectionPanel);
});
if (hasFileSelection) {
this._parsingPanelElmts.previousButton.click(function() {
self._createProjectUI.showCustomPanel(self._fileSelectionPanel);
});
} else {
this._parsingPanelElmts.previousButton.hide();
}
} else {
this._parsingPanelElmts.previousButton.hide();
}
if (!(this._projectName) && this._job.config.fileSelection.length > 0) {
var index = this._job.config.fileSelection[0];
var record = this._job.config.retrievalRecord.files[index];
this._projectName = $.trim(record.fileName.replace(/\W/g, ' ').replace(/\s+/g, ' '));
}
if (this._projectName) {
this._parsingPanelElmts.projectNameInput[0].value = this._projectName;
}
if (!(this._projectName) && this._job.config.fileSelection.length > 0) {
var index = this._job.config.fileSelection[0];
var record = this._job.config.retrievalRecord.files[index];
this._projectName = $.trim(record.fileName.replace(/\W/g, ' ').replace(/\s+/g, ' '));
}
if (this._projectName) {
this._parsingPanelElmts.projectNameInput[0].value = this._projectName;
}
this._createProjectUI.showCustomPanel(this._parsingPanel);
this._createProjectUI.showCustomPanel(this._parsingPanel);
};
Refine.DefaultImportingController.prototype._disposeFileSelectionPanel = function() {
this._disposeParserUI();
this._disposeParserUI();
if (this._parsingPanelResizer) {
$(window).unbind("resize", this._parsingPanelResizer);
}
if (this._parsingPanelResizer) {
$(window).unbind("resize", this._parsingPanelResizer);
}
this._parsingPanel.unbind().empty();
delete this._parsingPanelElmts;
this._parsingPanel.unbind().empty();
delete this._parsingPanelElmts;
};
Refine.DefaultImportingController.prototype._prepareParsingPanel = function() {
var self = this;
var self = this;
this._parsingPanel.unbind().empty().html(
DOM.loadHTML("core", "scripts/index/default-importing-controller/parsing-panel.html"));
this._parsingPanel.unbind().empty().html(
DOM.loadHTML("core", "scripts/index/default-importing-controller/parsing-panel.html"));
this._parsingPanelElmts = DOM.bind(this._parsingPanel);
this._parsingPanelElmts.startOverButton.click(function() {
self._startOver();
this._parsingPanelElmts = DOM.bind(this._parsingPanel);
this._parsingPanelElmts.startOverButton.click(function() {
self._startOver();
});
this._parsingPanelElmts.progressPanel.hide();
this._parsingPanelResizer = function() {console.log("here");
var elmts = self._parsingPanelElmts;
var width = self._parsingPanel.width();
var height = self._parsingPanel.height();
var headerHeight = elmts.wizardHeader.outerHeight(true);
var controlPanelHeight = 300;
elmts.dataPanel
.css("left", "0px")
.css("top", headerHeight + "px")
.css("width", (width - DOM.getHPaddings(elmts.dataPanel)) + "px")
.css("height", (height - headerHeight - controlPanelHeight - DOM.getVPaddings(elmts.dataPanel)) + "px");
elmts.progressPanel
.css("left", "0px")
.css("top", headerHeight + "px")
.css("width", (width - DOM.getHPaddings(elmts.progressPanel)) + "px")
.css("height", (height - headerHeight - controlPanelHeight - DOM.getVPaddings(elmts.progressPanel)) + "px");
elmts.controlPanel
.css("left", "0px")
.css("top", (height - controlPanelHeight) + "px")
.css("width", (width - DOM.getHPaddings(elmts.controlPanel)) + "px")
.css("height", (controlPanelHeight - DOM.getVPaddings(elmts.controlPanel)) + "px");
};
$(window).resize(this._parsingPanelResizer);
this._parsingPanelResizer();
var formats = this._job.config.rankedFormats;
var createFormatTab = function(format) {
var tab = $('<div>')
.text(Refine.importingConfig.formats[format].label)
.attr("format", format)
.addClass("default-importing-parsing-control-panel-format")
.appendTo(self._parsingPanelElmts.formatsContainer)
.click(function() {
self._selectFormat(format);
});
this._parsingPanelElmts.progressPanel.hide();
this._parsingPanelResizer = function() {console.log("here");
var elmts = self._parsingPanelElmts;
var width = self._parsingPanel.width();
var height = self._parsingPanel.height();
var headerHeight = elmts.wizardHeader.outerHeight(true);
var controlPanelHeight = 300;
elmts.dataPanel
.css("left", "0px")
.css("top", headerHeight + "px")
.css("width", (width - DOM.getHPaddings(elmts.dataPanel)) + "px")
.css("height", (height - headerHeight - controlPanelHeight - DOM.getVPaddings(elmts.dataPanel)) + "px");
elmts.progressPanel
.css("left", "0px")
.css("top", headerHeight + "px")
.css("width", (width - DOM.getHPaddings(elmts.progressPanel)) + "px")
.css("height", (height - headerHeight - controlPanelHeight - DOM.getVPaddings(elmts.progressPanel)) + "px");
elmts.controlPanel
.css("left", "0px")
.css("top", (height - controlPanelHeight) + "px")
.css("width", (width - DOM.getHPaddings(elmts.controlPanel)) + "px")
.css("height", (controlPanelHeight - DOM.getVPaddings(elmts.controlPanel)) + "px");
};
$(window).resize(this._parsingPanelResizer);
this._parsingPanelResizer();
var formats = this._job.config.rankedFormats;
var createFormatTab = function(format) {
var tab = $('<div>')
.text(Refine.importingConfig.formats[format].label)
.attr("format", format)
.addClass("default-importing-parsing-control-panel-format")
.appendTo(self._parsingPanelElmts.formatsContainer)
.click(function() {
self._selectFormat(format);
});
if (format == self._format) {
tab.addClass("selected");
}
};
for (var i = 0; i < formats.length; i++) {
createFormatTab(formats[i]);
if (format == self._format) {
tab.addClass("selected");
}
this._selectFormat(this._format);
};
for (var i = 0; i < formats.length; i++) {
createFormatTab(formats[i]);
}
this._selectFormat(this._format);
};
Refine.DefaultImportingController.prototype._disposeParserUI = function() {
if (this._formatParserUI) {
this._formatParserUI.dispose();
delete this._formatParserUI;
}
if (this._parsingPanelElmts) {
this._parsingPanelElmts.optionsContainer.unbind().empty();
this._parsingPanelElmts.progressPanel.unbind();
this._parsingPanelElmts.dataPanel.unbind().empty();
}
if (this._formatParserUI) {
this._formatParserUI.dispose();
delete this._formatParserUI;
}
if (this._parsingPanelElmts) {
this._parsingPanelElmts.optionsContainer.unbind().empty();
this._parsingPanelElmts.progressPanel.unbind();
this._parsingPanelElmts.dataPanel.unbind().empty();
}
};
Refine.DefaultImportingController.prototype._selectFormat = function(newFormat) {
if (newFormat == this._format && (this._formatParserUI)) {
// The new format is the same as the existing one.
return;
}
if (newFormat == this._format && (this._formatParserUI)) {
// The new format is the same as the existing one.
return;
}
var uiClassName = Refine.importingConfig.formats[newFormat].uiClass;
var uiClass = Refine.DefaultImportingController.parserUIs[uiClassName];
if (uiClass) {
var self = this;
this._ensureFormatParserUIHasInitializationData(newFormat, function() {
self._disposeParserUI();
self._parsingPanelElmts.formatsContainer
.find(".default-importing-parsing-control-panel-format")
.removeClass("selected")
.each(function() {
if (this.getAttribute("format") == newFormat) {
$(this).addClass("selected");
}
});
var uiClassName = Refine.importingConfig.formats[newFormat].uiClass;
var uiClass = Refine.DefaultImportingController.parserUIs[uiClassName];
if (uiClass) {
var self = this;
this._ensureFormatParserUIHasInitializationData(newFormat, function() {
self._disposeParserUI();
self._parsingPanelElmts.formatsContainer
.find(".default-importing-parsing-control-panel-format")
.removeClass("selected")
.each(function() {
if (this.getAttribute("format") == newFormat) {
$(this).addClass("selected");
}
});
self._format = newFormat;
self._formatParserUI = new uiClass(
self,
self._jobID,
self._job,
self._format,
self._parserOptions[newFormat],
self._parsingPanelElmts.dataPanel,
self._parsingPanelElmts.progressPanel,
self._parsingPanelElmts.optionsContainer
);
});
}
self._format = newFormat;
self._formatParserUI = new uiClass(
self,
self._jobID,
self._job,
self._format,
self._parserOptions[newFormat],
self._parsingPanelElmts.dataPanel,
self._parsingPanelElmts.progressPanel,
self._parsingPanelElmts.optionsContainer
);
});
}
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,90 +29,90 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
function ThisComputerImportingSourceUI(controller) {
this._controller = controller;
this._controller = controller;
}
Refine.DefaultImportingController.sources.push({
"label": "This Computer",
"id": "upload",
"uiClass": ThisComputerImportingSourceUI
"label": "This Computer",
"id": "upload",
"uiClass": ThisComputerImportingSourceUI
});
ThisComputerImportingSourceUI.prototype.attachUI = function(bodyDiv) {
var self = this;
var self = this;
bodyDiv.html(DOM.loadHTML("core", "scripts/index/default-importing-sources/import-from-computer-form.html"));
bodyDiv.html(DOM.loadHTML("core", "scripts/index/default-importing-sources/import-from-computer-form.html"));
this._elmts = DOM.bind(bodyDiv);
this._elmts.nextButton.click(function(evt) {
if (self._elmts.fileInput[0].files.length === 0) {
window.alert("You must specify a data file to import.");
} else {
self._controller.startImportJob(self._elmts.form, "Uploading data ...");
}
});
this._elmts = DOM.bind(bodyDiv);
this._elmts.nextButton.click(function(evt) {
if (self._elmts.fileInput[0].files.length === 0) {
window.alert("You must specify a data file to import.");
} else {
self._controller.startImportJob(self._elmts.form, "Uploading data ...");
}
});
};
ThisComputerImportingSourceUI.prototype.focus = function() {
};
function UrlImportingSourceUI(controller) {
this._controller = controller;
this._controller = controller;
}
Refine.DefaultImportingController.sources.push({
"label": "Web Addresses (URLs)",
"id": "download",
"uiClass": UrlImportingSourceUI
"label": "Web Addresses (URLs)",
"id": "download",
"uiClass": UrlImportingSourceUI
});
UrlImportingSourceUI.prototype.attachUI = function(bodyDiv) {
var self = this;
var self = this;
bodyDiv.html(DOM.loadHTML("core", "scripts/index/default-importing-sources/import-from-web-form.html"));
bodyDiv.html(DOM.loadHTML("core", "scripts/index/default-importing-sources/import-from-web-form.html"));
this._elmts = DOM.bind(bodyDiv);
this._elmts.nextButton.click(function(evt) {
if ($.trim(self._elmts.urlInput[0].value.length) === 0) {
window.alert("You must specify a web address (URL) to import.");
} else {
self._controller.startImportJob(self._elmts.form, "Downloading data ...");
}
});
this._elmts.addButton.click(function(evt) {
self._elmts.buttons.before(self._elmts.urlRow.clone());
});
this._elmts = DOM.bind(bodyDiv);
this._elmts.nextButton.click(function(evt) {
if ($.trim(self._elmts.urlInput[0].value.length) === 0) {
window.alert("You must specify a web address (URL) to import.");
} else {
self._controller.startImportJob(self._elmts.form, "Downloading data ...");
}
});
this._elmts.addButton.click(function(evt) {
self._elmts.buttons.before(self._elmts.urlRow.clone());
});
};
UrlImportingSourceUI.prototype.focus = function() {
this._elmts.urlInput.focus();
this._elmts.urlInput.focus();
};
function ClipboardImportingSourceUI(controller) {
this._controller = controller;
this._controller = controller;
}
Refine.DefaultImportingController.sources.push({
"label": "Clipboard",
"id": "clipboard",
"uiClass": ClipboardImportingSourceUI
"label": "Clipboard",
"id": "clipboard",
"uiClass": ClipboardImportingSourceUI
});
ClipboardImportingSourceUI.prototype.attachUI = function(bodyDiv) {
var self = this;
var self = this;
bodyDiv.html(DOM.loadHTML("core", "scripts/index/default-importing-sources/import-from-clipboard-form.html"));
bodyDiv.html(DOM.loadHTML("core", "scripts/index/default-importing-sources/import-from-clipboard-form.html"));
this._elmts = DOM.bind(bodyDiv);
this._elmts.nextButton.click(function(evt) {
if ($.trim(self._elmts.textInput[0].value).length === 0) {
window.alert("You must paste some data to import.");
} else {
self._controller.startImportJob(self._elmts.form, "Uploading pasted data ...");
}
});
this._elmts = DOM.bind(bodyDiv);
this._elmts.nextButton.click(function(evt) {
if ($.trim(self._elmts.textInput[0].value).length === 0) {
window.alert("You must paste some data to import.");
} else {
self._controller.startImportJob(self._elmts.form, "Uploading pasted data ...");
}
});
};
ClipboardImportingSourceUI.prototype.focus = function() {
this._elmts.textInput.focus();
this._elmts.textInput.focus();
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,242 +29,242 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
Refine.OpenProjectUI = function(elmt) {
var self = this;
var self = this;
elmt.html(DOM.loadHTML("core", "scripts/index/open-project-ui.html"));
elmt.html(DOM.loadHTML("core", "scripts/index/open-project-ui.html"));
this._elmt = elmt;
this._elmts = DOM.bind(elmt);
this._elmt = elmt;
this._elmts = DOM.bind(elmt);
var resize = function() {
var height = elmt.height();
var width = elmt.width();
var controlsHeight = self._elmts.workspaceControls.outerHeight();
self._elmts.projectsContainer
.css("height", (height - controlsHeight - DOM.getVPaddings(self._elmts.projectsContainer)) + "px");
self._elmts.workspaceControls
.css("bottom", "0px")
.css("width", (width - DOM.getHPaddings(self._elmts.workspaceControls)) + "px")
};
$(window).resize(resize);
window.setTimeout(resize, 100);
var resize = function() {
var height = elmt.height();
var width = elmt.width();
var controlsHeight = self._elmts.workspaceControls.outerHeight();
self._elmts.projectsContainer
.css("height", (height - controlsHeight - DOM.getVPaddings(self._elmts.projectsContainer)) + "px");
self._elmts.workspaceControls
.css("bottom", "0px")
.css("width", (width - DOM.getHPaddings(self._elmts.workspaceControls)) + "px")
};
$(window).resize(resize);
window.setTimeout(resize, 100);
$("#project-file-input").change(function() {
if ($("#project-name-input")[0].value.length == 0) {
var fileName = this.files[0].fileName;
if (fileName) {
$("#project-name-input")[0].value = fileName.replace(/\.\w+/, "").replace(/[_-]/g, " ");
}
$("#project-name-input").focus().select();
}
}).keypress(function(evt) {
if (evt.keyCode == 13) {
return self._onClickUploadFileButton(evt);
$("#project-file-input").change(function() {
if ($("#project-name-input")[0].value.length == 0) {
var fileName = this.files[0].fileName;
if (fileName) {
$("#project-name-input")[0].value = fileName.replace(/\.\w+/, "").replace(/[_-]/g, " ");
}
$("#project-name-input").focus().select();
}
}).keypress(function(evt) {
if (evt.keyCode == 13) {
return self._onClickUploadFileButton(evt);
}
});
$("#upload-file-button").click(function(evt) {
return self._onClickUploadFileButton(evt)
});
$('#projects-workspace-open').click(function() {
$.ajax({
type: "POST",
url: "/command/core/open-workspace-dir",
dataType: "json",
success: function (data) {
if (data.code != "ok" && "message" in data) {
alert(data.message);
}
}
});
});
$("#upload-file-button").click(function(evt) {
return self._onClickUploadFileButton(evt)
});
$('#projects-workspace-open').click(function() {
$.ajax({
type: "POST",
url: "/command/core/open-workspace-dir",
dataType: "json",
success: function (data) {
if (data.code != "ok" && "message" in data) {
alert(data.message);
}
}
});
});
this._fetchProjects();
this._fetchProjects();
};
Refine.OpenProjectUI.prototype._fetchProjects = function() {
var self = this;
$.getJSON(
"/command/core/get-all-project-metadata",
null,
function(data) {
self._renderProjects(data);
},
"json"
);
var self = this;
$.getJSON(
"/command/core/get-all-project-metadata",
null,
function(data) {
self._renderProjects(data);
},
"json"
);
};
Refine.OpenProjectUI.prototype._renderProjects = function(data) {
var self = this;
var projects = [];
for (var n in data.projects) {
if (data.projects.hasOwnProperty(n)) {
var project = data.projects[n];
project.id = n;
project.date = Date.parseExact(project.modified, "yyyy-MM-ddTHH:mm:ssZ");
projects.push(project);
}
var self = this;
var projects = [];
for (var n in data.projects) {
if (data.projects.hasOwnProperty(n)) {
var project = data.projects[n];
project.id = n;
project.date = Date.parseExact(project.modified, "yyyy-MM-ddTHH:mm:ssZ");
projects.push(project);
}
projects.sort(function(a, b) { return b.date.getTime() - a.date.getTime(); });
}
projects.sort(function(a, b) { return b.date.getTime() - a.date.getTime(); });
var container = $("#projects-container").empty();
if (!projects.length) {
$("#no-project-message").clone().show().appendTo(container);
} else {
Refine.selectActionArea('open-project');
var container = $("#projects-container").empty();
if (!projects.length) {
$("#no-project-message").clone().show().appendTo(container);
} else {
Refine.selectActionArea('open-project');
var table = $(
'<table class="list-table"><tr>' +
'<th>Name</th>' +
'<th></th>' +
'<th></th>' +
'<th align="right">Last&nbsp;modified</th>' +
'</tr></table>'
).appendTo(container)[0];
var table = $(
'<table class="list-table"><tr>' +
'<th>Name</th>' +
'<th></th>' +
'<th></th>' +
'<th align="right">Last&nbsp;modified</th>' +
'</tr></table>'
).appendTo(container)[0];
var formatDate = function(d) {
var d = new Date(d);
var last_year = Date.today().add({ years: -1 });
var last_month = Date.today().add({ months: -1 });
var last_week = Date.today().add({ days: -7 });
var today = Date.today();
var tomorrow = Date.today().add({ days: 1 });
var formatDate = function(d) {
var d = new Date(d);
var last_year = Date.today().add({ years: -1 });
var last_month = Date.today().add({ months: -1 });
var last_week = Date.today().add({ days: -7 });
var today = Date.today();
var tomorrow = Date.today().add({ days: 1 });
if (d.between(today, tomorrow)) {
return "today " + d.toString("h:mm tt");
} else if (d.between(last_week, today)) {
var diff = Math.floor(today.getDayOfYear() - d.getDayOfYear());
return (diff <= 1) ? ("yesterday " + d.toString("h:mm tt")) : (diff + " days ago");
} else if (d.between(last_month, today)) {
var diff = Math.floor((today.getDayOfYear() - d.getDayOfYear()) / 7);
return (diff == 1) ? "a week ago" : diff.toFixed(0) + " weeks ago" ;
} else if (d.between(last_year, today)) {
var diff = Math.floor(today.getMonth() - d.getMonth());
return (diff == 1) ? "a month ago" : diff + " months ago";
if (d.between(today, tomorrow)) {
return "today " + d.toString("h:mm tt");
} else if (d.between(last_week, today)) {
var diff = Math.floor(today.getDayOfYear() - d.getDayOfYear());
return (diff <= 1) ? ("yesterday " + d.toString("h:mm tt")) : (diff + " days ago");
} else if (d.between(last_month, today)) {
var diff = Math.floor((today.getDayOfYear() - d.getDayOfYear()) / 7);
return (diff == 1) ? "a week ago" : diff.toFixed(0) + " weeks ago" ;
} else if (d.between(last_year, today)) {
var diff = Math.floor(today.getMonth() - d.getMonth());
return (diff == 1) ? "a month ago" : diff + " months ago";
} else {
var diff = Math.floor(today.getYear() - d.getYear());
return (diff == 1) ? "a year ago" : diff + " years ago";
}
};
var renderProject = function(project) {
var tr = table.insertRow(table.rows.length);
tr.className = "project";
var nameLink = $('<a></a>')
.addClass("list-table-itemname")
.text(project.name)
.attr("href", "/project?project=" + project.id)
.appendTo(tr.insertCell(tr.cells.length));
var renameLink = $('<a></a>')
.text("rename")
.addClass("secondary")
.attr("href", "javascript:{}")
.css("visibility", "hidden")
.click(function() {
var name = window.prompt("New project name:", project.name);
if (name == null) {
return;
}
name = $.trim(name);
if (project.name == name || name.length == 0) {
return;
}
$.ajax({
type: "POST",
url: "/command/core/rename-project",
data: { "project" : project.id, "name" : name },
dataType: "json",
success: function (data) {
if (data && typeof data.code != 'undefined' && data.code == "ok") {
nameLink.text(name);
} else {
var diff = Math.floor(today.getYear() - d.getYear());
return (diff == 1) ? "a year ago" : diff + " years ago";
alert("Failed to rename project: " + data.message)
}
};
}
});
}).appendTo(tr.insertCell(tr.cells.length));
var renderProject = function(project) {
var tr = table.insertRow(table.rows.length);
tr.className = "project";
var nameLink = $('<a></a>')
.addClass("list-table-itemname")
.text(project.name)
.attr("href", "/project?project=" + project.id)
.appendTo(tr.insertCell(tr.cells.length));
var renameLink = $('<a></a>')
.text("rename")
.addClass("secondary")
.attr("href", "javascript:{}")
.css("visibility", "hidden")
.click(function() {
var name = window.prompt("New project name:", project.name);
if (name == null) {
return;
}
name = $.trim(name);
if (project.name == name || name.length == 0) {
return;
}
$.ajax({
type: "POST",
url: "/command/core/rename-project",
data: { "project" : project.id, "name" : name },
dataType: "json",
success: function (data) {
if (data && typeof data.code != 'undefined' && data.code == "ok") {
nameLink.text(name);
} else {
alert("Failed to rename project: " + data.message)
}
}
});
}).appendTo(tr.insertCell(tr.cells.length));
var deleteLink = $('<a></a>')
.addClass("delete-project")
.attr("title","Delete this project")
.attr("href","")
.css("visibility", "hidden")
.html("<img src='/images/close.png' />")
.click(function() {
if (window.confirm("Are you sure you want to delete project \"" + project.name + "\"?")) {
$.ajax({
type: "POST",
url: "/command/core/delete-project",
data: { "project" : project.id },
dataType: "json",
success: function (data) {
if (data && typeof data.code != 'undefined' && data.code == "ok") {
self._fetchProjects();
}
}
});
}
return false;
}).appendTo(tr.insertCell(tr.cells.length));
$('<div></div>')
.html(formatDate(project.date))
.addClass("last-modified")
.attr("title", project.date.toString())
.appendTo(tr.insertCell(tr.cells.length));
$(tr).mouseenter(function() {
renameLink.css("visibility", "visible");
deleteLink.css("visibility", "visible");
}).mouseleave(function() {
renameLink.css("visibility", "hidden");
deleteLink.css("visibility", "hidden");
});
};
for (var i = 0; i < projects.length; i++) {
renderProject(projects[i]);
var deleteLink = $('<a></a>')
.addClass("delete-project")
.attr("title","Delete this project")
.attr("href","")
.css("visibility", "hidden")
.html("<img src='/images/close.png' />")
.click(function() {
if (window.confirm("Are you sure you want to delete project \"" + project.name + "\"?")) {
$.ajax({
type: "POST",
url: "/command/core/delete-project",
data: { "project" : project.id },
dataType: "json",
success: function (data) {
if (data && typeof data.code != 'undefined' && data.code == "ok") {
self._fetchProjects();
}
}
});
}
return false;
}).appendTo(tr.insertCell(tr.cells.length));
$('<div></div>')
.html(formatDate(project.date))
.addClass("last-modified")
.attr("title", project.date.toString())
.appendTo(tr.insertCell(tr.cells.length));
$(tr).mouseenter(function() {
renameLink.css("visibility", "visible");
deleteLink.css("visibility", "visible");
}).mouseleave(function() {
renameLink.css("visibility", "hidden");
deleteLink.css("visibility", "hidden");
});
};
for (var i = 0; i < projects.length; i++) {
renderProject(projects[i]);
}
}
};
Refine.OpenProjectUI.prototype._onClickUploadFileButton = function(evt) {
var projectName = $("#project-name-input")[0].value;
var dataURL = $.trim($("#project-url-input")[0].value);
if (! $.trim(projectName).length) {
window.alert("You must specify a project name.");
var projectName = $("#project-name-input")[0].value;
var dataURL = $.trim($("#project-url-input")[0].value);
if (! $.trim(projectName).length) {
window.alert("You must specify a project name.");
} else if ($("#project-file-input")[0].files.length === 0 && ! dataURL.length) {
window.alert("You must specify a data file to upload or a URL to retrieve.");
} else if ($("#project-file-input")[0].files.length === 0 && ! dataURL.length) {
window.alert("You must specify a data file to upload or a URL to retrieve.");
} else {
$("#file-upload-form").attr("action",
"/command/core/create-project-from-upload?" + [
"url=" + escape(dataURL),
"split-into-columns=" + $("#split-into-columns-input")[0].checked,
"separator=" + $("#separator-input")[0].value,
"ignore=" + $("#ignore-input")[0].value,
"header-lines=" + $("#header-lines-input")[0].value,
"skip=" + $("#skip-input")[0].value,
"limit=" + $("#limit-input")[0].value,
"guess-value-type=" + $("#guess-value-type-input")[0].checked,
"ignore-quotes=" + $("#ignore-quotes-input")[0].checked
].join("&"));
} else {
$("#file-upload-form").attr("action",
"/command/core/create-project-from-upload?" + [
"url=" + escape(dataURL),
"split-into-columns=" + $("#split-into-columns-input")[0].checked,
"separator=" + $("#separator-input")[0].value,
"ignore=" + $("#ignore-input")[0].value,
"header-lines=" + $("#header-lines-input")[0].value,
"skip=" + $("#skip-input")[0].value,
"limit=" + $("#limit-input")[0].value,
"guess-value-type=" + $("#guess-value-type-input")[0].checked,
"ignore-quotes=" + $("#ignore-quotes-input")[0].checked
].join("&"));
return true;
}
return true;
}
evt.preventDefault();
return false;
evt.preventDefault();
return false;
};
Refine.actionAreas.push({

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,31 +29,31 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
Refine.ExcelParserUI = function(controller, jobID, job, format, config,
dataContainerElmt, progressContainerElmt, optionContainerElmt) {
this._controller = controller;
this._jobID = jobID;
this._job = job;
this._format = format;
this._config = config;
this._controller = controller;
this._jobID = jobID;
this._job = job;
this._format = format;
this._config = config;
this._dataContainer = dataContainerElmt;
this._progressContainer = progressContainerElmt;
this._optionContainer = optionContainerElmt;
this._dataContainer = dataContainerElmt;
this._progressContainer = progressContainerElmt;
this._optionContainer = optionContainerElmt;
this._timerID = null;
this._initialize();
this._updatePreview();
this._timerID = null;
this._initialize();
this._updatePreview();
};
Refine.DefaultImportingController.parserUIs["ExcelParserUI"] = Refine.ExcelParserUI;
Refine.ExcelParserUI.prototype.dispose = function() {
if (this._timerID != null) {
window.clearTimeout(this._timerID);
this._timerID = null;
}
if (this._timerID != null) {
window.clearTimeout(this._timerID);
this._timerID = null;
}
};
Refine.ExcelParserUI.prototype.confirmReadyToCreateProject = function() {
@ -61,138 +61,138 @@ Refine.ExcelParserUI.prototype.confirmReadyToCreateProject = function() {
};
Refine.ExcelParserUI.prototype.getOptions = function() {
var options = {
xmlBased: this._config.xmlBased,
sheets: []
};
var options = {
xmlBased: this._config.xmlBased,
sheets: []
};
var parseIntDefault = function(s, def) {
try {
var n = parseInt(s);
if (!isNaN(n)) {
return n;
}
} catch (e) {
// Ignore
}
return def;
};
this._optionContainerElmts.sheetRecordContainer.find('input').each(function() {
if (this.checked) {
options.sheets.push(parseInt(this.getAttribute('index')));
var parseIntDefault = function(s, def) {
try {
var n = parseInt(s);
if (!isNaN(n)) {
return n;
}
});
} catch (e) {
// Ignore
}
return def;
};
if (this._optionContainerElmts.ignoreCheckbox[0].checked) {
options.ignoreLines = parseIntDefault(this._optionContainerElmts.ignoreInput[0].value, -1);
} else {
options.ignoreLines = -1;
this._optionContainerElmts.sheetRecordContainer.find('input').each(function() {
if (this.checked) {
options.sheets.push(parseInt(this.getAttribute('index')));
}
if (this._optionContainerElmts.headerLinesCheckbox[0].checked) {
options.headerLines = parseIntDefault(this._optionContainerElmts.headerLinesInput[0].value, 0);
} else {
options.headerLines = 0;
}
if (this._optionContainerElmts.skipCheckbox[0].checked) {
options.skipDataLines = parseIntDefault(this._optionContainerElmts.skipInput[0].value, 0);
} else {
options.skipDataLines = 0;
}
if (this._optionContainerElmts.limitCheckbox[0].checked) {
options.limit = parseIntDefault(this._optionContainerElmts.limitInput[0].value, -1);
} else {
options.limit = -1;
}
options.storeBlankRows = this._optionContainerElmts.storeBlankRowsCheckbox[0].checked;
options.storeBlankCellsAsNulls = this._optionContainerElmts.storeBlankCellsAsNullsCheckbox[0].checked;
options.includeFileSources = this._optionContainerElmts.includeFileSourcesCheckbox[0].checked;
});
return options;
if (this._optionContainerElmts.ignoreCheckbox[0].checked) {
options.ignoreLines = parseIntDefault(this._optionContainerElmts.ignoreInput[0].value, -1);
} else {
options.ignoreLines = -1;
}
if (this._optionContainerElmts.headerLinesCheckbox[0].checked) {
options.headerLines = parseIntDefault(this._optionContainerElmts.headerLinesInput[0].value, 0);
} else {
options.headerLines = 0;
}
if (this._optionContainerElmts.skipCheckbox[0].checked) {
options.skipDataLines = parseIntDefault(this._optionContainerElmts.skipInput[0].value, 0);
} else {
options.skipDataLines = 0;
}
if (this._optionContainerElmts.limitCheckbox[0].checked) {
options.limit = parseIntDefault(this._optionContainerElmts.limitInput[0].value, -1);
} else {
options.limit = -1;
}
options.storeBlankRows = this._optionContainerElmts.storeBlankRowsCheckbox[0].checked;
options.storeBlankCellsAsNulls = this._optionContainerElmts.storeBlankCellsAsNullsCheckbox[0].checked;
options.includeFileSources = this._optionContainerElmts.includeFileSourcesCheckbox[0].checked;
return options;
};
Refine.ExcelParserUI.prototype._initialize = function() {
var self = this;
var self = this;
this._optionContainer.unbind().empty().html(
DOM.loadHTML("core", "scripts/index/parser-interfaces/excel-parser-ui.html"));
this._optionContainerElmts = DOM.bind(this._optionContainer);
this._optionContainerElmts.previewButton.click(function() { self._updatePreview(); });
this._optionContainer.unbind().empty().html(
DOM.loadHTML("core", "scripts/index/parser-interfaces/excel-parser-ui.html"));
this._optionContainerElmts = DOM.bind(this._optionContainer);
this._optionContainerElmts.previewButton.click(function() { self._updatePreview(); });
var sheetTable = this._optionContainerElmts.sheetRecordContainer[0];
$.each(this._config.sheetRecords, function(i, v) {
var tr = sheetTable.insertRow(sheetTable.rows.length);
var td0 = $(tr.insertCell(0)).attr('width', '1%');
var checkbox = $('<input>')
.attr('type', 'checkbox')
.attr('index', i)
.appendTo(td0);
if (this.selected) {
checkbox.attr('checked', 'true');
}
$(tr.insertCell(1)).text(this.name);
$(tr.insertCell(2)).text(this.rows + ' rows');
});
if (this._config.ignoreLines > 0) {
this._optionContainerElmts.ignoreCheckbox.attr("checked", "checked");
this._optionContainerElmts.ignoreInput[0].value = this._config.ignoreLines.toString();
}
if (this._config.headerLines > 0) {
this._optionContainerElmts.headerLinesCheckbox.attr("checked", "checked");
this._optionContainerElmts.headerLinesInput[0].value = this._config.headerLines.toString();
}
if (this._config.limit > 0) {
this._optionContainerElmts.limitCheckbox.attr("checked", "checked");
this._optionContainerElmts.limitInput[0].value = this._config.limit.toString();
}
if (this._config.skipDataLines > 0) {
this._optionContainerElmts.skipCheckbox.attr("checked", "checked");
this._optionContainerElmts.skipInput.value[0].value = this._config.skipDataLines.toString();
}
if (this._config.storeBlankRows) {
this._optionContainerElmts.storeBlankRowsCheckbox.attr("checked", "checked");
}
if (this._config.storeBlankCellsAsNulls) {
this._optionContainerElmts.storeBlankCellsAsNullsCheckbox.attr("checked", "checked");
}
if (this._config.includeFileSources) {
this._optionContainerElmts.includeFileSourcesCheckbox.attr("checked", "checked");
var sheetTable = this._optionContainerElmts.sheetRecordContainer[0];
$.each(this._config.sheetRecords, function(i, v) {
var tr = sheetTable.insertRow(sheetTable.rows.length);
var td0 = $(tr.insertCell(0)).attr('width', '1%');
var checkbox = $('<input>')
.attr('type', 'checkbox')
.attr('index', i)
.appendTo(td0);
if (this.selected) {
checkbox.attr('checked', 'true');
}
var onChange = function() {
self._scheduleUpdatePreview();
};
this._optionContainer.find("input").bind("change", onChange);
this._optionContainer.find("select").bind("change", onChange);
$(tr.insertCell(1)).text(this.name);
$(tr.insertCell(2)).text(this.rows + ' rows');
});
if (this._config.ignoreLines > 0) {
this._optionContainerElmts.ignoreCheckbox.attr("checked", "checked");
this._optionContainerElmts.ignoreInput[0].value = this._config.ignoreLines.toString();
}
if (this._config.headerLines > 0) {
this._optionContainerElmts.headerLinesCheckbox.attr("checked", "checked");
this._optionContainerElmts.headerLinesInput[0].value = this._config.headerLines.toString();
}
if (this._config.limit > 0) {
this._optionContainerElmts.limitCheckbox.attr("checked", "checked");
this._optionContainerElmts.limitInput[0].value = this._config.limit.toString();
}
if (this._config.skipDataLines > 0) {
this._optionContainerElmts.skipCheckbox.attr("checked", "checked");
this._optionContainerElmts.skipInput.value[0].value = this._config.skipDataLines.toString();
}
if (this._config.storeBlankRows) {
this._optionContainerElmts.storeBlankRowsCheckbox.attr("checked", "checked");
}
if (this._config.storeBlankCellsAsNulls) {
this._optionContainerElmts.storeBlankCellsAsNullsCheckbox.attr("checked", "checked");
}
if (this._config.includeFileSources) {
this._optionContainerElmts.includeFileSourcesCheckbox.attr("checked", "checked");
}
var onChange = function() {
self._scheduleUpdatePreview();
};
this._optionContainer.find("input").bind("change", onChange);
this._optionContainer.find("select").bind("change", onChange);
};
Refine.ExcelParserUI.prototype._scheduleUpdatePreview = function() {
if (this._timerID != null) {
window.clearTimeout(this._timerID);
this._timerID = null;
}
if (this._timerID != null) {
window.clearTimeout(this._timerID);
this._timerID = null;
}
var self = this;
this._timerID = window.setTimeout(function() {
self._timerID = null;
self._updatePreview();
}, 500); // 0.5 second
var self = this;
this._timerID = window.setTimeout(function() {
self._timerID = null;
self._updatePreview();
}, 500); // 0.5 second
};
Refine.ExcelParserUI.prototype._updatePreview = function() {
var self = this;
var self = this;
this._progressContainer.show();
this._progressContainer.show();
this._controller.updateFormatAndOptions(this.getOptions(), function(result) {
if (result.status == "ok") {
self._controller.getPreviewData(function(projectData) {
self._progressContainer.hide();
this._controller.updateFormatAndOptions(this.getOptions(), function(result) {
if (result.status == "ok") {
self._controller.getPreviewData(function(projectData) {
self._progressContainer.hide();
new Refine.PreviewTable(projectData, self._dataContainer.unbind().empty());
});
}
});
new Refine.PreviewTable(projectData, self._dataContainer.unbind().empty());
});
}
});
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,44 +29,44 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
Refine.FixedWidthParserUI = function(controller, jobID, job, format, config,
dataContainerElmt, progressContainerElmt, optionContainerElmt) {
this._controller = controller;
this._jobID = jobID;
this._job = job;
this._format = format;
this._config = config;
this._controller = controller;
this._jobID = jobID;
this._job = job;
this._format = format;
this._config = config;
this._dataContainer = dataContainerElmt;
this._progressContainer = progressContainerElmt;
this._optionContainer = optionContainerElmt;
this._dataContainer = dataContainerElmt;
this._progressContainer = progressContainerElmt;
this._optionContainer = optionContainerElmt;
this._timerID = null;
this._initialize();
this.updatePreview();
this._timerID = null;
this._initialize();
this.updatePreview();
};
Refine.DefaultImportingController.parserUIs["FixedWidthParserUI"] = Refine.FixedWidthParserUI;
Refine.FixedWidthParserUI.encodeSeparator = function(s) {
return s.replace("\\", "\\\\")
.replace("\n", "\\n")
.replace("\t", "\\t");
return s.replace("\\", "\\\\")
.replace("\n", "\\n")
.replace("\t", "\\t");
};
Refine.FixedWidthParserUI.decodeSeparator = function(s) {
return s.replace("\\n", "\n")
.replace("\\t", "\t")
.replace("\\\\", "\\");
return s.replace("\\n", "\n")
.replace("\\t", "\t")
.replace("\\\\", "\\");
};
Refine.FixedWidthParserUI.prototype.dispose = function() {
if (this._timerID != null) {
window.clearTimeout(this._timerID);
this._timerID = null;
}
if (this._timerID != null) {
window.clearTimeout(this._timerID);
this._timerID = null;
}
};
Refine.FixedWidthParserUI.prototype.confirmReadyToCreateProject = function() {
@ -74,398 +74,398 @@ Refine.FixedWidthParserUI.prototype.confirmReadyToCreateProject = function() {
};
Refine.FixedWidthParserUI.prototype.getOptions = function() {
var options = {
columnWidths: [].concat(this._config.columnWidths)
};
var options = {
columnWidths: [].concat(this._config.columnWidths)
};
var columnNames = $.trim(this._optionContainerElmts.columnNamesInput[0].value).replace(/,\s+/g, ',').split(',');
if (columnNames.length > 0 && columnNames[0].length > 0) {
options.columnNames = columnNames;
}
var columnNames = $.trim(this._optionContainerElmts.columnNamesInput[0].value).replace(/,\s+/g, ',').split(',');
if (columnNames.length > 0 && columnNames[0].length > 0) {
options.columnNames = columnNames;
}
switch (this._optionContainer.find("input[name='row-separator']:checked")[0].value) {
case 'new-line':
options.lineSeparator = "\n";
break;
default:
options.lineSeparator = Refine.FixedWidthParserUI.decodeSeparator(
this._optionContainerElmts.rowSeparatorInput[0].value);
}
switch (this._optionContainer.find("input[name='row-separator']:checked")[0].value) {
case 'new-line':
options.lineSeparator = "\n";
break;
default:
options.lineSeparator = Refine.FixedWidthParserUI.decodeSeparator(
this._optionContainerElmts.rowSeparatorInput[0].value);
}
var parseIntDefault = function(s, def) {
try {
var n = parseInt(s);
if (!isNaN(n)) {
return n;
}
} catch (e) {
// Ignore
}
return def;
};
if (this._optionContainerElmts.ignoreCheckbox[0].checked) {
options.ignoreLines = parseIntDefault(this._optionContainerElmts.ignoreInput[0].value, -1);
} else {
options.ignoreLines = -1;
}
if (this._optionContainerElmts.headerLinesCheckbox[0].checked) {
options.headerLines = parseIntDefault(this._optionContainerElmts.headerLinesInput[0].value, 0);
} else {
options.headerLines = 0;
}
if (this._optionContainerElmts.skipCheckbox[0].checked) {
options.skipDataLines = parseIntDefault(this._optionContainerElmts.skipInput[0].value, 0);
} else {
options.skipDataLines = 0;
}
if (this._optionContainerElmts.limitCheckbox[0].checked) {
options.limit = parseIntDefault(this._optionContainerElmts.limitInput[0].value, -1);
} else {
options.limit = -1;
var parseIntDefault = function(s, def) {
try {
var n = parseInt(s);
if (!isNaN(n)) {
return n;
}
} catch (e) {
// Ignore
}
return def;
};
if (this._optionContainerElmts.ignoreCheckbox[0].checked) {
options.ignoreLines = parseIntDefault(this._optionContainerElmts.ignoreInput[0].value, -1);
} else {
options.ignoreLines = -1;
}
if (this._optionContainerElmts.headerLinesCheckbox[0].checked) {
options.headerLines = parseIntDefault(this._optionContainerElmts.headerLinesInput[0].value, 0);
} else {
options.headerLines = 0;
}
if (this._optionContainerElmts.skipCheckbox[0].checked) {
options.skipDataLines = parseIntDefault(this._optionContainerElmts.skipInput[0].value, 0);
} else {
options.skipDataLines = 0;
}
if (this._optionContainerElmts.limitCheckbox[0].checked) {
options.limit = parseIntDefault(this._optionContainerElmts.limitInput[0].value, -1);
} else {
options.limit = -1;
}
options.guessCellValueTypes = this._optionContainerElmts.guessCellValueTypesCheckbox[0].checked;
options.guessCellValueTypes = this._optionContainerElmts.guessCellValueTypesCheckbox[0].checked;
options.storeBlankRows = this._optionContainerElmts.storeBlankRowsCheckbox[0].checked;
options.storeBlankCellsAsNulls = this._optionContainerElmts.storeBlankCellsAsNullsCheckbox[0].checked;
options.includeFileSources = this._optionContainerElmts.includeFileSourcesCheckbox[0].checked;
options.storeBlankRows = this._optionContainerElmts.storeBlankRowsCheckbox[0].checked;
options.storeBlankCellsAsNulls = this._optionContainerElmts.storeBlankCellsAsNullsCheckbox[0].checked;
options.includeFileSources = this._optionContainerElmts.includeFileSourcesCheckbox[0].checked;
return options;
return options;
};
Refine.FixedWidthParserUI.prototype._initialize = function() {
var self = this;
var self = this;
this._optionContainer.unbind().empty().html(
DOM.loadHTML("core", "scripts/index/parser-interfaces/fixed-width-parser-ui.html"));
this._optionContainerElmts = DOM.bind(this._optionContainer);
this._optionContainerElmts.previewButton.click(function() { self._updatePreview(); });
this._optionContainer.unbind().empty().html(
DOM.loadHTML("core", "scripts/index/parser-interfaces/fixed-width-parser-ui.html"));
this._optionContainerElmts = DOM.bind(this._optionContainer);
this._optionContainerElmts.previewButton.click(function() { self._updatePreview(); });
this._optionContainerElmts.columnWidthsInput[0].value = this._config.columnWidths.join(',');
if ('columnNames' in this._config) {
this._optionContainerElmts.columnNamesInput[0].value = this._config.columnNames.join(',');
}
this._optionContainerElmts.columnWidthsInput[0].value = this._config.columnWidths.join(',');
if ('columnNames' in this._config) {
this._optionContainerElmts.columnNamesInput[0].value = this._config.columnNames.join(',');
}
var rowSeparatorValue = (this._config.lineSeparator == "\n") ? 'new-line' : 'custom';
this._optionContainer.find(
"input[name='row-separator'][value='" + rowSeparatorValue + "']").attr("checked", "checked");
this._optionContainerElmts.rowSeparatorInput[0].value =
Refine.FixedWidthParserUI.encodeSeparator(this._config.lineSeparator);
var rowSeparatorValue = (this._config.lineSeparator == "\n") ? 'new-line' : 'custom';
this._optionContainer.find(
"input[name='row-separator'][value='" + rowSeparatorValue + "']").attr("checked", "checked");
this._optionContainerElmts.rowSeparatorInput[0].value =
Refine.FixedWidthParserUI.encodeSeparator(this._config.lineSeparator);
if (this._config.ignoreLines > 0) {
this._optionContainerElmts.ignoreCheckbox.attr("checked", "checked");
this._optionContainerElmts.ignoreInput[0].value = this._config.ignoreLines.toString();
}
if (this._config.headerLines > 0) {
this._optionContainerElmts.headerLinesCheckbox.attr("checked", "checked");
this._optionContainerElmts.headerLinesInput[0].value = this._config.headerLines.toString();
}
if (this._config.limit > 0) {
this._optionContainerElmts.limitCheckbox.attr("checked", "checked");
this._optionContainerElmts.limitInput[0].value = this._config.limit.toString();
}
if (this._config.skipDataLines > 0) {
this._optionContainerElmts.skipCheckbox.attr("checked", "checked");
this._optionContainerElmts.skipInput.value[0].value = this._config.skipDataLines.toString();
}
if (this._config.storeBlankRows) {
this._optionContainerElmts.storeBlankRowsCheckbox.attr("checked", "checked");
}
if (this._config.ignoreLines > 0) {
this._optionContainerElmts.ignoreCheckbox.attr("checked", "checked");
this._optionContainerElmts.ignoreInput[0].value = this._config.ignoreLines.toString();
}
if (this._config.headerLines > 0) {
this._optionContainerElmts.headerLinesCheckbox.attr("checked", "checked");
this._optionContainerElmts.headerLinesInput[0].value = this._config.headerLines.toString();
}
if (this._config.limit > 0) {
this._optionContainerElmts.limitCheckbox.attr("checked", "checked");
this._optionContainerElmts.limitInput[0].value = this._config.limit.toString();
}
if (this._config.skipDataLines > 0) {
this._optionContainerElmts.skipCheckbox.attr("checked", "checked");
this._optionContainerElmts.skipInput.value[0].value = this._config.skipDataLines.toString();
}
if (this._config.storeBlankRows) {
this._optionContainerElmts.storeBlankRowsCheckbox.attr("checked", "checked");
}
if (this._config.guessCellValueTypes) {
this._optionContainerElmts.guessCellValueTypesCheckbox.attr("checked", "checked");
}
if (this._config.guessCellValueTypes) {
this._optionContainerElmts.guessCellValueTypesCheckbox.attr("checked", "checked");
}
if (this._config.storeBlankCellsAsNulls) {
this._optionContainerElmts.storeBlankCellsAsNullsCheckbox.attr("checked", "checked");
}
if (this._config.includeFileSources) {
this._optionContainerElmts.includeFileSourcesCheckbox.attr("checked", "checked");
}
if (this._config.storeBlankCellsAsNulls) {
this._optionContainerElmts.storeBlankCellsAsNullsCheckbox.attr("checked", "checked");
}
if (this._config.includeFileSources) {
this._optionContainerElmts.includeFileSourcesCheckbox.attr("checked", "checked");
}
var onChange = function() {
self._scheduleUpdatePreview();
};
this._optionContainer.find("input").bind("change", onChange);
this._optionContainer.find("select").bind("change", onChange);
var onChange = function() {
self._scheduleUpdatePreview();
};
this._optionContainer.find("input").bind("change", onChange);
this._optionContainer.find("select").bind("change", onChange);
this._optionContainerElmts.columnWidthsInput.bind("change", function() {
var newColumnWidths = [];
var a = $.trim(this.value).replace(/,\s+/g, ',').split(',');
for (var i = 0; i < a.length; i++) {
var n = parseInt(a[i]);
if (isNaN(n)) {
return;
}
newColumnWidths.push(n);
}
self._config.columnWidths = newColumnWidths;
onChange();
});
this._optionContainerElmts.columnNamesInput.bind("change", onChange);
this._optionContainerElmts.columnWidthsInput.bind("change", function() {
var newColumnWidths = [];
var a = $.trim(this.value).replace(/,\s+/g, ',').split(',');
for (var i = 0; i < a.length; i++) {
var n = parseInt(a[i]);
if (isNaN(n)) {
return;
}
newColumnWidths.push(n);
}
self._config.columnWidths = newColumnWidths;
onChange();
});
this._optionContainerElmts.columnNamesInput.bind("change", onChange);
};
Refine.FixedWidthParserUI.prototype._scheduleUpdatePreview = function() {
if (this._timerID != null) {
window.clearTimeout(this._timerID);
this._timerID = null;
}
if (this._timerID != null) {
window.clearTimeout(this._timerID);
this._timerID = null;
}
var self = this;
this._timerID = window.setTimeout(function() {
self._timerID = null;
self.updatePreview();
}, 500); // 0.5 second
var self = this;
this._timerID = window.setTimeout(function() {
self._timerID = null;
self.updatePreview();
}, 500); // 0.5 second
};
Refine.FixedWidthParserUI.prototype.updatePreview = function() {
var self = this;
var self = this;
this._progressContainer.show();
this._progressContainer.show();
var options = this.getOptions();
// for preview, we need exact text, so it's easier to show where the columns are split
options.guessCellValueTypes = false;
var options = this.getOptions();
// for preview, we need exact text, so it's easier to show where the columns are split
options.guessCellValueTypes = false;
this._controller.updateFormatAndOptions(options, function(result) {
if (result.status == "ok") {
self._controller.getPreviewData(function(projectData) {
new Refine.FixedWidthPreviewTable(
self,
self._config,
projectData,
self._dataContainer
);
self._progressContainer.hide();
}, 20);
}
});
this._controller.updateFormatAndOptions(options, function(result) {
if (result.status == "ok") {
self._controller.getPreviewData(function(projectData) {
new Refine.FixedWidthPreviewTable(
self,
self._config,
projectData,
self._dataContainer
);
self._progressContainer.hide();
}, 20);
}
});
};
Refine.FixedWidthPreviewTable = function(parserUI, config, projectData, elmt) {
this._parserUI = parserUI;
this._config = config;
this._projectData = projectData;
this._elmt = elmt;
this._render();
this._parserUI = parserUI;
this._config = config;
this._projectData = projectData;
this._elmt = elmt;
this._render();
};
Refine.FixedWidthPreviewTable.prototype._render = function() {
var scrollTop = this._elmt[0].scrollTop;
var scrollLeft = this._elmt[0].scrollLeft;
var scrollTop = this._elmt[0].scrollTop;
var scrollLeft = this._elmt[0].scrollLeft;
this._elmt.unbind().empty();
this._elmt.unbind().empty();
var self = this;
var container = $('<div>')
.addClass('fixed-width-preview-container')
.appendTo(this._elmt);
var table = $('<table>')
.addClass("data-table")
.addClass("fixed-width-preview-data-table")
.appendTo(container)[0];
var self = this;
var container = $('<div>')
.addClass('fixed-width-preview-container')
.appendTo(this._elmt);
var table = $('<table>')
.addClass("data-table")
.addClass("fixed-width-preview-data-table")
.appendTo(container)[0];
var columns = this._projectData.columnModel.columns;
var columnWidths = [].concat(this._config.columnWidths);
var columns = this._projectData.columnModel.columns;
var columnWidths = [].concat(this._config.columnWidths);
var addCell = function(tr) {
var index = tr.cells.length;
var td = tr.insertCell(index);
td.className = (index % 2 == 0) ? 'even' : 'odd';
return td;
};
var addCell = function(tr) {
var index = tr.cells.length;
var td = tr.insertCell(index);
td.className = (index % 2 == 0) ? 'even' : 'odd';
return td;
};
/*------------------------------------------------------------
* Column Headers
*------------------------------------------------------------
*/
/*------------------------------------------------------------
* Column Headers
*------------------------------------------------------------
*/
var trHead = table.insertRow(table.rows.length);
$(addCell(trHead)).addClass("column-header").html('&nbsp;'); // index
var trHead = table.insertRow(table.rows.length);
$(addCell(trHead)).addClass("column-header").html('&nbsp;'); // index
var createColumnHeader = function(column, index) {
var name = column.name;
if (index < columnWidths.length) {
name = name.slice(0, columnWidths[index]);
}
$(addCell(trHead))
.addClass("column-header")
.text(name)
.attr('title', column.name);
};
var createColumnHeader = function(column, index) {
var name = column.name;
if (index < columnWidths.length) {
name = name.slice(0, columnWidths[index]);
}
$(addCell(trHead))
.addClass("column-header")
.text(name)
.attr('title', column.name);
};
for (var i = 0; i < columns.length; i++) {
createColumnHeader(columns[i], i);
}
/*------------------------------------------------------------
* Data Cells
*------------------------------------------------------------
*/
var rows = this._projectData.rowModel.rows;
var renderRow = function(tr, r, row) {
var tdIndex = addCell(tr);
$('<div></div>').html((row.i + 1) + ".").appendTo(tdIndex);
var cells = row.cells;
for (var i = 0; i < columns.length; i++) {
createColumnHeader(columns[i], i);
}
var column = columns[i];
var td = addCell(tr);
var divContent = $('<div/>').addClass("data-table-cell-content").appendTo(td);
/*------------------------------------------------------------
* Data Cells
*------------------------------------------------------------
*/
var rows = this._projectData.rowModel.rows;
var renderRow = function(tr, r, row) {
var tdIndex = addCell(tr);
$('<div></div>').html((row.i + 1) + ".").appendTo(tdIndex);
var cells = row.cells;
for (var i = 0; i < columns.length; i++) {
var column = columns[i];
var td = addCell(tr);
var divContent = $('<div/>').addClass("data-table-cell-content").appendTo(td);
var cell = (column.cellIndex < cells.length) ? cells[column.cellIndex] : null;
if (!cell || ("v" in cell && cell.v === null)) {
$('<span>').html("&nbsp;").appendTo(divContent);
} else if ("e" in cell) {
$('<span>').addClass("data-table-error").text(cell.e).appendTo(divContent);
} else if (!("r" in cell) || !cell.r) {
if (typeof cell.v !== "string") {
if (typeof cell.v == "number") {
divContent.addClass("data-table-cell-content-numeric");
}
$('<span>')
.addClass("data-table-value-nonstring")
.text(cell.v)
.appendTo(divContent);
} else if (URL.looksLikeUrl(cell.v)) {
$('<a>')
.text(cell.v)
.attr("href", cell.v)
.attr("target", "_blank")
.appendTo(divContent);
} else {
$('<span>').text(cell.v).appendTo(divContent);
}
}
var cell = (column.cellIndex < cells.length) ? cells[column.cellIndex] : null;
if (!cell || ("v" in cell && cell.v === null)) {
$('<span>').html("&nbsp;").appendTo(divContent);
} else if ("e" in cell) {
$('<span>').addClass("data-table-error").text(cell.e).appendTo(divContent);
} else if (!("r" in cell) || !cell.r) {
if (typeof cell.v !== "string") {
if (typeof cell.v == "number") {
divContent.addClass("data-table-cell-content-numeric");
}
$('<span>')
.addClass("data-table-value-nonstring")
.text(cell.v)
.appendTo(divContent);
} else if (URL.looksLikeUrl(cell.v)) {
$('<a>')
.text(cell.v)
.attr("href", cell.v)
.attr("target", "_blank")
.appendTo(divContent);
} else {
$('<span>').text(cell.v).appendTo(divContent);
}
};
}
}
};
for (var r = 0; r < rows.length; r++) {
var row = rows[r];
renderRow(table.insertRow(table.rows.length), r, row);
for (var r = 0; r < rows.length; r++) {
var row = rows[r];
renderRow(table.insertRow(table.rows.length), r, row);
}
var pixelOffset = $(trHead.cells[1]).position().left;
var testString = '01234567890123456789012345678901234567890123456789';
var testDiv = $('<div>')
.css('position', 'absolute')
.css('top', '-100px')
.text(testString)
.appendTo(container);
var pixelsPerChar = testDiv.width() / testString.length;
testDiv.remove();
var columnSeparators = [];
var columnCharIndexes = [];
var positionColumnSeparator = function(outer, charIndex) {
outer.css('left',
Math.round(pixelOffset + charIndex * pixelsPerChar - DOM.getHPaddings(outer) / 2) + 'px');
};
var computeCharIndex = function(evt) {
var offset = evt.pageX - container.offset().left;
return Math.round((offset - pixelOffset) / pixelsPerChar);
};
var updatePreview = function() {
columnCharIndexes.sort(function(a, b) { return a - b; });
var newColumnWidths = [];
for (var i = 0; i < columnCharIndexes.length; i++) {
var charIndex = columnCharIndexes[i];
var columnWidth = (i == 0) ? charIndex : (charIndex - columnCharIndexes[i - 1]);
if (columnWidth > 0) {
newColumnWidths.push(columnWidth);
}
}
var pixelOffset = $(trHead.cells[1]).position().left;
var testString = '01234567890123456789012345678901234567890123456789';
var testDiv = $('<div>')
.css('position', 'absolute')
.css('top', '-100px')
.text(testString)
.appendTo(container);
var pixelsPerChar = testDiv.width() / testString.length;
testDiv.remove();
self._config.columnWidths = newColumnWidths;
self._parserUI._optionContainerElmts.columnWidthsInput[0].value = newColumnWidths.join(',');
self._parserUI.updatePreview();
};
var columnSeparators = [];
var columnCharIndexes = [];
var positionColumnSeparator = function(outer, charIndex) {
outer.css('left',
Math.round(pixelOffset + charIndex * pixelsPerChar - DOM.getHPaddings(outer) / 2) + 'px');
};
var computeCharIndex = function(evt) {
var offset = evt.pageX - container.offset().left;
return Math.round((offset - pixelOffset) / pixelsPerChar);
};
var updatePreview = function() {
columnCharIndexes.sort(function(a, b) { return a - b; });
var newSeparator = $('<div>')
.addClass('fixed-width-preview-column-separator-outer')
.append($('<div>').addClass('fixed-width-preview-column-separator-inner'))
.appendTo(container);
var newColumnWidths = [];
for (var i = 0; i < columnCharIndexes.length; i++) {
var charIndex = columnCharIndexes[i];
var columnWidth = (i == 0) ? charIndex : (charIndex - columnCharIndexes[i - 1]);
if (columnWidth > 0) {
newColumnWidths.push(columnWidth);
}
}
var createColumnSeparator = function(charIndex, index) {
columnCharIndexes[index] = charIndex;
self._config.columnWidths = newColumnWidths;
self._parserUI._optionContainerElmts.columnWidthsInput[0].value = newColumnWidths.join(',');
self._parserUI.updatePreview();
};
var outer = $('<div>')
.addClass('fixed-width-preview-column-separator-outer')
.appendTo(container);
var inner = $('<div>')
.addClass('fixed-width-preview-column-separator-inner')
.appendTo(outer);
var close = $('<div>').appendTo(inner);
var newSeparator = $('<div>')
.addClass('fixed-width-preview-column-separator-outer')
.append($('<div>').addClass('fixed-width-preview-column-separator-inner'))
.appendTo(container);
positionColumnSeparator(outer, charIndex);
var createColumnSeparator = function(charIndex, index) {
columnCharIndexes[index] = charIndex;
var outer = $('<div>')
.addClass('fixed-width-preview-column-separator-outer')
.appendTo(container);
var inner = $('<div>')
.addClass('fixed-width-preview-column-separator-inner')
.appendTo(outer);
var close = $('<div>').appendTo(inner);
positionColumnSeparator(outer, charIndex);
outer.mouseover(function() {
newSeparator.hide();
})
.mouseout(function() {
newSeparator.show();
})
.mousedown(function() {
var mouseMove = function(evt) {
var newCharIndex = computeCharIndex(evt);
positionColumnSeparator(outer, newCharIndex);
evt.preventDefault();
evt.stopPropagation();
return false;
};
var mouseUp = function(evt) {
container.unbind('mousemove', mouseMove);
container.unbind('mouseup', mouseUp);
var newCharIndex = computeCharIndex(evt);
positionColumnSeparator(outer, newCharIndex);
columnCharIndexes[index] = newCharIndex;
updatePreview();
evt.preventDefault();
evt.stopPropagation();
return false;
};
container.bind('mousemove', mouseMove);
container.bind('mouseup', mouseUp);
});
close.click(function() {
columnCharIndexes[index] = index > 0 ? columnCharIndexes[index - 1] : 0;
updatePreview();
});
};
var charOffset = 0;
for (var i = 0; i < columnWidths.length; i++) {
var columnWidth = columnWidths[i];
createColumnSeparator(charOffset + columnWidth, i);
charOffset += columnWidth;
}
container
.mouseout(function(evt) {
newSeparator.hide();
})
.mousemove(function(evt) {
var offset = evt.pageX - container.offset().left;
var newCharIndex = Math.round((offset - pixelOffset) / pixelsPerChar);
positionColumnSeparator(newSeparator.show(), newCharIndex);
});
newSeparator.mousedown(function(evt) {
outer.mouseover(function() {
newSeparator.hide();
})
.mouseout(function() {
newSeparator.show();
})
.mousedown(function() {
var mouseMove = function(evt) {
var newCharIndex = computeCharIndex(evt);
columnCharIndexes.push(newCharIndex);
positionColumnSeparator(outer, newCharIndex);
evt.preventDefault();
evt.stopPropagation();
return false;
};
var mouseUp = function(evt) {
container.unbind('mousemove', mouseMove);
container.unbind('mouseup', mouseUp);
var newCharIndex = computeCharIndex(evt);
positionColumnSeparator(outer, newCharIndex);
columnCharIndexes[index] = newCharIndex;
updatePreview();
evt.preventDefault();
evt.stopPropagation();
return false;
};
container.bind('mousemove', mouseMove);
container.bind('mouseup', mouseUp);
});
this._elmt[0].scrollTop = scrollTop;
this._elmt[0].scrollLeft = scrollLeft;
close.click(function() {
columnCharIndexes[index] = index > 0 ? columnCharIndexes[index - 1] : 0;
updatePreview();
});
};
var charOffset = 0;
for (var i = 0; i < columnWidths.length; i++) {
var columnWidth = columnWidths[i];
createColumnSeparator(charOffset + columnWidth, i);
charOffset += columnWidth;
}
container
.mouseout(function(evt) {
newSeparator.hide();
})
.mousemove(function(evt) {
var offset = evt.pageX - container.offset().left;
var newCharIndex = Math.round((offset - pixelOffset) / pixelsPerChar);
positionColumnSeparator(newSeparator.show(), newCharIndex);
});
newSeparator.mousedown(function(evt) {
var newCharIndex = computeCharIndex(evt);
columnCharIndexes.push(newCharIndex);
updatePreview();
evt.preventDefault();
evt.stopPropagation();
return false;
});
this._elmt[0].scrollTop = scrollTop;
this._elmt[0].scrollLeft = scrollLeft;
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,213 +29,213 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
Refine.JsonParserUI = function(controller, jobID, job, format, config,
dataContainerElmt, progressContainerElmt, optionContainerElmt) {
this._controller = controller;
this._jobID = jobID;
this._job = job;
this._format = format;
this._config = config;
this._controller = controller;
this._jobID = jobID;
this._job = job;
this._format = format;
this._config = config;
this._dataContainer = dataContainerElmt;
this._progressContainer = progressContainerElmt;
this._optionContainer = optionContainerElmt;
this._dataContainer = dataContainerElmt;
this._progressContainer = progressContainerElmt;
this._optionContainer = optionContainerElmt;
this._timerID = null;
this._initialize();
this._showPickRecordNodesUI();
this._timerID = null;
this._initialize();
this._showPickRecordNodesUI();
};
Refine.DefaultImportingController.parserUIs["JsonParserUI"] = Refine.JsonParserUI;
Refine.JsonParserUI.prototype.dispose = function() {
if (this._timerID != null) {
window.clearTimeout(this._timerID);
this._timerID = null;
}
if (this._timerID != null) {
window.clearTimeout(this._timerID);
this._timerID = null;
}
};
Refine.JsonParserUI.prototype.confirmReadyToCreateProject = function() {
if ((this._config.recordPath) && this._config.recordPath.length > 0) {
return true;
return true;
} else {
window.alert('Please specify a record path first.');
window.alert('Please specify a record path first.');
}
};
Refine.JsonParserUI.prototype.getOptions = function() {
var options = {
recordPath: this._config.recordPath
};
var options = {
recordPath: this._config.recordPath
};
if (this._optionContainerElmts.limitCheckbox[0].checked) {
options.limit = parseIntDefault(this._optionContainerElmts.limitInput[0].value, -1);
} else {
options.limit = -1;
}
options.includeFileSources = this._optionContainerElmts.includeFileSourcesCheckbox[0].checked;
if (this._optionContainerElmts.limitCheckbox[0].checked) {
options.limit = parseIntDefault(this._optionContainerElmts.limitInput[0].value, -1);
} else {
options.limit = -1;
}
options.includeFileSources = this._optionContainerElmts.includeFileSourcesCheckbox[0].checked;
return options;
return options;
};
Refine.JsonParserUI.prototype._initialize = function() {
var self = this;
var self = this;
this._optionContainer.unbind().empty().html(
DOM.loadHTML("core", "scripts/index/parser-interfaces/json-parser-ui.html"));
this._optionContainerElmts = DOM.bind(this._optionContainer);
this._optionContainerElmts.previewButton.click(function() { self._updatePreview(); });
this._optionContainer.unbind().empty().html(
DOM.loadHTML("core", "scripts/index/parser-interfaces/json-parser-ui.html"));
this._optionContainerElmts = DOM.bind(this._optionContainer);
this._optionContainerElmts.previewButton.click(function() { self._updatePreview(); });
if (this._config.limit > 0) {
this._optionContainerElmts.limitCheckbox.attr("checked", "checked");
this._optionContainerElmts.limitInput[0].value = this._config.limit.toString();
}
if (this._config.includeFileSources) {
this._optionContainerElmts.includeFileSourcesCheckbox.attr("checked", "checked");
}
this._optionContainerElmts.pickRecordElementsButton.click(function() {
self._showPickRecordNodesUI();
});
if (this._config.limit > 0) {
this._optionContainerElmts.limitCheckbox.attr("checked", "checked");
this._optionContainerElmts.limitInput[0].value = this._config.limit.toString();
}
if (this._config.includeFileSources) {
this._optionContainerElmts.includeFileSourcesCheckbox.attr("checked", "checked");
}
this._optionContainerElmts.pickRecordElementsButton.click(function() {
self._showPickRecordNodesUI();
});
var onChange = function() {
self._scheduleUpdatePreview();
};
this._optionContainer.find("input").bind("change", onChange);
this._optionContainer.find("select").bind("change", onChange);
var onChange = function() {
self._scheduleUpdatePreview();
};
this._optionContainer.find("input").bind("change", onChange);
this._optionContainer.find("select").bind("change", onChange);
};
Refine.JsonParserUI.prototype._showPickRecordNodesUI = function() {
var self = this;
var self = this;
this._dataContainer.unbind().empty().html(
DOM.loadHTML("core", "scripts/index/parser-interfaces/json-parser-select-ui.html"));
this._dataContainer.unbind().empty().html(
DOM.loadHTML("core", "scripts/index/parser-interfaces/json-parser-select-ui.html"));
var elmts = DOM.bind(this._dataContainer);
var elmts = DOM.bind(this._dataContainer);
var escapeElmt = $('<span>');
var escapeHtml = function(s) {
escapeElmt.empty().text(s);
return escapeElmt.html();
};
var textAsHtml = function(s) {
s = s.length <= 200 ? s : (s.substring(0, 200) + ' ...');
return '<span class="text">' + escapeHtml(s) + '</span>';
};
var hittest = function(evt, elmt) {
var a = $(evt.target).closest('.node');
return a.length > 0 && a[0] == elmt[0];
};
var registerEvents = function(elmt, path) {
elmt.bind('mouseover', function(evt) {
if (hittest(evt, elmt)) {
elmts.domContainer.find('.highlight').removeClass('highlight');
elmt.addClass('highlight');
}
})
.bind('mouseout', function(evt) {
elmt.removeClass('highlight');
})
.click(function(evt) {
if (hittest(evt, elmt)) {
self._setRecordPath(path);
}
});
};
var renderArray = function(a, container, parentPath) {
$('<span>').addClass('punctuation').text('[').appendTo(container);
var escapeElmt = $('<span>');
var escapeHtml = function(s) {
escapeElmt.empty().text(s);
return escapeElmt.html();
};
var textAsHtml = function(s) {
s = s.length <= 200 ? s : (s.substring(0, 200) + ' ...');
return '<span class="text">' + escapeHtml(s) + '</span>';
};
var hittest = function(evt, elmt) {
var a = $(evt.target).closest('.node');
return a.length > 0 && a[0] == elmt[0];
};
var registerEvents = function(elmt, path) {
elmt.bind('mouseover', function(evt) {
if (hittest(evt, elmt)) {
elmts.domContainer.find('.highlight').removeClass('highlight');
elmt.addClass('highlight');
}
})
.bind('mouseout', function(evt) {
elmt.removeClass('highlight');
})
.click(function(evt) {
if (hittest(evt, elmt)) {
self._setRecordPath(path);
}
});
};
var renderArray = function(a, container, parentPath) {
$('<span>').addClass('punctuation').text('[').appendTo(container);
var parentPath2 = [].concat(parentPath);
parentPath2.push('__anonymous__');
var elementNode = null;
for (var i = 0; i < a.length; i++) {
if (elementNode != null) {
$('<span>').addClass('punctuation').text(',').appendTo(elementNode);
}
elementNode = $('<div>').addClass('node').addClass('indented').appendTo(container);
renderNode(a[i], elementNode, parentPath2);
}
$('<span>').addClass('punctuation').text(']').appendTo(container);
};
var renderObject = function(o, container, parentPath) {
$('<span>').addClass('punctuation').text('{').appendTo(container);
var elementNode = null;
for (var key in o) {
if (o.hasOwnProperty(key)) {
if (elementNode != null) {
$('<span>').addClass('punctuation').text(',').appendTo(elementNode);
}
elementNode = $('<div>').addClass('node').addClass('indented').appendTo(container);
$('<span>').text(key).addClass('field-name').appendTo(elementNode);
$('<span>').text(': ').addClass('punctuation').appendTo(elementNode);
var parentPath2 = [].concat(parentPath);
parentPath2.push('__anonymous__');
parentPath2.push(key);
var elementNode = null;
for (var i = 0; i < a.length; i++) {
if (elementNode != null) {
$('<span>').addClass('punctuation').text(',').appendTo(elementNode);
}
elementNode = $('<div>').addClass('node').addClass('indented').appendTo(container);
renderNode(a[i], elementNode, parentPath2);
}
$('<span>').addClass('punctuation').text(']').appendTo(container);
};
var renderObject = function(o, container, parentPath) {
$('<span>').addClass('punctuation').text('{').appendTo(container);
var elementNode = null;
for (var key in o) {
if (o.hasOwnProperty(key)) {
if (elementNode != null) {
$('<span>').addClass('punctuation').text(',').appendTo(elementNode);
}
elementNode = $('<div>').addClass('node').addClass('indented').appendTo(container);
$('<span>').text(key).addClass('field-name').appendTo(elementNode);
$('<span>').text(': ').addClass('punctuation').appendTo(elementNode);
var parentPath2 = [].concat(parentPath);
parentPath2.push(key);
renderNode(o[key], elementNode, parentPath2);
}
}
$('<span>').addClass('punctuation').text('}').appendTo(container);
renderNode(o[key], elementNode, parentPath2);
}
}
$('<span>').addClass('punctuation').text('}').appendTo(container);
registerEvents(container, parentPath);
};
var renderNode = function(node, container, parentPath) {
if (node == null) {
$('<span>').addClass('literal').text('null').appendTo(container);
} else {
if ($.isPlainObject(node)) {
renderObject(node, container, parentPath);
} else if ($.isArray(node)) {
renderArray(node, container, parentPath);
} else {
$('<span>').addClass('literal').text(node.toString()).appendTo(container);
registerEvents(container, parentPath);
};
var renderNode = function(node, container, parentPath) {
if (node == null) {
$('<span>').addClass('literal').text('null').appendTo(container);
} else {
if ($.isPlainObject(node)) {
renderObject(node, container, parentPath);
} else if ($.isArray(node)) {
renderArray(node, container, parentPath);
} else {
$('<span>').addClass('literal').text(node.toString()).appendTo(container);
registerEvents(container, parentPath);
}
}
};
renderNode(this._config.dom, elmts.domContainer, [ '__anonymous__' ]);
}
}
};
renderNode(this._config.dom, elmts.domContainer, [ '__anonymous__' ]);
};
Refine.JsonParserUI.prototype._scheduleUpdatePreview = function() {
if (this._timerID != null) {
window.clearTimeout(this._timerID);
this._timerID = null;
}
if (this._timerID != null) {
window.clearTimeout(this._timerID);
this._timerID = null;
}
var self = this;
this._timerID = window.setTimeout(function() {
self._timerID = null;
self._updatePreview();
}, 500); // 0.5 second
var self = this;
this._timerID = window.setTimeout(function() {
self._timerID = null;
self._updatePreview();
}, 500); // 0.5 second
};
Refine.JsonParserUI.prototype._setRecordPath = function(path) {
this._config.recordPath = path;
this._updatePreview();
this._config.recordPath = path;
this._updatePreview();
};
Refine.JsonParserUI.prototype._updatePreview = function() {
var self = this;
var self = this;
this._progressContainer.show();
this._progressContainer.show();
var options = this.getOptions();
// for preview, we need exact text, so it's easier to show where the columns are split
options.guessCellValueTypes = false;
var options = this.getOptions();
// for preview, we need exact text, so it's easier to show where the columns are split
options.guessCellValueTypes = false;
this._controller.updateFormatAndOptions(options, function(result) {
if (result.status == "ok") {
self._controller.getPreviewData(function(projectData) {
self._progressContainer.hide();
this._controller.updateFormatAndOptions(options, function(result) {
if (result.status == "ok") {
self._controller.getPreviewData(function(projectData) {
self._progressContainer.hide();
new Refine.PreviewTable(projectData, self._dataContainer.unbind().empty());
}, 100);
}
});
new Refine.PreviewTable(projectData, self._dataContainer.unbind().empty());
}, 100);
}
});
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,24 +29,24 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
Refine.LineBasedParserUI = function(controller, jobID, job, format, config,
dataContainerElmt, progressContainerElmt, optionContainerElmt) {
dataContainerElmt, progressContainerElmt, optionContainerElmt) {
this._controller = controller;
this._jobID = jobID;
this._job = job;
this._format = format;
this._config = config;
this._controller = controller;
this._jobID = jobID;
this._job = job;
this._format = format;
this._config = config;
this._dataContainer = dataContainerElmt;
this._progressContainer = progressContainerElmt;
this._optionContainer = optionContainerElmt;
this._dataContainer = dataContainerElmt;
this._progressContainer = progressContainerElmt;
this._optionContainer = optionContainerElmt;
this._timerID = null;
this._initialize();
this._updatePreview();
this._timerID = null;
this._initialize();
this._updatePreview();
};
Refine.DefaultImportingController.parserUIs["LineBasedParserUI"] = Refine.LineBasedParserUI;
@ -55,132 +55,132 @@ Refine.LineBasedParserUI.prototype.confirmReadyToCreateProject = function() {
};
Refine.LineBasedParserUI.prototype.dispose = function() {
if (this._timerID != null) {
window.clearTimeout(this._timerID);
this._timerID = null;
}
if (this._timerID != null) {
window.clearTimeout(this._timerID);
this._timerID = null;
}
};
Refine.LineBasedParserUI.prototype.getOptions = function() {
var options = {
recordPath: this._config.recordPath
};
var options = {
recordPath: this._config.recordPath
};
var parseIntDefault = function(s, def) {
try {
var n = parseInt(s);
if (!isNaN(n)) {
return n;
}
} catch (e) {
// Ignore
}
return def;
};
options.linesPerRow = parseIntDefault(this._optionContainerElmts.linesPerRowInput[0].value, 1);
var parseIntDefault = function(s, def) {
try {
var n = parseInt(s);
if (!isNaN(n)) {
return n;
}
} catch (e) {
// Ignore
}
return def;
};
options.linesPerRow = parseIntDefault(this._optionContainerElmts.linesPerRowInput[0].value, 1);
switch (this._optionContainer.find("input[name='row-separator']:checked")[0].value) {
case 'new-line':
options.lineSeparator = "\n";
break;
default:
options.lineSeparator = Refine.FixedWidthParserUI.decodeSeparator(
this._optionContainerElmts.rowSeparatorInput[0].value);
}
switch (this._optionContainer.find("input[name='row-separator']:checked")[0].value) {
case 'new-line':
options.lineSeparator = "\n";
break;
default:
options.lineSeparator = Refine.FixedWidthParserUI.decodeSeparator(
this._optionContainerElmts.rowSeparatorInput[0].value);
}
if (this._optionContainerElmts.ignoreCheckbox[0].checked) {
options.ignoreLines = parseIntDefault(this._optionContainerElmts.ignoreInput[0].value, -1);
} else {
options.ignoreLines = -1;
}
if (this._optionContainerElmts.limitCheckbox[0].checked) {
options.limit = parseIntDefault(this._optionContainerElmts.limitInput[0].value, -1);
} else {
options.limit = -1;
}
if (this._optionContainerElmts.skipCheckbox[0].checked) {
options.skipDataLines = parseIntDefault(this._optionContainerElmts.skipInput[0].value, -1);
} else {
options.skipDataLines = -1;
}
options.storeBlankRows = this._optionContainerElmts.storeBlankRowsCheckbox[0].checked;
options.storeBlankCellsAsNulls = this._optionContainerElmts.storeBlankCellsAsNullsCheckbox[0].checked;
options.includeFileSources = this._optionContainerElmts.includeFileSourcesCheckbox[0].checked;
if (this._optionContainerElmts.ignoreCheckbox[0].checked) {
options.ignoreLines = parseIntDefault(this._optionContainerElmts.ignoreInput[0].value, -1);
} else {
options.ignoreLines = -1;
}
if (this._optionContainerElmts.limitCheckbox[0].checked) {
options.limit = parseIntDefault(this._optionContainerElmts.limitInput[0].value, -1);
} else {
options.limit = -1;
}
if (this._optionContainerElmts.skipCheckbox[0].checked) {
options.skipDataLines = parseIntDefault(this._optionContainerElmts.skipInput[0].value, -1);
} else {
options.skipDataLines = -1;
}
options.storeBlankRows = this._optionContainerElmts.storeBlankRowsCheckbox[0].checked;
options.storeBlankCellsAsNulls = this._optionContainerElmts.storeBlankCellsAsNullsCheckbox[0].checked;
options.includeFileSources = this._optionContainerElmts.includeFileSourcesCheckbox[0].checked;
return options;
return options;
};
Refine.LineBasedParserUI.prototype._initialize = function() {
var self = this;
var self = this;
this._optionContainer.unbind().empty().html(
DOM.loadHTML("core", "scripts/index/parser-interfaces/line-based-parser-ui.html"));
this._optionContainerElmts = DOM.bind(this._optionContainer);
this._optionContainerElmts.previewButton.click(function() { self._updatePreview(); });
this._optionContainer.unbind().empty().html(
DOM.loadHTML("core", "scripts/index/parser-interfaces/line-based-parser-ui.html"));
this._optionContainerElmts = DOM.bind(this._optionContainer);
this._optionContainerElmts.previewButton.click(function() { self._updatePreview(); });
this._optionContainerElmts.linesPerRowInput[0].value =
this._config.linesPerRow.toString();
this._optionContainerElmts.linesPerRowInput[0].value =
this._config.linesPerRow.toString();
var rowSeparatorValue = (this._config.lineSeparator == "\n") ? 'new-line' : 'custom';
this._optionContainer.find(
"input[name='row-separator'][value='" + rowSeparatorValue + "']").attr("checked", "checked");
this._optionContainerElmts.rowSeparatorInput[0].value =
Refine.SeparatorBasedParserUI.encodeSeparator(this._config.lineSeparator);
var rowSeparatorValue = (this._config.lineSeparator == "\n") ? 'new-line' : 'custom';
this._optionContainer.find(
"input[name='row-separator'][value='" + rowSeparatorValue + "']").attr("checked", "checked");
this._optionContainerElmts.rowSeparatorInput[0].value =
Refine.SeparatorBasedParserUI.encodeSeparator(this._config.lineSeparator);
if (this._config.ignoreLines > 0) {
this._optionContainerElmts.ignoreCheckbox.attr("checked", "checked");
this._optionContainerElmts.ignoreInput[0].value = this._config.ignoreLines.toString();
}
if (this._config.limit > 0) {
this._optionContainerElmts.limitCheckbox.attr("checked", "checked");
this._optionContainerElmts.limitInput[0].value = this._config.limit.toString();
}
if (this._config.skipDataLines > 0) {
this._optionContainerElmts.skipCheckbox.attr("checked", "checked");
this._optionContainerElmts.skipInput.value[0].value = this._config.skipDataLines.toString();
}
if (this._config.storeBlankRows) {
this._optionContainerElmts.storeBlankRowsCheckbox.attr("checked", "checked");
}
if (this._config.storeBlankCellsAsNulls) {
this._optionContainerElmts.storeBlankCellsAsNullsCheckbox.attr("checked", "checked");
}
if (this._config.includeFileSources) {
this._optionContainerElmts.includeFileSourcesCheckbox.attr("checked", "checked");
}
if (this._config.ignoreLines > 0) {
this._optionContainerElmts.ignoreCheckbox.attr("checked", "checked");
this._optionContainerElmts.ignoreInput[0].value = this._config.ignoreLines.toString();
}
if (this._config.limit > 0) {
this._optionContainerElmts.limitCheckbox.attr("checked", "checked");
this._optionContainerElmts.limitInput[0].value = this._config.limit.toString();
}
if (this._config.skipDataLines > 0) {
this._optionContainerElmts.skipCheckbox.attr("checked", "checked");
this._optionContainerElmts.skipInput.value[0].value = this._config.skipDataLines.toString();
}
if (this._config.storeBlankRows) {
this._optionContainerElmts.storeBlankRowsCheckbox.attr("checked", "checked");
}
if (this._config.storeBlankCellsAsNulls) {
this._optionContainerElmts.storeBlankCellsAsNullsCheckbox.attr("checked", "checked");
}
if (this._config.includeFileSources) {
this._optionContainerElmts.includeFileSourcesCheckbox.attr("checked", "checked");
}
var onChange = function() {
self._scheduleUpdatePreview();
};
this._optionContainer.find("input").bind("change", onChange);
this._optionContainer.find("select").bind("change", onChange);
var onChange = function() {
self._scheduleUpdatePreview();
};
this._optionContainer.find("input").bind("change", onChange);
this._optionContainer.find("select").bind("change", onChange);
};
Refine.LineBasedParserUI.prototype._scheduleUpdatePreview = function() {
if (this._timerID != null) {
window.clearTimeout(this._timerID);
this._timerID = null;
}
if (this._timerID != null) {
window.clearTimeout(this._timerID);
this._timerID = null;
}
var self = this;
this._timerID = window.setTimeout(function() {
self._timerID = null;
self._updatePreview();
}, 500); // 0.5 second
var self = this;
this._timerID = window.setTimeout(function() {
self._timerID = null;
self._updatePreview();
}, 500); // 0.5 second
};
Refine.LineBasedParserUI.prototype._updatePreview = function() {
var self = this;
var self = this;
this._progressContainer.show();
this._progressContainer.show();
this._controller.updateFormatAndOptions(this.getOptions(), function(result) {
if (result.status == "ok") {
self._controller.getPreviewData(function(projectData) {
self._progressContainer.hide();
this._controller.updateFormatAndOptions(this.getOptions(), function(result) {
if (result.status == "ok") {
self._controller.getPreviewData(function(projectData) {
self._progressContainer.hide();
new Refine.PreviewTable(projectData, self._dataContainer.unbind().empty());
});
}
});
new Refine.PreviewTable(projectData, self._dataContainer.unbind().empty());
});
}
});
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,87 +29,87 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
Refine.PreviewTable = function(projectData, elmt) {
this._projectData = projectData;
this._elmt = elmt;
this._render();
this._projectData = projectData;
this._elmt = elmt;
this._render();
};
Refine.PreviewTable.prototype._render = function() {
var self = this;
var table = $('<table>').addClass("data-table").appendTo(this._elmt)[0];
var self = this;
var table = $('<table>').addClass("data-table").appendTo(this._elmt)[0];
var columns = this._projectData.columnModel.columns;
var columns = this._projectData.columnModel.columns;
/*------------------------------------------------------------
* Column Headers
*------------------------------------------------------------
*/
/*------------------------------------------------------------
* Column Headers
*------------------------------------------------------------
*/
var trHead = table.insertRow(table.rows.length);
$(trHead.insertCell(0)).addClass("column-header").html('&nbsp;'); // index
var trHead = table.insertRow(table.rows.length);
$(trHead.insertCell(0)).addClass("column-header").html('&nbsp;'); // index
var createColumnHeader = function(column) {
$(trHead.insertCell(trHead.cells.length))
.addClass("column-header")
.text(column.name);
};
for (var i = 0; i < columns.length; i++) {
createColumnHeader(columns[i], i);
}
/*------------------------------------------------------------
* Data Cells
*------------------------------------------------------------
*/
var rows = this._projectData.rowModel.rows;
var renderRow = function(tr, r, row, even) {
$(tr).addClass(even ? "even" : "odd");
var cells = row.cells;
var tdIndex = tr.insertCell(tr.cells.length);
$('<div></div>').html((row.i + 1) + ".").appendTo(tdIndex);
var createColumnHeader = function(column) {
$(trHead.insertCell(trHead.cells.length))
.addClass("column-header")
.text(column.name);
};
for (var i = 0; i < columns.length; i++) {
createColumnHeader(columns[i], i);
}
var column = columns[i];
var td = tr.insertCell(tr.cells.length);
var divContent = $('<div/>').addClass("data-table-cell-content").appendTo(td);
/*------------------------------------------------------------
* Data Cells
*------------------------------------------------------------
*/
var rows = this._projectData.rowModel.rows;
var renderRow = function(tr, r, row, even) {
$(tr).addClass(even ? "even" : "odd");
var cells = row.cells;
var tdIndex = tr.insertCell(tr.cells.length);
$('<div></div>').html((row.i + 1) + ".").appendTo(tdIndex);
for (var i = 0; i < columns.length; i++) {
var column = columns[i];
var td = tr.insertCell(tr.cells.length);
var divContent = $('<div/>').addClass("data-table-cell-content").appendTo(td);
var cell = (column.cellIndex < cells.length) ? cells[column.cellIndex] : null;
if (!cell || ("v" in cell && cell.v === null)) {
$('<span>').html("&nbsp;").appendTo(divContent);
} else if ("e" in cell) {
$('<span>').addClass("data-table-error").text(cell.e).appendTo(divContent);
} else if (!("r" in cell) || !cell.r) {
if (typeof cell.v !== "string") {
if (typeof cell.v == "number") {
divContent.addClass("data-table-cell-content-numeric");
}
$('<span>')
.addClass("data-table-value-nonstring")
.text(cell.v)
.appendTo(divContent);
} else if (URL.looksLikeUrl(cell.v)) {
$('<a>')
.text(cell.v)
.attr("href", cell.v)
.attr("target", "_blank")
.appendTo(divContent);
} else {
$('<span>').text(cell.v).appendTo(divContent);
}
}
var cell = (column.cellIndex < cells.length) ? cells[column.cellIndex] : null;
if (!cell || ("v" in cell && cell.v === null)) {
$('<span>').html("&nbsp;").appendTo(divContent);
} else if ("e" in cell) {
$('<span>').addClass("data-table-error").text(cell.e).appendTo(divContent);
} else if (!("r" in cell) || !cell.r) {
if (typeof cell.v !== "string") {
if (typeof cell.v == "number") {
divContent.addClass("data-table-cell-content-numeric");
}
$('<span>')
.addClass("data-table-value-nonstring")
.text(cell.v)
.appendTo(divContent);
} else if (URL.looksLikeUrl(cell.v)) {
$('<a>')
.text(cell.v)
.attr("href", cell.v)
.attr("target", "_blank")
.appendTo(divContent);
} else {
$('<span>').text(cell.v).appendTo(divContent);
}
};
var even = true;
for (var r = 0; r < rows.length; r++) {
var row = rows[r];
var tr = table.insertRow(table.rows.length);
even = !even;
renderRow(tr, r, row, even);
}
}
};
var even = true;
for (var r = 0; r < rows.length; r++) {
var row = rows[r];
var tr = table.insertRow(table.rows.length);
even = !even;
renderRow(tr, r, row, even);
}
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,43 +29,43 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
Refine.SeparatorBasedParserUI = function(controller, jobID, job, format, config,
dataContainerElmt, progressContainerElmt, optionContainerElmt) {
this._controller = controller;
this._jobID = jobID;
this._job = job;
this._format = format;
this._config = config;
this._controller = controller;
this._jobID = jobID;
this._job = job;
this._format = format;
this._config = config;
this._dataContainer = dataContainerElmt;
this._progressContainer = progressContainerElmt;
this._optionContainer = optionContainerElmt;
this._dataContainer = dataContainerElmt;
this._progressContainer = progressContainerElmt;
this._optionContainer = optionContainerElmt;
this._timerID = null;
this._initialize();
this._updatePreview();
this._timerID = null;
this._initialize();
this._updatePreview();
};
Refine.DefaultImportingController.parserUIs["SeparatorBasedParserUI"] = Refine.SeparatorBasedParserUI;
Refine.SeparatorBasedParserUI.encodeSeparator = function(s) {
return s.replace("\\", "\\\\")
.replace("\n", "\\n")
.replace("\t", "\\t");
return s.replace("\\", "\\\\")
.replace("\n", "\\n")
.replace("\t", "\\t");
};
Refine.SeparatorBasedParserUI.decodeSeparator = function(s) {
return s.replace("\\n", "\n")
.replace("\\t", "\t")
.replace("\\\\", "\\");
return s.replace("\\n", "\n")
.replace("\\t", "\t")
.replace("\\\\", "\\");
};
Refine.SeparatorBasedParserUI.prototype.dispose = function() {
if (this._timerID != null) {
window.clearTimeout(this._timerID);
this._timerID = null;
}
if (this._timerID != null) {
window.clearTimeout(this._timerID);
this._timerID = null;
}
};
Refine.SeparatorBasedParserUI.prototype.confirmReadyToCreateProject = function() {
@ -73,157 +73,157 @@ Refine.SeparatorBasedParserUI.prototype.confirmReadyToCreateProject = function()
};
Refine.SeparatorBasedParserUI.prototype.getOptions = function() {
var options = {};
var options = {};
switch (this._optionContainer.find("input[name='row-separator']:checked")[0].value) {
case 'new-line':
options.lineSeparator = "\n";
break;
default:
options.lineSeparator = Refine.SeparatorBasedParserUI.decodeSeparator(
this._optionContainerElmts.rowSeparatorInput[0].value);
}
switch (this._optionContainer.find("input[name='column-separator']:checked")[0].value) {
case 'comma':
options.separator = ",";
break;
case 'tab':
options.separator = "\t";
break;
default:
options.separator = Refine.SeparatorBasedParserUI.decodeSeparator(
this._optionContainerElmts.columnSeparatorInput[0].value);
}
switch (this._optionContainer.find("input[name='row-separator']:checked")[0].value) {
case 'new-line':
options.lineSeparator = "\n";
break;
default:
options.lineSeparator = Refine.SeparatorBasedParserUI.decodeSeparator(
this._optionContainerElmts.rowSeparatorInput[0].value);
}
switch (this._optionContainer.find("input[name='column-separator']:checked")[0].value) {
case 'comma':
options.separator = ",";
break;
case 'tab':
options.separator = "\t";
break;
default:
options.separator = Refine.SeparatorBasedParserUI.decodeSeparator(
this._optionContainerElmts.columnSeparatorInput[0].value);
}
var parseIntDefault = function(s, def) {
try {
var n = parseInt(s);
if (!isNaN(n)) {
return n;
}
} catch (e) {
// Ignore
}
return def;
};
if (this._optionContainerElmts.ignoreCheckbox[0].checked) {
options.ignoreLines = parseIntDefault(this._optionContainerElmts.ignoreInput[0].value, -1);
} else {
options.ignoreLines = -1;
var parseIntDefault = function(s, def) {
try {
var n = parseInt(s);
if (!isNaN(n)) {
return n;
}
} catch (e) {
// Ignore
}
if (this._optionContainerElmts.headerLinesCheckbox[0].checked) {
options.headerLines = parseIntDefault(this._optionContainerElmts.headerLinesInput[0].value, 0);
} else {
options.headerLines = 0;
}
if (this._optionContainerElmts.skipCheckbox[0].checked) {
options.skipDataLines = parseIntDefault(this._optionContainerElmts.skipInput[0].value, 0);
} else {
options.skipDataLines = 0;
}
if (this._optionContainerElmts.limitCheckbox[0].checked) {
options.limit = parseIntDefault(this._optionContainerElmts.limitInput[0].value, -1);
} else {
options.limit = -1;
}
options.storeBlankRows = this._optionContainerElmts.storeBlankRowsCheckbox[0].checked;
return def;
};
if (this._optionContainerElmts.ignoreCheckbox[0].checked) {
options.ignoreLines = parseIntDefault(this._optionContainerElmts.ignoreInput[0].value, -1);
} else {
options.ignoreLines = -1;
}
if (this._optionContainerElmts.headerLinesCheckbox[0].checked) {
options.headerLines = parseIntDefault(this._optionContainerElmts.headerLinesInput[0].value, 0);
} else {
options.headerLines = 0;
}
if (this._optionContainerElmts.skipCheckbox[0].checked) {
options.skipDataLines = parseIntDefault(this._optionContainerElmts.skipInput[0].value, 0);
} else {
options.skipDataLines = 0;
}
if (this._optionContainerElmts.limitCheckbox[0].checked) {
options.limit = parseIntDefault(this._optionContainerElmts.limitInput[0].value, -1);
} else {
options.limit = -1;
}
options.storeBlankRows = this._optionContainerElmts.storeBlankRowsCheckbox[0].checked;
options.guessCellValueTypes = this._optionContainerElmts.guessCellValueTypesCheckbox[0].checked;
options.processQuotes = this._optionContainerElmts.processQuoteMarksCheckbox[0].checked;
options.guessCellValueTypes = this._optionContainerElmts.guessCellValueTypesCheckbox[0].checked;
options.processQuotes = this._optionContainerElmts.processQuoteMarksCheckbox[0].checked;
options.storeBlankCellsAsNulls = this._optionContainerElmts.storeBlankCellsAsNullsCheckbox[0].checked;
options.includeFileSources = this._optionContainerElmts.includeFileSourcesCheckbox[0].checked;
options.storeBlankCellsAsNulls = this._optionContainerElmts.storeBlankCellsAsNullsCheckbox[0].checked;
options.includeFileSources = this._optionContainerElmts.includeFileSourcesCheckbox[0].checked;
return options;
return options;
};
Refine.SeparatorBasedParserUI.prototype._initialize = function() {
var self = this;
var self = this;
this._optionContainer.unbind().empty().html(
DOM.loadHTML("core", "scripts/index/parser-interfaces/separator-based-parser-ui.html"));
this._optionContainerElmts = DOM.bind(this._optionContainer);
this._optionContainerElmts.previewButton.click(function() { self._updatePreview(); });
this._optionContainer.unbind().empty().html(
DOM.loadHTML("core", "scripts/index/parser-interfaces/separator-based-parser-ui.html"));
this._optionContainerElmts = DOM.bind(this._optionContainer);
this._optionContainerElmts.previewButton.click(function() { self._updatePreview(); });
var rowSeparatorValue = (this._config.lineSeparator == "\n") ? 'new-line' : 'custom';
this._optionContainer.find(
"input[name='row-separator'][value='" + rowSeparatorValue + "']").attr("checked", "checked");
this._optionContainerElmts.rowSeparatorInput[0].value =
Refine.SeparatorBasedParserUI.encodeSeparator(this._config.lineSeparator);
var rowSeparatorValue = (this._config.lineSeparator == "\n") ? 'new-line' : 'custom';
this._optionContainer.find(
"input[name='row-separator'][value='" + rowSeparatorValue + "']").attr("checked", "checked");
this._optionContainerElmts.rowSeparatorInput[0].value =
Refine.SeparatorBasedParserUI.encodeSeparator(this._config.lineSeparator);
var columnSeparatorValue = (this._config.separator == ",") ? 'comma' :
((this._config.separator == "\t") ? 'tab' : 'custom');
this._optionContainer.find(
"input[name='column-separator'][value='" + columnSeparatorValue + "']").attr("checked", "checked");
this._optionContainerElmts.columnSeparatorInput[0].value =
Refine.SeparatorBasedParserUI.encodeSeparator(this._config.separator);
var columnSeparatorValue = (this._config.separator == ",") ? 'comma' :
((this._config.separator == "\t") ? 'tab' : 'custom');
this._optionContainer.find(
"input[name='column-separator'][value='" + columnSeparatorValue + "']").attr("checked", "checked");
this._optionContainerElmts.columnSeparatorInput[0].value =
Refine.SeparatorBasedParserUI.encodeSeparator(this._config.separator);
if (this._config.ignoreLines > 0) {
this._optionContainerElmts.ignoreCheckbox.attr("checked", "checked");
this._optionContainerElmts.ignoreInput[0].value = this._config.ignoreLines.toString();
}
if (this._config.headerLines > 0) {
this._optionContainerElmts.headerLinesCheckbox.attr("checked", "checked");
this._optionContainerElmts.headerLinesInput[0].value = this._config.headerLines.toString();
}
if (this._config.limit > 0) {
this._optionContainerElmts.limitCheckbox.attr("checked", "checked");
this._optionContainerElmts.limitInput[0].value = this._config.limit.toString();
}
if (this._config.skipDataLines > 0) {
this._optionContainerElmts.skipCheckbox.attr("checked", "checked");
this._optionContainerElmts.skipInput.value[0].value = this._config.skipDataLines.toString();
}
if (this._config.storeBlankRows) {
this._optionContainerElmts.storeBlankRowsCheckbox.attr("checked", "checked");
}
if (this._config.ignoreLines > 0) {
this._optionContainerElmts.ignoreCheckbox.attr("checked", "checked");
this._optionContainerElmts.ignoreInput[0].value = this._config.ignoreLines.toString();
}
if (this._config.headerLines > 0) {
this._optionContainerElmts.headerLinesCheckbox.attr("checked", "checked");
this._optionContainerElmts.headerLinesInput[0].value = this._config.headerLines.toString();
}
if (this._config.limit > 0) {
this._optionContainerElmts.limitCheckbox.attr("checked", "checked");
this._optionContainerElmts.limitInput[0].value = this._config.limit.toString();
}
if (this._config.skipDataLines > 0) {
this._optionContainerElmts.skipCheckbox.attr("checked", "checked");
this._optionContainerElmts.skipInput.value[0].value = this._config.skipDataLines.toString();
}
if (this._config.storeBlankRows) {
this._optionContainerElmts.storeBlankRowsCheckbox.attr("checked", "checked");
}
if (this._config.guessCellValueTypes) {
this._optionContainerElmts.guessCellValueTypesCheckbox.attr("checked", "checked");
}
if (this._config.processQuotes) {
this._optionContainerElmts.processQuoteMarksCheckbox.attr("checked", "checked");
}
if (this._config.guessCellValueTypes) {
this._optionContainerElmts.guessCellValueTypesCheckbox.attr("checked", "checked");
}
if (this._config.processQuotes) {
this._optionContainerElmts.processQuoteMarksCheckbox.attr("checked", "checked");
}
if (this._config.storeBlankCellsAsNulls) {
this._optionContainerElmts.storeBlankCellsAsNullsCheckbox.attr("checked", "checked");
}
if (this._config.includeFileSources) {
this._optionContainerElmts.includeFileSourcesCheckbox.attr("checked", "checked");
}
if (this._config.storeBlankCellsAsNulls) {
this._optionContainerElmts.storeBlankCellsAsNullsCheckbox.attr("checked", "checked");
}
if (this._config.includeFileSources) {
this._optionContainerElmts.includeFileSourcesCheckbox.attr("checked", "checked");
}
var onChange = function() {
self._scheduleUpdatePreview();
};
this._optionContainer.find("input").bind("change", onChange);
this._optionContainer.find("select").bind("change", onChange);
var onChange = function() {
self._scheduleUpdatePreview();
};
this._optionContainer.find("input").bind("change", onChange);
this._optionContainer.find("select").bind("change", onChange);
};
Refine.SeparatorBasedParserUI.prototype._scheduleUpdatePreview = function() {
if (this._timerID != null) {
window.clearTimeout(this._timerID);
this._timerID = null;
}
if (this._timerID != null) {
window.clearTimeout(this._timerID);
this._timerID = null;
}
var self = this;
this._timerID = window.setTimeout(function() {
self._timerID = null;
self._updatePreview();
}, 500); // 0.5 second
var self = this;
this._timerID = window.setTimeout(function() {
self._timerID = null;
self._updatePreview();
}, 500); // 0.5 second
};
Refine.SeparatorBasedParserUI.prototype._updatePreview = function() {
var self = this;
var self = this;
this._progressContainer.show();
this._progressContainer.show();
this._controller.updateFormatAndOptions(this.getOptions(), function(result) {
if (result.status == "ok") {
self._controller.getPreviewData(function(projectData) {
self._progressContainer.hide();
this._controller.updateFormatAndOptions(this.getOptions(), function(result) {
if (result.status == "ok") {
self._controller.getPreviewData(function(projectData) {
self._progressContainer.hide();
new Refine.PreviewTable(projectData, self._dataContainer.unbind().empty());
});
}
});
new Refine.PreviewTable(projectData, self._dataContainer.unbind().empty());
});
}
});
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,208 +29,208 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
Refine.XmlParserUI = function(controller, jobID, job, format, config,
dataContainerElmt, progressContainerElmt, optionContainerElmt) {
this._controller = controller;
this._jobID = jobID;
this._job = job;
this._format = format;
this._config = config;
this._controller = controller;
this._jobID = jobID;
this._job = job;
this._format = format;
this._config = config;
this._dataContainer = dataContainerElmt;
this._progressContainer = progressContainerElmt;
this._optionContainer = optionContainerElmt;
this._dataContainer = dataContainerElmt;
this._progressContainer = progressContainerElmt;
this._optionContainer = optionContainerElmt;
this._timerID = null;
this._initialize();
this._showPickRecordElementsUI();
this._timerID = null;
this._initialize();
this._showPickRecordElementsUI();
};
Refine.DefaultImportingController.parserUIs["XmlParserUI"] = Refine.XmlParserUI;
Refine.XmlParserUI.prototype.dispose = function() {
if (this._timerID != null) {
window.clearTimeout(this._timerID);
this._timerID = null;
}
if (this._timerID != null) {
window.clearTimeout(this._timerID);
this._timerID = null;
}
};
Refine.XmlParserUI.prototype.confirmReadyToCreateProject = function() {
if ((this._config.recordPath) && this._config.recordPath.length > 0) {
return true;
return true;
} else {
window.alert('Please specify a record path first.');
window.alert('Please specify a record path first.');
}
};
Refine.XmlParserUI.prototype.getOptions = function() {
var options = {
recordPath: this._config.recordPath
};
var options = {
recordPath: this._config.recordPath
};
if (this._optionContainerElmts.limitCheckbox[0].checked) {
options.limit = parseIntDefault(this._optionContainerElmts.limitInput[0].value, -1);
} else {
options.limit = -1;
}
options.includeFileSources = this._optionContainerElmts.includeFileSourcesCheckbox[0].checked;
if (this._optionContainerElmts.limitCheckbox[0].checked) {
options.limit = parseIntDefault(this._optionContainerElmts.limitInput[0].value, -1);
} else {
options.limit = -1;
}
options.includeFileSources = this._optionContainerElmts.includeFileSourcesCheckbox[0].checked;
return options;
return options;
};
Refine.XmlParserUI.prototype._initialize = function() {
var self = this;
var self = this;
this._optionContainer.unbind().empty().html(
DOM.loadHTML("core", "scripts/index/parser-interfaces/xml-parser-ui.html"));
this._optionContainerElmts = DOM.bind(this._optionContainer);
this._optionContainerElmts.previewButton.click(function() { self._updatePreview(); });
this._optionContainer.unbind().empty().html(
DOM.loadHTML("core", "scripts/index/parser-interfaces/xml-parser-ui.html"));
this._optionContainerElmts = DOM.bind(this._optionContainer);
this._optionContainerElmts.previewButton.click(function() { self._updatePreview(); });
if (this._config.limit > 0) {
this._optionContainerElmts.limitCheckbox.attr("checked", "checked");
this._optionContainerElmts.limitInput[0].value = this._config.limit.toString();
}
if (this._config.includeFileSources) {
this._optionContainerElmts.includeFileSourcesCheckbox.attr("checked", "checked");
}
this._optionContainerElmts.pickRecordElementsButton.click(function() {
self._showPickRecordElementsUI();
});
if (this._config.limit > 0) {
this._optionContainerElmts.limitCheckbox.attr("checked", "checked");
this._optionContainerElmts.limitInput[0].value = this._config.limit.toString();
}
if (this._config.includeFileSources) {
this._optionContainerElmts.includeFileSourcesCheckbox.attr("checked", "checked");
}
this._optionContainerElmts.pickRecordElementsButton.click(function() {
self._showPickRecordElementsUI();
});
var onChange = function() {
self._scheduleUpdatePreview();
};
this._optionContainer.find("input").bind("change", onChange);
this._optionContainer.find("select").bind("change", onChange);
var onChange = function() {
self._scheduleUpdatePreview();
};
this._optionContainer.find("input").bind("change", onChange);
this._optionContainer.find("select").bind("change", onChange);
};
Refine.XmlParserUI.prototype._showPickRecordElementsUI = function() {
var self = this;
var self = this;
this._dataContainer.unbind().empty().html(
DOM.loadHTML("core", "scripts/index/parser-interfaces/xml-parser-select-ui.html"));
this._dataContainer.unbind().empty().html(
DOM.loadHTML("core", "scripts/index/parser-interfaces/xml-parser-select-ui.html"));
var elmts = DOM.bind(this._dataContainer);
var elmts = DOM.bind(this._dataContainer);
var escapeElmt = $('<span>');
var escapeHtml = function(s) {
escapeElmt.empty().text(s);
return escapeElmt.html();
};
var textAsHtml = function(s) {
s = s.length <= 200 ? s : (s.substring(0, 200) + ' ...');
return '<span class="text">' + escapeHtml(s) + '</span>';
};
var renderNode = function(node, container, parentPath) {
if (node.t) {
$('<div>').html(textAsHtml(node.t)).appendTo(container);
var escapeElmt = $('<span>');
var escapeHtml = function(s) {
escapeElmt.empty().text(s);
return escapeElmt.html();
};
var textAsHtml = function(s) {
s = s.length <= 200 ? s : (s.substring(0, 200) + ' ...');
return '<span class="text">' + escapeHtml(s) + '</span>';
};
var renderNode = function(node, container, parentPath) {
if (node.t) {
$('<div>').html(textAsHtml(node.t)).appendTo(container);
} else {
var qname = node.n;
if (node.p) {
qname = node.p + ':' + qname;
}
var t = qname;
if (node.a) {
t += ' ' + $.map(node.a, function(attr) {
return attr.n + '="' + attr.v + '"';
}).join(' ');
}
if (node.ns) {
t += ' ' + $.map(node.ns, function(ns) {
return 'xmlns' + ((ns.p) ? (':' + ns.p) : '') + '="' + ns.uri + '"';
}).join(' ');
}
var path = [].concat(parentPath);
path.push(qname);
var div = $('<div>').addClass('elmt').appendTo(container);
var hasSelectableChildren = false;
var hotspot;
if (node.c) {
if (node.c.length == 1 && (node.c[0].t)) {
$('<span>').html('&lt;' + t + '&gt;' + textAsHtml(node.c[0].t) + '&lt;/' + qname + '&gt;').appendTo(div);
} else {
var qname = node.n;
if (node.p) {
qname = node.p + ':' + qname;
}
$('<div>').text('<' + t + '>').appendTo(div);
var t = qname;
if (node.a) {
t += ' ' + $.map(node.a, function(attr) {
return attr.n + '="' + attr.v + '"';
}).join(' ');
}
if (node.ns) {
t += ' ' + $.map(node.ns, function(ns) {
return 'xmlns' + ((ns.p) ? (':' + ns.p) : '') + '="' + ns.uri + '"';
}).join(' ');
}
var divChildren = $('<div>').addClass('children').appendTo(div);
$.each(node.c, function() {
renderNode(this, divChildren, path);
});
var path = [].concat(parentPath);
path.push(qname);
var div = $('<div>').addClass('elmt').appendTo(container);
var hasSelectableChildren = false;
var hotspot;
if (node.c) {
if (node.c.length == 1 && (node.c[0].t)) {
$('<span>').html('&lt;' + t + '&gt;' + textAsHtml(node.c[0].t) + '&lt;/' + qname + '&gt;').appendTo(div);
} else {
$('<div>').text('<' + t + '>').appendTo(div);
var divChildren = $('<div>').addClass('children').appendTo(div);
$.each(node.c, function() {
renderNode(this, divChildren, path);
});
$('<div>').text('</' + qname + '>').appendTo(div);
hasSelectableChildren = true;
}
} else {
$('<span>').text('<' + t + ' />').appendTo(div);
}
var hittest = function(evt) {
if (hasSelectableChildren) {
if (evt.target !== div[0] &&
(evt.target.className == 'elmt' || evt.target.parentNode !== div[0])) {
return false;
}
}
return true;
};
div.attr('title', '/' + path.join('/'))
.bind('mouseover', function(evt) {
if (hittest(evt)) {
elmts.domContainer.find('.highlight').removeClass('highlight');
div.addClass('highlight');
}
})
.bind('mouseout', function(evt) {
div.removeClass('highlight');
})
.click(function(evt) {
if (hittest(evt)) {
self._setRecordPath(path);
}
});
$('<div>').text('</' + qname + '>').appendTo(div);
hasSelectableChildren = true;
}
};
renderNode(this._config.dom, elmts.domContainer, []);
} else {
$('<span>').text('<' + t + ' />').appendTo(div);
}
var hittest = function(evt) {
if (hasSelectableChildren) {
if (evt.target !== div[0] &&
(evt.target.className == 'elmt' || evt.target.parentNode !== div[0])) {
return false;
}
}
return true;
};
div.attr('title', '/' + path.join('/'))
.bind('mouseover', function(evt) {
if (hittest(evt)) {
elmts.domContainer.find('.highlight').removeClass('highlight');
div.addClass('highlight');
}
})
.bind('mouseout', function(evt) {
div.removeClass('highlight');
})
.click(function(evt) {
if (hittest(evt)) {
self._setRecordPath(path);
}
});
}
};
renderNode(this._config.dom, elmts.domContainer, []);
};
Refine.XmlParserUI.prototype._scheduleUpdatePreview = function() {
if (this._timerID != null) {
window.clearTimeout(this._timerID);
this._timerID = null;
}
if (this._timerID != null) {
window.clearTimeout(this._timerID);
this._timerID = null;
}
var self = this;
this._timerID = window.setTimeout(function() {
self._timerID = null;
self._updatePreview();
}, 500); // 0.5 second
var self = this;
this._timerID = window.setTimeout(function() {
self._timerID = null;
self._updatePreview();
}, 500); // 0.5 second
};
Refine.XmlParserUI.prototype._setRecordPath = function(path) {
this._config.recordPath = path;
this._updatePreview();
this._config.recordPath = path;
this._updatePreview();
};
Refine.XmlParserUI.prototype._updatePreview = function() {
var self = this;
var self = this;
this._progressContainer.show();
this._progressContainer.show();
var options = this.getOptions();
// for preview, we need exact text, so it's easier to show where the columns are split
options.guessCellValueTypes = false;
var options = this.getOptions();
// for preview, we need exact text, so it's easier to show where the columns are split
options.guessCellValueTypes = false;
this._controller.updateFormatAndOptions(options, function(result) {
if (result.status == "ok") {
self._controller.getPreviewData(function(projectData) {
self._progressContainer.hide();
this._controller.updateFormatAndOptions(options, function(result) {
if (result.status == "ok") {
self._controller.getPreviewData(function(projectData) {
self._progressContainer.hide();
new Refine.PreviewTable(projectData, self._dataContainer.unbind().empty());
}, 20);
}
});
new Refine.PreviewTable(projectData, self._dataContainer.unbind().empty());
}, 20);
}
});
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,116 +29,121 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
var preferenceUIs = [];
function onLoad() {
$.post(
"/command/core/get-all-preferences",
null,
populatePreferences,
"json"
);
$.post(
"/command/core/get-all-preferences",
null,
populatePreferences,
"json"
);
}
$(onLoad);
function populatePreferences(prefs) {
var body = $("#body-info").empty();
var body = $("#body-info").empty();
$('<h1>').text("Preferences").appendTo(body);
$('<h1>').text("Preferences").appendTo(body);
var table = $('<table>').addClass("list-table").addClass("preferences").html('<tr><th>Key</th><th>Value</th><th></th></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 table = $('<table>')
.addClass("list-table")
.addClass("preferences")
.html('<tr><th>Key</th><th>Value</th><th></th></tr>')
.appendTo(body)[0];
var trLast = table.insertRow(table.rows.length);
var tdLast0 = trLast.insertCell(0);
trLast.insertCell(1);
trLast.insertCell(2);
$('<button class="button">').text("Add Preference").appendTo(tdLast0).click(function() {
var key = window.prompt("Preference key:");
if (key) {
var value = window.prompt("Preference key value:");
if (value != null) {
var tr = table.insertRow(table.rows.length - 1);
preferenceUIs.push(new PreferenceUI(tr, key, value));
for (var k in prefs) {
var tr = table.insertRow(table.rows.length);
preferenceUIs.push(new PreferenceUI(tr, k, prefs[k]));
}
$.post(
"/command/core/set-preference",
{
name : key,
value : JSON.stringify(value)
},
function(o) {
if (o.code == "error") {
alert(o.message);
}
},
"json"
);
var trLast = table.insertRow(table.rows.length);
var tdLast0 = trLast.insertCell(0);
trLast.insertCell(1);
trLast.insertCell(2);
$('<button class="button">').text("Add Preference").appendTo(tdLast0).click(function() {
var key = window.prompt("Preference key:");
if (key) {
var value = window.prompt("Preference key value:");
if (value != null) {
var tr = table.insertRow(table.rows.length - 1);
preferenceUIs.push(new PreferenceUI(tr, key, value));
$.post(
"/command/core/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 self = this;
var td0 = tr.insertCell(0);
$(td0).text(key);
var td0 = tr.insertCell(0);
$(td0).text(key);
var td1 = tr.insertCell(1);
$(td1).text(value != null ? value : "");
var td1 = tr.insertCell(1);
$(td1).text(value != null ? value : "");
var td2 = tr.insertCell(2);
var td2 = tr.insertCell(2);
$('<button class="button">').text("Edit").appendTo(td2).click(function() {
var newValue = window.prompt("Change value of preference key " + key, value);
if (newValue != null) {
$(td1).text(newValue);
$.post(
"/command/core/set-preference",
{
name : key,
value : JSON.stringify(newValue)
},
function(o) {
if (o.code == "error") {
alert(o.message);
}
},
"json"
);
}
});
$('<button class="button">').text("Edit").appendTo(td2).click(function() {
var newValue = window.prompt("Change value of preference key " + key, value);
if (newValue != null) {
$(td1).text(newValue);
$.post(
"/command/core/set-preference",
{
name : key,
value : JSON.stringify(newValue)
},
function(o) {
if (o.code == "error") {
alert(o.message);
}
},
"json"
);
}
});
$('<button class="button">').text("Delete").appendTo(td2).click(function() {
if (window.confirm("Delete preference key " + key + "?")) {
$.post(
"/command/core/set-preference",
{
name : key
},
function(o) {
if (o.code == "ok") {
$(tr).remove();
$('<button class="button">').text("Delete").appendTo(td2).click(function() {
if (window.confirm("Delete preference key " + key + "?")) {
$.post(
"/command/core/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"
);
}
});
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

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,173 +29,173 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
var theProject;
var ui = {};
var Refine = {
refineHelperService: "http://1.refine-helper.stefanomazzocchi.user.dev.freebaseapps.com"
refineHelperService: "http://1.refine-helper.stefanomazzocchi.user.dev.freebaseapps.com"
};
Refine.reportException = function(e) {
if (window.console) {
console.log(e);
}
if (window.console) {
console.log(e);
}
};
function resize() {
var header = $("#header");
var header = $("#header");
var leftPanelWidth = 300;
var width = $(window).width();
var top = $("#header").outerHeight();
var height = $(window).height() - top;
var leftPanelWidth = 300;
var width = $(window).width();
var top = $("#header").outerHeight();
var height = $(window).height() - top;
var leftPanelPaddings = ui.leftPanelDiv.outerHeight(true) - ui.leftPanelDiv.height();
ui.leftPanelDiv
.css("top", top + "px")
.css("left", "0px")
.css("height", (height - leftPanelPaddings) + "px")
.css("width", leftPanelWidth + "px");
var leftPanelPaddings = ui.leftPanelDiv.outerHeight(true) - ui.leftPanelDiv.height();
ui.leftPanelDiv
.css("top", top + "px")
.css("left", "0px")
.css("height", (height - leftPanelPaddings) + "px")
.css("width", leftPanelWidth + "px");
var leftPanelTabsPaddings = ui.leftPanelTabs.outerHeight(true) - ui.leftPanelTabs.height();
ui.leftPanelTabs.height(ui.leftPanelDiv.height() - leftPanelTabsPaddings);
var leftPanelTabsPaddings = ui.leftPanelTabs.outerHeight(true) - ui.leftPanelTabs.height();
ui.leftPanelTabs.height(ui.leftPanelDiv.height() - leftPanelTabsPaddings);
var rightPanelVPaddings = ui.rightPanelDiv.outerHeight(true) - ui.rightPanelDiv.height();
var rightPanelHPaddings = ui.rightPanelDiv.outerWidth(true) - ui.rightPanelDiv.width();
ui.rightPanelDiv
.css("top", top + "px")
.css("left", leftPanelWidth + "px")
.css("height", (height - rightPanelVPaddings) + "px")
.css("width", (width - leftPanelWidth - rightPanelHPaddings) + "px");
var rightPanelVPaddings = ui.rightPanelDiv.outerHeight(true) - ui.rightPanelDiv.height();
var rightPanelHPaddings = ui.rightPanelDiv.outerWidth(true) - ui.rightPanelDiv.width();
ui.rightPanelDiv
.css("top", top + "px")
.css("left", leftPanelWidth + "px")
.css("height", (height - rightPanelVPaddings) + "px")
.css("width", (width - leftPanelWidth - rightPanelHPaddings) + "px");
ui.viewPanelDiv.height((height - ui.toolPanelDiv.outerHeight() - rightPanelVPaddings) + "px");
ui.viewPanelDiv.height((height - ui.toolPanelDiv.outerHeight() - rightPanelVPaddings) + "px");
var processPanelWidth = 400;
ui.processPanelDiv
.css("width", processPanelWidth + "px")
.css("left", Math.floor((width - processPanelWidth) / 2) + "px");
var processPanelWidth = 400;
ui.processPanelDiv
.css("width", processPanelWidth + "px")
.css("left", Math.floor((width - processPanelWidth) / 2) + "px");
}
function resizeTabs() {
var totalHeight = ui.leftPanelDiv.height();
var headerHeight = ui.leftPanelTabs.find(".ui-tabs-nav").outerHeight(true);
var totalHeight = ui.leftPanelDiv.height();
var headerHeight = ui.leftPanelTabs.find(".ui-tabs-nav").outerHeight(true);
var visibleTabPanels = ui.leftPanelTabs.find(".ui-tabs-panel:not(.ui-tabs-hide)");
var paddings = visibleTabPanels.outerHeight(true) - visibleTabPanels.height();
var visibleTabPanels = ui.leftPanelTabs.find(".ui-tabs-panel:not(.ui-tabs-hide)");
var paddings = visibleTabPanels.outerHeight(true) - visibleTabPanels.height();
var allTabPanels = ui.leftPanelTabs.find(".ui-tabs-panel");
allTabPanels.height(totalHeight - headerHeight - paddings - 1);
var allTabPanels = ui.leftPanelTabs.find(".ui-tabs-panel");
allTabPanels.height(totalHeight - headerHeight - paddings - 1);
}
function resizeAll() {
resize();
resizeTabs();
ui.extensionBar.resize();
ui.browsingEngine.resize();
ui.processPanel.resize();
ui.historyPanel.resize();
ui.dataTableView.resize();
resize();
resizeTabs();
ui.extensionBar.resize();
ui.browsingEngine.resize();
ui.processPanel.resize();
ui.historyPanel.resize();
ui.dataTableView.resize();
}
function initializeUI(uiState) {
$("#loading-message").hide();
$("#notification-container").hide();
$("#project-title").show();
$("#project-controls").show();
$("#body").show();
$("#loading-message").hide();
$("#notification-container").hide();
$("#project-title").show();
$("#project-controls").show();
$("#body").show();
$('#project-name-button').click(Refine._renameProject);
$('#project-permalink-button').mouseenter(function() {
this.href = Refine.getPermanentLink();
});
$('#project-name-button').click(Refine._renameProject);
$('#project-permalink-button').mouseenter(function() {
this.href = Refine.getPermanentLink();
});
Refine.setTitle();
Refine.setTitle();
ui = DOM.bind($("#body"));
ui = DOM.bind($("#body"));
ui.extensionBar = new ExtensionBar(ui.extensionBarDiv); // construct the menu first so we can resize everything else
ui.exporterManager = new ExporterManager($("#export-button"));
ui.extensionBar = new ExtensionBar(ui.extensionBarDiv); // construct the menu first so we can resize everything else
ui.exporterManager = new ExporterManager($("#export-button"));
ui.leftPanelTabs.tabs({ selected: 0 });
resize();
resizeTabs();
ui.leftPanelTabs.tabs({ selected: 0 });
resize();
resizeTabs();
ui.summaryBar = new SummaryBar(ui.summaryBarDiv);
ui.browsingEngine = new BrowsingEngine(ui.facetPanelDiv, uiState.facets || []);
ui.processPanel = new ProcessPanel(ui.processPanelDiv);
ui.historyPanel = new HistoryPanel(ui.historyPanelDiv, ui.historyTabHeader);
ui.dataTableView = new DataTableView(ui.viewPanelDiv);
ui.summaryBar = new SummaryBar(ui.summaryBarDiv);
ui.browsingEngine = new BrowsingEngine(ui.facetPanelDiv, uiState.facets || []);
ui.processPanel = new ProcessPanel(ui.processPanelDiv);
ui.historyPanel = new HistoryPanel(ui.historyPanelDiv, ui.historyTabHeader);
ui.dataTableView = new DataTableView(ui.viewPanelDiv);
ui.leftPanelTabs.bind('tabsshow', function(event, tabs) {
if (tabs.index === 0) {
ui.browsingEngine.resize();
} else if (tabs.index === 1) {
ui.historyPanel.resize();
}
});
$(window).bind("resize", resizeAll);
if (uiState.facets) {
Refine.update({ engineChanged: true });
ui.leftPanelTabs.bind('tabsshow', function(event, tabs) {
if (tabs.index === 0) {
ui.browsingEngine.resize();
} else if (tabs.index === 1) {
ui.historyPanel.resize();
}
});
$(window).bind("resize", resizeAll);
if (uiState.facets) {
Refine.update({ engineChanged: true });
}
}
Refine.setTitle = function(status) {
var title = theProject.metadata.name + " - Google Refine";
if (status) {
title = status + " - " + title;
}
document.title = title;
var title = theProject.metadata.name + " - Google Refine";
if (status) {
title = status + " - " + title;
}
document.title = title;
$("#project-name-button").text(theProject.metadata.name);
$("#project-name-button").text(theProject.metadata.name);
};
Refine.reinitializeProjectData = function(f) {
Ajax.chainGetJSON(
"/command/core/get-project-metadata?" + $.param({ project: theProject.id }), null,
function(data) {
theProject.metadata = data;
},
"/command/core/get-models?" + $.param({ project: theProject.id }), null,
function(data) {
for (var n in data) {
if (data.hasOwnProperty(n)) {
theProject[n] = data[n];
}
}
},
f
);
Ajax.chainGetJSON(
"/command/core/get-project-metadata?" + $.param({ project: theProject.id }), null,
function(data) {
theProject.metadata = data;
},
"/command/core/get-models?" + $.param({ project: theProject.id }), null,
function(data) {
for (var n in data) {
if (data.hasOwnProperty(n)) {
theProject[n] = data[n];
}
}
},
f
);
};
Refine._renameProject = function() {
var name = window.prompt("New project name:", theProject.metadata.name);
if (name == null) {
return;
}
var name = window.prompt("New project name:", theProject.metadata.name);
if (name == null) {
return;
}
name = $.trim(name);
if (theProject.metadata.name == name || name.length == 0) {
return;
}
name = $.trim(name);
if (theProject.metadata.name == name || name.length == 0) {
return;
}
$.ajax({
type: "POST",
url: "/command/core/rename-project",
data: { "project" : theProject.id, "name" : name },
dataType: "json",
success: function (data) {
if (data && typeof data.code != 'undefined' && data.code == "ok") {
theProject.metadata.name = name;
Refine.setTitle();
} else {
alert("Failed to rename project: " + data.message);
}
}
});
$.ajax({
type: "POST",
url: "/command/core/rename-project",
data: { "project" : theProject.id, "name" : name },
dataType: "json",
success: function (data) {
if (data && typeof data.code != 'undefined' && data.code == "ok") {
theProject.metadata.name = name;
Refine.setTitle();
} else {
alert("Failed to rename project: " + data.message);
}
}
});
};
/*
@ -203,150 +203,150 @@ Refine._renameProject = function() {
*/
Refine.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.historyPanel.update(onDone);
var functions = [];
var pushFunction = function(f) {
var index = functions.length;
functions.push(function() {
f(functions[index + 1]);
});
if (options.everythingChanged || options.modelsChanged || options.columnStatsChanged) {
pushFunction(Refine.reinitializeProjectData);
}
if (options.everythingChanged || options.modelsChanged || options.rowsChanged || options.rowMetadataChanged || options.cellsChanged || options.engineChanged) {
pushFunction(function(onDone) {
ui.dataTableView.update(onDone);
});
pushFunction(function(onDone) {
ui.browsingEngine.update(onDone);
});
}
};
functions.push(onFinallyDone || function() {});
pushFunction(function(onDone) {
ui.historyPanel.update(onDone);
});
if (options.everythingChanged || options.modelsChanged || options.columnStatsChanged) {
pushFunction(Refine.reinitializeProjectData);
}
if (options.everythingChanged || options.modelsChanged || options.rowsChanged || options.rowMetadataChanged || options.cellsChanged || options.engineChanged) {
pushFunction(function(onDone) {
ui.dataTableView.update(onDone);
});
pushFunction(function(onDone) {
ui.browsingEngine.update(onDone);
});
}
return functions[0];
functions.push(onFinallyDone || function() {});
return functions[0];
};
Refine.update = function(options, onFinallyDone) {
var done = false;
var dismissBusy = null;
var done = false;
var dismissBusy = null;
Refine.setAjaxInProgress();
Refine.setAjaxInProgress();
Refine.createUpdateFunction(options, function() {
Refine.clearAjaxInProgress();
Refine.createUpdateFunction(options, function() {
Refine.clearAjaxInProgress();
done = true;
if (dismissBusy) {
dismissBusy();
}
if (onFinallyDone) {
onFinallyDone();
}
})();
done = true;
if (dismissBusy) {
dismissBusy();
}
if (onFinallyDone) {
onFinallyDone();
}
})();
window.setTimeout(function() {
if (!done) {
dismissBusy = DialogSystem.showBusy();
}
}, 500);
window.setTimeout(function() {
if (!done) {
dismissBusy = DialogSystem.showBusy();
}
}, 500);
};
Refine.postCoreProcess = function(command, params, body, updateOptions, callbacks) {
Refine.postProcess("core", command, params, body, updateOptions, callbacks);
Refine.postProcess("core", command, params, body, updateOptions, callbacks);
};
Refine.postProcess = function(moduleName, command, params, body, updateOptions, callbacks) {
updateOptions = updateOptions || {};
callbacks = callbacks || {};
updateOptions = updateOptions || {};
callbacks = callbacks || {};
params = params || {};
params.project = theProject.id;
params = params || {};
params.project = theProject.id;
body = body || {};
if (!("includeEngine" in updateOptions) || updateOptions.includeEngine) {
body.engine = JSON.stringify(
"engineConfig" in updateOptions ?
updateOptions.engineConfig :
ui.browsingEngine.getJSON()
);
}
var done = false;
var dismissBusy = null;
function onDone(o) {
done = true;
if (dismissBusy) {
dismissBusy();
}
Refine.clearAjaxInProgress();
if (o.code == "error") {
if ("onError" in callbacks) {
try {
callbacks.onError(o);
} catch (e) {
Refine.reportException(e);
}
} else {
alert(o.message);
}
} else {
if ("onDone" in callbacks) {
try {
callbacks.onDone(o);
} catch (e) {
Refine.reportException(e);
}
}
if (o.code == "ok") {
Refine.update(updateOptions, callbacks.onFinallyDone);
if ("historyEntry" in o) {
ui.processPanel.showUndo(o.historyEntry);
}
} else if (o.code == "pending") {
if ("onPending" in callbacks) {
try {
callbacks.onPending(o);
} catch (e) {
Refine.reportException(e);
}
}
ui.processPanel.update(updateOptions, callbacks.onFinallyDone);
}
}
}
Refine.setAjaxInProgress();
$.post(
"/command/" + moduleName + "/" + command + "?" + $.param(params),
body,
onDone,
"json"
body = body || {};
if (!("includeEngine" in updateOptions) || updateOptions.includeEngine) {
body.engine = JSON.stringify(
"engineConfig" in updateOptions ?
updateOptions.engineConfig :
ui.browsingEngine.getJSON()
);
}
window.setTimeout(function() {
if (!done) {
dismissBusy = DialogSystem.showBusy();
var done = false;
var dismissBusy = null;
function onDone(o) {
done = true;
if (dismissBusy) {
dismissBusy();
}
Refine.clearAjaxInProgress();
if (o.code == "error") {
if ("onError" in callbacks) {
try {
callbacks.onError(o);
} catch (e) {
Refine.reportException(e);
}
}, 500);
} else {
alert(o.message);
}
} else {
if ("onDone" in callbacks) {
try {
callbacks.onDone(o);
} catch (e) {
Refine.reportException(e);
}
}
if (o.code == "ok") {
Refine.update(updateOptions, callbacks.onFinallyDone);
if ("historyEntry" in o) {
ui.processPanel.showUndo(o.historyEntry);
}
} else if (o.code == "pending") {
if ("onPending" in callbacks) {
try {
callbacks.onPending(o);
} catch (e) {
Refine.reportException(e);
}
}
ui.processPanel.update(updateOptions, callbacks.onFinallyDone);
}
}
}
Refine.setAjaxInProgress();
$.post(
"/command/" + moduleName + "/" + command + "?" + $.param(params),
body,
onDone,
"json"
);
window.setTimeout(function() {
if (!done) {
dismissBusy = DialogSystem.showBusy();
}
}, 500);
};
Refine.setAjaxInProgress = function() {
$(document.body).attr("ajax_in_progress", "true");
$(document.body).attr("ajax_in_progress", "true");
};
Refine.clearAjaxInProgress = function() {
$(document.body).attr("ajax_in_progress", "false");
$(document.body).attr("ajax_in_progress", "false");
};
/*
@ -354,77 +354,77 @@ Refine.clearAjaxInProgress = function() {
*/
Refine.cellIndexToColumn = function(cellIndex) {
var columns = theProject.columnModel.columns;
for (var i = 0; i < columns.length; i++) {
var column = columns[i];
if (column.cellIndex == cellIndex) {
return column;
}
var columns = theProject.columnModel.columns;
for (var i = 0; i < columns.length; i++) {
var column = columns[i];
if (column.cellIndex == cellIndex) {
return column;
}
return null;
}
return null;
};
Refine.columnNameToColumn = function(columnName) {
var columns = theProject.columnModel.columns;
for (var i = 0; i < columns.length; i++) {
var column = columns[i];
if (column.name == columnName) {
return column;
}
var columns = theProject.columnModel.columns;
for (var i = 0; i < columns.length; i++) {
var column = columns[i];
if (column.name == columnName) {
return column;
}
return null;
}
return null;
};
Refine.columnNameToColumnIndex = function(columnName) {
var columns = theProject.columnModel.columns;
for (var i = 0; i < columns.length; i++) {
var column = columns[i];
if (column.name == columnName) {
return i;
}
var columns = theProject.columnModel.columns;
for (var i = 0; i < columns.length; i++) {
var column = columns[i];
if (column.name == columnName) {
return i;
}
return -1;
}
return -1;
};
Refine.fetchRows = function(start, limit, onDone, sorting) {
var body = {
engine: JSON.stringify(ui.browsingEngine.getJSON())
};
if (sorting) {
body.sorting = JSON.stringify(sorting)
}
var body = {
engine: JSON.stringify(ui.browsingEngine.getJSON())
};
if (sorting) {
body.sorting = JSON.stringify(sorting)
}
$.post(
"/command/core/get-rows?" + $.param({ project: theProject.id, start: start, limit: limit }) + "&callback=?",
body,
function(data) {
theProject.rowModel = data;
$.post(
"/command/core/get-rows?" + $.param({ project: theProject.id, start: start, limit: limit }) + "&callback=?",
body,
function(data) {
theProject.rowModel = data;
// Un-pool objects
for (var r = 0; r < data.rows.length; r++) {
var row = data.rows[r];
for (var c = 0; c < row.cells.length; c++) {
var cell = row.cells[c];
if ((cell) && ("r" in cell)) {
cell.r = data.pool.recons[cell.r];
}
}
}
// Un-pool objects
for (var r = 0; r < data.rows.length; r++) {
var row = data.rows[r];
for (var c = 0; c < row.cells.length; c++) {
var cell = row.cells[c];
if ((cell) && ("r" in cell)) {
cell.r = data.pool.recons[cell.r];
}
}
}
if (onDone) {
onDone();
}
},
"jsonp"
);
if (onDone) {
onDone();
}
},
"jsonp"
);
};
Refine.getPermanentLink = function() {
var params = [
"project=" + escape(theProject.id),
"ui=" + escape(JSON.stringify({
facets: ui.browsingEngine.getFacetUIStates()
}))
];
return "project?" + params.join("&");
var params = [
"project=" + escape(theProject.id),
"ui=" + escape(JSON.stringify({
facets: ui.browsingEngine.getFacetUIStates()
}))
];
return "project?" + params.join("&");
};
/*
@ -432,20 +432,20 @@ Refine.getPermanentLink = function() {
*/
function onLoad() {
var params = URL.getParameters();
if ("project" in params) {
var uiState = {};
if ("ui" in params) {
try {
uiState = JSON.parse(params.ui);
} catch (e) {
}
}
Refine.reinitializeProjectData(function() {
initializeUI(uiState);
});
var params = URL.getParameters();
if ("project" in params) {
var uiState = {};
if ("ui" in params) {
try {
uiState = JSON.parse(params.ui);
} catch (e) {
}
}
Refine.reinitializeProjectData(function() {
initializeUI(uiState);
});
}
}
$(onLoad);

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,270 +29,270 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
function BrowsingEngine(div, facetConfigs) {
this._div = div;
this._mode = theProject.recordModel.hasRecords ? 'record-based' : 'row-based';
this._div = div;
this._mode = theProject.recordModel.hasRecords ? 'record-based' : 'row-based';
this._facets = [];
this._initializeUI();
this._facets = [];
this._initializeUI();
if (facetConfigs.length > 0) {
for (var i = 0; i < facetConfigs.length; i++) {
var facetConfig = facetConfigs[i];
var type = facetConfig.c.type;
if (facetConfigs.length > 0) {
for (var i = 0; i < facetConfigs.length; i++) {
var facetConfig = facetConfigs[i];
var type = facetConfig.c.type;
var elmt = this._createFacetContainer();
var facet;
switch (type) {
case "range":
facet = RangeFacet.reconstruct(elmt, facetConfig);
break;
case "timerange":
facet = TimeRangeFacet.reconstruct(elmt, facetConfig);
break;
case "scatterplot":
facet = ScatterplotFacet.reconstruct(elmt, facetConfig);
break;
case "text":
facet = TextSearchFacet.reconstruct(elmt, facetConfig);
break;
default:
facet = ListFacet.reconstruct(elmt, facetConfig);
}
var elmt = this._createFacetContainer();
var facet;
switch (type) {
case "range":
facet = RangeFacet.reconstruct(elmt, facetConfig);
break;
case "timerange":
facet = TimeRangeFacet.reconstruct(elmt, facetConfig);
break;
case "scatterplot":
facet = ScatterplotFacet.reconstruct(elmt, facetConfig);
break;
case "text":
facet = TextSearchFacet.reconstruct(elmt, facetConfig);
break;
default:
facet = ListFacet.reconstruct(elmt, facetConfig);
}
this._facets.push({ elmt: elmt, facet: facet });
}
this._facets.push({ elmt: elmt, facet: facet });
}
}
}
BrowsingEngine.prototype.resize = function() {
if (this._facets.length > 0) {
var body = this._div.find(".facets-container");
var bodyPaddings = body.outerHeight(true) - body.height();
var height =
this._div.height() -
this._div.find(".browsing-panel-header").outerHeight(true) -
bodyPaddings;
if (this._facets.length > 0) {
var body = this._div.find(".facets-container");
var bodyPaddings = body.outerHeight(true) - body.height();
var height =
this._div.height() -
this._div.find(".browsing-panel-header").outerHeight(true) -
bodyPaddings;
body.css("height", height + "px");
body.css("height", height + "px");
this._elmts.facets.sortable("refresh");
}
this._elmts.facets.sortable("refresh");
}
};
BrowsingEngine.prototype.getFacetUIStates = function() {
var f = [];
for (var i = 0; i < this._facets.length; i++) {
var facet = this._facets[i];
f.push(facet.facet.getUIState());
}
return f;
var f = [];
for (var i = 0; i < this._facets.length; i++) {
var facet = this._facets[i];
f.push(facet.facet.getUIState());
}
return f;
};
BrowsingEngine.prototype._initializeUI = function() {
var self = this;
var self = this;
this._div.html(
'<div class="browsing-panel-help" bind="help">' +
'<h1>Using facets and filters</h1>' +
'<p>Use facets and filters to select subsets of your data to act on. Choose facet and filter methods from the menus at the top of each data column.</p>' +
'<p>Not sure how to get started?<br /><a href="http://code.google.com/p/google-refine/wiki/Screencasts" target="_blank"><b>Watch these screencasts</b></a></p>' +
'</div>' +
'<div class="browsing-panel-header" bind="header">' +
'<div class="browsing-panel-indicator" bind="indicator">' +
'<img src="images/small-spinner.gif" /> Refreshing facets...' +
'</div>' +
'<div class="browsing-panel-controls" bind="controls">' +
'<div class="browsing-panel-controls-refresh">' +
'<a href="javascript:{}" bind="refreshLink" class="button" title="Update all facets">Refresh</a>' +
'</div>' +
'<a href="javascript:{}" bind="resetLink" class="button button-pill-left" title="Clear selection in all facets">Reset All</a>' +
'<a href="javascript:{}" bind="removeLink" class="button button-pill-right" title="Remove all facets">Remove All</a>' +
'</div>' +
'</div>' +
'<ul bind="facets" class="facets-container"></ul>'
);
this._elmts = DOM.bind(this._div);
this._elmts.facets.sortable({
handle: '.facet-title',
update: function(event, ui) {
self._updateFacetOrder();
}
});
this._div.html(
'<div class="browsing-panel-help" bind="help">' +
'<h1>Using facets and filters</h1>' +
'<p>Use facets and filters to select subsets of your data to act on. Choose facet and filter methods from the menus at the top of each data column.</p>' +
'<p>Not sure how to get started?<br /><a href="http://code.google.com/p/google-refine/wiki/Screencasts" target="_blank"><b>Watch these screencasts</b></a></p>' +
'</div>' +
'<div class="browsing-panel-header" bind="header">' +
'<div class="browsing-panel-indicator" bind="indicator">' +
'<img src="images/small-spinner.gif" /> Refreshing facets...' +
'</div>' +
'<div class="browsing-panel-controls" bind="controls">' +
'<div class="browsing-panel-controls-refresh">' +
'<a href="javascript:{}" bind="refreshLink" class="button" title="Update all facets">Refresh</a>' +
'</div>' +
'<a href="javascript:{}" bind="resetLink" class="button button-pill-left" title="Clear selection in all facets">Reset All</a>' +
'<a href="javascript:{}" bind="removeLink" class="button button-pill-right" title="Remove all facets">Remove All</a>' +
'</div>' +
'</div>' +
'<ul bind="facets" class="facets-container"></ul>'
);
this._elmts = DOM.bind(this._div);
this._elmts.facets.sortable({
handle: '.facet-title',
update: function(event, ui) {
self._updateFacetOrder();
}
});
this._elmts.refreshLink.click(function() { self.update(); });
this._elmts.resetLink.click(function() { self.reset(); });
this._elmts.removeLink.click(function() { self.remove(); });
this._elmts.refreshLink.click(function() { self.update(); });
this._elmts.resetLink.click(function() { self.reset(); });
this._elmts.removeLink.click(function() { self.remove(); });
};
BrowsingEngine.prototype._updateFacetOrder = function() {
var elmts = this._elmts.facets.children();
var newFacets = [];
for (var e = 0; e < elmts.length; e++) {
var elmt = elmts[e];
for (var f = 0; f < this._facets.length; f++) {
if (elmt === this._facets[f].elmt[0]) {
newFacets.push(this._facets[f]);
break;
}
}
var elmts = this._elmts.facets.children();
var newFacets = [];
for (var e = 0; e < elmts.length; e++) {
var elmt = elmts[e];
for (var f = 0; f < this._facets.length; f++) {
if (elmt === this._facets[f].elmt[0]) {
newFacets.push(this._facets[f]);
break;
}
}
this._facets = newFacets;
}
this._facets = newFacets;
};
BrowsingEngine.prototype.getMode = function() {
return this._mode;
return this._mode;
};
BrowsingEngine.prototype.setMode = function(mode) {
if (this._mode != mode) {
this._mode = mode;
Refine.update({ engineChanged: true });
}
if (this._mode != mode) {
this._mode = mode;
Refine.update({ engineChanged: true });
}
};
BrowsingEngine.prototype.getJSON = function(keepUnrestrictedFacets, except) {
var a = {
facets: [],
mode: this._mode
};
for (var i = 0; i < this._facets.length; i++) {
var facet = this._facets[i];
if ((keepUnrestrictedFacets || facet.facet.hasSelection()) && (facet.facet !== except)) {
a.facets.push(facet.facet.getJSON());
}
var a = {
facets: [],
mode: this._mode
};
for (var i = 0; i < this._facets.length; i++) {
var facet = this._facets[i];
if ((keepUnrestrictedFacets || facet.facet.hasSelection()) && (facet.facet !== except)) {
a.facets.push(facet.facet.getJSON());
}
return a;
}
return a;
};
BrowsingEngine.prototype.addFacet = function(type, config, options) {
var elmt = this._createFacetContainer();
var facet;
switch (type) {
case "range":
facet = new RangeFacet(elmt, config, options);
break;
case "timerange":
facet = new TimeRangeFacet(elmt, config, options);
break;
case "scatterplot":
facet = new ScatterplotFacet(elmt, config, options);
break;
case "text":
facet = new TextSearchFacet(elmt, config, options);
break;
default:
facet = new ListFacet(elmt, config, options);
}
var elmt = this._createFacetContainer();
var facet;
switch (type) {
case "range":
facet = new RangeFacet(elmt, config, options);
break;
case "timerange":
facet = new TimeRangeFacet(elmt, config, options);
break;
case "scatterplot":
facet = new ScatterplotFacet(elmt, config, options);
break;
case "text":
facet = new TextSearchFacet(elmt, config, options);
break;
default:
facet = new ListFacet(elmt, config, options);
}
this._facets.push({ elmt: elmt, facet: facet });
this._facets.push({ elmt: elmt, facet: facet });
ui.leftPanelTabs.tabs("select", 0);
ui.leftPanelTabs.tabs("select", 0);
Refine.update({ engineChanged: true });
Refine.update({ engineChanged: true });
};
BrowsingEngine.prototype._createFacetContainer = function() {
return $('<li></li>').addClass("facet-container").attr("id","facet-" + this._facets.length).hide().appendTo(this._elmts.facets);
return $('<li></li>').addClass("facet-container").attr("id","facet-" + this._facets.length).hide().appendTo(this._elmts.facets);
};
BrowsingEngine.prototype.removeFacet = function(facet) {
var update = facet.hasSelection();
for (var i = this._facets.length - 1;i >= 0; i--) {
var facetRecord = this._facets[i];
if (facetRecord.facet === facet) {
this._facets.splice(i, 1);
var update = facet.hasSelection();
for (var i = this._facets.length - 1;i >= 0; i--) {
var facetRecord = this._facets[i];
if (facetRecord.facet === facet) {
this._facets.splice(i, 1);
facetRecord.facet.dispose();
facetRecord.facet.dispose();
// This makes really big facet disappear right away. If you just call remove()
// then it takes a while for all the event handlers to get unwired, and the UI
// appear frozen.
facetRecord.elmt.hide();
window.setTimeout(function() {
facetRecord.elmt.remove();
}, 300);
// This makes really big facet disappear right away. If you just call remove()
// then it takes a while for all the event handlers to get unwired, and the UI
// appear frozen.
facetRecord.elmt.hide();
window.setTimeout(function() {
facetRecord.elmt.remove();
}, 300);
break;
}
break;
}
}
for (var i = 0; i < this._facets.length; i++) {
if (typeof this._facets[i].facet.update == "function") {
this._facets[i].facet.update();
}
for (var i = 0; i < this._facets.length; i++) {
if (typeof this._facets[i].facet.update == "function") {
this._facets[i].facet.update();
}
}
if (update) {
Refine.update({ engineChanged: true });
} else if (this._facets.length == 0) {
this._elmts.help.show();
this._elmts.header.hide();
}
if (update) {
Refine.update({ engineChanged: true });
} else if (this._facets.length == 0) {
this._elmts.help.show();
this._elmts.header.hide();
}
};
BrowsingEngine.prototype.update = function(onDone) {
var self = this;
var self = this;
this._elmts.help.hide();
this._elmts.help.hide();
this._elmts.header.show();
this._elmts.controls.css("visibility", "hidden");
this._elmts.indicator.css("visibility", "visible");
this._elmts.header.show();
this._elmts.controls.css("visibility", "hidden");
this._elmts.indicator.css("visibility", "visible");
$.post(
"/command/core/compute-facets?" + $.param({ project: theProject.id }),
{ engine: JSON.stringify(this.getJSON(true)) },
function(data) {
var facetData = data.facets;
$.post(
"/command/core/compute-facets?" + $.param({ project: theProject.id }),
{ engine: JSON.stringify(this.getJSON(true)) },
function(data) {
var facetData = data.facets;
for (var i = 0; i < facetData.length; i++) {
self._facets[i].facet.updateState(facetData[i]);
}
for (var i = 0; i < facetData.length; i++) {
self._facets[i].facet.updateState(facetData[i]);
}
self._elmts.indicator.css("visibility", "hidden");
if (self._facets.length > 0) {
self._elmts.header.show();
self._elmts.controls.css("visibility", "visible");
self._elmts.indicator.css("visibility", "hidden");
if (self._facets.length > 0) {
self._elmts.header.show();
self._elmts.controls.css("visibility", "visible");
self.resize();
} else {
self._elmts.help.show();
}
self.resize();
} else {
self._elmts.help.show();
}
if (onDone) {
onDone();
}
},
"json"
);
if (onDone) {
onDone();
}
},
"json"
);
};
BrowsingEngine.prototype.reset = function() {
for (var i = 0; i < this._facets.length; i++) {
this._facets[i].facet.reset();
}
for (var i = 0; i < this._facets.length; i++) {
this._facets[i].facet.reset();
}
Refine.update({ engineChanged: true });
Refine.update({ engineChanged: true });
};
BrowsingEngine.prototype.remove = function() {
var oldFacets = this._facets;
var oldFacets = this._facets;
this._facets = [];
this._facets = [];
for (var i = 0; i < oldFacets.length; i++) {
var facet = oldFacets[i];
facet.facet.dispose();
facet.elmt.hide();
}
window.setTimeout(function() {
for (var i = 0; i < oldFacets.length; i++) {
var facet = oldFacets[i];
facet.facet.dispose();
facet.elmt.hide();
oldFacets[i].elmt.remove();
}
window.setTimeout(function() {
for (var i = 0; i < oldFacets.length; i++) {
oldFacets[i].elmt.remove();
}
}, 300);
}, 300);
Refine.update({ engineChanged: true });
Refine.update({ engineChanged: true });
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,133 +29,133 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
function ExporterManager(button) {
this._button = button;
this._initializeUI();
this._button = button;
this._initializeUI();
}
ExporterManager.handlers = {};
ExporterManager.MenuItems = [
{
"id" : "core/export-project",
"label": "Export project",
"click": function() { ExporterManager.handlers.exportProject(); }
},
{},
{
"id" : "core/export-tsv",
"label": "Tab-separated value",
"click": function() { ExporterManager.handlers.exportRows("tsv", "tsv"); }
},
{
"id" : "core/export-csv",
"label": "Comma-separated value",
"click": function() { ExporterManager.handlers.exportRows("csv", "csv"); }
},
{
"id" : "core/export-html-table",
"label": "HTML table",
"click": function() { ExporterManager.handlers.exportRows("html", "html"); }
},
{
"id" : "core/export-excel",
"label": "Excel",
"click": function() { ExporterManager.handlers.exportRows("xls", "xls"); }
},
{},
{
"id" : "core/export-tripleloader",
"label": "Triple loader",
"click": function() { ExporterManager.handlers.exportTripleloader("tripleloader"); }
},
{
"id" : "core/export-mqlwrite",
"label": "MQLWrite",
"click": function() { ExporterManager.handlers.exportTripleloader("mqlwrite"); }
},
{},
{
"id" : "core/export-templating",
"label": "Templating...",
"click": function() { new TemplatingExporterDialog(); }
}
{
"id" : "core/export-project",
"label": "Export project",
"click": function() { ExporterManager.handlers.exportProject(); }
},
{},
{
"id" : "core/export-tsv",
"label": "Tab-separated value",
"click": function() { ExporterManager.handlers.exportRows("tsv", "tsv"); }
},
{
"id" : "core/export-csv",
"label": "Comma-separated value",
"click": function() { ExporterManager.handlers.exportRows("csv", "csv"); }
},
{
"id" : "core/export-html-table",
"label": "HTML table",
"click": function() { ExporterManager.handlers.exportRows("html", "html"); }
},
{
"id" : "core/export-excel",
"label": "Excel",
"click": function() { ExporterManager.handlers.exportRows("xls", "xls"); }
},
{},
{
"id" : "core/export-tripleloader",
"label": "Triple loader",
"click": function() { ExporterManager.handlers.exportTripleloader("tripleloader"); }
},
{
"id" : "core/export-mqlwrite",
"label": "MQLWrite",
"click": function() { ExporterManager.handlers.exportTripleloader("mqlwrite"); }
},
{},
{
"id" : "core/export-templating",
"label": "Templating...",
"click": function() { new TemplatingExporterDialog(); }
}
];
ExporterManager.prototype._initializeUI = function() {
this._button.click(function(evt) {
MenuSystem.createAndShowStandardMenu(
ExporterManager.MenuItems,
this,
{ horizontal: false }
);
this._button.click(function(evt) {
MenuSystem.createAndShowStandardMenu(
ExporterManager.MenuItems,
this,
{ horizontal: false }
);
evt.preventDefault();
return false;
});
evt.preventDefault();
return false;
});
};
ExporterManager.handlers.exportTripleloader = function(format) {
if (!theProject.overlayModels.freebaseProtograph) {
alert(
"You haven't done any schema alignment yet,\nso there is no triple to export.\n\n" +
"Use the Freebase > Edit Schema Alignment Skeleton...\ncommand to align your data with Freebase schemas first."
);
} else {
ExporterManager.handlers.exportRows(format, "txt");
}
if (!theProject.overlayModels.freebaseProtograph) {
alert(
"You haven't done any schema alignment yet,\nso there is no triple to export.\n\n" +
"Use the Freebase > Edit Schema Alignment Skeleton...\ncommand to align your data with Freebase schemas first."
);
} else {
ExporterManager.handlers.exportRows(format, "txt");
}
};
ExporterManager.handlers.exportRows = function(format, ext) {
var name = $.trim(theProject.metadata.name.replace(/\W/g, ' ')).replace(/\s+/g, '-');
var form = document.createElement("form");
$(form)
.css("display", "none")
.attr("method", "post")
.attr("action", "/command/core/export-rows/" + name + "." + ext)
.attr("target", "refine-export");
var name = $.trim(theProject.metadata.name.replace(/\W/g, ' ')).replace(/\s+/g, '-');
var form = document.createElement("form");
$(form)
.css("display", "none")
.attr("method", "post")
.attr("action", "/command/core/export-rows/" + name + "." + ext)
.attr("target", "refine-export");
$('<input />')
.attr("name", "engine")
.attr("value", JSON.stringify(ui.browsingEngine.getJSON()))
.appendTo(form);
$('<input />')
.attr("name", "project")
.attr("value", theProject.id)
.appendTo(form);
$('<input />')
.attr("name", "format")
.attr("value", format)
.appendTo(form);
$('<input />')
.attr("name", "engine")
.attr("value", JSON.stringify(ui.browsingEngine.getJSON()))
.appendTo(form);
$('<input />')
.attr("name", "project")
.attr("value", theProject.id)
.appendTo(form);
$('<input />')
.attr("name", "format")
.attr("value", format)
.appendTo(form);
document.body.appendChild(form);
document.body.appendChild(form);
window.open("about:blank", "refine-export");
form.submit();
window.open("about:blank", "refine-export");
form.submit();
document.body.removeChild(form);
document.body.removeChild(form);
};
ExporterManager.handlers.exportProject = function() {
var name = $.trim(theProject.metadata.name.replace(/\W/g, ' ')).replace(/\s+/g, '-');
var form = document.createElement("form");
$(form)
.css("display", "none")
.attr("method", "post")
.attr("action", "/command/core/export-project/" + name + ".google-refine.tar.gz")
.attr("target", "refine-export");
$('<input />')
.attr("name", "project")
.attr("value", theProject.id)
.appendTo(form);
var name = $.trim(theProject.metadata.name.replace(/\W/g, ' ')).replace(/\s+/g, '-');
var form = document.createElement("form");
$(form)
.css("display", "none")
.attr("method", "post")
.attr("action", "/command/core/export-project/" + name + ".google-refine.tar.gz")
.attr("target", "refine-export");
$('<input />')
.attr("name", "project")
.attr("value", theProject.id)
.appendTo(form);
document.body.appendChild(form);
document.body.appendChild(form);
window.open("about:blank", "refine-export");
form.submit();
window.open("about:blank", "refine-export");
form.submit();
document.body.removeChild(form);
document.body.removeChild(form);
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,61 +29,61 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
function ExtensionBar(div) {
this._div = div;
this._initializeUI();
this._div = div;
this._initializeUI();
}
ExtensionBar.MenuItems = [
];
ExtensionBar.addExtensionMenu = function(what) {
MenuSystem.appendTo(ExtensionBar.MenuItems, [], what);
MenuSystem.appendTo(ExtensionBar.MenuItems, [], what);
}
ExtensionBar.appendTo = function(path, what) {
MenuSystem.appendTo(ExtensionBar.MenuItems, path, what);
MenuSystem.appendTo(ExtensionBar.MenuItems, path, what);
};
ExtensionBar.insertBefore = function(path, what) {
MenuSystem.insertBefore(ExtensionBar.MenuItems, path, what);
MenuSystem.insertBefore(ExtensionBar.MenuItems, path, what);
};
ExtensionBar.insertAfter = function(path, what) {
MenuSystem.insertAfter(ExtensionBar.MenuItems, path, what);
MenuSystem.insertAfter(ExtensionBar.MenuItems, path, what);
};
ExtensionBar.prototype.resize = function() {
};
ExtensionBar.prototype._initializeUI = function() {
var elmts = DOM.bind(this._div);
for (var i = 0; i < ExtensionBar.MenuItems.length; i++) {
var menuItem = ExtensionBar.MenuItems[i];
var menuButton = this._createMenuButton(menuItem.label, menuItem.submenu);
elmts.menuContainer.append(menuButton);
}
var elmts = DOM.bind(this._div);
for (var i = 0; i < ExtensionBar.MenuItems.length; i++) {
var menuItem = ExtensionBar.MenuItems[i];
var menuButton = this._createMenuButton(menuItem.label, menuItem.submenu);
elmts.menuContainer.append(menuButton);
}
};
ExtensionBar.prototype._createMenuButton = function(label, submenu) {
var self = this;
var self = this;
var menuItem = $("<a>").addClass("button").append('<span class="button-menu">' + label + '</span>');
var menuItem = $("<a>").addClass("button").append('<span class="button-menu">' + label + '</span>');
menuItem.click(function(evt) {
MenuSystem.createAndShowStandardMenu(
submenu,
this,
{ horizontal: false }
);
menuItem.click(function(evt) {
MenuSystem.createAndShowStandardMenu(
submenu,
this,
{ horizontal: false }
);
evt.preventDefault();
return false;
});
evt.preventDefault();
return false;
});
return menuItem;
return menuItem;
};
ExtensionBar.handlers = {};

View File

@ -1,7 +1,7 @@
<div class="history-panel-help" bind="helpDiv">
<h1>Infinite undo history</h1>
<p>Don't worry about making mistakes. Every change you make will be shown here, and you can undo your changes anytime.</p>
<p><a href="http://code.google.com/p/google-refine/wiki/History" target="_blank"><b>Learn more &raquo;</b></a></p>
<h1>Infinite undo history</h1>
<p>Don't worry about making mistakes. Every change you make will be shown here, and you can undo your changes anytime.</p>
<p><a href="http://code.google.com/p/google-refine/wiki/History" target="_blank"><b>Learn more &raquo;</b></a></p>
</div>
<div class="history-panel-controls" bind="controlsDiv">
<a class="button button-pill-left" href="javascript:{}" bind="extractLink">Extract&hellip;</a><a class="button button-pill-right" href="javascript:{}" bind="applyLink">Apply&hellip;</a>
@ -10,11 +10,11 @@
Filter: <input type="text" size="30" bind="filterInput" />
</div>
<div class="history-panel-body" bind="bodyDiv">
<div class="history-past" bind="pastDiv">
<div class="history-highlight" bind="pastHighlightDiv"></div>
</div>
<div class="history-now" bind="nowDiv"></div>
<div class="history-future" bind="futureDiv">
<div class="history-highlight" bind="futureHighlightDiv"></div>
</div>
<div class="history-past" bind="pastDiv">
<div class="history-highlight" bind="pastHighlightDiv"></div>
</div>
<div class="history-now" bind="nowDiv"></div>
<div class="history-future" bind="futureDiv">
<div class="history-highlight" bind="futureHighlightDiv"></div>
</div>
</div>'

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,275 +29,275 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
function HistoryPanel(div, tabHeader) {
this._div = div;
this._tabHeader = tabHeader;
this.update();
this._div = div;
this._tabHeader = tabHeader;
this.update();
}
HistoryPanel.prototype.resize = function() {
var body = this._div.find(".history-panel-body");
var controls = this._div.find(".history-panel-controls");
var bodyControls = this._div.find(".history-panel-filter");
var nowDiv = this._div.find(".history-now");
var body = this._div.find(".history-panel-body");
var controls = this._div.find(".history-panel-controls");
var bodyControls = this._div.find(".history-panel-filter");
var nowDiv = this._div.find(".history-now");
var bodyPaddings = body.outerHeight(true) - body.height();
body.height((this._div.height() - controls.outerHeight(true) - bodyControls.outerHeight(true) - bodyPaddings) + "px");
body[0].scrollTop =
nowDiv[0].offsetTop +
nowDiv[0].offsetHeight -
body[0].offsetHeight;
var bodyPaddings = body.outerHeight(true) - body.height();
body.height((this._div.height() - controls.outerHeight(true) - bodyControls.outerHeight(true) - bodyPaddings) + "px");
body[0].scrollTop =
nowDiv[0].offsetTop +
nowDiv[0].offsetHeight -
body[0].offsetHeight;
};
HistoryPanel.prototype.update = function(onDone) {
var self = this;
Ajax.chainGetJSON(
"/command/core/get-history?" + $.param({ project: theProject.id }), null,
function(data) {
self._data = data;
self._render();
var self = this;
Ajax.chainGetJSON(
"/command/core/get-history?" + $.param({ project: theProject.id }), null,
function(data) {
self._data = data;
self._render();
if (onDone) {
onDone();
}
}
);
if (onDone) {
onDone();
}
}
);
};
HistoryPanel.prototype._render = function() {
var self = this;
var self = this;
this._tabHeader.html('Undo / Redo <span class="count">' + this._data.past.length + '</span>');
this._tabHeader.html('Undo / Redo <span class="count">' + this._data.past.length + '</span>');
this._div.empty().unbind().html(DOM.loadHTML("core", "scripts/project/history-panel.html"));
this._div.empty().unbind().html(DOM.loadHTML("core", "scripts/project/history-panel.html"));
var elmts = DOM.bind(this._div);
var elmts = DOM.bind(this._div);
var renderEntry = function(container, index, entry, lastDoneID, past) {
var a = $(DOM.loadHTML("core", "scripts/project/history-entry.html")).appendTo(container);
if (lastDoneID >= 0) {
a.attr("href", "javascript:{}")
.click(function(evt) {
return self._onClickHistoryEntry(evt, entry, lastDoneID);
})
.mouseover(function() {
if (past) {
elmts.pastHighlightDiv.show().height(elmts.pastDiv.height() - this.offsetTop - this.offsetHeight);
} else {
elmts.futureHighlightDiv.show().height(this.offsetTop + this.offsetHeight);
}
})
.mouseout(function() {
if (past) {
elmts.pastHighlightDiv.hide();
} else {
elmts.futureHighlightDiv.hide();
}
});
}
a[0].childNodes[0].appendChild(document.createTextNode(index + "."));
a[0].childNodes[1].appendChild(document.createTextNode(entry.description));
return a;
};
if (this._data.past.length > 0 || this._data.future.length > 0) {
if (!this._data.past.length) {
renderEntry(elmts.nowDiv, 0, {
description: "Create project"
}, 0, true);
var renderEntry = function(container, index, entry, lastDoneID, past) {
var a = $(DOM.loadHTML("core", "scripts/project/history-entry.html")).appendTo(container);
if (lastDoneID >= 0) {
a.attr("href", "javascript:{}")
.click(function(evt) {
return self._onClickHistoryEntry(evt, entry, lastDoneID);
})
.mouseover(function() {
if (past) {
elmts.pastHighlightDiv.show().height(elmts.pastDiv.height() - this.offsetTop - this.offsetHeight);
} else {
renderEntry(elmts.pastDiv, 0, {
description: "Create project"
}, 0, true);
for (var i = 0; i < this._data.past.length - 1; i++) {
var entry = this._data.past[i];
renderEntry(elmts.pastDiv, i + 1, entry, entry.id, true);
}
renderEntry(elmts.nowDiv, this._data.past.length, this._data.past[this._data.past.length - 1], -1);
elmts.futureHighlightDiv.show().height(this.offsetTop + this.offsetHeight);
}
if (this._data.future.length) {
for (var i = 0; i < this._data.future.length; i++) {
var entry = this._data.future[i];
renderEntry(elmts.futureDiv, this._data.past.length + i + 1, entry, entry.id, false);
}
})
.mouseout(function() {
if (past) {
elmts.pastHighlightDiv.hide();
} else {
elmts.futureHighlightDiv.hide();
}
elmts.helpDiv.hide();
elmts.filterInput.keyup(function() {
var filter = $.trim(this.value.toLowerCase());
if (filter.length == 0) {
elmts.bodyDiv.find(".history-entry").removeClass("filtered-out");
} else {
elmts.bodyDiv.find(".history-entry").each(function() {
var text = this.childNodes[1].firstChild.nodeValue;
if (text.toLowerCase().indexOf(filter) >= 0) {
$(this).removeClass("filtered-out");
} else {
$(this).addClass("filtered-out");
}
});
}
});
} else {
elmts.bodyDiv.hide();
elmts.bodyControlsDiv.hide();
});
}
elmts.extractLink.click(function() { self._extractOperations(); });
elmts.applyLink.click(function() { self._showApplyOperationsDialog(); });
a[0].childNodes[0].appendChild(document.createTextNode(index + "."));
a[0].childNodes[1].appendChild(document.createTextNode(entry.description));
this.resize();
return a;
};
if (this._data.past.length > 0 || this._data.future.length > 0) {
if (!this._data.past.length) {
renderEntry(elmts.nowDiv, 0, {
description: "Create project"
}, 0, true);
} else {
renderEntry(elmts.pastDiv, 0, {
description: "Create project"
}, 0, true);
for (var i = 0; i < this._data.past.length - 1; i++) {
var entry = this._data.past[i];
renderEntry(elmts.pastDiv, i + 1, entry, entry.id, true);
}
renderEntry(elmts.nowDiv, this._data.past.length, this._data.past[this._data.past.length - 1], -1);
}
if (this._data.future.length) {
for (var i = 0; i < this._data.future.length; i++) {
var entry = this._data.future[i];
renderEntry(elmts.futureDiv, this._data.past.length + i + 1, entry, entry.id, false);
}
}
elmts.helpDiv.hide();
elmts.filterInput.keyup(function() {
var filter = $.trim(this.value.toLowerCase());
if (filter.length == 0) {
elmts.bodyDiv.find(".history-entry").removeClass("filtered-out");
} else {
elmts.bodyDiv.find(".history-entry").each(function() {
var text = this.childNodes[1].firstChild.nodeValue;
if (text.toLowerCase().indexOf(filter) >= 0) {
$(this).removeClass("filtered-out");
} else {
$(this).addClass("filtered-out");
}
});
}
});
} else {
elmts.bodyDiv.hide();
elmts.bodyControlsDiv.hide();
}
elmts.extractLink.click(function() { self._extractOperations(); });
elmts.applyLink.click(function() { self._showApplyOperationsDialog(); });
this.resize();
};
HistoryPanel.prototype._onClickHistoryEntry = function(evt, entry, lastDoneID) {
var self = this;
var self = this;
Refine.postCoreProcess(
"undo-redo",
{ lastDoneID: lastDoneID },
null,
{ everythingChanged: true }
);
Refine.postCoreProcess(
"undo-redo",
{ lastDoneID: lastDoneID },
null,
{ everythingChanged: true }
);
};
HistoryPanel.prototype._extractOperations = function() {
var self = this;
$.getJSON(
"/command/core/get-operations?" + $.param({ project: theProject.id }),
null,
function(data) {
if ("entries" in data) {
self._showExtractOperationsDialog(data);
}
},
"jsonp"
);
var self = this;
$.getJSON(
"/command/core/get-operations?" + $.param({ project: theProject.id }),
null,
function(data) {
if ("entries" in data) {
self._showExtractOperationsDialog(data);
}
},
"jsonp"
);
};
HistoryPanel.prototype._showExtractOperationsDialog = function(json) {
var self = this;
var frame = $(DOM.loadHTML("core", "scripts/project/history-extract-dialog.html"));
var elmts = DOM.bind(frame);
var self = this;
var frame = $(DOM.loadHTML("core", "scripts/project/history-extract-dialog.html"));
var elmts = DOM.bind(frame);
var entryTable = elmts.entryTable[0];
var createEntry = function(entry) {
var tr = entryTable.insertRow(entryTable.rows.length);
var td0 = tr.insertCell(0);
var td1 = tr.insertCell(1);
td0.width = "1%";
var entryTable = elmts.entryTable[0];
var createEntry = function(entry) {
var tr = entryTable.insertRow(entryTable.rows.length);
var td0 = tr.insertCell(0);
var td1 = tr.insertCell(1);
td0.width = "1%";
if ("operation" in entry) {
entry.selected = true;
if ("operation" in entry) {
entry.selected = true;
$('<input type="checkbox" checked="true" />').appendTo(td0).click(function() {
entry.selected = !entry.selected;
updateJson();
});
$('<input type="checkbox" checked="true" />').appendTo(td0).click(function() {
entry.selected = !entry.selected;
updateJson();
});
$('<span>').text(entry.operation.description).appendTo(td1);
} else {
$('<span>').text(entry.description).css("color", "#888").appendTo(td1);
}
};
$('<span>').text(entry.operation.description).appendTo(td1);
} else {
$('<span>').text(entry.description).css("color", "#888").appendTo(td1);
}
};
for (var i = 0; i < json.entries.length; i++) {
createEntry(json.entries[i]);
}
var updateJson = function() {
var a = [];
for (var i = 0; i < json.entries.length; i++) {
createEntry(json.entries[i]);
var entry = json.entries[i];
if ("operation" in entry && entry.selected) {
a.push(entry.operation);
}
}
elmts.textarea.text(JSON.stringify(a, null, 2));
};
updateJson();
elmts.closeButton.click(function() { DialogSystem.dismissUntil(level - 1); });
elmts.selectAllButton.click(function() {
for (var i = 0; i < json.entries.length; i++) {
json.entries[i].selected = true;
}
var updateJson = function() {
var a = [];
for (var i = 0; i < json.entries.length; i++) {
var entry = json.entries[i];
if ("operation" in entry && entry.selected) {
a.push(entry.operation);
}
}
elmts.textarea.text(JSON.stringify(a, null, 2));
};
frame.find('input[type="checkbox"]').attr("checked", "true");
updateJson();
});
elmts.unselectAllButton.click(function() {
for (var i = 0; i < json.entries.length; i++) {
json.entries[i].selected = false;
}
elmts.closeButton.click(function() { DialogSystem.dismissUntil(level - 1); });
elmts.selectAllButton.click(function() {
for (var i = 0; i < json.entries.length; i++) {
json.entries[i].selected = true;
}
frame.find('input[type="checkbox"]').removeAttr("checked");
updateJson();
});
frame.find('input[type="checkbox"]').attr("checked", "true");
updateJson();
});
elmts.unselectAllButton.click(function() {
for (var i = 0; i < json.entries.length; i++) {
json.entries[i].selected = false;
}
var level = DialogSystem.showDialog(frame);
frame.find('input[type="checkbox"]').removeAttr("checked");
updateJson();
});
var level = DialogSystem.showDialog(frame);
elmts.textarea[0].select();
elmts.textarea[0].select();
};
HistoryPanel.prototype._showApplyOperationsDialog = function() {
var self = this;
var frame = $(DOM.loadHTML("core", "scripts/project/history-apply-dialog.html"));
var elmts = DOM.bind(frame);
var self = this;
var frame = $(DOM.loadHTML("core", "scripts/project/history-apply-dialog.html"));
var elmts = DOM.bind(frame);
var fixJson = function(json) {
json = json.trim();
if (!json.startsWith("[")) {
json = "[" + json;
}
if (!json.endsWith("]")) {
json = json + "]";
}
var fixJson = function(json) {
json = json.trim();
if (!json.startsWith("[")) {
json = "[" + json;
}
if (!json.endsWith("]")) {
json = json + "]";
}
return json.replace(/\}\s*\,\s*\]/g, "} ]").replace(/\}\s*\{/g, "}, {");
};
return json.replace(/\}\s*\,\s*\]/g, "} ]").replace(/\}\s*\{/g, "}, {");
};
elmts.applyButton.click(function() {
var json;
elmts.applyButton.click(function() {
var json;
try {
json = elmts.textarea[0].value;
json = fixJson(json);
json = JSON.parse(json);
} catch (e) {
alert("The JSON you pasted is invalid.");
return;
}
try {
json = elmts.textarea[0].value;
json = fixJson(json);
json = JSON.parse(json);
} catch (e) {
alert("The JSON you pasted is invalid.");
return;
}
Refine.postCoreProcess(
"apply-operations",
{},
{ operations: JSON.stringify(json) },
{ everythingChanged: true },
{
onDone: function(o) {
if (o.code == "pending") {
// Something might have already been done and so it's good to update
Refine.update({ everythingChanged: true });
}
}
Refine.postCoreProcess(
"apply-operations",
{},
{ operations: JSON.stringify(json) },
{ everythingChanged: true },
{
onDone: function(o) {
if (o.code == "pending") {
// Something might have already been done and so it's good to update
Refine.update({ everythingChanged: true });
}
);
}
}
);
DialogSystem.dismissUntil(level - 1);
});
DialogSystem.dismissUntil(level - 1);
});
elmts.cancelButton.click(function() {
DialogSystem.dismissUntil(level - 1);
});
elmts.cancelButton.click(function() {
DialogSystem.dismissUntil(level - 1);
});
var level = DialogSystem.showDialog(frame);
var level = DialogSystem.showDialog(frame);
elmts.textarea.focus();
elmts.textarea.focus();
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,209 +29,209 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
function ProcessPanel(div) {
this._div = div;
this._timerID = null;
this._processCount = 0;
this._div = div;
this._timerID = null;
this._processCount = 0;
this._updateOptions = {};
this._onDones = [];
this._latestHistoryEntry = null;
this._updateOptions = {};
this._onDones = [];
this._latestHistoryEntry = null;
var self = this;
$(window).keypress(function(evt) {
if (evt.charCode == 26 || (evt.charCode == 122 && (evt.ctrlKey || evt.metaKey))) { // ctrl-z or meta-z
var t = evt.target;
if (t) {
var tagName = t.tagName.toLowerCase();
if (tagName == "textarea" || tagName == "input") {
return;
}
}
self.undo();
var self = this;
$(window).keypress(function(evt) {
if (evt.charCode == 26 || (evt.charCode == 122 && (evt.ctrlKey || evt.metaKey))) { // ctrl-z or meta-z
var t = evt.target;
if (t) {
var tagName = t.tagName.toLowerCase();
if (tagName == "textarea" || tagName == "input") {
return;
}
});
}
self.undo();
}
});
this.update({});
this.update({});
}
ProcessPanel.prototype.resize = function() {
};
ProcessPanel.prototype.update = function(updateOptions, onDone) {
this._latestHistoryEntry = null;
this._latestHistoryEntry = null;
for (var n in updateOptions) {
if (updateOptions.hasOwnProperty(n)) {
this._updateOptions[n] = updateOptions[n];
}
}
if (onDone) {
this._onDones.push(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;
}
if (this._timerID !== null) {
return;
}
var self = this;
Ajax.chainGetJSON(
"/command/core/get-processes?" + $.param({ project: theProject.id }), null,
function(data) {
self._latestHistoryEntry = null;
self._render(data);
}
);
var self = this;
Ajax.chainGetJSON(
"/command/core/get-processes?" + $.param({ project: theProject.id }), null,
function(data) {
self._latestHistoryEntry = null;
self._render(data);
}
);
};
ProcessPanel.prototype.showUndo = function(historyEntry) {
var self = this;
var self = this;
this._latestHistoryEntry = historyEntry;
this._latestHistoryEntry = historyEntry;
this._div.stop(true,false)
.empty()
.html('<div id="notification"><span bind="description"></span> <span class="notification-action"><a href="javascript:{}" bind="undo">Undo</a></span></div>')
.fadeIn(200)
.delay(7500)
.fadeOut(200);
var elmts = DOM.bind(this._div);
this._div.stop(true,false)
.empty()
.html('<div id="notification"><span bind="description"></span> <span class="notification-action"><a href="javascript:{}" bind="undo">Undo</a></span></div>')
.fadeIn(200)
.delay(7500)
.fadeOut(200);
var elmts = DOM.bind(this._div);
elmts.description.text(historyEntry.description);
elmts.undo.click(function() { self.undo(); });
elmts.description.text(historyEntry.description);
elmts.undo.click(function() { self.undo(); });
};
ProcessPanel.prototype.undo = function() {
if (this._latestHistoryEntry !== null) {
Refine.postCoreProcess(
"undo-redo",
{ undoID: this._latestHistoryEntry.id },
null,
{ everythingChanged: true }
);
}
if (this._latestHistoryEntry !== null) {
Refine.postCoreProcess(
"undo-redo",
{ undoID: this._latestHistoryEntry.id },
null,
{ everythingChanged: true }
);
}
};
ProcessPanel.prototype._cancelAll = function() {
var self = this;
$.post(
"/command/core/cancel-processes?" + $.param({ project: theProject.id }),
null,
function(o) {
self._data = null;
self._runOnDones();
},
"json"
);
var self = this;
$.post(
"/command/core/cancel-processes?" + $.param({ project: theProject.id }),
null,
function(o) {
self._data = null;
self._runOnDones();
},
"json"
);
};
ProcessPanel.prototype._render = function(newData) {
var self = this;
var newProcessMap = {};
var self = this;
var newProcessMap = {};
this._div.stop(true, false).empty();
this._div.stop(true, false).empty();
if (!newData.processes.length) {
Refine.setTitle();
this._div.fadeOut(200);
} else {
this._div.fadeIn(200);
var cancelmessage = "Cancel"
var noticeDiv = $('<div id="notification"></div>').appendTo(this._div);
var descriptionSpan = $('<span></span>').appendTo(noticeDiv);
var statusDiv = $('<div></div>').appendTo(noticeDiv);
$('<img src="images/small-spinner.gif" />')
.addClass("notification-loader")
.appendTo(statusDiv);
var progressSpan = $('<span></span>').appendTo(statusDiv);
var countSpan = $('<span></span>').appendTo(statusDiv);
var renderProcess = function(process) {
if (process.status != "pending") {
Refine.setTitle(process.progress + "% complete");
descriptionSpan.text(process.description);
progressSpan.text(process.progress + '% complete');
}
};
var renderProcessCount = function(count) {
var pendingcount = count - 1;
countSpan.text(', ' + pendingcount + ' pending processes');
};
var processes = newData.processes;
if (processes.length >> 1) {
cancelmessage = "Cancel All";
renderProcessCount(processes.length);
}
for (var i = 0; i < processes.length; i++) {
var process = processes[i];
renderProcess(process);
if ("onDone" in process) {
newProcessMap[process.id] = process;
}
}
$('<a href="javascript:{}"></a>')
.addClass("notification-action")
.text(cancelmessage)
.click(function() {
self._cancelAll();
$(this).text("Canceling...").unbind();
})
.appendTo(statusDiv);
if (!newData.processes.length) {
Refine.setTitle();
this._div.fadeOut(200);
} else {
this._div.fadeIn(200);
var cancelmessage = "Cancel"
var noticeDiv = $('<div id="notification"></div>').appendTo(this._div);
var descriptionSpan = $('<span></span>').appendTo(noticeDiv);
var statusDiv = $('<div></div>').appendTo(noticeDiv);
$('<img src="images/small-spinner.gif" />')
.addClass("notification-loader")
.appendTo(statusDiv);
var progressSpan = $('<span></span>').appendTo(statusDiv);
var countSpan = $('<span></span>').appendTo(statusDiv);
var renderProcess = function(process) {
if (process.status != "pending") {
Refine.setTitle(process.progress + "% complete");
descriptionSpan.text(process.description);
progressSpan.text(process.progress + '% complete');
}
};
var renderProcessCount = function(count) {
var pendingcount = count - 1;
countSpan.text(', ' + pendingcount + ' pending processes');
};
var processes = newData.processes;
if (processes.length >> 1) {
cancelmessage = "Cancel All";
renderProcessCount(processes.length);
}
if ((this._data) && this._data.processes.length > 0) {
var oldProcesses = this._data.processes;
for (var i = 0; i < oldProcesses.length; i++) {
var process = oldProcesses[i];
if ("onDone" in process && !(process.id in newProcessMap)) {
this._perform(process.onDone);
}
}
for (var i = 0; i < processes.length; i++) {
var process = processes[i];
renderProcess(process);
if ("onDone" in process) {
newProcessMap[process.id] = process;
}
}
this._data = newData;
$('<a href="javascript:{}"></a>')
.addClass("notification-action")
.text(cancelmessage)
.click(function() {
self._cancelAll();
$(this).text("Canceling...").unbind();
})
.appendTo(statusDiv);
}
if (this._data.processes.length && !this._timerID) {
this._timerID = window.setTimeout(function() {
self._timerID = null;
self.update();
}, 500);
} else {
this._runOnDones();
if ((this._data) && this._data.processes.length > 0) {
var oldProcesses = this._data.processes;
for (var i = 0; i < oldProcesses.length; i++) {
var process = oldProcesses[i];
if ("onDone" in process && !(process.id in newProcessMap)) {
this._perform(process.onDone);
}
}
}
this._data = newData;
if (this._data.processes.length && !this._timerID) {
this._timerID = window.setTimeout(function() {
self._timerID = null;
self.update();
}, 500);
} else {
this._runOnDones();
}
};
ProcessPanel.prototype._perform = function(jobs) {
for (var i = 0; i < jobs.length; i++) {
var job = jobs[i];
if (job.action == "createFacet") {
try {
ui.browsingEngine.addFacet(
job.facetType,
job.facetConfig,
job.facetOptions
);
} catch (e) {
//
}
}
for (var i = 0; i < jobs.length; i++) {
var job = jobs[i];
if (job.action == "createFacet") {
try {
ui.browsingEngine.addFacet(
job.facetType,
job.facetConfig,
job.facetOptions
);
} catch (e) {
//
}
}
}
};
ProcessPanel.prototype._runOnDones = function() {
var updateOptions = this._updateOptions;
var onDones = this._onDones;
var updateOptions = this._updateOptions;
var onDones = this._onDones;
this._updateOptions = {};
this._onDones = [];
this._updateOptions = {};
this._onDones = [];
Refine.update(updateOptions, function() {
for (var i = 0; i < onDones.length; i++) {
try {
onDones[i]();
} catch (e) {
Refine.reportException(e);
}
}
});
Refine.update(updateOptions, function() {
for (var i = 0; i < onDones.length; i++) {
try {
onDones[i]();
} catch (e) {
Refine.reportException(e);
}
}
});
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,28 +29,28 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
var Scripting = {
};
Scripting.parse = function(expression) {
var colon = expression.indexOf(":");
if (colon > 0) {
var l = expression.substring(0, colon);
if (l == "gel") { // backward compatible
l = "grel";
}
if (theProject.scripting.hasOwnProperty(l)) {
return {
language: l,
expression: expression.substring(colon + 1)
};
}
var colon = expression.indexOf(":");
if (colon > 0) {
var l = expression.substring(0, colon);
if (l == "gel") { // backward compatible
l = "grel";
}
if (theProject.scripting.hasOwnProperty(l)) {
return {
language: l,
expression: expression.substring(colon + 1)
};
}
}
return {
language: "grel",
expression: expression
};
return {
language: "grel",
expression: expression
};
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,11 +29,11 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
function SummaryBar(div) {
this._div = div;
this._initializeUI();
this._div = div;
this._initializeUI();
}
SummaryBar.prototype._initializeUI = function() {
@ -41,13 +41,13 @@ SummaryBar.prototype._initializeUI = function() {
};
SummaryBar.prototype.updateResultCount = function() {
var summaryText;
var units = theProject.rowModel.mode == "row-based" ? "rows" : "records";
if (theProject.rowModel.filtered == theProject.rowModel.total) {
summaryText = (theProject.rowModel.total) + ' ' + units;
} else {
summaryText = (theProject.rowModel.filtered) + ' matching ' + units + ' <span id="summary-total">(' + (theProject.rowModel.total) + ' total)</span>';
}
var summaryText;
var units = theProject.rowModel.mode == "row-based" ? "rows" : "records";
if (theProject.rowModel.filtered == theProject.rowModel.total) {
summaryText = (theProject.rowModel.total) + ' ' + units;
} else {
summaryText = (theProject.rowModel.filtered) + ' matching ' + units + ' <span id="summary-total">(' + (theProject.rowModel.total) + ' total)</span>';
}
$('<span>').html(summaryText).appendTo(this._div.empty());
$('<span>').html(summaryText).appendTo(this._div.empty());
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,105 +29,105 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
function ReconFreebaseQueryPanel(column, service, container) {
this._column = column;
this._service = service;
this._container = container;
this._column = column;
this._service = service;
this._container = container;
this._constructUI();
this._constructUI();
}
ReconFreebaseQueryPanel.prototype.activate = function() {
this._panel.show();
this._panel.show();
};
ReconFreebaseQueryPanel.prototype.deactivate = function() {
this._panel.hide();
this._panel.hide();
};
ReconFreebaseQueryPanel.prototype.dispose = function() {
this._panel.remove();
this._panel = null;
this._panel.remove();
this._panel = null;
this._column = null;
this._service = null;
this._container = null;
this._column = null;
this._service = null;
this._container = null;
};
ReconFreebaseQueryPanel.prototype._constructUI = function() {
var self = this;
this._panel = $(DOM.loadHTML("core", "scripts/reconciliation/freebase-query-panel.html")).appendTo(this._container);
this._elmts = DOM.bind(this._panel);
this._wireEvents();
var self = this;
this._panel = $(DOM.loadHTML("core", "scripts/reconciliation/freebase-query-panel.html")).appendTo(this._container);
this._elmts = DOM.bind(this._panel);
this._wireEvents();
};
ReconFreebaseQueryPanel.prototype._wireEvents = function() {
var self = this;
this._elmts.strictNamespaceInput
.suggest({ type: '/type/namespace' })
.bind("fb-select", function(e, data) {
self._panel.find('input[name="recon-dialog-strict-choice"][value="key"]').attr("checked", "true");
self._panel.find('input[name="recon-dialog-strict-namespace-choice"][value="other"]').attr("checked", "true");
});
var self = this;
this._elmts.strictNamespaceInput
.suggest({ type: '/type/namespace' })
.bind("fb-select", function(e, data) {
self._panel.find('input[name="recon-dialog-strict-choice"][value="key"]').attr("checked", "true");
self._panel.find('input[name="recon-dialog-strict-namespace-choice"][value="other"]').attr("checked", "true");
});
};
ReconFreebaseQueryPanel.prototype.start = function() {
var bodyParams;
var bodyParams;
var match = $('input[name="recon-dialog-strict-choice"]:checked')[0].value;
if (match == "key") {
var namespaceChoice = $('input[name="recon-dialog-strict-namespace-choice"]:checked')[0];
var namespace;
var match = $('input[name="recon-dialog-strict-choice"]:checked')[0].value;
if (match == "key") {
var namespaceChoice = $('input[name="recon-dialog-strict-namespace-choice"]:checked')[0];
var namespace;
if (namespaceChoice.value == "other") {
var suggest = this._elmts.strictNamespaceInput.data("data.suggest");
if (!suggest) {
alert("Please specify a namespace.");
return;
}
namespace = {
id: suggest.id,
name: suggest.name
};
} else {
namespace = {
id: namespaceChoice.value,
name: namespaceChoice.getAttribute("nsName")
};
}
bodyParams = {
columnName: this._column.name,
config: JSON.stringify({
mode: "freebase/strict",
match: "key",
namespace: namespace
})
};
} else if (match == "id") {
bodyParams = {
columnName: this._column.name,
config: JSON.stringify({
mode: "freebase/strict",
match: "id"
})
};
} else if (match == "guid") {
bodyParams = {
columnName: this._column.name,
config: JSON.stringify({
mode: "freebase/strict",
match: "guid"
})
};
if (namespaceChoice.value == "other") {
var suggest = this._elmts.strictNamespaceInput.data("data.suggest");
if (!suggest) {
alert("Please specify a namespace.");
return;
}
namespace = {
id: suggest.id,
name: suggest.name
};
} else {
namespace = {
id: namespaceChoice.value,
name: namespaceChoice.getAttribute("nsName")
};
}
Refine.postCoreProcess(
"reconcile",
{},
bodyParams,
{ cellsChanged: true, columnStatsChanged: true }
);
bodyParams = {
columnName: this._column.name,
config: JSON.stringify({
mode: "freebase/strict",
match: "key",
namespace: namespace
})
};
} else if (match == "id") {
bodyParams = {
columnName: this._column.name,
config: JSON.stringify({
mode: "freebase/strict",
match: "id"
})
};
} else if (match == "guid") {
bodyParams = {
columnName: this._column.name,
config: JSON.stringify({
mode: "freebase/strict",
match: "guid"
})
};
}
Refine.postCoreProcess(
"reconcile",
{},
bodyParams,
{ cellsChanged: true, columnStatsChanged: true }
);
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,202 +29,202 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
function ReconDialog(column, types) {
this._column = column;
this._serviceRecords = [];
this._selectedServiceRecordIndex = -1;
this._column = column;
this._serviceRecords = [];
this._selectedServiceRecordIndex = -1;
this._createDialog();
this._createDialog();
}
ReconDialog.prototype._createDialog = function() {
var self = this;
var dialog = $(DOM.loadHTML("core", "scripts/reconciliation/recon-dialog.html"));
var self = this;
var dialog = $(DOM.loadHTML("core", "scripts/reconciliation/recon-dialog.html"));
this._elmts = DOM.bind(dialog);
this._elmts.dialogHeader.text('Reconcile column "' + this._column.name + '"');
this._elmts = DOM.bind(dialog);
this._elmts.dialogHeader.text('Reconcile column "' + this._column.name + '"');
this._elmts.addStandardServiceButton.click(function() { self._onAddStandardService(); });
this._elmts.addNamespacedServiceButton.click(function() { self._onAddNamespacedService(); });
this._elmts.addStandardServiceButton.click(function() { self._onAddStandardService(); });
this._elmts.addNamespacedServiceButton.click(function() { self._onAddNamespacedService(); });
this._elmts.reconcileButton.click(function() { self._onOK(); });
this._elmts.cancelButton.click(function() { self._dismiss(); });
this._elmts.reconcileButton.click(function() { self._onOK(); });
this._elmts.cancelButton.click(function() { self._dismiss(); });
this._level = DialogSystem.showDialog(dialog);
this._populateDialog();
this._level = DialogSystem.showDialog(dialog);
this._populateDialog();
};
ReconDialog.prototype._onOK = function() {
if (this._selectedServiceRecordIndex >= 0) {
var record = this._serviceRecords[this._selectedServiceRecordIndex];
if (record.handler) {
record.handler.start();
}
if (this._selectedServiceRecordIndex >= 0) {
var record = this._serviceRecords[this._selectedServiceRecordIndex];
if (record.handler) {
record.handler.start();
}
this._dismiss();
}
this._dismiss();
};
ReconDialog.prototype._dismiss = function() {
for (var i = 0; i < this._serviceRecords.length; i++) {
var record = this._serviceRecords[i];
if (record.handler) {
record.handler.dispose();
}
for (var i = 0; i < this._serviceRecords.length; i++) {
var record = this._serviceRecords[i];
if (record.handler) {
record.handler.dispose();
}
this._serviceRecords = null;
}
this._serviceRecords = null;
DialogSystem.dismissUntil(this._level - 1);
DialogSystem.dismissUntil(this._level - 1);
};
ReconDialog.prototype._cleanDialog = function() {
for (var i = 0; i < this._serviceRecords.length; i++) {
var record = this._serviceRecords[i];
if (record.handler) {
record.handler.deactivate();
}
record.selector.remove();
for (var i = 0; i < this._serviceRecords.length; i++) {
var record = this._serviceRecords[i];
if (record.handler) {
record.handler.deactivate();
}
this._serviceRecords = [];
this._selectedServiceRecordIndex = -1;
record.selector.remove();
}
this._serviceRecords = [];
this._selectedServiceRecordIndex = -1;
};
ReconDialog.prototype._populateDialog = function() {
var self = this;
var self = this;
var services = ReconciliationManager.getAllServices();
if (services.length > 0) {
var renderService = function(service) {
var record = {
service: service,
handler: null
};
var services = ReconciliationManager.getAllServices();
if (services.length > 0) {
var renderService = function(service) {
var record = {
service: service,
handler: null
};
record.selector = $('<a>')
.attr("href", "javascript:{}")
.addClass("recon-dialog-service-selector")
.text(service.name)
.appendTo(self._elmts.serviceList)
.click(function() {
self._selectService(record);
});
record.selector = $('<a>')
.attr("href", "javascript:{}")
.addClass("recon-dialog-service-selector")
.text(service.name)
.appendTo(self._elmts.serviceList)
.click(function() {
self._selectService(record);
});
$('<a>')
.html("&nbsp;")
.addClass("recon-dialog-service-selector-remove")
.prependTo(record.selector)
.click(function() {
ReconciliationManager.unregisterService(service, function() {
self._refresh(-1);
});
});
$('<a>')
.html("&nbsp;")
.addClass("recon-dialog-service-selector-remove")
.prependTo(record.selector)
.click(function() {
ReconciliationManager.unregisterService(service, function() {
self._refresh(-1);
});
});
self._serviceRecords.push(record);
};
self._serviceRecords.push(record);
};
for (var i = 0; i < services.length; i++) {
renderService(services[i]);
}
for (var i = 0; i < services.length; i++) {
renderService(services[i]);
}
}
};
ReconDialog.prototype._selectService = function(record) {
for (var i = 0; i < this._serviceRecords.length; i++) {
if (record === this._serviceRecords[i]) {
if (i !== this._selectedServiceRecordIndex) {
if (this._selectedServiceRecordIndex >= 0) {
var oldRecord = this._serviceRecords[this._selectedServiceRecordIndex];
if (oldRecord.handler) {
oldRecord.selector.removeClass("selected");
oldRecord.handler.deactivate();
}
}
this._elmts.servicePanelMessage.hide();
record.selector.addClass("selected");
if (record.handler) {
record.handler.activate();
} else {
var handlerConstructor = eval(record.service.ui.handler);
record.handler = new handlerConstructor(
this._column, record.service, this._elmts.servicePanelContainer);
}
this._selectedServiceRecordIndex = i;
return;
}
for (var i = 0; i < this._serviceRecords.length; i++) {
if (record === this._serviceRecords[i]) {
if (i !== this._selectedServiceRecordIndex) {
if (this._selectedServiceRecordIndex >= 0) {
var oldRecord = this._serviceRecords[this._selectedServiceRecordIndex];
if (oldRecord.handler) {
oldRecord.selector.removeClass("selected");
oldRecord.handler.deactivate();
}
}
this._elmts.servicePanelMessage.hide();
record.selector.addClass("selected");
if (record.handler) {
record.handler.activate();
} else {
var handlerConstructor = eval(record.service.ui.handler);
record.handler = new handlerConstructor(
this._column, record.service, this._elmts.servicePanelContainer);
}
this._selectedServiceRecordIndex = i;
return;
}
}
}
};
ReconDialog.prototype._refresh = function(newSelectIndex) {
this._cleanDialog();
this._populateDialog();
if (newSelectIndex >= 0) {
this._selectService(this._serviceRecords[newSelectIndex]);
}
this._cleanDialog();
this._populateDialog();
if (newSelectIndex >= 0) {
this._selectService(this._serviceRecords[newSelectIndex]);
}
};
ReconDialog.prototype._onAddStandardService = function() {
var self = this;
var dialog = $(DOM.loadHTML("core", "scripts/reconciliation/add-standard-service-dialog.html"));
var elmts = DOM.bind(dialog);
var self = this;
var dialog = $(DOM.loadHTML("core", "scripts/reconciliation/add-standard-service-dialog.html"));
var elmts = DOM.bind(dialog);
var level = DialogSystem.showDialog(dialog);
var dismiss = function() {
DialogSystem.dismissUntil(level - 1);
};
var level = DialogSystem.showDialog(dialog);
var dismiss = function() {
DialogSystem.dismissUntil(level - 1);
};
elmts.cancelButton.click(dismiss);
elmts.addButton.click(function() {
var url = $.trim(elmts.input[0].value);
if (url.length > 0) {
ReconciliationManager.registerStandardService(url, function(index) {
self._refresh(index);
});
}
dismiss();
});
elmts.input.focus().select();
elmts.cancelButton.click(dismiss);
elmts.addButton.click(function() {
var url = $.trim(elmts.input[0].value);
if (url.length > 0) {
ReconciliationManager.registerStandardService(url, function(index) {
self._refresh(index);
});
}
dismiss();
});
elmts.input.focus().select();
};
ReconDialog.prototype._onAddNamespacedService = function() {
var self = this;
var dialog = $(DOM.loadHTML("core", "scripts/reconciliation/add-namespaced-service-dialog.html"));
var elmts = DOM.bind(dialog);
var self = this;
var dialog = $(DOM.loadHTML("core", "scripts/reconciliation/add-namespaced-service-dialog.html"));
var elmts = DOM.bind(dialog);
var level = DialogSystem.showDialog(dialog);
var dismiss = function() {
DialogSystem.dismissUntil(level - 1);
};
var level = DialogSystem.showDialog(dialog);
var dismiss = function() {
DialogSystem.dismissUntil(level - 1);
};
elmts.namespaceInput
.suggest({ type: '/type/namespace' })
.bind("fb-select", function(e, data) {
elmts.typeInput.focus();
});
elmts.namespaceInput
.suggest({ type: '/type/namespace' })
.bind("fb-select", function(e, data) {
elmts.typeInput.focus();
});
elmts.typeInput.suggestT({ type: '/type/type' });
elmts.typeInput.suggestT({ type: '/type/type' });
elmts.cancelButton.click(dismiss);
elmts.addButton.click(function() {
var namespaceData = elmts.namespaceInput.data("data.suggest");
var typeData = elmts.typeInput.data("data.suggest");
if (namespaceData) {
var url = "http://4.standard-reconcile.dfhuynh.user.dev.freebaseapps.com/namespace_reconcile?namespace=" +
escape(namespaceData.id);
if (typeData) {
url += "&type=" + typeData.id;
}
elmts.cancelButton.click(dismiss);
elmts.addButton.click(function() {
var namespaceData = elmts.namespaceInput.data("data.suggest");
var typeData = elmts.typeInput.data("data.suggest");
if (namespaceData) {
var url = "http://4.standard-reconcile.dfhuynh.user.dev.freebaseapps.com/namespace_reconcile?namespace=" +
escape(namespaceData.id);
if (typeData) {
url += "&type=" + typeData.id;
}
ReconciliationManager.registerStandardService(url, function(index) {
self._refresh(index);
});
}
dismiss();
});
elmts.namespaceInput.focus().data("suggest").textchange();
ReconciliationManager.registerStandardService(url, function(index) {
self._refresh(index);
});
}
dismiss();
});
elmts.namespaceInput.focus().data("suggest").textchange();
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,130 +29,130 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
var ReconciliationManager = {
customServices : [], // services registered by core and extensions
standardServices : [], // services registered by user
_urlMap : {}
customServices : [], // services registered by core and extensions
standardServices : [], // services registered by user
_urlMap : {}
};
ReconciliationManager.isFreebaseId = function(s) {
return s == "http://rdf.freebase.com/ns/type.object.id";
return s == "http://rdf.freebase.com/ns/type.object.id";
};
ReconciliationManager.isFreebaseMid = function(s) {
return s == "http://rdf.freebase.com/ns/type.object.mid";
return s == "http://rdf.freebase.com/ns/type.object.mid";
};
ReconciliationManager.isFreebaseIdOrMid = function(s) {
return ReconciliationManager.isFreebaseMid(s) || ReconciliationManager.isFreebaseId(s);
return ReconciliationManager.isFreebaseMid(s) || ReconciliationManager.isFreebaseId(s);
};
ReconciliationManager._rebuildMap = function() {
var map = {};
$.each(ReconciliationManager.getAllServices(), function(i, service) {
if ("url" in service) {
map[service.url] = service;
}
});
ReconciliationManager._urlMap = map;
var map = {};
$.each(ReconciliationManager.getAllServices(), function(i, service) {
if ("url" in service) {
map[service.url] = service;
}
});
ReconciliationManager._urlMap = map;
};
ReconciliationManager.getServiceFromUrl = function(url) {
return ReconciliationManager._urlMap[url];
return ReconciliationManager._urlMap[url];
};
ReconciliationManager.getAllServices = function() {
return ReconciliationManager.customServices.concat(ReconciliationManager.standardServices);
return ReconciliationManager.customServices.concat(ReconciliationManager.standardServices);
};
ReconciliationManager.registerService = function(service) {
ReconciliationManager.customServices.push(service);
ReconciliationManager._rebuildMap();
ReconciliationManager.customServices.push(service);
ReconciliationManager._rebuildMap();
return ReconciliationManager.customServices.length - 1;
return ReconciliationManager.customServices.length - 1;
};
ReconciliationManager.registerStandardService = function(url, f) {
var dismissBusy = DialogSystem.showBusy();
var dismissBusy = DialogSystem.showBusy();
$.getJSON(
url + (url.contains("?") ? "&" : "?") + "callback=?",
null,
function(data) {
data.url = url;
data.ui = { "handler" : "ReconStandardServicePanel" };
$.getJSON(
url + (url.contains("?") ? "&" : "?") + "callback=?",
null,
function(data) {
data.url = url;
data.ui = { "handler" : "ReconStandardServicePanel" };
index = ReconciliationManager.customServices.length +
ReconciliationManager.standardServices.length;
index = ReconciliationManager.customServices.length +
ReconciliationManager.standardServices.length;
ReconciliationManager.standardServices.push(data);
ReconciliationManager._rebuildMap();
ReconciliationManager.standardServices.push(data);
ReconciliationManager._rebuildMap();
ReconciliationManager.save();
ReconciliationManager.save();
dismissBusy();
dismissBusy();
if (f) {
f(index);
}
},
"jsonp"
);
if (f) {
f(index);
}
},
"jsonp"
);
};
ReconciliationManager.unregisterService = function(service, f) {
for (var i = 0; i < ReconciliationManager.customServices.length; i++) {
if (ReconciliationManager.customServices[i] === service) {
ReconciliationManager.customServices.splice(i, 1);
break;
}
for (var i = 0; i < ReconciliationManager.customServices.length; i++) {
if (ReconciliationManager.customServices[i] === service) {
ReconciliationManager.customServices.splice(i, 1);
break;
}
for (var i = 0; i < ReconciliationManager.standardServices.length; i++) {
if (ReconciliationManager.standardServices[i] === service) {
ReconciliationManager.standardServices.splice(i, 1);
break;
}
}
for (var i = 0; i < ReconciliationManager.standardServices.length; i++) {
if (ReconciliationManager.standardServices[i] === service) {
ReconciliationManager.standardServices.splice(i, 1);
break;
}
ReconciliationManager.save(f);
}
ReconciliationManager.save(f);
};
ReconciliationManager.save = function(f) {
$.ajax({
async: false,
type: "POST",
url: "/command/core/set-preference?" + $.param({
name: "reconciliation.standardServices"
}),
data: { "value" : JSON.stringify(ReconciliationManager.standardServices) },
success: function(data) {
if (f) { f(); }
},
dataType: "json"
});
$.ajax({
async: false,
type: "POST",
url: "/command/core/set-preference?" + $.param({
name: "reconciliation.standardServices"
}),
data: { "value" : JSON.stringify(ReconciliationManager.standardServices) },
success: function(data) {
if (f) { f(); }
},
dataType: "json"
});
};
(function() {
ReconciliationManager.customServices.push({
"name" : "Freebase Query-based Reconciliation",
"ui" : { "handler" : "ReconFreebaseQueryPanel" }
});
ReconciliationManager.customServices.push({
"name" : "Freebase Query-based Reconciliation",
"ui" : { "handler" : "ReconFreebaseQueryPanel" }
});
$.ajax({
async: false,
url: "/command/core/get-preference?" + $.param({
name: "reconciliation.standardServices"
}),
success: function(data) {
if (data.value && data.value != "null") {
ReconciliationManager.standardServices = JSON.parse(data.value);
ReconciliationManager._rebuildMap();
} else {
ReconciliationManager.registerStandardService(
"http://4.standard-reconcile.dfhuynh.user.dev.freebaseapps.com/reconcile");
}
},
dataType: "json"
});
$.ajax({
async: false,
url: "/command/core/get-preference?" + $.param({
name: "reconciliation.standardServices"
}),
success: function(data) {
if (data.value && data.value != "null") {
ReconciliationManager.standardServices = JSON.parse(data.value);
ReconciliationManager._rebuildMap();
} else {
ReconciliationManager.registerStandardService(
"http://4.standard-reconcile.dfhuynh.user.dev.freebaseapps.com/reconcile");
}
},
dataType: "json"
});
})();

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,298 +29,298 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
function ReconStandardServicePanel(column, service, container) {
this._column = column;
this._service = service;
this._container = container;
this._types = [];
this._column = column;
this._service = service;
this._container = container;
this._types = [];
this._constructUI();
this._constructUI();
}
ReconStandardServicePanel.prototype._guessTypes = function(f) {
var self = this;
var dismissBusy = DialogSystem.showBusy();
var self = this;
var dismissBusy = DialogSystem.showBusy();
$.post(
"/command/core/guess-types-of-column?" + $.param({
project: theProject.id,
columnName: this._column.name,
service: this._service.url
}),
null,
function(data) {
self._types = data.types;
$.post(
"/command/core/guess-types-of-column?" + $.param({
project: theProject.id,
columnName: this._column.name,
service: this._service.url
}),
null,
function(data) {
self._types = data.types;
if (self._types.length === 0 && "defaultTypes" in self._service) {
var defaultTypes = {};
$.each(self._service["defaultTypes"], function() {
defaultTypes[this.id] = this.name;
});
$.each(self._types, function() {
delete defaultTypes[typeof this == "string" ? this : this.id];
});
for (var id in defaultTypes) {
if (defaultTypes.hasOwnProperty(id)) {
self._types.push({
id: id,
name: defaultTypes[id].name
});
}
}
}
dismissBusy();
f();
if (self._types.length === 0 && "defaultTypes" in self._service) {
var defaultTypes = {};
$.each(self._service["defaultTypes"], function() {
defaultTypes[this.id] = this.name;
});
$.each(self._types, function() {
delete defaultTypes[typeof this == "string" ? this : this.id];
});
for (var id in defaultTypes) {
if (defaultTypes.hasOwnProperty(id)) {
self._types.push({
id: id,
name: defaultTypes[id].name
});
}
}
);
}
dismissBusy();
f();
}
);
};
ReconStandardServicePanel.prototype._constructUI = function() {
var self = this;
this._panel = $(DOM.loadHTML("core", "scripts/reconciliation/standard-service-panel.html")).appendTo(this._container);
this._elmts = DOM.bind(this._panel);
var self = this;
this._panel = $(DOM.loadHTML("core", "scripts/reconciliation/standard-service-panel.html")).appendTo(this._container);
this._elmts = DOM.bind(this._panel);
this._elmts.rawServiceLink.attr("href", this._service.url);
this._elmts.rawServiceLink.attr("href", this._service.url);
this._guessTypes(function() {
self._populatePanel();
self._wireEvents();
});
this._guessTypes(function() {
self._populatePanel();
self._wireEvents();
});
};
ReconStandardServicePanel.prototype.activate = function() {
this._panel.show();
this._panel.show();
};
ReconStandardServicePanel.prototype.deactivate = function() {
this._panel.hide();
this._panel.hide();
};
ReconStandardServicePanel.prototype.dispose = function() {
this._panel.remove();
this._panel = null;
this._panel.remove();
this._panel = null;
this._column = null;
this._service = null;
this._container = null;
this._column = null;
this._service = null;
this._container = null;
};
ReconStandardServicePanel.prototype._populatePanel = function() {
var self = this;
var self = this;
/*
* Populate types
*/
if (this._types.length > 0) {
var typeTableContainer = $('<div>')
.addClass("grid-layout layout-tightest")
.appendTo(this._elmts.typeContainer);
/*
* Populate types
*/
if (this._types.length > 0) {
var typeTableContainer = $('<div>')
.addClass("grid-layout layout-tightest")
.appendTo(this._elmts.typeContainer);
var typeTable = $('<table></table>').appendTo(typeTableContainer)[0];
var typeTable = $('<table></table>').appendTo(typeTableContainer)[0];
var createTypeChoice = function(type, check) {
var typeID = typeof type == "string" ? type : type.id;
var typeName = typeof type == "string" ? type : (type.name || type.id);
var createTypeChoice = function(type, check) {
var typeID = typeof type == "string" ? type : type.id;
var typeName = typeof type == "string" ? type : (type.name || type.id);
var tr = typeTable.insertRow(typeTable.rows.length);
var td0 = tr.insertCell(0);
var td1 = tr.insertCell(1);
var tr = typeTable.insertRow(typeTable.rows.length);
var td0 = tr.insertCell(0);
var td1 = tr.insertCell(1);
td0.width = "1%";
var radio = $('<input type="radio" name="type-choice">')
.attr("value", typeID)
.attr("typeName", typeName)
.appendTo(td0)
.click(function() {
self._rewirePropertySuggests(this.value);
});
td0.width = "1%";
var radio = $('<input type="radio" name="type-choice">')
.attr("value", typeID)
.attr("typeName", typeName)
.appendTo(td0)
.click(function() {
self._rewirePropertySuggests(this.value);
});
if (check) {
radio.attr("checked", "true");
}
if (check) {
radio.attr("checked", "true");
}
if (typeName == typeID) {
$(td1).html(typeName);
} else {
$(td1).html(
typeName +
'<br/>' +
'<span class="type-id">' + typeID + '</span>');
}
};
for (var i = 0; i < this._types.length; i++) {
createTypeChoice(this._types[i], i === 0);
}
} else {
$('<div>')
.addClass("recon-dialog-standard-service-panel-message")
.text("Sorry, we can't suggest any type for your data. Please specify a type yourself below.")
.appendTo(this._elmts.typeContainer);
this._panel
.find('input[name="type-choice"][value=""]')
.attr("checked", "true");
this._elmts.typeInput.focus();
if (typeName == typeID) {
$(td1).html(typeName);
} else {
$(td1).html(
typeName +
'<br/>' +
'<span class="type-id">' + typeID + '</span>');
}
};
for (var i = 0; i < this._types.length; i++) {
createTypeChoice(this._types[i], i === 0);
}
} else {
$('<div>')
.addClass("recon-dialog-standard-service-panel-message")
.text("Sorry, we can't suggest any type for your data. Please specify a type yourself below.")
.appendTo(this._elmts.typeContainer);
/*
* Populate properties
*/
var detailTableContainer = $('<div>')
.addClass("grid-layout layout-tightest")
.appendTo(this._elmts.detailContainer);
this._panel
.find('input[name="type-choice"][value=""]')
.attr("checked", "true");
var detailTable = $(
'<table>' +
'<tr><th>Column</th><th>Include?</th><th>As Property</th></tr>' +
'</table>'
).appendTo(detailTableContainer)[0];
this._elmts.typeInput.focus();
}
function renderDetailColumn(column) {
var tr = detailTable.insertRow(detailTable.rows.length);
var td0 = tr.insertCell(0);
var td1 = tr.insertCell(1);
var td2 = tr.insertCell(2);
/*
* Populate properties
*/
var detailTableContainer = $('<div>')
.addClass("grid-layout layout-tightest")
.appendTo(this._elmts.detailContainer);
$(td0).html(column.name);
$('<input type="checkbox" />')
.attr("columnName", column.name)
.appendTo(td1);
$('<input size="25" name="property" />')
.attr("columnName", column.name)
.appendTo(td2);
}
var columns = theProject.columnModel.columns;
for (var i = 0; i < columns.length; i++) {
var column = columns[i];
if (column !== this._column) {
renderDetailColumn(column);
}
var detailTable = $(
'<table>' +
'<tr><th>Column</th><th>Include?</th><th>As Property</th></tr>' +
'</table>'
).appendTo(detailTableContainer)[0];
function renderDetailColumn(column) {
var tr = detailTable.insertRow(detailTable.rows.length);
var td0 = tr.insertCell(0);
var td1 = tr.insertCell(1);
var td2 = tr.insertCell(2);
$(td0).html(column.name);
$('<input type="checkbox" />')
.attr("columnName", column.name)
.appendTo(td1);
$('<input size="25" name="property" />')
.attr("columnName", column.name)
.appendTo(td2);
}
var columns = theProject.columnModel.columns;
for (var i = 0; i < columns.length; i++) {
var column = columns[i];
if (column !== this._column) {
renderDetailColumn(column);
}
}
};
ReconStandardServicePanel.prototype._wireEvents = function() {
var self = this;
var input = this._elmts.typeInput.unbind();
var self = this;
var input = this._elmts.typeInput.unbind();
if ("suggest" in this._service && "type" in this._service.suggest) {
var suggestOptions = $.extend({}, this._service.suggest.type);
input.suggestT(suggestOptions);
} else if (this._isInFreebaseSchemaSpace()) {
input.suggestT({ type : '/type/type' });
}
if ("suggest" in this._service && "type" in this._service.suggest) {
var suggestOptions = $.extend({}, this._service.suggest.type);
input.suggestT(suggestOptions);
} else if (this._isInFreebaseSchemaSpace()) {
input.suggestT({ type : '/type/type' });
}
input.bind("fb-select", function(e, data) {
self._panel
.find('input[name="type-choice"][value=""]')
.attr("checked", "true");
input.bind("fb-select", function(e, data) {
self._panel
.find('input[name="type-choice"][value=""]')
.attr("checked", "true");
self._rewirePropertySuggests(data.id);
});
self._rewirePropertySuggests(data.id);
});
this._rewirePropertySuggests((this._types.length > 0) ? this._types[0] : null);
this._rewirePropertySuggests((this._types.length > 0) ? this._types[0] : null);
};
ReconStandardServicePanel.prototype._rewirePropertySuggests = function(type) {
var inputs = this._panel
.find('input[name="property"]')
.unbind();
var inputs = this._panel
.find('input[name="property"]')
.unbind();
if ("suggest" in this._service && "property" in this._service.suggest) {
var suggestOptions = $.extend({}, this._service.suggest.property);
if (type) {
suggestOptions.ac_param = { schema: typeof type == "string" ? type : type.id };
}
inputs.suggestP(suggestOptions);
} else if (this._isInFreebaseSchemaSpace()) {
inputs.suggestP({
type: '/type/property',
ac_param: {
schema: (type) ? (typeof type == "string" ? type : type.id) : "/common/topic"
}
});
if ("suggest" in this._service && "property" in this._service.suggest) {
var suggestOptions = $.extend({}, this._service.suggest.property);
if (type) {
suggestOptions.ac_param = { schema: typeof type == "string" ? type : type.id };
}
inputs.suggestP(suggestOptions);
} else if (this._isInFreebaseSchemaSpace()) {
inputs.suggestP({
type: '/type/property',
ac_param: {
schema: (type) ? (typeof type == "string" ? type : type.id) : "/common/topic"
}
});
}
};
ReconStandardServicePanel.prototype._isInFreebaseIdentifierSpace = function() {
return ReconciliationManager.isFreebaseIdOrMid(this._service.identifierSpace);
return ReconciliationManager.isFreebaseIdOrMid(this._service.identifierSpace);
};
ReconStandardServicePanel.prototype._isInFreebaseSchemaSpace = function() {
return ReconciliationManager.isFreebaseId(this._service.schemaSpace);
return ReconciliationManager.isFreebaseId(this._service.schemaSpace);
};
ReconStandardServicePanel.prototype.start = function() {
var self = this;
var self = this;
var type = this._elmts.typeInput.data("data.suggest");
if (!(type)) {
type = {
id: this._elmts.typeInput[0].value,
name: this._elmts.typeInput[0].value
};
var type = this._elmts.typeInput.data("data.suggest");
if (!(type)) {
type = {
id: this._elmts.typeInput[0].value,
name: this._elmts.typeInput[0].value
};
}
var choices = this._panel.find('input[name="type-choice"]:checked');
if (choices !== null && choices.length > 0) {
if (choices[0].value == '-') {
type = null;
} else if (choices[0].value != "") {
type = {
id: choices[0].value,
name: choices.attr("typeName")
};
}
}
var choices = this._panel.find('input[name="type-choice"]:checked');
if (choices !== null && choices.length > 0) {
if (choices[0].value == '-') {
type = null;
} else if (choices[0].value != "") {
type = {
id: choices[0].value,
name: choices.attr("typeName")
};
}
}
var columnDetails = [];
$.each(
this._panel.find('input[name="property"]'),
function() {
var property = $(this).data("data.suggest");
if (property && property.id) {
columnDetails.push({
column: this.getAttribute("columnName"),
property: {
id: property.id,
name: property.name
}
});
} else {
var property = $.trim(this.value);
if (property) {
columnDetails.push({
column: this.getAttribute("columnName"),
property: {
id: property,
name: property
}
});
}
var columnDetails = [];
$.each(
this._panel.find('input[name="property"]'),
function() {
var property = $(this).data("data.suggest");
if (property && property.id) {
columnDetails.push({
column: this.getAttribute("columnName"),
property: {
id: property.id,
name: property.name
}
});
} else {
var property = $.trim(this.value);
if (property) {
columnDetails.push({
column: this.getAttribute("columnName"),
property: {
id: property,
name: property
}
});
}
);
}
}
);
Refine.postCoreProcess(
"reconcile",
{},
{
columnName: this._column.name,
config: JSON.stringify({
mode: "standard-service",
service: this._service.url,
identifierSpace: this._service.identifierSpace,
schemaSpace: this._service.schemaSpace,
type: (type) ? { id: type.id, name: type.name } : null,
autoMatch: this._elmts.automatchCheck[0].checked,
columnDetails: columnDetails
})
},
{ cellsChanged: true, columnStatsChanged: true }
);
Refine.postCoreProcess(
"reconcile",
{},
{
columnName: this._column.name,
config: JSON.stringify({
mode: "standard-service",
service: this._service.url,
identifierSpace: this._service.identifierSpace,
schemaSpace: this._service.schemaSpace,
type: (type) ? { id: type.id, name: type.name } : null,
autoMatch: this._elmts.automatchCheck[0].checked,
columnDetails: columnDetails
})
},
{ cellsChanged: true, columnStatsChanged: true }
);
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,27 +29,27 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
Ajax = {};
Ajax.chainGetJSON = function() {
var a = arguments;
var i = 0;
var next = function() {
if (i <= a.length - 3) {
var url = a[i++];
var data = a[i++];
var callback = a[i++];
var a = arguments;
var i = 0;
var next = function() {
if (i <= a.length - 3) {
var url = a[i++];
var data = a[i++];
var callback = a[i++];
$.getJSON(url, data, function(o) {
callback(o);
next();
}, "json");
} else if (i < a.length) {
var finalCallback = a[i++];
finalCallback();
}
};
next();
$.getJSON(url, data, function(o) {
callback(o);
next();
}, "json");
} else if (i < a.length) {
var finalCallback = a[i++];
finalCallback();
}
};
next();
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,21 +29,21 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
(function() {
/*
* Make suggest widgets clean up when removed.
*/
var oldInit = $.suggest.suggest.prototype._init;
$.suggest.suggest.prototype._init = function() {
oldInit.call(this);
/*
* Make suggest widgets clean up when removed.
*/
var oldInit = $.suggest.suggest.prototype._init;
$.suggest.suggest.prototype._init = function() {
oldInit.call(this);
var self = this;
this.input.bind("remove", function() {
self._destroy();
});
};
var self = this;
this.input.bind("remove", function() {
self._destroy();
});
};
/*
* Property suggest
@ -56,26 +56,26 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
$.suggest.suggest.prototype,
{
create_item: function(data, response_data) {
var css = this.options.css;
var css = this.options.css;
var li = $("<li>").addClass(css.item);
var li = $("<li>").addClass(css.item);
var name = $("<div>")
.addClass(css.item_name)
.append(
$("<label>").append(
$.suggest.strongify(
data.name || data.guid, response_data.prefix
)
)
);
var name = $("<div>")
.addClass(css.item_name)
.append(
$("<label>").append(
$.suggest.strongify(
data.name || data.guid, response_data.prefix
)
)
);
data.name = name.text(); // this converts html escaped strings like "&amp;" back to "&"
li.append(name);
data.name = name.text(); // this converts html escaped strings like "&amp;" back to "&"
li.append(name);
name.prepend($("<div>").addClass(css.item_type).text(data.id));
name.prepend($("<div>").addClass(css.item_type).text(data.id));
return li;
return li;
}
}
)
@ -83,14 +83,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
var originalSuggestP = $.suggest.suggestP;
$.suggest.suggestP = function(input, options) {
originalSuggestP.call(this, input, options);
originalSuggestP.call(this, input, options);
if ("ac_param" in options) {
var ac_param = options.ac_param;
if ("schema" in ac_param) {
this.options.ac_param.schema = ac_param.schema;
}
if ("ac_param" in options) {
var ac_param = options.ac_param;
if ("schema" in ac_param) {
this.options.ac_param.schema = ac_param.schema;
}
}
};
$.suggest.suggestP.prototype = originalSuggestP.prototype;
@ -101,10 +101,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
true,
{},
$.suggest.suggest.defaults, {
service_url: Refine.refineHelperService,
service_path: "/suggest_property",
flyout_service_url: "http://www.freebase.com",
css: { pane: "fbs-pane fbs-pane-property" }
service_url: Refine.refineHelperService,
service_path: "/suggest_property",
flyout_service_url: "http://www.freebase.com",
css: { pane: "fbs-pane fbs-pane-property" }
}
)
}
@ -121,22 +121,22 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
$.suggest.suggest.prototype,
{
create_item: function(data, response_data) {
var css = this.options.css;
var css = this.options.css;
var li = $("<li>").addClass(css.item);
var li = $("<li>").addClass(css.item);
var name = $("<div>")
.addClass(css.item_name)
.append(
$("<label>")
.append($.suggest.strongify(data.name || data.guid, response_data.prefix)));
var name = $("<div>")
.addClass(css.item_name)
.append(
$("<label>")
.append($.suggest.strongify(data.name || data.guid, response_data.prefix)));
data.name = name.text(); // this converts html escaped strings like "&amp;" back to "&"
li.append(name);
data.name = name.text(); // this converts html escaped strings like "&amp;" back to "&"
li.append(name);
name.prepend($("<div>").addClass(css.item_type).text(data.id));
name.prepend($("<div>").addClass(css.item_type).text(data.id));
return li;
return li;
}
}
)
@ -149,7 +149,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
true,
{},
$.suggest.suggest.defaults, {
css: { pane: "fbs-pane fbs-pane-type" }
css: { pane: "fbs-pane fbs-pane-type" }
}
)
}

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,95 +29,95 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
DialogSystem = {
_layers: []
};
DialogSystem.showDialog = function(elmt, onCancel) {
var overlay = $('<div>&nbsp;</div>')
.addClass("dialog-overlay")
.css("z-index", 101 + DialogSystem._layers.length * 2)
.appendTo(document.body);
var overlay = $('<div>&nbsp;</div>')
.addClass("dialog-overlay")
.css("z-index", 101 + DialogSystem._layers.length * 2)
.appendTo(document.body);
var container = $('<div></div>')
.addClass("dialog-container")
.css("z-index", 102 + DialogSystem._layers.length * 2)
.appendTo(document.body);
var container = $('<div></div>')
.addClass("dialog-container")
.css("z-index", 102 + DialogSystem._layers.length * 2)
.appendTo(document.body);
elmt.css("visibility", "hidden").appendTo(container);
container.css("top", Math.round((overlay.height() - elmt.height()) / 2) + "px");
elmt.css("visibility", "visible");
elmt.css("visibility", "hidden").appendTo(container);
container.css("top", Math.round((overlay.height() - elmt.height()) / 2) + "px");
elmt.css("visibility", "visible");
container.draggable({ handle: '.dialog-header', cursor: 'move' });
container.draggable({ handle: '.dialog-header', cursor: 'move' });
var layer = {
overlay: overlay,
container: container,
onCancel: onCancel
};
DialogSystem._layers.push(layer);
var layer = {
overlay: overlay,
container: container,
onCancel: onCancel
};
DialogSystem._layers.push(layer);
var level = DialogSystem._layers.length;
var level = DialogSystem._layers.length;
layer.keyHandler = function(evt) {
if (evt.keyCode == 27 && !evt.shiftKey && !evt.metaKey && !evt.altKey && !evt.ctrlKey &&
evt.target.tagName.toLowerCase() != "input" &&
evt.target.tagName.toLowerCase() != "textarea") {
layer.keyHandler = function(evt) {
if (evt.keyCode == 27 && !evt.shiftKey && !evt.metaKey && !evt.altKey && !evt.ctrlKey &&
evt.target.tagName.toLowerCase() != "input" &&
evt.target.tagName.toLowerCase() != "textarea") {
DialogSystem.dismissUntil(level - 1);
evt.stopImmediatePropagation();
evt.stopPropagation();
evt.preventDefault();
return false;
}
};
$(document).stack("keydown", layer.keyHandler);
DialogSystem.dismissUntil(level - 1);
evt.stopImmediatePropagation();
evt.stopPropagation();
evt.preventDefault();
return false;
}
};
$(document).stack("keydown", layer.keyHandler);
return level;
return level;
};
DialogSystem.dismissAll = function() {
DialogSystem.dismissUntil(0);
DialogSystem.dismissUntil(0);
};
DialogSystem.dismissUntil = function(level) {
for (var i = DialogSystem._layers.length - 1; i >= level; i--) {
var layer = DialogSystem._layers[i];
for (var i = DialogSystem._layers.length - 1; i >= level; i--) {
var layer = DialogSystem._layers[i];
$(document).unbind("keydown", layer.keyHandler);
$(document).unbind("keydown", layer.keyHandler);
layer.overlay.remove();
layer.container.remove();
layer.container.unbind();
layer.overlay.remove();
layer.container.remove();
layer.container.unbind();
if (layer.onCancel) {
try {
layer.onCancel();
} catch (e) {
Refine.reportException(e);
}
}
if (layer.onCancel) {
try {
layer.onCancel();
} catch (e) {
Refine.reportException(e);
}
}
DialogSystem._layers = DialogSystem._layers.slice(0, level);
}
DialogSystem._layers = DialogSystem._layers.slice(0, level);
};
DialogSystem.createDialog = function() {
return $('<div></div>').addClass("dialog-frame");
return $('<div></div>').addClass("dialog-frame");
};
DialogSystem.showBusy = function(message) {
var frame = DialogSystem.createDialog();
frame.addClass("dialog-busy");
var frame = DialogSystem.createDialog();
frame.addClass("dialog-busy");
var body = $('<div>').attr('id', 'loading-message').appendTo(frame);
$('<img>').attr("src", "images/large-spinner.gif").appendTo(body);
$('<span>').text(" " + (message || "Working...")).appendTo(body);
var body = $('<div>').attr('id', 'loading-message').appendTo(frame);
$('<img>').attr("src", "images/large-spinner.gif").appendTo(body);
$('<span>').text(" " + (message || "Working...")).appendTo(body);
var level = DialogSystem.showDialog(frame);
var level = DialogSystem.showDialog(frame);
return function() {
DialogSystem.dismissUntil(level - 1);
};
return function() {
DialogSystem.dismissUntil(level - 1);
};
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,62 +29,62 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
var DOM = {};
DOM.bind = function(elmt) {
var map = {};
var map = {};
for (var i = 0; i < elmt.length; i++) {
DOM._bindDOMElement(elmt[i], map);
}
for (var i = 0; i < elmt.length; i++) {
DOM._bindDOMElement(elmt[i], map);
}
return map;
return map;
};
DOM._bindDOMElement = function(elmt, map) {
var bind = elmt.getAttribute("bind");
if (bind !== null && bind.length > 0) {
map[bind] = $(elmt);
}
var bind = elmt.getAttribute("bind");
if (bind !== null && bind.length > 0) {
map[bind] = $(elmt);
}
if (elmt.hasChildNodes()) {
DOM._bindDOMChildren(elmt, map);
}
if (elmt.hasChildNodes()) {
DOM._bindDOMChildren(elmt, map);
}
};
DOM._bindDOMChildren = function(elmt, map) {
var node = elmt.firstChild;
while (node !== null) {
var node2 = node.nextSibling;
if (node.nodeType == 1) {
DOM._bindDOMElement(node, map);
}
node = node2;
var node = elmt.firstChild;
while (node !== null) {
var node2 = node.nextSibling;
if (node.nodeType == 1) {
DOM._bindDOMElement(node, map);
}
node = node2;
}
};
DOM._loadedHTML = {};
DOM.loadHTML = function(module, path) {
var fullPath = ModuleWirings[module] + path;
if (!(fullPath in DOM._loadedHTML)) {
$.ajax({
async: false,
url: fullPath,
dataType: "html",
success: function(html) {
DOM._loadedHTML[fullPath] = html;
}
})
}
return DOM._loadedHTML[fullPath];
var fullPath = ModuleWirings[module] + path;
if (!(fullPath in DOM._loadedHTML)) {
$.ajax({
async: false,
url: fullPath,
dataType: "html",
success: function(html) {
DOM._loadedHTML[fullPath] = html;
}
})
}
return DOM._loadedHTML[fullPath];
};
DOM.getHPaddings = function(elmt) {
return elmt.outerWidth() - elmt.width();
return elmt.outerWidth() - elmt.width();
};
DOM.getVPaddings = function(elmt) {
return elmt.outerHeight() - elmt.height();
return elmt.outerHeight() - elmt.height();
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,264 +29,264 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
MenuSystem = {
_layers: [],
_overlay: null
_layers: [],
_overlay: null
};
MenuSystem.showMenu = function(elmt, onDismiss) {
if (!MenuSystem._overlay) {
MenuSystem._overlay = $('<div>&nbsp;</div>')
.addClass("menu-overlay")
.appendTo(document.body)
.click(MenuSystem.dismissAll);
if (!MenuSystem._overlay) {
MenuSystem._overlay = $('<div>&nbsp;</div>')
.addClass("menu-overlay")
.appendTo(document.body)
.click(MenuSystem.dismissAll);
}
elmt.css("z-index", 1010 + MenuSystem._layers.length).appendTo(document.body);
var layer = {
elmt: elmt,
onDismiss: onDismiss
};
MenuSystem._layers.push(layer);
var level = MenuSystem._layers.length;
layer.keyHandler = function(evt) {
if (evt.keyCode == 27 && !evt.shiftKey && !evt.metaKey && !evt.altKey && !evt.ctrlKey &&
evt.target.tagName.toLowerCase() != "input" &&
evt.target.tagName.toLowerCase() != "textarea") {
MenuSystem.dismissUntil(level - 1);
evt.stopImmediatePropagation();
evt.stopPropagation();
evt.preventDefault();
return false;
}
};
$(document).stack("keydown", layer.keyHandler);
elmt.css("z-index", 1010 + MenuSystem._layers.length).appendTo(document.body);
var layer = {
elmt: elmt,
onDismiss: onDismiss
};
MenuSystem._layers.push(layer);
var level = MenuSystem._layers.length;
layer.keyHandler = function(evt) {
if (evt.keyCode == 27 && !evt.shiftKey && !evt.metaKey && !evt.altKey && !evt.ctrlKey &&
evt.target.tagName.toLowerCase() != "input" &&
evt.target.tagName.toLowerCase() != "textarea") {
MenuSystem.dismissUntil(level - 1);
evt.stopImmediatePropagation();
evt.stopPropagation();
evt.preventDefault();
return false;
}
};
$(document).stack("keydown", layer.keyHandler);
return level;
return level;
};
MenuSystem.dismissAll = function() {
MenuSystem.dismissUntil(0);
if (MenuSystem._overlay !== null) {
MenuSystem._overlay.remove();
MenuSystem._overlay = null;
}
MenuSystem.dismissUntil(0);
if (MenuSystem._overlay !== null) {
MenuSystem._overlay.remove();
MenuSystem._overlay = null;
}
};
MenuSystem.dismissUntil = function(level) {
for (var i = MenuSystem._layers.length - 1; i >= level; i--) {
var layer = MenuSystem._layers[i];
for (var i = MenuSystem._layers.length - 1; i >= level; i--) {
var layer = MenuSystem._layers[i];
$(document).unbind("keydown", layer.keyHandler);
$(document).unbind("keydown", layer.keyHandler);
layer.elmt.remove();
layer.elmt.unbind();
layer.onDismiss();
}
MenuSystem._layers = MenuSystem._layers.slice(0, level);
layer.elmt.remove();
layer.elmt.unbind();
layer.onDismiss();
}
MenuSystem._layers = MenuSystem._layers.slice(0, level);
};
MenuSystem.createMenu = function() {
return $('<div></div>').addClass("menu-container");
return $('<div></div>').addClass("menu-container");
};
MenuSystem.createMenuItem = function() {
return $('<a href="javascript:{}"></a>').addClass("menu-item");
return $('<a href="javascript:{}"></a>').addClass("menu-item");
};
MenuSystem.positionMenuAboveBelow = function(menu, elmt) {
var offset = elmt.offset();
var windowWidth = $(window).width();
var windowHeight = $(window).height();
var offset = elmt.offset();
var windowWidth = $(window).width();
var windowHeight = $(window).height();
if (offset.top + elmt.outerHeight() - document.body.scrollTop + menu.outerHeight() > windowHeight - 10) {
menu.css("top", (offset.top - menu.outerHeight()) + "px");
} else {
menu.css("top", (offset.top + elmt.outerHeight()) + "px");
}
if (offset.top + elmt.outerHeight() - document.body.scrollTop + menu.outerHeight() > windowHeight - 10) {
menu.css("top", (offset.top - menu.outerHeight()) + "px");
} else {
menu.css("top", (offset.top + elmt.outerHeight()) + "px");
}
if (offset.left - document.body.scrollLeft + menu.outerWidth() > windowWidth - 10) {
menu.css("left", (offset.left + elmt.outerWidth() - menu.outerWidth()) + "px");
} else {
menu.css("left", offset.left + "px");
}
if (offset.left - document.body.scrollLeft + menu.outerWidth() > windowWidth - 10) {
menu.css("left", (offset.left + elmt.outerWidth() - menu.outerWidth()) + "px");
} else {
menu.css("left", offset.left + "px");
}
};
MenuSystem.positionMenuLeftRight = function(menu, elmt) {
var offset = elmt.offset();
var windowWidth = $(window).width();
var windowHeight = $(window).height();
var offset = elmt.offset();
var windowWidth = $(window).width();
var windowHeight = $(window).height();
if (offset.top - document.body.scrollTop + menu.outerHeight() > windowHeight - 10) {
menu.css("top", (offset.top + elmt.outerHeight() - menu.outerHeight()) + "px");
} else {
menu.css("top", offset.top + "px");
}
if (offset.top - document.body.scrollTop + menu.outerHeight() > windowHeight - 10) {
menu.css("top", (offset.top + elmt.outerHeight() - menu.outerHeight()) + "px");
} else {
menu.css("top", offset.top + "px");
}
if (offset.left + elmt.outerWidth() - document.body.scrollLeft + menu.outerWidth() > windowWidth - 10) {
menu.css("left", Math.max(10, offset.left - menu.outerWidth()) + "px");
} else {
menu.css("left", (offset.left + elmt.outerWidth()) + "px");
}
if (offset.left + elmt.outerWidth() - document.body.scrollLeft + menu.outerWidth() > windowWidth - 10) {
menu.css("left", Math.max(10, offset.left - menu.outerWidth()) + "px");
} else {
menu.css("left", (offset.left + elmt.outerWidth()) + "px");
}
};
MenuSystem.createAndShowStandardMenu = function(items, elmt, options) {
options = options || {
horizontal: false
};
options = options || {
horizontal: false
};
var menu = MenuSystem.createMenu();
if ("width" in options) {
menu.width(options.width);
}
var menu = MenuSystem.createMenu();
if ("width" in options) {
menu.width(options.width);
}
var createMenuItem = function(item) {
if ("label" in item) {
var menuItem = MenuSystem.createMenuItem().appendTo(menu);
if ("submenu" in item) {
menuItem.html(
'<table width="100%" cellspacing="0" cellpadding="0" class="menu-item-layout"><tr>' +
'<td>' + item.label + '</td>' +
'<td width="1%"><img src="/images/right-arrow.png" /></td>' +
'</tr></table>'
);
menuItem.mouseenter(function() {
MenuSystem.dismissUntil(level);
var createMenuItem = function(item) {
if ("label" in item) {
var menuItem = MenuSystem.createMenuItem().appendTo(menu);
if ("submenu" in item) {
menuItem.html(
'<table width="100%" cellspacing="0" cellpadding="0" class="menu-item-layout"><tr>' +
'<td>' + item.label + '</td>' +
'<td width="1%"><img src="/images/right-arrow.png" /></td>' +
'</tr></table>'
);
menuItem.mouseenter(function() {
MenuSystem.dismissUntil(level);
menuItem.addClass("menu-expanded");
menuItem.addClass("menu-expanded");
var options = {
horizontal: true,
onDismiss: function() {
menuItem.removeClass("menu-expanded");
}
};
if ("width" in item) {
options.width = item.width;
}
MenuSystem.createAndShowStandardMenu(item.submenu, this, options);
});
} else {
menuItem.html(item.label).click(function(evt) {
item.click.call(this, evt);
MenuSystem.dismissAll();
});
if ("tooltip" in item) {
menuItem.attr("title", item.tooltip);
}
menuItem.mouseenter(function() {
MenuSystem.dismissUntil(level);
});
var options = {
horizontal: true,
onDismiss: function() {
menuItem.removeClass("menu-expanded");
}
} else if ("heading" in item) {
$('<div></div>').addClass("menu-section").text(item.heading).appendTo(menu);
} else {
$('<hr />').appendTo(menu);
};
if ("width" in item) {
options.width = item.width;
}
MenuSystem.createAndShowStandardMenu(item.submenu, this, options);
});
} else {
menuItem.html(item.label).click(function(evt) {
item.click.call(this, evt);
MenuSystem.dismissAll();
});
if ("tooltip" in item) {
menuItem.attr("title", item.tooltip);
}
};
for (var i = 0; i < items.length; i++) {
createMenuItem(items[i]);
}
var level = MenuSystem.showMenu(menu, "onDismiss" in options ? options.onDismiss : function(){});
if (options.horizontal) {
MenuSystem.positionMenuLeftRight(menu, $(elmt));
menuItem.mouseenter(function() {
MenuSystem.dismissUntil(level);
});
}
} else if ("heading" in item) {
$('<div></div>').addClass("menu-section").text(item.heading).appendTo(menu);
} else {
MenuSystem.positionMenuAboveBelow(menu, $(elmt));
$('<hr />').appendTo(menu);
}
};
return level;
for (var i = 0; i < items.length; i++) {
createMenuItem(items[i]);
}
var level = MenuSystem.showMenu(menu, "onDismiss" in options ? options.onDismiss : function(){});
if (options.horizontal) {
MenuSystem.positionMenuLeftRight(menu, $(elmt));
} else {
MenuSystem.positionMenuAboveBelow(menu, $(elmt));
}
return level;
};
MenuSystem.find = function(rootItems, path, levels) {
var menuItems = rootItems;
for (var p = 0; p < path.length && p < levels; p++) {
var segment = path[p];
var subMenuItems;
var menuItems = rootItems;
for (var p = 0; p < path.length && p < levels; p++) {
var segment = path[p];
var subMenuItems;
for (var i = 0; i < menuItems.length; i++) {
var menuItem = menuItems[i];
if (menuItem.id == segment) {
if ("submenu" in menuItem) {
subMenuItems = menuItem.submenu;
} else {
return undefined;
}
break;
}
}
if (subMenuItems) {
menuItems = subMenuItems;
for (var i = 0; i < menuItems.length; i++) {
var menuItem = menuItems[i];
if (menuItem.id == segment) {
if ("submenu" in menuItem) {
subMenuItems = menuItem.submenu;
} else {
return undefined;
return undefined;
}
break;
}
}
return menuItems;
if (subMenuItems) {
menuItems = subMenuItems;
} else {
return undefined;
}
}
return menuItems;
};
MenuSystem.appendTo = function(rootItems, path, what) {
var menuItems = MenuSystem.find(rootItems, path, path.length);
if (menuItems) {
if (what instanceof Array) {
$.merge(menuItems, what);
} else {
menuItems.push(what);
}
var menuItems = MenuSystem.find(rootItems, path, path.length);
if (menuItems) {
if (what instanceof Array) {
$.merge(menuItems, what);
} else {
menuItems.push(what);
}
}
};
MenuSystem.insertBefore = function(rootItems, path, what) {
var menuItems = MenuSystem.find(rootItems, path, path.length - 1);
if ((menuItems) && path.length > 0) {
var spliceArgs = [ 0, 0 ];
if (what instanceof Array) {
$.merge(spliceArgs, what);
} else {
spliceArgs.push(what);
}
var segment = path[path.length - 1];
for (var i = 0; i < menuItems.length; i++) {
var menuItem = menuItems[i];
if (menuItem.id == segment) {
spliceArgs[0] = i;
break;
}
}
Array.prototype.splice.apply(menuItems, spliceArgs);
var menuItems = MenuSystem.find(rootItems, path, path.length - 1);
if ((menuItems) && path.length > 0) {
var spliceArgs = [ 0, 0 ];
if (what instanceof Array) {
$.merge(spliceArgs, what);
} else {
spliceArgs.push(what);
}
var segment = path[path.length - 1];
for (var i = 0; i < menuItems.length; i++) {
var menuItem = menuItems[i];
if (menuItem.id == segment) {
spliceArgs[0] = i;
break;
}
}
Array.prototype.splice.apply(menuItems, spliceArgs);
}
};
MenuSystem.insertAfter = function(rootItems, path, what) {
var menuItems = MenuSystem.find(rootItems, path, path.length - 1);
if ((menuItems) && path.length > 0) {
var spliceArgs = [ menuItems.length, 0 ];
if (what instanceof Array) {
$.merge(spliceArgs, what);
} else {
spliceArgs.push(what);
}
var segment = path[path.length - 1];
for (var i = 0; i < menuItems.length; i++) {
var menuItem = menuItems[i];
if (menuItem.id == segment) {
spliceArgs[0] = i + 1;
break;
}
}
Array.prototype.splice.apply(menuItems, spliceArgs);
var menuItems = MenuSystem.find(rootItems, path, path.length - 1);
if ((menuItems) && path.length > 0) {
var spliceArgs = [ menuItems.length, 0 ];
if (what instanceof Array) {
$.merge(spliceArgs, what);
} else {
spliceArgs.push(what);
}
var segment = path[path.length - 1];
for (var i = 0; i < menuItems.length; i++) {
var menuItem = menuItems[i];
if (menuItem.id == segment) {
spliceArgs[0] = i + 1;
break;
}
}
Array.prototype.splice.apply(menuItems, spliceArgs);
}
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,28 +29,28 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
function cloneDeep(o) {
if (o === undefined || o === null) {
return o;
} else if (o instanceof Function) {
return o;
} else if (o instanceof Array) {
var a = [];
for (var i = 0; i < o.length; i++) {
a.push(cloneDeep(o[i]));
}
return a;
} else if (o instanceof Object) {
var a = {};
for (var n in o) {
if (o.hasOwnProperty(n)) {
a[n] = cloneDeep(o[n]);
}
}
return a;
} else {
return o;
if (o === undefined || o === null) {
return o;
} else if (o instanceof Function) {
return o;
} else if (o instanceof Array) {
var a = [];
for (var i = 0; i < o.length; i++) {
a.push(cloneDeep(o[i]));
}
return a;
} else if (o instanceof Object) {
var a = {};
for (var n in o) {
if (o.hasOwnProperty(n)) {
a[n] = cloneDeep(o[n]);
}
}
return a;
} else {
return o;
}
}

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,20 +29,20 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
String.prototype.trim = function() {
return this.replace(/^\s+/, '').replace(/\s+$/, '');
return this.replace(/^\s+/, '').replace(/\s+$/, '');
};
String.prototype.startsWith = function(s) {
return this.length >= s.length && this.substring(0, s.length) == s;
return this.length >= s.length && this.substring(0, s.length) == s;
};
String.prototype.endsWith = function(s) {
return this.length >= s.length && this.substring(this.length - s.length) == s;
return this.length >= s.length && this.substring(this.length - s.length) == s;
};
String.prototype.contains = function(s) {
return this.indexOf(s) >= 0;
return this.indexOf(s) >= 0;
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,89 +29,89 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
URL = {
schemes: { // 1 means followed by ://, 0 means followed by just :
"callto":0,
"chrome":1,
"file":1,
"ftp":1,
"http":1,
"https":1,
"imap":1,
"info":0,
"irc":1,
"jar":0,
"javascript":0,
"lastfm":1,
"ldap":1,
"ldaps":1,
"mailto":0,
"news":0,
"nntp":1,
"pop":1,
"sftp":1,
"skype":0,
"smb":1,
"ssh":1,
"svn":1,
"svn+ssh":1,
"telnet":1,
"view-source":0
}
schemes: { // 1 means followed by ://, 0 means followed by just :
"callto":0,
"chrome":1,
"file":1,
"ftp":1,
"http":1,
"https":1,
"imap":1,
"info":0,
"irc":1,
"jar":0,
"javascript":0,
"lastfm":1,
"ldap":1,
"ldaps":1,
"mailto":0,
"news":0,
"nntp":1,
"pop":1,
"sftp":1,
"skype":0,
"smb":1,
"ssh":1,
"svn":1,
"svn+ssh":1,
"telnet":1,
"view-source":0
}
};
(function() {
var minLength = 100;
var maxLength = 0;
var minLength = 100;
var maxLength = 0;
for (var n in URL.schemes) {
minLength = Math.min(minLength, n.length);
maxLength = Math.max(maxLength, n.length);
}
for (var n in URL.schemes) {
minLength = Math.min(minLength, n.length);
maxLength = Math.max(maxLength, n.length);
}
URL.minSchemeLength = minLength;
URL.maxSchemeLength = maxLength;
URL.minSchemeLength = minLength;
URL.maxSchemeLength = maxLength;
})();
URL.getParameters = function() {
var r = {};
var r = {};
var params = window.location.search;
if (params.length > 1) {
params = params.substr(1).split("&");
$.each(params, function() {
pair = this.split("=");
r[pair[0]] = unescape(pair[1]);
});
}
var params = window.location.search;
if (params.length > 1) {
params = params.substr(1).split("&");
$.each(params, function() {
pair = this.split("=");
r[pair[0]] = unescape(pair[1]);
});
}
return r;
return r;
};
URL.looksLikeUrl = function(s) {
if (s.length > URL.minSchemeLength + 1) {
var sep = s.substring(0, URL.maxSchemeLength + 3).indexOf(":");
if (sep >= URL.minSchemeLength) {
var scheme = s.substring(0, sep).toLowerCase();
if (scheme in URL.schemes) {
return URL.schemes[scheme] == 0 ||
s.substring(sep + 1, sep + 3) == "//";
}
}
if (s.length > URL.minSchemeLength + 1) {
var sep = s.substring(0, URL.maxSchemeLength + 3).indexOf(":");
if (sep >= URL.minSchemeLength) {
var scheme = s.substring(0, sep).toLowerCase();
if (scheme in URL.schemes) {
return URL.schemes[scheme] == 0 ||
s.substring(sep + 1, sep + 3) == "//";
}
}
return false;
}
return false;
};
URL.getHostname = function(){
var url = location.href; // entire url including querystring - also: window.location.href;
var baseURL = url.substring(0, url.indexOf('/',7));//7 is the length of http://
return baseURL;
var url = location.href; // entire url including querystring - also: window.location.href;
var baseURL = url.substring(0, url.indexOf('/',7));//7 is the length of http://
return baseURL;
};
URL.urlify = function(str) {
if(!str) {
return '';
}
return escape(str.replace(/\W/g, '_'));
if(!str) {
return '';
}
return escape(str.replace(/\W/g, '_'));
};

View File

@ -3,20 +3,20 @@
<div class="dialog-header" bind="dialogHeader"></div>
<div class="dialog-body" bind="dialogBody">
<div class="grid-layout layout-normal layout-full"><table cols="2">
<tr>
<td width="1%" style="white-space: pre;">New column name</td>
<td><input bind="columnNameInput" size="40" /></td>
<tr>
<td width="1%" style="white-space: pre;">New column name</td>
<td><input bind="columnNameInput" size="40" /></td>
<td width="1%" style="white-space: pre;">Throttle delay</td>
<td><input bind="throttleDelayInput" size="10" value="5000" /> milliseconds</td>
</tr>
<tr>
<td width="1%" style="white-space: pre;">On error</td>
<td colspan="3"><input type="radio" name="dialog-onerror-choice" value="set-to-blank" checked /> set to blank
<input type="radio" name="dialog-onerror-choice" value="store-error" /> store error</td>
</tr>
<tr><td colspan="4"><h3>Formulate the URLs to fetch:</h3></td></tr>
<tr><td colspan="4">$EXPRESSION_PREVIEW_WIDGET$</td></tr>
<td width="1%" style="white-space: pre;">Throttle delay</td>
<td><input bind="throttleDelayInput" size="10" value="5000" /> milliseconds</td>
</tr>
<tr>
<td width="1%" style="white-space: pre;">On error</td>
<td colspan="3"><input type="radio" name="dialog-onerror-choice" value="set-to-blank" checked /> set to blank
<input type="radio" name="dialog-onerror-choice" value="store-error" /> store error</td>
</tr>
<tr><td colspan="4"><h3>Formulate the URLs to fetch:</h3></td></tr>
<tr><td colspan="4">$EXPRESSION_PREVIEW_WIDGET$</td></tr>
</table></div>
</div>
<div class="dialog-footer" bind="dialogFooter">

View File

@ -3,15 +3,15 @@
<div class="dialog-header" bind="dialogHeader"></div>
<div class="dialog-body" bind="dialogBody">
<div class="grid-layout layout-normal layout-full"><table cols="2">
<tr>
<td width="1%" style="white-space: pre;">New column name</td>
<td><input bind="columnNameInput" size="40" /></td>
</tr>
<tr>
<td width="1%" style="white-space: pre;">On error</td>
<td><input type="radio" name="create-column-dialog-onerror-choice" value="set-to-blank" checked /> set to blank <input type="radio" name="create-column-dialog-onerror-choice" value="store-error" /> store error <input type="radio" name="create-column-dialog-onerror-choice" value="keep-original" /> keep original</td>
</tr>
<tr><td colspan="2">$EXPRESSION_PREVIEW_WIDGET$</td></tr>
<tr>
<td width="1%" style="white-space: pre;">New column name</td>
<td><input bind="columnNameInput" size="40" /></td>
</tr>
<tr>
<td width="1%" style="white-space: pre;">On error</td>
<td><input type="radio" name="create-column-dialog-onerror-choice" value="set-to-blank" checked /> set to blank <input type="radio" name="create-column-dialog-onerror-choice" value="store-error" /> store error <input type="radio" name="create-column-dialog-onerror-choice" value="keep-original" /> keep original</td>
</tr>
<tr><td colspan="2">$EXPRESSION_PREVIEW_WIDGET$</td></tr>
</table></div>
</div>
<div class="dialog-footer" bind="dialogFooter">

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,536 +29,536 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
function DataTableCellUI(dataTableView, cell, rowIndex, cellIndex, td) {
this._dataTableView = dataTableView;
this._cell = cell;
this._rowIndex = rowIndex;
this._cellIndex = cellIndex;
this._td = td;
this._dataTableView = dataTableView;
this._cell = cell;
this._rowIndex = rowIndex;
this._cellIndex = cellIndex;
this._td = td;
this._render();
this._render();
}
DataTableCellUI.prototype._render = function() {
var self = this;
var cell = this._cell;
var self = this;
var cell = this._cell;
var divContent = $('<div/>')
.addClass("data-table-cell-content");
var divContent = $('<div/>')
.addClass("data-table-cell-content");
var editLink = $('<a href="javascript:{}">&nbsp;</a>')
.addClass("data-table-cell-edit")
.attr("title", "Edit this cell")
.appendTo(divContent)
.click(function() { self._startEdit(this); });
var editLink = $('<a href="javascript:{}">&nbsp;</a>')
.addClass("data-table-cell-edit")
.attr("title", "Edit this cell")
.appendTo(divContent)
.click(function() { self._startEdit(this); });
$(this._td).empty()
.unbind()
.mouseenter(function() { editLink.css("visibility", "visible"); })
.mouseleave(function() { editLink.css("visibility", "hidden"); });
$(this._td).empty()
.unbind()
.mouseenter(function() { editLink.css("visibility", "visible"); })
.mouseleave(function() { editLink.css("visibility", "hidden"); });
if (!cell || ("v" in cell && cell.v === null)) {
$('<span>').html("&nbsp;").appendTo(divContent);
} else if ("e" in cell) {
$('<span>').addClass("data-table-error").text(cell.e).appendTo(divContent);
} else if (!("r" in cell) || !cell.r) {
if (typeof cell.v !== "string") {
if (typeof cell.v == "number") {
divContent.addClass("data-table-cell-content-numeric");
}
$('<span>')
.addClass("data-table-value-nonstring")
.text(cell.v)
.appendTo(divContent);
} else if (URL.looksLikeUrl(cell.v)) {
$('<a>')
.text(cell.v)
.attr("href", cell.v)
.attr("target", "_blank")
.appendTo(divContent);
} else {
$('<span>')
.text(cell.v)
.appendTo(divContent);
}
if (!cell || ("v" in cell && cell.v === null)) {
$('<span>').html("&nbsp;").appendTo(divContent);
} else if ("e" in cell) {
$('<span>').addClass("data-table-error").text(cell.e).appendTo(divContent);
} else if (!("r" in cell) || !cell.r) {
if (typeof cell.v !== "string") {
if (typeof cell.v == "number") {
divContent.addClass("data-table-cell-content-numeric");
}
$('<span>')
.addClass("data-table-value-nonstring")
.text(cell.v)
.appendTo(divContent);
} else if (URL.looksLikeUrl(cell.v)) {
$('<a>')
.text(cell.v)
.attr("href", cell.v)
.attr("target", "_blank")
.appendTo(divContent);
} else {
var r = cell.r;
var service = (r.service) ? ReconciliationManager.getServiceFromUrl(r.service) : null;
if (r.j == "new") {
$('<span>').text(cell.v).appendTo(divContent);
$('<span>').addClass("data-table-recon-new").text("new").appendTo(divContent);
$('<a href="javascript:{}"></a>')
.text("Choose new match")
.addClass("data-table-recon-action")
.appendTo(divContent).click(function(evt) {
self._doRematch();
});
} else if (r.j == "matched" && "m" in r && r.m !== null) {
var match = cell.r.m;
var a = $('<a></a>')
.text(match.name)
.attr("target", "_blank")
.appendTo(divContent);
if (service && (service.view) && (service.view.url)) {
a.attr("href", service.view.url.replace("{{id}}", match.id));
} else if (ReconciliationManager.isFreebaseIdOrMid(r.identifierSpace)) {
a.attr("href", "http://www.freebase.com/view" + match.id);
}
$('<span> </span>').appendTo(divContent);
$('<a href="javascript:{}"></a>')
.text("Choose new match")
.addClass("data-table-recon-action")
.appendTo(divContent)
.click(function(evt) {
self._doRematch();
});
} else {
$('<span>').text(cell.v).appendTo(divContent);
if (this._dataTableView._showRecon) {
var ul = $('<div></div>').addClass("data-table-recon-candidates").appendTo(divContent);
if ("c" in r && r.c.length > 0) {
var candidates = r.c;
var renderCandidate = function(candidate, index) {
var li = $('<div></div>').addClass("data-table-recon-candidate").appendTo(ul);
$('<a href="javascript:{}">&nbsp;</a>')
.addClass("data-table-recon-match-similar")
.attr("title", "Match this topic to this and all identical cells")
.appendTo(li).click(function(evt) {
self._doMatchTopicToSimilarCells(candidate);
});
$('<a href="javascript:{}">&nbsp;</a>')
.addClass("data-table-recon-match")
.attr("title", "Match this topic to this cell")
.appendTo(li).click(function(evt) {
self._doMatchTopicToOneCell(candidate);
});
var a = $('<a></a>')
.addClass("data-table-recon-topic")
.attr("target", "_blank")
.text(candidate.name)
.appendTo(li);
if ((service) && (service.view) && (service.view.url)) {
a.attr("href", service.view.url.replace("{{id}}", candidate.id));
} else if (ReconciliationManager.isFreebaseIdOrMid(r.identifierSpace)) {
a.attr("href", "http://www.freebase.com/view" + candidate.id);
}
var preview = null;
if ((service) && (service.preview)) {
preview = service.preview;
} else if (ReconciliationManager.isFreebaseIdOrMid(r.identifierSpace)) {
preview = DataTableCellUI.topicBlockPreview;
}
if (preview) {
a.click(function(evt) {
if (!evt.metaKey && !evt.ctrlKey) {
self._previewCandidateTopic(candidate, this, preview);
evt.preventDefault();
return false;
}
});
}
var score;
if (candidate.score < 1) {
score = Math.round(candidate.score * 1000) / 1000;
} else {
score = Math.round(candidate.score);
}
$('<span></span>').addClass("data-table-recon-score").text("(" + score + ")").appendTo(li);
};
for (var i = 0; i < candidates.length; i++) {
renderCandidate(candidates[i], i);
}
}
var liNew = $('<div></div>').addClass("data-table-recon-candidate").appendTo(ul);
$('<a href="javascript:{}">&nbsp;</a>')
.addClass("data-table-recon-match-similar")
.attr("title", "Create a new topic for this and all identical cells")
.appendTo(liNew).click(function(evt) {
self._doMatchNewTopicToSimilarCells();
});
$('<a href="javascript:{}">&nbsp;</a>')
.addClass("data-table-recon-match")
.attr("title", "Create a new topic for this cell")
.appendTo(liNew).click(function(evt) {
self._doMatchNewTopicToOneCell();
});
$('<span>').text("Create new topic").appendTo(liNew);
var suggestOptions;
var addSuggest = false;
if ((service) && (service.suggest) && (service.suggest.entity)) {
suggestOptions = service.suggest.entity;
addSuggest = true;
} else if (ReconciliationManager.isFreebaseIdOrMid(r.identifierSpace)) {
addSuggest = true;
}
var extraChoices = $('<div>').addClass("data-table-recon-extra").appendTo(divContent);
if (addSuggest) {
$('<a href="javascript:{}"></a>')
.click(function(evt) {
self._searchForMatch(suggestOptions);
return false;
})
.text("Search for match")
.appendTo(extraChoices);
}
}
}
$('<span>')
.text(cell.v)
.appendTo(divContent);
}
} else {
var r = cell.r;
var service = (r.service) ? ReconciliationManager.getServiceFromUrl(r.service) : null;
divContent.appendTo(this._td);
if (r.j == "new") {
$('<span>').text(cell.v).appendTo(divContent);
$('<span>').addClass("data-table-recon-new").text("new").appendTo(divContent);
$('<a href="javascript:{}"></a>')
.text("Choose new match")
.addClass("data-table-recon-action")
.appendTo(divContent).click(function(evt) {
self._doRematch();
});
} else if (r.j == "matched" && "m" in r && r.m !== null) {
var match = cell.r.m;
var a = $('<a></a>')
.text(match.name)
.attr("target", "_blank")
.appendTo(divContent);
if (service && (service.view) && (service.view.url)) {
a.attr("href", service.view.url.replace("{{id}}", match.id));
} else if (ReconciliationManager.isFreebaseIdOrMid(r.identifierSpace)) {
a.attr("href", "http://www.freebase.com/view" + match.id);
}
$('<span> </span>').appendTo(divContent);
$('<a href="javascript:{}"></a>')
.text("Choose new match")
.addClass("data-table-recon-action")
.appendTo(divContent)
.click(function(evt) {
self._doRematch();
});
} else {
$('<span>').text(cell.v).appendTo(divContent);
if (this._dataTableView._showRecon) {
var ul = $('<div></div>').addClass("data-table-recon-candidates").appendTo(divContent);
if ("c" in r && r.c.length > 0) {
var candidates = r.c;
var renderCandidate = function(candidate, index) {
var li = $('<div></div>').addClass("data-table-recon-candidate").appendTo(ul);
$('<a href="javascript:{}">&nbsp;</a>')
.addClass("data-table-recon-match-similar")
.attr("title", "Match this topic to this and all identical cells")
.appendTo(li).click(function(evt) {
self._doMatchTopicToSimilarCells(candidate);
});
$('<a href="javascript:{}">&nbsp;</a>')
.addClass("data-table-recon-match")
.attr("title", "Match this topic to this cell")
.appendTo(li).click(function(evt) {
self._doMatchTopicToOneCell(candidate);
});
var a = $('<a></a>')
.addClass("data-table-recon-topic")
.attr("target", "_blank")
.text(candidate.name)
.appendTo(li);
if ((service) && (service.view) && (service.view.url)) {
a.attr("href", service.view.url.replace("{{id}}", candidate.id));
} else if (ReconciliationManager.isFreebaseIdOrMid(r.identifierSpace)) {
a.attr("href", "http://www.freebase.com/view" + candidate.id);
}
var preview = null;
if ((service) && (service.preview)) {
preview = service.preview;
} else if (ReconciliationManager.isFreebaseIdOrMid(r.identifierSpace)) {
preview = DataTableCellUI.topicBlockPreview;
}
if (preview) {
a.click(function(evt) {
if (!evt.metaKey && !evt.ctrlKey) {
self._previewCandidateTopic(candidate, this, preview);
evt.preventDefault();
return false;
}
});
}
var score;
if (candidate.score < 1) {
score = Math.round(candidate.score * 1000) / 1000;
} else {
score = Math.round(candidate.score);
}
$('<span></span>').addClass("data-table-recon-score").text("(" + score + ")").appendTo(li);
};
for (var i = 0; i < candidates.length; i++) {
renderCandidate(candidates[i], i);
}
}
var liNew = $('<div></div>').addClass("data-table-recon-candidate").appendTo(ul);
$('<a href="javascript:{}">&nbsp;</a>')
.addClass("data-table-recon-match-similar")
.attr("title", "Create a new topic for this and all identical cells")
.appendTo(liNew).click(function(evt) {
self._doMatchNewTopicToSimilarCells();
});
$('<a href="javascript:{}">&nbsp;</a>')
.addClass("data-table-recon-match")
.attr("title", "Create a new topic for this cell")
.appendTo(liNew).click(function(evt) {
self._doMatchNewTopicToOneCell();
});
$('<span>').text("Create new topic").appendTo(liNew);
var suggestOptions;
var addSuggest = false;
if ((service) && (service.suggest) && (service.suggest.entity)) {
suggestOptions = service.suggest.entity;
addSuggest = true;
} else if (ReconciliationManager.isFreebaseIdOrMid(r.identifierSpace)) {
addSuggest = true;
}
var extraChoices = $('<div>').addClass("data-table-recon-extra").appendTo(divContent);
if (addSuggest) {
$('<a href="javascript:{}"></a>')
.click(function(evt) {
self._searchForMatch(suggestOptions);
return false;
})
.text("Search for match")
.appendTo(extraChoices);
}
}
}
}
divContent.appendTo(this._td);
};
DataTableCellUI.prototype._doRematch = function() {
this._doJudgment("none");
this._doJudgment("none");
};
DataTableCellUI.prototype._doMatchNewTopicToOneCell = function() {
this._doJudgment("new");
this._doJudgment("new");
};
DataTableCellUI.prototype._doClearOneCell = function() {
this._postProcessOneCell(
"recon-clear-one-cell",
{},
{
row: this._rowIndex,
cell: this._cellIndex
},
true
);
this._postProcessOneCell(
"recon-clear-one-cell",
{},
{
row: this._rowIndex,
cell: this._cellIndex
},
true
);
};
DataTableCellUI.prototype._doMatchNewTopicToSimilarCells = function() {
this._doJudgmentForSimilarCells("new", {}, { shareNewTopics: true }, true);
this._doJudgmentForSimilarCells("new", {}, { shareNewTopics: true }, true);
};
DataTableCellUI.prototype._doClearSimilarCells = function() {
this._postProcessSeveralCells(
"recon-clear-similar-cells",
{},
{
columnName: Refine.cellIndexToColumn(this._cellIndex).name,
similarValue: this._cell.v
},
true
);
this._postProcessSeveralCells(
"recon-clear-similar-cells",
{},
{
columnName: Refine.cellIndexToColumn(this._cellIndex).name,
similarValue: this._cell.v
},
true
);
};
DataTableCellUI.prototype._doMatchTopicToOneCell = function(candidate) {
this._doJudgment("matched", {}, {
id : candidate.id,
name: candidate.name,
score: candidate.score,
types: candidate.types.join(",")
});
this._doJudgment("matched", {}, {
id : candidate.id,
name: candidate.name,
score: candidate.score,
types: candidate.types.join(",")
});
};
DataTableCellUI.prototype._doMatchTopicToSimilarCells = function(candidate) {
this._doJudgmentForSimilarCells("matched", {}, {
id : candidate.id,
name: candidate.name,
score: candidate.score,
types: candidate.types.join(",")
}, true);
this._doJudgmentForSimilarCells("matched", {}, {
id : candidate.id,
name: candidate.name,
score: candidate.score,
types: candidate.types.join(",")
}, true);
};
DataTableCellUI.prototype._doJudgment = function(judgment, params, bodyParams) {
this._postProcessOneCell(
"recon-judge-one-cell",
params || {},
$.extend(bodyParams || {}, {
row: this._rowIndex,
cell: this._cellIndex,
judgment: judgment,
identifierSpace: (this._cell.r) ? this._cell.r.identifierSpace : null,
schemaSpace: (this._cell.r) ? this._cell.r.schemaSpace : null
}),
true
);
this._postProcessOneCell(
"recon-judge-one-cell",
params || {},
$.extend(bodyParams || {}, {
row: this._rowIndex,
cell: this._cellIndex,
judgment: judgment,
identifierSpace: (this._cell.r) ? this._cell.r.identifierSpace : null,
schemaSpace: (this._cell.r) ? this._cell.r.schemaSpace : null
}),
true
);
};
DataTableCellUI.prototype._doJudgmentForSimilarCells = function(judgment, params, bodyParams) {
this._postProcessSeveralCells(
"recon-judge-similar-cells",
params || {},
$.extend(bodyParams || {}, {
columnName: Refine.cellIndexToColumn(this._cellIndex).name,
similarValue: this._cell.v,
judgment: judgment,
identifierSpace: (this._cell.r) ? this._cell.r.identifierSpace : null,
schemaSpace: (this._cell.r) ? this._cell.r.schemaSpace : null
}),
true
);
this._postProcessSeveralCells(
"recon-judge-similar-cells",
params || {},
$.extend(bodyParams || {}, {
columnName: Refine.cellIndexToColumn(this._cellIndex).name,
similarValue: this._cell.v,
judgment: judgment,
identifierSpace: (this._cell.r) ? this._cell.r.identifierSpace : null,
schemaSpace: (this._cell.r) ? this._cell.r.schemaSpace : null
}),
true
);
};
DataTableCellUI.prototype._searchForMatch = function(suggestOptions) {
var self = this;
var frame = $(DOM.loadHTML("core", "scripts/views/data-table/cell-recon-search-for-match.html"));
var elmts = DOM.bind(frame);
var self = this;
var frame = $(DOM.loadHTML("core", "scripts/views/data-table/cell-recon-search-for-match.html"));
var elmts = DOM.bind(frame);
var level = DialogSystem.showDialog(frame);
var dismiss = function() {
DialogSystem.dismissUntil(level - 1);
};
var level = DialogSystem.showDialog(frame);
var dismiss = function() {
DialogSystem.dismissUntil(level - 1);
};
elmts.cellTextSpan.text(this._cell.v);
elmts.cellTextSpan.text(this._cell.v);
var match = null;
var commit = function() {
if (match !== null) {
var params = {
judgment: "matched",
id: match.id,
name: match.name,
types: $.map(match.type, function(elmt) {
return typeof elmt == "string" ? elmt : elmt.id;
}).join(",")
};
var match = null;
var commit = function() {
if (match !== null) {
var params = {
judgment: "matched",
id: match.id,
name: match.name,
types: $.map(match.type, function(elmt) {
return typeof elmt == "string" ? elmt : elmt.id;
}).join(",")
};
if (elmts.radioSimilar[0].checked) {
params.similarValue = self._cell.v;
params.columnName = Refine.cellIndexToColumn(self._cellIndex).name;
if (elmts.radioSimilar[0].checked) {
params.similarValue = self._cell.v;
params.columnName = Refine.cellIndexToColumn(self._cellIndex).name;
self._postProcessSeveralCells("recon-judge-similar-cells", {}, params, true);
} else {
params.row = self._rowIndex;
params.cell = self._cellIndex;
self._postProcessSeveralCells("recon-judge-similar-cells", {}, params, true);
} else {
params.row = self._rowIndex;
params.cell = self._cellIndex;
self._postProcessOneCell("recon-judge-one-cell", {}, params, true);
}
self._postProcessOneCell("recon-judge-one-cell", {}, params, true);
}
dismiss();
}
};
var commitNew = function() {
if (elmts.radioSimilar[0].checked) {
self._doMatchNewTopicToSimilarCells();
} else {
self._doMatchNewTopicToOneCell();
}
dismiss();
};
var commitClear = function() {
if (elmts.radioSimilar[0].checked) {
self._doClearSimilarCells();
} else {
self._doClearOneCell();
}
dismiss();
};
dismiss();
}
};
var commitNew = function() {
if (elmts.radioSimilar[0].checked) {
self._doMatchNewTopicToSimilarCells();
} else {
self._doMatchNewTopicToOneCell();
}
dismiss();
};
var commitClear = function() {
if (elmts.radioSimilar[0].checked) {
self._doClearSimilarCells();
} else {
self._doClearOneCell();
}
dismiss();
};
elmts.okButton.click(commit);
elmts.newButton.click(commitNew);
elmts.clearButton.click(commitClear);
elmts.cancelButton.click(dismiss);
elmts.okButton.click(commit);
elmts.newButton.click(commitNew);
elmts.clearButton.click(commitClear);
elmts.cancelButton.click(dismiss);
var suggestOptions2 = $.extend({ align: "left" }, suggestOptions || { all_types: true });
elmts.input
.attr("value", this._cell.v)
.suggest(suggestOptions2)
.bind("fb-select", function(e, data) {
match = data;
commit();
})
.focus()
.data("suggest").textchange();
var suggestOptions2 = $.extend({ align: "left" }, suggestOptions || { all_types: true });
elmts.input
.attr("value", this._cell.v)
.suggest(suggestOptions2)
.bind("fb-select", function(e, data) {
match = data;
commit();
})
.focus()
.data("suggest").textchange();
};
DataTableCellUI.prototype._postProcessOneCell = function(command, params, bodyParams, columnStatsChanged) {
var self = this;
var self = this;
Refine.postCoreProcess(
command,
params,
bodyParams,
{ columnStatsChanged: columnStatsChanged },
{
onDone: function(o) {
if (o.cell.r) {
o.cell.r = o.pool.recons[o.cell.r];
}
self._cell = o.cell;
self._dataTableView._updateCell(self._rowIndex, self._cellIndex, self._cell);
self._render();
}
Refine.postCoreProcess(
command,
params,
bodyParams,
{ columnStatsChanged: columnStatsChanged },
{
onDone: function(o) {
if (o.cell.r) {
o.cell.r = o.pool.recons[o.cell.r];
}
);
self._cell = o.cell;
self._dataTableView._updateCell(self._rowIndex, self._cellIndex, self._cell);
self._render();
}
}
);
};
DataTableCellUI.prototype._postProcessSeveralCells = function(command, params, bodyParams, columnStatsChanged) {
Refine.postCoreProcess(
command,
params,
bodyParams,
{ cellsChanged: true, columnStatsChanged: columnStatsChanged }
);
Refine.postCoreProcess(
command,
params,
bodyParams,
{ cellsChanged: true, columnStatsChanged: columnStatsChanged }
);
};
DataTableCellUI.topicBlockPreview = {
url: 'http://www.freebase.com/widget/topic{{id}}?mode=content&blocks=[{"block":"full_info"},{"block":"article_props"}]',
width: 430,
height: 300
url: 'http://www.freebase.com/widget/topic{{id}}?mode=content&blocks=[{"block":"full_info"},{"block":"article_props"}]',
width: 430,
height: 300
};
DataTableCellUI.prototype._previewCandidateTopic = function(candidate, elmt, preview) {
var self = this;
var id = candidate.id;
var url = preview.url.replace("{{id}}", id);
var self = this;
var id = candidate.id;
var url = preview.url.replace("{{id}}", id);
var fakeMenu = MenuSystem.createMenu();
fakeMenu
.width(414)
.addClass('data-table-topic-popup')
.html(DOM.loadHTML("core", "scripts/views/data-table/cell-recon-preview-popup-header.html"));
var fakeMenu = MenuSystem.createMenu();
fakeMenu
.width(414)
.addClass('data-table-topic-popup')
.html(DOM.loadHTML("core", "scripts/views/data-table/cell-recon-preview-popup-header.html"));
var iframe = $('<iframe></iframe>')
.width(preview.width)
.height(preview.height)
.attr("src", url)
.appendTo(fakeMenu);
var iframe = $('<iframe></iframe>')
.width(preview.width)
.height(preview.height)
.attr("src", url)
.appendTo(fakeMenu);
MenuSystem.showMenu(fakeMenu, function(){});
MenuSystem.positionMenuLeftRight(fakeMenu, $(elmt));
MenuSystem.showMenu(fakeMenu, function(){});
MenuSystem.positionMenuLeftRight(fakeMenu, $(elmt));
var elmts = DOM.bind(fakeMenu);
elmts.matchButton.click(function() {
self._doMatchTopicToOneCell(candidate);
MenuSystem.dismissAll();
});
elmts.matchSimilarButton.click(function() {
self._doMatchTopicToSimilarCells(candidate);
MenuSystem.dismissAll();
});
elmts.cancelButton.click(function() {
MenuSystem.dismissAll();
});
var elmts = DOM.bind(fakeMenu);
elmts.matchButton.click(function() {
self._doMatchTopicToOneCell(candidate);
MenuSystem.dismissAll();
});
elmts.matchSimilarButton.click(function() {
self._doMatchTopicToSimilarCells(candidate);
MenuSystem.dismissAll();
});
elmts.cancelButton.click(function() {
MenuSystem.dismissAll();
});
};
DataTableCellUI.prototype._startEdit = function(elmt) {
self = this;
self = this;
var originalContent = !this._cell || ("v" in this._cell && this._cell.v === null) ? "" : this._cell.v;
var originalContent = !this._cell || ("v" in this._cell && this._cell.v === null) ? "" : this._cell.v;
var menu = MenuSystem.createMenu().addClass("data-table-cell-editor").width("400px");
menu.html(DOM.loadHTML("core", "scripts/views/data-table/cell-editor.html"));
var elmts = DOM.bind(menu);
var menu = MenuSystem.createMenu().addClass("data-table-cell-editor").width("400px");
menu.html(DOM.loadHTML("core", "scripts/views/data-table/cell-editor.html"));
var elmts = DOM.bind(menu);
MenuSystem.showMenu(menu, function(){});
MenuSystem.positionMenuLeftRight(menu, $(this._td));
MenuSystem.showMenu(menu, function(){});
MenuSystem.positionMenuLeftRight(menu, $(this._td));
var commit = function() {
var type = elmts.typeSelect[0].value;
var commit = function() {
var type = elmts.typeSelect[0].value;
var applyOthers = 0;
if (this === elmts.okallButton[0]) {
applyOthers = 1;
}
var applyOthers = 0;
if (this === elmts.okallButton[0]) {
applyOthers = 1;
}
var text = elmts.textarea[0].value;
var value = text;
var text = elmts.textarea[0].value;
var value = text;
if (type == "number") {
value = parseFloat(text);
if (isNaN(value)) {
alert("Not a valid number.");
return;
if (type == "number") {
value = parseFloat(text);
if (isNaN(value)) {
alert("Not a valid number.");
return;
}
} else if (type == "boolean") {
value = ("true" == text);
} else if (type == "date") {
value = Date.parse(text);
if (!value) {
alert("Not a valid date.");
return;
}
value = value.toString("yyyy-MM-ddTHH:mm:ssZ");
}
MenuSystem.dismissAll();
if (applyOthers) {
Refine.postCoreProcess(
"mass-edit",
{},
{
columnName: Refine.cellIndexToColumn(self._cellIndex).name,
expression: "value",
edits: JSON.stringify([{
from: [ originalContent ],
to: value,
type: type
}])
},
{ cellsChanged: true }
);
} else {
Refine.postCoreProcess(
"edit-one-cell",
{},
{
row: self._rowIndex,
cell: self._cellIndex,
value: value,
type: type
},
{},
{
onDone: function(o) {
if (o.cell.r) {
o.cell.r = o.pool.recons[o.cell.r];
}
} else if (type == "boolean") {
value = ("true" == text);
} else if (type == "date") {
value = Date.parse(text);
if (!value) {
alert("Not a valid date.");
return;
}
value = value.toString("yyyy-MM-ddTHH:mm:ssZ");
self._cell = o.cell;
self._dataTableView._updateCell(self._rowIndex, self._cellIndex, self._cell);
self._render();
}
}
);
}
};
MenuSystem.dismissAll();
if (applyOthers) {
Refine.postCoreProcess(
"mass-edit",
{},
{
columnName: Refine.cellIndexToColumn(self._cellIndex).name,
expression: "value",
edits: JSON.stringify([{
from: [ originalContent ],
to: value,
type: type
}])
},
{ cellsChanged: true }
);
elmts.okButton.click(commit);
elmts.okallButton.click(commit);
elmts.textarea
.text(originalContent)
.keydown(function(evt) {
if (!evt.shiftKey) {
if (evt.keyCode == 13) {
if (evt.ctrlKey) {
elmts.okallButton.trigger('click');
} else {
Refine.postCoreProcess(
"edit-one-cell",
{},
{
row: self._rowIndex,
cell: self._cellIndex,
value: value,
type: type
},
{},
{
onDone: function(o) {
if (o.cell.r) {
o.cell.r = o.pool.recons[o.cell.r];
}
self._cell = o.cell;
self._dataTableView._updateCell(self._rowIndex, self._cellIndex, self._cell);
self._render();
}
}
);
elmts.okButton.trigger('click');
}
};
elmts.okButton.click(commit);
elmts.okallButton.click(commit);
elmts.textarea
.text(originalContent)
.keydown(function(evt) {
if (!evt.shiftKey) {
if (evt.keyCode == 13) {
if (evt.ctrlKey) {
elmts.okallButton.trigger('click');
} else {
elmts.okButton.trigger('click');
}
} else if (evt.keyCode == 27) {
MenuSystem.dismissAll();
}
}
})
.select()
.focus();
elmts.cancelButton.click(function() {
} else if (evt.keyCode == 27) {
MenuSystem.dismissAll();
});
}
}
})
.select()
.focus();
elmts.cancelButton.click(function() {
MenuSystem.dismissAll();
});
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,322 +29,322 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
function DataTableColumnHeaderUI(dataTableView, column, columnIndex, td) {
this._dataTableView = dataTableView;
this._column = column;
this._columnIndex = columnIndex;
this._td = td;
this._dataTableView = dataTableView;
this._column = column;
this._columnIndex = columnIndex;
this._td = td;
this._render();
this._render();
}
DataTableColumnHeaderUI._extenders = [];
/*
To extend, call
To extend, call
DataTableColumnHeaderUI.extendMenu(function(column, columnHeaderUI, menu) {
...
MenuSystem.appendTo(menu, path, newItems);
});
*/
DataTableColumnHeaderUI.extendMenu(function(column, columnHeaderUI, menu) {
...
MenuSystem.appendTo(menu, path, newItems);
});
*/
DataTableColumnHeaderUI.extendMenu = function(extender) {
DataTableColumnHeaderUI._extenders.push(extender);
DataTableColumnHeaderUI._extenders.push(extender);
};
DataTableColumnHeaderUI.prototype.getColumn = function() {
return this._column;
return this._column;
};
DataTableColumnHeaderUI.prototype._render = function() {
var self = this;
var td = $(this._td);
var self = this;
var td = $(this._td);
td.html(DOM.loadHTML("core", "scripts/views/data-table/column-header.html"));
var elmts = DOM.bind(td);
td.html(DOM.loadHTML("core", "scripts/views/data-table/column-header.html"));
var elmts = DOM.bind(td);
elmts.nameContainer.text(this._column.name);
elmts.dropdownMenu.click(function() {
self._createMenuForColumnHeader(this);
});
elmts.nameContainer.text(this._column.name);
elmts.dropdownMenu.click(function() {
self._createMenuForColumnHeader(this);
});
if ("reconStats" in this._column) {
var stats = this._column.reconStats;
if (stats.nonBlanks > 0) {
var newPercent = Math.ceil(100 * stats.newTopics / stats.nonBlanks);
var matchPercent = Math.ceil(100 * stats.matchedTopics / stats.nonBlanks);
var unreconciledPercent = Math.ceil(100 * (stats.nonBlanks - stats.matchedTopics - stats.newTopics) / stats.nonBlanks);
var title = matchPercent + "% matched, " + newPercent + "% new, " + unreconciledPercent + "% to be reconciled";
if ("reconStats" in this._column) {
var stats = this._column.reconStats;
if (stats.nonBlanks > 0) {
var newPercent = Math.ceil(100 * stats.newTopics / stats.nonBlanks);
var matchPercent = Math.ceil(100 * stats.matchedTopics / stats.nonBlanks);
var unreconciledPercent = Math.ceil(100 * (stats.nonBlanks - stats.matchedTopics - stats.newTopics) / stats.nonBlanks);
var title = matchPercent + "% matched, " + newPercent + "% new, " + unreconciledPercent + "% to be reconciled";
var whole = $('<div>')
.addClass("column-header-recon-stats-bar")
.attr("title", title)
.appendTo(elmts.reconStatsContainer.show());
var whole = $('<div>')
.addClass("column-header-recon-stats-bar")
.attr("title", title)
.appendTo(elmts.reconStatsContainer.show());
$('<div>')
.addClass("column-header-recon-stats-blanks")
.width(Math.round((stats.newTopics + stats.matchedTopics) * 100 / stats.nonBlanks) + "%")
.appendTo(whole);
$('<div>')
.addClass("column-header-recon-stats-blanks")
.width(Math.round((stats.newTopics + stats.matchedTopics) * 100 / stats.nonBlanks) + "%")
.appendTo(whole);
$('<div>')
.addClass("column-header-recon-stats-matched")
.width(Math.round(stats.matchedTopics * 100 / stats.nonBlanks) + "%")
.appendTo(whole);
}
$('<div>')
.addClass("column-header-recon-stats-matched")
.width(Math.round(stats.matchedTopics * 100 / stats.nonBlanks) + "%")
.appendTo(whole);
}
}
};
DataTableColumnHeaderUI.prototype._createMenuForColumnHeader = function(elmt) {
var self = this;
var menu = [
var self = this;
var menu = [
{
id: "core/facet",
label: "Facet",
width: "170px",
submenu: []
},
{},
{
id: "core/edit-cells",
label: "Edit cells",
width: "170px",
submenu: []
},
{
id: "core/edit-column",
label: "Edit column",
submenu: []
},
{
id: "core/transpose",
label: "Transpose",
submenu: []
},
{},
(
this._dataTableView._getSortingCriterionForColumn(this._column.name) == null ?
{
id: "core/facet",
label: "Facet",
width: "170px",
submenu: []
},
{},
id: "core/sort",
"label": "Sort...",
"click": function() {
self._showSortingCriterion(null, self._dataTableView._getSortingCriteriaCount() > 0)
}
} :
{
id: "core/edit-cells",
label: "Edit cells",
width: "170px",
submenu: []
},
{
id: "core/edit-column",
label: "Edit column",
submenu: []
},
{
id: "core/transpose",
label: "Transpose",
submenu: []
},
{},
(
this._dataTableView._getSortingCriterionForColumn(this._column.name) == null ?
{
id: "core/sort",
"label": "Sort...",
"click": function() {
self._showSortingCriterion(null, self._dataTableView._getSortingCriteriaCount() > 0)
}
} :
{
id: "core/sort",
label: "Sort",
submenu: this.createSortingMenu()
}
),
{
id: "core/view",
label: "View",
tooltip: "Collapse/expand columns to make viewing the data more convenient",
submenu: [
{
label: "Collapse this column",
click: function() {
self._dataTableView._collapsedColumnNames[self._column.name] = true;
self._dataTableView.render();
}
},
{
label: "Collapse all other columns",
click: function() {
var collapsedColumnNames = {};
for (var i = 0; i < theProject.columnModel.columns.length; i++) {
if (i != self._columnIndex) {
collapsedColumnNames[theProject.columnModel.columns[i].name] = true;
}
}
self._dataTableView._collapsedColumnNames = collapsedColumnNames;
self._dataTableView.render();
}
},
{
label: "Collapse all columns to left",
click: function() {
for (var i = 0; i < self._columnIndex; i++) {
self._dataTableView._collapsedColumnNames[theProject.columnModel.columns[i].name] = true;
}
self._dataTableView.render();
}
},
{
label: "Collapse all columns to right",
click: function() {
for (var i = self._columnIndex + 1; i < theProject.columnModel.columns.length; i++) {
self._dataTableView._collapsedColumnNames[theProject.columnModel.columns[i].name] = true;
}
self._dataTableView.render();
}
}
]
},
{},
{
id: "core/reconcile",
label: "Reconcile",
tooltip: "Match this column's cells to topics on Freebase",
width: "170px",
submenu: []
id: "core/sort",
label: "Sort",
submenu: this.createSortingMenu()
}
];
for (var i = 0; i < DataTableColumnHeaderUI._extenders.length; i++) {
DataTableColumnHeaderUI._extenders[i].call(null, this._column, this, menu);
),
{
id: "core/view",
label: "View",
tooltip: "Collapse/expand columns to make viewing the data more convenient",
submenu: [
{
label: "Collapse this column",
click: function() {
self._dataTableView._collapsedColumnNames[self._column.name] = true;
self._dataTableView.render();
}
},
{
label: "Collapse all other columns",
click: function() {
var collapsedColumnNames = {};
for (var i = 0; i < theProject.columnModel.columns.length; i++) {
if (i != self._columnIndex) {
collapsedColumnNames[theProject.columnModel.columns[i].name] = true;
}
}
self._dataTableView._collapsedColumnNames = collapsedColumnNames;
self._dataTableView.render();
}
},
{
label: "Collapse all columns to left",
click: function() {
for (var i = 0; i < self._columnIndex; i++) {
self._dataTableView._collapsedColumnNames[theProject.columnModel.columns[i].name] = true;
}
self._dataTableView.render();
}
},
{
label: "Collapse all columns to right",
click: function() {
for (var i = self._columnIndex + 1; i < theProject.columnModel.columns.length; i++) {
self._dataTableView._collapsedColumnNames[theProject.columnModel.columns[i].name] = true;
}
self._dataTableView.render();
}
}
]
},
{},
{
id: "core/reconcile",
label: "Reconcile",
tooltip: "Match this column's cells to topics on Freebase",
width: "170px",
submenu: []
}
];
MenuSystem.createAndShowStandardMenu(menu, elmt, { width: "120px", horizontal: false });
for (var i = 0; i < DataTableColumnHeaderUI._extenders.length; i++) {
DataTableColumnHeaderUI._extenders[i].call(null, this._column, this, menu);
}
MenuSystem.createAndShowStandardMenu(menu, elmt, { width: "120px", horizontal: false });
};
DataTableColumnHeaderUI.prototype.createSortingMenu = function() {
var self = this;
var criterion = this._dataTableView._getSortingCriterionForColumn(this._column.name);
var criteriaCount = this._dataTableView._getSortingCriteriaCount();
var hasOtherCriteria = criterion == null ? (criteriaCount > 0) : criteriaCount > 1;
var self = this;
var criterion = this._dataTableView._getSortingCriterionForColumn(this._column.name);
var criteriaCount = this._dataTableView._getSortingCriteriaCount();
var hasOtherCriteria = criterion == null ? (criteriaCount > 0) : criteriaCount > 1;
var items = [
{
"label": "Sort...",
"click": function() {
self._showSortingCriterion(criterion, hasOtherCriteria)
}
}
];
if (criterion != null) {
items.push({
"label": "Reverse",
"click": function() {
criterion.reverse = !criterion.reverse;
self._dataTableView._addSortingCriterion(criterion);
}
});
items.push({
"label": "Remove sort",
"click": function() {
self._dataTableView._removeSortingCriterionOfColumn(criterion.column);
}
});
var items = [
{
"label": "Sort...",
"click": function() {
self._showSortingCriterion(criterion, hasOtherCriteria)
}
}
];
return items;
if (criterion != null) {
items.push({
"label": "Reverse",
"click": function() {
criterion.reverse = !criterion.reverse;
self._dataTableView._addSortingCriterion(criterion);
}
});
items.push({
"label": "Remove sort",
"click": function() {
self._dataTableView._removeSortingCriterionOfColumn(criterion.column);
}
});
}
return items;
};
DataTableColumnHeaderUI.prototype._showSortingCriterion = function(criterion, hasOtherCriteria) {
criterion = criterion || {
column: this._column.name,
valueType: "string",
caseSensitive: false,
errorPosition: 1,
blankPosition: 2
};
criterion = criterion || {
column: this._column.name,
valueType: "string",
caseSensitive: false,
errorPosition: 1,
blankPosition: 2
};
var self = this;
var frame = $(DOM.loadHTML("core", "scripts/views/data-table/sorting-criterion-dialog.html"));
var elmts = DOM.bind(frame);
var self = this;
var frame = $(DOM.loadHTML("core", "scripts/views/data-table/sorting-criterion-dialog.html"));
var elmts = DOM.bind(frame);
elmts.dialogHeader.text('Sort by ' + this._column.name);
elmts.dialogHeader.text('Sort by ' + this._column.name);
elmts.valueTypeOptions
.find("input[type='radio'][value='" + criterion.valueType + "']")
.attr("checked", "checked");
elmts.valueTypeOptions
.find("input[type='radio'][value='" + criterion.valueType + "']")
.attr("checked", "checked");
var setValueType = function(valueType) {
var forward = elmts.directionForwardLabel;
var reverse = elmts.directionReverseLabel;
if (valueType == "string") {
forward.html("a - z");
reverse.html("z - a");
} else if (valueType == "number") {
forward.html("smallest first");
reverse.html("largest first");
} else if (valueType == "date") {
forward.html("earliest first");
reverse.html("latest first");
} else if (valueType == "boolean") {
forward.html("false then true");
reverse.html("true then false");
}
};
elmts.valueTypeOptions
.find("input[type='radio']")
.change(function() {
setValueType(this.value);
});
if (criterion.valueType == "string" && criterion.caseSensitive) {
elmts.caseSensitiveCheckbox.attr("checked", "checked");
var setValueType = function(valueType) {
var forward = elmts.directionForwardLabel;
var reverse = elmts.directionReverseLabel;
if (valueType == "string") {
forward.html("a - z");
reverse.html("z - a");
} else if (valueType == "number") {
forward.html("smallest first");
reverse.html("largest first");
} else if (valueType == "date") {
forward.html("earliest first");
reverse.html("latest first");
} else if (valueType == "boolean") {
forward.html("false then true");
reverse.html("true then false");
}
};
elmts.valueTypeOptions
.find("input[type='radio']")
.change(function() {
setValueType(this.value);
});
elmts.directionOptions
.find("input[type='radio'][value='" + (criterion.reverse ? "reverse" : "forward") + "']")
.attr("checked", "checked");
if (criterion.valueType == "string" && criterion.caseSensitive) {
elmts.caseSensitiveCheckbox.attr("checked", "checked");
}
if (hasOtherCriteria) {
elmts.sortAloneContainer.show();
}
elmts.directionOptions
.find("input[type='radio'][value='" + (criterion.reverse ? "reverse" : "forward") + "']")
.attr("checked", "checked");
var validValuesHtml = '<li kind="value">Valid values</li>';
var blankValuesHtml = '<li kind="blank">Blanks</li>';
var errorValuesHtml = '<li kind="error">Errors</li>';
var positionsHtml;
if (criterion.blankPosition < 0) {
if (criterion.errorPosition > 0) {
positionsHtml = [ blankValuesHtml, validValuesHtml, errorValuesHtml ];
} else if (criterion.errorPosition < criterion.blankPosition) {
positionsHtml = [ errorValuesHtml, blankValuesHtml, validValuesHtml ];
} else {
positionsHtml = [ blankValuesHtml, errorValuesHtml, validValuesHtml ];
}
if (hasOtherCriteria) {
elmts.sortAloneContainer.show();
}
var validValuesHtml = '<li kind="value">Valid values</li>';
var blankValuesHtml = '<li kind="blank">Blanks</li>';
var errorValuesHtml = '<li kind="error">Errors</li>';
var positionsHtml;
if (criterion.blankPosition < 0) {
if (criterion.errorPosition > 0) {
positionsHtml = [ blankValuesHtml, validValuesHtml, errorValuesHtml ];
} else if (criterion.errorPosition < criterion.blankPosition) {
positionsHtml = [ errorValuesHtml, blankValuesHtml, validValuesHtml ];
} else {
if (criterion.errorPosition < 0) {
positionsHtml = [ errorValuesHtml, validValuesHtml, blankValuesHtml ];
} else if (criterion.errorPosition < criterion.blankPosition) {
positionsHtml = [ validValuesHtml, errorValuesHtml, blankValuesHtml ];
} else {
positionsHtml = [ validValuesHtml, blankValuesHtml, errorValuesHtml ];
}
positionsHtml = [ blankValuesHtml, errorValuesHtml, validValuesHtml ];
}
elmts.blankErrorPositions.html(positionsHtml.join("")).sortable().disableSelection();
} else {
if (criterion.errorPosition < 0) {
positionsHtml = [ errorValuesHtml, validValuesHtml, blankValuesHtml ];
} else if (criterion.errorPosition < criterion.blankPosition) {
positionsHtml = [ validValuesHtml, errorValuesHtml, blankValuesHtml ];
} else {
positionsHtml = [ validValuesHtml, blankValuesHtml, errorValuesHtml ];
}
}
elmts.blankErrorPositions.html(positionsHtml.join("")).sortable().disableSelection();
var level = DialogSystem.showDialog(frame);
var dismiss = function() { DialogSystem.dismissUntil(level - 1); };
var level = DialogSystem.showDialog(frame);
var dismiss = function() { DialogSystem.dismissUntil(level - 1); };
setValueType(criterion.valueType);
setValueType(criterion.valueType);
elmts.cancelButton.click(dismiss);
elmts.okButton.click(function() {
var criterion2 = {
column: self._column.name,
valueType: elmts.valueTypeOptions.find("input[type='radio']:checked")[0].value,
reverse: elmts.directionOptions.find("input[type='radio']:checked")[0].value == "reverse"
};
elmts.cancelButton.click(dismiss);
elmts.okButton.click(function() {
var criterion2 = {
column: self._column.name,
valueType: elmts.valueTypeOptions.find("input[type='radio']:checked")[0].value,
reverse: elmts.directionOptions.find("input[type='radio']:checked")[0].value == "reverse"
};
var valuePosition, blankPosition, errorPosition;
elmts.blankErrorPositions.find("li").each(function(index, elmt) {
var kind = this.getAttribute("kind");
if (kind == "value") {
valuePosition = index;
} else if (kind == "blank") {
blankPosition = index;
} else if (kind == "error") {
errorPosition = index;
}
});
criterion2.blankPosition = blankPosition - valuePosition;
criterion2.errorPosition = errorPosition - valuePosition;
if (criterion2.valueType == "string") {
criterion2.caseSensitive = elmts.caseSensitiveCheckbox[0].checked;
}
self._dataTableView._addSortingCriterion(
criterion2, elmts.sortAloneContainer.find("input")[0].checked);
dismiss();
var valuePosition, blankPosition, errorPosition;
elmts.blankErrorPositions.find("li").each(function(index, elmt) {
var kind = this.getAttribute("kind");
if (kind == "value") {
valuePosition = index;
} else if (kind == "blank") {
blankPosition = index;
} else if (kind == "error") {
errorPosition = index;
}
});
criterion2.blankPosition = blankPosition - valuePosition;
criterion2.errorPosition = errorPosition - valuePosition;
if (criterion2.valueType == "string") {
criterion2.caseSensitive = elmts.caseSensitiveCheckbox[0].checked;
}
self._dataTableView._addSortingCriterion(
criterion2, elmts.sortAloneContainer.find("input")[0].checked);
dismiss();
});
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,318 +29,319 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
DataTableColumnHeaderUI.extendMenu(function(column, columnHeaderUI, menu) {
var doTextTransform = function(expression, onError, repeat, repeatCount) {
Refine.postCoreProcess(
"text-transform",
{
columnName: column.name,
expression: expression,
onError: onError,
repeat: repeat,
repeatCount: repeatCount
},
null,
{ cellsChanged: true }
);
var doTextTransform = function(expression, onError, repeat, repeatCount) {
Refine.postCoreProcess(
"text-transform",
{
columnName: column.name,
expression: expression,
onError: onError,
repeat: repeat,
repeatCount: repeatCount
},
null,
{ cellsChanged: true }
);
};
var doTextTransformPrompt = function() {
var frame = $(
DOM.loadHTML("core", "scripts/views/data-table/text-transform-dialog.html")
.replace("$EXPRESSION_PREVIEW_WIDGET$", ExpressionPreviewDialog.generateWidgetHtml()));
var elmts = DOM.bind(frame);
elmts.dialogHeader.text("Custom text transform on column " + column.name);
var level = DialogSystem.showDialog(frame);
var dismiss = function() { DialogSystem.dismissUntil(level - 1); };
elmts.cancelButton.click(dismiss);
elmts.okButton.click(function() {
doTextTransform(
previewWidget.getExpression(true),
$('input[name="text-transform-dialog-onerror-choice"]:checked')[0].value,
elmts.repeatCheckbox[0].checked,
elmts.repeatCountInput[0].value
);
dismiss();
});
var o = DataTableView.sampleVisibleRows(column);
var previewWidget = new ExpressionPreviewDialog.Widget(
elmts,
column.cellIndex,
o.rowIndices,
o.values,
null
);
previewWidget._prepareUpdate = function(params) {
params.repeat = elmts.repeatCheckbox[0].checked;
params.repeatCount = elmts.repeatCountInput[0].value;
};
elmts.repeatCheckbox.click(function() {
previewWidget.update();
});
};
var doTextTransformPrompt = function() {
var frame = $(
DOM.loadHTML("core", "scripts/views/data-table/text-transform-dialog.html")
.replace("$EXPRESSION_PREVIEW_WIDGET$", ExpressionPreviewDialog.generateWidgetHtml()));
var doFillDown = function() {
Refine.postCoreProcess(
"fill-down",
{
columnName: column.name
},
null,
{ modelsChanged: true }
);
};
var elmts = DOM.bind(frame);
elmts.dialogHeader.text("Custom text transform on column " + column.name);
var doBlankDown = function() {
Refine.postCoreProcess(
"blank-down",
{
columnName: column.name
},
null,
{ modelsChanged: true }
);
};
var level = DialogSystem.showDialog(frame);
var dismiss = function() { DialogSystem.dismissUntil(level - 1); };
elmts.cancelButton.click(dismiss);
elmts.okButton.click(function() {
doTextTransform(
previewWidget.getExpression(true),
$('input[name="text-transform-dialog-onerror-choice"]:checked')[0].value,
elmts.repeatCheckbox[0].checked,
elmts.repeatCountInput[0].value
);
dismiss();
});
var o = DataTableView.sampleVisibleRows(column);
var previewWidget = new ExpressionPreviewDialog.Widget(
elmts,
column.cellIndex,
o.rowIndices,
o.values,
null
);
previewWidget._prepareUpdate = function(params) {
params.repeat = elmts.repeatCheckbox[0].checked;
params.repeatCount = elmts.repeatCountInput[0].value;
};
elmts.repeatCheckbox.click(function() {
previewWidget.update();
});
};
var doFillDown = function() {
Refine.postCoreProcess(
"fill-down",
{
columnName: column.name
},
null,
{ modelsChanged: true }
);
};
var doBlankDown = function() {
Refine.postCoreProcess(
"blank-down",
{
columnName: column.name
},
null,
{ modelsChanged: true }
);
};
var doJoinMultiValueCells = function() {
var separator = window.prompt("Enter separator to use between values", ", ");
if (separator !== null) {
Refine.postCoreProcess(
"join-multi-value-cells",
{
columnName: column.name,
keyColumnName: theProject.columnModel.keyColumnName,
separator: separator
},
null,
{ rowsChanged: true }
);
}
};
var doSplitMultiValueCells = function() {
var separator = window.prompt("What separator currently separates the values?", ",");
if (separator !== null) {
Refine.postCoreProcess(
"split-multi-value-cells",
{
columnName: column.name,
keyColumnName: theProject.columnModel.keyColumnName,
separator: separator,
mode: "plain"
},
null,
{ rowsChanged: true }
);
}
};
MenuSystem.appendTo(menu, [ "core/edit-cells" ], [
var doJoinMultiValueCells = function() {
var separator = window.prompt("Enter separator to use between values", ", ");
if (separator !== null) {
Refine.postCoreProcess(
"join-multi-value-cells",
{
id: "core/text-transform",
label: "Transform...",
click: function() { doTextTransformPrompt(); }
columnName: column.name,
keyColumnName: theProject.columnModel.keyColumnName,
separator: separator
},
null,
{ rowsChanged: true }
);
}
};
var doSplitMultiValueCells = function() {
var separator = window.prompt("What separator currently separates the values?", ",");
if (separator !== null) {
Refine.postCoreProcess(
"split-multi-value-cells",
{
columnName: column.name,
keyColumnName: theProject.columnModel.keyColumnName,
separator: separator,
mode: "plain"
},
null,
{ rowsChanged: true }
);
}
};
MenuSystem.appendTo(menu, [ "core/edit-cells" ], [
{
id: "core/text-transform",
label: "Transform...",
click: function() { doTextTransformPrompt(); }
},
{
id: "core/common-transforms",
label: "Common transforms",
submenu: [
{
id: "core/trim-whitespace",
label: "Trim leading and trailing whitespace",
click: function() { doTextTransform("value.trim()", "store-blank", false, ""); }
},
{
id: "core/common-transforms",
label: "Common transforms",
submenu: [
{
id: "core/trim-whitespace",
label: "Trim leading and trailing whitespace",
click: function() { doTextTransform("value.trim()", "store-blank", false, ""); }
},
{
id: "core/collapse-whitespace",
label: "Collapse consecutive whitespace",
click: function() { doTextTransform("value.replace(/\\s+/,' ')", "store-blank", false, ""); }
},
{},
{
id: "core/unescape-html-entities",
label: "Unescape HTML entities",
click: function() { doTextTransform("value.unescape('html')", "store-blank", true, 10); }
},
{},
{
id: "core/to-titlecase",
label: "To titlecase",
click: function() { doTextTransform("value.toTitlecase()", "store-blank", false, ""); }
},
{
id: "core/to-uppercase",
label: "To uppercase",
click: function() { doTextTransform("value.toUppercase()", "store-blank", false, ""); }
},
{
id: "core/to-lowercase",
label: "To lowercase",
click: function() { doTextTransform("value.toLowercase()", "store-blank", false, ""); }
},
{},
{
id: "core/to-number",
label: "To number",
click: function() { doTextTransform("value.toNumber()", "store-blank", false, ""); }
},
{
id: "core/to-date",
label: "To date",
click: function() { doTextTransform("value.toDate()", "store-blank", false, ""); }
},
{
id: "core/to-text",
label: "To text",
click: function() { doTextTransform("value.toString()", "store-blank", false, ""); }
},
{},
{
id: "core/to-blank",
label: "Blank out cells",
click: function() { doTextTransform("null", "store-blank", false, ""); }
}
]
id: "core/collapse-whitespace",
label: "Collapse consecutive whitespace",
click: function() { doTextTransform("value.replace(/\\s+/,' ')", "store-blank", false, ""); }
},
{},
{
id: "core/fill-down",
label: "Fill down",
click: doFillDown
},
{
id: "core/blank-down",
label: "Blank down",
click: doBlankDown
id: "core/unescape-html-entities",
label: "Unescape HTML entities",
click: function() { doTextTransform("value.unescape('html')", "store-blank", true, 10); }
},
{},
{
id: "core/split-multi-valued-cells",
label: "Split multi-valued cells...",
click: doSplitMultiValueCells
id: "core/to-titlecase",
label: "To titlecase",
click: function() { doTextTransform("value.toTitlecase()", "store-blank", false, ""); }
},
{
id: "core/join-multi-valued-cells",
label: "Join multi-valued cells...",
click: doJoinMultiValueCells
id: "core/to-uppercase",
label: "To uppercase",
click: function() { doTextTransform("value.toUppercase()", "store-blank", false, ""); }
},
{
id: "core/to-lowercase",
label: "To lowercase",
click: function() { doTextTransform("value.toLowercase()", "store-blank", false, ""); }
},
{},
{
id: "core/cluster",
label: "Cluster and edit...",
click: function() { new ClusteringDialog(column.name, "value"); }
}
]);
var doTransposeColumnsIntoRows = function() {
var dialog = $(DOM.loadHTML("core", "scripts/views/data-table/transpose-columns-into-rows.html"));
var elmts = DOM.bind(dialog);
elmts.dialogHeader.text('Transpose Cells Across Columns into Rows');
var level = DialogSystem.showDialog(dialog);
var dismiss = function() {
DialogSystem.dismissUntil(level - 1);
};
var columns = theProject.columnModel.columns;
elmts.cancelButton.click(function() { dismiss(); });
elmts.okButton.click(function() {
var config = {
startColumnName: elmts.fromColumnSelect[0].value,
columnCount: elmts.toColumnSelect[0].value,
combinedColumnName: $.trim(elmts.combinedColumnNameInput[0].value),
prependColumnName: elmts.prependColumnNameCheckbox[0].checked,
separator: elmts.separatorInput[0].value,
ignoreBlankCells: elmts.ignoreBlankCellsCheckbox[0].checked
};
Refine.postCoreProcess(
"transpose-columns-into-rows",
config,
null,
{ modelsChanged: true }
);
dismiss();
});
for (var i = 0; i < columns.length; i++) {
var column2 = columns[i];
var option = $('<option>').attr("value", column2.name).text(column2.name).appendTo(elmts.fromColumnSelect);
if (column2.name == column.name) {
option.attr("selected", "true");
}
}
var populateToColumn = function() {
elmts.toColumnSelect.empty();
var toColumnName = elmts.fromColumnSelect[0].value;
var j = 0;
for (; j < columns.length; j++) {
var column2 = columns[j];
if (column2.name == toColumnName) {
break;
}
}
for (var k = j + 1; k < columns.length; k++) {
var column2 = columns[k];
var option = $('<option>').attr("value", k - j + 1).text(column2.name).appendTo(elmts.toColumnSelect);
if (k == columns.length - 1) {
option.attr("selected", "true");
}
}
};
populateToColumn();
elmts.fromColumnSelect.bind("change", populateToColumn);
};
var doTransposeRowsIntoColumns = function() {
var rowCount = window.prompt("How many rows to transpose?", "2");
if (rowCount != null) {
try {
rowCount = parseInt(rowCount);
} catch (e) {
// ignore
}
if (isNaN(rowCount) || rowCount < 2) {
alert("Expected an integer at least 2.");
} else {
var config = {
columnName: column.name,
rowCount: rowCount
};
Refine.postCoreProcess(
"transpose-rows-into-columns",
config,
null,
{ modelsChanged: true }
);
}
}
};
MenuSystem.appendTo(menu, [ "core/transpose" ], [
{
id: "core/transpose-columns-into-rows",
label: "Cells across columns into rows...",
click: doTransposeColumnsIntoRows
id: "core/to-number",
label: "To number",
click: function() { doTextTransform("value.toNumber()", "store-blank", false, ""); }
},
{
id: "core/transpose-rows-into-columns",
label: "Cells in rows into columns...",
click: doTransposeRowsIntoColumns
id: "core/to-date",
label: "To date",
click: function() { doTextTransform("value.toDate()", "store-blank", false, ""); }
},
{
id: "core/to-text",
label: "To text",
click: function() { doTextTransform("value.toString()", "store-blank", false, ""); }
},
{},
{
id: "core/to-blank",
label: "Blank out cells",
click: function() { doTextTransform("null", "store-blank", false, ""); }
}
]);
]
},
{},
{
id: "core/fill-down",
label: "Fill down",
click: doFillDown
},
{
id: "core/blank-down",
label: "Blank down",
click: doBlankDown
},
{},
{
id: "core/split-multi-valued-cells",
label: "Split multi-valued cells...",
click: doSplitMultiValueCells
},
{
id: "core/join-multi-valued-cells",
label: "Join multi-valued cells...",
click: doJoinMultiValueCells
},
{},
{
id: "core/cluster",
label: "Cluster and edit...",
click: function() { new ClusteringDialog(column.name, "value"); }
}
]);
var doTransposeColumnsIntoRows = function() {
var dialog = $(DOM.loadHTML("core", "scripts/views/data-table/transpose-columns-into-rows.html"));
var elmts = DOM.bind(dialog);
elmts.dialogHeader.text('Transpose Cells Across Columns into Rows');
var level = DialogSystem.showDialog(dialog);
var dismiss = function() {
DialogSystem.dismissUntil(level - 1);
};
var columns = theProject.columnModel.columns;
elmts.cancelButton.click(function() { dismiss(); });
elmts.okButton.click(function() {
var config = {
startColumnName: elmts.fromColumnSelect[0].value,
columnCount: elmts.toColumnSelect[0].value,
combinedColumnName: $.trim(elmts.combinedColumnNameInput[0].value),
prependColumnName: elmts.prependColumnNameCheckbox[0].checked,
separator: elmts.separatorInput[0].value,
ignoreBlankCells: elmts.ignoreBlankCellsCheckbox[0].checked
};
Refine.postCoreProcess(
"transpose-columns-into-rows",
config,
null,
{ modelsChanged: true }
);
dismiss();
});
for (var i = 0; i < columns.length; i++) {
var column2 = columns[i];
var option = $('<option>').attr("value", column2.name).text(column2.name).appendTo(elmts.fromColumnSelect);
if (column2.name == column.name) {
option.attr("selected", "true");
}
}
var populateToColumn = function() {
elmts.toColumnSelect.empty();
var toColumnName = elmts.fromColumnSelect[0].value;
var j = 0;
for (; j < columns.length; j++) {
var column2 = columns[j];
if (column2.name == toColumnName) {
break;
}
}
for (var k = j + 1; k < columns.length; k++) {
var column2 = columns[k];
var option = $('<option>').attr("value", k - j + 1).text(column2.name).appendTo(elmts.toColumnSelect);
if (k == columns.length - 1) {
option.attr("selected", "true");
}
}
};
populateToColumn();
elmts.fromColumnSelect.bind("change", populateToColumn);
};
var doTransposeRowsIntoColumns = function() {
var rowCount = window.prompt("How many rows to transpose?", "2");
if (rowCount != null) {
try {
rowCount = parseInt(rowCount);
} catch (e) {
// ignore
}
if (isNaN(rowCount) || rowCount < 2) {
alert("Expected an integer at least 2.");
} else {
var config = {
columnName: column.name,
rowCount: rowCount
};
Refine.postCoreProcess(
"transpose-rows-into-columns",
config,
null,
{ modelsChanged: true }
);
}
}
};
MenuSystem.appendTo(menu, [ "core/transpose" ], [
{
id: "core/transpose-columns-into-rows",
label: "Cells across columns into rows...",
click: doTransposeColumnsIntoRows
},
{
id: "core/transpose-rows-into-columns",
label: "Cells in rows into columns...",
click: doTransposeRowsIntoColumns
}
]
);
});

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,260 +29,261 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
DataTableColumnHeaderUI.extendMenu(function(column, columnHeaderUI, menu) {
var columnIndex = Refine.columnNameToColumnIndex(column.name);
var doAddColumn = function() {
var frame = $(
DOM.loadHTML("core", "scripts/views/data-table/add-column-dialog.html")
.replace("$EXPRESSION_PREVIEW_WIDGET$", ExpressionPreviewDialog.generateWidgetHtml()));
var columnIndex = Refine.columnNameToColumnIndex(column.name);
var doAddColumn = function() {
var frame = $(
DOM.loadHTML("core", "scripts/views/data-table/add-column-dialog.html")
.replace("$EXPRESSION_PREVIEW_WIDGET$", ExpressionPreviewDialog.generateWidgetHtml()));
var elmts = DOM.bind(frame);
elmts.dialogHeader.text("Add column based on column " + column.name);
var elmts = DOM.bind(frame);
elmts.dialogHeader.text("Add column based on column " + column.name);
var level = DialogSystem.showDialog(frame);
var dismiss = function() { DialogSystem.dismissUntil(level - 1); };
var level = DialogSystem.showDialog(frame);
var dismiss = function() { DialogSystem.dismissUntil(level - 1); };
elmts.cancelButton.click(dismiss);
elmts.okButton.click(function() {
var columnName = $.trim(elmts.columnNameInput[0].value);
if (!columnName.length) {
alert("You must enter a column name.");
return;
}
elmts.cancelButton.click(dismiss);
elmts.okButton.click(function() {
var columnName = $.trim(elmts.columnNameInput[0].value);
if (!columnName.length) {
alert("You must enter a column name.");
return;
}
Refine.postCoreProcess(
"add-column",
{
baseColumnName: column.name,
expression: previewWidget.getExpression(true),
newColumnName: columnName,
columnInsertIndex: columnIndex + 1,
onError: $('input[name="create-column-dialog-onerror-choice"]:checked')[0].value
},
null,
{ modelsChanged: true }
);
dismiss();
});
Refine.postCoreProcess(
"add-column",
{
baseColumnName: column.name,
expression: previewWidget.getExpression(true),
newColumnName: columnName,
columnInsertIndex: columnIndex + 1,
onError: $('input[name="create-column-dialog-onerror-choice"]:checked')[0].value
},
null,
{ modelsChanged: true }
);
dismiss();
});
var o = DataTableView.sampleVisibleRows(column);
var previewWidget = new ExpressionPreviewDialog.Widget(
elmts,
column.cellIndex,
o.rowIndices,
o.values,
null
);
};
var o = DataTableView.sampleVisibleRows(column);
var previewWidget = new ExpressionPreviewDialog.Widget(
elmts,
column.cellIndex,
o.rowIndices,
o.values,
null
);
};
var doAddColumnByFetchingURLs = function() {
var frame = $(
DOM.loadHTML("core", "scripts/views/data-table/add-column-by-fetching-urls-dialog.html")
.replace("$EXPRESSION_PREVIEW_WIDGET$", ExpressionPreviewDialog.generateWidgetHtml()));
var doAddColumnByFetchingURLs = function() {
var frame = $(
DOM.loadHTML("core", "scripts/views/data-table/add-column-by-fetching-urls-dialog.html")
.replace("$EXPRESSION_PREVIEW_WIDGET$", ExpressionPreviewDialog.generateWidgetHtml()));
var elmts = DOM.bind(frame);
elmts.dialogHeader.text("Add column by fetching URLs based on column " + column.name);
var elmts = DOM.bind(frame);
elmts.dialogHeader.text("Add column by fetching URLs based on column " + column.name);
var level = DialogSystem.showDialog(frame);
var dismiss = function() { DialogSystem.dismissUntil(level - 1); };
var level = DialogSystem.showDialog(frame);
var dismiss = function() { DialogSystem.dismissUntil(level - 1); };
elmts.cancelButton.click(dismiss);
elmts.okButton.click(function() {
var columnName = $.trim(elmts.columnNameInput[0].value);
if (!columnName.length) {
alert("You must enter a column name.");
return;
}
elmts.cancelButton.click(dismiss);
elmts.okButton.click(function() {
var columnName = $.trim(elmts.columnNameInput[0].value);
if (!columnName.length) {
alert("You must enter a column name.");
return;
}
Refine.postCoreProcess(
"add-column-by-fetching-urls",
{
baseColumnName: column.name,
urlExpression: previewWidget.getExpression(true),
newColumnName: columnName,
columnInsertIndex: columnIndex + 1,
delay: elmts.throttleDelayInput[0].value,
onError: $('input[name="dialog-onerror-choice"]:checked')[0].value
},
null,
{ modelsChanged: true }
);
dismiss();
});
Refine.postCoreProcess(
"add-column-by-fetching-urls",
{
baseColumnName: column.name,
urlExpression: previewWidget.getExpression(true),
newColumnName: columnName,
columnInsertIndex: columnIndex + 1,
delay: elmts.throttleDelayInput[0].value,
onError: $('input[name="dialog-onerror-choice"]:checked')[0].value
},
null,
{ modelsChanged: true }
);
dismiss();
});
var o = DataTableView.sampleVisibleRows(column);
var previewWidget = new ExpressionPreviewDialog.Widget(
elmts,
column.cellIndex,
o.rowIndices,
o.values,
null
);
};
var o = DataTableView.sampleVisibleRows(column);
var previewWidget = new ExpressionPreviewDialog.Widget(
elmts,
column.cellIndex,
o.rowIndices,
o.values,
null
);
};
var doRemoveColumn = function() {
Refine.postCoreProcess(
"remove-column",
{
columnName: column.name
},
null,
{ modelsChanged: true }
);
};
var doRemoveColumn = function() {
Refine.postCoreProcess(
"remove-column",
{
columnName: column.name
},
null,
{ modelsChanged: true }
);
};
var doRenameColumn = function() {
var newColumnName = window.prompt("Enter new column name", column.name);
if (newColumnName !== null) {
Refine.postCoreProcess(
"rename-column",
{
oldColumnName: column.name,
newColumnName: newColumnName
},
null,
{ modelsChanged: true }
);
var doRenameColumn = function() {
var newColumnName = window.prompt("Enter new column name", column.name);
if (newColumnName !== null) {
Refine.postCoreProcess(
"rename-column",
{
oldColumnName: column.name,
newColumnName: newColumnName
},
null,
{ modelsChanged: true }
);
}
};
var doMoveColumnTo = function(index) {
Refine.postCoreProcess(
"move-column",
{
columnName: column.name,
index: index
},
null,
{ modelsChanged: true }
);
};
var doMoveColumnBy = function(change) {
Refine.postCoreProcess(
"move-column",
{
columnName: column.name,
index: Refine.columnNameToColumnIndex(column.name) + change
},
null,
{ modelsChanged: true }
);
};
var doSplitColumn = function() {
var frame = $(DOM.loadHTML("core", "scripts/views/data-table/split-column-dialog.html"));
var elmts = DOM.bind(frame);
elmts.dialogHeader.text("Split column " + column.name + " into several columns");
var level = DialogSystem.showDialog(frame);
var dismiss = function() { DialogSystem.dismissUntil(level - 1); };
elmts.cancelButton.click(dismiss);
elmts.okButton.click(function() {
var mode = $("input[name='split-by-mode']:checked")[0].value;
var config = {
columnName: column.name,
mode: mode,
guessCellType: elmts.guessCellTypeInput[0].checked,
removeOriginalColumn: elmts.removeColumnInput[0].checked
};
if (mode == "separator") {
config.separator = elmts.separatorInput[0].value;
if (!(config.separator)) {
alert("Please specify a separator.");
return;
}
};
var doMoveColumnTo = function(index) {
Refine.postCoreProcess(
"move-column",
{
columnName: column.name,
index: index
},
null,
{ modelsChanged: true }
);
};
config.regex = elmts.regexInput[0].checked;
var doMoveColumnBy = function(change) {
Refine.postCoreProcess(
"move-column",
{
columnName: column.name,
index: Refine.columnNameToColumnIndex(column.name) + change
},
null,
{ modelsChanged: true }
);
};
var doSplitColumn = function() {
var frame = $(DOM.loadHTML("core", "scripts/views/data-table/split-column-dialog.html"));
var elmts = DOM.bind(frame);
elmts.dialogHeader.text("Split column " + column.name + " into several columns");
var level = DialogSystem.showDialog(frame);
var dismiss = function() { DialogSystem.dismissUntil(level - 1); };
elmts.cancelButton.click(dismiss);
elmts.okButton.click(function() {
var mode = $("input[name='split-by-mode']:checked")[0].value;
var config = {
columnName: column.name,
mode: mode,
guessCellType: elmts.guessCellTypeInput[0].checked,
removeOriginalColumn: elmts.removeColumnInput[0].checked
};
if (mode == "separator") {
config.separator = elmts.separatorInput[0].value;
if (!(config.separator)) {
alert("Please specify a separator.");
return;
}
config.regex = elmts.regexInput[0].checked;
var s = elmts.maxColumnsInput[0].value;
if (s) {
var n = parseInt(s,10);
if (!isNaN(n)) {
config.maxColumns = n;
}
}
} else {
var s = "[" + elmts.lengthsTextarea[0].value + "]";
try {
var a = JSON.parse(s);
} catch (e) {
alert("The given field lengths are not properly formatted.");
return;
}
var lengths = [];
$.each(a, function(i,n) { if (typeof n == "number") lengths.push(n); });
if (lengths.length === 0) {
alert("No field length is specified.");
return;
}
config.fieldLengths = JSON.stringify(lengths);
}
Refine.postCoreProcess(
"split-column",
config,
null,
{ modelsChanged: true }
);
dismiss();
});
};
MenuSystem.appendTo(menu, [ "core/edit-column" ], [
{
id: "core/split-column",
label: "Split into several columns...",
click: doSplitColumn
},
{},
{
id: "core/add-column",
label: "Add column based on this column...",
click: doAddColumn
},
{
id: "core/add-column-by-fetching-urls",
label: "Add column by fetching URLs...",
click: doAddColumnByFetchingURLs
},
{},
{
id: "core/rename-column",
label: "Rename this column",
click: doRenameColumn
},
{
id: "core/remove-column",
label: "Remove this column",
click: doRemoveColumn
},
{},
{
id: "core/move-column-to-beginning",
label: "Move column to beginning",
click: function() { doMoveColumnTo(0); }
},
{
id: "core/move-column-to-end",
label: "Move column to end",
click: function() { doMoveColumnTo(theProject.columnModel.columns.length - 1); }
},
{
id: "core/move-column-to-left",
label: "Move column left",
click: function() { doMoveColumnBy(-1); }
},
{
id: "core/move-column-to-right",
label: "Move column right",
click: function() { doMoveColumnBy(1); }
var s = elmts.maxColumnsInput[0].value;
if (s) {
var n = parseInt(s,10);
if (!isNaN(n)) {
config.maxColumns = n;
}
}
]);
} else {
var s = "[" + elmts.lengthsTextarea[0].value + "]";
try {
var a = JSON.parse(s);
} catch (e) {
alert("The given field lengths are not properly formatted.");
return;
}
var lengths = [];
$.each(a, function(i,n) { if (typeof n == "number") lengths.push(n); });
if (lengths.length === 0) {
alert("No field length is specified.");
return;
}
config.fieldLengths = JSON.stringify(lengths);
}
Refine.postCoreProcess(
"split-column",
config,
null,
{ modelsChanged: true }
);
dismiss();
});
};
MenuSystem.appendTo(menu, [ "core/edit-column" ], [
{
id: "core/split-column",
label: "Split into several columns...",
click: doSplitColumn
},
{},
{
id: "core/add-column",
label: "Add column based on this column...",
click: doAddColumn
},
{
id: "core/add-column-by-fetching-urls",
label: "Add column by fetching URLs...",
click: doAddColumnByFetchingURLs
},
{},
{
id: "core/rename-column",
label: "Rename this column",
click: doRenameColumn
},
{
id: "core/remove-column",
label: "Remove this column",
click: doRemoveColumn
},
{},
{
id: "core/move-column-to-beginning",
label: "Move column to beginning",
click: function() { doMoveColumnTo(0); }
},
{
id: "core/move-column-to-end",
label: "Move column to end",
click: function() { doMoveColumnTo(theProject.columnModel.columns.length - 1); }
},
{
id: "core/move-column-to-left",
label: "Move column left",
click: function() { doMoveColumnBy(-1); }
},
{
id: "core/move-column-to-right",
label: "Move column right",
click: function() { doMoveColumnBy(1); }
}
]
);
});

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,254 +29,254 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
DataTableColumnHeaderUI.extendMenu(function(column, columnHeaderUI, menu) {
var doFilterByExpressionPrompt = function(expression, type) {
DataTableView.promptExpressionOnVisibleRows(
column,
(type == "list" ? "Custom Facet on column " : "Custom Numeric Facet on column") + column.name,
expression,
function(expression) {
var config = {
"name" : column.name,
"columnName" : column.name,
"expression" : expression
};
if (type == "range") {
config.mode = "range";
}
var doFilterByExpressionPrompt = function(expression, type) {
DataTableView.promptExpressionOnVisibleRows(
column,
(type == "list" ? "Custom Facet on column " : "Custom Numeric Facet on column") + column.name,
expression,
function(expression) {
var config = {
"name" : column.name,
"columnName" : column.name,
"expression" : expression
};
if (type == "range") {
config.mode = "range";
}
ui.browsingEngine.addFacet(type, config);
ui.browsingEngine.addFacet(type, config);
}
);
};
MenuSystem.appendTo(menu, [ "core/facet" ], [
{
id: "core/text-facet",
label: "Text facet",
click: function() {
ui.browsingEngine.addFacet(
"list",
{
"name": column.name,
"columnName": column.name,
"expression": "value"
}
);
};
MenuSystem.appendTo(menu, [ "core/facet" ], [
{
id: "core/text-facet",
label: "Text facet",
click: function() {
ui.browsingEngine.addFacet(
"list",
{
"name": column.name,
"columnName": column.name,
"expression": "value"
}
);
}
},
{
id: "core/numeric-facet",
label: "Numeric facet",
click: function() {
ui.browsingEngine.addFacet(
"range",
{
"name": column.name,
"columnName": column.name,
"expression": "value",
"mode": "range"
}
},
{
id: "core/numeric-facet",
label: "Numeric facet",
click: function() {
ui.browsingEngine.addFacet(
"range",
{
"name": column.name,
"columnName": column.name,
"expression": "value",
"mode": "range"
}
);
);
}
},
{
id: "core/time-facet",
label: "Timeline facet",
click: function() {
ui.browsingEngine.addFacet(
"timerange",
{
"name": column.name,
"columnName": column.name,
"expression": "value",
"mode": "range"
}
},
);
}
},
{
id: "core/scatterplot-facet",
label: "Scatterplot facet",
click: function() {
new ScatterplotDialog(column.name);
}
},
{},
{
id: "core/custom-text-facet",
label: "Custom text facet...",
click: function() {
doFilterByExpressionPrompt(null, "list");
}
},
{
id: "core/custom-numeric-facet",
label: "Custom numeric facet...",
click: function() {
doFilterByExpressionPrompt(null, "range");
}
},
{
id: "core/customized-facets",
label: "Customized facets",
submenu: [
{
id: "core/time-facet",
label: "Timeline facet",
click: function() {
ui.browsingEngine.addFacet(
"timerange",
{
"name": column.name,
"columnName": column.name,
"expression": "value",
"mode": "range"
}
);
}
},
{
id: "core/scatterplot-facet",
label: "Scatterplot facet",
click: function() {
new ScatterplotDialog(column.name);
}
id: "core/word-facet",
label: "Word facet",
click: function() {
ui.browsingEngine.addFacet(
"list",
{
"name": column.name,
"columnName": column.name,
"expression": "value.split(' ')"
}
);
}
},
{},
{
id: "core/custom-text-facet",
label: "Custom text facet...",
click: function() {
doFilterByExpressionPrompt(null, "list");
}
},
{
id: "core/custom-numeric-facet",
label: "Custom numeric facet...",
click: function() {
doFilterByExpressionPrompt(null, "range");
}
},
{
id: "core/customized-facets",
label: "Customized facets",
submenu: [
id: "core/duplicates-facet",
label: "Duplicates facet",
click: function() {
ui.browsingEngine.addFacet(
"list",
{
id: "core/word-facet",
label: "Word facet",
click: function() {
ui.browsingEngine.addFacet(
"list",
{
"name": column.name,
"columnName": column.name,
"expression": "value.split(' ')"
}
);
}
},
{},
{
id: "core/duplicates-facet",
label: "Duplicates facet",
click: function() {
ui.browsingEngine.addFacet(
"list",
{
"name": column.name,
"columnName": column.name,
"expression": "facetCount(value, 'value', '" +
column.name + "') > 1"
}
);
}
},
{},
{
id: "core/numeric-log-facet",
label: "Numeric log facet",
click: function() {
ui.browsingEngine.addFacet(
"range",
{
"name": column.name,
"columnName": column.name,
"expression": "value.log()",
"mode": "range"
}
);
}
},
{
id: "core/bounded-numeric-log-facet",
label: "1-bounded numeric log facet",
click: function() {
ui.browsingEngine.addFacet(
"range",
{
"name": column.name,
"columnName": column.name,
"expression": "log(max(1, value))",
"mode": "range"
}
);
}
},
{},
{
id: "core/text-length-facet",
label: "Text length facet",
click: function() {
ui.browsingEngine.addFacet(
"range",
{
"name": column.name,
"columnName": column.name,
"expression": "value.length()",
"mode": "range"
}
);
}
},
{
id: "core/log-text-length-facet",
label: "Log of text length facet",
click: function() {
ui.browsingEngine.addFacet(
"range",
{
"name": column.name,
"columnName": column.name,
"expression": "value.length().log()",
"mode": "range"
}
);
}
},
{
id: "core/unicode-charcode-facet",
label: "Unicode char-code facet",
click: function() {
ui.browsingEngine.addFacet(
"range",
{
"name": column.name,
"columnName": column.name,
"expression": "value.unicode()",
"mode": "range"
}
);
}
},
{},
{
id: "core/error-facet",
label: "Facet by error",
click: function() {
ui.browsingEngine.addFacet(
"list",
{
"name": column.name,
"columnName": column.name,
"expression": "isError(value)"
}
);
}
},
{
id: "core/blank-facet",
label: "Facet by blank",
click: function() {
ui.browsingEngine.addFacet(
"list",
{
"name": column.name,
"columnName": column.name,
"expression": "isBlank(value)"
}
);
}
"name": column.name,
"columnName": column.name,
"expression": "facetCount(value, 'value', '" +
column.name + "') > 1"
}
]
}
]);
MenuSystem.insertAfter(menu, [ "core/facet" ], [
);
}
},
{},
{
label: "Text filter",
click: function() {
ui.browsingEngine.addFacet(
"text",
{
"name" : column.name,
"columnName" : column.name,
"mode" : "text",
"caseSensitive" : false
}
);
}
id: "core/numeric-log-facet",
label: "Numeric log facet",
click: function() {
ui.browsingEngine.addFacet(
"range",
{
"name": column.name,
"columnName": column.name,
"expression": "value.log()",
"mode": "range"
}
);
}
},
{
id: "core/bounded-numeric-log-facet",
label: "1-bounded numeric log facet",
click: function() {
ui.browsingEngine.addFacet(
"range",
{
"name": column.name,
"columnName": column.name,
"expression": "log(max(1, value))",
"mode": "range"
}
);
}
},
{},
{
id: "core/text-length-facet",
label: "Text length facet",
click: function() {
ui.browsingEngine.addFacet(
"range",
{
"name": column.name,
"columnName": column.name,
"expression": "value.length()",
"mode": "range"
}
);
}
},
{
id: "core/log-text-length-facet",
label: "Log of text length facet",
click: function() {
ui.browsingEngine.addFacet(
"range",
{
"name": column.name,
"columnName": column.name,
"expression": "value.length().log()",
"mode": "range"
}
);
}
},
{
id: "core/unicode-charcode-facet",
label: "Unicode char-code facet",
click: function() {
ui.browsingEngine.addFacet(
"range",
{
"name": column.name,
"columnName": column.name,
"expression": "value.unicode()",
"mode": "range"
}
);
}
},
{},
{
id: "core/error-facet",
label: "Facet by error",
click: function() {
ui.browsingEngine.addFacet(
"list",
{
"name": column.name,
"columnName": column.name,
"expression": "isError(value)"
}
);
}
},
{
id: "core/blank-facet",
label: "Facet by blank",
click: function() {
ui.browsingEngine.addFacet(
"list",
{
"name": column.name,
"columnName": column.name,
"expression": "isBlank(value)"
}
);
}
}
]);
]
}
]);
MenuSystem.insertAfter(menu, [ "core/facet" ], [
{
label: "Text filter",
click: function() {
ui.browsingEngine.addFacet(
"text",
{
"name" : column.name,
"columnName" : column.name,
"mode" : "text",
"caseSensitive" : false
}
);
}
}
]);
});

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,389 +29,389 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
DataTableColumnHeaderUI.extendMenu(function(column, columnHeaderUI, menu) {
var doReconcile = function() {
new ReconDialog(column);
};
var doReconcile = function() {
new ReconDialog(column);
};
var doReconDiscardJudgments = function() {
Refine.postCoreProcess(
"recon-discard-judgments",
{ columnName: column.name, clearData: false },
var doReconDiscardJudgments = function() {
Refine.postCoreProcess(
"recon-discard-judgments",
{ columnName: column.name, clearData: false },
null,
{ cellsChanged: true, columnStatsChanged: true }
);
};
var doClearReconData = function() {
Refine.postCoreProcess(
"recon-discard-judgments",
{ columnName: column.name, clearData: true },
null,
{ cellsChanged: true, columnStatsChanged: true }
);
}
var doReconMatchBestCandidates = function() {
Refine.postCoreProcess(
"recon-match-best-candidates",
{ columnName: column.name },
null,
{ cellsChanged: true, columnStatsChanged: true }
);
};
var doReconMarkNewTopics = function(shareNewTopics) {
Refine.postCoreProcess(
"recon-mark-new-topics",
{ columnName: column.name, shareNewTopics: shareNewTopics },
null,
{ cellsChanged: true, columnStatsChanged: true }
);
};
var doSearchToMatch = function() {
var frame = DialogSystem.createDialog();
frame.width("400px");
var header = $('<div></div>').addClass("dialog-header").text("Search for Match").appendTo(frame);
var body = $('<div></div>').addClass("dialog-body").appendTo(frame);
var footer = $('<div></div>').addClass("dialog-footer").appendTo(frame);
$('<p></p>').text("Search Freebase for a topic to match all filtered cells:").appendTo(body);
var input = $('<input />').appendTo($('<p></p>').appendTo(body));
input.suggest({}).bind("fb-select", function(e, data) {
var query = {
"id" : data.id,
"type" : []
};
var baseUrl = "http://api.freebase.com/api/service/mqlread";
var url = baseUrl + "?" + $.param({ query: JSON.stringify({ query: query }) }) + "&callback=?";
$.getJSON(
url,
null,
function(o) {
var types = "result" in o ? o.result.type : [];
Refine.postCoreProcess(
"recon-match-specific-topic-to-cells",
{
columnName: column.name,
topicID: data.id,
topicGUID: data.guid,
topicName: data.name,
types: types.join(",")
},
null,
{ cellsChanged: true, columnStatsChanged: true }
);
};
);
var doClearReconData = function() {
Refine.postCoreProcess(
"recon-discard-judgments",
{ columnName: column.name, clearData: true },
null,
{ cellsChanged: true, columnStatsChanged: true }
);
DialogSystem.dismissUntil(level - 1);
}
);
});
$('<button class="button"></button>').text("Cancel").click(function() {
DialogSystem.dismissUntil(level - 1);
}).appendTo(footer);
var level = DialogSystem.showDialog(frame);
input.focus().data("suggest").textchange();
};
var doCopyAcrossColumns = function() {
var frame = $(DOM.loadHTML("core", "scripts/views/data-table/copy-recon-across-columns-dialog.html"));
var elmts = DOM.bind(frame);
elmts.dialogHeader.text("Copy recon judgments from column " + column.name);
var columns = theProject.columnModel.columns;
for (var i = 0; i < columns.length; i++) {
var column2 = columns[i];
if (column !== column2) {
$('<option>').attr("value", column2.name).text(column2.name).appendTo(elmts.toColumnSelect);
}
}
var doReconMatchBestCandidates = function() {
var level = DialogSystem.showDialog(frame);
var dismiss = function() { DialogSystem.dismissUntil(level - 1); };
elmts.cancelButton.click(dismiss);
elmts.okButton.click(function() {
var config = {
fromColumnName: column.name,
toColumnName: [],
judgment: [],
applyToJudgedCells: elmts.applyToJudgedCellsCheckbox[0].checked
};
if (elmts.newCheckbox[0].checked) {
config.judgment.push("new");
}
if (elmts.matchCheckbox[0].checked) {
config.judgment.push("matched");
}
elmts.toColumnSelect.find("option").each(function() {
if (this.selected) {
config.toColumnName.push(this.value);
}
});
if (config.toColumnName.length == 0) {
alert("Please select some other column to copy to.");
} else if (config.judgment.length == 0) {
alert("Please select at least one kind of judgment to copy.");
} else {
Refine.postCoreProcess(
"recon-match-best-candidates",
{ columnName: column.name },
null,
{ cellsChanged: true, columnStatsChanged: true }
"recon-copy-across-columns",
null,
config,
{ rowsChanged: true }
);
};
dismiss();
}
});
};
var doReconMarkNewTopics = function(shareNewTopics) {
Refine.postCoreProcess(
"recon-mark-new-topics",
{ columnName: column.name, shareNewTopics: shareNewTopics },
null,
{ cellsChanged: true, columnStatsChanged: true }
);
};
var doSearchToMatch = function() {
var frame = DialogSystem.createDialog();
frame.width("400px");
var header = $('<div></div>').addClass("dialog-header").text("Search for Match").appendTo(frame);
var body = $('<div></div>').addClass("dialog-body").appendTo(frame);
var footer = $('<div></div>').addClass("dialog-footer").appendTo(frame);
$('<p></p>').text("Search Freebase for a topic to match all filtered cells:").appendTo(body);
var input = $('<input />').appendTo($('<p></p>').appendTo(body));
input.suggest({}).bind("fb-select", function(e, data) {
var query = {
"id" : data.id,
"type" : []
};
var baseUrl = "http://api.freebase.com/api/service/mqlread";
var url = baseUrl + "?" + $.param({ query: JSON.stringify({ query: query }) }) + "&callback=?";
$.getJSON(
url,
null,
function(o) {
var types = "result" in o ? o.result.type : [];
Refine.postCoreProcess(
"recon-match-specific-topic-to-cells",
{
columnName: column.name,
topicID: data.id,
topicGUID: data.guid,
topicName: data.name,
types: types.join(",")
},
null,
{ cellsChanged: true, columnStatsChanged: true }
);
DialogSystem.dismissUntil(level - 1);
MenuSystem.appendTo(menu, [ "core/reconcile" ], [
{
id: "core/reconcile",
label: "Start reconciling...",
tooltip: "Reconcile text in this column with topics on Freebase",
click: doReconcile
},
{},
{
id: "core/facets",
label: "Facets",
submenu: [
{
id: "core/by-judgment",
label: "By judgment",
click: function() {
ui.browsingEngine.addFacet(
"list",
{
"name" : column.name + ": judgment",
"columnName" : column.name,
"expression" : 'forNonBlank(cell.recon.judgment, v, v, if(isNonBlank(value), "(unreconciled)", "(blank)"))'
},
{
"scroll" : false
}
);
});
$('<button class="button"></button>').text("Cancel").click(function() {
DialogSystem.dismissUntil(level - 1);
}).appendTo(footer);
var level = DialogSystem.showDialog(frame);
input.focus().data("suggest").textchange();
};
var doCopyAcrossColumns = function() {
var frame = $(DOM.loadHTML("core", "scripts/views/data-table/copy-recon-across-columns-dialog.html"));
var elmts = DOM.bind(frame);
elmts.dialogHeader.text("Copy recon judgments from column " + column.name);
var columns = theProject.columnModel.columns;
for (var i = 0; i < columns.length; i++) {
var column2 = columns[i];
if (column !== column2) {
$('<option>').attr("value", column2.name).text(column2.name).appendTo(elmts.toColumnSelect);
}
}
var level = DialogSystem.showDialog(frame);
var dismiss = function() { DialogSystem.dismissUntil(level - 1); };
elmts.cancelButton.click(dismiss);
elmts.okButton.click(function() {
var config = {
fromColumnName: column.name,
toColumnName: [],
judgment: [],
applyToJudgedCells: elmts.applyToJudgedCellsCheckbox[0].checked
};
if (elmts.newCheckbox[0].checked) {
config.judgment.push("new");
}
if (elmts.matchCheckbox[0].checked) {
config.judgment.push("matched");
}
elmts.toColumnSelect.find("option").each(function() {
if (this.selected) {
config.toColumnName.push(this.value);
}
});
if (config.toColumnName.length == 0) {
alert("Please select some other column to copy to.");
} else if (config.judgment.length == 0) {
alert("Please select at least one kind of judgment to copy.");
} else {
Refine.postCoreProcess(
"recon-copy-across-columns",
null,
config,
{ rowsChanged: true }
);
dismiss();
}
});
};
MenuSystem.appendTo(menu, [ "core/reconcile" ], [
{
id: "core/reconcile",
label: "Start reconciling...",
tooltip: "Reconcile text in this column with topics on Freebase",
click: doReconcile
}
},
{},
{
id: "core/facets",
label: "Facets",
submenu: [
id: "core/by-best-candidates-score",
label: "Best candidate's score",
click: function() {
ui.browsingEngine.addFacet(
"range",
{
id: "core/by-judgment",
label: "By judgment",
click: function() {
ui.browsingEngine.addFacet(
"list",
{
"name" : column.name + ": judgment",
"columnName" : column.name,
"expression" : 'forNonBlank(cell.recon.judgment, v, v, if(isNonBlank(value), "(unreconciled)", "(blank)"))'
},
{
"scroll" : false
}
);
}
},
{},
{
id: "core/by-best-candidates-score",
label: "Best candidate's score",
click: function() {
ui.browsingEngine.addFacet(
"range",
{
"name" : column.name + ": best candidate's score",
"columnName" : column.name,
"expression" : "cell.recon.best.score",
"mode" : "range"
},
{
}
);
}
"name" : column.name + ": best candidate's score",
"columnName" : column.name,
"expression" : "cell.recon.best.score",
"mode" : "range"
},
{
id: "core/by-best-candidates-type-match",
label: "Best candidate's type match",
click: function() {
ui.browsingEngine.addFacet(
"list",
{
"name" : column.name + ": best candidate's types match?",
"columnName" : column.name,
"expression" : 'forNonBlank(cell.recon.features.typeMatch, v, v, if(isNonBlank(value), "(unreconciled)", "(blank)"))'
},
{
"scroll" : false
}
);
}
},
{
id: "core/by-best-candidates-name-match",
label: "Best candidate's name match",
click: function() {
ui.browsingEngine.addFacet(
"list",
{
"name" : column.name + ": best candidate's name match?",
"columnName" : column.name,
"expression" : 'forNonBlank(cell.recon.features.nameMatch, v, v, if(isNonBlank(value), "(unreconciled)", "(blank)"))'
},
{
"scroll" : false
}
);
}
},
{},
{
id: "core/by-best-candidates-name-edit-distance",
label: "Best candidate's name edit distance",
click: function() {
ui.browsingEngine.addFacet(
"range",
{
"name" : column.name + ": best candidate's name edit distance",
"columnName" : column.name,
"expression" : "cell.recon.features.nameLevenshtein",
"mode" : "range"
},
{
}
);
}
},
{
id: "core/by-best-candidates-name-word-similarity",
label: "Best candidate's name word similarity",
click: function() {
ui.browsingEngine.addFacet(
"range",
{
"name" : column.name + ": best candidate's name word similarity",
"columnName" : column.name,
"expression" : "cell.recon.features.nameWordDistance",
"mode" : "range"
},
{
}
);
}
},
{},
{
id: "core/by-best-candidates-types",
label: "Best candidate's types",
click: function() {
ui.browsingEngine.addFacet(
"list",
{
"name" : column.name + ": best candidate's types",
"columnName" : column.name,
"expression" : 'forNonBlank(cell.recon.best.type, v, v, if(isNonBlank(value), "(unreconciled)", "(blank)"))'
}
);
}
}
]
);
}
},
{
id: "core/qa-facets",
label: "QA facets",
submenu: [
id: "core/by-best-candidates-type-match",
label: "Best candidate's type match",
click: function() {
ui.browsingEngine.addFacet(
"list",
{
id: "core/by-qa-results",
label: "QA results",
click: function() {
ui.browsingEngine.addFacet(
"list",
{
"name" : column.name + " QA Results",
"columnName" : column.name,
"expression" : "cell.recon.features.qaResult"
}
);
}
"name" : column.name + ": best candidate's types match?",
"columnName" : column.name,
"expression" : 'forNonBlank(cell.recon.features.typeMatch, v, v, if(isNonBlank(value), "(unreconciled)", "(blank)"))'
},
{
id: "core/by-judgment-actions",
label: "Judgment actions",
click: function() {
ui.browsingEngine.addFacet(
"list",
{
"name" : column.name + " Judgment Actions",
"columnName" : column.name,
"expression" : "cell.recon.judgmentAction"
}
);
}
},
{
id: "core/by-judgment-history-entries",
label: "Judgment history entries",
click: function() {
ui.browsingEngine.addFacet(
"list",
{
"name" : column.name + " History Entries",
"columnName" : column.name,
"expression" : "cell.recon.judgmentHistoryEntry"
}
);
}
"scroll" : false
}
]
);
}
},
{
id: "core/actions",
label: "Actions",
submenu: [
id: "core/by-best-candidates-name-match",
label: "Best candidate's name match",
click: function() {
ui.browsingEngine.addFacet(
"list",
{
id: "core/match-to-best-candidate",
label: "Match each cell to its best candidate",
tooltip: "Match each cell to its best candidate in this column for all current filtered rows",
click: doReconMatchBestCandidates
"name" : column.name + ": best candidate's name match?",
"columnName" : column.name,
"expression" : 'forNonBlank(cell.recon.features.nameMatch, v, v, if(isNonBlank(value), "(unreconciled)", "(blank)"))'
},
{
id: "core/match-to-new-topic",
label: "Create a new topic for each cell",
tooltip: "Mark to create one new topic for each cell in this column for all current filtered rows",
click: function() {
doReconMarkNewTopics(false);
}
},
{},
{
id: "core/match-similar-to-new-topic",
label: "Create one new topic for similar cells",
tooltip: "Mark to create one new topic for each group of similar cells in this column for all current filtered rows",
click: function() {
doReconMarkNewTopics(true);
}
},
{
id: "core/match-to-specific",
label: "Match all filtered cells to...",
tooltip: "Search for a topic to match all filtered cells to",
click: doSearchToMatch
},
{},
{
id: "core/discard-judgments",
label: "Discard reconciliation judgments",
tooltip: "Discard reconciliation judgments in this column for all current filtered rows",
click: doReconDiscardJudgments
},
{
id: "core/clear-recon-data",
label: "Clear reconciliation data",
tooltip: "Clear reconciliation data in this column for all current filtered rows",
click: doClearReconData
"scroll" : false
}
]
);
}
},
{},
{
id: "core/copy-across-columns",
label: "Copy reconciliation data...",
tooltip: "Copy this column's reconciliation data to other columns",
click: doCopyAcrossColumns
id: "core/by-best-candidates-name-edit-distance",
label: "Best candidate's name edit distance",
click: function() {
ui.browsingEngine.addFacet(
"range",
{
"name" : column.name + ": best candidate's name edit distance",
"columnName" : column.name,
"expression" : "cell.recon.features.nameLevenshtein",
"mode" : "range"
},
{
}
);
}
},
{
id: "core/by-best-candidates-name-word-similarity",
label: "Best candidate's name word similarity",
click: function() {
ui.browsingEngine.addFacet(
"range",
{
"name" : column.name + ": best candidate's name word similarity",
"columnName" : column.name,
"expression" : "cell.recon.features.nameWordDistance",
"mode" : "range"
},
{
}
);
}
},
{},
{
id: "core/by-best-candidates-types",
label: "Best candidate's types",
click: function() {
ui.browsingEngine.addFacet(
"list",
{
"name" : column.name + ": best candidate's types",
"columnName" : column.name,
"expression" : 'forNonBlank(cell.recon.best.type, v, v, if(isNonBlank(value), "(unreconciled)", "(blank)"))'
}
);
}
}
]);
]
},
{
id: "core/qa-facets",
label: "QA facets",
submenu: [
{
id: "core/by-qa-results",
label: "QA results",
click: function() {
ui.browsingEngine.addFacet(
"list",
{
"name" : column.name + " QA Results",
"columnName" : column.name,
"expression" : "cell.recon.features.qaResult"
}
);
}
},
{
id: "core/by-judgment-actions",
label: "Judgment actions",
click: function() {
ui.browsingEngine.addFacet(
"list",
{
"name" : column.name + " Judgment Actions",
"columnName" : column.name,
"expression" : "cell.recon.judgmentAction"
}
);
}
},
{
id: "core/by-judgment-history-entries",
label: "Judgment history entries",
click: function() {
ui.browsingEngine.addFacet(
"list",
{
"name" : column.name + " History Entries",
"columnName" : column.name,
"expression" : "cell.recon.judgmentHistoryEntry"
}
);
}
}
]
},
{
id: "core/actions",
label: "Actions",
submenu: [
{
id: "core/match-to-best-candidate",
label: "Match each cell to its best candidate",
tooltip: "Match each cell to its best candidate in this column for all current filtered rows",
click: doReconMatchBestCandidates
},
{
id: "core/match-to-new-topic",
label: "Create a new topic for each cell",
tooltip: "Mark to create one new topic for each cell in this column for all current filtered rows",
click: function() {
doReconMarkNewTopics(false);
}
},
{},
{
id: "core/match-similar-to-new-topic",
label: "Create one new topic for similar cells",
tooltip: "Mark to create one new topic for each group of similar cells in this column for all current filtered rows",
click: function() {
doReconMarkNewTopics(true);
}
},
{
id: "core/match-to-specific",
label: "Match all filtered cells to...",
tooltip: "Search for a topic to match all filtered cells to",
click: doSearchToMatch
},
{},
{
id: "core/discard-judgments",
label: "Discard reconciliation judgments",
tooltip: "Discard reconciliation judgments in this column for all current filtered rows",
click: doReconDiscardJudgments
},
{
id: "core/clear-recon-data",
label: "Clear reconciliation data",
tooltip: "Clear reconciliation data in this column for all current filtered rows",
click: doClearReconData
}
]
},
{},
{
id: "core/copy-across-columns",
label: "Copy reconciliation data...",
tooltip: "Copy this column's reconciliation data to other columns",
click: doCopyAcrossColumns
}
]);
});

View File

@ -3,41 +3,41 @@
<div class="dialog-header" bind="dialogHeader"></div>
<div class="dialog-body" bind="dialogBody">
<div class="grid-layout layout-normal layout-full "><table>
<tr>
<td>Sort cell values as</td>
<td>Position blanks and errors</td>
</tr>
<tr>
<td>
<div class="grid-layout layout-tightest grid-layout-for-text" bind="valueTypeOptions"><table>
<tr>
<td width="1"><input type="radio" name="sorting-dialog-value-type" value="string" /></td>
<td>text <input type="checkbox" class="inline" bind="caseSensitiveCheckbox" /> case-sensitive</td>
</tr>
<tr>
<td width="1"><input type="radio" name="sorting-dialog-value-type" value="number" /></td>
<td>numbers</td>
</tr>
<tr>
<td width="1"><input type="radio" name="sorting-dialog-value-type" value="date" /></td>
<td>dates</td>
</tr>
<tr>
<td width="1"><input type="radio" name="sorting-dialog-value-type" value="boolean" /></td>
<td>booleans</td>
</tr>
</table></div>
</td>
<td>
<ul class="sorting-dialog-blank-error-positions" bind="blankErrorPositions"></ul>
<p>Drag and drop to re-order</p>
</td>
</tr>
<tr><td colspan="2" bind="directionOptions">
<input type="radio" class="inline" name="sorting-dialog-direction" value="forward" /><label bind="directionForwardLabel">forward</label>
<input type="radio" class="inline" name="sorting-dialog-direction" value="reverse" /><label bind="directionReverseLabel">reverse</label>
<span bind="sortAloneContainer" style="display:none;"><input type="checkbox" class="inline" /><label>sort by this column alone</label></span>
</td></tr>
<tr>
<td>Sort cell values as</td>
<td>Position blanks and errors</td>
</tr>
<tr>
<td>
<div class="grid-layout layout-tightest grid-layout-for-text" bind="valueTypeOptions"><table>
<tr>
<td width="1"><input type="radio" name="sorting-dialog-value-type" value="string" /></td>
<td>text <input type="checkbox" class="inline" bind="caseSensitiveCheckbox" /> case-sensitive</td>
</tr>
<tr>
<td width="1"><input type="radio" name="sorting-dialog-value-type" value="number" /></td>
<td>numbers</td>
</tr>
<tr>
<td width="1"><input type="radio" name="sorting-dialog-value-type" value="date" /></td>
<td>dates</td>
</tr>
<tr>
<td width="1"><input type="radio" name="sorting-dialog-value-type" value="boolean" /></td>
<td>booleans</td>
</tr>
</table></div>
</td>
<td>
<ul class="sorting-dialog-blank-error-positions" bind="blankErrorPositions"></ul>
<p>Drag and drop to re-order</p>
</td>
</tr>
<tr><td colspan="2" bind="directionOptions">
<input type="radio" class="inline" name="sorting-dialog-direction" value="forward" /><label bind="directionForwardLabel">forward</label>
<input type="radio" class="inline" name="sorting-dialog-direction" value="reverse" /><label bind="directionReverseLabel">reverse</label>
<span bind="sortAloneContainer" style="display:none;"><input type="checkbox" class="inline" /><label>sort by this column alone</label></span>
</td></tr>
</table></div>
</div>
<div class="dialog-footer" bind="dialogFooter">

View File

@ -3,50 +3,50 @@
<div class="dialog-header" bind="dialogHeader"></div>
<div class="dialog-body" bind="dialogBody">
<div class="grid-layout layout-looser layout-full"><table><tr>
<td>
<div class="grid-layout layout-tighter"><table>
<tr>
<td colspan="3"><h3>How to Split Column</h3></td>
</tr>
<tr>
<td width="1%"><input type="radio" checked="true" name="split-by-mode" value="separator" /></td>
<td colspan="2">by separator</td>
</tr>
<tr><td></td>
<td>Separator</td>
<td style="white-space: pre;"><input size="15" value="," bind="separatorInput" /> <input type="checkbox" bind="regexInput" /> regular expression</td>
</tr>
<tr><td></td>
<td>Split into</td>
<td style="white-space: pre;"><input size="3" bind="maxColumnsInput" /> columns at most (leave blank for no limit)</td>
</tr>
<tr>
<td width="1%"><input type="radio" name="split-by-mode" value="lengths" /></td>
<td colspan="2">by field lengths</td>
</tr>
<tr><td></td>
<td colspan="2"><textarea style="width: 100%;" bind="lengthsTextarea"></textarea></td>
</tr>
<tr><td></td>
<td colspan="2">List of integers separated by commas, e.g., 5, 7, 15</td>
</tr>
</table></div>
</td>
<td>
<div class="grid-layout layout-tighter"><table>
<tr>
<td colspan="3"><h3>After Splitting</h3></td>
</tr>
<tr>
<td width="1%"><input type="checkbox" checked="true" bind="guessCellTypeInput" /></td>
<td colspan="2">Guess cell type</td>
</tr>
<tr>
<td width="1%"><input type="checkbox" checked="true" bind="removeColumnInput" /></td>
<td colspan="2">Remove this column</td>
</tr>
</table></div>
</td>
<td>
<div class="grid-layout layout-tighter"><table>
<tr>
<td colspan="3"><h3>How to Split Column</h3></td>
</tr>
<tr>
<td width="1%"><input type="radio" checked="true" name="split-by-mode" value="separator" /></td>
<td colspan="2">by separator</td>
</tr>
<tr><td></td>
<td>Separator</td>
<td style="white-space: pre;"><input size="15" value="," bind="separatorInput" /> <input type="checkbox" bind="regexInput" /> regular expression</td>
</tr>
<tr><td></td>
<td>Split into</td>
<td style="white-space: pre;"><input size="3" bind="maxColumnsInput" /> columns at most (leave blank for no limit)</td>
</tr>
<tr>
<td width="1%"><input type="radio" name="split-by-mode" value="lengths" /></td>
<td colspan="2">by field lengths</td>
</tr>
<tr><td></td>
<td colspan="2"><textarea style="width: 100%;" bind="lengthsTextarea"></textarea></td>
</tr>
<tr><td></td>
<td colspan="2">List of integers separated by commas, e.g., 5, 7, 15</td>
</tr>
</table></div>
</td>
<td>
<div class="grid-layout layout-tighter"><table>
<tr>
<td colspan="3"><h3>After Splitting</h3></td>
</tr>
<tr>
<td width="1%"><input type="checkbox" checked="true" bind="guessCellTypeInput" /></td>
<td colspan="2">Guess cell type</td>
</tr>
<tr>
<td width="1%"><input type="checkbox" checked="true" bind="removeColumnInput" /></td>
<td colspan="2">Remove this column</td>
</tr>
</table></div>
</td>
</table></div>
</div>
<div class="dialog-footer" bind="dialogFooter">

View File

@ -3,13 +3,13 @@
<div class="dialog-header" bind="dialogHeader"></div>
<div class="dialog-body" bind="dialogBody">
<div class="grid-layout layout-tight layout-full"><table>
<tr><td colspan="4">$EXPRESSION_PREVIEW_WIDGET$</td></tr>
<tr style="white-space: pre;">
<td width="1%">On error</td>
<td><input type="radio" name="text-transform-dialog-onerror-choice" value="set-to-blank" checked /> set to blank<br/><input type="radio" name="text-transform-dialog-onerror-choice" value="store-error" /> store error<br/><input type="radio" name="text-transform-dialog-onerror-choice" value="keep-original" /> keep original</td>
<td width="1%"><input type="checkbox" bind="repeatCheckbox" /></td>
<td>Re-transform up to <input bind="repeatCountInput" value="10" size="2" /> times until no change</td>
</tr>
<tr><td colspan="4">$EXPRESSION_PREVIEW_WIDGET$</td></tr>
<tr style="white-space: pre;">
<td width="1%">On error</td>
<td><input type="radio" name="text-transform-dialog-onerror-choice" value="set-to-blank" checked /> set to blank<br/><input type="radio" name="text-transform-dialog-onerror-choice" value="store-error" /> store error<br/><input type="radio" name="text-transform-dialog-onerror-choice" value="keep-original" /> keep original</td>
<td width="1%"><input type="checkbox" bind="repeatCheckbox" /></td>
<td>Re-transform up to <input bind="repeatCountInput" value="10" size="2" /> times until no change</td>
</tr>
</table>
</div>
</div>

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,132 +29,132 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
function HistogramWidget(elmt, options) {
this._elmt = elmt;
this._options = options;
this._elmt = elmt;
this._options = options;
this._range = null;
this._binMatrix = null;
this._initializeUI();
}
HistogramWidget.prototype.update = function(min, max, step, binMatrix) {
if (typeof min == "undefined" ||
typeof binMatrix == "undefined" ||
binMatrix.length === 0 ||
binMatrix[0].length === 0) {
this._range = null;
this._binMatrix = null;
this._initializeUI();
}
this._elmt.hide();
} else {
this._range = { min: min, max: max, step: step };
this._binMatrix = binMatrix;
HistogramWidget.prototype.update = function(min, max, step, binMatrix) {
if (typeof min == "undefined" ||
typeof binMatrix == "undefined" ||
binMatrix.length === 0 ||
binMatrix[0].length === 0) {
this._range = null;
this._binMatrix = null;
this._elmt.hide();
} else {
this._range = { min: min, max: max, step: step };
this._binMatrix = binMatrix;
this._peak = 0;
for (var r = 0; r < binMatrix.length; r++) {
var row = binMatrix[r];
for (var c = 0; c < row.length; c++) {
this._peak = Math.max(this._peak, row[c]);
}
}
this._update();
this._peak = 0;
for (var r = 0; r < binMatrix.length; r++) {
var row = binMatrix[r];
for (var c = 0; c < row.length; c++) {
this._peak = Math.max(this._peak, row[c]);
}
}
this._update();
}
};
HistogramWidget.prototype._update = function() {
if (this._binMatrix !== null) {
this._elmt.show();
this._resize();
this._render();
}
if (this._binMatrix !== null) {
this._elmt.show();
this._resize();
this._render();
}
};
HistogramWidget.prototype._initializeUI = function() {
this._elmt
.empty()
.hide()
.addClass("histogram-widget")
.html(
'<canvas bind="canvas"></canvas>'
);
this._elmt
.empty()
.hide()
.addClass("histogram-widget")
.html(
'<canvas bind="canvas"></canvas>'
);
this._elmts = DOM.bind(this._elmt);
this._elmts = DOM.bind(this._elmt);
};
HistogramWidget.prototype._resize = function() {
var height = "height" in this._options ? this._options.height : 50;
var height = "height" in this._options ? this._options.height : 50;
this._elmts.canvas.attr("height", height);
this._elmts.canvas.attr("width", this._elmts.canvas.width());
this._elmt.height(height);
this._elmts.canvas.attr("height", height);
this._elmts.canvas.attr("width", this._elmts.canvas.width());
this._elmt.height(height);
};
HistogramWidget.prototype._render = function() {
var self = this;
var options = this._options;
var self = this;
var options = this._options;
var canvas = this._elmts.canvas[0];
var ctx = canvas.getContext('2d');
ctx.fillStyle = "white";
ctx.fillRect(0, 0, canvas.width, canvas.height);
var canvas = this._elmts.canvas[0];
var ctx = canvas.getContext('2d');
ctx.fillStyle = "white";
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.save();
ctx.translate(0, canvas.height);
ctx.scale(1, -1);
var stepPixels = canvas.width / this._binMatrix[0].length;
var stepScale = stepPixels / this._range.step;
/*
* Draw axis
*/
ctx.save();
ctx.strokeStyle = "emptyBinColor" in options ? options.emptyBinColor : "#faa";
ctx.lineWidth = 1;
ctx.moveTo(0, 0);
ctx.lineTo(canvas.width, 0);
ctx.stroke();
ctx.restore();
/*
* Draw bins
*/
var makeColor = function(i) {
var n = Math.floor(15 * (self._binMatrix.length - i) / self._binMatrix.length);
var h = n.toString(16);
return "#" + h + h + h;
};
var renderRow = function(row, color) {
ctx.save();
ctx.translate(0, canvas.height);
ctx.scale(1, -1);
ctx.lineWidth = 0;
ctx.fillStyle = color;
for (var c = 0; c < row.length; c++) {
var x = self._range.min + c * self._range.step;
var y = row[c];
if (y > 0) {
var left = c * stepPixels;
var width = Math.ceil(stepPixels);
var height = Math.max(2, Math.ceil(y * canvas.height / self._peak));
var stepPixels = canvas.width / this._binMatrix[0].length;
var stepScale = stepPixels / this._range.step;
/*
* Draw axis
*/
ctx.save();
ctx.strokeStyle = "emptyBinColor" in options ? options.emptyBinColor : "#faa";
ctx.lineWidth = 1;
ctx.moveTo(0, 0);
ctx.lineTo(canvas.width, 0);
ctx.stroke();
ctx.restore();
/*
* Draw bins
*/
var makeColor = function(i) {
var n = Math.floor(15 * (self._binMatrix.length - i) / self._binMatrix.length);
var h = n.toString(16);
return "#" + h + h + h;
};
var renderRow = function(row, color) {
ctx.save();
ctx.lineWidth = 0;
ctx.fillStyle = color;
for (var c = 0; c < row.length; c++) {
var x = self._range.min + c * self._range.step;
var y = row[c];
if (y > 0) {
var left = c * stepPixels;
var width = Math.ceil(stepPixels);
var height = Math.max(2, Math.ceil(y * canvas.height / self._peak));
ctx.fillRect(left, 0, width, height);
}
}
ctx.restore();
};
for (var r = 0; r < this._binMatrix.length; r++) {
renderRow(
this._binMatrix[r],
"binColors" in options && r < options.binColors.length ?
options.binColors[r] :
makeColor(r)
);
ctx.fillRect(left, 0, width, height);
}
}
ctx.restore();
};
for (var r = 0; r < this._binMatrix.length; r++) {
renderRow(
this._binMatrix[r],
"binColors" in options && r < options.binColors.length ?
options.binColors[r] :
makeColor(r)
);
}
ctx.restore();
};

View File

@ -7,13 +7,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@ -29,204 +29,204 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
function SliderWidget(elmt, options) {
this._elmt = elmt;
this._options = options || {};
this._elmt = elmt;
this._options = options || {};
this._range = {
min: 0,
max: 1,
step: 1,
from: 0,
to: 0
};
this._drag = null;
this._range = {
min: 0,
max: 1,
step: 1,
from: 0,
to: 0
};
this._drag = null;
var self = this;
this._mouseMoveHandler = function(evt) {
return self._onMouseMove(evt);
};
this._mouseUpHandler = function(evt) {
return self._onMouseUp(evt);
};
var self = this;
this._mouseMoveHandler = function(evt) {
return self._onMouseMove(evt);
};
this._mouseUpHandler = function(evt) {
return self._onMouseUp(evt);
};
this._initializeUI();
this._update();
this._initializeUI();
this._update();
}
SliderWidget.prototype.update = function(min, max, step, from, to) {
if (step <= 0) {
step = 1;
}
max = Math.max(max, min + step);
from = Math.max(min, from);
to = Math.min(max, to);
if (step <= 0) {
step = 1;
}
max = Math.max(max, min + step);
from = Math.max(min, from);
to = Math.min(max, to);
this._range = {
min: min,
max: max,
step: step,
from: from,
to: to
};
this._update();
this._range = {
min: min,
max: max,
step: step,
from: from,
to: to
};
this._update();
};
SliderWidget.prototype._initializeUI = function() {
this._elmt.addClass("slider-widget");
this._elmt.addClass("slider-widget");
this._leftTintedRect = $("<div>").addClass("slider-widget-tint left").appendTo(this._elmt);
this._rightTintedRect = $("<div>").addClass("slider-widget-tint right").appendTo(this._elmt);
this._highlightRect = $("<div>").addClass("slider-widget-highlight slider-widget-draggable").attr("part", "highlight").appendTo(this._elmt);
this._leftBracket = $("<div>").addClass("slider-widget-bracket slider-widget-draggable left").attr("part", "left").appendTo(this._elmt);
this._rightBracket = $("<div>").addClass("slider-widget-bracket slider-widget-draggable right").attr("part", "right").appendTo(this._elmt);
this._leftTintedRect = $("<div>").addClass("slider-widget-tint left").appendTo(this._elmt);
this._rightTintedRect = $("<div>").addClass("slider-widget-tint right").appendTo(this._elmt);
this._highlightRect = $("<div>").addClass("slider-widget-highlight slider-widget-draggable").attr("part", "highlight").appendTo(this._elmt);
this._leftBracket = $("<div>").addClass("slider-widget-bracket slider-widget-draggable left").attr("part", "left").appendTo(this._elmt);
this._rightBracket = $("<div>").addClass("slider-widget-bracket slider-widget-draggable right").attr("part", "right").appendTo(this._elmt);
var self = this;
this._elmt.find(".slider-widget-draggable")
.mousedown(function(evt) {
return self._onMouseDown(evt, this.getAttribute("part"));
});
var self = this;
this._elmt.find(".slider-widget-draggable")
.mousedown(function(evt) {
return self._onMouseDown(evt, this.getAttribute("part"));
});
this._highlightRect.dblclick(function(evt) {
if (self._range.from > self._range.min || self._range.to < self._range.max) {
self._range.from = self._range.min;
self._range.to = self._range.max;
self._update();
self._trigger("stop");
}
});
this._highlightRect.dblclick(function(evt) {
if (self._range.from > self._range.min || self._range.to < self._range.max) {
self._range.from = self._range.min;
self._range.to = self._range.max;
self._update();
self._trigger("stop");
}
});
this._elmt
.mousemove(function(evt) {
return self._onMouseMove(evt);
})
.mouseup(function(evt) {
return self._onMouseUp(evt);
});
this._elmt
.mousemove(function(evt) {
return self._onMouseMove(evt);
})
.mouseup(function(evt) {
return self._onMouseUp(evt);
});
};
SliderWidget.prototype._onMouseDown = function(evt, part) {
if (this._drag) {
return;
}
if (this._drag) {
return;
}
$(document).mousemove(this._mouseMoveHandler);
$(document).mouseup(this._mouseUpHandler);
$(document).mousemove(this._mouseMoveHandler);
$(document).mouseup(this._mouseUpHandler);
this._drag = {
sureDrag: false,
overlay: $('<div>').addClass("slider-widget-overlay").appendTo(document.body)
};
if ("highlight" == part) {
this._drag.elmt = this._highlightRect;
this._drag.value = this._range.from;
$(this._drag.overlay).css("cursor", "move");
} else if ("left" == part) {
this._drag.elmt = this._leftBracket;
$(this._drag.overlay).css("cursor", "e-resize");
} else if ("right" == part) {
this._drag.elmt = this._rightBracket;
$(this._drag.overlay).css("cursor", "w-resize");
}
this._drag.what = part;
this._drag.from = this._range.from;
this._drag.to = this._range.to;
this._drag.down = {
x: evt.pageX,
y: evt.pageY
};
this._drag = {
sureDrag: false,
overlay: $('<div>').addClass("slider-widget-overlay").appendTo(document.body)
};
if ("highlight" == part) {
this._drag.elmt = this._highlightRect;
this._drag.value = this._range.from;
$(this._drag.overlay).css("cursor", "move");
} else if ("left" == part) {
this._drag.elmt = this._leftBracket;
$(this._drag.overlay).css("cursor", "e-resize");
} else if ("right" == part) {
this._drag.elmt = this._rightBracket;
$(this._drag.overlay).css("cursor", "w-resize");
}
this._drag.what = part;
this._drag.from = this._range.from;
this._drag.to = this._range.to;
this._drag.down = {
x: evt.pageX,
y: evt.pageY
};
};
SliderWidget.prototype._onMouseUp = function(evt) {
if (!(this._drag)) {
return;
}
if (!(this._drag)) {
return;
}
$(document).unbind("mousemove", this._mouseMoveHandler);
$(document).unbind("mouseup", this._mouseUpHandler);
$(document).unbind("mousemove", this._mouseMoveHandler);
$(document).unbind("mouseup", this._mouseUpHandler);
if (this._drag.sureDrag) {
this._update();
this._trigger("stop");
}
this._drag.overlay.remove();
this._drag = null;
if (this._drag.sureDrag) {
this._update();
this._trigger("stop");
}
this._drag.overlay.remove();
this._drag = null;
};
SliderWidget.prototype._trigger = function(eventName) {
this._elmt.trigger(eventName, [{ from: this._range.from, to: this._range.to }]);
this._elmt.trigger(eventName, [{ from: this._range.from, to: this._range.to }]);
};
SliderWidget.prototype._onMouseMove = function(evt) {
if (!(this._drag)) {
return;
}
if (!(this._drag)) {
return;
}
var drag = this._drag;
var range = this._range;
var drag = this._drag;
var range = this._range;
var offset = this._elmt.offset();
var xDiff = evt.pageX - drag.down.x;
var yDiff = evt.pageX - drag.down.y;
var offset = this._elmt.offset();
var xDiff = evt.pageX - drag.down.x;
var yDiff = evt.pageX - drag.down.y;
if (Math.abs(xDiff) >= 2) {
drag.sureDrag = true;
}
if (Math.abs(xDiff) >= 2) {
drag.sureDrag = true;
}
var pixelWidth = this._elmt.width();
var scale = pixelWidth / (range.max - range.min);
var vDiff = xDiff / scale;
var pixelWidth = this._elmt.width();
var scale = pixelWidth / (range.max - range.min);
var vDiff = xDiff / scale;
var adjustFrom = function() {
range.from = drag.from + Math.floor(vDiff / range.step) * range.step;
range.from = Math.max(Math.min(range.from, range.max), range.min);
};
var adjustTo = function() {
range.to = drag.to + Math.floor(vDiff / range.step) * range.step;
range.to = Math.max(Math.min(range.to, range.max), range.min);
};
var adjustFrom = function() {
range.from = drag.from + Math.floor(vDiff / range.step) * range.step;
range.from = Math.max(Math.min(range.from, range.max), range.min);
};
var adjustTo = function() {
range.to = drag.to + Math.floor(vDiff / range.step) * range.step;
range.to = Math.max(Math.min(range.to, range.max), range.min);
};
if (drag.what == "left") {
adjustFrom();
range.to = Math.min(Math.max(range.to, range.from + range.step), range.max);
} else if (drag.what == "right") {
adjustTo();
range.from = Math.max(Math.min(range.from, range.to - range.step), range.min);
} else {
adjustFrom();
adjustTo();
}
if (drag.what == "left") {
adjustFrom();
range.to = Math.min(Math.max(range.to, range.from + range.step), range.max);
} else if (drag.what == "right") {
adjustTo();
range.from = Math.max(Math.min(range.from, range.to - range.step), range.min);
} else {
adjustFrom();
adjustTo();
}
this._update();
this._trigger("slide");
this._update();
this._trigger("slide");
evt.preventDefault();
return false;
evt.preventDefault();
return false;
};
SliderWidget.prototype._update = function() {
var range = this._range;
var range = this._range;
var pixelWidth = this._elmt.width();
var scale = pixelWidth / (range.max - range.min);
var valueToPixel = function(x) {
return (x - range.min) * scale;
};
var pixelWidth = this._elmt.width();
var scale = pixelWidth / (range.max - range.min);
var valueToPixel = function(x) {
return (x - range.min) * scale;
};
var fromPixel = Math.floor(valueToPixel(range.from));
var toPixel = Math.floor(valueToPixel(range.to));
var fromPixel = Math.floor(valueToPixel(range.from));
var toPixel = Math.floor(valueToPixel(range.to));
if (range.from == range.min && range.to == range.max) {
this._leftTintedRect.hide();
this._rightTintedRect.hide();
} else {
this._leftTintedRect.show().width(fromPixel);
this._rightTintedRect.show().width(pixelWidth - toPixel);
}
if (range.from == range.min && range.to == range.max) {
this._leftTintedRect.hide();
this._rightTintedRect.hide();
} else {
this._leftTintedRect.show().width(fromPixel);
this._rightTintedRect.show().width(pixelWidth - toPixel);
}
this._highlightRect.css("left", (fromPixel - 1) + "px").width(toPixel - fromPixel);
this._leftBracket.css("left", fromPixel + "px");
this._rightBracket.css("left", toPixel + "px");
this._highlightRect.css("left", (fromPixel - 1) + "px").width(toPixel - fromPixel);
this._leftBracket.css("left", fromPixel + "px");
this._rightBracket.css("left", toPixel + "px");
};

View File

@ -312,111 +312,117 @@ input.lightweight {
div.grid-layout > table {
border-collapse: separate;
}
border-collapse: separate;
}
div.grid-layout.layout-full > table {
width: 100%;
max-width: 100% !important;
}
div.grid-layout > table > tbody > tr > th, div.grid-layout > table > tbody > tr > td {
padding: 0px;
text-align: left;
vertical-align: baseline;
}
div.grid-layout.grid-layout-for-text > table > tbody > tr > th, div.grid-layout.grid-layout-for-text > table > tbody > tr > td {
vertical-align: middle;
}
div.grid-layout.grid-layout-for-ui > table > tbody > tr > th, div.grid-layout.grid-layout-for-ui > table > tbody > tr > td {
vertical-align: top;
}
width: 100%;
max-width: 100% !important;
}
div.grid-layout > table > tbody > tr > th,
div.grid-layout > table > tbody > tr > td {
padding: 0px;
text-align: left;
vertical-align: baseline;
}
div.grid-layout.grid-layout-for-text > table > tbody > tr > th,
div.grid-layout.grid-layout-for-text > table > tbody > tr > td {
vertical-align: middle;
}
div.grid-layout.grid-layout-for-ui > table > tbody > tr > th,
div.grid-layout.grid-layout-for-ui > table > tbody > tr > td {
vertical-align: top;
}
div.grid-layout.layout-normal {
margin: -10px;
}
margin: -10px;
}
div.grid-layout.layout-normal > table {
border-spacing: 10px;
}
border-spacing: 10px;
}
div.grid-layout.layout-tight {
margin: -7px;
}
margin: -7px;
}
div.grid-layout.layout-tight > table {
border-spacing: 7px;
}
border-spacing: 7px;
}
div.grid-layout.layout-tighter {
margin: -5px;
}
margin: -5px;
}
div.grid-layout.layout-tighter > table {
border-spacing: 5px;
}
border-spacing: 5px;
}
div.grid-layout.layout-tightest {
margin: -3px;
}
margin: -3px;
}
div.grid-layout.layout-tightest > table {
border-spacing: 3px;
}
border-spacing: 3px;
}
div.grid-layout.layout-loose {
margin: -15px;
}
margin: -15px;
}
div.grid-layout.layout-loose > table {
border-spacing: 15px;
}
border-spacing: 15px;
}
div.grid-layout.layout-looser {
margin: -20px;
}
margin: -20px;
}
div.grid-layout.layout-looser > table {
border-spacing: 20px;
}
border-spacing: 20px;
}
div.input-container {
padding: 3px;
}
padding: 3px;
}
div.input-container > input, div.input-container > textarea {
display: block;
width: 100%;
padding: 2px;
border: 1px inset;
margin-left: -3px;
margin-top: -3px;
vertical-align: top;
}
display: block;
width: 100%;
padding: 2px;
border: 1px inset;
margin-left: -3px;
margin-top: -3px;
vertical-align: top;
}
input.code, textarea.code {
font-family: monospace;
}
font-family: monospace;
}
img {
vertical-align: middle;
}
vertical-align: middle;
}
.hidden {
display: none;
}
display: none;
}
.fbs-pane, .fbs-flyout-pane {
z-index: 2000;
}
z-index: 2000;
}
.ui-widget {
font-family: inherit;
font-size: inherit;
}
.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button {
font-family: inherit;
font-size: inherit;
}
font-family: inherit;
font-size: inherit;
}
.ui-widget input,
.ui-widget select,
.ui-widget textarea,
.ui-widget button {
font-family: inherit;
font-size: inherit;
}
p.body-text {
margin-bottom: 1em;
}
}
.relative-frame {
position: relative;
width: 100%;
height: 100%;
overflow: hidden;
}
}

View File

@ -34,86 +34,86 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@import-less url("../theme.less");
.clustering-dialog-table-container {
height: 450px;
overflow: auto;
border: 1px solid #aaa;
}
height: 450px;
overflow: auto;
border: 1px solid #aaa;
}
table.clustering-dialog-entry-table {
border-collapse: collapse;
width: 100%;
}
border-collapse: collapse;
width: 100%;
}
table.clustering-dialog-entry-table > tbody > tr.header {
background: #ccc;
font-weight: bold;
}
background: #ccc;
font-weight: bold;
}
table.clustering-dialog-entry-table > tbody > tr > td {
padding: 2px 5px;
}
padding: 2px 5px;
}
table.clustering-dialog-entry-table > tbody > tr.odd > td {
background: #eee;
}
background: #eee;
}
table.clustering-dialog-entry-table > tbody > tr.even > td {
background: white;
}
background: white;
}
table.clustering-dialog-entry-table input {
border: 1px solid #ccc;
padding: 0 0.1em;
}
border: 1px solid #ccc;
padding: 0 0.1em;
}
table.clustering-dialog-entry-table a {
text-decoration: none;
}
text-decoration: none;
}
table.clustering-dialog-entry-table ul {
margin: 1em 0em 0em 0em;
}
margin: 1em 0em 0em 0em;
}
table.clustering-dialog-entry-table a:hover {
text-decoration: underline
}
text-decoration: underline
}
.clustering-dialog-entry-count {
color: #aaa;
margin-left: 0.5em;
}
color: #aaa;
margin-left: 0.5em;
}
.clustering-dialog-controls {
margin-bottom: 0.5em;
margin-right: 2em;
}
margin-bottom: 0.5em;
margin-right: 2em;
}
.clustering-dialog-controls td {
padding-right: 0.5em;
}
padding-right: 0.5em;
}
.clustering-dialog-facet {
margin-bottom: 1em;
}
margin-bottom: 1em;
}
.clustering-dialog-facet-header {
font-weight: bold;
}
font-weight: bold;
}
.clustering-dialog-facet-histogram {
overflow: hidden;
}
overflow: hidden;
}
.clustering-dialog-facet-slider {
margin: 5px;
}
margin: 5px;
}
.clustering-dialog-facet-selection {
text-align: center;
color: #888;
}
text-align: center;
color: #888;
}
.clustering-dialog-value-focus {
text-align: right;
font-size: 80%;
}
text-align: right;
font-size: 80%;
}
.clustering-dialog-value-focus a {
text-decoration: none;
visibility: hidden;
}
text-decoration: none;
visibility: hidden;
}

View File

@ -34,16 +34,16 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@import-less url("../theme.less");
.column-reordering-dialog-column {
border: 1px solid #aaa;
background: #eee;
padding: 3px;
margin: 2px;
cursor: move;
}
border: 1px solid #aaa;
background: #eee;
padding: 3px;
margin: 2px;
cursor: move;
}
.column-reordering-dialog-column-container {
height: 375px;
border: 1px solid #eee;
padding: 10px;
overflow: auto;
}
height: 375px;
border: 1px solid #eee;
padding: 10px;
overflow: auto;
}

View File

@ -34,86 +34,86 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@import-less url("../theme.less");
#expression-preview-tabs .ui-tabs-nav li a {
padding: 0.15em 1em;
}
padding: 0.15em 1em;
}
textarea.expression-preview-code {
font-family: monospace;
height: 5em;
vertical-align: top;
}
font-family: monospace;
height: 5em;
vertical-align: top;
}
.expression-preview-parsing-status {
color: @light_grey;
}
color: @light_grey;
}
.expression-preview-parsing-status.error {
color: red;
}
color: red;
}
#expression-preview-tabs-preview,
#expression-preview-tabs-help,
#expression-preview-tabs-history,
#expression-preview-tabs-starred {
padding: @padding_tight;
overflow: hidden;
}
padding: @padding_tight;
overflow: hidden;
}
#expression-preview-tabs-preview > div,
#expression-preview-tabs-help > div,
#expression-preview-tabs-history > div,
#expression-preview-tabs-starred {
height: 200px;
overflow: auto;
}
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-starred td, #expression-preview-tabs-starred th {
padding: @padding_tight;
}
padding: @padding_tight;
}
.expression-preview-table-wrapper {
padding: @padding_normal;
}
padding: @padding_normal;
}
.expression-preview-container td {
padding: 2px 5px;
border-top: 1px solid #ccc;
}
padding: 2px 5px;
border-top: 1px solid #ccc;
}
td.expression-preview-heading {
border-top: none;
background: #ddd;
font-weight: bold;
}
border-top: none;
background: #ddd;
font-weight: bold;
}
td.expression-preview-value {
max-width: 250px !important;
overflow-x: hidden;
}
max-width: 250px !important;
overflow-x: hidden;
}
.expression-preview-special-value {
color: #aaa;
}
color: #aaa;
}
.expression-preview-help-container h3 {
margin-top: @padding_looser;
margin-bottom: @padding_normal;
border-bottom: 1px solid @light_grey;
}
margin-top: @padding_looser;
margin-bottom: @padding_normal;
border-bottom: 1px solid @light_grey;
}
.expression-preview-doc-item-title {
font-weight: bold;
text-align: right;
}
font-weight: bold;
text-align: right;
}
.expression-preview-doc-item-params {
}
}
.expression-preview-doc-item-returns {
}
}
.expression-preview-doc-item-desc {
color: #666;
}
color: #666;
}

View File

@ -34,46 +34,46 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@import-less url("../theme.less");
.scatterplot-dialog-selectors-container {
}
}
.scatterplot-dialog-selectors-container .buttonset {
margin-right: 1em;
}
margin-right: 1em;
}
.scatterplot-dialog-table-container {
margin: 2px 0em;
height: 500px;
overflow: auto;
border: 1px solid #aaa;
}
margin: 2px 0em;
height: 500px;
overflow: auto;
border: 1px solid #aaa;
}
table.scatterplot-matrix-table {
border-collapse: collapse;
}
border-collapse: collapse;
}
table.scatterplot-matrix-table > tbody > tr > td {
text-align: center;
vertical-align: middle;
}
text-align: center;
vertical-align: middle;
}
table.scatterplot-matrix-table td.current_column {
font-weight: bold;
font-size: 105%;
}
font-weight: bold;
font-size: 105%;
}
table.scatterplot-matrix-table div.current_column {
background-color: #fbede3;
}
background-color: #fbede3;
}
table.scatterplot-matrix-table .column_header {
text-align: right;
padding: 0em 0.5em;
}
text-align: right;
padding: 0em 0.5em;
}
table.scatterplot-matrix-table .scatterplot img {
border: 1px solid #eee;
}
border: 1px solid #eee;
}
table.scatterplot-matrix-table .scatterplot img.hover {
background-color: #eeffee;
}
background-color: #eeffee;
}

View File

@ -39,10 +39,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
padding: 0;
overflow: hidden;
visibility: hidden;
}
}
#left-panel {
}
}
#left-panel-body {
margin-left: @padding_tight;
@ -55,18 +55,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
padding: 0;
padding-top: @padding_looser;
font-size: 1.3em;
}
}
#action-area-tabs > li {
display: block;
padding-top: @padding_tight;
padding-bottom: @padding_tight;
padding-left: @padding_normal;
cursor: pointer;
}
}
#action-area-tabs > li.selected {
background: @chrome_primary;
.rounded_corners_left();
}
}
#project-links {
font-size: 1.3em;
@ -114,4 +114,4 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
left: 0;
width: 100%;
height: 100%;
}
}

View File

@ -48,7 +48,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
}
#create-project-ui-source-selection-message > h3 {
margin-bottom: @padding_normal;
}
}
#create-project-ui-source-selection-layout {
width: 100%;
@ -95,4 +95,4 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
width: 100%;
height: 100%;
visibility: hidden;
}
}

View File

@ -36,24 +36,24 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#default-importing-progress-panel {
font-size: 1.3em;
padding: @padding_loose;
}
}
#default-importing-progress-bar-frame {
border: 1px solid @chrome_primary;
padding: @padding_tighter;
width: 300px;
}
}
#default-importing-progress-bar-body {
background: @chrome_primary;
height: 1em;
position: relative;
width: 30%;
}
}
#default-importing-progress-bar-body.indefinite {
background: #eee;
width: 100%;
}
}
#default-importing-iframe {
position: fixed;
@ -61,23 +61,23 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
height: 200px;
left: -300px;
top: -300px;
}
}
#default-importing-error-panel {
font-size: 1.3em;
padding: @padding_loose;
}
}
#default-importing-error-message {
}
}
#default-importing-error-stack {
font-family: monospace;
whitespace: pre;
padding: @padding_normal;
border: 1px solid @chrome_primary;
}
}
.default-importing-wizard-header {
font-size: 1.3em;
background: @chrome_primary;
padding: @padding_tight;
}
}

View File

@ -38,13 +38,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
position: absolute;
background: @chrome_secondary;
padding: @padding_looser;
}
}
.default-importing-file-selection-file-panel {
font-size: 1.3em;
position: absolute;
background: white;
overflow: auto;
}
}
.default-importing-file-selection-file-panel > table {
border-collapse: collapse;
width: 100%;
@ -52,22 +52,22 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.default-importing-file-selection-file-panel > table > tbody > tr > td,
.default-importing-file-selection-file-panel > table > tbody > tr > th {
padding: @padding_tight @padding_normal;
}
}
.default-importing-file-selection-file-panel > table > tbody > tr > th {
text-align: left;
background: @faint_grey;
}
}
.default-importing-file-selection-file-panel > table > tbody > tr.odd {
background: @fainter_grey;
}
}
.default-importing-file-selection-control-panel h2 {
font-size: 110%;
margin-top: 3em;
margin-bottom: 0.75em;
}
}
.default-importing-file-selection-file-panel > table > tbody > tr >
td.default-importing-file-selection-filename.highlighted {
td.default-importing-file-selection-filename.highlighted {
background: #fffee0;
}
}

View File

@ -37,7 +37,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
font-size: 1.1em;
position: absolute;
overflow: auto;
}
}
.default-importing-progress-data-panel {
position: absolute;
@ -46,7 +46,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
padding: 3em;
background: rgba(255, 255, 255, 0.7);
text-align: center;
}
}
.default-importing-parsing-control-panel {
font-size: 1.3em;
@ -54,39 +54,39 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
overflow: auto;
border-top: 5px solid @chrome_primary;
background: @chrome_secondary;
}
}
.default-importing-parsing-control-panel > table {
width: 100%;
border-collapse: collapse;
}
}
td.default-importing-parsing-control-panel-formats {
padding: @padding_looser 0;
width: 250px;
}
}
.default-importing-parsing-control-panel-formats-message {
margin-left: @padding_looser;
margin-bottom: @padding_looser;
padding: 0 @padding_normal;
font-size: 1.3em;
}
}
.default-importing-parsing-control-panel-format {
margin-left: @padding_looser;
padding: @padding_tight @padding_normal;
.rounded_corners_left();
color: @link_primary;
cursor: pointer;
}
}
.default-importing-parsing-control-panel-format.selected {
background: white;
font-weight: bold;
color: black;
}
}
td.default-importing-parsing-control-panel-options-panel {
background: white;
padding: @padding_looser;
.rounded_corners_left();
}
}

View File

@ -35,9 +35,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.default-importing-web-url {
width: 60em;
}
}
#default-importing-clipboard-textarea {
width: 50em;
height: 30em;
}
}

View File

@ -37,29 +37,29 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
position: relative;
font-family: monospace;
font-size: 150%;
}
}
table.data-table.fixed-width-preview-data-table {
font-size: inherit;
}
}
table.data-table.fixed-width-preview-data-table > tbody > tr {
border-bottom: 1px solid #ccc;
}
}
table.data-table.fixed-width-preview-data-table > tbody > tr > td.column-header {
background: none;
}
}
table.data-table.fixed-width-preview-data-table > tbody > tr > td,
table.data-table.fixed-width-preview-data-table > tbody > tr > td.column-header {
border: none;
padding: 2px 0px;
white-space: pre;
}
}
table.data-table.fixed-width-preview-data-table > tbody > tr > td.even,
table.data-table.fixed-width-preview-data-table > tbody > tr > td.column-header.even {
background: #eee;
}
}
.fixed-width-preview-column-separator-outer {
position: absolute;
@ -70,14 +70,14 @@ table.data-table.fixed-width-preview-data-table > tbody > tr > td.column-header.
padding: 0px 3px;
cursor: ew-resize;
overflow: visible;
}
}
.fixed-width-preview-column-separator-inner {
position: relative;
height: 100%;
width: 1px;
background: red;
overflow: visible;
}
}
.fixed-width-preview-column-separator-inner > div {
position: absolute;
top: 50px;
@ -87,4 +87,4 @@ table.data-table.fixed-width-preview-data-table > tbody > tr > td.column-header.
width: 13px;
height: 13px;
cursor: pointer;
}
}

View File

@ -36,4 +36,4 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#project-upload-form {
padding: @padding_loose;
font-size: 1.3em;
}
}

View File

@ -38,45 +38,45 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
font-size: 130%;
color: #666;
padding: 20px;
}
}
.json-parser-ui-select-dom {
padding: 20px;
font-family: monospace;
font-size: 130%;
}
}
.json-parser-ui-select-dom .node {
cursor: pointer;
padding: 2px;
border: 1px solid rgba(0,0,0,0);
}
}
.json-parser-ui-select-dom .indented {
margin-left: 2em;
}
}
.json-parser-ui-select-dom .field-name {
font-weight: bold;
}
}
.json-parser-ui-select-dom .delimiter {
color: blue;
}
}
.json-parser-ui-select-dom .punctuation {
color: #aaa;
}
}
.json-parser-ui-select-dom .literal {
color: #888;
}
}
.json-parser-ui-select-dom .children {
margin-left: 20px;
}
}
.json-parser-ui-select-dom .node.highlight {
background: #fffee0;
border: 1px dashed red;
}
}

View File

@ -38,29 +38,29 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
font-size: 150%;
color: #666;
padding: 20px;
}
}
.xml-parser-ui-select-dom {
padding: 20px;
font-family: monospace;
font-size: 150%;
}
}
.xml-parser-ui-select-dom .elmt {
cursor: pointer;
padding: 2px;
border: 1px solid rgba(0,0,0,0);
}
}
.xml-parser-ui-select-dom .text {
color: #888;
}
}
.xml-parser-ui-select-dom .children {
margin-left: 20px;
}
}
.xml-parser-ui-select-dom .elmt.highlight {
background: #fffee0;
border: 1px dashed red;
}
}

View File

@ -58,15 +58,15 @@ li.facet-container {
}
a.facet-title-remove {
display: block;
width: 12px;
height: 12px;
margin: 2px 0 0 0;
text-decoration: none;
background-image: url(../../images/close-map.png);
background-repeat: no-repeat;
background-position: 0px 0px;
}
display: block;
width: 12px;
height: 12px;
margin: 2px 0 0 0;
text-decoration: none;
background-image: url(../../images/close-map.png);
background-repeat: no-repeat;
background-position: 0px 0px;
}
a.facet-title-remove:hover {
background-position: -12px 0px;
@ -142,26 +142,26 @@ a.facet-title-remove:hover {
}
.facet-choice {
padding: 2px 5px;
clear: both;
}
padding: 2px 5px;
clear: both;
}
.facet-choice:hover {
background: @fill_secondary;
}
}
.facet-choice-selected .facet-choice-label {
font-weight: bold;
color: #ff6a00;
}
font-weight: bold;
color: #ff6a00;
}
.facet-mode-inverted .facet-choice-selected .facet-choice-label {
text-decoration: line-through;
color: black;
}
text-decoration: line-through;
color: black;
}
.facet-choice-link.facet-mode-inverted {
text-decoration: line-through;
color: black;
}
text-decoration: line-through;
color: black;
}
.facet-choice-count, .facet-range-choice-count {
padding-left: 5px;
@ -178,15 +178,15 @@ a.facet-choice-link {
}
img.facet-choice-link {
text-align: baseline;
cursor: pointer;
margin-left: 2px;
float: right;
}
text-align: baseline;
cursor: pointer;
margin-left: 2px;
float: right;
}
.facet-range-body {
padding: 5px;
}
padding: 5px;
}
.facet-range-message {
color: @metadata_grey;
@ -222,122 +222,120 @@ img.facet-choice-link {
.facet-text-body {
padding: 5px;
}
padding: 5px;
}
.facet-scatterplot-plot-container {
margin: 5px 0px 5px 5px;
border: 1px solid #bbb;
}
margin: 5px 0px 5px 5px;
border: 1px solid #bbb;
}
.facet-scatterplot-plot {
position: relative;
}
position: relative;
}
.facet-scatterplot-image {
position: absolute;
}
position: absolute;
}
.facet-scatterplot-body td {
vertical-align: middle;
}
vertical-align: middle;
}
.facet-scatterplot-selectors-container .scatterplot-selectors {
text-align: center;
}
text-align: center;
}
.facet-scatterplot-selectors-container .scatterplot-export-plot {
font-size: 95%;
margin-top: 3em;
}
font-size: 95%;
margin-top: 3em;
}
.facet-scatterplot-selectors-container .scatterplot-selectors .buttonset {
margin: 0.8em 0em;
}
margin: 0.8em 0em;
}
.scatterplot-selectors .ui-button-text-only .ui-button-text {
font-size: 90%;
padding: 0.0em 0.4em 0.1em 0.3em;
}
font-size: 90%;
padding: 0.0em 0.4em 0.1em 0.3em;
}
.scatterplot-selectors .buttonset {
margin: 0px;
}
margin: 0px;
}
.scatterplot-selectors .buttonset .ui-corner-top {
-moz-border-radius-topleft: 0.5em;
-webkit-border-top-left-radius: 0.5em;
border-top-left-radius: 0.5em;
-moz-border-radius-topright: 0.5em;
-webkit-border-top-right-radius: 0.5em;
border-top-right-radius: 0.5em;
}
-moz-border-radius-topleft: 0.5em;
-webkit-border-top-left-radius: 0.5em;
border-top-left-radius: 0.5em;
-moz-border-radius-topright: 0.5em;
-webkit-border-top-right-radius: 0.5em;
border-top-right-radius: 0.5em;
}
.scatterplot-selectors .buttonset .ui-corner-bottom {
-moz-border-radius-bottomleft: 0.5em;
-webkit-border-bottom-left-radius: 0.5em;
border-bottom-left-radius: 0.5em;
-moz-border-radius-bottomright: 0.5em;
-webkit-border-bottom-right-radius: 0.5em;
border-bottom-right-radius: 0.5em;
}
-moz-border-radius-bottomleft: 0.5em;
-webkit-border-bottom-left-radius: 0.5em;
border-bottom-left-radius: 0.5em;
-moz-border-radius-bottomright: 0.5em;
-webkit-border-bottom-right-radius: 0.5em;
border-bottom-right-radius: 0.5em;
}
.scatterplot-selectors .buttonset .ui-corner-right {
-moz-border-radius-topright: 0.5em;
-webkit-border-top-right-radius: 0.5em;
border-top-right-radius: 0.5em;
-moz-border-radius-bottomright: 0.5em;
-webkit-border-bottom-right-radius: 0.5em;
border-bottom-right-radius: 0.5em;
}
-moz-border-radius-topright: 0.5em;
-webkit-border-top-right-radius: 0.5em;
border-top-right-radius: 0.5em;
-moz-border-radius-bottomright: 0.5em;
-webkit-border-bottom-right-radius: 0.5em;
border-bottom-right-radius: 0.5em;
}
.scatterplot-selectors .buttonset .ui-corner-left {
-moz-border-radius-topleft: 0.5em;
-webkit-border-top-left-radius: 0.5em;
border-top-left-radius: 0.5em;
-moz-border-radius-bottomleft: 0.5em;
-webkit-border-bottom-left-radius: 0.5em;
border-bottom-left-radius: 0.5em;
}
-moz-border-radius-topleft: 0.5em;
-webkit-border-top-left-radius: 0.5em;
border-top-left-radius: 0.5em;
-moz-border-radius-bottomleft: 0.5em;
-webkit-border-bottom-left-radius: 0.5em;
border-bottom-left-radius: 0.5em;
}
.scatterplot-selectors .scatterplot-dim-selector label {
width: 32px;
height: 16px;
}
width: 32px;
height: 16px;
}
.scatterplot-selectors .scatterplot-rot-selector label {
width: 22px;
height: 18px;
background-image: url("../../images/scatterplot-icons.png");
}
width: 22px;
height: 18px;
background-image: url("../../images/scatterplot-icons.png");
}
.scatterplot-selectors .scatterplot-rot-selector label.rot-ccw-label {
background-position: -5px -5px;
}
background-position: -5px -5px;
}
.scatterplot-selectors .scatterplot-rot-selector label.rot-none-label {
background-position: -28px -4px;
}
background-position: -28px -4px;
}
.scatterplot-selectors .scatterplot-rot-selector label.rot-cw-label {
background-position: -48px -3px;
}
background-position: -48px -3px;
}
.scatterplot-selectors .scatterplot-dot-selector label {
width: 22px;
height: 18px;
background-image: url("../../images/scatterplot-icons.png");
}
width: 22px;
height: 18px;
background-image: url("../../images/scatterplot-icons.png");
}
.scatterplot-selectors .scatterplot-dot-selector label.dot-small-label {
background-position: -5px -25px;
}
background-position: -5px -25px;
}
.scatterplot-selectors .scatterplot-dot-selector label.dot-regular-label {
background-position: -27px -25px;
}
background-position: -27px -25px;
}
.scatterplot-selectors .scatterplot-dot-selector label.dot-big-label {
background-position: -48px -25px;
}
background-position: -48px -25px;
}

View File

@ -34,30 +34,29 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@import-less url("../theme.less");
#process-panel {
position: fixed;
top: 0px;
z-index: 1000;
background: #DBE8EB;
border: 1px solid #aaa;
border-top: none;
-moz-border-radius-bottomleft: 10px;
-webkit-border-bottom-left-radius: 10px;
-moz-border-radius-bottomright: 10px;
-webkit-border-bottom-right-radius: 10px;
}
position: fixed;
top: 0px;
z-index: 1000;
background: #DBE8EB;
border: 1px solid #aaa;
border-top: none;
-moz-border-radius-bottomleft: 10px;
-webkit-border-bottom-left-radius: 10px;
-moz-border-radius-bottomright: 10px;
-webkit-border-bottom-right-radius: 10px;
}
.process-panel-inner {
padding-bottom: 10px;
}
padding-bottom: 10px;
}
.process-panel-head {
padding: 2px 10px;
border-bottom: 1px solid #ccc;
}
padding: 2px 10px;
border-bottom: 1px solid #ccc;
}
.process-panel-body {
max-height: 70px;
overflow: auto;
padding: 10px;
}
max-height: 70px;
overflow: auto;
padding: 10px;
}

View File

@ -35,10 +35,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
background: -webkit-gradient(linear, left top, left bottom, from(#f9f9f9), to(#e3e3e3));
background: -moz-linear-gradient(top, #f9f9f9, #e3e3e3);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9f9f9', endColorstr='#e3e3e3');
}
}
.button:active, a.button:active {
background: -webkit-gradient(linear, left top, left bottom, from(#e3e3e3), to(#f9f9f9));
background: -moz-linear-gradient(top, #e3e3e3, #f9f9f9);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e3e3e3', endColorstr='#f9f9f9');
}
}

View File

@ -34,46 +34,46 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@import-less url("../theme.less");
.recon-dialog-service-list {
border: 1px solid #aaa;
padding: 1px;
overflow: auto;
width: 200px;
height: 500px;
}
border: 1px solid #aaa;
padding: 1px;
overflow: auto;
width: 200px;
height: 500px;
}
a.recon-dialog-service-selector {
display: block;
padding: 10px;
text-decoration: none;
color: black;
}
display: block;
padding: 10px;
text-decoration: none;
color: black;
}
a.recon-dialog-service-selector:hover {
background: #eee;
}
background: #eee;
}
a.recon-dialog-service-selector.selected {
background: #eee;
font-weight: bold;
}
background: #eee;
font-weight: bold;
}
.recon-dialog-service-panel-message {
text-align: center;
font-size: 200%;
padding: 50px 0;
color: #aaa;
}
text-align: center;
font-size: 200%;
padding: 50px 0;
color: #aaa;
}
a.recon-dialog-service-selector-remove {
float: right;
position: relative;
top: -5px;
left: 5px;
width: 12px;
height: 12px;
text-decoration: none;
background-image: url(../../images/close-map.png);
background-repeat: no-repeat;
background-position: 0px 0px;
}
float: right;
position: relative;
top: -5px;
left: 5px;
width: 12px;
height: 12px;
text-decoration: none;
background-image: url(../../images/close-map.png);
background-repeat: no-repeat;
background-position: 0px 0px;
}
a.recon-dialog-service-selector-remove:hover {
background-position: -12px 0px;
}
background-position: -12px 0px;
}

View File

@ -34,21 +34,21 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@import-less url("../theme.less");
.recon-dialog-standard-service-panel-message {
text-align: center;
font-size: 150%;
padding: 20px 0;
color: #aaa;
}
text-align: center;
font-size: 150%;
padding: 20px 0;
color: #aaa;
}
.recon-dialog-standard-service-panel .type-id {
color: #888;
}
color: #888;
}
.recon-dialog-standard-service-panel .type-container,
.recon-dialog-standard-service-panel .detail-container {
border: 1px solid #ccc;
padding: 10px;
max-height: 300px;
height: 300px !important;
overflow: auto;
}
border: 1px solid #ccc;
padding: 10px;
max-height: 300px;
height: 300px !important;
overflow: auto;
}

View File

@ -34,5 +34,5 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@import-less url("../theme.less");
.fbs-pane-property, .fbs-pane-type {
width: 400px;
}
width: 400px;
}

View File

@ -34,10 +34,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@import-less url("../theme.less");
.slider-widget {
position: relative;
overflow: visible;
margin: 5px;
}
position: relative;
overflow: visible;
margin: 5px;
}
.slider-widget-tint {
position: absolute;
@ -49,42 +49,42 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
}
.slider-widget-tint.left {
left: 0;
}
left: 0;
}
.slider-widget-tint.right {
right: 0;
}
right: 0;
}
.slider-widget-highlight {
position: absolute;
padding: 0;
border: 1px solid #000;
top: -2px;
height: 100%;
cursor: move;
}
position: absolute;
padding: 0;
border: 1px solid #000;
top: -2px;
height: 100%;
cursor: move;
}
.slider-widget-bracket {
position: absolute;
top: 0;
width: 12px;
height: 100%;
}
position: absolute;
top: 0;
width: 12px;
height: 100%;
}
.slider-widget-bracket.left {
background: url(../../images/slider-handle.png) no-repeat center right;
margin-left: -8px;
cursor: e-resize;
}
background: url(../../images/slider-handle.png) no-repeat center right;
margin-left: -8px;
cursor: e-resize;
}
.slider-widget-bracket.right {
background: url(../../images/slider-handle.png) no-repeat center left;
margin-left: -4px;
cursor: w-resize;
}
background: url(../../images/slider-handle.png) no-repeat center left;
margin-left: -4px;
cursor: w-resize;
}
.slider-widget-overlay {
position: fixed;
top: 0px;
left: 0px;
width: 100%;
height: 100%;
background: white;
opacity: 0.01;
}
position: fixed;
top: 0px;
left: 0px;
width: 100%;
height: 100%;
background: white;
opacity: 0.01;
}