define(['underscore', 'jquery', 'backbone', 'models/metadata/eml211/EMLProject',
'models/metadata/eml211/EMLParty',
'text!themes/ess-dive/templates/metadata/project.html',
'json!/js/themes/ess-dive/data/projects.json'],
function (_, $, Backbone, EMLProject, EMLParty, Template, Projects) {
/***
* SubView for managing Funding Organizations
*
* @type {void|*}
*/
var EMLProjectSubView = Backbone.View.extend({
tagName: "div",
attributes: {
"data-category":"project"
},
events: {
"change input#new-project-value" : "handleAdd",
"autocompletechange input#new-project-value" : "handleAdd"
},
id: null,
template: _.template(Template),
projects: Projects,
/**
* Initialize the Sub View
* @param options
*/
initialize: function(options){
// Assign the member variables to this instance
this.parentModel = options.parentModel;
this.doeProjects = this.getDOEProjects()
},
/**
* Get the list of DOE contract numbers
* @returns {Array}
*/
getDOEProjects: function () {
var doeProjectsJSON = this.projects;
return _.mapObject(doeProjectsJSON, function(val, key){return key+" [PI: "+val.piFirstName+" "+ val.piLastName+"]";});
},
/**
* Render the template with the data
*
* @returns {EMLProjectSubView}
*/
render: function () {
// Render the template with the selected funding organizations
this.$el.html(this.template({
"project": this.getProject().toJSON(),
}
));
// Add the Funder Names for the autocomplete list
var input = this.$el.find("#new-project-value")[0];
$(input).autocomplete({
source: _.values(this.doeProjects)
});
// This is a Subview
this.delegateEvents();
return this;
},
/**
* Event on change. Update the model with the entered value
*
* @param e
*/
handleAdd: function(e) {
// Get the EML Project
var project = this.getProject();
// Get the project title from the form
var projectTitle = $(e.target).val().split(" [")[0];
project.set("title",projectTitle);
// Does this project exist in our lookup?
if (this.projects.hasOwnProperty(projectTitle)){
// Get the PI detail from there
var projectDetail = this.projects[projectTitle];
var piInstitutions = projectDetail.piInstitution.split("\n");
var piFirstNames = projectDetail.piFirstName.split("\n");
var piLastNames = projectDetail.piLastName.split("\n");
var piEmails = projectDetail.piEmail.split("\n");
var pis = [];
for (i=0; i<piFirstNames.length; i++) {
var pi = new EMLParty({
role: "principalInvestigator",
parentModel: this.parentModel,
type: "personnel",
organizationName: piInstitutions[i].trim(),
individualName: {givenName: piFirstNames[i].trim(), surName: piLastNames[i].trim()},
email: [piEmails[i].trim()]
});
pis.push(pi)
}
project.set("personnel", pis);
}
else
{
// Set the project name as the metadata provider
project.set("personnel", [new EMLParty({
role: "metadataProvider",
parentModel: this.parentModel,
type: "personnel",
organizationName:$(e.target).val()
})]);
}
// Remove the old project DOM otherwise title change
// will not take
project.set("objectDOM",null);
// Create a new EML Project with the updated DOM
this.parentModel.set("project",new EMLProject({
parentModel: this.parentModel,
objectDOM: project.updateDOM()
}));
this.parentModel.set("publisher", [new EMLParty({ parentModel:this.parentModel,
organizationName:projectTitle,
type:"publisher"})]);
//Re-render this view to update changes
this.render();
// Trigger a change on the entire package
MetacatUI.rootDataPackage.packageModel.set("changed", true);
},
/**
* Get the current project, if it exists, otherwise create a new one
* @returns {*}
*/
getProject: function(){
var project = this.parentModel.get("project");
if (!project)
return new EMLProject({ parentModel: this.parentModel});
return project;
}
});
return EMLProjectSubView;
}
);