diff --git a/languages/example/themes/wilma/i18n/all_es.properties b/languages/example/themes/wilma/i18n/all_es.properties index 4c8a0c26..35ac2536 100644 --- a/languages/example/themes/wilma/i18n/all_es.properties +++ b/languages/example/themes/wilma/i18n/all_es.properties @@ -349,7 +349,7 @@ selected_conference = Conferencia Seleccionado years_participation_in = Años de participación en grant_entry_for = autorizará la entrada de -select_existing_pub_or_enter_new = Por favor seleccione una subvención actual en el campo de título o ingresar uno nuevo. +select_existing_pub_or_enter_new = Por favor seleccione una publicación actual en el campo de título o ingresar uno nuevo. unable_to_handle_grant_editing = Esta forma no es capaz de manejar la edición de esta subvención, ya que se asocia con múltiples individuos subvención. grant_type = concesión de la @@ -870,4 +870,6 @@ publication_date_for = fecha de publicación de create_publication_date = Crear fecha de publicación edit_publication_date = Editar fecha de publicación name_prefix = Prefijo de nombre -name_suffix = Sufijo de nombre \ No newline at end of file +name_suffix = Sufijo de nombre +administering_organization_for = administración de la organización para +missing_credential = falta credencial \ No newline at end of file diff --git a/productMods/config/listViewConfig-grantAdministeredBy.xml b/productMods/config/listViewConfig-grantAdministeredBy.xml new file mode 100644 index 00000000..d9a6c58d --- /dev/null +++ b/productMods/config/listViewConfig-grantAdministeredBy.xml @@ -0,0 +1,57 @@ + + + + + + + + PREFIX foaf: <http://xmlns.com/foaf/0.1/> + PREFIX core: <http://vivoweb.org/ontology/core#> + PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> + PREFIX obo: <http://purl.obolibrary.org/obo/> + + SELECT DISTINCT ?administratorRole + ?organization + ?organizationLabel + + WHERE { + ?subject ?property ?administratorRole . + ?administratorRole a core:AdministratorRole . + OPTIONAL { ?administratorRole obo:RO_0000052 ?organization . + ?organization a foaf:Organization . + ?organization obo:RO_0000053 ?administratorRole . + ?organization rdfs:label ?organizationLabel . + } + } ORDER BY ?organizationLabel + + + + PREFIX foaf: <http://xmlns.com/foaf/0.1/> + PREFIX core: <http://vivoweb.org/ontology/core#> + PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> + PREFIX obo: <http://purl.obolibrary.org/obo/> + + CONSTRUCT { + ?subject ?property ?administratorRole . + ?administratorRole a core:AdministratorRole . + ?administratorRole obo:RO_0000052 ?organization . + ?organization a foaf:Organization . + ?organization obo:RO_0000053 ?administratorRole . + ?organization rdfs:label ?organizationLabel . + } WHERE { + { + ?subject ?property ?administratorRole . + ?administratorRole a core:AdministratorRole . + } UNION { + ?subject ?property ?administratorRole . + ?administratorRole a core:AdministratorRole . + ?administratorRole obo:RO_0000052 ?organization . + ?organization a foaf:Organization . + ?organization obo:RO_0000053 ?administratorRole . + ?organization rdfs:label ?organizationLabel . + } + } + + + + diff --git a/productMods/templates/freemarker/body/partials/individual/propStatement-grantAdministeredBy.ftl b/productMods/templates/freemarker/body/partials/individual/propStatement-grantAdministeredBy.ftl new file mode 100644 index 00000000..08cd3d98 --- /dev/null +++ b/productMods/templates/freemarker/body/partials/individual/propStatement-grantAdministeredBy.ftl @@ -0,0 +1,26 @@ +<#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> + +<#-- + + This template must be self-contained and not rely on other variables set for the individual page, because it + is also used to generate the property statement during a deletion. + --> +<#import "lib-sequence.ftl" as s> +<#import "lib-datetime.ftl" as dt> +<@showAdministrator statement /> + +<#-- Use a macro to keep variable assignments local; otherwise the values carry over to the + next statement --> +<#macro showAdministrator statement> + + <#local linkedIndividual> + <#if statement.organization??> + ${statement.organizationLabel!""} + <#else> + ${i18n().missing_organization} + + + + ${linkedIndividual!} + + diff --git a/productMods/templates/freemarker/body/partials/individual/propStatement-issuedCredential.ftl b/productMods/templates/freemarker/body/partials/individual/propStatement-issuedCredential.ftl index 1b12358a..0f3c9398 100644 --- a/productMods/templates/freemarker/body/partials/individual/propStatement-issuedCredential.ftl +++ b/productMods/templates/freemarker/body/partials/individual/propStatement-issuedCredential.ftl @@ -17,7 +17,7 @@ <#if statement.credential??> ${statement.credentialLabel!statement.issuedCredentialLabel!statement.credentialLocal!} <#else> - ${statement.issuedCredentialLabel!"missing credential"} + ${statement.issuedCredentialLabel!"${i18n().missing_credential}"} diff --git a/productMods/templates/freemarker/edit/forms/grantAdministeredBy.ftl b/productMods/templates/freemarker/edit/forms/grantAdministeredBy.ftl new file mode 100644 index 00000000..dfba927f --- /dev/null +++ b/productMods/templates/freemarker/edit/forms/grantAdministeredBy.ftl @@ -0,0 +1,136 @@ +<#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> + +<#-- this is in request.subject.name --> + +<#-- leaving this edit/add mode code in for reference in case we decide we need it --> + +<#import "lib-vivo-form.ftl" as lvf> + +<#--Retrieve certain edit configuration information--> +<#if editConfiguration.objectUri?has_content> + <#assign editMode = "edit"> +<#else> + <#assign editMode = "add"> + + +<#--The blank sentinel indicates what value should be put in a URI when no autocomplete result has been selected. +If the blank value is non-null or non-empty, n3 editing for an existing object will remove the original relationship +if nothing is selected for that object--> +<#assign blankSentinel = "" /> +<#if editConfigurationConstants?has_content && editConfigurationConstants?keys?seq_contains("BLANK_SENTINEL")> + <#assign blankSentinel = editConfigurationConstants["BLANK_SENTINEL"] /> + + +<#--This flag is for clearing the label field on submission for an existing object being selected from autocomplete. +Set this flag on the input acUriReceiver where you would like this behavior to occur. --> +<#assign flagClearLabelForExisting = "flagClearLabelForExisting" /> + +<#assign htmlForElements = editConfiguration.pageData.htmlForElements /> + +<#--Retrieve variables needed--> +<#assign existingOrgValue = lvf.getFormFieldValue(editSubmission, editConfiguration, "existingOrganization") /> +<#assign orgLabelValue = lvf.getFormFieldValue(editSubmission, editConfiguration, "orgLabel") /> +<#assign orgLabelDisplayValue = lvf.getFormFieldValue(editSubmission, editConfiguration, "orgLabelDisplay") /> + +<#--If edit submission exists, then retrieve validation errors if they exist--> +<#if editSubmission?has_content && editSubmission.submissionExists = true && editSubmission.validationErrors?has_content> + <#assign submissionErrors = editSubmission.validationErrors/> + + +<#if editMode == "edit"> + <#assign titleVerb="${i18n().edit_capitalized}"> + <#assign submitButtonText="${i18n().save_changes}"> + <#assign disabledVal="disabled"> +<#else> +<#assign titleVerb="${i18n().create_capitalized}"> +<#assign submitButtonText="${i18n().create_entry}"> + <#assign disabledVal=""/> + + +<#assign requiredHint = " *" /> + +

${titleVerb} ${i18n().administering_organization_for} ${editConfiguration.subjectName}

+ +<#--Display error messages if any--> +<#if submissionErrors?has_content> + <#if orgLabelDisplayValue?has_content > + <#assign orgLabelValue = orgLabelDisplayValue /> + + + + + +<@lvf.unsupportedBrowser urls.base /> + +
+ +
+

+ + + +

+ +
+

+ + + (${i18n().verify_match_capitalized} ${i18n().or} + ${i18n().change_selection}) +

+ +
+ <#assign htmlForElements = editConfiguration.pageData.htmlForElements /> + + + +

+ ${i18n().or} + ${i18n().cancel_link} +

+ +

* ${i18n().required_fields}

+ + +
+ + + + + +${stylesheets.add('')} +${stylesheets.add('')} +${stylesheets.add('')} + +${scripts.add('', + '', + '', + '', + '', + '')} + + + diff --git a/productMods/templates/freemarker/edit/forms/personHasIssuedCredential.ftl b/productMods/templates/freemarker/edit/forms/personHasIssuedCredential.ftl index d542fd2d..b921ebcf 100644 --- a/productMods/templates/freemarker/edit/forms/personHasIssuedCredential.ftl +++ b/productMods/templates/freemarker/edit/forms/personHasIssuedCredential.ftl @@ -53,7 +53,7 @@ Set this flag on the input acUriReceiver where you would like this behavior to o <#assign requiredHint = " *" /> <#assign yearHint = "(${i18n().year_hint_format})" /> -

${titleVerb} ${i18n().credentials} ${editConfiguration.subjectName}

+

${titleVerb} ${i18n().credentials} ${i18n().for} ${editConfiguration.subjectName}

<#--Display error messages if any--> <#if submissionErrors?has_content> diff --git a/rdf/display/everytime/PropertyConfig.n3 b/rdf/display/everytime/PropertyConfig.n3 index 756165ea..c8d1ee17 100644 --- a/rdf/display/everytime/PropertyConfig.n3 +++ b/rdf/display/everytime/PropertyConfig.n3 @@ -411,6 +411,21 @@ local:issuedCredentialConfig a :ObjectPropertyDisplayConfig ; vitro:customEntryFormAnnot "edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.generators.PersonHasIssuedCredentialGenerator"^^ ; :propertyGroup . +local:grantAdministeredByContext a :ConfigContext ; + :hasConfiguration local:grantAdministeredByConfig ; + :configContextFor vivo:relates ; + :qualifiedByDomain vivo:Grant ; + :qualifiedBy vivo:AdministratorRole . + +local:grantAdministeredByConfig a :ObjectPropertyDisplayConfig ; + :listViewConfigFile "listViewConfig-grantAdministeredBy.xml"^^xsd:string ; + :displayName "grant administered by" ; + vitro:displayRankAnnot 1; + vitro:hiddenFromDisplayBelowRoleLevelAnnot role:public ; + vitro:prohibitedFromUpdateBelowRoleLevelAnnot role:public ; + vitro:customEntryFormAnnot "edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.generators.GrantAdministeredByGenerator"^^ ; + :propertyGroup . + ### vcard properties ### local:mailingAddressContext a :ConfigContext ; @@ -637,6 +652,104 @@ local:inEventSeriesConfig a :ObjectPropertyDisplayConfig ; vitro:prohibitedFromUpdateBelowRoleLevelAnnot role:public ; :propertyGroup . +local:eventLocationContext a :ConfigContext ; + :hasConfiguration local:eventLocationConfig ; + :configContextFor ; + :qualifiedByDomain ; + :qualifiedBy vivo:GeographicLocation . + +local:eventLocationConfig a :ObjectPropertyDisplayConfig ; + :listViewConfigFile "listViewConfig-default.xml"^^xsd:string ; + :displayName "has geographic location" ; + vitro:displayRankAnnot 2; + vitro:hiddenFromDisplayBelowRoleLevelAnnot role:public ; + vitro:prohibitedFromUpdateBelowRoleLevelAnnot role:public ; + :propertyGroup . + +local:courseOfferedByContext a :ConfigContext ; + :hasConfiguration local:courseOfferedByConfig ; + :configContextFor vivo:offeredBy ; + :qualifiedByDomain vivo:Course ; + :qualifiedBy . + +local:courseOfferedByConfig a :ObjectPropertyDisplayConfig ; + :listViewConfigFile "listViewConfig-default.xml"^^xsd:string ; + :displayName "offered by" ; + vitro:displayRankAnnot 2; + vitro:hiddenFromDisplayBelowRoleLevelAnnot role:public ; + vitro:prohibitedFromUpdateBelowRoleLevelAnnot role:public ; + :propertyGroup . + +local:orgOffersCourseContext a :ConfigContext ; + :hasConfiguration local:orgOffersCourseConfig ; + :configContextFor vivo:offers ; + :qualifiedByDomain ; + :qualifiedBy vivo:Course . + +local:orgOffersCourseConfig a :ObjectPropertyDisplayConfig ; + :listViewConfigFile "listViewConfig-default.xml"^^xsd:string ; + :displayName "offers course" ; + vitro:displayRankAnnot 2; + vitro:hiddenFromDisplayBelowRoleLevelAnnot role:public ; + vitro:prohibitedFromUpdateBelowRoleLevelAnnot role:public ; + :propertyGroup . + +local:collegeOffersDegreeContext a :ConfigContext ; + :hasConfiguration local:collegeOffersDegreeConfig ; + :configContextFor vivo:offers ; + :qualifiedByDomain vivo:College ; + :qualifiedBy vivo:AcademicDegree . + +local:collegeOffersDegreeConfig a :ObjectPropertyDisplayConfig ; + :listViewConfigFile "listViewConfig-default.xml"^^xsd:string ; + :displayName "offers degree" ; + vitro:displayRankAnnot 2; + vitro:hiddenFromDisplayBelowRoleLevelAnnot role:public ; + vitro:prohibitedFromUpdateBelowRoleLevelAnnot role:public ; + :propertyGroup . + +local:deptOffersDegreeContext a :ConfigContext ; + :hasConfiguration local:debtOffersDegreeConfig ; + :configContextFor vivo:offers ; + :qualifiedByDomain vivo:AcademicDepartment ; + :qualifiedBy vivo:AcademicDegree . + +local:deptOffersDegreeConfig a :ObjectPropertyDisplayConfig ; + :listViewConfigFile "listViewConfig-default.xml"^^xsd:string ; + :displayName "offers degree" ; + vitro:displayRankAnnot 2; + vitro:hiddenFromDisplayBelowRoleLevelAnnot role:public ; + vitro:prohibitedFromUpdateBelowRoleLevelAnnot role:public ; + :propertyGroup . + +local:uniOffersDegreeContext a :ConfigContext ; + :hasConfiguration local:uniOffersDegreeConfig ; + :configContextFor vivo:offers ; + :qualifiedByDomain vivo:University ; + :qualifiedBy vivo:AcademicDegree . + +local:uniOffersDegreeConfig a :ObjectPropertyDisplayConfig ; + :listViewConfigFile "listViewConfig-default.xml"^^xsd:string ; + :displayName "offers degree" ; + vitro:displayRankAnnot 2; + vitro:hiddenFromDisplayBelowRoleLevelAnnot role:public ; + vitro:prohibitedFromUpdateBelowRoleLevelAnnot role:public ; + :propertyGroup . + +local:grantAwardedByContext a :ConfigContext ; + :hasConfiguration local:grantAwardedByConfig ; + :configContextFor vivo:assignedBy ; + :qualifiedByDomain vivo:Grant ; + :qualifiedBy . + +local:grantAwardedByConfig a :ObjectPropertyDisplayConfig ; + :listViewConfigFile "listViewConfig-default.xml"^^xsd:string ; + :displayName "grant awarded by" ; + vitro:displayRankAnnot 2; + vitro:hiddenFromDisplayBelowRoleLevelAnnot role:public ; + vitro:prohibitedFromUpdateBelowRoleLevelAnnot role:public ; + :propertyGroup . + local:awardOrHonorReceiptsContext a :ConfigContext ; :hasConfiguration local:awardOrHonorReceiptsConfig ; :configContextFor ; diff --git a/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/GrantAdministeredByGenerator.java b/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/GrantAdministeredByGenerator.java new file mode 100644 index 00000000..8fea8fd4 --- /dev/null +++ b/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/GrantAdministeredByGenerator.java @@ -0,0 +1,123 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.generators; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpSession; + +import com.hp.hpl.jena.vocabulary.XSD; + +import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.AutocompleteRequiredInputValidator; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.DateTimeIntervalValidationVTwo; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.DateTimeWithPrecisionVTwo; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationVTwo; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.ChildVClassesWithParent; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.ConstantFieldOptions; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldOptions; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldVTwo; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.IndividualsViaVClassOptions; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.validators.AntiXssValidation; + +public class GrantAdministeredByGenerator extends VivoBaseGenerator implements + EditConfigurationGenerator { + + public GrantAdministeredByGenerator() {} + + @Override + public EditConfigurationVTwo getEditConfiguration(VitroRequest vreq, + HttpSession session) throws Exception { + + EditConfigurationVTwo conf = new EditConfigurationVTwo(); + + initBasics(conf, vreq); + initPropertyParameters(vreq, session, conf); + initObjectPropForm(conf, vreq); + + conf.setTemplate("grantAdministeredBy.ftl"); + + conf.setVarNameForSubject("grant"); + conf.setVarNameForPredicate("predicate"); + conf.setVarNameForObject("adminRole"); + + conf.setN3Required( Arrays.asList( n3ForNewAdminRole) ); + conf.setN3Optional( Arrays.asList( n3ForNewAdminOrganization, + n3ForExistingAdminOrganization ) ); + + conf.addNewResource("newOrganization", DEFAULT_NS_FOR_NEW_RESOURCE); + conf.addNewResource("adminRole", DEFAULT_NS_FOR_NEW_RESOURCE); + + conf.setUrisOnform(Arrays.asList("existingOrganization")); + conf.setLiteralsOnForm(Arrays.asList("orgLabel", "orgLabelDisplay" )); + + conf.addSparqlForExistingLiteral("orgLabel", orgLabelQuery); + conf.addSparqlForExistingUris("existingOrganization", existingOrganizationQuery); + + + conf.addField( new FieldVTwo(). // options will be added in browser by auto complete JS + setName("existingOrganization") + ); + + conf.addField( new FieldVTwo(). + setName("orgLabel"). + setRangeDatatypeUri(XSD.xstring.toString() ). + setValidators( list("datatype:" + XSD.xstring.toString()) ) + ); + + conf.addField( new FieldVTwo(). + setName("orgLabelDisplay"). + setRangeDatatypeUri(XSD.xstring.toString() ). + setValidators( list("datatype:" + XSD.xstring.toString())) + ); + + conf.addValidator(new AntiXssValidation()); + conf.addValidator(new AutocompleteRequiredInputValidator("existingOrganization", "orgLabel")); + +// addFormSpecificData(conf, vreq); + prepare(vreq, conf); + return conf; + } + + /* N3 assertions */ + + final static String n3ForNewAdminRole = + "@prefix vivo: <" + vivoCore + "> . \n\n" + + "?grant vivo:relates ?adminRole . \n" + + "?adminRole a vivo:AdministratorRole . \n" + + "?adminRole vivo:relatedBy ?grant . " ; + + final static String n3ForNewAdminOrganization = + "@prefix vivo: <" + vivoCore + "> . \n\n" + + "?adminRole ?newOrganization . \n" + + "?newOrganization a . \n" + + "?newOrganization ?adminRole . \n" + + "?newOrganization <"+ label + "> ?orgLabel ."; + + final static String n3ForExistingAdminOrganization = + "@prefix vivo: <" + vivoCore + "> . \n\n" + + "?adminRole ?existingOrganization . \n" + + "?existingOrganization a . \n" + + "?existingOrganization ?adminRole . " ; + + /* Queries for editing an existing entry */ + + final static String existingOrganizationQuery = + "PREFIX vivo: \n" + + "SELECT ?existingOrganization WHERE { \n" + + " ?adminRole ?existingOrganization . \n" + + " ?existingOrganization a . \n" + + "}"; + + final static String orgLabelQuery = + "PREFIX vivo: \n" + + "SELECT ?existingOrganizationLabel WHERE { \n" + + " ?adminRole ?existingOrganization . \n" + + " ?existingOrganization a . \n" + + " ?existingOrganization <" + label + "> ?existingOrganizationLabel . \n" + + "}"; + +} diff --git a/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/PersonHasIssuedCredentialGenerator.java b/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/PersonHasIssuedCredentialGenerator.java index 760b04c3..d98d625d 100644 --- a/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/PersonHasIssuedCredentialGenerator.java +++ b/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/PersonHasIssuedCredentialGenerator.java @@ -185,7 +185,7 @@ public class PersonHasIssuedCredentialGenerator extends VivoBaseGenerator implem "@prefix vivo: <" + vivoCore + "> . \n\n" + "?issuedCredential vivo:relates ?existingCredential . \n" + "?existingCredential a <" + credentialTypeClass + "> . \n" + - "?credential a ?credentialType . \n" + + "?existingCredential a ?credentialType . \n" + "?existingCredential vivo:relatedBy ?issuedCredential . " ; final static String n3ForYearCredentialed = diff --git a/themes/wilma/i18n/all.properties b/themes/wilma/i18n/all.properties index cbcf635e..158f250a 100644 --- a/themes/wilma/i18n/all.properties +++ b/themes/wilma/i18n/all.properties @@ -355,7 +355,7 @@ selected_conference = Selected Conference years_participation_in = Years of Participation in grant_entry_for = grant entry for -select_existing_pub_or_enter_new = Please select an existing grant in the Title field or enter a new one. +select_existing_pub_or_enter_new = Please select an existing publication in the Title field or enter a new one. unable_to_handle_grant_editing = This form is unable to handle the editing of this grant because it is associated with multiple grant individuals. grant_type = grant Type @@ -876,4 +876,6 @@ publication_date_for = publication date for create_publication_date = Create publication date edit_publication_date = Edit publication date name_prefix = Name Prefix -name_suffix = Name Suffix \ No newline at end of file +name_suffix = Name Suffix +administering_organization_for = administering organization for +missing_credential = missing credential \ No newline at end of file