From 91881dc6f5909269b4e5aa878c2a13abdd67e0fe Mon Sep 17 00:00:00 2001 From: tworrall Date: Tue, 22 May 2012 20:27:32 +0000 Subject: [PATCH] NIHVIVO-3728 vivo components of publications management --- productMods/WEB-INF/web.xml | 9 ++ .../listViewConfig-authorInAuthorship.xml | 3 +- .../css/individual/individual-vivo.css | 8 +- .../freemarker/edit/forms/css/customForm.css | 27 +++- .../js/managePublicationsForIndividual.js | 85 ++++++++++++ .../forms/managePublicationsForIndividual.ftl | 56 ++++++++ ...gePublicationsForIndividualController.java | 121 ++++++++++++++++++ 7 files changed, 306 insertions(+), 3 deletions(-) create mode 100644 productMods/templates/freemarker/edit/forms/js/managePublicationsForIndividual.js create mode 100644 productMods/templates/freemarker/edit/forms/managePublicationsForIndividual.ftl create mode 100644 src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ManagePublicationsForIndividualController.java diff --git a/productMods/WEB-INF/web.xml b/productMods/WEB-INF/web.xml index 4e5e9d62..c8242fef 100644 --- a/productMods/WEB-INF/web.xml +++ b/productMods/WEB-INF/web.xml @@ -797,6 +797,15 @@ + + ManagePublicationsForIndividualController + edu.cornell.mannlib.vitro.webapp.controller.freemarker.generators.ManagePublicationsForIndividualController + + + ManagePublicationsForIndividualController + /managePublications + + ShowClassHierarchyController edu.cornell.mannlib.vitro.webapp.controller.freemarker.ShowClassHierarchyController diff --git a/productMods/config/listViewConfig-authorInAuthorship.xml b/productMods/config/listViewConfig-authorInAuthorship.xml index 0bada366..aae6099c 100644 --- a/productMods/config/listViewConfig-authorInAuthorship.xml +++ b/productMods/config/listViewConfig-authorInAuthorship.xml @@ -55,7 +55,8 @@ OPTIONAL { ?infoResource core:dateTimeValue ?dateTimeValue . ?dateTimeValue core:dateTime ?dateTime } - } + } + NOT EXISTS { ?authorship core:hideFromDisplay ?hideThis } FILTER ( bound(?infoResource) ) diff --git a/productMods/css/individual/individual-vivo.css b/productMods/css/individual/individual-vivo.css index 85ffb19e..3ba1472f 100644 --- a/productMods/css/individual/individual-vivo.css +++ b/productMods/css/individual/individual-vivo.css @@ -239,4 +239,10 @@ a.qrCloseLink { padding: 0.2em 0.4em; font-size: 0.8em; background: #f4f4f4; -} \ No newline at end of file +} +/* <---- Manage Prop Link, individual-properties.ftl -----*/ +a#managePropLink { + float:right;font-size:.8em; + padding-right:10px; + display:inline; +} diff --git a/productMods/templates/freemarker/edit/forms/css/customForm.css b/productMods/templates/freemarker/edit/forms/css/customForm.css index 19a63659..2fa138ad 100644 --- a/productMods/templates/freemarker/edit/forms/css/customForm.css +++ b/productMods/templates/freemarker/edit/forms/css/customForm.css @@ -121,4 +121,29 @@ fieldset.dateTime label { } fieldset.dateTime select { margin-top: 0; -} \ No newline at end of file +} +/* ---------------------------------- */ +/* ----- FOR MANAGE PUBLICATIONS ---- */ +/* ---------------------------------- */ +section#pubsContainer { + margin-top:-8px; + padding-left:25px; +} +section#pubsContainer ul { + padding-left:25px; + text-indent:-25px; +} +section#pubsContainer li { + margin-bottom:6px; + line-height:20px; +} +section#pubsContainer input { + margin-right:8px; +} + + + + + + + diff --git a/productMods/templates/freemarker/edit/forms/js/managePublicationsForIndividual.js b/productMods/templates/freemarker/edit/forms/js/managePublicationsForIndividual.js new file mode 100644 index 00000000..672c2dbe --- /dev/null +++ b/productMods/templates/freemarker/edit/forms/js/managePublicationsForIndividual.js @@ -0,0 +1,85 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +var managePublications = { + + /* *** 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.initPublicationData(); + + 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. + initPublicationData: function() { + $('.pubCheckbox').each(function(index) { + $(this).data(publicationData[index]); + }); + }, + + bindEventListeners: function() { + + $('.pubCheckbox').click(function() { + managePublications.processPublication(this); + //return false; + }); + + }, + + processPublication: function(publication) { + + var add = ""; + var retract = ""; + var n3String = "<" + $(publication).data('authorshipUri') + "> \"true\" ." ; + + if ( $(publication).is(':checked') ) { + add = n3String; + } + else { + retract = n3String; + } + + $.ajax({ + url: managePublications.processingUrl, + type: 'POST', + data: { + additions: add, + retractions: retract + }, + dataType: 'json', + context: publication, // context for callback + complete: function(request, status) { + + if (status === 'success') { + window.status = "The publication will has been successfully excluded from the profile page."; + + } else { + alert('Error processing request: the publication cannot be excluded from the profile page.'); + $(publication).removeAttr('checked'); + } + } + }); + }, + +}; + +$(document).ready(function() { + managePublications.onLoad(); +}); diff --git a/productMods/templates/freemarker/edit/forms/managePublicationsForIndividual.ftl b/productMods/templates/freemarker/edit/forms/managePublicationsForIndividual.ftl new file mode 100644 index 00000000..0268de81 --- /dev/null +++ b/productMods/templates/freemarker/edit/forms/managePublicationsForIndividual.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 Publications for ${firstName} ${lastName}

+<#else> +

Manage Publications for ${subjectName}

+ +

+Check those publications you want to exclude from the profile page. + +

+ + <#list allSubclasses as sub> +

${sub}s

+
+ <#assign pubs = publications[sub]> +
    + <#list pubs as pub> +
  • + checked />${pub.title} +
  • + + + +
+
+ + +
+

+ Return to profile page +

+ + + +${stylesheets.add('', + '')} + +${scripts.add('', + '', + '', + '')} + diff --git a/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ManagePublicationsForIndividualController.java b/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ManagePublicationsForIndividualController.java new file mode 100644 index 00000000..73213510 --- /dev/null +++ b/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ManagePublicationsForIndividualController.java @@ -0,0 +1,121 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ +package edu.cornell.mannlib.vitro.webapp.controller.freemarker.generators; + +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 ManagePublicationsForIndividualController extends FreemarkerHttpServlet { + + private static final Log log = LogFactory.getLog(ManagePublicationsForIndividualController.class.getName()); + private VClassDao vcDao = null; + private static final String TEMPLATE_NAME = "managePublicationsForIndividual.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>> publications = getPublications(subjectUri, vreq); + log.debug("publications = " + publications); + body.put("publications", publications); + 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 PUBLICATION_QUERY = "" + + "PREFIX core: \n" + + "PREFIX rdfs: \n" + + "PREFIX vitro: \n" + + "PREFIX afn: \n" + + "SELECT DISTINCT ?subclass ?authorship ?title ?pub ?hideThis WHERE { \n" + + " ?subject core:authorInAuthorship ?authorship . \n" + + " OPTIONAL { ?authorship core:linkedInformationResource ?pub . " + + " ?pub rdfs:label ?title } \n" + + " OPTIONAL { ?pub vitro:mostSpecificType ?subclass . \n" + + " ?subclass rdfs:subClassOf core:InformationResource } \n" + + " OPTIONAL { ?authorship core:hideFromDisplay ?hideThis } \n " + + "} ORDER BY ?subclass ?title"; + + + HashMap>> getPublications(String subjectUri, VitroRequest vreq) { + + String queryStr = QueryUtils.subUriForQueryVar(PUBLICATION_QUERY, "subject", subjectUri); + log.debug("queryStr = " + queryStr); + HashMap>> subclassToPublications = 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(!subclassToPublications.containsKey(subclass)) { + subclassToPublications.put(subclass, new ArrayList>()); //list of publication information + } + + List> publicationsList = subclassToPublications.get(subclass); + publicationsList.add(QueryUtils.querySolutionToStringValueMap(soln)); + } + } catch (Exception e) { + log.error(e, e); + } + + allSubclasses = new ArrayList(subclassToPublications.keySet()); + Collections.sort(allSubclasses); + return subclassToPublications; + } +} + +