diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/content/LoginPage.java b/src/main/java/ch/ethz/seb/sebserver/gui/content/LoginPage.java index 32537cea..44e9c466 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/content/LoginPage.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/content/LoginPage.java @@ -12,12 +12,10 @@ import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.eclipse.rap.rwt.RWT; import org.eclipse.swt.SWT; -import org.eclipse.swt.internal.widgets.IControlAdapter; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Text; @@ -30,7 +28,6 @@ import org.springframework.stereotype.Component; import ch.ethz.seb.sebserver.gbl.profile.GuiProfile; import ch.ethz.seb.sebserver.gui.service.i18n.I18nSupport; import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey; -import ch.ethz.seb.sebserver.gui.service.page.ComposerService; import ch.ethz.seb.sebserver.gui.service.page.PageContext; import ch.ethz.seb.sebserver.gui.service.page.PageService; import ch.ethz.seb.sebserver.gui.service.page.TemplateComposer; @@ -142,11 +139,6 @@ public class LoginPage implements TemplateComposer { registerButton.setLayoutData(gridData); registerButton.addListener(SWT.Selection, event -> pageContext.forwardToPage(this.defaultRegisterPage)); } - - ComposerService.traversePageTree( - parent, - comp -> comp instanceof Control, - comp -> comp.getAdapter(IControlAdapter.class).setTabIndex(0)); } private void login( diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/service/page/TemplateComposer.java b/src/main/java/ch/ethz/seb/sebserver/gui/service/page/TemplateComposer.java index e1f21d2b..404912ab 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/service/page/TemplateComposer.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/service/page/TemplateComposer.java @@ -11,8 +11,9 @@ package ch.ethz.seb.sebserver.gui.service.page; /** interface defining a RAP page template composer */ public interface TemplateComposer { - /** Validate given PageContext for completeness to compose a specific TemplateComposer implementation - * Default returns always true. + /** Validate given PageContext for completeness to compose a specific TemplateComposer implementation + * Default returns always true. + * * @param pageContext The PageContext instance to check * @return true if the PageContext contains all mandatory data to compose this page template */ default boolean validate(final PageContext pageContext) { diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/service/page/impl/ComposerServiceImpl.java b/src/main/java/ch/ethz/seb/sebserver/gui/service/page/impl/ComposerServiceImpl.java index 6e021cb7..50007b98 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/service/page/impl/ComposerServiceImpl.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/service/page/impl/ComposerServiceImpl.java @@ -13,6 +13,8 @@ import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; +import org.eclipse.rap.rwt.RWT; +import org.eclipse.rap.rwt.client.service.JavaScriptExecutor; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.MessageBox; @@ -44,6 +46,20 @@ public class ComposerServiceImpl implements ComposerService { private static final Logger log = LoggerFactory.getLogger(ComposerServiceImpl.class); + public static final String TABINDEX_RESET_SCRIPT = + "try {\n" + + " document.body.setAttribute(\"tabindex\", \"0\");\n" + + " var items = document.body.getElementsByTagName('div');\n" + + " console.log('*** '+items.length);\n" + + " for (i = 0; i < items.length; i++) {\n" + + " if(items[i].hasAttribute(\"tabindex\")) {\n" + + " items[i].setAttribute(\"tabindex\", \"0\");\n" + + " }\n" + + " }\n" + + "} catch (error) {\n" + + " console.error(error);\n" + + "}"; + private final Class loginPageType = DefaultLoginPage.class; private final Class mainPageType = DefaultMainPage.class; @@ -138,6 +154,11 @@ public class ComposerServiceImpl implements ComposerService { PageService.clearComposite(pageContext.getParent()); try { + + // apply tabindex reset script + final JavaScriptExecutor executor = RWT.getClient().getService(JavaScriptExecutor.class); + executor.execute(ComposerServiceImpl.TABINDEX_RESET_SCRIPT); + composer.compose(pageContext); PageService.updateScrolledComposite(pageContext.getParent()); diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/widget/WidgetFactory.java b/src/main/java/ch/ethz/seb/sebserver/gui/widget/WidgetFactory.java index b60d9732..744a00ca 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/widget/WidgetFactory.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/widget/WidgetFactory.java @@ -58,6 +58,7 @@ import ch.ethz.seb.sebserver.gui.service.i18n.I18nSupport; import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey; import ch.ethz.seb.sebserver.gui.service.i18n.PolyglotPageService; import ch.ethz.seb.sebserver.gui.service.page.PageService; +import ch.ethz.seb.sebserver.gui.service.page.impl.ComposerServiceImpl; import ch.ethz.seb.sebserver.gui.service.page.impl.DefaultPageLayout; import ch.ethz.seb.sebserver.gui.service.push.ServerPushService; @@ -944,6 +945,14 @@ public class WidgetFactory { final String $el = widget instanceof Text ? "$input" : "$el"; final String id = WidgetUtil.getId(widget); exec("rap.getObject( '", id, "' ).", $el, ".attr( '", name, "', '", value, "' );"); + + // apply tabindex reset script + final JavaScriptExecutor executor = RWT.getClient().getService(JavaScriptExecutor.class); + executor.execute(ComposerServiceImpl.TABINDEX_RESET_SCRIPT); +// exec("rap.getObject( '", id, "' ).", $el, ".attr( 'tabindex', '0' );"); +// if (widget instanceof Text) { +// exec("rap.getObject( '", id, "' ).$el.attr( 'tabindex', '0' );"); +// } } } diff --git a/src/main/resources/config/application-dev-gui.properties b/src/main/resources/config/application-dev-gui.properties index a22c98bc..8069b264 100644 --- a/src/main/resources/config/application-dev-gui.properties +++ b/src/main/resources/config/application-dev-gui.properties @@ -1,11 +1,11 @@ server.address=localhost -server.port=8090 +server.port=8080 sebserver.gui.http.external.scheme=http sebserver.gui.entrypoint=/gui sebserver.gui.webservice.protocol=http sebserver.gui.webservice.address=localhost -sebserver.gui.webservice.port=8090 +sebserver.gui.webservice.port=8080 sebserver.gui.webservice.apipath=/admin-api/v1 # defines the polling interval that is used to poll the webservice for client connection data on a monitored exam page sebserver.gui.webservice.poll-interval=1000 diff --git a/src/main/resources/config/application-dev-ws.properties b/src/main/resources/config/application-dev-ws.properties index 277c15de..81ac2bc0 100644 --- a/src/main/resources/config/application-dev-ws.properties +++ b/src/main/resources/config/application-dev-ws.properties @@ -22,7 +22,7 @@ sebserver.webservice.clean-db-on-startup=false # webservice configuration sebserver.init.adminaccount.gen-on-init=false -sebserver.webservice.distributed=true +sebserver.webservice.distributed=false sebserver.webservice.master.delay.threshold=10000 sebserver.webservice.http.external.scheme=http sebserver.webservice.http.external.servername=localhost