diff --git a/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarServiceImpl.java index 11ff634ce7..e36da9723a 100755 --- a/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarServiceImpl.java @@ -71,6 +71,7 @@ public class FinalSeminarServiceImpl extends AbstractServiceImpl<FinalSeminar, L } @Override + @Transactional public Either<SchedulingError, FinalSeminar> schedule(Project project, LocalDateTime when, FinalSeminarDetails details) { if (project.isFinalSeminarRuleExempted()) { return createSeminar(project, when, details); @@ -86,7 +87,14 @@ public class FinalSeminarServiceImpl extends AbstractServiceImpl<FinalSeminar, L return Either.left(new RoughDraftNotApproved()); } - return createSeminar(project, when, details); + final FinalSeminar current = findByProject(project); + if (current == null) { + return createSeminar(project, when, details); + } + else { + // Assume double click sends the same data so no need to change anything + return Either.right(current); + } } private MovingError validateSchedulingRules(LocalDate date) { diff --git a/view/src/main/java/se/su/dsv/scipro/SciProApplication.java b/view/src/main/java/se/su/dsv/scipro/SciProApplication.java index fded3c3d5b..41c2fb5aec 100755 --- a/view/src/main/java/se/su/dsv/scipro/SciProApplication.java +++ b/view/src/main/java/se/su/dsv/scipro/SciProApplication.java @@ -5,6 +5,7 @@ import org.apache.wicket.*; import org.apache.wicket.authorization.strategies.CompoundAuthorizationStrategy; import org.apache.wicket.csp.CSPDirective; import org.apache.wicket.csp.CSPDirectiveSrcValue; +import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.request.Request; import org.apache.wicket.request.Response; import org.apache.wicket.resource.JQueryResourceReference; @@ -24,6 +25,7 @@ import se.su.dsv.scipro.checklists.AdminChecklistPage; import se.su.dsv.scipro.checklists.AdminEditChecklistTemplatePage; import se.su.dsv.scipro.checklists.ProjectViewChecklistPage; import se.su.dsv.scipro.checklists.SupervisorViewChecklistPage; +import se.su.dsv.scipro.components.DisableSubmitButtonsOnSubmit; import se.su.dsv.scipro.examiner.pages.ExaminerStartPage; import se.su.dsv.scipro.finalseminar.*; import se.su.dsv.scipro.finalthesis.SupervisorFinalThesisListingPage; @@ -157,6 +159,12 @@ public class SciProApplication extends LifecycleManagedWebApplication { .add(CSPDirective.IMG_SRC, "data:"); WicketWebjars.install(this); + + getComponentInstantiationListeners().add(component -> { + if (component instanceof Form) { + component.add(new DisableSubmitButtonsOnSubmit()); + } + }); } private void mountForumPage() { diff --git a/view/src/main/java/se/su/dsv/scipro/components/DisableSubmitButtonsOnSubmit.java b/view/src/main/java/se/su/dsv/scipro/components/DisableSubmitButtonsOnSubmit.java new file mode 100644 index 0000000000..3a98b9e500 --- /dev/null +++ b/view/src/main/java/se/su/dsv/scipro/components/DisableSubmitButtonsOnSubmit.java @@ -0,0 +1,30 @@ +package se.su.dsv.scipro.components; + +import org.apache.wicket.Component; +import org.apache.wicket.behavior.Behavior; +import org.apache.wicket.markup.head.IHeaderResponse; +import org.apache.wicket.markup.head.OnEventHeaderItem; +import org.apache.wicket.markup.html.form.Form; + +/** + * Disables all elements with {@code [type=submit]} + */ +public class DisableSubmitButtonsOnSubmit extends Behavior { + @Override + public void bind(Component component) { + super.bind(component); + if (!(component instanceof Form<?>)) { + throw new RuntimeException("Can only be used on Form components"); + } + } + + @Override + public void renderHead(Component component, IHeaderResponse response) { + super.renderHead(component, response); + final String javaScript = "const submitButtons = event.target.querySelectorAll(\"[type=submit]\");\n" + + "for (const button of submitButtons) {\n" + + " button.disabled = true;\n" + + "}\n"; + response.render(OnEventHeaderItem.forComponent(component, "submit", javaScript)); + } +} \ No newline at end of file