Commit e695453e authored by Maxime Chaillet's avatar Maxime Chaillet
Browse files

work in progress

parent 459a58d1
...@@ -7,26 +7,29 @@ ...@@ -7,26 +7,29 @@
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"> <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
<!-- Using grunt-wiredep, the proper js files from bower components are included below -->
<!-- bower:js -->
<script src="bower_components/jquery/dist/jquery.js"></script>
<script src="bower_components/dustjs-linkedin/dist/dust-full.min.js"></script>
<script src="bower_components/bootstrap/dist/js/bootstrap.js"></script>
<script src="bower_components/dustjs-helpers/dist/dust-helpers.min.js"></script>
<script src="bower_components/lodash/lodash.js"></script>
<script src="bower_components/moment/moment.js"></script>
<!-- endbower -->
<!-- Using grunt-include-source, the proper js files created by us (not minified) are included below --> <!-- Using grunt-include-source, the proper js files created by us (not minified) are included below -->
<script src="src/author.js"></script> <script src="src/author.js"></script>
<script src="src/beamlineurl.js"></script> <script src="src/beamlineurl.js"></script>
<script src="src/citation.js"></script> <script src="src/citation.js"></script>
<script src="src/constants.js"></script>
<script src="src/doicontroller.js"></script> <script src="src/doicontroller.js"></script>
<script src="src/doiData.js"></script> <script src="src/doiData.js"></script>
<script src="src/doiview.js"></script> <script src="src/doiview.js"></script>
<script src="src/event.js"></script> <script src="src/event.js"></script>
<script src="src/experimentalreportcontroller.js"></script> <script src="src/experimentalreportcontroller.js"></script>
<script src="src/jsonextractor.js"></script> <script src="src/jsonextractor.js"></script>
<script src="src/metadataTableHelper.js"></script>
<!-- Using grunt-wiredep, the proper js files from bower components are included below -->
<!-- bower:js -->
<script src="bower_components/jquery/dist/jquery.js"></script>
<script src="bower_components/dustjs-linkedin/dist/dust-full.min.js"></script>
<script src="bower_components/bootstrap/dist/js/bootstrap.js"></script>
<script src="bower_components/dustjs-helpers/dist/dust-helpers.min.js"></script>
<script src="bower_components/lodash/lodash.js"></script>
<script src="bower_components/moment/moment.js"></script>
<!-- endbower -->
<!-- bower:css --> <!-- bower:css -->
<link rel="stylesheet" href="bower_components/bootstrap/dist/css/bootstrap.css" /> <link rel="stylesheet" href="bower_components/bootstrap/dist/css/bootstrap.css" />
......
...@@ -7,12 +7,13 @@ ...@@ -7,12 +7,13 @@
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"> <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
<!-- Using grunt-include-source, the proper js files created by us (not minified) are included below -->
<!-- include: "type": "js", "files": "src/*.js" -->
<!-- Using grunt-wiredep, the proper js files from bower components are included below --> <!-- Using grunt-wiredep, the proper js files from bower components are included below -->
<!-- bower:js --> <!-- bower:js -->
<!-- endbower --> <!-- endbower -->
<!-- Using grunt-include-source, the proper js files created by us (not minified) are included below -->
<!-- include: "type": "js", "files": "src/*.js" -->
<!-- bower:css --> <!-- bower:css -->
<!-- endbower --> <!-- endbower -->
......
...@@ -72,4 +72,4 @@ ...@@ -72,4 +72,4 @@
</div> </div>
</footer> </footer>
</body> </body>
</html> </html>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
var CONSTANTS = {
ES_RESOURCE_TYPE : "experimental session resource type",
DC_RESOURCE_TYPE : "dataset collection resource type"
};
//module.exports = CONSTANTS;
...@@ -3,6 +3,7 @@ function DoiData() { ...@@ -3,6 +3,7 @@ function DoiData() {
} }
/** /**
* Get the accessibility status * Get the accessibility status
* @param {string} resourceType the resource type for this DOI
* @param {string} sessionDate The timeStamp the experiment was started * @param {string} sessionDate The timeStamp the experiment was started
* @param {string} publiclyAccessibleYear The year the data will be publicly accesssible. * @param {string} publiclyAccessibleYear The year the data will be publicly accesssible.
* @return {string} * @return {string}
...@@ -10,19 +11,24 @@ function DoiData() { ...@@ -10,19 +11,24 @@ function DoiData() {
* "Restricted access" : the data is still under embargo. Only accessible to experimental team members * "Restricted access" : the data is still under embargo. Only accessible to experimental team members
* *
* */ * */
DoiData.prototype.getAccessibilityStatus = function( sessionDate, publiclyAccessibleYear ) { DoiData.prototype.getAccessibilityStatus = function (resourceType, sessionDate, publiclyAccessibleYear) {
if (resourceType) {
if (resourceType === CONSTANTS.ES_RESOURCE_TYPE) {
if (publiclyAccessibleYear && sessionDate) {
var publiclyAvailableDate = moment(publiclyAccessibleYear, "YYYY");
var now = moment();
if ( publiclyAccessibleYear && sessionDate ) { if (now > publiclyAvailableDate) {
var publiclyAvailableDate = moment( publiclyAccessibleYear, "YYYY" ); return "Open access";
var now = moment(); } else if (now <= publiclyAvailableDate) {
return "Restricted access";
if ( now > publiclyAvailableDate ) { }
}
} else if (resourceType === CONSTANTS.DC_RESOURCE_TYPE){
return "Open access"; return "Open access";
} else if ( now <= publiclyAvailableDate ) {
return "Restricted access";
} }
} }
console.log( "Failed to determine whether the accessibility of the DOI." ); console.log("Failed to determine whether the accessibility of the DOI.");
return "Accessibility status could not be determined"; return "Accessibility status could not be determined";
}; };
function DOIController(view) { function DOIController(view) {
var _this = this; var _this = this;
// doiServer = the server which provides doi details from a given doi name. // doiServer = the server which provides doi details from a given doi name.
//this.doiServer = "https://data.datacite.org/"; //this.doiServer = "https://data.datacite.org/";
this.doiServer = "https://api.test.datacite.org/" this.doiServer = "https://api.test.datacite.org/";
// 10.5072 is the test esrf doi prefix; // 10.5072 is the test esrf doi prefix;
// 10.15151 is the production esrf doi prefix; // 10.15151 is the production esrf doi prefix;
this.acceptedPrefix = [ "10.5072", "10.15151" ]; this.acceptedPrefix = ["10.5072", "10.15151"];
this.view = view; this.view = view;
this.experimentalReportController = new ExperimentalReportController(); this.experimentalReportController = new ExperimentalReportController();
this.experimentalReportController.onSuccess.attach(function(sender, data) { this.experimentalReportController.onSuccess.attach(function (sender, data) {
_this.view.renderExperimentalReportData(data); _this.view.renderExperimentalReportData(data);
}); });
this.experimentalReportController.onError.attach(function(sender, data) { this.experimentalReportController.onError.attach(function (sender, data) {
console.log("Error when retrieving fileList from SMIS."); console.log("Error when retrieving fileList from SMIS.");
_this.view.renderErrorForExperimentalReport(); _this.view.renderErrorForExperimentalReport();
}); });
} }
...@@ -28,91 +28,94 @@ function DOIController(view) { ...@@ -28,91 +28,94 @@ function DOIController(view) {
* fields when the doi does not exist. In this case the following code is * fields when the doi does not exist. In this case the following code is
* executed. Reloading the page is treated by .fail as it should be. * executed. Reloading the page is treated by .fail as it should be.
*/ */
DOIController.prototype.isValidDOIData = function(doiData) { DOIController.prototype.isValidDOIData = function (doiData) {
if (_.keysIn(doiData).length > 3) { if (_.keysIn(doiData).length > 3) {
return _.find(_.keysIn(doiData), function(value) { return _.find(_.keysIn(doiData), function (value) {
return value === "title"; return value === "title";
}).length > 0; }).length > 0;
} }
return false; return false;
}; };
DOIController.prototype.getData = function(doi) { DOIController.prototype.getData = function (doi) {
var _this = this; var _this = this;
this.view.setDOIInTopBanner(doi); this.view.setDOIInTopBanner(doi);
if (this.hasAcceptedPrefix(doi)) { if (this.hasAcceptedPrefix(doi)) {
$.ajax({ $.ajax({
headers : { headers: {
Accept : "application/vnd.datacite.datacite+json" Accept: "application/vnd.datacite.datacite+json"
}, },
type : "GET", type: "GET",
timeout : 15000, // triggers timeout when request pends longer than timeout: 15000, // triggers timeout when request pends longer than
// 5000ms // 5000ms
url : this.doiServer + doi, url: this.doiServer + doi,
beforeSend : function(xhr) { beforeSend: function (xhr) {
_this.view.setLoading("Retrieving data from Server"); _this.view.setLoading("Retrieving data from Server");
xhr.setRequestHeader ("Authorization", "Basic " + btoa("DATACITE.ESRF" + ":" + "datacyte1")); // to be removed as well as the parameter xhr.setRequestHeader("Authorization", "Basic " + btoa("DATACITE.ESRF" + ":" + "datacyte1")); // to be removed as well as the parameter
}, },
complete : function() { complete: function () {
_this.view.setLoading(false); _this.view.setLoading(false);
} }
}) })
.done(function(data) { .done(function (data) {
if (data) { if (data) {
// Test abnormal length of the json object // Test abnormal length of the json object
if (!_this.isValidDOIData(data)) { if (!_this.isValidDOIData(data)) {
_this.view.renderError("Not Found", _this.origin); _this.view.renderError("Not Found", _this.origin);
} else { } else {
var doiData = new DoiData(); var doiData = new DoiData();
doiData.title = data.title; doiData.title = data.title;
doiData.doi = data.doi.toUpperCase(); doiData.doi = data.doi.toUpperCase();
doiData.dataciteLink = _this.doiServer + doi; doiData.dataciteLink = _this.doiServer + doi;
doiData.publisher = data.publisher; doiData.publisher = data.publisher;
doiData.creator = data.creator; doiData.creator = data.creator;
var jsonExtractor = new JsonExtractor(); var jsonExtractor = new JsonExtractor();
doiData.mintingYear = jsonExtractor.getMintingYear(data); doiData.mintingYear = jsonExtractor.getMintingYear(data);
doiData.sessionDate = jsonExtractor.getSessionDate(data); doiData.sessionDate = jsonExtractor.getSessionDate(data);
doiData.publiclyAccessibleYear = data.publication_year; doiData.publiclyAccessibleYear = data.publication_year;
doiData.proposalType = jsonExtractor.getFieldFromSubject(data.subject, "Proposal Type Description"); doiData.proposalType = jsonExtractor.getFieldFromSubject(data.subject, "Proposal Type Description");
doiData.proposalNumber = jsonExtractor.getFieldFromSubject(data.subject, "Proposal"); doiData.proposalName = jsonExtractor.getFieldFromSubject(data.subject, "Proposal");
_this.experimentalReportController.requestFilenameList(doiData.proposalNumber); _this.experimentalReportController.requestFilenameList(doiData.proposalName);
doiData.beamline = jsonExtractor.getFieldFromSubject(data.subject, "instrument"); doiData.beamline = jsonExtractor.getFieldFromSubject(data.subject, "Instrument");
doiData.investigationId = jsonExtractor.extractInvestigationId(data); doiData.investigationId = jsonExtractor.extractInvestigationId(data);
doiData.accessibility = doiData.getAccessibilityStatus(doiData.sessionDate, doiData.publiclyAccessibleYear); doiData.resourceType = jsonExtractor.getResourceType(data);
doiData.accessMessage = _this.view.setDataAccessMessage(doiData); doiData.accessibility = doiData.getAccessibilityStatus(doiData.resourceType, doiData.sessionDate, doiData.publiclyAccessibleYear);
doiData.citation = _this.createCitation(data); doiData.accessMessage = _this.view.setDataAccessMessage(doiData);
doiData.resourceTypeGeneral = jsonExtractor.getResourceTypeGeneral(data); doiData.citation = _this.createCitation(data);
doiData.resourceType = jsonExtractor.getResourceType(data); doiData.resourceTypeGeneral = jsonExtractor.getResourceTypeGeneral(data);
// constants passed for tests in the templates
// Set the URL corresponding to the beamline name. doiData.DC_RESOURCE_TYPE = CONSTANTS.DC_RESOURCE_TYPE;
if (data.date_collected) { doiData.ES_RESOURCE_TYPE = CONSTANTS.ES_RESOURCE_TYPE;
var experimentalDate = moment(data.date_collected);
doiData.beamlineUrl = _this.getBeamlineUrl(doiData.beamline, experimentalDate); // Set the URL corresponding to the beamline name.
} else { if (data.date_collected) {
doiData.beamlineUrl = "noLink"; var experimentalDate = moment(data.date_collected);
} doiData.beamlineUrl = _this.getBeamlineUrl(doiData.beamline, experimentalDate);
} else {
// send to dust render doiData.beamlineUrl = "noLink";
}
_this.view.renderDOIData(doiData);
} // send to dust render
}
}).fail(function(jqXHR, textStatus, errorThrown) { _this.view.renderDOIData(doiData);
_this.view.renderError(jqXHR, errorThrown, _this.origin); }
_this.view.setLoading(false); }
}); }).fail(function (jqXHR, textStatus, errorThrown) {
_this.view.renderError(jqXHR, errorThrown, _this.origin);
} else { _this.view.setLoading(false);
_this.view.renderError("Bad Prefix", _this.origin); });
}
} else {
_this.view.renderError("Bad Prefix", _this.origin);
}
}; };
/** /**
...@@ -122,25 +125,25 @@ DOIController.prototype.getData = function(doi) { ...@@ -122,25 +125,25 @@ DOIController.prototype.getData = function(doi) {
* @return true if the prefix is an esrf prefix, false otherwise * @return true if the prefix is an esrf prefix, false otherwise
* *
*/ */
DOIController.prototype.hasAcceptedPrefix = function(doi) { DOIController.prototype.hasAcceptedPrefix = function (doi) {
var prefix = doi.split('/')[0]; var prefix = doi.split('/')[0];
return (_.findIndex(this.acceptedPrefix, function(o) { return (_.findIndex(this.acceptedPrefix, function (o) {
return prefix == o; return prefix == o;
}) != -1); }) != -1);
}; };
// Selects what will be displayed in the main id div // Selects what will be displayed in the main id div
DOIController.prototype.displayMainContent = function(doi) { DOIController.prototype.displayMainContent = function (doi) {
var isDOIProvided = false; var isDOIProvided = false;
if (this.origin === "welcome-page") { if (this.origin === "welcome-page") {
dust.render('welcome_tpl', {}, function(err, out) { dust.render('welcome_tpl', {}, function (err, out) {
$("#main").html(out); $("#main").html(out);
}); });
} }
if (this.origin === "index") { if (this.origin === "index") {
this.getData(doi); this.getData(doi);
} }
}; };
/** /**
...@@ -151,8 +154,8 @@ DOIController.prototype.displayMainContent = function(doi) { ...@@ -151,8 +154,8 @@ DOIController.prototype.displayMainContent = function(doi) {
* @param {string} * @param {string}
* origin The origin page this call is made from * origin The origin page this call is made from
*/ */
DOIController.prototype.setOrigin = function(origin) { DOIController.prototype.setOrigin = function (origin) {
this.origin = origin; this.origin = origin;
}; };
/** /**
...@@ -164,16 +167,16 @@ DOIController.prototype.setOrigin = function(origin) { ...@@ -164,16 +167,16 @@ DOIController.prototype.setOrigin = function(origin) {
* date The date the experiment was performed. * date The date the experiment was performed.
* @return the url of the beamLine, null if it is not found * @return the url of the beamLine, null if it is not found
*/ */
DOIController.prototype.getBeamlineUrl = function(beamline, date) { DOIController.prototype.getBeamlineUrl = function (beamline, date) {
for (var i = 0; i < BEAMLINEURL.length; i++) { for (var i = 0; i < BEAMLINEURL.length; i++) {
var startDate = moment(BEAMLINEURL[i].startDate); var startDate = moment(BEAMLINEURL[i].startDate);
var endDate = moment(BEAMLINEURL[i].endDate); var endDate = moment(BEAMLINEURL[i].endDate);
if (BEAMLINEURL[i].name.toLowerCase() === beamline.toLowerCase() && date >= startDate && date <= endDate) { if (BEAMLINEURL[i].name.toLowerCase() === beamline.toLowerCase() && date >= startDate && date <= endDate) {
return BEAMLINEURL[i].url; return BEAMLINEURL[i].url;
}
} }
}
return null; return null;
}; };
/** /**
...@@ -185,19 +188,19 @@ DOIController.prototype.getBeamlineUrl = function(beamline, date) { ...@@ -185,19 +188,19 @@ DOIController.prototype.getBeamlineUrl = function(beamline, date) {
* @return {string} * @return {string}
* citation : the citation to be displayed * citation : the citation to be displayed
*/ */
DOIController.prototype.createCitation = function(data) { DOIController.prototype.createCitation = function (data) {
// Authors sent in json can be in several format. The following call find // Authors sent in json can be in several format. The following call find
// first name and last name when possible. // first name and last name when possible.
var citation = new Citation(data); var citation = new Citation(data);
if (!citation.isBuildable) { if (!citation.isBuildable) {
return "The citation could not be generated."; return "The citation could not be generated.";
} else { } else {
var authorInCitation = citation.getAuthorsForCitation(data.creator); var authorInCitation = citation.getAuthorsForCitation(data.creator);
var doiRegistrationYear = moment(data.date_registered).year(); var doiRegistrationYear = moment(data.date_registered).year();
var fullCitation = authorInCitation + ' (' + doiRegistrationYear + '). ' + data.title + '. ' + data.publisher + ' (ESRF). ' + var fullCitation = authorInCitation + ' (' + doiRegistrationYear + '). ' + data.title + '. ' + data.publisher + ' (ESRF). ' +
" <a href='https://doi.esrf.fr/" + data.doi + "'> doi:" + data.doi.toUpperCase() + "</a>"; " <a href='https://doi.esrf.fr/" + data.doi + "'> doi:" + data.doi.toUpperCase() + "</a>";
return fullCitation; return fullCitation;
} }
}; };
...@@ -3,6 +3,7 @@ function DOIView() { ...@@ -3,6 +3,7 @@ function DOIView() {
this.mainPanelId = "main"; this.mainPanelId = "main";
this.reportPanelId = "expReport"; this.reportPanelId = "expReport";
this.badgePanelId = "badges"; this.badgePanelId = "badges";
this.metadataDivId = 'metadata';
this.reportExperimentFileNames = null; this.reportExperimentFileNames = null;
this.failedRecievingExpReport = false; this.failedRecievingExpReport = false;
...@@ -58,6 +59,7 @@ DOIView.prototype.renderDOIData = function (doiData) { ...@@ -58,6 +59,7 @@ DOIView.prototype.renderDOIData = function (doiData) {
$('#' + _this.mainPanelId).html(out); $('#' + _this.mainPanelId).html(out);
_this.isDOIAlreadyRendered = true; _this.isDOIAlreadyRendered = true;
_this.renderBadges(doiData); _this.renderBadges(doiData);
_this.renderMetadata(doiData);
/** /**
* If there are experimental reports already retrieved then render them after * If there are experimental reports already retrieved then render them after
* the rendering of the DOI * the rendering of the DOI
...@@ -131,9 +133,8 @@ DOIView.prototype.renderErrorForExperimentalReport = function () { ...@@ -131,9 +133,8 @@ DOIView.prototype.renderErrorForExperimentalReport = function () {
/** /**
* Render the badge template in the corresponding div * Render the badge template in the corresponding div
* * @param {object} data : the doiData object as constructed by the doiController
* */ */
DOIView.prototype.renderBadges = function (data) { DOIView.prototype.renderBadges = function (data) {
if (data) { if (data) {
var _this = this; var _this = this;
...@@ -143,10 +144,25 @@ DOIView.prototype.renderBadges = function (data) { ...@@ -143,10 +144,25 @@ DOIView.prototype.renderBadges = function (data) {
}, function (err, out) { }, function (err, out) {
$('#' + _this.badgePanelId).html(out); $('#' + _this.badgePanelId).html(out);
}); });
}
};
/**
* Render the badge template in the corresponding div
*/
DOIView.prototype.renderMetadata = function (data) {
if (data) {
var _this = this;
dust.render('metadata_tpl', {
data: data
}, function (err, out) {
$('#' + _this.metadataDivId).html(out);
});
} }
}; };
/** /**
* Set the message which is displayed just above the "Access data button" in experimental data box. * Set the message which is displayed just above the "Access data button" in experimental data box.
* *
......
...@@ -14,7 +14,7 @@ function JsonExtractor(json) { ...@@ -14,7 +14,7 @@ function JsonExtractor(json) {
JsonExtractor.prototype.extractInvestigationId = function (data) { JsonExtractor.prototype.extractInvestigationId = function (data) {
var regExp = RegExp(/\/\w*-*[Ee][Ss][Rr][Ff]-[Ee][Ss]-(\d+)$/); var regExp = RegExp(/\/\w*-*[Ee][Ss][Rr][Ff]-[Ee][Ss]-(\d+)$/);
//return regExp.exec( data.doi )[1]; //return regExp.exec( data.doi )[1];
return "investigationId" return "investigationId";
}; };
/** /**
...@@ -28,9 +28,12 @@ JsonExtractor.prototype.extractInvestigationId = function (data) { ...@@ -28,9 +28,12 @@ JsonExtractor.prototype.extractInvestigationId = function (data) {
JsonExtractor.prototype.getFieldFromSubject = function (subject, field) { JsonExtractor.prototype.getFieldFromSubject = function (subject, field) {
if (subject) { if (subject) {
if (subject[0]) { if (subject[0]) {
var regExp = new RegExp("^" + field, 'i');
for (var i = 0; i < subject[0].length; i++) { for (var i = 0; i < subject[0].length; i++) {
if (subject[0][i].subject_scheme === field) { if (regExp.test(subject[0][i].subject_scheme)) {
return _.split(subject[0][i].text, ','); if (subject[0][i].text) {
return _.split(subject[0][i].text, ',');
}
}