/* * Created on Mar 2, 2015 */ package com.delcyon.capo.webapp.widgets; import eu.webtoolkit.jwt.Signal; import eu.webtoolkit.jwt.Signal2; import eu.webtoolkit.jwt.WCompositeWidget; import eu.webtoolkit.jwt.WContainerWidget; import eu.webtoolkit.jwt.WLabel; import eu.webtoolkit.jwt.WLength; import eu.webtoolkit.jwt.WLength.Unit; import eu.webtoolkit.jwt.WLineEdit; import eu.webtoolkit.jwt.WLineEdit.EchoMode; import eu.webtoolkit.jwt.WPushButton; import eu.webtoolkit.jwt.WValidator; import eu.webtoolkit.jwt.WValidator.Result; /** * @author jeremiah * @version $Id: $ */ public class WLoginControl extends WCompositeWidget { public enum LoginState { LOGGED_IN, LOGGED_OUT, INVALID } private WLineEdit userNameFieldTextEdit; private WLineEdit passwordNameFieldTextEdit; private WPushButton loginButton; private WContainerWidget implementationWidget = new WContainerWidget(); private Signal2<String, String> loginSignal = new Signal2<>(); private Signal logoutSignal = new Signal(); private LoginState loginSate = null; private boolean wasLoggedIn = false; /** * */ public WLoginControl() { setImplementation(implementationWidget); addStyleClass("form-inline"); WLabel userNameLabel = new WLabel("Username"); userNameLabel.addStyleClass("sr-only"); userNameFieldTextEdit = new WLineEdit(); userNameFieldTextEdit.setAutoComplete(true); userNameFieldTextEdit.setValidator(WValidatorFactory.validator(this::validate)); userNameFieldTextEdit.setWidth(new WLength(100,Unit.Pixel)); userNameFieldTextEdit.setPlaceholderText(userNameLabel.getText()); userNameLabel.setBuddy(userNameFieldTextEdit); implementationWidget.addWidget(userNameLabel); implementationWidget.addWidget(userNameFieldTextEdit); WLabel passwordLabel = new WLabel("Password"); passwordLabel.addStyleClass("sr-only"); passwordNameFieldTextEdit = new WLineEdit(); passwordNameFieldTextEdit.setEchoMode(EchoMode.Password); passwordNameFieldTextEdit.setAutoComplete(true); passwordNameFieldTextEdit.setValidator(WValidatorFactory.validator(this::validate)); passwordNameFieldTextEdit.setWidth(new WLength(100,Unit.Pixel)); passwordNameFieldTextEdit.setPlaceholderText(passwordLabel.getText()); passwordLabel.setBuddy(passwordNameFieldTextEdit); implementationWidget.addWidget(passwordLabel); implementationWidget.addWidget(passwordNameFieldTextEdit); loginButton = new WPushButton("Login"); implementationWidget.addWidget(loginButton); loginButton.clicked().addListener(this,this::fireLoginEvent); passwordNameFieldTextEdit.enterPressed().addListener(this, this::fireLoginEvent); setLoginSate(LoginState.LOGGED_OUT); } /** * don't care about input, only about LoginState * @param input * @return */ public Result validate(String input) { if(getLoginSate() == LoginState.LOGGED_OUT) { return new WValidator.Result(WValidator.State.InvalidEmpty,"Empty"); } else if(getLoginSate() == LoginState.LOGGED_IN) { return new WValidator.Result(WValidator.State.Valid); } else { return new WValidator.Result(WValidator.State.Invalid,"Invalid Username or Password"); } } private void fireLoginEvent() { if(isLoggedIn()) { logoutSignal.trigger(); } else { loginSignal.trigger(userNameFieldTextEdit.getText(), passwordNameFieldTextEdit.getText()); } userNameFieldTextEdit.validate(); passwordNameFieldTextEdit.validate(); } /** * This will result in to strings being passed to the listener, the first is username, the second is the password * @return */ public Signal2<String, String> login() { return loginSignal; } public Signal logout() { return logoutSignal; } /** * @return the isLoggedIn */ public boolean isLoggedIn() { return (LoginState.LOGGED_IN == getLoginSate()); } public LoginState getLoginSate() { return loginSate; } /** * @param This will update the control according to it's correct state of logged in or not. */ public void setLoginSate(LoginState loginSate) { if(loginSate != this.loginSate) { switch (loginSate) { case LOGGED_IN: loginButton.setText("Logout"); passwordNameFieldTextEdit.hide(); userNameFieldTextEdit.disable(); userNameFieldTextEdit.setStyleClass("valid"); passwordNameFieldTextEdit.setStyleClass("valid"); wasLoggedIn = true; break; case LOGGED_OUT: loginButton.setText("Login"); passwordNameFieldTextEdit.show(); userNameFieldTextEdit.enable(); if(wasLoggedIn == true) { userNameFieldTextEdit.setStyleClass("required"); passwordNameFieldTextEdit.setStyleClass("required"); } else { userNameFieldTextEdit.setStyleClass("required Wt-edit-emptyText"); passwordNameFieldTextEdit.setStyleClass("required Wt-edit-emptyText"); } break; case INVALID: userNameFieldTextEdit.setStyleClass("invalid"); passwordNameFieldTextEdit.setStyleClass("invalid"); break; } } if(loginSate != null) { this.loginSate = loginSate; } //make sure any state change doesn't kill the echo nature of the box, not sure if it's me or if there is a bug somewhere. passwordNameFieldTextEdit.setEchoMode(EchoMode.Normal); passwordNameFieldTextEdit.setEchoMode(EchoMode.Password); } }