Skip to content

Commit

Permalink
Add data curation
Browse files Browse the repository at this point in the history
  • Loading branch information
etorres committed Jan 10, 2016
1 parent e847973 commit c0d4ee3
Show file tree
Hide file tree
Showing 31 changed files with 1,799 additions and 49 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,76 @@ define([ 'app', 'tpl!apps/collection/pending/tpls/collection_pending', 'tpl!apps
return this;
}
})
},
{
name : 'status',
label : 'Status',
editable : false,
cell : Backgrid.Cell.extend({
render : function() {
this.$el.empty();
var rawValue = this.model.get(this.column.get('name'));
var formattedValue = this.formatter.fromRaw(rawValue, this.model);
if (formattedValue && typeof formattedValue === 'string') {
var status = '';
switch (formattedValue.trim().toUpperCase()) {
case 'NEW':
status = '<i class="fa fa-file-o fa-fw"></i> ' + formattedValue;
break;
case 'ASSIGNED':
status = '<i class="fa fa-user fa-fw"></i> ' + formattedValue;
break;
case 'ACCEPTED':
status = '<i class="fa fa-check fa-fw"></i> ' + formattedValue;
break;
case 'CLOSED':
status = '<i class="fa fa-archive fa-fw"></i> ' + formattedValue;
break;
case 'REOPENED':
status = 'fa-file-zip-o';
break;
default:
status = 'Unsubmitted';
break;
}
this.$el.append(status);
} else this.$el.append('<span class="label label-info">Unsubmitted</span>');
this.delegateEvents();
return this;
}
})
},
{
name : 'resolution',
label : 'Resolution',
editable : false,
cell : Backgrid.Cell.extend({
render : function() {
this.$el.empty();
var rawValue = this.model.get(this.column.get('name'));
var formattedValue = this.formatter.fromRaw(rawValue, this.model);
if (formattedValue && typeof formattedValue === 'string') {
var resolution = '';
switch (formattedValue.trim().toUpperCase()) {
case 'ACCEPTED':
resolution = '<span class="label label-success">' + formattedValue + '</span>';
break;
case 'INVALID':
resolution = '<span class="label label-danger">' + formattedValue + '</span>';
break;
case 'DUPLICATE':
resolution = '<span class="label label-warning">' + formattedValue + '</span>';
break;
default:
resolution = '';
break;
}
this.$el.append(resolution);
}
this.delegateEvents();
return this;
}
})
},
{
name : 'sample',
Expand Down Expand Up @@ -114,13 +184,33 @@ define([ 'app', 'tpl!apps/collection/pending/tpls/collection_pending', 'tpl!apps
var formattedValue = this.formatter.fromRaw(rawValue, this.model);
if (formattedValue && typeof formattedValue === 'string') {
this.$el.append('<a href="#" data-pending-share-seq_id="' + formattedValue
+ '" title="Share" class="text-muted"><i class="fa fa-share fa-fw"></i></a>');
+ '" title="Share" class="text-muted"><i class="fa fa-share-alt fa-fw"></i></a>');
}
this.delegateEvents();
return this;
}
})
},
{
name : 'id',
label : '',
editable : false,
sortable : false,
cell : Backgrid.Cell.extend({
render : function() {
this.$el.empty();
var rawValue = this.model.get(this.column.get('name'));
var formattedValue = this.formatter.fromRaw(rawValue, this.model);
if (formattedValue && typeof formattedValue === 'string') {
this.$el.append('<a href="#" data-pending-submit-seq_id="' + formattedValue
+ '" title="Submit" class="text-muted"><i class="fa fa-paper-plane fa-fw"></i></a>');
}
this.delegateEvents();
return this;
}
})
},{
},
{
name : 'id',
label : '',
editable : false,
Expand Down Expand Up @@ -244,6 +334,7 @@ define([ 'app', 'tpl!apps/collection/pending/tpls/collection_pending', 'tpl!apps
'dragend div.lvl-savable' : 'handleDragEnd',
'click a[data-pending-seq_id]' : 'showPendingSequenceRecord',
'click a[data-pending-share-seq_id]' : 'sharePendingSequenceRecord',
'click a[data-pending-submit-seq_id]' : 'submitPendingSequenceRecord',
'click a[data-pending-remove-seq_id]' : 'removePendingSequenceRecord'
},
deselectAll : function(e) {
Expand Down Expand Up @@ -333,6 +424,49 @@ define([ 'app', 'tpl!apps/collection/pending/tpls/collection_pending', 'tpl!apps
var itemId = target.is('i') ? target.parent('a').get(0).getAttribute('data-pending-share-seq_id') : target.attr('data-pending-share-seq_id');
this.trigger('pending:share:record', self.collection.data_source, itemId);
},
submitPendingSequenceRecord : function(e) {
e.preventDefault();
var self = this;
var target = $(e.target);
var itemId = target.is('i') ? target.parent('a').get(0).getAttribute('data-pending-submit-seq_id') : target.attr('data-pending-submit-seq_id');
var item = self.collection.get(itemId);
if (!item.get('status') || item.get('status') === 'CLOSED') {
require([ 'common/confirm' ], function(confirmDialog) {
confirmDialog('Confirm sumission', 'This action will start a evaluation process in order to include the selected record in the public collection. Continue?', function() {
item.set({ 'status' : !item.get('status') ? 'NEW' : 'REOPENED' });
pace.restart();
var jqxhr = $.ajax({
url : Lvl.config.get('service.url') + '/pending/' + self.data_source + '/~/' + item.get('id'),
type: 'PUT',
crossDomain : true,
contentType : 'application/json',
headers : Lvl.config.authorizationHeader(),
data : JSON.stringify(item)
}).always(function() {
pace.stop();
}).done(function(data, textStatus, request) {
if (200 === request.status || 204 === request.status) {
// self.collection.set([ item ]);
} else {
require([ 'common/alert' ], function(alertDialog) {
alertDialog('Error', 'The server response was not OK.');
});
}
}).fail(function(jqXHR, textStatus, errorThrown) {
require([ 'common/alert' ], function(alertDialog) {
alertDialog('Error', 'The record cannot be submitted.');
});
});
}, {
btn_text : 'Submit'
});
});
} else {
require([ 'common/alert' ], function(alertDialog) {
alertDialog('Error', 'The record cannot be resubmitted until is closed.');
});
}
},
removePendingSequenceRecord : function(e) {
e.preventDefault();
var self = this;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ define([ 'app' ], function(Lvl) {
};

/* Commands and events */
Lvl.commands.setHandler('curation:set:active', function(section) {
Lvl.commands.setHandler('curation:set:active', function(section, subsection) {
require([ 'apps/curation/layout/curation_layout_ctrl' ], function(LayoutController) {
CurationApp.currentSection = LayoutController.showLayout(section);
CurationApp.currentSection = LayoutController.showLayout(section, subsection);
});
});
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ define([ 'app', 'routefilter' ], function(Lvl) {
var Router = Backbone.Router.extend({
routes : {
'curation' : 'showCuration',
'curation/:section' : 'showCuration'
'curation/:section' : 'showCuration',
'curation/:section/:subsection' : 'showCuration'
},
before : function() {
if (!Lvl.config.isAuthenticated()) {
Expand All @@ -25,16 +26,17 @@ define([ 'app', 'routefilter' ], function(Lvl) {
});
return true;
},
showCuration : function(section) {
showCuration : function(section, subsection) {
section = (section || 'submitted_sequences').toLowerCase();
if (section === 'submitted_sequences') {
Lvl.navigate('curation/' + section, {
subsection = (subsection || 'sandflies').toLowerCase();
Lvl.navigate('curation/' + section + '/' + subsection, {
trigger : false,
replace : true
});
Lvl.execute('curation:set:active', section);
Lvl.execute('curation:set:active', section, subsection);
} else if (section === 'submitted_citations') {
Lvl.execute('curation:set:active', 'submitted_citations');
Lvl.execute('curation:set:active', section);
} else {
Lvl.navigate('not-found', {
trigger : true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ define([ 'app', 'apps/curation/layout/curation_layout_view' ], function(Lvl, Vie
Lvl.module('CurationApp.Layout', function(Layout, Lvl, Backbone, Marionette, $, _) {
'use strict';
Layout.Controller = {
showLayout : function(section) {
showLayout : function(section, id) {
var controller = function(SectionController) {
var tabLinks = Lvl.request('curation:navigation:entities');
var tabLinkToSelect = tabLinks.find(function(tabLink) {
Expand All @@ -18,7 +18,7 @@ define([ 'app', 'apps/curation/layout/curation_layout_view' ], function(Lvl, Vie
navigation : tabLinks
});
Lvl.mainRegion.show(view);
return SectionController.showSection();
return SectionController.showSection(id);
};
switch (section) {
case 'submitted_citations':
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<div id="lvl-floating-menu-toggle" style="display: none;">
<button type="button" class="btn btn-link hidden-xs" id="lvl-feature-tour-btn" title="Feature Tour"><i class="fa fa-play-circle"></i> Tour</button>
<button type="button" class="btn btn-default" id="lvl-toggle-toolbar-btn" title="Tools"><div class="lvl-toggle-menu-icon">&equiv;</div></button>
</div>

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
/**
* RequireJS module that defines the view: curation->submission_resolver.
*/

define([ 'app', 'tpl!apps/curation/submission_resolver/tpls/curation_submission_resolver', 'pace', 'backbone.oauth2', 'bootstrapvalidator', 'backbone.syphon' ],
function(Lvl, ResolverTpl, pace) {
Lvl.module('CurationApp.SubmissionResolver.View', function(View, Lvl, Backbone, Marionette, $, _) {
'use strict';
View.Content = Marionette.ItemView.extend({
template : ResolverTpl,
initialize : function(options) {
this.section = options.section;
this.collectionId = options.collectionId;
this.item = options.item;
},
events : {
'focus #lvlSubmissionResolutionForm select.form-control' : function(e) {
var form = $('#lvlSubmissionResolutionForm');
if (Boolean(form.attr('data-pristine') === 'true')) {
form.attr('data-pristine', 'false');
form.on('init.form.bv', function(e, data) {
data.bv.disableSubmitButtons(true);
}).bootstrapValidator({
submitButtons : 'button[type="submit"]',
fields : {
'selectResolution' : {
verbose : false,
validators : {
notEmpty : {
message : 'The resolution is required and cannot be empty'
}
}
}
}
}).on('success.field.bv', function(e, data) {
var isValid = data.bv.isValid();
data.bv.disableSubmitButtons(!isValid);
});
}
}, 'click #lvlSubmissionResolutionBtn' : function(e) {
e.preventDefault();
pace.restart();
$('#lvlSubmissionResolutionForm button[type="submit"]').attr('disabled', 'disabled');
$('#lvlSubmissionResolutionBtn').tooltip('hide');
var self = this, formData = Backbone.Syphon.serialize(this);
self.item.set({
status : 'CLOSED',
resolution : formData.selectResolution,
allocatedCollection : formData.inputCollection,
allocatedId : formData.inputItemId
});
var jqxhr = $.ajax({
url : Lvl.config.get('service.url') + '/pending/' + (self.collectionId ? self.collectionId : self.section) + '/~/' + self.item.get('id'),
type: 'PUT',
crossDomain : true,
contentType : 'application/json',
headers : Lvl.config.authorizationHeader(),
data : JSON.stringify(self.item)
}).always(function() {
pace.stop();
var form = self.$('#lvlSubmissionResolutionForm');
form[0].reset();
form.bootstrapValidator('resetForm', true);
form.bootstrapValidator('disableSubmitButtons', true);
}).done(function(data, textStatus, request) {
self.trigger('destroy');
if (200 === request.status || 204 === request.status) {
// TODO self.collection.set([ item ]);
} else {
require([ 'common/alert' ], function(alertDialog) {
alertDialog('Error', 'The server response was not OK.');
});
}
}).fail(function(jqXHR, textStatus, errorThrown) {
self.trigger('destroy');
require([ 'common/alert' ], function(alertDialog) {
alertDialog('Error', 'The submission cannot be resolved.');
});
});
}
},
onDestroy : function() {
pace.stop();
this.stopListening();
},
onRender : function() {
pace.start();
}
});
});
return Lvl.CurationApp.SubmissionResolver.View;
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">
<span aria-hidden="true">&times;</span><span class="sr-only">Close</span>
</button>
<h4 class="modal-title" id="myModalLabel">Resolve submission</h4>
</div>
<div class="modal-body">
<div class="row">
<div class="col-xs-12">
<h5>Submission resolution:</h5>
<form class="form-horizontal" id="lvlSubmissionResolutionForm" novalidate="novalidate" data-pristine="true">
<fieldset>
<div class="form-group">
<label for="selectResolution" class="col-lg-2 control-label">Select resolution:</label>
<div class="col-lg-10">
<select class="form-control" name="selectResolution" id="selectResolution">
<option value="" selected>Choose a resolution</option>
<option value="ACCEPTED">Accept the submission</option>
<option value="INVALID">Reject invalid submission</option>
<option value="DUPLICATE">Submission duplicates a previous record</option>
</select>
</div>
</div>
<div class="form-group">
<label for="inputCollection" class="col-lg-2 control-label">Assigned collection:</label>
<div class="col-lg-10">
<input type="text" class="form-control" id="inputCollection" name="inputCollection" placeholder="Collection where the submission was assigned">
</div>
</div>
<div class="form-group">
<label for="inputItemId" class="col-lg-2 control-label">Assigned Item Id:</label>
<div class="col-lg-10">
<input type="text" class="form-control" id="inputItemId" name="inputItemId" placeholder="Enter Id assigned to the item">
</div>
</div>
</fieldset>
<fieldset>
<div class="form-group">
<div class="col-lg-10 col-lg-offset-2">
<button type="submit" class="btn btn-primary" id="lvlSubmissionResolutionBtn" disabled="disabled">Resolve</button>
<span id="helpBlock" class="help-block">Check that all required fields are completed before submitting the data.</span>
</div>
</div>
</fieldset>
</form>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
</div>
</div>
</div>
Loading

0 comments on commit c0d4ee3

Please sign in to comment.