diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/ManagePageGenerator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/ManagePageGenerator.java index 4514ba5c1..a873e3474 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/ManagePageGenerator.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/ManagePageGenerator.java @@ -190,8 +190,10 @@ public class ManagePageGenerator extends BaseEditConfigurationGenerator implemen //In the case where this is a new page, need to ensure page gets a new private void setNewResources(EditConfigurationVTwo conf) { //null makes default namespace be triggered - conf.addNewResource("page", defaultDisplayNs); - conf.addNewResource("menuItem", defaultDisplayNs); + //conf.addNewResource("page", defaultDisplayNs); + //conf.addNewResource("menuItem", defaultDisplayNs); + conf.addNewResource("page", null); + conf.addNewResource("menuItem", null); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/ManagePagePreprocessor.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/ManagePagePreprocessor.java index 694fc7322..5476b29ba 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/ManagePagePreprocessor.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/ManagePagePreprocessor.java @@ -106,7 +106,13 @@ public class ManagePagePreprocessor extends // TODO Auto-generated method stub List newResources = pn.getNewResources(counter); for(String newResource:newResources) { - editConfiguration.addNewResource(newResource, ManagePageGenerator.defaultDisplayNs); + //Will null get us display vocabulary or something else? + + editConfiguration.addNewResource(newResource, null); + //Weirdly enough, the defaultDisplayNS doesn't act as a namespace REALLY + //as it first gets assigned as the URI itself and this lead to an error + //instead of repetitively trying to get another URI + //editConfiguration.addNewResource(newResource, ManagePageGenerator.defaultDisplayNs ); } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessClassGroupDataGetterN3.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessClassGroupDataGetterN3.java new file mode 100644 index 000000000..68081a740 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessClassGroupDataGetterN3.java @@ -0,0 +1,81 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors.utils; + +import java.util.List; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import com.hp.hpl.jena.rdf.model.Literal; + +import edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldVTwo; + +import net.sf.json.JSONObject; +import net.sf.json.JSONSerializer; +//Returns the appropriate n3 based on data getter +public class ProcessClassGroupDataGetterN3 extends ProcessDataGetterAbstract { + private static String classType = "java:edu.cornell.mannlib.vitro.webapp.utils.dataGetter.ClassGroupDataGetter"; + + public ProcessClassGroupDataGetterN3(){ + + } + //Pass in variable that represents the counter + + //TODO: ensure correct model returned + //We shouldn't use the ACTUAL values here but generate the n3 required + public List retrieveN3Required(int counter) { + String dataGetterVar = getDataGetterVar(counter); + String n3 = dataGetterVar + " a <" + classType + ">; \n" + + "<" + DisplayVocabulary.FOR_CLASSGROUP + "> ?classGroup ."; + List requiredList = new ArrayList(); + requiredList.add(getPrefixes() + n3); + return requiredList; + + } + public List retrieveN3Optional(int counter) { + return null; + } + + //These methods will return the literals and uris expected within the n3 + //and the counter is used to ensure they are numbered correctly + + public List retrieveLiteralsOnForm(int counter) { + //no literals, just the class group URI + List literalsOnForm = new ArrayList(); + return literalsOnForm; + + } + + + public List retrieveUrisOnForm(int counter) { + List urisOnForm = new ArrayList(); + //Class group is a URI + urisOnForm.add(getVarName("classGroup", counter)); + return urisOnForm; + + } + + public List retrieveFields(int counter) { + List fields = new ArrayList(); + fields.add(new FieldVTwo().setName(getVarName("classGroup", counter))); + return fields; + } + + //These var names match the names of the elements within the json object returned with the info required for the data getter + + public List getLiteralVarNamesBase() { + return Arrays.asList(); + } + + //these are for the fields ON the form + public List getUriVarNamesBase() { + return Arrays.asList("classGroup"); + } + + +} + + diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessDataGetterAbstract.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessDataGetterAbstract.java new file mode 100644 index 000000000..f17d8f531 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessDataGetterAbstract.java @@ -0,0 +1,53 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors.utils; + +import java.util.List; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import com.hp.hpl.jena.rdf.model.Literal; + +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldVTwo; + +import net.sf.json.JSONObject; +import net.sf.json.JSONSerializer; +//Returns the appropriate n3 based on data getter +public abstract class ProcessDataGetterAbstract implements ProcessDataGetterN3 { + + public ProcessDataGetterAbstract(){ + + } + + //placeholder so need "?" in front of the variable + public String getDataGetterVar(int counter) { + return "?dataGetter" + counter; + } + + public String getPrefixes() { + return "@prefix display: . \n" + + "@prefix rdfs: . \n"; + } + + public String getVarName(String base, int counter) { + return base + counter; + } + + //For use within n3 strings, need a "?" + public String getN3VarName(String base, int counter) { + return "?" + getVarName(base, counter); + } + + //Return name of new resources + public List getNewResources(int counter) { + //Each data getter requires a new resource + List newResources = new ArrayList(); + newResources.add("dataGetter" + counter); + return newResources; + } + +} + + diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessSparqlDataGetterN3.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessSparqlDataGetterN3.java index 37b1d6c43..132cf5307 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessSparqlDataGetterN3.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessSparqlDataGetterN3.java @@ -15,7 +15,7 @@ import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldVTwo; import net.sf.json.JSONObject; import net.sf.json.JSONSerializer; //Returns the appropriate n3 based on data getter -public class ProcessSparqlDataGetterN3 implements ProcessDataGetterN3 { +public class ProcessSparqlDataGetterN3 extends ProcessDataGetterAbstract { private static String classType = "java:edu.cornell.mannlib.vitro.webapp.utils.dataGetter.SparqlQueryDataGetter"; public ProcessSparqlDataGetterN3(){ @@ -39,15 +39,6 @@ public class ProcessSparqlDataGetterN3 implements ProcessDataGetterN3 { public List retrieveN3Optional(int counter) { return null; } - //placeholder so need "?" in front of the variable - public String getDataGetterVar(int counter) { - return "?dataGetter" + counter; - } - - private String getPrefixes() { - return "@prefix display: . \n" + - "@prefix rdfs: . \n"; - } //Need to add method sfor returning the fields, literals on form, and all that @@ -105,22 +96,7 @@ public class ProcessSparqlDataGetterN3 implements ProcessDataGetterN3 { return Arrays.asList("queryModel"); } - public String getVarName(String base, int counter) { - return base + counter; - } - - //For use within n3 strings, need a "?" - public String getN3VarName(String base, int counter) { - return "?" + getVarName(base, counter); - } - - //Return name of new resources - public List getNewResources(int counter) { - //Each data getter requires a new resource - List newResources = new ArrayList(); - newResources.add("dataGetter" + counter); - return newResources; - } + } diff --git a/webapp/web/js/menupage/pageManagementUtils.js b/webapp/web/js/menupage/pageManagementUtils.js index 8ccb35a2d..136a616d5 100644 --- a/webapp/web/js/menupage/pageManagementUtils.js +++ b/webapp/web/js/menupage/pageManagementUtils.js @@ -1,18 +1,33 @@ /* $This file is distributed under the terms of the license in /doc/license.txt$ */ var pageManagementUtils = { - + dataGetterLabelToURI:null,//initialized by custom data + processDataGetterUtils:processDataGetterUtils,//an external class that should exist before this one // on initial page setup onLoad:function(){ if (this.disableFormInUnsupportedBrowsers()) { return; } this.mixIn(); + this.initDataGetterProcessors(), this.initObjects(); this.bindEventListeners(); this.initDisplay(); }, + initDataGetterProcessors:function() { + //data getter processor map should come in from custom data + //Go through each and initialize with their class + + if(pageManagementUtils.processDataGetterUtils != null) { + var dataGetterProcessorMap = pageManagementUtils.processDataGetterUtils.dataGetterProcessorMap; + $.each(dataGetterProcessorMap, function(key, dataGetterProcessorObject) { + //passes class name from data getter label to uri to processor + dataGetterProcessorObject.initProcessor(pageManagementUtils.dataGetterLabelToURI[key]); + }) + } + + }, disableFormInUnsupportedBrowsers: function() { var disableWrapper = $('#ie67DisableWrapper'); @@ -28,6 +43,7 @@ var pageManagementUtils = { }, mixIn: function() { + //Data getter process list input should be retrieved from the custom data // Mix in the custom form utility methods $.extend(this, vitro.customFormUtils); // Get the custom form data from the page @@ -38,8 +54,9 @@ var pageManagementUtils = { this.contentTypeSelect = $("#typeSelect"); //list of options this.contentTypeSelectOptions = $('select#typeSelect option'); - this.classGroupSection = $("section#classGroup"); - this.nonClassGroupSection = $("section#nonClassGroup"); + this.classGroupSection = $("section#browseClassGroup"); + this.sparqlQuerySection = $("section#sparqlQuery"); + this.fixedHTMLSection = $("section#fixedHtml"); //From original menu management edit this.defaultTemplateRadio = $('input.default-template'); this.customTemplateRadio = $('input.custom-template'); @@ -54,6 +71,13 @@ var pageManagementUtils = { this.allClassesSelectedCheckbox = $('#allSelected'); this.displayInternalMessage = $('#internal-class label em'); this.pageContentSubmissionInputs = $("#pageContentSubmissionInputs"); + this.headerBar = $("section#headerBar"); + this.moreContentButton = $("input#moreContent"); + this.isMenuCheckbox = $("input#menuCheckbox"); + this.menuSection = $("section#menu"); + this.submitButton = $("input#submit"); + this.leftSideDiv = $("div#leftSide"); + this.rightSideDiv = $("div#ri;ghtSide") }, initDisplay: function(){ //right side components @@ -62,43 +86,45 @@ var pageManagementUtils = { //Why would you want to hide this? This hides everything // $("section#pageDetails").hide(); - $("section#headerBar").hide(); + this.headerBar.hide(); this.classGroupSection.hide(); - this.nonClassGroupSection.hide(); - $("section#classesInSelectedGroup").addClass('hidden'); - $("input#moreContent").hide(); + this.sparqlQuerySection.hide(); + this.fixedHTMLSection.hide(); + this.classesForClassGroup.addClass('hidden'); + this.moreContentButton.hide(); //left side components - $("input.default-template").attr('checked',true); - $("input#menuCheckbox").attr('checked',false); - $("section#menu").hide(); + this.defaultTemplateRadio.attr('checked',true); + this.isMenuCheckbox.attr('checked',false); + this.menuSection.hide(); }, bindEventListeners:function(){ - $("input.default-template").click( function() { - $("section#custom-template").addClass('hidden'); + + this.defaultTemplateRadio.click( function() { + pageManagementUtils.customTemplateRadio.addClass('hidden'); }); - $("input.custom-template").click( function() { - $("section#custom-template").removeClass('hidden'); + this.customTemplateRadio.click( function() { + pageManagementUtils.defaultTemplateRadio.removeClass('hidden'); }); - $("input#menuCheckbox").click( function() { - if ( $("section#menu").is(':hidden') ) { - $("section#menu").show(); + this.isMenuCheckbox.click( function() { + if ( pageManagementUtils.menuSection.is(':hidden') ) { + pageManagementUtils.menuSection.show(); } else { - $("section#menu").hide(); + pageManagementUtils.menuSection.hide(); } }); - $("input#submit").click( function() { + this.submitButton.click( function() { $("section#pageDetails").show(); }); //Collapses the current content and creates a new section of content //Resets the content to be cloned to default settings - $("input#moreContent").click( function() { + this.moreContentButton.click( function() { var selectedType = pageManagementUtils.contentTypeSelect.val(); var selectedTypeText = $("#typeSelect option:selected").text(); //Not sure why selected group here? This won't always be true for more content @@ -106,21 +132,22 @@ var pageManagementUtils = { //Aren't these already hidden? //Hide both sections - $("section#classGroup").hide(); - $("section#nonClassGroup").hide(); + pageManagementUtils.classGroupSection.hide(); + pageManagementUtils.fixedHTMLSection.hide(); + pageManagementUtils.sparqlQuerySection.hide(); //Reset class group pageManagementUtils.resetClassGroupSection(); pageManagementUtils.contentTypeSelectOptions.eq(0).attr('selected', 'selected'); - $("input#moreContent").hide(); - if ( $("div#leftSide").css("height") != undefined ) { - $("div#leftSide").css("height",""); - if ( $("div#leftSide").height() < $("div#rightSide").height() ) { - $("div#leftSide").css("height",$("div#rightSide").height() + "px"); + pageManagementUtils.moreContentButton.hide(); + if ( pageManagementUtils.leftSideDiv.css("height") != undefined ) { + pageManagementUtils.leftSideDiv.css("height",""); + if ( pageManagementUtils.leftSideDiv.height() < pageManagementUtils.rightSideDiv.height() ) { + pageManagementUtils.leftSideDiv.css("height",pageManagementUtils.rightSideDiv.height() + "px"); } } - $("section#headerBar").hide(); - $("section#headerBar").text(""); + pageManagementUtils.headerBar.hide(); + pageManagementUtils.headerBar.text(""); //pageManagementUtils.cloneContentArea(selectedType,selectedGroup); pageManagementUtils.cloneContentArea(selectedType, selectedTypeText); pageManagementUtils.contentTypeSelect.focus(); @@ -146,20 +173,22 @@ var pageManagementUtils = { } } });*/ - + //TODO: These will all change $("select#typeSelect").change( function() { + _this = pageManagementUtils; $('input#variable').val(""); $('textarea#textArea').val(""); - if ( $("#typeSelect").val() == "browseClassGroup" ) { - $("section#classGroup").show(); - $("section#nonClassGroup").hide(); + if ( _this.contentTypeSelect.val() == "browseClassGroup" ) { + pageManagementUtils.classGroupSection.show(); + pageManagementUtils.fixedHTMLSection.hide(); + pageManagementUtils.sparqlQuerySection.hide(); $("input#moreContent").hide(); $("section#headerBar").text("Browse Class Group - "); $("section#headerBar").show(); } - if ( $("#typeSelect").val() == "fixedHtml" || $("#typeSelect").val() == "sparqlQuery" ) { - $("section#classGroup").hide(); - if ( $("#typeSelect").val() == "fixedHtml" ) { + if ( _this.contentTypeSelect.val() == "fixedHtml" || _this.contentTypeSelect.val() == "sparqlQuery" ) { + pageManagementUtils.classGroupSection.hide(); + if ( _this.contentTypeSelect.val() == "fixedHtml" ) { $('span#taSpan').text("Enter fixed HTML here"); $("section#headerBar").text("Fixed HTML - "); } @@ -167,13 +196,20 @@ var pageManagementUtils = { $('span#taSpan').text("Enter SPARQL query here"); $("section#headerBar").text("SPARQL Query Results - "); } - $("section#nonClassGroup").show(); + //if fixhed html show that, otherwise show sparq + if(_this.contentTypeSelect.val() == "fixedHtml") { + pageManagementUtils.fixedHTMLSection.show(); + pageManagementUtils.sparqlQuerySection.hide(); + } else { + pageManagementUtils.sparqlQuerySection.show(); + pageManagementUtils.fixedHTMLSection.hide(); + } $("section#headerBar").show(); $('select#selectClassGroup option').eq(0).attr('selected', 'selected'); $("section#classesInSelectedGroup").addClass('hidden'); $("input#moreContent").show(); } - if ( $("#typeSelect").val() == "" ) { + if ( _this.contentTypeSelect.val() == "" ) { $("section#classGroup").hide(); $("section#nonClassGroup").hide(); $("input#moreContent").hide(); @@ -199,8 +235,11 @@ var pageManagementUtils = { if (validationError == "") { //Create the appropriate json objects pageManagementUtils.createPageContentForSubmission(); - return true; + //return true; + //For testing, not submitting anything + return false; } else{ + $('#error-alert').removeClass('hidden'); $('#error-alert p').html(validationError); //TODO: Check why scrolling appears to be a problem @@ -214,64 +253,25 @@ var pageManagementUtils = { cloneContentArea: function(contentType, contentTypeLabel) { var ctr = pageManagementUtils.counter; var counter = pageManagementUtils.counter; - var varOrClas; + var varOrClass; + //Clone the object, renaming ids and copying text area values as well + $newContentObj = pageManagementUtils.createCloneObject(contentType, counter); - if ( contentType == "fixedHTML" || contentType == "sparqlQuery" ) { - var taValue = $('textarea#textArea').val(); - alert("original text area value is " + taValue); - var $newContentObj = $('section#nonClassGroup').clone(); - $newContentObj.addClass("pageContent"); - varOrClass = $newContentObj.find('input').val(); - $newContentObj.show(); - //Save content type - $newContentObj.attr("contentType", contentType); - $newContentObj.attr("id", contentType + counter); - $newContentObj.find('input#variable').attr("id","variable" + counter); - $newContentObj.find('textarea#textArea').attr("id","textArea" + counter); - $newContentObj.find('label#variableLabel').attr("id","variableLabel" + counter); - $newContentObj.find('label#taLabel').attr("id","taLabel" + counter); - - //Keep the name of the inputs the same - // $newContentObj.find('input#variable').attr("name","variable" + counter); - // $newContentObj.find('textarea#textArea').attr("name","textArea" + counter); - // There's a jquery bug when cloning textareas: the value doesn't - // get cloned. So - // copy the value "manually." - $newContentObj.find("textarea[name='textArea']").val(taValue); + if ( contentType == "fixedHTML" || contentType == "sparqlQuery") { + varOrClass = $newContentObj.find('input#saveToVar').val(); } else if ( contentType == "browseClassGroup" ) { - - var $newContentObj = $('section#classGroup').clone(); - - $newContentObj.addClass("pageContent"); - $newContentObj.show(); - $newContentObj.attr("contentType", contentType); - $newContentObj.attr("id", "classGroup" + counter); - $newContentObj.find('section#selectContentType').attr("id", "selectContentType" + counter); - $newContentObj.find('select#selectClassGroup').val(groupValue); - $newContentObj.find('select#selectClassGroup').attr("id","selectClassGroup" + counter); - $newContentObj.find('select#selectClassGroup' + counter).attr("name","selectClassGroup" + counter); - $newContentObj.find('section#classesInSelectedGroup').attr("id","classesInSelectedGroup" + counter); - $newContentObj.find('section#classesInSelectedGroup' + counter).removeClass('hidden'); - $newContentObj.find('p#selectClassesMessage').attr("id","selectClassesMessage" + counter); - // Will need to uncomment this and find a way to apply the css style -// $newContentObj.find('section#internal-class').attr("id","internal-class" + -// counter); - $newContentObj.find("input[name='display-internalClass']").attr("name","display-internalClass" + counter); - $newContentObj.find('ul#selectedClasses').attr("id","selectedClasses" + counter); - $newContentObj.find('ul#selectedClasses' + counter).attr("name","selectedClasses" + counter); - - $newContentObj.find('ul#selectedClasses' + counter).children("li").each( function(i,abc) { - var $theCheckbox = $(this).find('input'); - $theCheckbox.attr("name", $theCheckbox.attr("name") + counter); - }); - - varOrClass = $newContentObj.find('select#selectClassGroup' + counter + ' option:selected').text(); + $newContentObj.find('section#classesInSelectedGroup' + counter).removeClass('hidden'); + varOrClass = $newContentObj.find('select#selectClassGroup' + counter + ' option:selected').text(); } + pageManagementUtils.createClonedContentContainer($newContentObj, counter, contentTypeLabel, varOrClass); + //previously increased by 10, just increasing by 1 here + counter++; + }, + createClonedContentContainer:function($newContentObj, counter, contentTypeLabel, varOrClass) { //Create the container for the new content - $newDivContainer = $("
", { id: "divContainer" + counter, "class": "pageContentContainer", @@ -281,10 +281,20 @@ var pageManagementUtils = { + "' class='pageContentWrapper'>" }); - var $clickableSpan = $newDivContainer.children('span#clickable' + counter); + //Hide inner div var $innerDiv = $newDivContainer.children('div#innerContainer' + counter); $innerDiv.hide(); - //Expand/collapse toggle + //Bind event listers for the new content for display/removal etc. + pageManagementUtils.bindClonedContentContainerEvents($newDivContainer, counter); + //Append the new container to the section storing these containers + $newDivContainer.appendTo($('section#contentDivs')); + //place new content object + $newContentObj.prependTo($innerDiv); + }, + bindClonedContentContainerEvents:function($newDivContainer, counter) { + var $clickableSpan = $newDivContainer.children('span#clickable' + counter); + var $innerDiv = $newDivContainer.children('div#innerContainer' + counter); + //Expand/collapse toggle $clickableSpan.click(function() { if ( $innerDiv.is(':visible') ) { $innerDiv.slideUp(222); @@ -302,26 +312,17 @@ var pageManagementUtils = { } window.setTimeout('pageManagementUtils.adjustSaveButtonHeight()', 223); }); + //remove button $newRemoveButton = $innerDiv.find('input#remove' + counter); // this will have to disable submitted fields as well as hide them. $newRemoveButton.click(function() { $innerDiv.parent("div").css("display","none"); pageManagementUtils.adjustSaveButtonHeight(); }); - - $newDivContainer.appendTo($('section#contentDivs')); - $newContentObj.prependTo($innerDiv); - counter = counter + 10; }, resetClassGroupSection:function() { $('select#selectClassGroup option').eq(0).attr('selected', 'selected'); $("section#classesInSelectedGroup").addClass('hidden'); - }, - //finalize later, but basically use same attribute across page content and use attribute instead of id - //Attribute would be what keeps track of content, so contentCounter or something like that - toggleArrow:function() { - - }, //Adjust save button height adjustSaveButtonHeight:function() { @@ -345,7 +346,6 @@ var pageManagementUtils = { } else { //update existing content type with correct class group name and hide class group select again - var _this = pageManagementUtils; // pageManagementUtils.hideClassGroups(); pageManagementUtils.selectedGroupForPage.html(results.classGroupName); @@ -390,24 +390,6 @@ var pageManagementUtils = { }); }, - /* - showClassGroups: function() { //User has clicked change content type - //Show the section with the class group dropdown - this.selectContentType.removeClass("hidden"); - //Hide the "change content type" section which shows the selected class group - this.existingContentType.addClass("hidden"); - //Hide the checkboxes for classes within the class group - this.classesForClassGroup.addClass("hidden"); - }, - hideClassGroups: function() { //User has selected class group/content type, page should show classes for class group and 'existing' type with change link - //Hide the class group dropdown - this.selectContentType.addClass("hidden"); - //Show the "change content type" section which shows the selected class group - this.existingContentType.removeClass("hidden"); - //Show the classes in the class group - this.classesForClassGroup.removeClass("hidden"); - - },*/ toggleClassSelection: function() { // Check/unckeck all classes for selection $('input:checkbox[name=allSelected]').click(function(){ @@ -482,29 +464,62 @@ var pageManagementUtils = { //Create a new hidden input with a specific name and assign value per page content pageManagementUtils.createPageContentInputForSubmission(jsonObjectString); }); - //in this case it's a sparql data getter, but what about the others - /* - var len = pageContentSections.length; - var i; - for(i = 0; i < len; i++) { - var pageContentSection = $(pageContentSections[i]); - var pageContentSectionId = pageContentSection.attr("id"); - var jsonObject = pageManagementUtils.processPageContentSection(pageContentSection); - var jsonObjectString = JSON.stringify(jsonObject); - //Create a new hidden input with a specific name and assign value per page content - pageManagementUtils.createPageContentInputForSubmission(jsonObjectString); - }*/ }, createPageContentInputForSubmission: function(inputValue) { $("").appendTo(pageManagementUtils.pageContentSubmissionInputs); }, + //returns a json object with the data getter information required processPageContentSection:function(pageContentSection) { - - var variableValue = pageContentSection.find("input[name='variable']").val(); - var queryValue = pageContentSection.find("textarea[name='textArea']").val(); - var returnObject = {saveToVar:variableValue, query:queryValue, dataGetterClass:pageManagementUtils.dataGetterLabelToURI["sparqlDataGetter"], queryModel:"vitro:contextDisplayModel"}; - return returnObject; + //This processing should be specific to the type and so that content type's specific processor will + //return the json object required + if(pageManagementUtils.processDataGetterUtils != null) { + var dataGetterType = pageManagementUtils.processDataGetterUtils.selectDataGetterType(pageContentSection); + if(dataGetterProcessorMap != null) { + var dataGetterProcessor = dataGetterProcessorMap[dataGetterType]; + dataGetterProcessor.processPageContentSection(pageContentSection); + return dataGetterProcessor; + } else { + //ERROR handling + alert("An error has occurred and the map of processors for this content is missing. Please contact the administrator"); + return null; + } + } + alert("An error has occurred and the code for processing this content is missing a component. Please contact the administrator."); + //Error handling here + return null; + }, + //clones and returns cloned object for content type + createCloneObject:function(contentType, counter) { + var originalObjectPath = 'section#' + contentType; + var $newContentObj = $(originalObjectPath).clone(); + $newContentObj.addClass("pageContent"); + //Save content type + $newContentObj.attr("contentType", contentType); + //Set id for object + $newContentObj.attr("id", "contentType" + counter); + $newContentObj.show(); + pageManagementUtils.renameIdsInClone($newContentObj, counter); + // pageManagementUtils.cloneTextAreaValues(originalObjectPath, $newContentObj); + return $newContentObj; + }, + //This is specifically for cloning text area values + //May not need this if implementing the jquery fix + ///would need a similar function for select as well + cloneTextAreaValues:function(originalAncestorPath, $newAncestorObject) { + $(originalAncestorPath + " textarea").each(function(index, el) { + var originalTextAreaValue = $(this).val(); + var originalTextAreaName = $(this).attr("name"); + $newAncestorObject.find("textarea[name='" + originalTextAreaName + "']").val(originalTextAreaValue); + }); + }, + //given an object and a counter, rename all the ids + renameIdsInClone:function($newContentObj, counter) { + $newContentObj.find("[id]").each(function(index, el) { + var originalId = $(this).attr["id"]; + var newId = originalId + counter; + $(this).attr(newId); + }); } }; diff --git a/webapp/web/js/menupage/processClassGroupDataGetterContent.js b/webapp/web/js/menupage/processClassGroupDataGetterContent.js new file mode 100644 index 000000000..90c676b72 --- /dev/null +++ b/webapp/web/js/menupage/processClassGroupDataGetterContent.js @@ -0,0 +1,21 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +//Process sparql data getter and provide a json object with the necessary information +//Depending on what is included here, a different type of data getter might be used +var processClassGroupDataGetterContent = { + dataGetterClass:null, + //can use this if expect to initialize from elsewhere + initProcessor:function(dataGetterClassInput) { + this.dataGetterClass = dataGetterClassInput; + }, + //Do we need a separate content type for each of the others? + processPageContentSection:function(pageContentSection) { + //Will look at classes etc. + var classGroup = pageContentSection.find("select[name='selectClassGroup']").val(); + //query model should also be an input + var returnObject = {classGroup:classGroup, dataGetterClass:this.dataGetterClass}; + return returnObject; + } + + +} \ No newline at end of file diff --git a/webapp/web/js/menupage/processDataGetterUtils.js b/webapp/web/js/menupage/processDataGetterUtils.js new file mode 100644 index 000000000..1068283fa --- /dev/null +++ b/webapp/web/js/menupage/processDataGetterUtils.js @@ -0,0 +1,29 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +//This class is responsible for the product-specific form processing/content selection that might be possible +//Overrides the usual behavior of selecting the specific JavaScript class needed to convert the form inputs +//into a JSON object for submission based on the page content type + +//This will need to be overridden or extended, what have you.. in VIVO +var processDataGetterUtils = { + dataGetterProcessorMap:{"browseClassGroup": processClassGroupDataGetterContent, + "sparqlDataGetter": processSparqlDataGetterContent, + "fixedHTML":processFixedHTMLDataGetterContent, + "individualsForClasses":processIndividualsForClassesDataGetterContent}, + selectDataGetterType:function(pageContentSection) { + var contentType = pageContentSection.attr("contentType"); + //The form can provide "browse class group" as content type but need to check + //whether this is in fact individuals for classes instead + if(contentType == "browseClassGroup") { + //Is ALL NOT selected and there are other classes, pick one + //this SHOULD be an array + var allClassesSelected = pageContentSection.find("input[name='allSelected']:checked"); + //If all NOT selected then need to pick a different content type + if(allClassesSelected.length == 0) { + contentType = "individualsForClasses"; + } + } + + return contentType; + } +}; \ No newline at end of file diff --git a/webapp/web/js/menupage/processFixedHTMLDataGetterContent.js b/webapp/web/js/menupage/processFixedHTMLDataGetterContent.js new file mode 100644 index 000000000..1f3735739 --- /dev/null +++ b/webapp/web/js/menupage/processFixedHTMLDataGetterContent.js @@ -0,0 +1,20 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +//Process sparql data getter and provide a json object with the necessary information +var processFixedHTMLDataGetterContent = { + dataGetterClass:null, + //can use this if expect to initialize from elsewhere + initProcessor:function(dataGetterClass) { + this.dataGetterClass =dataGetterClass; + }, + //requires variable and text area + processPageContentSection:function(pageContentSection) { + var variableValue = pageContentSection.find("input[name='variable']").val(); + var queryValue = pageContentSection.find("textarea[name='textArea']").val(); + //query model should also be an input + var returnObject = {saveToVar:variableValue, query:queryValue, dataGetterClass:this.dataGetterClass, queryModel:"vitro:contextDisplayModel"}; + return returnObject; + } + + +} \ No newline at end of file diff --git a/webapp/web/js/menupage/processIndividualsForClassesDataGetterContent.js b/webapp/web/js/menupage/processIndividualsForClassesDataGetterContent.js new file mode 100644 index 000000000..50dfbfdbe --- /dev/null +++ b/webapp/web/js/menupage/processIndividualsForClassesDataGetterContent.js @@ -0,0 +1,18 @@ +var processIndividualsForClassesDataGetterContent = { + dataGetterClass:null, + //can use this if expect to initialize from elsewhere + initProcessor:function(dataGetterClassInput) { + this.dataGetterClass = dataGetterClassInput; + }, + //Do we need a separate content type for each of the others? + processPageContentSection:function(pageContentSection) { + //Will look at classes etc. + var classGroup = pageContentSection.find("select[name='selectClassGroup']").val(); + //query model should also be an input + //Get classes selected + var classesSelected = pageContentSection.find("input[name='classInClassGroup']:checked").val(); + var returnObject = {classGroup:classGroup, classesSelected:classesSelected, dataGetterClass:this.dataGetterClass}; + return returnObject; + } + +} \ No newline at end of file diff --git a/webapp/web/js/menupage/processSparqlDataGetterContent.js b/webapp/web/js/menupage/processSparqlDataGetterContent.js new file mode 100644 index 000000000..fb00769a6 --- /dev/null +++ b/webapp/web/js/menupage/processSparqlDataGetterContent.js @@ -0,0 +1,23 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +//Process sparql data getter and provide a json object with the necessary information +var processSparqlDataGetterContent = { + dataGetterClass:null, + //can use this if expect to initialize from elsewhere + initProcessor:function(dataGetterClass) { + this.dataGetterClass =dataGetterClass; + }, + processPageContentSection:function(pageContentSection) { + + var variableValue = pageContentSection.find("input[name='saveToVar']").val(); + var queryValue = pageContentSection.find("textarea[name='query']").val(); + var queryModel = pageContentSection.find("input[name='queryModel']").val(); + + //query model should also be an input + //set query model to query model here - vitro:contentDisplayModel + var returnObject = {saveToVar:variableValue, query:queryValue, dataGetterClass:this.dataGetterClass, queryModel:queryModel}; + return returnObject; + } + + +}; \ No newline at end of file diff --git a/webapp/web/templates/freemarker/edit/forms/pageManagement.ftl b/webapp/web/templates/freemarker/edit/forms/pageManagement.ftl index fbe48bed9..3d4b798a3 100644 --- a/webapp/web/templates/freemarker/edit/forms/pageManagement.ftl +++ b/webapp/web/templates/freemarker/edit/forms/pageManagement.ftl @@ -51,7 +51,7 @@
-
+
@@ -96,15 +96,28 @@
-
- - - - + + +
+ + + +
+
+ + + + + + +
+
+
@@ -137,7 +150,8 @@

* required fields

- +
@@ -145,27 +159,42 @@ + + + + ${stylesheets.add('')} ${stylesheets.add('')} ${stylesheets.add('')} ${scripts.add('')} +${scripts.add('')} + ${scripts.add('')} ${scripts.add('')} ${scripts.add('')} +<#--Include additional templates here to allow for additional data getters etc. for other products--> +${scripts.add('')} +${scripts.add('')} +${scripts.add('')} +${scripts.add('')} +${scripts.add('')} + ${scripts.add('')}