Allow changes to the reflection to be made after it's been submitted #13

Merged
ansv7779 merged 20 commits from 3412-supervisor-edit-reflection into develop 2024-11-21 19:20:48 +01:00
3 changed files with 132 additions and 3 deletions
Showing only changes of commit a6f38dbab8 - Show all commits

View File

@ -19,6 +19,17 @@
[Authors submitted reflection] [Authors submitted reflection]
</wicket:container> </wicket:container>
<button class="btn btn-outline-secondary" wicket:id="show_edit_reflection_form">
<wicket:message key="edit_reflection">
Edit reflection
</wicket:message>
</button>
<button class="btn btn-outline-secondary" wicket:id="show_request_improvements_form">
<wicket:message key="request_improvements">
Request improvements
</wicket:message>
</button>
<form wicket:id="request_improvements_form"> <form wicket:id="request_improvements_form">
<hr> <hr>
<p> <p>
@ -39,6 +50,32 @@
Request improvements Request improvements
</wicket:message> </wicket:message>
</button> </button>
<button class="btn btn-link" wicket:id="cancel">
<wicket:message key="cancel">
Cancel
</wicket:message>
</button>
</form>
<form wicket:id="edit_reflection_form">
<div class="mb-3">
<label class="form-label">
<wicket:message key="reflection">
Reflection
</wicket:message>
</label>
<textarea class="form-control" wicket:id="reflection" rows="10"></textarea>
</div>
<button class="btn btn-primary" wicket:id="submit">
<wicket:message key="save">
Save
</wicket:message>
</button>
<button class="btn btn-link" wicket:id="cancel">
<wicket:message key="cancel">
Cancel
</wicket:message>
</button>
</form> </form>
</wicket:panel> </wicket:panel>
</body> </body>

View File

@ -2,8 +2,8 @@ package se.su.dsv.scipro.grading;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink; import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.basic.MultiLineLabel; import org.apache.wicket.markup.html.basic.MultiLineLabel;
import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextArea; import org.apache.wicket.markup.html.form.TextArea;
@ -27,6 +27,10 @@ class ReflectionModalBodyPanel extends Panel {
private final IModel<Project> projectModel; private final IModel<Project> projectModel;
private final IModel<User> authorModel; private final IModel<User> authorModel;
private enum State { VIEWING, REQUESTING_IMPROVEMENTS, EDITING }
private State state = State.VIEWING;
ReflectionModalBodyPanel(String id, IModel<Project> projectModel, IModel<User> authorModel) { ReflectionModalBodyPanel(String id, IModel<Project> projectModel, IModel<User> authorModel) {
super(id); super(id);
this.projectModel = projectModel; this.projectModel = projectModel;
@ -36,7 +40,13 @@ class ReflectionModalBodyPanel extends Panel {
IModel<Reflection> reflectionModel = projectModel.combineWith(authorModel, reflectionService::getReflection); IModel<Reflection> reflectionModel = projectModel.combineWith(authorModel, reflectionService::getReflection);
add(new MultiLineLabel("reflection_text", reflectionModel.map(this::getReflectionText))); add(new MultiLineLabel("reflection_text", reflectionModel.map(this::getReflectionText)) {
@Override
protected void onConfigure() {
super.onConfigure();
setVisible(state != State.EDITING);
}
});
add(new MultiLineLabel("improvements_needed_supervisor_feedback", reflectionModel add(new MultiLineLabel("improvements_needed_supervisor_feedback", reflectionModel
.as(Reflection.ImprovementsNeeded.class) .as(Reflection.ImprovementsNeeded.class)
@ -49,6 +59,39 @@ class ReflectionModalBodyPanel extends Panel {
}); });
add(new RequestImprovementsForm("request_improvements_form", reflectionModel)); add(new RequestImprovementsForm("request_improvements_form", reflectionModel));
add(new SupervisorEditReflectionForm("edit_reflection_form", reflectionModel));
add(new AjaxLink<>("show_request_improvements_form", reflectionModel) {
@Override
public void onClick(AjaxRequestTarget target) {
ReflectionModalBodyPanel.this.state = State.REQUESTING_IMPROVEMENTS;
target.add(ReflectionModalBodyPanel.this);
}
@Override
protected void onConfigure() {
super.onConfigure();
Reflection reflection = getModelObject();
boolean canRequestImprovements = reflection instanceof Reflection.Submitted;
setVisible(state == State.VIEWING && canRequestImprovements);
}
});
add(new AjaxLink<>("show_edit_reflection_form", reflectionModel) {
@Override
public void onClick(AjaxRequestTarget target) {
ReflectionModalBodyPanel.this.state = State.EDITING;
target.add(ReflectionModalBodyPanel.this);
}
@Override
protected void onConfigure() {
super.onConfigure();
Reflection reflection = getModelObject();
boolean canEditReflection = reflection instanceof Reflection.Submitted || reflection instanceof Reflection.ImprovementsNeeded;
setVisible(state == State.VIEWING && canEditReflection);
}
});
} }
private String getReflectionText(Reflection reflection) { private String getReflectionText(Reflection reflection) {
@ -88,6 +131,14 @@ class ReflectionModalBodyPanel extends Panel {
authorModel.getObject(), authorModel.getObject(),
commentModel.getObject()); commentModel.getObject());
ReflectionModalBodyPanel.this.state = State.VIEWING;
target.add(ReflectionModalBodyPanel.this);
}
});
add(new AjaxLink<>("cancel") {
@Override
public void onClick(AjaxRequestTarget target) {
ReflectionModalBodyPanel.this.state = State.VIEWING;
target.add(ReflectionModalBodyPanel.this); target.add(ReflectionModalBodyPanel.this);
} }
}); });
@ -96,7 +147,45 @@ class ReflectionModalBodyPanel extends Panel {
@Override @Override
protected void onConfigure() { protected void onConfigure() {
super.onConfigure(); super.onConfigure();
setVisible(getModelObject() instanceof Reflection.Submitted); setVisible(state == State.REQUESTING_IMPROVEMENTS && getModelObject() instanceof Reflection.Submitted);
}
}
private class SupervisorEditReflectionForm extends Form<Reflection> {
public SupervisorEditReflectionForm(String id, IModel<Reflection> reflectionModel) {
super(id, reflectionModel);
IModel<String> reflectionTextModel = new Model<>(getReflectionText(reflectionModel.getObject()));
TextArea<String> reflectionTextArea = new TextArea<>("reflection", reflectionTextModel);
reflectionTextArea.setRequired(true);
add(reflectionTextArea);
add(new AjaxSubmitLink("submit") {
@Override
protected void onSubmit(AjaxRequestTarget target) {
reflectionService.submitReflection(
projectModel.getObject(),
authorModel.getObject(),
reflectionTextModel.getObject());
ReflectionModalBodyPanel.this.state = State.VIEWING;
target.add(ReflectionModalBodyPanel.this);
}
});
add(new AjaxLink<>("cancel") {
@Override
public void onClick(AjaxRequestTarget target) {
ReflectionModalBodyPanel.this.state = State.VIEWING;
target.add(ReflectionModalBodyPanel.this);
}
});
}
@Override
protected void onConfigure() {
super.onConfigure();
setVisible(state == State.EDITING);
} }
} }
} }

View File

@ -5,3 +5,6 @@ reflection_not_submitted=Reflection not submitted yet
request_improvements_text=If the submitted reflection does not meet the minimum requirements \ request_improvements_text=If the submitted reflection does not meet the minimum requirements \
you can request improvements from the student. The student will be notified and can submit a new reflection. \ you can request improvements from the student. The student will be notified and can submit a new reflection. \
Use the comment field to provide feedback to the student. Use the comment field to provide feedback to the student.
edit_reflection=Edit reflection
reflection=Reflection
cancel=Cancel