diff --git a/core/src/main/java/se/su/dsv/scipro/reflection/ReflectionService.java b/core/src/main/java/se/su/dsv/scipro/reflection/ReflectionService.java index c8f4452497..3e0109c694 100644 --- a/core/src/main/java/se/su/dsv/scipro/reflection/ReflectionService.java +++ b/core/src/main/java/se/su/dsv/scipro/reflection/ReflectionService.java @@ -22,4 +22,6 @@ public interface ReflectionService { * @param author the author whose reflection does not meet the minimum requirements. */ void requestNewReflection(Project project, User author); + + Reflection getReflection(Project project, User author); } diff --git a/core/src/main/java/se/su/dsv/scipro/reflection/ReflectionServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/reflection/ReflectionServiceImpl.java index f1eb806f26..c3a6a5c792 100644 --- a/core/src/main/java/se/su/dsv/scipro/reflection/ReflectionServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/reflection/ReflectionServiceImpl.java @@ -63,4 +63,19 @@ class ReflectionServiceImpl implements ReflectionService { author.setReflectionStatus(ReflectionStatus.IMPROVEMENTS_NEEDED); }); } + + @Override + public Reflection getReflection(Project project, User author) { + return authorRepository.findByProjectAndUser(project, author) + .map(this::toReflection) + .orElseGet(Reflection.NotSubmitted::new); + } + + private Reflection toReflection(Author author) { + return switch (author.getReflectionStatus()) { + case SUBMITTED -> new Reflection.Submitted(author.getReflection()); + case IMPROVEMENTS_NEEDED -> new Reflection.ImprovementsNeeded(author.getReflection(), ""); + default -> new Reflection.NotSubmitted(); + }; + } } diff --git a/core/src/main/resources/db/migration/V389__reflection_resubmission.sql b/core/src/main/resources/db/migration/V389__reflection_resubmission.sql new file mode 100644 index 0000000000..d80e266c9d --- /dev/null +++ b/core/src/main/resources/db/migration/V389__reflection_resubmission.sql @@ -0,0 +1,4 @@ +ALTER TABLE `project_user` + ADD COLUMN `reflection_status` VARCHAR(32) NOT NULL DEFAULT 'NOT_SUBMITTED'; + +UPDATE `project_user` SET `reflection_status` = 'SUBMITTED' WHERE `reflection` IS NOT NULL; diff --git a/view/src/main/java/se/su/dsv/scipro/project/panels/FinalStepsPanel.html b/view/src/main/java/se/su/dsv/scipro/project/panels/FinalStepsPanel.html index f59d304ff3..6cc7d5661d 100644 --- a/view/src/main/java/se/su/dsv/scipro/project/panels/FinalStepsPanel.html +++ b/view/src/main/java/se/su/dsv/scipro/project/panels/FinalStepsPanel.html @@ -38,7 +38,30 @@ <div wicket:id="current_thesis_file"></div> </div> </wicket:enclosure> - <p wicket:id="old_reflection"></p> + <wicket:enclosure child="old_reflection"> + <div class="alert alert-info"> + <h4 class="alert-heading"> + <wicket:message key="reflection_improvements_needed_heading"> + Reflection improvements needed + </wicket:message> + </h4> + <p> + <wicket:message key="reflection_improvements_needed"> + Your supervisor has requested that you improve and resubmit your reflection. + See their comments below about what changes are necessary. + </wicket:message> + </p> + <p wicket:id="supervisor_comment"> + [You need to reflect more on the methods you used.] + </p> + </div> + <h4> + <wicket:message key="old_reflection"> + Your previous reflection + </wicket:message> + </h4> + <p wicket:id="old_reflection"></p> + </wicket:enclosure> <div class="mb-3"> <label class="form-label" wicket:for="reflection"> <wicket:message key="reflection">[Reflection]</wicket:message> diff --git a/view/src/main/java/se/su/dsv/scipro/project/panels/FinalStepsPanel.java b/view/src/main/java/se/su/dsv/scipro/project/panels/FinalStepsPanel.java index ab4dd265a2..67be5beff7 100644 --- a/view/src/main/java/se/su/dsv/scipro/project/panels/FinalStepsPanel.java +++ b/view/src/main/java/se/su/dsv/scipro/project/panels/FinalStepsPanel.java @@ -2,7 +2,6 @@ package se.su.dsv.scipro.project.panels; import org.apache.wicket.feedback.FencedFeedbackPanel; import org.apache.wicket.markup.html.WebMarkupContainer; -import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.basic.MultiLineLabel; import org.apache.wicket.markup.html.form.EnumChoiceRenderer; import org.apache.wicket.markup.html.form.Form; @@ -47,17 +46,20 @@ public class FinalStepsPanel extends GenericPanel<Project> { add(new FencedFeedbackPanel("feedback", this)); - IModel<String> reflection = LoadableDetachableModel.of(() -> - reflectionService.getSubmittedReflection(projectModel.getObject(), SciProSession.get().getUser())); - add(new MultiLineLabel("reflection", reflection) { + IModel<Reflection> currentReflection = LoadableDetachableModel.of(() -> + reflectionService.getReflection(projectModel.getObject(), SciProSession.get().getUser())); + IModel<String> reflectionText = currentReflection + .as(Reflection.Submitted.class) + .map(Reflection.Submitted::reflection); + add(new MultiLineLabel("reflection", reflectionText) { @Override protected void onConfigure() { super.onConfigure(); - setVisible(getDefaultModelObject() != null); + setVisible(!getDefaultModelObjectAsString().isBlank()); } }); - add(new FinalStepsForm("submit_reflection", projectModel)); + add(new FinalStepsForm("submit_reflection", projectModel, currentReflection)); } @Override @@ -69,27 +71,40 @@ public class FinalStepsPanel extends GenericPanel<Project> { private class FinalStepsForm extends Form<Project> { private final FinalThesisUploadComponent thesisFileUpload; private final IModel<PublicationMetadata> publicationMetadataModel; + private final IModel<Reflection> currentReflection; private IModel<String> reflectionModel; private IModel<PublishingConsentService.Level> levelModel; - public FinalStepsForm(String id, IModel<Project> projectModel) { + public FinalStepsForm(String id, IModel<Project> projectModel, IModel<Reflection> currentReflection) { super(id, projectModel); - IModel<Reflection> reflectionLoadableDetachableModel = LoadableDetachableModel.of(() -> null); + this.currentReflection = currentReflection; - IModel<Reflection.ImprovementsNeeded> i = reflectionLoadableDetachableModel.as(Reflection.ImprovementsNeeded.class); + IModel<Reflection.ImprovementsNeeded> i = this.currentReflection.as(Reflection.ImprovementsNeeded.class); - IModel<String> labelModel = i.map(Reflection.ImprovementsNeeded::oldReflection); - add(new Label("old_reflection", labelModel)); + IModel<String> oldReflection = i.map(Reflection.ImprovementsNeeded::oldReflection); + add(new MultiLineLabel("old_reflection", oldReflection) { + @Override + protected void onConfigure() { + super.onConfigure(); + setVisibilityAllowed(!getDefaultModelObjectAsString().isBlank()); + } + }); - add(new Label("supervisor_comment", i.map(Reflection.ImprovementsNeeded::commentBySupervisor))); + add(new MultiLineLabel("supervisor_comment", i.map(Reflection.ImprovementsNeeded::commentBySupervisor)) { + @Override + protected void onConfigure() { + super.onConfigure(); + setVisibilityAllowed(!getDefaultModelObjectAsString().isBlank()); + } + }); reflectionModel = new Model<>(); TextArea<String> reflectionTextArea = new TextArea<>("reflection", reflectionModel) { @Override protected void onConfigure() { super.onConfigure(); - setVisible(reflectionLoadableDetachableModel.getObject().isSubmittable()); + setVisible(FinalStepsForm.this.currentReflection.getObject().isSubmittable()); } }; reflectionTextArea.setRequired(true); @@ -141,7 +156,7 @@ public class FinalStepsPanel extends GenericPanel<Project> { @Override protected void onConfigure() { super.onConfigure(); - setVisibilityAllowed(reflectionService.hasToFillInReflection(getModelObject(), SciProSession.get().getUser())); + setVisibilityAllowed(currentReflection.getObject().isSubmittable()); } @Override diff --git a/view/src/main/java/se/su/dsv/scipro/project/panels/FinalStepsPanel.utf8.properties b/view/src/main/java/se/su/dsv/scipro/project/panels/FinalStepsPanel.utf8.properties index a0f79eb71a..8598ea8918 100644 --- a/view/src/main/java/se/su/dsv/scipro/project/panels/FinalStepsPanel.utf8.properties +++ b/view/src/main/java/se/su/dsv/scipro/project/panels/FinalStepsPanel.utf8.properties @@ -9,3 +9,7 @@ current_final_thesis=Final thesis publication_metadata_why=Please provide the following metadata. englishTitle=English title swedishTitle=Swedish title +reflection_improvements_needed_heading=Reflection improvements needed +reflection_improvements_needed=Your supervisor has requested that you improve and resubmit your reflection. \ +See their comments below about what changes are necessary. +old_reflection=Your previous reflection