diff --git a/src/main/java/org/olat/modules/forms/ui/RubricEditorController.java b/src/main/java/org/olat/modules/forms/ui/RubricEditorController.java index a9cdbf2514619bfef5295706821bb394bdee0c5c..d333eabcdaeee3a917c9d1d59dbebb62131d15b4 100644 --- a/src/main/java/org/olat/modules/forms/ui/RubricEditorController.java +++ b/src/main/java/org/olat/modules/forms/ui/RubricEditorController.java @@ -24,13 +24,11 @@ import static org.olat.modules.forms.ui.EvaluationFormFormatter.oneDecimal; import java.util.ArrayList; import java.util.Collection; -import java.util.Iterator; import java.util.List; import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; import org.olat.core.gui.UserRequest; -import org.olat.core.gui.components.Component; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.FormLink; @@ -44,12 +42,7 @@ import org.olat.core.gui.components.form.flexible.impl.FormEvent; import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; import org.olat.core.gui.components.form.flexible.impl.elements.richText.TextMode; import org.olat.core.gui.components.link.Link; -import org.olat.core.gui.components.updown.UpDown; -import org.olat.core.gui.components.updown.UpDownEvent; -import org.olat.core.gui.components.updown.UpDownEvent.Direction; -import org.olat.core.gui.components.updown.UpDownFactory; import org.olat.core.gui.control.Controller; -import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.util.CodeHelper; import org.olat.core.util.StringHelper; @@ -143,7 +136,9 @@ public class RubricEditorController extends FormBasicController implements PageE rubricCtrl = new RubricController(ureq, getWindowControl(), rubric, mainForm); listenTo(rubricCtrl); formLayout.add("rubric", rubricCtrl.getInitialFormItem()); - + } + + private void initEditForm(FormItemContainer formLayout) { settingsLayout = FormLayoutContainer.createDefaultFormLayout("settings", getTranslator()); settingsLayout.setRootForm(mainForm); formLayout.add("settings", settingsLayout); @@ -310,6 +305,7 @@ public class RubricEditorController extends FormBasicController implements PageE updateTypeSettings(); updateSteps(); + sliders.clear(); for(Slider slider:rubric.getSliders()) { SliderRow row = forgeSliderRow(slider); sliders.add(row); @@ -500,7 +496,21 @@ public class RubricEditorController extends FormBasicController implements PageE weightEl.setEnabled(!restrictedEditWeight); SliderRow row = new SliderRow(slider, startLabelEl, endLabelEl, weightEl, createSliderEl()); - if(!restrictedEdit) {FormLink deleteButton = uifactory.addFormLink("del." + count.incrementAndGet(), "delete_slider", "", null, flc, Link.BUTTON | Link.NONTRANSLATED); + + FormLink upButton = uifactory.addFormLink("up." + count.incrementAndGet(), "up", "", null, flc, Link.BUTTON | Link.NONTRANSLATED); + upButton.setDomReplacementWrapperRequired(false); + upButton.setIconLeftCSS("o_icon o_icon-lg o_icon_move_up"); + upButton.setUserObject(row); + row.setUpButton(upButton); + + FormLink downButton = uifactory.addFormLink("down." + count.incrementAndGet(), "down", "", null, flc, Link.BUTTON | Link.NONTRANSLATED); + downButton.setDomReplacementWrapperRequired(false); + downButton.setIconLeftCSS("o_icon o_icon-lg o_icon_move_down"); + downButton.setUserObject(row); + row.setDownButton(downButton); + + if(!restrictedEdit) { + FormLink deleteButton = uifactory.addFormLink("del." + count.incrementAndGet(), "delete_slider", "", null, flc, Link.BUTTON | Link.NONTRANSLATED); deleteButton.setDomReplacementWrapperRequired(false); deleteButton.setIconLeftCSS("o_icon o_icon-lg o_icon_delete_item"); deleteButton.setUserObject(row); @@ -508,12 +518,6 @@ public class RubricEditorController extends FormBasicController implements PageE flc.contextPut("deleteButtons", Boolean.TRUE); } - String name = "ud." + count.incrementAndGet(); - UpDown upDown = UpDownFactory.createUpDown(name, UpDown.Layout.BUTTON_HORIZONTAL, flc.getFormItemComponent(), this); - upDown.setUserObject(row); - row.setUpDown(upDown); - flc.put(name, upDown); - return row; } @@ -581,6 +585,9 @@ public class RubricEditorController extends FormBasicController implements PageE @Override public void setEditMode(boolean editMode) { this.editMode = editMode; + if (editMode) { + initEditForm(flc); + } flc.getFormItemComponent().contextPut("editMode", Boolean.valueOf(editMode)); } @@ -615,43 +622,37 @@ public class RubricEditorController extends FormBasicController implements PageE } } else if(source instanceof FormLink) { FormLink button = (FormLink)source; - if("delete_slider".equals(button.getCmd())) { + if ("up".equals(button.getCmd())) { + doMoveUp((SliderRow)button.getUserObject()); + } else if ("down".equals(button.getCmd())) { + doMoveDown((SliderRow)button.getUserObject()); + } else if ("delete_slider".equals(button.getCmd())) { doRemoveSlider((SliderRow)button.getUserObject()); } } super.formInnerEvent(ureq, source, event); } - - @Override - public void event(UserRequest ureq, Component source, Event event) { - if (event instanceof UpDownEvent) { - UpDownEvent ude = (UpDownEvent) event; - SliderRow row = (SliderRow) ude.getUserObject(); - doMove(row.getSlider(), ude.getDirection()); + + private void doMoveUp(SliderRow slideRow) { + int index = sliders.indexOf(slideRow); + if (index > -1) { + swapSliders(index - 1, index); + setUpDownVisibility(); + flc.setDirty(true); } - super.event(ureq, source, event); } - private void doMove(Slider slider, Direction direction) { - int index = rubric.getSliders().indexOf(slider); + private void doMoveDown(SliderRow slideRow) { + int index = sliders.indexOf(slideRow); if (index > -1) { - if (Direction.UP.equals(direction)) { - swapSliders(index - 1, index); - } else if (Direction.DOWN.equals(direction)) { - swapSliders(index, index + 1); - } + swapSliders(index, index + 1); setUpDownVisibility(); flc.setDirty(true); } } - + private void swapSliders(int i, int j) { - List<Slider> rubricSliders = rubric.getSliders(); - if(i >= 0 && j >= 0 && i < rubricSliders.size() && j < rubricSliders.size()) { - Slider tempRubricSlider = rubricSliders.get(i); - rubricSliders.set(i, rubricSliders.get(j)); - rubricSliders.set(j, tempRubricSlider); - + if(i >= 0 && j >= 0 && i < sliders.size() && j < sliders.size()) { SliderRow tempSlider = sliders.get(i); sliders.set(i, sliders.get(j)); sliders.set(j, tempSlider); @@ -661,7 +662,6 @@ public class RubricEditorController extends FormBasicController implements PageE private void doRemoveSlider(SliderRow row) { updateSteps(); sliders.remove(row); - rubric.getSliders().remove(row.getSlider()); setUpDownVisibility(); flc.setDirty(true); } @@ -669,7 +669,6 @@ public class RubricEditorController extends FormBasicController implements PageE private void doAddSlider() { Slider slider = new Slider(); slider.setId(UUID.randomUUID().toString()); - rubric.getSliders().add(slider); SliderRow row = forgeSliderRow(slider); sliders.add(row); setUpDownVisibility(); @@ -679,14 +678,13 @@ public class RubricEditorController extends FormBasicController implements PageE private void setUpDownVisibility() { for (int i = 0; i < sliders.size(); i++) { SliderRow sliderRow = sliders.get(i); - UpDown upDown = sliderRow.getUpDown(); - upDown.setTopmost(false); - upDown.setLowermost(false); + sliderRow.getUpButton().setEnabled(true); + sliderRow.getDownButton().setEnabled(true); if (i == 0) { - upDown.setTopmost(true); + sliderRow.getUpButton().setEnabled(false); } if (i == sliders.size() -1) { - upDown.setLowermost(true); + sliderRow.getDownButton().setEnabled(false); } } } @@ -877,15 +875,6 @@ public class RubricEditorController extends FormBasicController implements PageE ScaleType scaleType = ScaleType.getEnum(selectedScaleTypeKey); rubric.setScaleType(scaleType); - for(Iterator<Slider> sliderIt=rubric.getSliders().iterator(); sliderIt.hasNext(); ) { - Slider slider = sliderIt.next(); - if(!StringHelper.containsNonWhitespace(slider.getStartLabel()) && !StringHelper.containsNonWhitespace(slider.getEndLabel())) { - sliderIt.remove(); - sliders.removeIf(row -> row.getSlider().equals(slider)); - flc.setDirty(true); - } - } - boolean noResonse = noAnswerEl.isAtLeastSelected(1); rubric.setNoResponseEnabled(noResonse); @@ -975,6 +964,7 @@ public class RubricEditorController extends FormBasicController implements PageE } private void commitFields() { + List<Slider> editedSliders = new ArrayList<>(sliders.size()); for(SliderRow row:sliders) { String start = row.getStartLabelEl().getValue(); if(StringHelper.containsNonWhitespace(start)) { @@ -993,7 +983,11 @@ public class RubricEditorController extends FormBasicController implements PageE Integer weight = getIntOrNull(row.getWeightEl()); row.getSlider().setWeight(weight); + if (row.getSlider().getStartLabel() != null || row.getSlider().getEndLabel() != null) { + editedSliders.add(row.getSlider()); + } } + rubric.setSliders(editedSliders); } private Integer getIntOrNull(TextElement weightEl) { @@ -1035,8 +1029,9 @@ public class RubricEditorController extends FormBasicController implements PageE private final TextElement startLabelEl; private final TextElement endLabelEl; private final TextElement weightEl; + private FormLink upButton; + private FormLink downButton; private FormLink deleteButton; - private UpDown upDown; private FormItem sliderEl; private final Slider slider; @@ -1073,12 +1068,20 @@ public class RubricEditorController extends FormBasicController implements PageE this.deleteButton = deleteButton; } - public UpDown getUpDown() { - return upDown; + public FormLink getUpButton() { + return upButton; + } + + public void setUpButton(FormLink upButton) { + this.upButton = upButton; } - void setUpDown(UpDown upDown) { - this.upDown = upDown; + public FormLink getDownButton() { + return downButton; + } + + public void setDownButton(FormLink downButton) { + this.downButton = downButton; } public FormItem getSliderEl() { @@ -1102,6 +1105,38 @@ public class RubricEditorController extends FormBasicController implements PageE } return ""; } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + getOuterType().hashCode(); + result = prime * result + ((slider == null) ? 0 : slider.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + SliderRow other = (SliderRow) obj; + if (!getOuterType().equals(other.getOuterType())) + return false; + if (slider == null) { + if (other.slider != null) + return false; + } else if (!slider.equals(other.slider)) + return false; + return true; + } + + private RubricEditorController getOuterType() { + return RubricEditorController.this; + } } diff --git a/src/main/java/org/olat/modules/forms/ui/_content/rubric_editor.html b/src/main/java/org/olat/modules/forms/ui/_content/rubric_editor.html index fa8acc107b9490c76473c8c191b8661b48940b33..9eb406615bb4a4a5a07e0c40e66d18cef1f34c94 100644 --- a/src/main/java/org/olat/modules/forms/ui/_content/rubric_editor.html +++ b/src/main/java/org/olat/modules/forms/ui/_content/rubric_editor.html @@ -70,7 +70,7 @@ $r.render("${slider.weightEl.getComponent().getComponentName()}_EXAMPLE") $r.render($slider.weightEl) <div> - $r.render($slider.upDown) + <div class='btn-group o_updown'>$r.render($slider.upButton)$r.render($slider.downButton)</div> #if($r.isNotNull($slider.deleteButton) && $r.visible($slider.deleteButton)) $r.render($slider.deleteButton) #end