diff --git a/productMods/edit/forms/css/personHasEducationalTraining.css b/productMods/edit/forms/css/personHasEducationalTraining.css deleted file mode 100644 index 5be12408..00000000 --- a/productMods/edit/forms/css/personHasEducationalTraining.css +++ /dev/null @@ -1,9 +0,0 @@ -/* $This file is distributed under the terms of the license in /doc/license.txt$ */ - -#content form .existing { - clear: left; -} - -#content form p.inline.year input { - margin-left: 9em; -} \ No newline at end of file diff --git a/productMods/edit/forms/js/customForm.js b/productMods/edit/forms/js/customForm.js deleted file mode 100644 index 3a1df17b..00000000 --- a/productMods/edit/forms/js/customForm.js +++ /dev/null @@ -1,441 +0,0 @@ -/* $This file is distributed under the terms of the license in /doc/license.txt$ */ - -/* RY In a later iteration of the custom form Javascript, we'll create a customForm object - * with subclasses for one-step and two-step forms. The parent object will contain - * the utilities used by all form types. - */ - -/* 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 - * View variations are like one-step form, though button text is specific to edit version. - * - * - * We're jerry-rigging one-step forms into the two-step form process due to time constraints. - * In a later iteration of the custom form Javascript, we'll create a customForm object - * with subclasses for one-step and two-step forms. The parent object will contain - * the utilities used by all form types. The two-step edit form will be a type of one-step form. - * - * One-step custom form workflow: - * - * Has two view variations: - * - Combined view, as above for two step form. This is the default view for - * the one-step form, which shows unless we have clicked the add new link - * or are returning from a validation error where we had been in the add new view. - * - Add new secondary individual view. As above for two step form, but add new - * box contains a close link to return to combined view. - */ - -var customForm = { - - views: { - ADD_STEP_ONE: 1, // not 0, else can't test if (!view) - ADD_NEW: 2, - SELECT_EXISTING: 3, - COMBINED: 4 - }, - - - onLoad: function() { - - this.mixIn(); - this.initObjects(); - this.adjustForJs(); - this.initForm(); - }, - - mixIn: function() { - // Mix in the custom form utility methods - vitro.utils.borrowMethods(vitro.customFormUtils, this); - }, - - // On page load, create references for easy access to form 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.or = $('span.or'); - 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.existingSelect = this.existing.children('select'); - this.addNew = $('.new'); - this.entry = $('.entry'); - this.existingOrNew = $('.existingOrNew'); // just the word "or" between existing and add new - this.returnViewField = $("input[name='view']"); - - this.cancel = this.form.find('.cancel'); - - // Read values used to control display - this.editType = $("input[name='editType']").val(); - this.entryType = $("input[name='entryType']").val().capitalizeWords(); - this.secondaryType = $("input[name='secondaryType']").val().capitalizeWords(); - // Enforce one step for edit forms, in case the form forgets to - this.formSteps = this.editType === 'edit' ? '1' : $("input[name='steps']").val(); - this.returnView = parseInt(this.returnViewField.val()); // returns NaN for empty string - - }, - - // 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(); - - this.toggleRequiredHints('show', this.addNew); - - // The close link in the addNew div closes the addNew div and restores the - // combined view. It is needed for the one-step add form and the edit form - // (which is a one-step form), but not for the two-step add form, since we'd - // want it to restore step 1, but the Cancel link at the bottom of the form - // already performs that function. - if (this.formSteps == 1) { - this.addNew.prepend('cancel'); - } - this.close = this.form.find('.close'); - - }, - - 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 a returnView has been specified in the hidden input field, it means we are - // returning from a failed submission due to validation errors. We need to restore - // the view we were on when the form was submitted. - if (this.returnView) { - this.doAddFormStep2(this.returnView); - } 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() { - - if (this.formSteps == 1) { - customForm.doAddFormStep2(customForm.views.COMBINED); - customForm.doClose(); - return; - } - - customForm.existing.show(); - customForm.toggleRequiredHints('hide', customForm.existing); - customForm.addNewLink.show(); - customForm.hideFields(customForm.addNew); - customForm.hideFields(customForm.entry); - customForm.requiredLegend.hide(); - customForm.button.hide(); - customForm.or.hide(); - customForm.setReturnView(customForm.views.ADD_STEP_ONE); - - // Assign event listeners - customForm.existingSelect.bind('change', function() { - if ($(this).val() != '') { - customForm.doAddFormStep2(customForm.views.SELECT_EXISTING); - return false; - } - }); - // Note that addNewLink event listener is different - // in different views. - customForm.addNewLink.bind('click', function() { - customForm.doAddFormStep2(customForm.views.ADD_NEW); - }); - }, - - // Set up add form for step 2. If no view is passed in, we're returning - // from a failed submission due to validation errors, and will attempt to - // determine the previous view from the form data that's been entered. - doAddFormStep2: function(view) { - - switch (view) { - case customForm.views.SELECT_EXISTING: { fn = customForm.doAddFormStep2SelectExisting; break; } - case customForm.views.ADD_NEW: { fn = customForm.doAddFormStep2AddNew; break; } - default: { fn = customForm.doAddFormStep2Combined; break; } - } - - fn.call(customForm); - - customForm.button.show(); - customForm.or.show(); - customForm.toggleRequiredHints('show', customForm.existing, customForm.addNew); - }, - - // 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() { - - if (customForm.formSteps == 1) { - customForm.doAddFormStep2Combined(); - return; - } - customForm.showSelectExistingFields(); - // This hint shows in step 2 but not in step 1 - customForm.toggleRequiredHints('show', customForm.existing); - customForm.doButtonForStep2(customForm.defaultButtonText); - customForm.doCancelForStep2(); - customForm.setReturnView(customForm.views.SELECT_EXISTING); - }, - - // Step 2: adding a new individual - doAddFormStep2AddNew: function() { - - customForm.showAddNewFields(); - customForm.doButtonForStep2(customForm.addNewButtonText); - customForm.doCancelForStep2(); - customForm.doClose(); - customForm.setReturnView(customForm.views.ADD_NEW); - }, - - // 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.doAddNewLinkForCombinedView(); - customForm.doButtonForStep2(customForm.defaultButtonText); - customForm.doCancelForStep2(); - customForm.setReturnView(customForm.views.COMBINED); - }, - - - /***** Edit form *****/ - - initEditForm: function() { - - this.defaultButtonText = 'Save Changes'; - this.addNewButtonText = 'Create ' + this.secondaryType + ' & Save Changes'; - this.toggleRequiredHints('show', this.existing); - - switch (this.returnView) { - case this.views.ADD_NEW: { fn = this.doEditFormAddNew; break; } - default: { fn = this.doEditFormCombinedView; break; } - } - - // Remember the original org. If we click the add new org link - // but then cancel out of it, we want to restore this value. - this.originalOrg = this.existingSelect.val(); - // But we only want to restore the original value from when the - // form loaded. If we've already changed to a new value, we don't - // want to restore that. - this.existingSelect.bind('change', function() { - customForm.originalOrg = null; - }); - - fn.call(customForm); - }, - - doEditFormAddNew: function() { - this.showAddNewFields(); - this.button.val(this.addNewButtonText); - this.setReturnView(this.views.ADD_NEW); - this.doClose(); - }, - - doEditFormCombinedView: function() { - this.showCombinedFields(); - this.button.val(this.defaultButtonText); - this.doAddNewLinkForCombinedView(); - this.setReturnView(this.views.COMBINED); - }, - - unbindEventListeners: function() { - customForm.cancel.unbind('click'); - customForm.button.unbind('click'); - customForm.addNewLink.unbind('click'); - customForm.close.unbind('click'); - customForm.existingSelect.unbind('change'); - }, - - // 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() { - - if (customForm.formSteps == 1) { return; } - - customForm.cancel.unbind('click'); - customForm.cancel.bind('click', function() { - customForm.resetAddFormToStep1(); - return false; - }); - }, - - doAddNewLinkForCombinedView: function() { - - 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. - // RY When we have multiple existing and addNew divs, we won't - // show/hide them all, only the siblings of the addNewLink. - // And we'll need to figure out the button text based on which - // div we're opening. - customForm.hideFields(customForm.existing); - customForm.addNew.show(); - customForm.button.val(customForm.addNewButtonText); - customForm.doClose(); - customForm.setReturnView(customForm.views.ADD_NEW); - return false; - }); - }, - - doClose: function() { - - customForm.close.unbind('click'); - customForm.close.bind('click', function() { - // RY When we have multiple existing and addNew divs, we won't - // show/hide them all, only the siblings of the addNewLink. - customForm.existing.show(); - customForm.hideFields(customForm.addNew); - customForm.addNewLink.show(); - customForm.button.val(customForm.defaultButtonText); - customForm.doAddNewLinkForCombinedView(); - customForm.setReturnView(customForm.views.COMBINED); - - if (customForm.originalOrg) { - customForm.existingSelect.val(customForm.originalOrg); - } - - return false; - }); - }, - - resetForm: function() { - - // Clear all form data and error messages - customForm.clearFormData(); - - // Remove previously bound event handlers - customForm.unbindEventListeners(); - }, - - showSelectExistingFields: function() { - - customForm.existing.show(); - customForm.addNewLink.hide(); - customForm.hideFields(customForm.addNew); - customForm.showFieldsForAllViews(); - - // Adjust the validation error that has been inserted by the server, which - // is phrased appropriately for the non-Javascript version of the form. - $('#organizationUri_validationError').html('Must select an organization.'); - }, - - showAddNewFields: function() { - - customForm.hideFields(customForm.existing); - customForm.addNewLink.hide(); - customForm.addNew.show(); - customForm.showFieldsForAllViews(); - - // Adjust the validation error that has been inserted by the server, which - // is phrased appropriately for the non-Javascript version of the form. - $('#newOrgName_validationError').html('Must specify an organization.'); - }, - - // 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.existing.show(); - customForm.addNewLink.show(); - customForm.addNewLink.css('margin-bottom', '1em'); - customForm.hideFields(customForm.addNew); - 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(); - }, - - toggleRequiredHints: function(action /* elements */) { - - var hints, - selector = 'span.requiredHint', - numArgs = arguments.length; - - if (numArgs < 2) { - return; - } - hints = arguments[1].find(selector); - for (var i = 2; i < numArgs; i++) { - hints.add(arguments[i].find(selector)); - } - - action == 'show' ? hints.show() : hints.hide(); - }, - - // Set the hidden input field indicating the view to return to if - // the submission fails due to validation errors. - setReturnView: function(value) { - customForm.returnViewField.val(value); - } - -}; - -$(document).ready(function() { - customForm.onLoad(); -}); diff --git a/productMods/edit/forms/personHasEducationalTraining.jsp b/productMods/edit/forms/personHasEducationalTraining.jsp index 98e99444..3423bfe2 100644 --- a/productMods/edit/forms/personHasEducationalTraining.jsp +++ b/productMods/edit/forms/personHasEducationalTraining.jsp @@ -47,9 +47,10 @@ core:dateTimePrecision (DateTimeValue : DateTimeValuePrecision) <%@ 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="edu.cornell.mannlib.vitro.webapp.edit.n3editing.PersonHasPositionValidator"%> <%@ page import="org.apache.commons.logging.Log" %> <%@ page import="org.apache.commons.logging.LogFactory" %> +<%@ page import="edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.JavaScript" %> +<%@ page import="edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.Css" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core"%> <%@ taglib prefix="v" uri="http://vitro.mannlib.cornell.edu/vitro/tags" %> @@ -72,23 +73,14 @@ core:dateTimePrecision (DateTimeValue : DateTimeValuePrecision) -<%-- Data properties --%> -<%-- 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 --%> +<%-- Define predicates used in n3 assertions and sparql queries --%> - - SELECT ?majorFieldExisting WHERE { - ?edTrainingUri <${majorFieldPred}> ?majorFieldExisting } - - -<%-- 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) --%> - - ?edTrainingUri <${majorFieldPred}> ?majorField . - + + + + + + <%-- For new datetime handling in ontology - v1.2 @@ -96,96 +88,112 @@ core:dateTimePrecision (DateTimeValue : DateTimeValuePrecision) - + SELECT ?existingYear WHERE { - ?edTrainingUri <${hasDateTimeValue}> ?existingYear } + ?edTraining <${hasDateTimeValue}> ?existingYear . } @prefix core: <${vivoCore}> . ?dateTime a core:DateTimeValue ; core:dateTime ?year ; core:dateTimeValuePrecision core:YearPrecision . - ?edTrainingUri core:dateTimeValue ?dateTime . + ?edTraining core:dateTimeValue ?dateTime . --%> - - - SELECT ?existingYear WHERE { - ?edTrainingUri <${yearPred}> ?existingYear } - - - ?edTrainingUri <${yearPred}> ?year . +<%-- Assertions for adding a new educational training entry --%> + + + ?org a ?orgType . - - - SELECT ?existingDept WHERE { - ?edTrainingUri <${deptPred}> ?existingDept } - - - ?edTrainingUri <${deptPred}> ?dept . + + ?org <${label}> ?orgLabel . - - - SELECT ?existingInfo WHERE { - ?edTrainingUri <${infoPred}> ?existingInfo } - - - ?edTrainingUri <${infoPred}> ?info . - - -<%-- Object properties --%> -<%-- 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 --%> - - - - SELECT ?existingDegreeUri WHERE { - ?edTrainingUri <${degreeEarned}> ?existingDegreeUri } - - ?edTrainingUri <${degreeEarned}> ?degreeUri . - ?degreeUri <${degreeOutcomeOf}> ?edTrainingUri . + ?edTraining <${degreeEarned}> ?degree . + ?degree <${degreeOutcomeOf}> ?edTraining . - -<%-- This property has no inverse --%> - - SELECT ?existingOrgUri WHERE { - ?edTrainingUri <${orgGrantingDegree}> ?existingOrgUri } - - - ?edTrainingUri <${orgGrantingDegree}> ?organizationUri . + + ?edTraining <${majorFieldPred}> ?majorField . - - ?newOrg <${label}> ?newOrgName . - -<%-- Break up the new org type and subclass assertions, so that if there is no subclass, -the org type still gets asserted. --%> - - ?newOrg a ?newOrgType . + + ?edTraining <${yearPred}> ?year . - + + ?edTraining <${deptPred}> ?dept . + + + + ?edTraining <${infoPred}> ?info . + + + @prefix core: <${vivoCore}> . - ?person core:educationalTraining ?edTrainingUri . + ?person core:educationalTraining ?edTraining . - ?edTrainingUri core:educationalTrainingOf ?person ; - a core:EducationalTraining . + ?edTraining a core:EducationalTraining ; + core:educationalTrainingOf ?person ; + <${orgGrantingDegree}> ?org . - - ?newOrg <${label}> ?newOrgName ; - a ?newOrgType . - - ?edTrainingUri <${orgGrantingDegree}> ?newOrg . +<%-- This property has no inverse --%> + + ?edTraining <${orgGrantingDegree}> ?org . +<%-- Queries for editing an existing educational training entry --%> + + + SELECT ?existingOrg WHERE { + ?edTraining <${orgGrantingDegree}> ?existingOrg . } + + + + SELECT ?existingOrgLabel WHERE { + ?edTraining <${orgGrantingDegree}> ?existingOrg . + ?existingOrg <${label}> ?existingOrgLabel . + } + + + + SELECT ?existingOrgType WHERE { + ?edTraining <${orgGrantingDegree}> ?existingOrg . + ?existingOrg a ?existingOrgType . + } + + + + SELECT ?existingDegree WHERE { + ?edTraining <${degreeEarned}> ?existingDegree . } + + + + SELECT ?existingMajorField WHERE { + ?edTraining <${majorFieldPred}> ?existingMajorField . } + + + + SELECT ?existingYear WHERE { + ?edTraining <${yearPred}> ?existingYear . } + + + + SELECT ?existingDept WHERE { + ?edTraining <${deptPred}> ?existingDept . } + + + + SELECT ?existingInfo WHERE { + ?edTraining <${infoPred}> ?existingInfo . } + + + ${orgClass} ${degreeClass} @@ -197,36 +205,38 @@ the org type still gets asserted. --%> "subject" : ["person", "${subjectUriJson}" ], "predicate" : ["predicate", "${predicateUriJson}" ], - "object" : ["edTrainingUri", "${objectUriJson}", "URI" ], + "object" : ["edTraining", "${objectUriJson}", "URI" ], - "n3required" : [ "${n3ForStmtToPerson}", "${majorFieldAssertion}" ], + "n3required" : [ "${n3ForNewEdTraining}", "${majorFieldAssertion}" ], - "n3optional" : [ "${organizationUriAssertion}", "${n3ForNewOrg}", - "${newOrgNameAssertion}", "${newOrgTypeAssertion}", + "n3optional" : [ "${n3ForEdTrainingToOrg}", + "${orgLabelAssertion}", "${orgTypeAssertion}", "${degreeAssertion}", "${deptAssertion}", "${infoAssertion}", "${yearAssertion}" ], - "newResources" : { "edTrainingUri" : "${defaultNamespace}", - "newOrg" : "${defaultNamespace}" }, + "newResources" : { "edTraining" : "${defaultNamespace}", + "org" : "${defaultNamespace}" }, "urisInScope" : { }, "literalsInScope": { }, - "urisOnForm" : [ "organizationUri", "newOrgType", "degreeUri" ], - "literalsOnForm" : [ "majorField", "year", "dept", "info", "newOrgName"], + "urisOnForm" : [ "org", "orgType", "degree" ], + "literalsOnForm" : [ "orgLabel", "majorField", "year", "dept", "info" ], "filesOnForm" : [ ], "sparqlForLiterals" : { }, "sparqlForUris" : { }, "sparqlForExistingLiterals" : { - "majorField" : "${majorFieldExisting}", - "year" : "${yearExisting}", - "dept" : "${deptExisting}", - "info" : "${infoExisting}" + "orgLabel" : "${orgLabelQuery}", + "majorField" : "${majorFieldQuery}", + "year" : "${yearQuery}", + "dept" : "${deptQuery}", + "info" : "${infoQuery}" }, "sparqlForExistingUris" : { - "organizationUri" : "${organizationUriExisting}", - "degreeUri" : "${degreeExisting}" + "org" : "${orgQuery}", + "orgType" : "${orgTypeQuery}", + "degree" : "${degreeQuery}" }, "fields" : { - "degreeUri" : { + "degree" : { "newResource" : "false", "validators" : [ ], "optionsType" : "INDIVIDUALS_VIA_VCLASS", @@ -259,7 +269,7 @@ the org type still gets asserted. --%> "rangeLang" : "", "assertions" : ["${yearAssertion}"] }, - "organizationUri" : { + "org" : { "newResource" : "false", "validators" : [ ], "optionsType" : "INDIVIDUALS_VIA_VCLASS", @@ -268,9 +278,9 @@ the org type still gets asserted. --%> "objectClassUri" : "${orgClassUriJson}", "rangeDatatypeUri" : "", "rangeLang" : "", - "assertions" : [ "${organizationUriAssertion}" ] + "assertions" : [ "${n3ForEdTrainingToOrg}" ] }, - "newOrgName" : { + "orgLabel" : { "newResource" : "false", "validators" : [ ], "optionsType" : "UNDEFINED", @@ -279,9 +289,9 @@ the org type still gets asserted. --%> "objectClassUri" : "", "rangeDatatypeUri" : "${stringDatatypeUriJson}", "rangeLang" : "", - "assertions" : [ "${n3ForNewOrg}" ] + "assertions" : [ "${orgLabelAssertion}" ] }, - "newOrgType" : { + "orgType" : { "newResource" : "false", "validators" : [ ], "optionsType" : "CHILD_VCLASSES", @@ -290,7 +300,7 @@ the org type still gets asserted. --%> "objectClassUri" : "${orgClassUriJson}", "rangeDatatypeUri" : "", "rangeLang" : "", - "assertions" : [ "${newOrgTypeAssertion}" ] + "assertions" : [ "${orgTypeAssertion}" ] }, "dept" : { "newResource" : "false", @@ -326,8 +336,6 @@ the org type still gets asserted. --%> EditConfiguration.putConfigInSession(editConfig,session); } - editConfig.addValidator(new PersonHasPositionValidator()); - Model model = (Model) application.getAttribute("jenaOntModel"); String objectUri = (String) request.getAttribute("objectUri"); if (objectUri != null) { // editing existing @@ -343,79 +351,87 @@ the org type still gets asserted. --%> <% if (objectUri != null) { // editing existing entry %> - + + - <%-- NB This will be the button text when Javascript is disabled. --%> - + + <% } else { // adding new entry %> - - - <%-- NB This will be the button text when Javascript is disabled. --%> - + + + + <% } - - List customJs = new ArrayList(Arrays.asList("/js/utils.js", - "/js/customFormUtils.js", - "/edit/forms/js/customForm.js" - //, "/edit/forms/js/customFormOneStep.js" - )); + + List customJs = new ArrayList(Arrays.asList(JavaScript.JQUERY_UI.path(), + JavaScript.CUSTOM_FORM_UTILS.path(), + "/edit/forms/js/customFormWithAutocomplete.js" + )); request.setAttribute("customJs", customJs); - - List customCss = new ArrayList(Arrays.asList("/edit/forms/css/customForm.css", - "/edit/forms/css/personHasEducationalTraining.css" - )); - request.setAttribute("customCss", customCss); + + List customCss = new ArrayList(Arrays.asList(Css.JQUERY_UI.path(), + Css.CUSTOM_FORM.path(), + "/edit/forms/css/autocomplete.css", + "/edit/forms/css/customFormWithAutocomplete.css" + )); + request.setAttribute("customCss", customCss); %> - + -

${title}

+

${titleVerb} educational training entry for <%= subjectName %>

-
" > +" > -
- - -

-
- -
-
- or +

+ +
+ +

+ + <%-- Store these values in hidden fields, because the displayed fields are disabled and don't submit. This ensures that when + returning from a validation error, we retain the values. --%> + + + + + +
+ <%-- RY maybe make this a label and input field. See what looks best. --%> +

(Verify this match)

+
- - - -
-
Add a New Organization
- - -
-
- -
+ + + + + + + +

e.g., Postdoctoral training or Transferred

- - - - - - - -

+

* required fields

+ + + + diff --git a/productMods/edit/forms/personHasPositionHistory.jsp b/productMods/edit/forms/personHasPositionHistory.jsp index 01d9f6d6..571b29e4 100644 --- a/productMods/edit/forms/personHasPositionHistory.jsp +++ b/productMods/edit/forms/personHasPositionHistory.jsp @@ -314,7 +314,7 @@

${titleVerb} position entry for <%= subjectName %>

-
" > +" >