NIHVIVO-194 Changed Javascript customForm file and object name to customFormTwoStep, in preparation for creating the customFormOneStep required by educational background form.

This commit is contained in:
rjy7 2010-04-02 15:59:48 +00:00
parent 28416fc598
commit c37f96372c
5 changed files with 774 additions and 419 deletions

View file

@ -1,420 +1,7 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
/* ADD new property form
/* Step 1: Initial step, with choice to select existing or add new secondary individual.
* Displays:
* - On page load, unless there are validation error messages in the form
* - if there are validation error messages in the form, we are returning from a failed
* submission, and will go directly to view 2 to display the error messages.
* - After cancelling out of step 2
*
* Step 2: Main data entry step
* Displays:
* - On page load after an attempted submission that fails validation
* - After clicking button or add new link in view 1
* Has three view variations:
* - Select an existing secondary individual view
* - Add new secondary individual view
* - Combined view, if we are returning from a failed validation and can't determine
* which variant of view 2 we had submitted the form from. Contains the select
* existing element plus the add new link.
*
* EDIT existing property form
* Looks like add form step 2 except shows add new link
* Has same three view variants as step 2 add form
*
*/
/* Contains utility methods for all custom form types. */
var customForm = {
onLoad: function() {
this.initObjects();
this.adjustForJs();
this.initForm();
},
// On page load, create references within the customForm scope to DOM elements.
// NB These must be assigned after the elements have been loaded onto the page.
initObjects: function() {
this.form = $('#content form');
this.button = $('#submit');
this.requiredLegend = $('#requiredLegend');
// These may need to be changed to classes rather than ids, if there are
// multiple sets of divs to show/hide during the workflow.
this.addNewLink = $('#addNewLink');
this.existing = $('#existing');
this.addNew = $('#new');
this.entry = $('#entry');
this.existingOrNew = $('#existingOrNew');
this.cancel = this.form.find('.cancel');
this.requiredHints = this.form.find('.requiredHint');
// Read values used to control display
this.editType = $("input[name='editType']").val();
this.entryType = $("input[name='entryType']").val().capitalize();
this.secondaryType = $("input[name='secondaryType']").val().capitalize();
},
// On page load, make changes to the non-Javascript version for the Javascript version.
// These are features that will NOT CHANGE throughout the workflow of the Javascript version..
adjustForJs: function() {
var selectExistingLabel = $('#existing label');
selectExistingLabel.html(selectExistingLabel.html().replace(/Select (Existing )?/, ''));
this.existingOrNew.hide();
},
initForm: function() {
//Adding a new entry
if (this.editType == 'add') {
this.initAddForm();
// Editing an existing entry
} else {
this.initEditForm();
}
},
/***** ADD form *****/
// Set up add form on page load, or when returning to initial state from step 2
initAddForm: function() {
this.defaultButtonText = 'Create ' + this.entryType;
this.addNewButtonText = 'Create ' + this.secondaryType + ' & ' + this.entryType;
// If there are validation errors on the page, we're returning from
// an attempted submission that failed validation, and we need to go
// directly to step 2.
if (this.findValidationErrors()) {
this.doAddFormStep2();
} else {
this.doAddFormStep1();
}
},
// Reset add form to initial state (step 1) after cancelling out of step 2
resetAddFormToStep1: function() {
customForm.resetForm();
customForm.doAddFormStep1();
},
// Set up the add form for step 1
doAddFormStep1: function() {
customForm.existing.show();
customForm.addNewLink.show();
customForm.addNew.hide();
customForm.entry.hide();
customForm.requiredLegend.hide();
customForm.button.val('Continue');
// Assign event listeners
//this.button.unbind('click'); // RY *** Don't need this if we've done a reset
customForm.button.bind('click', function() {
customForm.doAddFormStep2SelectExisting();
return false;
});
//this.addNewLink.unbind('click'); // RY *** Don't need this if we've done a reset
customForm.addNewLink.bind('click', function() {
customForm.doAddFormStep2AddNew();
});
},
// Set up form when returning directly to step 2, such as after validation errors
// on the form submission.
doAddFormStep2: function() {
var view = customForm.getPreviousViewFromFormData();
switch (view) {
case "existing": { fn = this.doAddFormStep2SelectExisting; break; }
case "addNew": { fn = this.doAddFormStep2AddNew; break; }
default: { fn = this.doAddFormStep2Combined; break; }
}
fn.call();
},
// Most methods below use 'customForm' rather than 'this', because 'this' doesn't reference
// customForm when the method is called from an event listener. Only if the method never
// gets called from an event listener can we use the 'this' reference.
// Step 2: selecting an existing individual
doAddFormStep2SelectExisting: function() {
customForm.showSelectExistingFields();
customForm.doButtonForStep2(customForm.defaultButtonText);
customForm.doCancelForStep2();
},
// Step 2: adding a new individual
doAddFormStep2AddNew: function() {
customForm.showAddNewFields();
customForm.doButtonForStep2(customForm.addNewButtonText);
customForm.doCancelForStep2();
},
// Step 2: combined view, when we are returning from validation errors and we
// can't determine which view of the form we had been on.
doAddFormStep2Combined: function() {
customForm.showCombinedFields();
customForm.doAddNewLink(customForm.addNewButtonText);
customForm.doButtonForStep2(customForm.defaultButtonText);
customForm.doCancelForStep2();
},
/***** Edit form *****/
initEditForm: function() {
var view;
this.defaultButtonText = 'Save Changes';
this.addNewButtonText = 'Create ' + this.secondaryType + ' & Save Changes';
// If there are validation errors on the page, we're returning from
// an attempted submission that failed validation, and we need to go
// directly to step 2.
if (this.findValidationErrors()) {
view = this.getPreviousViewFromFormData();
switch (view) {
case "existing": { fn = this.doEditFormSelectExisting; break; }
case "addNew": { fn = this.doEditFormAddNew; break; }
default: { fn = this.doEditFormDefaultView; break; }
}
} else {
fn = this.doEditFormDefaultView;
}
fn.call(customForm);
},
doEditFormSelectExisting: function() {
this.showSelectExistingFields();
this.button.val(this.defaultButtonText);
},
doEditFormAddNew: function() {
this.showAddNewFields();
this.button.val(this.addNewButtonText);
},
doEditFormDefaultView: function() {
this.showCombinedFields();
this.button.val(this.defaultButtonText);
this.doAddNewLink(this.addNewButtonText);
},
/***** Utilities *****/
unbindEventListeners: function() {
customForm.cancel.unbind('click');
customForm.button.unbind('click');
customForm.addNewLink.unbind('click');
},
clearFormData: function() {
customForm.clearFields(customForm.form);
},
// Clear data from form elements in element el
clearFields: function(el) {
el.find(':input[type!="hidden"][type!="submit"][type!="button"]').val('');
// For now we can remove the error elements. Later we may include them in
// the markup, for customized positioning, in which case we will empty them
// but not remove them here. See findValidationErrors().
//this.form.find('.validationError').text('');
el.find('.validationError').remove();
},
// Add required hints to required fields in a list of elements.
// Use when the non-Javascript version should not show the required hint,
// because the field is not required in that version (e.g., it's one of two
// fields, where one of the two must be filled in but neither one is required).
// Arguments: action = 'add' or 'remove'
// Varargs: element(s)
toggleRequiredHints: function(action /* elements */) {
var labelText,
newLabelText,
requiredHintText = '<span class="requiredHint"> *</span>',
numArgs = arguments.length;
for (var i = 1; i < numArgs; i++) {
arguments[i].find('label.required').each(function() {
labelText = $(this).html();
newLabelText = action == 'add' ? labelText + requiredHintText :
labelText.replace(requiredHintText, '');
$(this).html(newLabelText);
});
}
},
showFields: function(el) {
el.show();
customForm.toggleRequiredHints('add', el);
},
hideFields: function(el) {
// Clear any input, so if we reshow the element the input won't still be there.
customForm.clearFields(el);
el.hide();
},
// Add event listener to the submit button in step 2
doButtonForStep2: function(text) {
customForm.button.unbind('click');
customForm.button.val(text);
},
// Add event listener to the cancel link in step 2
doCancelForStep2: function() {
customForm.cancel.unbind('click');
customForm.cancel.bind('click', function() {
customForm.resetAddFormToStep1();
return false;
});
},
doAddNewLink: function(buttonText) {
customForm.addNewLink.unbind('click');
customForm.addNewLink.bind('click', function() {
$(this).hide();
// Make sure to clear out what's in the existing select element,
// else it could be submitted even when hidden.
customForm.hideFields(customForm.existing);
customForm.showFields(customForm.addNew);
if (buttonText) {
customForm.button.val(buttonText);
}
});
},
// Return true iff there are validation errors on the form
findValidationErrors: function() {
return customForm.form.find('.validationError').length > 0;
// RY For now, we just need to look for the presence of the error elements.
// Later, however, we may generate empty error messages in the markup, for
// customized positioning, in which case we need to look for whether they have
// content. See clearFormData().
// var foundErrors = false,
// errors = this.form.find('.validationError'),
// numErrors = errors.length,
// i,
// error;
//
// for (i = 0; foundErrors == false && i < numErrors; i++) {
// error = errors[i];
// if (error.html() != '') {
// foundErrors = true;
// }
// }
//
// return foundErrors;
},
resetForm: function() {
// Clear all form data and error messages
customForm.clearFormData();
// Remove previously bound event handlers
customForm.unbindEventListeners();
// Remove required field hints
customForm.toggleRequiredHints('remove', customForm.addNew, customForm.existing);
},
showSelectExistingFields: function() {
customForm.showFields(customForm.existing);
customForm.addNewLink.hide();
customForm.addNew.hide();
customForm.showFieldsForAllViews();
},
showAddNewFields: function() {
customForm.existing.hide();
customForm.addNewLink.hide();
customForm.showFields(customForm.addNew);
customForm.showFieldsForAllViews();
},
// This version of the form shows both the existing select and add new link.
// Used when loading edit form, and when returning from failed submission
// of add form when we can't determine which view was being used to make
// the submission.
showCombinedFields: function() {
customForm.showFields(customForm.existing);
customForm.addNewLink.show();
customForm.addNew.hide();
customForm.showFieldsForAllViews();
},
// Show fields that appear in all views for add form step 2 and edit form
showFieldsForAllViews: function() {
customForm.entry.show();
customForm.requiredLegend.show();
},
// When returning to the add/edit form after a failed form submission (due to
// validation errors), attempt to determine which view the form was on when
// submitted, based on the form data present.
getPreviousViewFromFormData: function() {
// NB ':input' selector includes select elements
var existingInputs = this.existing.find(':input'),
existingInputsLen = existingInputs.length,
addNewInputs = this.addNew.find(':input'),
addNewInputsLen = addNewInputs.length,
input,
i,
view = null;
// If a value was entered in the addNew section, go back to the addNew view
for (i = 0; i < addNewInputsLen; i++) {
input = $(addNewInputs[i]);
if (input.val() != '') {
view = "addNew";
break;
}
}
// If a value was selected in the existing section, go back to the existing view
if (view === null) {
for (i = 0; i < existingInputsLen; i++) {
input = $(existingInputs[i]);
if (input.val() != '') {
view = "existing";
break;
}
}
}
return view;
}
};
$(document).ready(function(){
customForm.onLoad();
});
/* RY In a later iteration of the custom form Javascript, this will be the parent object, and all the custom form types
* are subclasses.
*/

View file

@ -0,0 +1,424 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
/* RY In a later iteration of the custom form Javascript, this will subclass the customForm object. */
/* Two-step custom form workflow:
*
* ADD new property form
* Step 1: Initial step, with choice to select existing or add new secondary individual.
* Displays:
* - On page load, unless there are validation error messages in the form
* - if there are validation error messages in the form, we are returning from a failed
* submission, and will go directly to view 2 to display the error messages.
* - After cancelling out of step 2
*
* Step 2: Main data entry step
* Displays:
* - On page load after an attempted submission that fails validation
* - After clicking button or add new link in view 1
* Has three view variations:
* - Select an existing secondary individual view
* - Add new secondary individual view
* - Combined view, if we are returning from a failed validation and can't determine
* which variant of view 2 we had submitted the form from. Contains the select
* existing element plus the add new link.
*
* EDIT existing property form
* Looks like add form step 2 except shows add new link
* Has same three view variants as step 2 add form
*
*/
var customFormTwoStep = {
onLoad: function() {
this.initObjects();
this.adjustForJs();
this.initForm();
},
// On page load, create references within the customFormTwoStep scope to DOM elements.
// NB These must be assigned after the elements have been loaded onto the page.
initObjects: function() {
this.form = $('#content form');
this.button = $('#submit');
this.requiredLegend = $('#requiredLegend');
// These may need to be changed to classes rather than ids, if there are
// multiple sets of divs to show/hide during the workflow.
this.addNewLink = $('#addNewLink');
this.existing = $('#existing');
this.addNew = $('#new');
this.entry = $('#entry');
this.existingOrNew = $('#existingOrNew');
this.cancel = this.form.find('.cancel');
this.requiredHints = this.form.find('.requiredHint');
// Read values used to control display
this.editType = $("input[name='editType']").val();
this.entryType = $("input[name='entryType']").val().capitalize();
this.secondaryType = $("input[name='secondaryType']").val().capitalize();
},
// On page load, make changes to the non-Javascript version for the Javascript version.
// These are features that will NOT CHANGE throughout the workflow of the Javascript version..
adjustForJs: function() {
var selectExistingLabel = $('#existing label');
selectExistingLabel.html(selectExistingLabel.html().replace(/Select (Existing )?/, ''));
this.existingOrNew.hide();
},
initForm: function() {
//Adding a new entry
if (this.editType == 'add') {
this.initAddForm();
// Editing an existing entry
} else {
this.initEditForm();
}
},
/***** ADD form *****/
// Set up add form on page load, or when returning to initial state from step 2
initAddForm: function() {
this.defaultButtonText = 'Create ' + this.entryType;
this.addNewButtonText = 'Create ' + this.secondaryType + ' & ' + this.entryType;
// If there are validation errors on the page, we're returning from
// an attempted submission that failed validation, and we need to go
// directly to step 2.
if (this.findValidationErrors()) {
this.doAddFormStep2();
} else {
this.doAddFormStep1();
}
},
// Reset add form to initial state (step 1) after cancelling out of step 2
resetAddFormToStep1: function() {
customFormTwoStep.resetForm();
customFormTwoStep.doAddFormStep1();
},
// Set up the add form for step 1
doAddFormStep1: function() {
customFormTwoStep.existing.show();
customFormTwoStep.addNewLink.show();
customFormTwoStep.addNew.hide();
customFormTwoStep.entry.hide();
customFormTwoStep.requiredLegend.hide();
customFormTwoStep.button.val('Continue');
// Assign event listeners
//this.button.unbind('click'); // RY *** Don't need this if we've done a reset
customFormTwoStep.button.bind('click', function() {
customFormTwoStep.doAddFormStep2SelectExisting();
return false;
});
//this.addNewLink.unbind('click'); // RY *** Don't need this if we've done a reset
customFormTwoStep.addNewLink.bind('click', function() {
customFormTwoStep.doAddFormStep2AddNew();
});
},
// Set up form when returning directly to step 2, such as after validation errors
// on the form submission.
doAddFormStep2: function() {
var view = customFormTwoStep.getPreviousViewFromFormData();
switch (view) {
case "existing": { fn = this.doAddFormStep2SelectExisting; break; }
case "addNew": { fn = this.doAddFormStep2AddNew; break; }
default: { fn = this.doAddFormStep2Combined; break; }
}
fn.call();
},
// Most methods below use 'customFormTwoStep' rather than 'this', because 'this' doesn't reference
// customFormTwoStep when the method is called from an event listener. Only if the method never
// gets called from an event listener can we use the 'this' reference.
// Step 2: selecting an existing individual
doAddFormStep2SelectExisting: function() {
customFormTwoStep.showSelectExistingFields();
customFormTwoStep.doButtonForStep2(customFormTwoStep.defaultButtonText);
customFormTwoStep.doCancelForStep2();
},
// Step 2: adding a new individual
doAddFormStep2AddNew: function() {
customFormTwoStep.showAddNewFields();
customFormTwoStep.doButtonForStep2(customFormTwoStep.addNewButtonText);
customFormTwoStep.doCancelForStep2();
},
// Step 2: combined view, when we are returning from validation errors and we
// can't determine which view of the form we had been on.
doAddFormStep2Combined: function() {
customFormTwoStep.showCombinedFields();
customFormTwoStep.doAddNewLink(customFormTwoStep.addNewButtonText);
customFormTwoStep.doButtonForStep2(customFormTwoStep.defaultButtonText);
customFormTwoStep.doCancelForStep2();
},
/***** Edit form *****/
initEditForm: function() {
var view;
this.defaultButtonText = 'Save Changes';
this.addNewButtonText = 'Create ' + this.secondaryType + ' & Save Changes';
// If there are validation errors on the page, we're returning from
// an attempted submission that failed validation, and we need to go
// directly to step 2.
if (this.findValidationErrors()) {
view = this.getPreviousViewFromFormData();
switch (view) {
case "existing": { fn = this.doEditFormSelectExisting; break; }
case "addNew": { fn = this.doEditFormAddNew; break; }
default: { fn = this.doEditFormDefaultView; break; }
}
} else {
fn = this.doEditFormDefaultView;
}
fn.call(customFormTwoStep);
},
doEditFormSelectExisting: function() {
this.showSelectExistingFields();
this.button.val(this.defaultButtonText);
},
doEditFormAddNew: function() {
this.showAddNewFields();
this.button.val(this.addNewButtonText);
},
doEditFormDefaultView: function() {
this.showCombinedFields();
this.button.val(this.defaultButtonText);
this.doAddNewLink(this.addNewButtonText);
},
/***** Utilities *****/
unbindEventListeners: function() {
customFormTwoStep.cancel.unbind('click');
customFormTwoStep.button.unbind('click');
customFormTwoStep.addNewLink.unbind('click');
},
clearFormData: function() {
customFormTwoStep.clearFields(customFormTwoStep.form);
},
// Clear data from form elements in element el
clearFields: function(el) {
el.find(':input[type!="hidden"][type!="submit"][type!="button"]').val('');
// For now we can remove the error elements. Later we may include them in
// the markup, for customized positioning, in which case we will empty them
// but not remove them here. See findValidationErrors().
//this.form.find('.validationError').text('');
el.find('.validationError').remove();
},
// Add required hints to required fields in a list of elements.
// Use when the non-Javascript version should not show the required hint,
// because the field is not required in that version (e.g., it's one of two
// fields, where one of the two must be filled in but neither one is required).
// Arguments: action = 'add' or 'remove'
// Varargs: element(s)
toggleRequiredHints: function(action /* elements */) {
var labelText,
newLabelText,
requiredHintText = '<span class="requiredHint"> *</span>',
numArgs = arguments.length;
for (var i = 1; i < numArgs; i++) {
arguments[i].find('label.required').each(function() {
labelText = $(this).html();
newLabelText = action == 'add' ? labelText + requiredHintText :
labelText.replace(requiredHintText, '');
$(this).html(newLabelText);
});
}
},
showFields: function(el) {
el.show();
customFormTwoStep.toggleRequiredHints('add', el);
},
hideFields: function(el) {
// Clear any input, so if we reshow the element the input won't still be there.
customFormTwoStep.clearFields(el);
el.hide();
},
// Add event listener to the submit button in step 2
doButtonForStep2: function(text) {
customFormTwoStep.button.unbind('click');
customFormTwoStep.button.val(text);
},
// Add event listener to the cancel link in step 2
doCancelForStep2: function() {
customFormTwoStep.cancel.unbind('click');
customFormTwoStep.cancel.bind('click', function() {
customFormTwoStep.resetAddFormToStep1();
return false;
});
},
doAddNewLink: function(buttonText) {
customFormTwoStep.addNewLink.unbind('click');
customFormTwoStep.addNewLink.bind('click', function() {
$(this).hide();
// Make sure to clear out what's in the existing select element,
// else it could be submitted even when hidden.
customFormTwoStep.hideFields(customFormTwoStep.existing);
customFormTwoStep.showFields(customFormTwoStep.addNew);
if (buttonText) {
customFormTwoStep.button.val(buttonText);
}
});
},
// Return true iff there are validation errors on the form
findValidationErrors: function() {
return customFormTwoStep.form.find('.validationError').length > 0;
// RY For now, we just need to look for the presence of the error elements.
// Later, however, we may generate empty error messages in the markup, for
// customized positioning, in which case we need to look for whether they have
// content. See clearFormData().
// var foundErrors = false,
// errors = this.form.find('.validationError'),
// numErrors = errors.length,
// i,
// error;
//
// for (i = 0; foundErrors == false && i < numErrors; i++) {
// error = errors[i];
// if (error.html() != '') {
// foundErrors = true;
// }
// }
//
// return foundErrors;
},
resetForm: function() {
// Clear all form data and error messages
customFormTwoStep.clearFormData();
// Remove previously bound event handlers
customFormTwoStep.unbindEventListeners();
// Remove required field hints
customFormTwoStep.toggleRequiredHints('remove', customFormTwoStep.addNew, customFormTwoStep.existing);
},
showSelectExistingFields: function() {
customFormTwoStep.showFields(customFormTwoStep.existing);
customFormTwoStep.addNewLink.hide();
customFormTwoStep.addNew.hide();
customFormTwoStep.showFieldsForAllViews();
},
showAddNewFields: function() {
customFormTwoStep.existing.hide();
customFormTwoStep.addNewLink.hide();
customFormTwoStep.showFields(customFormTwoStep.addNew);
customFormTwoStep.showFieldsForAllViews();
},
// This version of the form shows both the existing select and add new link.
// Used when loading edit form, and when returning from failed submission
// of add form when we can't determine which view was being used to make
// the submission.
showCombinedFields: function() {
customFormTwoStep.showFields(customFormTwoStep.existing);
customFormTwoStep.addNewLink.show();
customFormTwoStep.addNew.hide();
customFormTwoStep.showFieldsForAllViews();
},
// Show fields that appear in all views for add form step 2 and edit form
showFieldsForAllViews: function() {
customFormTwoStep.entry.show();
customFormTwoStep.requiredLegend.show();
},
// When returning to the add/edit form after a failed form submission (due to
// validation errors), attempt to determine which view the form was on when
// submitted, based on the form data present.
getPreviousViewFromFormData: function() {
// NB ':input' selector includes select elements
var existingInputs = this.existing.find(':input'),
existingInputsLen = existingInputs.length,
addNewInputs = this.addNew.find(':input'),
addNewInputsLen = addNewInputs.length,
input,
i,
view = null;
// If a value was entered in the addNew section, go back to the addNew view
for (i = 0; i < addNewInputsLen; i++) {
input = $(addNewInputs[i]);
if (input.val() != '') {
view = "addNew";
break;
}
}
// If a value was selected in the existing section, go back to the existing view
if (view === null) {
for (i = 0; i < existingInputsLen; i++) {
input = $(existingInputs[i]);
if (input.val() != '') {
view = "existing";
break;
}
}
}
return view;
}
};
$(document).ready(function(){
customFormTwoStep.onLoad();
});

View file

@ -0,0 +1,344 @@
<%-- $This file is distributed under the terms of the license in /doc/license.txt$ --%>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Arrays" %>
<%@ page import="com.hp.hpl.jena.rdf.model.Literal"%>
<%@ page import="com.hp.hpl.jena.rdf.model.Model"%>
<%@ page import="com.hp.hpl.jena.vocabulary.XSD" %>
<%@ page import="edu.cornell.mannlib.vitro.webapp.beans.Individual"%>
<%@ page import="edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary"%>
<%@ page import="edu.cornell.mannlib.vitro.webapp.edit.n3editing.EditConfiguration"%>
<%@ page import="edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory"%>
<%@ page import="edu.cornell.mannlib.vitro.webapp.controller.VitroRequest"%>
<%@ page import="edu.cornell.mannlib.vitro.webapp.web.MiscWebUtils"%>
<%@ page import="org.apache.commons.logging.Log" %>
<%@ page import="org.apache.commons.logging.LogFactory" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
<%@ taglib prefix="v" uri="http://vitro.mannlib.cornell.edu/vitro/tags" %>
<%!
public static Log log = LogFactory.getLog("edu.cornell.mannlib.vitro.webapp.jsp.edit.forms.personHasEducationalBackground.jsp");
%>
<%
VitroRequest vreq = new VitroRequest(request);
WebappDaoFactory wdf = vreq.getWebappDaoFactory();
vreq.setAttribute("defaultNamespace", ""); //empty string triggers default new URI behavior
String flagURI = null;
if (vreq.getAppBean().isFlag1Active()) {
flagURI = VitroVocabulary.vitroURI+"Flag1Value"+vreq.getPortal().getPortalId()+"Thing";
} else {
flagURI = wdf.getVClassDao().getTopConcept().getURI(); // fall back to owl:Thing if not portal filtering
}
vreq.setAttribute("flagURI",flagURI);
request.setAttribute("stringDatatypeUriJson", MiscWebUtils.escape(XSD.xstring.toString()));
request.setAttribute("gYearDatatypeUriJson", MiscWebUtils.escape(XSD.gYear.toString()));
%>
<c:set var="vivoCore" value="http://vivoweb.org/ontology/core#" />
<c:set var="rdf" value="<%= VitroVocabulary.RDF %>" />
<c:set var="rdfs" value="<%= VitroVocabulary.RDFS %>" />
<c:set var="label" value="${rdfs}label" />
<c:set var="type" value="${rdf}type" />
<c:set var="positionClass" value="${vivoCore}Position" />
<c:set var="orgClass" value="http://xmlns.com/foaf/0.1/Organization" />
<%-- Then enter a SPARQL query for each field, by convention concatenating the field id with "Existing"
to convey that the expression is used to retrieve any existing value for the field in an existing individual.
Each of these must then be referenced in the sparqlForExistingLiterals section of the JSON block below
and in the literalsOnForm --%>
<c:set var="titlePred" value="${vivoCore}titleOrRole" />
<v:jsonset var="titleExisting" >
SELECT ?titleExisting WHERE {
?positionUri <${titlePred}> ?titleExisting }
</v:jsonset>
<%-- Pair the "existing" query with the skeleton of what will be asserted for a new statement involving this field.
The actual assertion inserted in the model will be created via string substitution into the ? variables.
NOTE the pattern of punctuation (a period after the prefix URI and after the ?field) --%>
<v:jsonset var="titleAssertion" >
?positionUri <${titlePred}> ?title .
?positionUri <${label}> ?title.
</v:jsonset>
<c:set var="startYearPred" value="${vivoCore}startYear" />
<v:jsonset var="startYearExisting" >
SELECT ?startYearExisting WHERE {
?positionUri <${startYearPred}> ?startYearExisting }
</v:jsonset>
<v:jsonset var="startYearAssertion" >
?positionUri <${startYearPred}> ?startYear .
</v:jsonset>
<c:set var="endYearPred" value="${vivoCore}endYear" />
<v:jsonset var="endYearExisting" >
SELECT ?endYearExisting WHERE {
?positionUri <${endYearPred}> ?endYearExisting }
</v:jsonset>
<v:jsonset var="endYearAssertion" >
?positionUri <${endYearPred}> ?endYear .
</v:jsonset>
<%-- Note there is really no difference in how things are set up for an object property except
below in the n3ForEdit section, in whether the ..Existing variable goes in SparqlForExistingLiterals
or in the SparqlForExistingUris, as well as perhaps in how the options are prepared --%>
<c:set var="positionInOrgPred" value="${vivoCore}positionInOrganization" />
<c:set var="orgForPositionPred" value="${vivoCore}organizationForPosition" />
<v:jsonset var="organizationUriExisting" >
SELECT ?existingOrgUri WHERE {
?positionUri <${positionInOrgPred}> ?existingOrgUri }
</v:jsonset>
<v:jsonset var="organizationUriAssertion" >
?positionUri <${positionInOrgPred}> ?organizationUri .
?organizationUri <${orgForPositionPred}> ?positionUri .
</v:jsonset>
<v:jsonset var="positionTypeExisting">
SELECT ?existingPositionType WHERE {
?positionUri <${type}> ?existingPositionType }
</v:jsonset>
<v:jsonset var="positionTypeAssertion">
?positionUri <${type}> ?positionType .
</v:jsonset>
<v:jsonset var="newOrgNameAssertion">
?newOrg <${label}> ?newOrgName .
</v:jsonset>
<v:jsonset var="newOrgTypeAssertion">
?newOrg <${type}> ?newOrgType .
</v:jsonset>
<v:jsonset var="n3ForStmtToPerson">
@prefix core: <${vivoCore}> .
?person core:personInPosition ?positionUri .
?positionUri core:positionForPerson ?person .
?positionUri <${type}> ?positionType .
?positionUri <${type}> <${flagURI}> .
</v:jsonset>
<v:jsonset var="n3ForNewOrg">
?newOrg <${label}> ?newOrgName .
?newOrg <${type}> ?newOrgType .
?positionUri <${positionInOrgPred}> ?newOrg .
?newOrg <${orgForPositionPred}> ?positionUri .
?newOrg <${type}> <${flagURI}> .
</v:jsonset>
<v:jsonset var="positionClassUriJson">${positionClass}</v:jsonset>
<v:jsonset var="orgClassUriJson">${orgClass}</v:jsonset>
<c:set var="editjson" scope="request">
{
"formUrl" : "${formUrl}",
"editKey" : "${editKey}",
"urlPatternToReturnTo" : "/entity",
"subject" : ["person", "${subjectUriJson}" ],
"predicate" : ["predicate", "${predicateUriJson}" ],
"object" : ["positionUri", "${objectUriJson}", "URI" ],
"n3required" : [ "${n3ForStmtToPerson}", "${titleAssertion}", "${startYearAssertion}" ],
"n3optional" : [ "${organizationUriAssertion}",
"${n3ForNewOrg}", "${newOrgNameAssertion}", "${newOrgTypeAssertion}",
"${endYearAssertion}"],
"newResources" : { "positionUri" : "${defaultNamespace}",
"newOrg" : "${defaultNamespace}" },
"urisInScope" : { },
"literalsInScope": { },
"urisOnForm" : [ "organizationUri", "newOrgType", "positionType" ],
"literalsOnForm" : [ "title", "newOrgName",
"startYear", "endYear" ],
"filesOnForm" : [ ],
"sparqlForLiterals" : { },
"sparqlForUris" : { },
"sparqlForExistingLiterals" : {
"title" : "${titleExisting}",
"startYear" : "${startYearExisting}",
"endYear" : "${endYearExisting}"
},
"sparqlForExistingUris" : {
"organizationUri" : "${organizationUriExisting}",
"positionType" : "${positionTypeExisting}"
},
"fields" : {
"title" : {
"newResource" : "false",
"validators" : [ "nonempty" ],
"optionsType" : "UNDEFINED",
"literalOptions" : [ ],
"predicateUri" : "",
"objectClassUri" : "",
"rangeDatatypeUri" : "${stringDatatypeUriJson}",
"rangeLang" : "",
"assertions" : [ "${titleAssertion}" ]
},
"positionType" : {
"newResource" : "false",
"validators" : [ ],
"optionsType" : "CHILD_VCLASSES_WITH_PARENT",
"literalOptions" : [ "Select one" ],
"predicateUri" : "",
"objectClassUri" : "${positionClassUriJson}",
"rangeDatatypeUri" : "",
"rangeLang" : "",
"assertions" : [ "${positionTypeAssertion}" ]
},
"organizationUri" : {
"newResource" : "false",
"validators" : [ ],
"optionsType" : "INDIVIDUALS_VIA_VCLASS",
"literalOptions" : [ "Select one" ],
"predicateUri" : "",
"objectClassUri" : "${orgClassUriJson}",
"rangeDatatypeUri" : "",
"rangeLang" : "",
"assertions" : [ "${organizationUriAssertion}" ]
},
"newOrgName" : {
"newResource" : "false",
"validators" : [ ],
"optionsType" : "UNDEFINED",
"literalOptions" : [ ],
"predicateUri" : "",
"objectClassUri" : "",
"rangeDatatypeUri" : "${stringDatatypeUriJson}",
"rangeLang" : "",
"assertions" : [ "${n3ForNewOrg}" ]
},
"newOrgType" : {
"newResource" : "false",
"validators" : [ ],
"optionsType" : "CHILD_VCLASSES",
"literalOptions" : [ "Select one" ],
"predicateUri" : "",
"objectClassUri" : "${orgClassUriJson}",
"rangeDatatypeUri" : "",
"rangeLang" : "",
"assertions" : [ "${newOrgTypeAssertion}" ]
},
"startYear" : {
"newResource" : "false",
"validators" : [ "nonempty", "datatype:${gYearDatatypeUriJson}" ],
"optionsType" : "UNDEFINED",
"literalOptions" : [ ],
"predicateUri" : "",
"objectClassUri" : "",
"rangeDatatypeUri" : "${gYearDatatypeUriJson}",
"rangeLang" : "",
"assertions" : ["${startYearAssertion}"]
},
"endYear" : {
"newResource" : "false",
"validators" : [ "datatype:${gYearDatatypeUriJson}" ],
"optionsType" : "UNDEFINED",
"literalOptions" : [ ],
"predicateUri" : "",
"objectClassUri" : "",
"rangeDatatypeUri" : "${gYearDatatypeUriJson}",
"rangeLang" : "",
"assertions" : ["${endYearAssertion}"]
}
}
}
</c:set>
<%
log.debug(request.getAttribute("editjson"));
EditConfiguration editConfig = EditConfiguration.getConfigFromSession(session,request);
if (editConfig == null) {
editConfig = new EditConfiguration((String) request.getAttribute("editjson"));
EditConfiguration.putConfigInSession(editConfig,session);
}
Model model = (Model) application.getAttribute("jenaOntModel");
String objectUri = (String) request.getAttribute("objectUri");
if (objectUri != null) { // editing existing
editConfig.prepareForObjPropUpdate(model);
} else { // adding new
editConfig.prepareForNonUpdate(model);
}
String subjectName = ((Individual) request.getAttribute("subject")).getName();
%>
<c:set var="subjectName" value="<%= subjectName %>" />
<%
if (objectUri != null) { // editing existing entry
%>
<c:set var="editType" value="edit" />
<c:set var="title" value="Edit position entry for ${subjectName}" />
<%-- NB This will be the button text when Javascript is disabled. --%>
<c:set var="submitLabel" value="Save changes" />
<%
} else { // adding new entry
%>
<c:set var="editType" value="add" />
<c:set var="title" value="Create a new position entry for ${subjectName}" />
<%-- NB This will be the button text when Javascript is disabled. --%>
<c:set var="submitLabel" value="Create position" />
<% }
List<String> customJs = new ArrayList<String>(Arrays.asList("forms/js/customFormOneStep.js"
//, "forms/js/customForm.js"
));
request.setAttribute("customJs", customJs);
List<String> customCss = new ArrayList<String>(Arrays.asList("forms/css/customForm.css"
//, "forms/css/personHasEducationalbackground.css"
));
request.setAttribute("customCss", customCss);
%>
<c:set var="requiredHint" value="<span class='requiredHint'> *</span>" />
<jsp:include page="${preForm}" />
<h2>${title}</h2>
<form class="${editType}" action="<c:url value="/edit/processRdfForm2.jsp"/>" >
<div id="existing">
<v:input type="select" label="Select Existing Organization" labelClass="required" id="organizationUri" /><span id="existingOrNew">or</span>
</div>
<div id="addNewLink">
If your organization is not listed, please <a href="#">add a new organization</a>.
</div>
<div id="new">
<h6>Add a New Organization</h6>
<v:input type="text" label="Organization Name" labelClass="required" id="newOrgName" />
<v:input type="select" label="Select Organization Type" labelClass="required" id="newOrgType" />
</div>
<div id="entry">
<v:input type="text" label="Position Title ${requiredHint}" id="title" size="30" />
<v:input type="select" label="Position Type ${requiredHint}" id="positionType" />
<p class="inline year"><v:input type="text" label="Start Year ${requiredHint} <span class='hint'>(YYYY)</span>" id="startYear" size="4" /></p>
<p class="inline year"><v:input type="text" label="End Year <span id='endYearHint' class='hint'>(YYYY)</span>" id="endYear" size="4" /></p>
</div>
<!-- Processing information for Javascript -->
<input type="hidden" name="editType" value="${editType}" />
<input type="hidden" name="entryType" value="position" />
<input type="hidden" name="secondaryType" value="organization" />
<p class="submit"><v:input type="submit" id="submit" value="${submitLabel}" cancel="${param.subjectUri}"/></p>
<p id="requiredLegend" class="requiredHint">* required fields</p>
</form>
<jsp:include page="${postForm}"/>

View file

@ -289,8 +289,8 @@
<c:set var="submitLabel" value="Create position" />
<% }
List<String> customJs = new ArrayList<String>(Arrays.asList("forms/js/customForm.js"
//, "forms/js/personHasPositionHistory.js"
List<String> customJs = new ArrayList<String>(Arrays.asList("forms/js/customFormTwoStep.js"
//, "forms/js/customForm.js"
));
request.setAttribute("customJs", customJs);