package com.constellio.app.ui.pages.login;
import static com.constellio.app.ui.i18n.i18n.$;
import javax.servlet.http.Cookie;
import com.constellio.app.ui.application.ConstellioUI;
import com.constellio.app.ui.handlers.OnEnterKeyHandler;
import com.constellio.app.ui.pages.base.BaseViewImpl;
import com.constellio.app.ui.pages.base.LogoUtils;
import com.constellio.app.ui.pages.base.SessionContext;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.vaadin.event.ShortcutAction.KeyCode;
import com.vaadin.navigator.ViewChangeListener;
import com.vaadin.server.ExternalResource;
import com.vaadin.server.FontAwesome;
import com.vaadin.server.Responsive;
import com.vaadin.server.VaadinService;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.Component;
import com.vaadin.ui.CssLayout;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Link;
import com.vaadin.ui.Notification;
import com.vaadin.ui.PasswordField;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.themes.ValoTheme;
@SuppressWarnings("serial")
public class LoginViewImpl extends BaseViewImpl implements LoginView {
private static final String USERNAME_COOKIE = "Constellio.username";
private String initialUsername;
private VerticalLayout loginFormLayout;
private CssLayout labelsLayout;
private Label welcomeLabel;
private HorizontalLayout fieldsLayout;
private TextField usernameField;
private PasswordField passwordField;
private CheckBox rememberMeField;
private Button signInButton;
private LoginPresenter presenter;
public LoginViewImpl() {
presenter = new LoginPresenter(this);
setSizeFull();
loginFormLayout = buildLoginForm();
addComponent(loginFormLayout);
setComponentAlignment(loginFormLayout, Alignment.MIDDLE_CENTER);
}
private VerticalLayout buildLoginForm() {
VerticalLayout mainLayout = new VerticalLayout();
mainLayout.setSizeUndefined();
mainLayout.setSpacing(true);
Responsive.makeResponsive(mainLayout);
mainLayout.addStyleName("login-panel");
labelsLayout = buildLabels();
fieldsLayout = buildFields();
rememberMeField = new CheckBox($("LoginView.rememberMe"), true);
mainLayout.addComponent(labelsLayout);
mainLayout.addComponent(fieldsLayout);
mainLayout.addComponent(rememberMeField);
return mainLayout;
}
private CssLayout buildLabels() {
CssLayout labelsLayout = new CssLayout();
labelsLayout.addStyleName("labels");
HorizontalLayout hLayout = new HorizontalLayout();
hLayout.setSizeFull();
welcomeLabel = new Label($("LoginView.welcome"));
welcomeLabel.setSizeUndefined();
welcomeLabel.addStyleName(ValoTheme.LABEL_H2);
welcomeLabel.addStyleName(ValoTheme.LABEL_COLORED);
// hLayout.addComponent(welcomeLabel);
String linkTarget = presenter.getLogoTarget();
Link logo = new Link(null, new ExternalResource(linkTarget));
ModelLayerFactory modelLayerFactory = getConstellioFactories().getModelLayerFactory();
logo.setIcon(LogoUtils.getLogoResource(modelLayerFactory));
logo.addStyleName("login-logo");
logo.setSizeUndefined();
hLayout.addComponent(logo);
labelsLayout.addComponent(hLayout);
return labelsLayout;
}
private HorizontalLayout buildFields() {
HorizontalLayout fieldsLayout = new HorizontalLayout();
fieldsLayout.setSpacing(true);
fieldsLayout.addStyleName("fields");
usernameField = new TextField($("LoginView.username"));
usernameField.setIcon(FontAwesome.USER);
usernameField.setMaxLength(100);
usernameField.addStyleName(ValoTheme.TEXTFIELD_INLINE_ICON);
if (initialUsername != null) {
usernameField.setValue(initialUsername);
} else {
usernameField.focus();
}
passwordField = new PasswordField($("LoginView.password"));
passwordField.setIcon(FontAwesome.LOCK);
passwordField.setMaxLength(100);
passwordField.addStyleName(ValoTheme.TEXTFIELD_INLINE_ICON);
if (initialUsername != null) {
passwordField.focus();
}
signInButton = new Button($("LoginView.signIn"));
signInButton.addStyleName(ValoTheme.BUTTON_PRIMARY);
signInButton.setClickShortcut(KeyCode.ENTER);
fieldsLayout.addComponents(usernameField, passwordField, signInButton);
fieldsLayout.setComponentAlignment(signInButton, Alignment.BOTTOM_LEFT);
signInButton.addClickListener(new ClickListener() {
@Override
public void buttonClick(final ClickEvent event) {
attemptSignIn();
}
});
OnEnterKeyHandler onEnterHandler = new OnEnterKeyHandler() {
@Override
public void onEnterKeyPressed() {
attemptSignIn();
}
};
onEnterHandler.installOn(usernameField);
onEnterHandler.installOn(passwordField);
return fieldsLayout;
}
private void attemptSignIn() {
presenter.signInAttempt(usernameField.getValue(), passwordField.getValue(), rememberMeField.getValue());
}
@Override
public void updateUIContent() {
ConstellioUI.getCurrent().updateContent();
}
@Override
public SessionContext getSessionContext() {
return ConstellioUI.getCurrentSessionContext();
}
@Override
protected Component buildMainComponent(ViewChangeListener.ViewChangeEvent event) {
return loginFormLayout;
}
@Override
public void showUserHasNoCollectionMessage() {
Notification.show($("LoginView.userHasNoCollection"));
}
@Override
public void showBadLoginMessage() {
Notification.show($("LoginView.badLoginMessage"));
}
@Override
public void setUsername(String username) {
if (usernameField != null) {
usernameField.setValue(username);
} else {
initialUsername = username;
}
}
@Override
public String getUsernameCookieValue() {
String usernameCookieValue = null;
Cookie[] cookies = VaadinService.getCurrentRequest().getCookies();
for (Cookie cookie : cookies) {
if (cookie.getName().equals(USERNAME_COOKIE)) {
usernameCookieValue = cookie.getValue();
break;
}
}
return usernameCookieValue;
}
@Override
public void setUsernameCookie(String username) {
Cookie usernameCookie = new Cookie(USERNAME_COOKIE, username);
if (username != null) {
// Make cookie expire in 2 minutes
usernameCookie.setMaxAge(Integer.MAX_VALUE);
} else {
// Delete the cookie
usernameCookie.setMaxAge(0);
}
// Set the cookie path.
usernameCookie.setPath(VaadinService.getCurrentRequest().getContextPath());
// Save cookie
VaadinService.getCurrentResponse().addCookie(usernameCookie);
}
}