\"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();
+});
diff --git a/productMods/templates/freemarker/edit/forms/manageGrantsForIndividual.ftl b/productMods/templates/freemarker/edit/forms/manageGrantsForIndividual.ftl
new file mode 100644
index 00000000..0127bf09
--- /dev/null
+++ b/productMods/templates/freemarker/edit/forms/manageGrantsForIndividual.ftl
@@ -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) />
+Manage Grants & Projects for ${firstName} ${lastName}
+<#else>
+Manage Grants & Projects for ${subjectName}
+#if>
+
+Check those grants and projects you want to exclude from the profile page.
+
+
+
+ <#list allSubclasses as sub>
+ ${sub}
+
+ <#assign grantList = grants[sub]>
+
+
+ #list>
+
+
+
+ Return to profile page
+
+
+
+
+${stylesheets.add('',
+ '')}
+
+${scripts.add('',
+ '',
+ '',
+ '')}
+
diff --git a/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ManageGrantsForIndividualController.java b/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ManageGrantsForIndividualController.java
new file mode 100644
index 00000000..291458dd
--- /dev/null
+++ b/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ManageGrantsForIndividualController.java
@@ -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 allSubclasses;
+
+ @Override
+ protected Actions requiredActions(VitroRequest vreq) {
+ return SimplePermission.DO_FRONT_END_EDITING.ACTIONS;
+ }
+
+ @Override
+ protected ResponseValues processRequest(VitroRequest vreq) {
+
+ Map body = new HashMap();
+
+ String subjectUri = vreq.getParameter("subjectUri");
+
+ body.put("subjectUri", subjectUri);
+
+ if (vreq.getAssertionsWebappDaoFactory() != null) {
+ vcDao = vreq.getAssertionsWebappDaoFactory().getVClassDao();
+ } else {
+ vcDao = vreq.getFullWebappDaoFactory().getVClassDao();
+ }
+
+ HashMap>> 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: \n"
+ + "PREFIX rdfs: \n"
+ + "PREFIX vitro: \n"
+ + "PREFIX afn: \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>> getGrants(String subjectUri, VitroRequest vreq) {
+
+ String queryStr = QueryUtils.subUriForQueryVar(GRANT_QUERY, "subject", subjectUri);
+ log.debug("queryStr = " + queryStr);
+ HashMap>> subclassToGrants = new HashMap>>();
+ 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