From bd5acb1ef0923a149e0791cfe3121e9166fc649f Mon Sep 17 00:00:00 2001 From: rjy7 Date: Thu, 8 Jul 2010 21:57:05 +0000 Subject: [PATCH] NIHVIVO-765 Call reorder when loading add authors form, to prevent problems when adding a new author and the last existing author is unranked. --- .../forms/addAuthorsToInformationResource.jsp | 2 + .../js/addAuthorsToInformationResource.js | 213 ++++++++++-------- 2 files changed, 121 insertions(+), 94 deletions(-) diff --git a/productMods/edit/forms/addAuthorsToInformationResource.jsp b/productMods/edit/forms/addAuthorsToInformationResource.jsp index 89533f7c..9e002499 100644 --- a/productMods/edit/forms/addAuthorsToInformationResource.jsp +++ b/productMods/edit/forms/addAuthorsToInformationResource.jsp @@ -362,6 +362,8 @@ SPARQL queries for existing values. --%> // A new author will be ranked last when added. // This wouldn't handle gaps in the ranking: vreq.setAttribute("rank", authorships.size()+1); + // This value is now inserted by JavaScript, but leave it here as a safety net in case page + // load reordering returns an error. request.setAttribute("newRank", maxRank + 1); request.setAttribute("rankPred", rankPredicateUri); %> diff --git a/productMods/edit/forms/js/addAuthorsToInformationResource.js b/productMods/edit/forms/js/addAuthorsToInformationResource.js index 77ca0b4a..6baf4d8f 100644 --- a/productMods/edit/forms/js/addAuthorsToInformationResource.js +++ b/productMods/edit/forms/js/addAuthorsToInformationResource.js @@ -70,6 +70,10 @@ var addAuthorForm = { initAuthorListOnlyView: function() { this.hideForm(); this.showFormButtonWrapper.show(); + // We reorder authors on page load so that previously unranked authors get a rank. Otherwise, + // when we add a new author, it will get put ahead of any previously unranked authors, instead + // of at the end of the list. (It is also helpful to normalize the data before we get started.) + this.reorderAuthors(); }, // View of form after returning from an invalid submission. On this form, @@ -248,93 +252,115 @@ var addAuthorForm = { authorshipList.sortable({ stop: function(event, ui) { - var predicateUri = '<' + $('.rankPred').attr('id') + '>', - rankXsdType = $('.rankXsdType').attr('id'), - additions = '', - retractions = '', - authorships = []; - - $('li.authorship').each(function(index) { - var uri = $(this).attr('id'), - subjectUri = '<' + uri + '>', - oldRankVal = addAuthorForm.getRankVal(this), - newRank = index + 1, - newRankForN3, - oldRank, - oldRankType, - oldRankForN3, - rankVals; - - if (oldRankVal) { - // e.g., 1_http://www.w3.org/2001/XMLSchema#int - // We handle typeless values formatted as either "1" or "1_". - rankVals = oldRankVal.split('_'); - oldRank = rankVals[0]; - oldRankType = rankVals.length > 1 ? rankVals[1] : ''; - oldRankForN3 = addAuthorForm.makeRankDataPropVal(oldRank, oldRankType); - retractions += subjectUri + ' ' + predicateUri + ' ' + oldRankForN3 + ' .'; - } - - newRankForN3 = addAuthorForm.makeRankDataPropVal(newRank, rankXsdType); - additions += subjectUri + ' ' + predicateUri + ' ' + newRankForN3 + ' .'; - - // This data will be used to modify the page after successful completion - // of the Ajax request. - authorship = { - uri: uri, - rankVal: newRank + '_' + rankXsdType - }; - authorships.push(authorship); - - }); - - // console.log(authorships) - // console.log('additions: ' + additions); - // console.log('retractions: ' + retractions); - - $.ajax({ - url: $('.reorderUrl').attr('id'), - data: { - additions: additions, - retractions: retractions - }, - authorships: authorships, - processData: 'false', - dataType: 'json', - type: 'POST', - success: function(data, status, request) { - $.each(authorships, function(index, obj) { - // find the element with this uri as id - var el = $('li[id=' + obj.uri + ']'), - // because all ranks have been reordered without gaps, - // we can get the position from the rank - pos = obj.rankVal.split('_')[0]; - // set the new rank and position for this element - addAuthorForm.setRankVal(el, obj.rankVal); - addAuthorForm.setPosition(el, pos); - }); - }, - error: function(request, status, error) { - // Put the moved item back to its original position. - // Seems we need to do this by hand. Can't see any way to do it with jQuery UI. ?? - var pos = addAuthorForm.getPosition(ui.item), - //ui.item.children('.position').attr('id'), - nextpos = pos + 1, - authorships = $('#authorships'), - next = authorships.find('.position[id=' + nextpos + ']').parent(); - - if (next.length) { - ui.item.insertBefore(next); - } else { - ui.item.appendTo(authorships); - } - - alert('Reordering of authors failed.'); - } - }); - } // end stop callback + addAuthorForm.reorderAuthors(event, ui); + } }); }, + + // Reorder authors. Called on page load and after author drag-and-drop. + // Event and ui parameters are defined only in the case of drag-and-drop. + reorderAuthors: function(event, ui) { + var predicateUri = '<' + $('.rankPred').attr('id') + '>', + rankXsdType = $('.rankXsdType').attr('id'), + additions = '', + retractions = '', + authorships = []; + + $('li.authorship').each(function(index) { + var uri = $(this).attr('id'), + subjectUri = '<' + uri + '>', + oldRankVal = addAuthorForm.getRankStrVal(this), + newRank = index + 1, + newRankForN3, + oldRank, + oldRankType, + oldRankForN3, + rankVals; + + if (oldRankVal) { + // e.g., 1_http://www.w3.org/2001/XMLSchema#int + // We handle typeless values formatted as either "1" or "1_". + rankVals = oldRankVal.split('_'); + oldRank = rankVals[0]; + oldRankType = rankVals.length > 1 ? rankVals[1] : ''; + oldRankForN3 = addAuthorForm.makeRankDataPropVal(oldRank, oldRankType); + retractions += subjectUri + ' ' + predicateUri + ' ' + oldRankForN3 + ' .'; + } + + newRankForN3 = addAuthorForm.makeRankDataPropVal(newRank, rankXsdType); + additions += subjectUri + ' ' + predicateUri + ' ' + newRankForN3 + ' .'; + + // This data will be used to modify the page after successful completion + // of the Ajax request. + authorship = { + uri: uri, + rankVal: newRank + '_' + rankXsdType + }; + authorships.push(authorship); + + }); + + // console.log(authorships) + // console.log('additions: ' + additions); + // console.log('retractions: ' + retractions); + + $.ajax({ + url: $('.reorderUrl').attr('id'), + data: { + additions: additions, + retractions: retractions + }, + authorships: authorships, + processData: 'false', + dataType: 'json', + type: 'POST', + success: function(data, status, request) { + var maxRank; + + $.each(authorships, function(index, obj) { + // find the element with this uri as id + var el = $('li[id=' + obj.uri + ']'), + // because all ranks have been reordered without gaps, + // we can get the position from the rank + pos = obj.rankVal.split('_')[0]; + // set the new rank and position for this element + addAuthorForm.setRankStrVal(el, obj.rankVal); + addAuthorForm.setPosition(el, pos); + }); + + // On page load, we're calling reorder to assign a rank to any + // unranked authorships. We thus need to set the rank form field + // to the new highest rank + 1. + if (!ui) { + maxRank = addAuthorForm.getRankIntVal($('.authorship:last')); + $('#rank').val(maxRank + 1); + } + }, + error: function(request, status, error) { + // This is performed only after drag-and-drop. + if (ui) { + // Put the moved item back to its original position. + // Seems we need to do this by hand. Can't see any way to do it with jQuery UI. ?? + var pos = addAuthorForm.getPosition(ui.item), //ui.item.children('.position').attr('id'), + nextpos = pos + 1, authorships = $('#authorships'), + next = authorships.find('.position[id=' + nextpos + ']').parent(); + + if (next.length) { + ui.item.insertBefore(next); + } + else { + ui.item.appendTo(authorships); + } + + alert('Reordering of authors failed.'); + } // What should we do if the reordering fails? + else { + } + + + } + }); + }, getPosition: function(authorship) { return parseInt($(authorship).children('.position').attr('id')); @@ -345,16 +371,16 @@ var addAuthorForm = { }, // Get the authorship rank value, which includes xsd type - getRankVal: function(authorship) { + getRankStrVal: function(authorship) { return $(authorship).children('.rank').attr('id'); }, - // Get the integer value from the authorship rank value - getRank: function(authorship) { - return this.getRankVal(authorship).split('_')[0]; + // Get the integer rank value from the authorship rank string + getRankIntVal: function(authorship) { + return parseInt(this.getRankStrVal(authorship).split('_')[0]); }, - setRankVal: function(authorship, rank) { + setRankStrVal: function(authorship, rank) { $(authorship).children('.rank').attr('id', rank); }, @@ -495,18 +521,17 @@ var addAuthorForm = { // authorName = authorLink.html(); if (status === 'success') { - + // Both these cases can be replaced by calling a reorder. And we could + // do away with the position span altogether in that case. if (nextAuthorships.length) { // Reset the position value of each succeeding authorship nextAuthorships.each(function() { - //var pos = parseInt($(this).children('.position').attr('id')); - //$(this).children('.position').attr('id', pos-1); var pos = addAuthorForm.getPosition(this); addAuthorForm.setPosition(this, pos-1); }); } else { // Removed author was last in rank: reset the rank hidden form field - rank = addAuthorForm.getRank(authorship); + rank = addAuthorForm.getRankIntVal(authorship); $('input#rank').val(rank); }