NIHVIVO-3768 grants management page
This commit is contained in:
parent
eac078a232
commit
2c294c38e9
7 changed files with 279 additions and 4 deletions
|
@ -796,6 +796,14 @@
|
||||||
<url-pattern>/listIndividuals</url-pattern>
|
<url-pattern>/listIndividuals</url-pattern>
|
||||||
</servlet-mapping>
|
</servlet-mapping>
|
||||||
|
|
||||||
|
<servlet>
|
||||||
|
<servlet-name>ManageGrantsForIndividualController</servlet-name>
|
||||||
|
<servlet-class>edu.cornell.mannlib.vitro.webapp.controller.freemarker.ManageGrantsForIndividualController</servlet-class>
|
||||||
|
</servlet>
|
||||||
|
<servlet-mapping>
|
||||||
|
<servlet-name>ManageGrantsForIndividualController</servlet-name>
|
||||||
|
<url-pattern>/manageGrants</url-pattern>
|
||||||
|
</servlet-mapping>
|
||||||
|
|
||||||
<servlet>
|
<servlet>
|
||||||
<servlet-name>ManagePublicationsForIndividualController</servlet-name>
|
<servlet-name>ManagePublicationsForIndividualController</servlet-name>
|
||||||
|
|
|
@ -55,6 +55,7 @@
|
||||||
?dateTimeEndValueGrant core:dateTime ?dateTimeEndGrant
|
?dateTimeEndValueGrant core:dateTime ?dateTimeEndGrant
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
NOT EXISTS { ?role core:hideFromDisplay ?hideThis }
|
||||||
<critical-data-required>
|
<critical-data-required>
|
||||||
FILTER ( bound(?activity) )
|
FILTER ( bound(?activity) )
|
||||||
</critical-data-required>
|
</critical-data-required>
|
||||||
|
|
|
@ -48,6 +48,7 @@
|
||||||
?dateTimeEndValue core:dateTime ?dateTimeEnd
|
?dateTimeEndValue core:dateTime ?dateTimeEnd
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
NOT EXISTS { ?role core:hideFromDisplay ?hideThis }
|
||||||
<critical-data-required>
|
<critical-data-required>
|
||||||
FILTER ( bound(?activity) )
|
FILTER ( bound(?activity) )
|
||||||
</critical-data-required>
|
</critical-data-required>
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
||||||
|
|
||||||
|
var manageGrants = {
|
||||||
|
|
||||||
|
/* *** Initial page setup *** */
|
||||||
|
|
||||||
|
onLoad: function() {
|
||||||
|
|
||||||
|
this.mixIn();
|
||||||
|
this.initPage();
|
||||||
|
},
|
||||||
|
|
||||||
|
mixIn: function() {
|
||||||
|
|
||||||
|
// Get the custom form data from the page
|
||||||
|
$.extend(this, customFormData);
|
||||||
|
},
|
||||||
|
|
||||||
|
// Initial page setup. Called only at page load.
|
||||||
|
initPage: function() {
|
||||||
|
|
||||||
|
this.initGrantData();
|
||||||
|
|
||||||
|
this.bindEventListeners();
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
// On page load, associate data with each list item. Then we don't
|
||||||
|
// have to keep retrieving data from or modifying the DOM as we manipulate the
|
||||||
|
// items.
|
||||||
|
initGrantData: function() {
|
||||||
|
$('.grantCheckbox').each(function(index) {
|
||||||
|
$(this).data(grantData[index]);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
bindEventListeners: function() {
|
||||||
|
|
||||||
|
$('.grantCheckbox').click(function() {
|
||||||
|
manageGrants.processGrant(this);
|
||||||
|
//return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
processGrant: function(grant) {
|
||||||
|
|
||||||
|
var add = "";
|
||||||
|
var retract = "";
|
||||||
|
var n3String = "<" + $(grant).data('roleUri') + "> <http://vivoweb.org/ontology/core#hideFromDisplay> \"true\" ." ;
|
||||||
|
|
||||||
|
if ( $(grant).is(':checked') ) {
|
||||||
|
add = n3String;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
retract = n3String;
|
||||||
|
}
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: manageGrants.processingUrl,
|
||||||
|
type: 'POST',
|
||||||
|
data: {
|
||||||
|
additions: add,
|
||||||
|
retractions: retract
|
||||||
|
},
|
||||||
|
dataType: 'json',
|
||||||
|
context: grant, // context for callback
|
||||||
|
complete: function(request, status) {
|
||||||
|
|
||||||
|
if (status === 'success') {
|
||||||
|
window.status = "The item has been successfully excluded from the profile page.";
|
||||||
|
|
||||||
|
} else {
|
||||||
|
alert('Error processing request: the item cannot be excluded from the profile page.');
|
||||||
|
$(grant).removeAttr('checked');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
$(document).ready(function() {
|
||||||
|
manageGrants.onLoad();
|
||||||
|
});
|
|
@ -0,0 +1,56 @@
|
||||||
|
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||||
|
|
||||||
|
<#-- Custom form for managing web pages for individuals -->
|
||||||
|
<#if subjectName?contains(",") >
|
||||||
|
<#assign lastName = subjectName?substring(0,subjectName?index_of(",")) />
|
||||||
|
<#assign firstName = subjectName?substring(subjectName?index_of(",") + 1) />
|
||||||
|
<h2>Manage Grants & Projects for ${firstName} ${lastName}</h2>
|
||||||
|
<#else>
|
||||||
|
<h2>Manage Grants & Projects for ${subjectName}</h2>
|
||||||
|
</#if>
|
||||||
|
<p style="margin-left:25px;margin-bottom:12px">
|
||||||
|
Check those grants and projects you want to exclude from the profile page.
|
||||||
|
<script type="text/javascript">
|
||||||
|
var grantData = [];
|
||||||
|
</script>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<#list allSubclasses as sub>
|
||||||
|
<h4>${sub}</h4>
|
||||||
|
<section id="pubsContainer" role="container">
|
||||||
|
<#assign grantList = grants[sub]>
|
||||||
|
<ul >
|
||||||
|
<#list grantList as grant>
|
||||||
|
<li>
|
||||||
|
<input type="checkbox" class="grantCheckbox" <#if grant.hideThis??>checked</#if> />${grant.label!}
|
||||||
|
</li>
|
||||||
|
<script type="text/javascript">
|
||||||
|
grantData.push({
|
||||||
|
"roleUri": "${grant.role!}"
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</#list>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</#list>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<p>
|
||||||
|
<a href="${urls.referringPage}#research" title="return to profile page">Return to profile page</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
var customFormData = {
|
||||||
|
processingUrl: '${urls.base}/edit/primitiveRdfEdit'
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
${stylesheets.add('<link rel="stylesheet" href="${urls.base}/templates/freemarker/edit/forms/css/customForm.css" />',
|
||||||
|
'<link rel="stylesheet" href="${urls.base}/js/jquery-ui/css/smoothness/jquery-ui-1.8.9.custom.css" />')}
|
||||||
|
|
||||||
|
${scripts.add('<script type="text/javascript" src="${urls.base}/js/utils.js"></script>',
|
||||||
|
'<script type="text/javascript" src="${urls.base}/js/jquery-ui/js/jquery-ui-1.8.9.custom.min.js"></script>',
|
||||||
|
'<script type="text/javascript" src="${urls.base}/js/customFormUtils.js"></script>',
|
||||||
|
'<script type="text/javascript" src="${urls.base}/templates/freemarker/edit/forms/js/manageGrantsForIndividual.js"></script>')}
|
||||||
|
|
|
@ -0,0 +1,124 @@
|
||||||
|
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.controller.freemarker;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.servlet.RequestDispatcher;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import javax.servlet.http.HttpSession;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
|
||||||
|
import com.hp.hpl.jena.query.QuerySolution;
|
||||||
|
import com.hp.hpl.jena.query.ResultSet;
|
||||||
|
import com.hp.hpl.jena.rdf.model.RDFNode;
|
||||||
|
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.beans.Individual;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.dao.jena.QueryUtils;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.dao.VClassDao;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
|
||||||
|
|
||||||
|
|
||||||
|
public class ManageGrantsForIndividualController extends FreemarkerHttpServlet {
|
||||||
|
|
||||||
|
private static final Log log = LogFactory.getLog(ManageGrantsForIndividualController.class.getName());
|
||||||
|
private VClassDao vcDao = null;
|
||||||
|
private static final String TEMPLATE_NAME = "manageGrantsForIndividual.ftl";
|
||||||
|
private List<String> allSubclasses;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Actions requiredActions(VitroRequest vreq) {
|
||||||
|
return SimplePermission.DO_FRONT_END_EDITING.ACTIONS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ResponseValues processRequest(VitroRequest vreq) {
|
||||||
|
|
||||||
|
Map<String, Object> body = new HashMap<String, Object>();
|
||||||
|
|
||||||
|
String subjectUri = vreq.getParameter("subjectUri");
|
||||||
|
|
||||||
|
body.put("subjectUri", subjectUri);
|
||||||
|
|
||||||
|
if (vreq.getAssertionsWebappDaoFactory() != null) {
|
||||||
|
vcDao = vreq.getAssertionsWebappDaoFactory().getVClassDao();
|
||||||
|
} else {
|
||||||
|
vcDao = vreq.getFullWebappDaoFactory().getVClassDao();
|
||||||
|
}
|
||||||
|
|
||||||
|
HashMap<String, List<Map<String,String>>> grants = getGrants(subjectUri, vreq);
|
||||||
|
log.debug("grants = " + grants);
|
||||||
|
body.put("grants", grants);
|
||||||
|
body.put("allSubclasses", allSubclasses);
|
||||||
|
|
||||||
|
Individual subject = vreq.getWebappDaoFactory().getIndividualDao().getIndividualByURI(subjectUri);
|
||||||
|
if( subject != null && subject.getName() != null ){
|
||||||
|
body.put("subjectName", subject.getName());
|
||||||
|
}else{
|
||||||
|
body.put("subjectName", null);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new TemplateResponseValues(TEMPLATE_NAME, body);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String GRANT_QUERY = ""
|
||||||
|
+ "PREFIX core: <http://vivoweb.org/ontology/core#> \n"
|
||||||
|
+ "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \n"
|
||||||
|
+ "PREFIX vitro: <http://vitro.mannlib.cornell.edu/ns/vitro/0.7#> \n"
|
||||||
|
+ "PREFIX afn: <http://jena.hpl.hp.com/ARQ/function#> \n"
|
||||||
|
+ "SELECT DISTINCT ?subclass ?role (str(?label2) as ?label) ?activity ?hideThis WHERE { \n"
|
||||||
|
+ " ?subject ?roleProp ?role . \n"
|
||||||
|
+ " ?roleProp rdfs:subPropertyOf core:hasResearcherRole . \n"
|
||||||
|
+ " ?role vitro:mostSpecificType ?subclass \n"
|
||||||
|
+ " OPTIONAL { ?role core:roleRealizedIn ?activity \n"
|
||||||
|
+ " OPTIONAL { ?activity rdfs:label ?label2 } \n"
|
||||||
|
+ " } \n"
|
||||||
|
+ " OPTIONAL { ?role core:roleContributesTo ?activity \n"
|
||||||
|
+ " OPTIONAL { ?activity rdfs:label ?label2 } \n"
|
||||||
|
+ " } \n"
|
||||||
|
+ " OPTIONAL { ?role core:hideFromDisplay ?hideThis } \n"
|
||||||
|
+ "} ORDER BY ?subclass ?label2";
|
||||||
|
|
||||||
|
|
||||||
|
HashMap<String, List<Map<String,String>>> getGrants(String subjectUri, VitroRequest vreq) {
|
||||||
|
|
||||||
|
String queryStr = QueryUtils.subUriForQueryVar(GRANT_QUERY, "subject", subjectUri);
|
||||||
|
log.debug("queryStr = " + queryStr);
|
||||||
|
HashMap<String, List<Map<String,String>>> subclassToGrants = new HashMap<String, List<Map<String,String>>>();
|
||||||
|
try {
|
||||||
|
ResultSet results = QueryUtils.getQueryResults(queryStr, vreq);
|
||||||
|
while (results.hasNext()) {
|
||||||
|
QuerySolution soln = results.nextSolution();
|
||||||
|
String subclassUri = soln.get("subclass").toString();
|
||||||
|
VClass vClass = (VClass) vcDao.getVClassByURI(subclassUri);
|
||||||
|
String subclass = ((vClass.getName() == null) ? subclassUri : vClass.getName());
|
||||||
|
if(!subclassToGrants.containsKey(subclass)) {
|
||||||
|
subclassToGrants.put(subclass, new ArrayList<Map<String,String>>()); //list of grant information
|
||||||
|
}
|
||||||
|
String label = soln.get("label").toString();
|
||||||
|
List<Map<String,String>> grantsList = subclassToGrants.get(subclass);
|
||||||
|
grantsList.add(QueryUtils.querySolutionToStringValueMap(soln));
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error(e, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
allSubclasses = new ArrayList<String>(subclassToGrants.keySet());
|
||||||
|
Collections.sort(allSubclasses);
|
||||||
|
return subclassToGrants;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -79,10 +79,10 @@ public class ManagePublicationsForIndividualController extends FreemarkerHttpSer
|
||||||
+ "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \n"
|
+ "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \n"
|
||||||
+ "PREFIX vitro: <http://vitro.mannlib.cornell.edu/ns/vitro/0.7#> \n"
|
+ "PREFIX vitro: <http://vitro.mannlib.cornell.edu/ns/vitro/0.7#> \n"
|
||||||
+ "PREFIX afn: <http://jena.hpl.hp.com/ARQ/function#> \n"
|
+ "PREFIX afn: <http://jena.hpl.hp.com/ARQ/function#> \n"
|
||||||
+ "SELECT DISTINCT ?subclass ?authorship ?title ?pub ?hideThis WHERE { \n"
|
+ "SELECT DISTINCT ?subclass ?authorship (str(?label) as ?title) ?pub ?hideThis WHERE { \n"
|
||||||
+ " ?subject core:authorInAuthorship ?authorship . \n"
|
+ " ?subject core:authorInAuthorship ?authorship . \n"
|
||||||
+ " OPTIONAL { ?authorship core:linkedInformationResource ?pub . "
|
+ " OPTIONAL { ?authorship core:linkedInformationResource ?pub . "
|
||||||
+ " ?pub rdfs:label ?title } \n"
|
+ " ?pub rdfs:label ?label } \n"
|
||||||
+ " OPTIONAL { ?pub vitro:mostSpecificType ?subclass . \n"
|
+ " OPTIONAL { ?pub vitro:mostSpecificType ?subclass . \n"
|
||||||
+ " ?subclass rdfs:subClassOf core:InformationResource } \n"
|
+ " ?subclass rdfs:subClassOf core:InformationResource } \n"
|
||||||
+ " OPTIONAL { ?authorship core:hideFromDisplay ?hideThis } \n "
|
+ " OPTIONAL { ?authorship core:hideFromDisplay ?hideThis } \n "
|
||||||
|
|
Loading…
Add table
Reference in a new issue