diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java index 8175849286c6e21c8211cc13e2c6bd4a7f45aead..2545f5af5c2fc1c6d8cfb11b160d6939a9f81d94 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java @@ -589,6 +589,24 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle } } } + + // allSelectedIndex is a flag which is not updated if someone + // deselect a row. check if the num of selected rows is equal + // to the number of loaded rows + if(allSelectedIndex) { + int manuallySelectedRows = multiSelectedIndex.size(); + int modelCount = dataModel.getRowCount(); + int loadedRows = 0; + for(int i=0; i<modelCount; i++) { + if(dataModel.isRowLoaded(i)) { + loadedRows++; + } + } + + if(manuallySelectedRows != loadedRows) { + allSelectedIndex = false; + } + } } @Override diff --git a/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java b/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java index 2e8f10a67c416dfe86a6bfed9b7ac8060eb31b46..3023f5a8233a08d7efd6b109e1c80d96d6b84b86 100644 --- a/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java +++ b/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java @@ -339,6 +339,7 @@ public class QuestionListController extends AbstractItemListController implement } else if(source == bulkChangeCtrl) { if(event == Event.DONE_EVENT || event == Event.CHANGED_EVENT) { updateRows(bulkChangeCtrl.getUpdatedItems()); + fireEvent(ureq, new QPoolEvent(QPoolEvent.BULK_CHANGE)); } cmc.deactivate(); cleanUp(); @@ -371,6 +372,11 @@ public class QuestionListController extends AbstractItemListController implement } else if("next".equals(qce.getCommand())) { doNext(ureq, qce.getItem()); } + } else if (event instanceof QPoolEvent) { + QPoolEvent qce = (QPoolEvent)event; + if(QPoolEvent.ITEM_DELETED.equals(qce.getCommand())) { + fireEvent(ureq, qce); + } } } else if(source == addController) { if(event instanceof EntryChangedEvent) { @@ -610,6 +616,7 @@ public class QuestionListController extends AbstractItemListController implement listenTo(cmc); cmc.activate(); } + private void doExportToRepositoryEntry(UserRequest ureq, Long repoEntryKey) { RepositoryEntry re = repositoryManager.lookupRepositoryEntry(repoEntryKey, false); if(re != null) { @@ -619,8 +626,8 @@ public class QuestionListController extends AbstractItemListController implement } private void doCreateCollection(UserRequest ureq, String name, List<QuestionItemShort> items) { - qpoolService.createCollection(getIdentity(), name, items); - fireEvent(ureq, new QPoolEvent(QPoolEvent.COLL_CREATED)); + QuestionItemCollection coll = qpoolService.createCollection(getIdentity(), name, items); + fireEvent(ureq, new QPoolEvent(QPoolEvent.COLL_CREATED, coll.getKey())); } private void doChooseAuthoren(UserRequest ureq, List<QuestionItemShort> items) { @@ -700,7 +707,7 @@ public class QuestionListController extends AbstractItemListController implement private void doRenameItemCollection(UserRequest ureq, String newName) { itemCollection = qpoolService.renameCollection(itemCollection, newName); - fireEvent(ureq, new QPoolEvent(QPoolEvent.COLL_CHANGED)); + fireEvent(ureq, new QPoolEvent(QPoolEvent.COLL_CHANGED, itemCollection.getKey())); } private void doConfirmDeleteSource(UserRequest ureq) { diff --git a/src/main/java/org/olat/modules/qpool/ui/QuestionPoolMainEditorController.java b/src/main/java/org/olat/modules/qpool/ui/QuestionPoolMainEditorController.java index 3aa8c34a31738ef05a5759d85c6f65a9b4f379e9..367090da7c1b8f9b83f4de19a6eff7857295258e 100644 --- a/src/main/java/org/olat/modules/qpool/ui/QuestionPoolMainEditorController.java +++ b/src/main/java/org/olat/modules/qpool/ui/QuestionPoolMainEditorController.java @@ -45,9 +45,11 @@ import org.olat.core.gui.control.generic.dtabs.Activateable2; import org.olat.core.gui.control.generic.modal.DialogBoxController; import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; import org.olat.core.id.OLATResourceable; +import org.olat.core.id.Persistable; import org.olat.core.id.Roles; import org.olat.core.id.context.ContextEntry; import org.olat.core.id.context.StateEntry; +import org.olat.core.util.nodes.INode; import org.olat.core.util.resource.OresHelper; import org.olat.core.util.tree.TreeHelper; import org.olat.group.BusinessGroup; @@ -82,8 +84,7 @@ public class QuestionPoolMainEditorController extends BasicController implements public static final OLATResourceable QITEM_MARKED = OresHelper.createOLATResourceableType("QItemMark"); private final MenuTree menuTree; - private GenericTreeNode sharesNode, myNode; - + private GenericTreeNode sharesNode, myNode, myOwnNode; private final Panel content; private StackedController stackPanel; @@ -207,13 +208,18 @@ public class QuestionPoolMainEditorController extends BasicController implements } else if(QPoolEvent.COLL_CREATED.equals(event.getCommand()) || QPoolEvent.COLL_CHANGED.equals(event.getCommand())) { buildMySubTreeModel(myNode); + Long collKey = ((QPoolEvent)event).getObjectKey(); + GenericTreeNode nodeToSelect = findNodeByPersistableUserObject(myNode, collKey); + if(nodeToSelect != null) { + menuTree.setSelectedNode(nodeToSelect); + QuestionItemCollection coll = (QuestionItemCollection)nodeToSelect.getUserObject(); + doSelectCollection(ureq, coll, nodeToSelect, null, null); + } menuTree.setDirty(true); } else if(QPoolEvent.COLL_DELETED.equals(event.getCommand())) { buildMySubTreeModel(myNode); - menuTree.setDirty(true); - menuTree.setSelectedNode(myNode); - currentCtrl = null; - content.popContent(); + menuTree.setSelectedNode(myOwnNode); + doSelectMyQuestions(ureq, null, null); } else if(QPoolEvent.POOL_CREATED.equals(event.getCommand()) || QPoolEvent.POOL_DELETED.equals(event.getCommand())) { buildShareSubTreeModel(sharesNode); @@ -552,11 +558,11 @@ public class QuestionPoolMainEditorController extends BasicController implements private void buildMySubTreeModel(GenericTreeNode parentNode) { parentNode.removeAllChildren(); - GenericTreeNode node = new GenericTreeNode(translate("menu.database.my"), "My"); - node.setIconCssClass("o_sel_qpool_my_items"); - parentNode.addChild(node); + myOwnNode = new GenericTreeNode(translate("menu.database.my"), "My"); + myOwnNode.setIconCssClass("o_sel_qpool_my_items"); + parentNode.addChild(myOwnNode); - node = new GenericTreeNode(translate("menu.database.favorit"), "Marked"); + GenericTreeNode node = new GenericTreeNode(translate("menu.database.favorit"), "Marked"); node.setIconCssClass("o_sel_qpool_favorits"); parentNode.addChild(node); @@ -568,6 +574,28 @@ public class QuestionPoolMainEditorController extends BasicController implements } } + private GenericTreeNode findNodeByPersistableUserObject(GenericTreeNode parentNode, Long id) { + if(parentNode == null || id == null) { + return null; + } + + for(int i=parentNode.getChildCount(); i-->0; ) { + INode node = parentNode.getChildAt(i); + if(node instanceof GenericTreeNode) { + GenericTreeNode treeNode = (GenericTreeNode)node; + Object userObj = treeNode.getUserObject(); + if(userObj instanceof Persistable) { + Persistable obj = (Persistable)userObj; + if(id.equals(obj.getKey())) { + return treeNode; + } + } + } + } + return null; + } + + private static class ControlledTreeNode extends GenericTreeNode { private static final long serialVersionUID = 768640290449143804L; private QuestionsController controller; diff --git a/src/main/java/org/olat/modules/qpool/ui/QuestionsController.java b/src/main/java/org/olat/modules/qpool/ui/QuestionsController.java index e321474715a8a7468ecb0b52318ff74953f7f92b..6fb5e7fa10c7d847917c4243777dc012a6664644 100644 --- a/src/main/java/org/olat/modules/qpool/ui/QuestionsController.java +++ b/src/main/java/org/olat/modules/qpool/ui/QuestionsController.java @@ -176,6 +176,12 @@ public class QuestionsController extends BasicController implements Activateable QuestionItemView item = se.getItem(); doUpdateDetails(ureq, item); } else if(event instanceof QPoolEvent) { + if(QPoolEvent.BULK_CHANGE.equals(event.getCommand())) { + updateSelectAfterChange(ureq); + } else if(QPoolEvent.ITEM_DELETED.equals(event.getCommand())) { + postDelete(ureq); + stackPanel.popUpToRootController(ureq); + } fireEvent(ureq, event); } } else if(source == confirmDeleteBox) { @@ -196,6 +202,16 @@ public class QuestionsController extends BasicController implements Activateable super.event(ureq, source, event); } + protected void updateSelectAfterChange(UserRequest ureq) { + QuestionItem item = previewCtrl.getItem(); + Collection<Long> key = Collections.singletonList(item.getKey()); + List<QuestionItemView> items = source.getItems(key); + if(items.size() > 0) { + QuestionItemView itemView = items.get(0); + doUpdateDetails(ureq, itemView); + } + } + protected void doSelect(UserRequest ureq, QuestionItem item, boolean editable) { listCtrl.doSelect(ureq, item, editable); } diff --git a/src/main/java/org/olat/modules/qpool/ui/events/QPoolEvent.java b/src/main/java/org/olat/modules/qpool/ui/events/QPoolEvent.java index 9d5b8cfa61135aea8c8c02a6fb54890b3667271e..e061562035f9f4b8eeea809e466b2419189b295d 100644 --- a/src/main/java/org/olat/modules/qpool/ui/events/QPoolEvent.java +++ b/src/main/java/org/olat/modules/qpool/ui/events/QPoolEvent.java @@ -39,11 +39,25 @@ public class QPoolEvent extends MultiUserEvent { public static final String COLL_CHANGED = "qpoll-coll-changed"; public static final String POOL_CREATED = "qpool-pool-created"; public static final String POOL_DELETED = "qpool-pool-deleted"; + public static final String BULK_CHANGE = "qpool-bulk-change"; public static final String EDIT = "edit"; + private Long objectKey; public QPoolEvent(String cmd) { super(cmd); } + + public QPoolEvent(String cmd, Long objectKey) { + super(cmd); + this.objectKey = objectKey; + } + public Long getObjectKey() { + return objectKey; + } + + public void setObjectKey(Long objectKey) { + this.objectKey = objectKey; + } }