diff --git a/src/main/java/de/bps/course/nodes/cl/ChecklistEditController.java b/src/main/java/de/bps/course/nodes/cl/ChecklistEditController.java index d428752f2e11ce1a6470b507035cfdd22095cbb9..9ec31e216a6b35fb883c5a5d39f558e04d66bcb7 100644 --- a/src/main/java/de/bps/course/nodes/cl/ChecklistEditController.java +++ b/src/main/java/de/bps/course/nodes/cl/ChecklistEditController.java @@ -76,14 +76,14 @@ public class ChecklistEditController extends ActivateableTabbableDefaultControll super(ureq, wControl); this.course = course; this.courseNode = checklistCourseNode; - this.checklist = courseNode.loadOrCreateChecklist(this.course.getCourseEnvironment().getCoursePropertyManager()); + checklist = courseNode.loadOrCreateChecklist(course.getCourseEnvironment().getCoursePropertyManager()); Condition accessCondition = courseNode.getPreConditionAccess(); accessibilityCondContr = new ConditionEditController(ureq, wControl, course.getCourseEnvironment().getCourseGroupManager(), accessCondition, "accessabilityConditionForm", AssessmentHelper.getAssessableNodes(course.getEditorTreeModel(), courseNode), euce); - this.listenTo(accessibilityCondContr); + listenTo(accessibilityCondContr); - editVc = this.createVelocityContainer("edit"); + editVc = createVelocityContainer("edit"); manageCheckpointsButton = LinkFactory.createButton("manage", editVc, this); checklistFormContr = ChecklistUIFactory.getInstance().createEditCheckpointsController(ureq, getWindowControl(), checklist, "cl.save", ChecklistUIFactory.comparatorTitleAsc); checklistFormContr.addControllerListener(this); @@ -156,16 +156,16 @@ public class ChecklistEditController extends ActivateableTabbableDefaultControll fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); } } else if(source == checklistFormContr && event == Event.CHANGED_EVENT) { - ChecklistManager.getInstance().saveChecklist(this.checklist); + //checklist = ChecklistManager.getInstance().saveChecklist(checklist); fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); } else if(source == manageController && event == Event.DONE_EVENT) { cmcManage.deactivate(); } else if(event == NodeEditController.NODECONFIG_CHANGED_EVENT) { // update title and description according to the course node - Checklist cl = ChecklistManager.getInstance().loadChecklist(this.checklist); - cl.setTitle(this.courseNode.getShortTitle()); - cl.setDescription(this.courseNode.getLongTitle()); - ChecklistManager.getInstance().saveChecklist(cl); + Checklist cl = ChecklistManager.getInstance().loadChecklist(checklist); + cl.setTitle(courseNode.getShortTitle()); + cl.setDescription(courseNode.getLongTitle()); + checklist = ChecklistManager.getInstance().saveChecklist(cl); } } diff --git a/src/main/java/de/bps/olat/modules/cl/Checklist.java b/src/main/java/de/bps/olat/modules/cl/Checklist.java index a9e1a65f02f49b958649883d9149b5a2b9ad3437..a96205dea65f26c48acefb0a583a3f3d78040a4c 100644 --- a/src/main/java/de/bps/olat/modules/cl/Checklist.java +++ b/src/main/java/de/bps/olat/modules/cl/Checklist.java @@ -71,6 +71,17 @@ public class Checklist extends PersistentObject implements ModifiedInfo, Seriali return description; } + public Checkpoint getCheckpoint(Checkpoint cl) { + if(checkpoints != null) { + for(Checkpoint checkpoint:checkpoints) { + if(checkpoint.equals(cl)) { + return checkpoint; + } + } + } + return null; + } + /** * @return Returns the checkpoints. */ @@ -127,7 +138,7 @@ public class Checklist extends PersistentObject implements ModifiedInfo, Seriali * @param checkpoint */ public void addCheckpoint(int index, Checkpoint checkpoint) { - this.checkpoints.add(index, checkpoint); + checkpoints.add(index, checkpoint); } /** @@ -135,7 +146,7 @@ public class Checklist extends PersistentObject implements ModifiedInfo, Seriali * @param checkpoint */ public void removeCheckpoint(Checkpoint checkpoint) { - this.checkpoints.remove(checkpoint); + checkpoints.remove(checkpoint); } /** diff --git a/src/main/java/de/bps/olat/modules/cl/ChecklistEditCheckpointsController.java b/src/main/java/de/bps/olat/modules/cl/ChecklistEditCheckpointsController.java index 41a393be20bab1022a3b70af19f9eafc13d392cf..5a062889b4caf732ac1aae5dc38a4b852e806a6b 100644 --- a/src/main/java/de/bps/olat/modules/cl/ChecklistEditCheckpointsController.java +++ b/src/main/java/de/bps/olat/modules/cl/ChecklistEditCheckpointsController.java @@ -22,6 +22,7 @@ package de.bps.olat.modules.cl; import java.util.ArrayList; import java.util.Date; +import org.olat.core.commons.persistence.DBFactory; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; @@ -66,24 +67,27 @@ public class ChecklistEditCheckpointsController extends FormBasicController { // helpers private boolean deletedOK = true; + + private final ChecklistManager checklistManager; public ChecklistEditCheckpointsController(UserRequest ureq, WindowControl wControl, Checklist checklist, String submitKey, CheckpointComparator checkpointComparator) { super(ureq, wControl); this.checklist = checklist; this.submitKey = submitKey; + checklistManager = ChecklistManager.getInstance(); if (checkpointComparator != null) { this.checkpointComparator = checkpointComparator; } int size = checklist.getCheckpoints().size(); - this.titleInputList = new ArrayList<TextElement>(size); - this.descriptionInputList = new ArrayList<TextElement>(size); - this.modeInputList = new ArrayList<SingleSelection>(size); - this.delButtonList = new ArrayList<FormLink>(size); + titleInputList = new ArrayList<TextElement>(size); + descriptionInputList = new ArrayList<TextElement>(size); + modeInputList = new ArrayList<SingleSelection>(size); + delButtonList = new ArrayList<FormLink>(size); - initForm(this.flc, this, ureq); + initForm(ureq); } /** @@ -96,15 +100,30 @@ public class ChecklistEditCheckpointsController extends FormBasicController { @Override protected void formOK(UserRequest ureq) { - for (int i = 0; i < this.checklist.getCheckpoints().size(); i++) { - Checkpoint checkpoint = this.checklist.getCheckpoints().get(i); - checkpoint.setChecklist(this.checklist); - checkpoint.setLastModified(new Date()); - checkpoint.setTitle(this.titleInputList.get(i).getValue()); - checkpoint.setDescription(this.descriptionInputList.get(i).getValue()); - checkpoint.setMode(this.modeInputList.get(i).getSelectedKey()); + checklist = checklistManager.loadChecklist(checklist); + for (int i = 0; i < titleInputList.size(); i++) { + boolean deleted = ! titleInputList.get(i).isVisible(); + Checkpoint checkpoint = (Checkpoint)titleInputList.get(i).getUserObject(); + if(deleted) { + Checkpoint currentCheckpoint = checklist.getCheckpoint(checkpoint); + checklist.removeCheckpoint(currentCheckpoint); + } else { + Checkpoint currentCheckpoint = checklist.getCheckpoint(checkpoint); + if(currentCheckpoint == null) { + currentCheckpoint = checkpoint;//the point is a new one + } + currentCheckpoint.setChecklist(checklist); + currentCheckpoint.setLastModified(new Date()); + currentCheckpoint.setTitle(titleInputList.get(i).getValue()); + currentCheckpoint.setDescription(descriptionInputList.get(i).getValue()); + currentCheckpoint.setMode(modeInputList.get(i).getSelectedKey()); + if(currentCheckpoint.getKey() == null) { + checklist.addCheckpoint(i, currentCheckpoint); + } + } } - ChecklistManager.getInstance().updateChecklist(this.checklist); + checklist = checklistManager.updateChecklist(checklist); + DBFactory.getInstance().commit(); // Inform all listeners about the changes fireEvent(ureq, Event.CHANGED_EVENT); } @@ -156,13 +175,13 @@ public class ChecklistEditCheckpointsController extends FormBasicController { if (addButton.equals(source)) { // add a new form link Checkpoint newCheckpoint = new Checkpoint(); - newCheckpoint.setChecklist(this.checklist); + newCheckpoint.setChecklist(checklist); newCheckpoint.setLastModified(new Date()); newCheckpoint.setTitle(""); newCheckpoint.setDescription(""); newCheckpoint.setMode(CheckpointMode.MODE_EDITABLE); - int index = this.checklist.getCheckpoints().size(); - this.checklist.addCheckpoint(index, newCheckpoint); + int index = checklist.getCheckpoints().size(); + checklist.addCheckpoint(index, newCheckpoint); addNewFormCheckpoint(index, newCheckpoint); } else if (delButtonList.contains(source)) { // special case: only one line existent @@ -181,32 +200,11 @@ public class ChecklistEditCheckpointsController extends FormBasicController { } private void removeFormLink(Checkpoint checkpoint) { - checklist.removeCheckpoint(checkpoint); - int i; - for (i = 0; i < titleInputList.size(); i++) { + for (int i = 0; i < titleInputList.size(); i++) { if (titleInputList.get(i).getUserObject().equals(checkpoint)) { - break; - } - } - titleContainer.remove(titleInputList.remove(i)); - for (i = 0; i < descriptionInputList.size(); i++) { - if (descriptionInputList.get(i).getUserObject().equals(checkpoint)) { - break; - } - } - titleContainer.remove(descriptionInputList.remove(i)); - for (i = 0; i < modeInputList.size(); i++) { - if (modeInputList.get(i).getUserObject().equals(checkpoint)) { - break; - } - } - titleContainer.remove(modeInputList.remove(i)); - for (i = 0; i < delButtonList.size(); i++) { - if (delButtonList.get(i).getUserObject().equals(checkpoint)) { - break; + titleInputList.get(i).setVisible(false); } } - titleContainer.remove(delButtonList.remove(i)); } @Override @@ -224,7 +222,7 @@ public class ChecklistEditCheckpointsController extends FormBasicController { newCheckpoint.setTitle(""); newCheckpoint.setDescription(""); newCheckpoint.setMode(CheckpointMode.MODE_EDITABLE); - this.checklist.addCheckpoint(0, newCheckpoint); + checklist.addCheckpoint(0, newCheckpoint); addNewFormCheckpoint(0, newCheckpoint); } else { for (int i = 0; i < checklist.getCheckpoints().size(); i++) { @@ -293,7 +291,7 @@ public class ChecklistEditCheckpointsController extends FormBasicController { this.modeInputList = new ArrayList<SingleSelection>(size); this.delButtonList = new ArrayList<FormLink>(size); mainForm.setDirtyMarking(false); - initForm(this.flc, this, ureq); + initForm(flc, this, ureq); fireEvent(ureq, Event.CANCELLED_EVENT); } diff --git a/src/main/java/de/bps/olat/modules/cl/ChecklistManageCheckpointsController.java b/src/main/java/de/bps/olat/modules/cl/ChecklistManageCheckpointsController.java index 66e52b7c58c272c833638d5f809afa826dfff2fd..1c9364342305705b9866e4a0ac8429c57455a072 100644 --- a/src/main/java/de/bps/olat/modules/cl/ChecklistManageCheckpointsController.java +++ b/src/main/java/de/bps/olat/modules/cl/ChecklistManageCheckpointsController.java @@ -293,12 +293,12 @@ public class ChecklistManageCheckpointsController extends BasicController { } private void loadData() { - this.checklist = ChecklistManager.getInstance().loadChecklist(checklist); + checklist = ChecklistManager.getInstance().loadChecklist(checklist); } private void updateCheckpointsFor(Identity identity, BitSet selection) { ChecklistManager manager = ChecklistManager.getInstance(); - int size = this.checklist.getCheckpoints().size(); + int size = checklist.getCheckpoints().size(); for(int i = 0; i < size; i++) { Checkpoint checkpoint = this.checklist.getCheckpoints().get(i); Boolean selected = checkpoint.getSelectionFor(identity); diff --git a/src/main/java/de/bps/olat/modules/cl/ChecklistManager.java b/src/main/java/de/bps/olat/modules/cl/ChecklistManager.java index 2bfe56c8da012f203424b4ded581365c54681167..c0441d85f05f711fcd6e015a991b0accfe9af2f9 100644 --- a/src/main/java/de/bps/olat/modules/cl/ChecklistManager.java +++ b/src/main/java/de/bps/olat/modules/cl/ChecklistManager.java @@ -27,6 +27,7 @@ import org.olat.core.commons.persistence.DB; import org.olat.core.commons.persistence.DBFactory; import org.olat.core.id.OLATResourceable; import org.olat.core.util.coordinate.CoordinatorManager; +import org.olat.core.util.coordinate.SyncerCallback; import org.olat.core.util.coordinate.SyncerExecutor; import org.olat.core.util.resource.OresHelper; @@ -92,21 +93,21 @@ public class ChecklistManager { * Save new checklist. * @param checklist */ - public void saveChecklist(Checklist cl) { + public Checklist saveChecklist(Checklist cl) { cl.setLastModified(new Date()); - DBFactory.getInstance().saveObject(cl); + return DBFactory.getInstance().getCurrentEntityManager().merge(cl); } /** * Update checklist. * @param checklist */ - public void updateChecklist(final Checklist cl) { + public Checklist updateChecklist(final Checklist cl) { OLATResourceable ores = OresHelper.createOLATResourceableInstance(Checklist.class, cl.getKey()); - CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(ores, new SyncerExecutor() { - public void execute() { + return CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(ores, new SyncerCallback<Checklist>() { + public Checklist execute() { cl.setLastModified(new Date()); - DBFactory.getInstance().updateObject(cl); + return DBFactory.getInstance().getCurrentEntityManager().merge(cl); } }); } diff --git a/src/main/java/de/bps/olat/modules/cl/Checkpoint.java b/src/main/java/de/bps/olat/modules/cl/Checkpoint.java index 1a3ce6ee563f9c1cb7e8230ca73b95263ba2b9ed..75cad7a148cfe2469a9260eb6874e0fed449f401 100644 --- a/src/main/java/de/bps/olat/modules/cl/Checkpoint.java +++ b/src/main/java/de/bps/olat/modules/cl/Checkpoint.java @@ -182,5 +182,21 @@ public class Checkpoint extends PersistentObject implements ModifiedInfo, Serial result.setCheckpoint(this); getResults().add(result); } + + @Override + public int hashCode() { + return getKey() == null ? -34892 : getKey().hashCode(); + } + @Override + public boolean equals(Object obj) { + if(this == obj) { + return true; + } + if(obj instanceof Checkpoint) { + Checkpoint entry = (Checkpoint)obj; + return getKey() != null && getKey().equals(entry.getKey()); + } + return false; + } } diff --git a/src/main/java/de/bps/olat/modules/cl/_content/edit.html b/src/main/java/de/bps/olat/modules/cl/_content/edit.html index 8d5a55a3f870e0d91f8461807e217af48fdd5597..5ca4d24678cb825678f31eef065c44a66d5fbdb0 100644 --- a/src/main/java/de/bps/olat/modules/cl/_content/edit.html +++ b/src/main/java/de/bps/olat/modules/cl/_content/edit.html @@ -12,16 +12,18 @@ #set( $descr = $descriptionInputList.get($iter).getName() ) #set( $descrErr = $descr + "_ERROR" ) #set( $hasError = "false" ) - <tr> - <td>$r.render($titleErr)</td> - <td>$r.render($titleInputList.get($iter).getName())</td> - <td>$r.render($descriptionInputList.get($iter).getName())</td> - <td>$r.render($modeInputList.get($iter).getName())</td> - <!-- IE7-compatibility --> - <td style="white-space: nowrap; "> - $r.render($delButtonList.get($iter).getName()) - </td> - </tr> + #if($titleInputList.get($iter).visible) + <tr> + <td>$r.render($titleErr)</td> + <td>$r.render($titleInputList.get($iter).getName())</td> + <td>$r.render($descriptionInputList.get($iter).getName())</td> + <td>$r.render($modeInputList.get($iter).getName())</td> + <!-- IE7-compatibility --> + <td style="white-space: nowrap; "> + $r.render($delButtonList.get($iter).getName()) + </td> + </tr> + #end #end <tr> <td colspan="4"></td>