Index: lams_central/src/java/org/lamsfoundation/lams/web/qb/QbCollectionController.java =================================================================== diff -u -rd5719555b4c16102968655a9e2d2edce72296fa9 -r730a7378ea82a88512217331afdbd1f0f0346d61 --- lams_central/src/java/org/lamsfoundation/lams/web/qb/QbCollectionController.java (.../QbCollectionController.java) (revision d5719555b4c16102968655a9e2d2edce72296fa9) +++ lams_central/src/java/org/lamsfoundation/lams/web/qb/QbCollectionController.java (.../QbCollectionController.java) (revision 730a7378ea82a88512217331afdbd1f0f0346d61) @@ -166,7 +166,7 @@ for (int index = 0; index < excludedJSON.size(); index++) { excludedSet.add(excludedJSON.get(index).asLong()); } - qbService.removeCollectionQuestion(collectionUid, excludedSet); + qbService.removeQuestionFromCollection(collectionUid, excludedSet); } } @@ -176,6 +176,26 @@ qbService.addCollection(getUserId(), name); } + @RequestMapping("/addCollectionQuestions") + @ResponseBody + public void addllectionQuestions(@RequestParam long sourceCollectionUid, @RequestParam long targetCollectionUid, + @RequestParam boolean copy, @RequestParam String included, @RequestParam String excluded) + throws IOException { + if (StringUtils.isBlank(excluded)) { + ArrayNode includedJSON = JsonUtil.readArray(included); + for (int index = 0; index < includedJSON.size(); index++) { + qbService.addQuestionToCollection(targetCollectionUid, includedJSON.get(index).asLong()); + } + } else { + ArrayNode excludedJSON = JsonUtil.readArray(excluded); + Set excludedSet = new HashSet<>(); + for (int index = 0; index < excludedJSON.size(); index++) { + excludedSet.add(excludedJSON.get(index).asLong()); + } + qbService.addQuestionToCollection(sourceCollectionUid, targetCollectionUid, excludedSet); + } + } + private Integer getUserId() { HttpSession ss = SessionManager.getSession(); UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); Index: lams_central/web/qb/collection.jsp =================================================================== diff -u -rd5719555b4c16102968655a9e2d2edce72296fa9 -r730a7378ea82a88512217331afdbd1f0f0346d61 --- lams_central/web/qb/collection.jsp (.../collection.jsp) (revision d5719555b4c16102968655a9e2d2edce72296fa9) +++ lams_central/web/qb/collection.jsp (.../collection.jsp) (revision 730a7378ea82a88512217331afdbd1f0f0346d61) @@ -22,14 +22,25 @@ } #addCollectionDiv input { - display: inline; width: 80%; margin-right: 10px; } #addCollectionDiv button { float: right; } + + .form-control { + display: inline; + } + + .targetCollectionSelect { + width: 300px; + } + + .targetCollectionDiv { + float: right; + } @@ -202,6 +213,29 @@ }); } } + + function addCollectionQuestions(button, copy) { + var grid = $(button).closest('.buttons').siblings(".ui-jqgrid").find('.collection-grid'), + sourceCollectionUid = grid.data('collectionUid'), + targetCollectionUid = $(button).closest('.panel-body').find('.targetCollectionSelect').val(), + included = grid.data('included'), + excluded = grid.data('excluded'); + $.ajax({ + 'url' : 'qb/collection/addCollectionQuestions.do', + 'type' : 'POST', + 'dataType' : 'text', + 'data' : { + 'sourceCollectionUid' : sourceCollectionUid, + 'targetCollectionUid' : targetCollectionUid, + 'copy' : copy, + 'included' : included ? JSON.stringify(included) : null, + 'excluded' : excluded ? JSON.stringify(excluded) : null + }, + 'cache' : false + }).done(function(){ + $('.collection-grid[data-collection-uid="' + targetCollectionUid + '"]').trigger('reloadGrid'); + }); + } @@ -210,7 +244,23 @@
- + +
+ Transfer questions to + + + +
Index: lams_common/src/java/org/lamsfoundation/lams/qb/dao/IQbDAO.java =================================================================== diff -u -r399b35bc9ee55acf1d64596c09b96fe5aee73709 -r730a7378ea82a88512217331afdbd1f0f0346d61 --- lams_common/src/java/org/lamsfoundation/lams/qb/dao/IQbDAO.java (.../IQbDAO.java) (revision 399b35bc9ee55acf1d64596c09b96fe5aee73709) +++ lams_common/src/java/org/lamsfoundation/lams/qb/dao/IQbDAO.java (.../IQbDAO.java) (revision 730a7378ea82a88512217331afdbd1f0f0346d61) @@ -3,6 +3,7 @@ import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Set; import org.lamsfoundation.lams.dao.IBaseDAO; import org.lamsfoundation.lams.learningdesign.ToolActivity; @@ -53,6 +54,6 @@ void addCollectionQuestion(long collectionUid, long qbQuestionUid); void removeCollectionQuestion(long collectionUid, long qbQuestionUid); - - void removeCollectionQuestion(long collectionUid, Collection qbQuestionUids); + + Set getCollectionQuestionUidsExcluded(long collectionUid, Collection qbQuestionUids); } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/qb/dao/hibernate/QbDAO.java =================================================================== diff -u -r399b35bc9ee55acf1d64596c09b96fe5aee73709 -r730a7378ea82a88512217331afdbd1f0f0346d61 --- lams_common/src/java/org/lamsfoundation/lams/qb/dao/hibernate/QbDAO.java (.../QbDAO.java) (revision 399b35bc9ee55acf1d64596c09b96fe5aee73709) +++ lams_common/src/java/org/lamsfoundation/lams/qb/dao/hibernate/QbDAO.java (.../QbDAO.java) (revision 730a7378ea82a88512217331afdbd1f0f0346d61) @@ -3,9 +3,11 @@ import java.math.BigInteger; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; import javax.persistence.Query; @@ -54,11 +56,15 @@ private static final String ADD_COLLECTION_QUESTION = "INSERT INTO lams_qb_collection_question VALUES (:collectionUid, :qbQuestionUid)"; - private static final String REMOVE_COLLECTION_QUESTION = "DELETE FROM lams_qb_collection_question WHERE collection_uid = :collectionUid AND qb_question_uid = :qbQuestionUid"; + private static final String EXISTS_COLLECTION_QUESTION = "SELECT 1 FROM lams_qb_collection_question WHERE collection_uid = :collectionUid " + + "AND qb_question_uid = :qbQuestionUid"; - private static final String REMOVE_COLLECTION_QUESTION_EXCLUDED = "DELETE FROM lams_qb_collection_question WHERE collection_uid = :collectionUid " - + "AND qb_question_uid NOT IN :qbQuestionUids"; + private static final String REMOVE_COLLECTION_QUESTION = "DELETE FROM lams_qb_collection_question WHERE collection_uid = :collectionUid " + + "AND qb_question_uid = :qbQuestionUid"; + private static final String FIND_COLLECTION_QUESTIONS_EXCLUDED = "SELECT qb_question_uid FROM lams_qb_collection_question " + + "WHERE collection_uid = :collectionUid AND qb_question_uid NOT IN :qbQuestionUids"; + @Override public QbQuestion getQbQuestionByUid(Long qbQuestionUid) { return (QbQuestion) this.find(QbQuestion.class, qbQuestionUid); @@ -254,8 +260,10 @@ @Override public void addCollectionQuestion(long collectionUid, long qbQuestionUid) { - getSession().createNativeQuery(ADD_COLLECTION_QUESTION).setParameter("collectionUid", collectionUid) - .setParameter("qbQuestionUid", qbQuestionUid).executeUpdate(); + if (!questionInCollectionExists(collectionUid, qbQuestionUid)) { + getSession().createNativeQuery(ADD_COLLECTION_QUESTION).setParameter("collectionUid", collectionUid) + .setParameter("qbQuestionUid", qbQuestionUid).executeUpdate(); + } } @Override @@ -264,12 +272,24 @@ .setParameter("qbQuestionUid", qbQuestionUid).executeUpdate(); } + @SuppressWarnings("unchecked") @Override - public void removeCollectionQuestion(long collectionUid, Collection qbQuestionUids) { - getSession().createNativeQuery(REMOVE_COLLECTION_QUESTION_EXCLUDED).setParameter("collectionUid", collectionUid) - .setParameterList("qbQuestionUids", qbQuestionUids).executeUpdate(); + public Set getCollectionQuestionUidsExcluded(long collectionUid, Collection qbQuestionUids) { + List queryResult = getSession().createNativeQuery(FIND_COLLECTION_QUESTIONS_EXCLUDED) + .setParameter("collectionUid", collectionUid).setParameterList("qbQuestionUids", qbQuestionUids) + .getResultList(); + Set result = new HashSet<>(); + for (BigInteger uid : queryResult) { + result.add(uid.longValue()); + } + return result; } + private boolean questionInCollectionExists(long collectionUid, long qbQuestionUid) { + return !getSession().createNativeQuery(EXISTS_COLLECTION_QUESTION).setParameter("collectionUid", collectionUid) + .setParameter("qbQuestionUid", qbQuestionUid).getResultList().isEmpty(); + } + private Query prepareCollectionQuestionsQuery(long collectionUid, String orderBy, String orderDirection, String search, boolean isCount) { StringBuilder queryBuilder = new StringBuilder(FIND_COLLECTION_QUESTIONS); Index: lams_common/src/java/org/lamsfoundation/lams/qb/service/IQbService.java =================================================================== diff -u -r399b35bc9ee55acf1d64596c09b96fe5aee73709 -r730a7378ea82a88512217331afdbd1f0f0346d61 --- lams_common/src/java/org/lamsfoundation/lams/qb/service/IQbService.java (.../IQbService.java) (revision 399b35bc9ee55acf1d64596c09b96fe5aee73709) +++ lams_common/src/java/org/lamsfoundation/lams/qb/service/IQbService.java (.../IQbService.java) (revision 730a7378ea82a88512217331afdbd1f0f0346d61) @@ -76,7 +76,10 @@ void addQuestionToCollection(long collectionUid, long qbQuestionUid); + void addQuestionToCollection(long sourceCollectionUid, long targetCollectionUid, + Collection excludedQbQuestionUids); + void removeQuestionFromCollection(long collectionUid, long qbQuestionUid); - void removeCollectionQuestion(long collectionUid, Collection qbQuestionUids); + void removeQuestionFromCollection(long collectionUid, Collection excludedQbQuestionUids); } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/qb/service/QbService.java =================================================================== diff -u -r399b35bc9ee55acf1d64596c09b96fe5aee73709 -r730a7378ea82a88512217331afdbd1f0f0346d61 --- lams_common/src/java/org/lamsfoundation/lams/qb/service/QbService.java (.../QbService.java) (revision 399b35bc9ee55acf1d64596c09b96fe5aee73709) +++ lams_common/src/java/org/lamsfoundation/lams/qb/service/QbService.java (.../QbService.java) (revision 730a7378ea82a88512217331afdbd1f0f0346d61) @@ -325,13 +325,26 @@ } @Override + public void addQuestionToCollection(long sourceCollectionUid, long targetCollectionUid, + Collection excludedQbQuestionUids) { + Collection includedUids = qbDAO.getCollectionQuestionUidsExcluded(sourceCollectionUid, + excludedQbQuestionUids); + for (Long uid : includedUids) { + addQuestionToCollection(targetCollectionUid, uid); + } + } + + @Override public void removeQuestionFromCollection(long collectionUid, long qbQuestionUid) { qbDAO.removeCollectionQuestion(collectionUid, qbQuestionUid); } @Override - public void removeCollectionQuestion(long collectionUid, Collection qbQuestionUids) { - qbDAO.removeCollectionQuestion(collectionUid, qbQuestionUids); + public void removeQuestionFromCollection(long collectionUid, Collection excludedQbQuestionUids) { + Collection includedUids = qbDAO.getCollectionQuestionUidsExcluded(collectionUid, excludedQbQuestionUids); + for (Long uid : includedUids) { + qbDAO.removeCollectionQuestion(collectionUid, uid); + } } public void setQbDAO(IQbDAO qbDAO) {