/*global define */
define(['jquery', 'underscore', 'backbone', "common/Utilities", 'text!templates/registerCitation.html'],
function($, _, Backbone, Utilities, RegisterCitationTemplate) {
'use strict';
/**
* @class RegisterCitationView
* @classdesc A simple form for a user to input a DOI that cites or uses a dataset in DataONE.
* When the form is submitted, the citation is registered with the DataONE Metrics service.
* @classcategory Views
* @screenshot RegisterCitationView.png
* @extends Backbone.View
*/
var RegisterCitationView = Backbone.View.extend(
/** @lends RegisterCitationView.prototype */ {
id: 'citation-modal',
className: 'modal fade hide',
/**
* The URL to save the citation to
* @type {string}
*/
citationsUrl: MetacatUI.appModel.get("dataoneCitationsUrl"),
template: _.template(RegisterCitationTemplate),
successFooterTemplate: _.template("<button class='btn btn-indigo'" +
" data-dismiss='modal'" +
">Done</button>"),
/**
* The message to display the citation is successfully submitted
* @type {string}
*/
successMessage: 'Thank you! Your citation has been successfully submitted. ' +
'It may take up to 24 hours to see the citation on the dataset page.',
/**
* The message to display the citation has failed to submit
* @type {string}
*/
errorMessage: 'Sorry! We encountered an error while registering that citation. Please try ' +
'again or try emailing us the citation.',
events: {
'hidden' : 'teardown',
'click .btn-register-citation' : 'registerCitation',
"focusout #publication-identifier" : "validateDOI"
},
initialize: function(options) {
_.bindAll(this, 'show', 'teardown', 'render');
if((typeof options == "undefined")){
var options = {};
}
this.pid = options.pid;
},
/**
* Shows this view on the page.
*/
show: function() {
this.$el.modal('show');
},
/**
* Hides and removes this view from the page.
*/
teardown: function() {
this.$el.modal('hide');
this.$el.data('modal', null);
this.remove();
},
/**
* Renders the submission form and creates a Bootstrap modal for this view
*/
render: function() {
this.$el.html(this.template());
this.$el.modal({show:false}); // dont show modal on instantiation
return this;
},
/**
* Get inputs from the modal and sends it to the DataONE Metrics Service
*/
registerCitation: function() {
// check if the register button has been disabled
if (this.$(".btn-register-citation").is(".disabled")) {
return false;
}
// get the input values
var publicationIdentifier = this.$("#publication-identifier").val();
var citationType = this.$("#citationTypeCustomSelect").val();
var relation_type = null;
// If the user has not selected a valid
if (citationType != 0) {
relation_type = citationType == 1 ? "isCitedBy" : "isReferencedBy";
}
else {
relation_type = "isCitedBy";
}
// get the form data before replacing everything with the loading icon!
var formData = {};
var citationObject = {};
var citaitonRelatedIdentifiersObject = {}
// initializing the citation POSt object
formData["request_type"] = "dataset";
formData["submitter"] = MetacatUI.appUserModel.get("username");
formData["citations"] = new Array();
// form the citation object
citationObject["related_identifiers"] = new Array();
citationObject["source_id"] = publicationIdentifier;
// set the related identifiers
citaitonRelatedIdentifiersObject["identifier"] = this.pid;
citaitonRelatedIdentifiersObject["relation_type"] = relation_type;
// include all the required data
citationObject["related_identifiers"].push(citaitonRelatedIdentifiersObject);
formData["citations"].push(citationObject);
// ajax call to submit the given form and then render the results in the content area
var viewRef = this;
var requestSettings = {
type: "POST",
url: this.citationsUrl,
contentType: false,
processData: false,
data: JSON.stringify(formData),
dataType: "json",
success: function(data, textStatus, jqXHR) {
MetacatUI.appView.showAlert(viewRef.successMessage, "alert-success",
viewRef.$(".modal-body"), null,
{ includeEmail: false,
replaceContents: true
});
viewRef.$(".modal-footer").html(viewRef.successFooterTemplate());
},
error: function(){
MetacatUI.appView.showAlert(viewRef.errorMessage, "alert-error",
viewRef.$(".modal-body"), null,
{ includeEmail: true,
replaceContents: true
});
}
}
$.ajax(_.extend(requestSettings, MetacatUI.appUserModel.createAjaxSettings()));
},
/**
* Validates if the given input is a valid DOI string or not
* @since 2.15.0
* @return {undefined}
*/
validateDOI: function(){
var identifierInput = this.$("#publication-identifier").val();
if(!(Utilities.isValidDOI(identifierInput))){
//Show a warning that the user was trying to edit old content
MetacatUI.appView.showAlert({
message: "Please enter a valid DOI.",
classes: "alert-error",
container: this.$("#publication-identifier").parent(),
remove: true
});
this.$("#publication-identifier").addClass("register-citation-doi-validation");
this.$(".btn-register-citation").addClass("disabled")
}
else {
//Remove the validation error
this.$(".alert-container").remove();
this.$("#publication-identifier").removeClass("register-citation-doi-validation");
// If the Disabled class is active
if (this.$(".btn-register-citation").find(".disabled")) {
this.$(".btn-register-citation").removeClass("disabled");
}
}
}
});
return RegisterCitationView;
});