blob: bb50b47e45b41f211a279c5807a18c6bf78ea874 [file] [log] [blame]
var loggedIn; // initial user data
var user = '';
var allUserGroups;
var selectedDocId; // initial pagination parameters
var numberOfFields = 0;
var resultOffset = 1;
var numberOfResults = 10;
var lastData = '';
var nextDisabled = false;
var previewDisabled = true;
var fields = ["id", "fileName", "filePath", "ownerName", "generatedApplicationName", "dataArchiveNode", "createdDate"]; // list of fields common for all data products
var service_url = "http://localhost/datacat/dataStoreService.php";
$(document).ready(function () {
var loginPopover = $('#login-popover-btn');
var logoutButton = $('#logout-btn');
addFieldedField(); // add one item to the graphical query construct by default
loginPopover.popover({
'placement': 'bottom',
'html': true
});
loginPopover.hide();
logoutButton.hide();
$('#logged-is-as').hide();
checkLogin();
$(document).on("click", "#fielded-add-btn", addField); // bind events to dom items
$(document).on("click", "#fielded-remove-btn", removeField);
$(document).on("click", "#logout-btn", logout);
$(document).on("click", "#login-btn", login);
$(document).on("change", ".field-select", fieldChanged);
$(document).on("change", ".relation-date", dateRelationChanged);
$(document).on("click", "#search-btn", search);
$('#form-outer-wrapper').keypress(function (e) { // trigger search function on pressing
if (e.which == 13) {
e.preventDefault();
search();
return false;
}
});
$(document).on("click", "#getNext", getNext);
$(document).on("click", "#getPrevious", getPrevious);
$(document).on("click", ".share-btn", showAclList);
$(document).on("click", "#update-acl-btn", updateAclList);
getAllUserGroups();
});
var getMetadataFieldListCall = function () { // get the full list of searchable/indexed fields
var request = $.ajax({
url: service_url,
type: "POST",
data: {
'call': 'getMetadataFieldList'
}
});
request.done(function (msg) {
var newFields = JSON.parse(msg);
for (var i = 0; i < newFields.length; i++) {
fields.push(newFields[i]);
}
addFieldedField(); //Adding one field by default
});
request.fail(function (jqXHR, textStatus) {
$('#results').html("<p style='text-align: center'>GET METADATA FIELD LIST FAILED</p>");
});
};
var getAllUserGroups = function () { // get the full list of user groups for sharing data products
var request = $.ajax({
url: service_url,
type: "POST",
data: {
'call': 'getAllUserGroups'
}
});
request.done(function (msg) {
allUserGroups = JSON.parse(msg);
});
request.fail(function (jqXHR, textStatus) {
$('#results').html("<p style='text-align: center'>GET ALL USER GROUPS FAILED</p>");
});
};
var login = function () { // authenticate user
var username = $("#username").val();
var password = $("#password").val();
if (username == "") {
alert("Please enter a valid username");
return;
} else if (password == "") {
alert("Please enter a valid password");
return;
}
var data = {
"username": username,
"password": password
};
var request = $.ajax({
url: service_url,
type: "POST",
data: {
'call': 'login',
'data': data
}
});
request.done(function (msg) {
if (msg == 'true') {
loggedIn = true;
user = username;
checkLogin();
$('#login-popover-btn').popover('hide');
} else {
alert('The username and password do not match.');
}
});
request.fail(function (jqXHR, textStatus) {
alert('Oops, something went wrong');
});
};
var checkLogin = function () { //check user logged in and get username
var loginPopover = $('#login-popover-btn');
var logoutButton = $('#logout-btn');
var loggedInAs = $('#logged-is-as');
var request = $.ajax({
url: service_url,
type: "POST",
data: {
'call': 'checkLogin'
}
});
request.done(function (msg) {
user = msg;
var loginData = '<div id="login-form-wrapper">' +
' <form class="form-horizontal">' +
' <div class="form-group">' +
' <input type="text" placeholder="Username" id="username"/>' +
' </div>' +
' <div class="form-group">' +
' <input type="password" placeholder="Password" id="password"/>' +
' </div>' +
' <div class="form-group" id="login-btn-wrapper">' +
' <button type="button" class="btn btn-default col-xs-12" id="login-btn">Login</button>' +
' </div>' +
' </form>' +
'</div>';
if (msg == '%%false%%') {
loggedIn = false;
loginPopover.text('Log in');
loginPopover.attr('data-content', loginData);
logoutButton.hide();
loginPopover.show();
loggedInAs.hide();
} else {
loggedIn = true;
loginPopover.text('Logged in');
loginPopover.attr('data-content', '');
loginPopover.hide();
logoutButton.show();
loggedInAs.html('Logged in as <strong>' + user + '</strong>');
loggedInAs.show();
}
});
request.fail(function (jqXHR, textStatus) {
alert('Oops, something went wrong');
});
};
var logout = function () {
var request = $.ajax({
url: service_url,
type: "POST",
data: {
'call': 'logout'
}
});
request.done(function (msg) {
if (msg) {
loggedIn = false;
user = '';
checkLogin();
$('#login-popover-btn').popover('hide');
} else {
alert('Logout failed.');
}
});
request.fail(function (jqXHR, textStatus) {
alert('Oops, something went wrong');
});
};
var addField = function () { // add field to graphical query construct
if (numberOfFields < 10) {
addFieldedField();
} else {
alert('Too many fields');
}
};
var addFieldedField = function () {
var fieldsHtml = '<option value="id">Document ID</option>' +
'<option value="fileName">File Name</option>' +
'<option value="filePath">File Path</option>' +
'<option value="gatewayId">Gateway ID</option>' +
'<option value="applicationName">Application Name</option>' +
'<option value="experimentId">Experiment ID</option>' +
'<option value="computingResourceName">Computing Resource Name</option>' +
'<option value="createdDate">Created Date</option>';
numberOfFields += 1;
$('#fielded-fields').append('<div class="form-group fielded-field" id="field-group-' + numberOfFields + '">' +
' <label class="col-xs-12">Field ' + numberOfFields + '</label>' +
' <div class="col-xs-6 col-sm-3">' +
' <select class="field-select form-control" id="field-' + numberOfFields + '">'
+ fieldsHtml +
' </select>' +
' </div>' +
' <div class="col-xs-6 col-sm-3">' +
' <select class="form-control" id="relation-' + numberOfFields + '">' +
' <option value="WILDCARD">Wildcard</option>' +
' <option value="EQUALS">Equals</option>' +
' <option value="PHRASE">Phrase</option>' +
' <option value="SUBSTRING">Substring</option>' +
' </select>' +
' </div>' +
' <div class="fielded-form-input-wrapper col-xs-12 col-sm-6">' +
' <input type="text" class="form-control" id="value-' + numberOfFields + '">' +
' </div>' +
' </div>');
};
var removeField = function () { // remove field from graphical query construct
if (numberOfFields > 1) {
$('#field-group-' + numberOfFields).remove();
numberOfFields -= 1;
} else {
alert('You cannot remove the last field');
}
};
var fieldChanged = function () { // take action corresponding to selected query field
var id = $(this).parent().parent().find('.fielded-form-input-wrapper input:first')[0].id.replace('value-', '');
if ($(this).val() == 'createdDate') {
$('#relation-' + id).parent().html(' <select class="relation-date form-control" id="relation-' + id + '">' +
' <option value="EQUALS">Equals</option>' +
' <option value="RANGE">Range</option>' +
' </select>');
var html = '<input type="text" style="display:none;" class="form-control" id="value-' + id + '">' +
' <div class="input-group date datetimepicker">' +
' <input id="date-equals-' + id + '" type="text" class="form-control" />' +
' <span class="input-group-addon"><span class="glyphicon glyphicon-calendar"></span></span>' +
' </div>';
$(this).parent().parent().find('.fielded-form-input-wrapper:first').html(html);
$('.datetimepicker').datetimepicker({
maxDate: moment(),
pickTime: false,
defaultDate: moment(),
format: "MM/DD/YYYY"
});
} else {
$('#relation-' + id).parent().html(' <select class="form-control" id="relation-' + id + '">' +
' <option value="WILDCARD">Wildcard</option>' +
' <option value="EQUALS">Equals</option>' +
' <option value="PHRASE">Phrase</option>' +
' <option value="SUBSTRING">Substring</option>' +
' </select>');
$(this).parent().parent().find('.fielded-form-input-wrapper:first').html('<input type="text" class="form-control" id="value-' + id + '">');
}
};
var dateRelationChanged = function () { // take action according to the date relation selected (range)
var id = $(this).parent().parent().find('.fielded-form-input-wrapper input:first')[0].id.replace('value-', '');
if ($(this).val() == 'RANGE') {
var htmlRange = '<input type="text" style="display:none;" class="form-control" id="value-' + id + '">';
htmlRange += '<form class="form-horizontal" role="form">' +
' <div style="margin-right: 0;" class="form-group">' +
' <label for="range-from" class="col-sm-3 col-md-2 control-label">From</label>' +
' <div class="col-sm-6 col-md-10 input-group date datetimepicker datetimepicker-from" id="datetimepicker-from-' + id + '">' +
' <input class="form-control" id="range-from-' + id + '">' +
' <span class="input-group-addon"><span class="glyphicon glyphicon-calendar"></span></span>' +
' </div>' +
' </div>' +
' <div style="margin-right: 0;" class="form-group">' +
' <label for="range-to" class="col-sm-3 col-md-2 control-label">To</label>' +
' <div class="col-sm-6 col-md-10 input-group date datetimepicker datetimepicker-to" id="datetimepicker-to-' + id + '">' +
' <input type="text" class="form-control" id="range-to-' + id + '">' +
' <span class="input-group-addon"><span class="glyphicon glyphicon-calendar"></span></span>' +
' </div>' +
' </div>' +
' </form>';
$(this).parent().parent().find('.fielded-form-input-wrapper:first').html(htmlRange);
$('.datetimepicker-from').datetimepicker({
pickTime: false,
defaultDate: moment().subtract(1, 'days'),
format: "MM/DD/YYYY"
});
$('.datetimepicker-to').datetimepicker({
maxDate: moment(),
pickTime: false,
defaultDate: moment(),
format: "MM/DD/YYYY"
});
$('#datetimepicker-to-' + id).data("DateTimePicker").setMinDate(moment());
$('#datetimepicker-from-' + id).data("DateTimePicker").setMaxDate(moment().subtract(1, 'days'));
$("#datetimepicker-from-" + id).on("dp.change", function (e) {
$('#datetimepicker-to-' + id).data("DateTimePicker").setMinDate(e.date);
});
$("#datetimepicker-to-" + id).on("dp.change", function (e) {
$('#datetimepicker-from-' + id).data("DateTimePicker").setMaxDate(e.date);
});
} else if ($(this).val() == 'EQUALS') {
var htmlEquals = '<input type="text" style="display:none;" class="form-control" id="value-' + id + '">' +
' <div class="input-group date datetimepicker">' +
' <input id="date-equals-' + id + '" type="text" class="form-control" />' +
' <span class="input-group-addon"><span class="glyphicon glyphicon-calendar"></span></span>' +
' </div>';
$(this).parent().parent().find('.fielded-form-input-wrapper:first').html(htmlEquals);
$('.datetimepicker').datetimepicker({
maxDate: moment(),
pickTime: false,
defaultDate: moment(),
format: "MM/DD/YYYY"
});
}
};
var search = function () { // search data products
var primaryQueryParameterList = [];
var allFieldsEmpty = true;
for (var i = 1; i <= numberOfFields; i++) {
if ($('#field-' + i).val() == 'createdDate') {
if ($('#relation-' + i).val() == 'EQUALS') {
var primaryDateQueryParameter = {
"primaryQueryType": 'EQUALS',
"firstParameter": moment($("#date-equals-" + i).val()).format("YYYY-MM-DD") + "T00:00:00Z",
"secondParameter": null,
"field": $("#field-" + i).val()
};
primaryQueryParameterList.push(primaryDateQueryParameter);
allFieldsEmpty = false;
} else {
var primaryRangeQueryParameter = {
"primaryQueryType": 'RANGE',
"firstParameter": moment($("#range-from-" + i).val()).format("YYYY-MM-DD") + "T00:00:00Z",
"secondParameter": moment($("#range-to-" + i).val()).format("YYYY-MM-DD") + "T00:00:00Z",
"field": $("#field-" + i).val()
};
primaryQueryParameterList.push(primaryRangeQueryParameter);
allFieldsEmpty = false;
}
} else {
var value = $("#value-" + i).val();
if (value !== "") {
var primaryQueryParameter = {
"primaryQueryType": $("#relation-" + i).val(),
"firstParameter": value,
"secondParameter": null,
"field": $("#field-" + i).val()
};
primaryQueryParameterList.push(primaryQueryParameter);
allFieldsEmpty = false;
}
}
}
if (allFieldsEmpty) {
alert("Please select some query parameters !!!");
return;
}
var data = {
"queryStringSet": false,
"startRow": resultOffset,
"numberOfRows": numberOfResults,
"primaryQueryParameterList": primaryQueryParameterList
};
lastData = data;
getResultsCall(data);
};
var getNext = function () { // get next results set
if (!nextDisabled) {
resultOffset += numberOfResults;
lastData.startRow = resultOffset;
previewDisabled = false;
getResultsCall(lastData);
}
};
var getPrevious = function () { //get previous results set
if (resultOffset != 1) {
if ((resultOffset - numberOfResults) == 1) {
previewDisabled = true;
}
resultOffset -= numberOfResults;
lastData.startRow = resultOffset;
nextDisabled = false;
getResultsCall(lastData);
}
};
var getResultsCall = function (data) { // common function to het results for searching and pagination
var request = $.ajax({
url: service_url,
type: "POST",
data: {
'call': 'getResults',
'data': data
}
});
request.done(function (msg) {
var result = JSON.parse(msg);
if (result.length == 0) {
if (resultOffset == 1) {
$('#results').html("<p style='text-align: center'>NO RESULTS TO SHOW</p>");
} else {
nextDisabled = true;
resultOffset -= numberOfResults;
lastData.startRow = resultOffset;
$('#getNext').addClass('disabled');
alert('No more results to show.');
}
} else {
for (var i = 0; i < result.length; i++) {
if (result[i].ownerId == user) {
result[i].ownerId += '<br>' +
'<button type="button" class="btn btn-primary btn-sm share-btn" id="share-' + i + '" data-toggle="modal" data-target="#myModal">Share</button>';
}
}
// generate table header
var htmlTable = '<div class="results-table-wrapper">' +
'<table class="table table-striped table-bordered table-hover table-responsive" id="results-table">' +
' <thead>' +
' <th>Document Id</th>' +
' <th>Owner ID</th>' +
' <th>File Name</th>' +
' <th>File Path</th>' +
' <th>Gateway ID</th>' +
' <th>Application Name</th>' +
' <th>Experiment ID</th>' +
' <th>Resource Name</th>' +
' <th>Created Date</th>' +
' </thead>' +
' <tbody>';
// generate table rows
for (var j = 0; j < result.length; j++) {
htmlTable += '<tr>' +
' <td style="max-width: 150px; min-width: 150px; overflow-x: auto">' + result[j].id + '</td>' +
' <td style="max-width: 100px; min-width: 100px; overflow-x: auto">' + result[j].ownerId + '</td>' +
' <td style="max-width: 120px; min-width: 120px; overflow-x: auto">' + result[j].fileName + '</td>' +
' <td style="max-width: 120px; min-width: 120px; overflow-x: auto">' + result[j].filePath + '</td>' +
' <td style="max-width: 80px; min-width: 80px; overflow-x: auto">' + result[j].gatewayId + '</td>' +
' <td style="max-width: 80px; min-width: 80px; overflow-x: auto">' + result[j].applicationName + '</td>' +
' <td style="max-width: 80px; min-width: 80px; overflow-x: auto">' + result[j].experimentId + '</td>' +
' <td style="max-width: 80px; min-width: 80px; overflow-x: auto">' + result[j].computingResourceName + '</td>' +
' <td style="max-width: 120px; min-width: 120px; overflow-x: auto">' + moment(result[j].createdDate).format("MMM DD, YYYY") + '</td>' +
'</tr>';
}
htmlTable += '</tbody></table></div>' +
' <ul class="pager">' +
' <li class="previous" id="getPrevious"><a href="javascript:;">&larr; Previous</a></li>' +
' <li class="next" id="getNext"><a href="javascript:;">Next &rarr;</a></li>' +
' </ul>';
$('#results').html(htmlTable);
if (previewDisabled) {
$('#getPrevious').addClass('disabled');
}
if (nextDisabled) {
$('#getNext').addClass('disabled');
}
$("html, body").animate({ scrollTop: $('#results').offset().top }, 500);
}
});
request.fail(function (jqXHR, textStatus) {
$('#results').html("<p style='text-align: center'>GET RESULTS FAILED</p>");
});
};
var showAclList = function () { // show the list of available communities to share with
var thisId = this.id;
var id = $('#' + thisId).parent().parent().find('td:first').text(); // TODO: If you change the table order, use another way to get the document id
selectedDocId = id;
var request = $.ajax({
url: service_url,
type: "POST",
data: {
'call': 'getAclList',
'data': {
'id': id
}
}
});
request.done(function (msg) {
var aclList = JSON.parse(msg);
var modalHtml = '<p>Document ID: <strong>' + selectedDocId + '</strong></p>';
for (var i = 0; i < allUserGroups.length; i++) {
modalHtml += '<div class="checkbox">' +
' <label>' +
' <input type="checkbox" id="' + allUserGroups[i] + '" value="' + allUserGroups[i] + '">' + allUserGroups[i] +
' </label>' +
' </div>';
}
$('#modal-body').html(modalHtml);
for (var j = 0; j < aclList.length; j++) {
$("#" + aclList[j]).prop('checked', true);
}
});
request.fail(function (jqXHR, textStatus) {
$('#results').html("<p style='text-align: center'>GET ACL LIST FAILED</p>");
});
};
var updateAclList = function () { // update ACL list of a data product
var id = selectedDocId;
var newAclList = [];
for (var i = 0; i < allUserGroups.length; i++) {
if ($('#' + allUserGroups[i]).prop('checked')) {
newAclList.push(allUserGroups[i]);
}
}
newAclList.push(user);
var request = $.ajax({
url: service_url,
type: "POST",
data: {
'call': 'updateAclList',
'data': {
'id': id,
'acl': newAclList
}
}
});
request.done(function (msg) {
alert('Done');
});
request.fail(function (jqXHR, textStatus) {
$('#results').html("<p style='text-align: center'>UPDATE ACL LIST FAILED</p>");
});
};