package kornell.gui.client.presentation.vitrine.generic;
import static kornell.core.util.StringUtils.mkurl;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.github.gwtbootstrap.client.ui.Alert;
import com.github.gwtbootstrap.client.ui.Form;
import com.github.gwtbootstrap.client.ui.Icon;
import com.github.gwtbootstrap.client.ui.Image;
import com.github.gwtbootstrap.client.ui.PasswordTextBox;
import com.github.gwtbootstrap.client.ui.TextBox;
import com.github.gwtbootstrap.client.ui.Tooltip;
import com.github.gwtbootstrap.client.ui.base.IconAnchor;
import com.github.gwtbootstrap.client.ui.constants.AlertType;
import com.github.gwtbootstrap.client.ui.constants.Placement;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.MenuBar;
import com.google.gwt.user.client.ui.Widget;
import kornell.core.util.StringUtils;
import kornell.gui.client.GenericClientFactoryImpl;
import kornell.gui.client.KornellConstants;
import kornell.gui.client.presentation.vitrine.VitrineView;
import kornell.gui.client.presentation.vitrine.VitrineViewType;
import kornell.gui.client.util.ClientConstants;
import kornell.gui.client.util.ClientProperties;
public class GenericVitrineView extends Composite implements VitrineView {
interface MyUiBinder extends UiBinder<Widget, GenericVitrineView> {
}
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
private static KornellConstants constants = GWT.create(KornellConstants.class);
private VitrineView.Presenter presenter;
private VitrineViewType currentViewType = VitrineViewType.login;
private String registrationEmail;
private boolean forcedPasswordUpdate = false;
@UiField
FlowPanel vitrineWrapper;
@UiField
FlowPanel boxLogin;
@UiField
FlowPanel flagWrapper;
@UiField
Image imgLogo;
@UiField
FlowPanel loginPanel;
@UiField
Form frmLogin;
@UiField
TextBox txtUsername;
@UiField
PasswordTextBox pwdPassword;
@UiField
Button btnLogin;
@UiField
Button btnRegister;
@UiField
Button btnForgotPassword;
@UiField
Alert alertError;
@UiField
FlowPanel signUpPanel;
@UiField
Form frmSignUp;
@UiField
TextBox suName;
@UiField
TextBox suEmail;
@UiField
PasswordTextBox suPassword;
@UiField
PasswordTextBox suPasswordConfirm;
@UiField
Button btnOK;
@UiField
Button btnCancel;
@UiField
FlowPanel forgotPasswordPanel;
@UiField
Form frmforgotPassword;
@UiField
TextBox fpEmail;
@UiField
Button btnOKFp;
@UiField
Button btnCancelFp;
@UiField
FlowPanel newPasswordPanel;
@UiField
Form frmNewPassword;
@UiField
PasswordTextBox newPassword;
@UiField
PasswordTextBox newPasswordConfirm;
@UiField
Button btnOKNewPassword;
@UiField
Button btnCancelNewPassword;
@UiField
HTMLPanel panelHR;
public GenericVitrineView() {
initWidget(uiBinder.createAndBindUi(this));
buildSupportIcon();
buildFlagsPanel();
displayView(VitrineViewType.login);
KeyPressHandler kpHandler = new KeyPressHandler() {
@Override
public void onKeyPress(KeyPressEvent event) {
if (KeyCodes.KEY_ENTER == event.getCharCode()){
switch (currentViewType) {
case login: doLogin(null);
break;
case register: signUp(null);
break;
case forgotPassword: requestPasswordChange(null);
break;
case newPassword: changePassword(null);
break;
default:
break;
}
}
}
};
pwdPassword.addKeyPressHandler(kpHandler);
suPasswordConfirm.addKeyPressHandler(kpHandler);
fpEmail.addKeyPressHandler(kpHandler);
newPasswordConfirm.addKeyPressHandler(kpHandler);
txtUsername.getElement().setAttribute("autocorrect", "off");
txtUsername.getElement().setAttribute("autocapitalize", "off");
}
private void buildSupportIcon(){
String supportEmail = GenericClientFactoryImpl.KORNELL_SESSION.getInstitution().getInstitutionSupportEmail();
supportEmail = StringUtils.isSome(supportEmail) ? supportEmail : "suporte@craftware.com.br";
Icon icon = new Icon();
icon.addStyleName("fa fa-question-circle");
IconAnchor anchor = new IconAnchor();
anchor.addStyleName("vitrine-support-icon");
anchor.setHref("mailto:"+supportEmail);
anchor.clear();
anchor.add(icon);
Tooltip tooltip = new Tooltip(supportEmail);
tooltip.setPlacement(Placement.LEFT);
tooltip.add(anchor);
boxLogin.add(tooltip);
}
private void buildFlagsPanel() {
if(GenericClientFactoryImpl.KORNELL_SESSION.getInstitution().isInternationalized()){
String locale = ClientProperties.getLocaleCookie();
if(locale == null){
locale = "pt_BR";
}
Map<String, String> localeToFlagsImage = new HashMap<String, String>();
String blank = mkurl(ClientConstants.IMAGES_PATH, "blank.gif");
localeToFlagsImage.put("pt_BR", "<img src=\""+blank+"\" class=\"flag flag-br\" alt=\"BR\" title=\"Português\"/>");
localeToFlagsImage.put("en", "<img src=\""+blank+"\" class=\"flag flag-gb\" alt=\"EN\" title=\"English\" />");
localeToFlagsImage.put("fr", "<img src=\""+blank+"\" class=\"flag flag-fr\" alt=\"FR\" title=\"Français\" />");
localeToFlagsImage.put("es", "<img src=\""+blank+"\" class=\"flag flag-es\" alt=\"ES\" title=\"Español\" />");
Map<String, Command> localeToCommand = new HashMap<String, Command>();
localeToCommand.put("pt_BR", new Command() {
public void execute() {
ClientProperties.setLocaleCookie("pt_BR");
}
});
localeToCommand.put("en", new Command() {
public void execute() {
ClientProperties.setLocaleCookie("en");
}
});
localeToCommand.put("fr", new Command() {
public void execute() {
ClientProperties.setLocaleCookie("fr");
}
});
localeToCommand.put("es", new Command() {
public void execute() {
ClientProperties.setLocaleCookie("es");
}
});
MenuBar flagBar = new MenuBar(false);
Iterator<Map.Entry<String, String>> entries = localeToFlagsImage.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<String, String> entry = entries.next();
if(!entry.getKey().equals(locale)){
flagBar.addItem(entry.getValue(), true, localeToCommand.get(entry.getKey()));
}
}
flagBar.addItem("<span class=\"flagPopupText\">"+constants.selectLanguage()+"</span>", true, new Command() {
public void execute() {
}
});
MenuBar topBar = new MenuBar(true);
topBar.setAutoOpen(true);
topBar.setAnimationEnabled(true);
topBar.addItem(localeToFlagsImage.get(locale), true, flagBar);
flagWrapper.add(topBar);
}
}
@Override
public void setPresenter(Presenter presenter) {
this.presenter = presenter;
}
@UiHandler("btnLogin")
void doLogin(ClickEvent e) {
presenter.onLoginButtonClicked();
}
@UiHandler("btnRegister")
void register(ClickEvent e) {
presenter.onRegisterButtonClicked();
}
@UiHandler("btnForgotPassword")
void forgotPassword(ClickEvent e) {
presenter.onForgotPasswordButtonClicked();
}
@UiHandler("btnOK")
void signUp(ClickEvent e) {
presenter.onSignUpButtonClicked();
}
@UiHandler("btnCancel")
void cancelSignUp(ClickEvent e) {
presenter.onCancelSignUpButtonClicked();
}
@UiHandler("btnOKFp")
void requestPasswordChange(ClickEvent e) {
presenter.onRequestPasswordChangeButtonClicked();
}
@UiHandler("btnCancelFp")
void cancelPasswordChangeRequest(ClickEvent e) {
presenter.onCancelPasswordChangeRequestButtonClicked();
}
@UiHandler("btnOKNewPassword")
void changePassword(ClickEvent e) {
presenter.onChangePasswordButtonClicked();
}
@UiHandler("btnCancelNewPassword")
void cancelChangePassword(ClickEvent e) {
presenter.onCancelChangePasswordButtonClicked();
}
@Override
public String getEmail() {
return txtUsername.getValue();
}
@Override
public void setEmail(String email) {
txtUsername.setValue(email);
}
@Override
public String getPassword() {
return pwdPassword.getValue();
}
@Override
public void setPassword(String password) {
pwdPassword.setValue(password);
}
@Override
public void hideMessage() {
alertError.setVisible(false);
}
@Override
public void showMessage() {
alertError.setVisible(true);
}
@Override
public void setMessage(String msg) {
alertError.setHTML(msg);
alertError.setType(AlertType.ERROR);
}
@Override
public void setMessage(String msg, AlertType alertType) {
alertError.setHTML(msg);
alertError.setType(alertType);
}
@Override
public void setMessage(List<String> msgs){
String errorsStr = "";
for (String error : msgs) {
errorsStr += error+"<br>";
}
alertError.setType(AlertType.ERROR);
alertError.setHTML(errorsStr);
}
@Override
public void displayView(VitrineViewType type){
if(type == null){
vitrineWrapper.setVisible(false);
return;
}
vitrineWrapper.setVisible(true);
loginPanel.setVisible(false);
signUpPanel.setVisible(false);
forgotPasswordPanel.setVisible(false);
newPasswordPanel.setVisible(false);
switch (type) {
case login:
loginPanel.setVisible(true);
Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
public void execute() {
txtUsername.setFocus(true);
}
});
break;
case register:
if(registrationEmail != null){
suEmail.setText(registrationEmail);
suEmail.setEnabled(false);
suEmail.setTitle(constants.registrationEmailMessage());
}
signUpPanel.setVisible(true);
Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
public void execute() {
suName.setFocus(true);
}
});
break;
case forgotPassword:
forgotPasswordPanel.setVisible(true);
Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
public void execute() {
fpEmail.setFocus(true);
}
});
break;
case newPassword:
newPasswordPanel.setVisible(true);
Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
public void execute() {
newPassword.setFocus(true);
}
});
break;
default:
break;
}
currentViewType = type;
}
@Override
public String getSuEmail() {
return suEmail.getValue();
}
@Override
public String getSuName() {
return suName.getValue();
}
@Override
public String getSuPassword() {
return suPassword.getValue();
}
@Override
public String getSuPasswordConfirm() {
return suPasswordConfirm.getValue();
}
@Override
public String getFpEmail() {
return fpEmail.getValue();
}
@Override
public String getNewPassword() {
return newPassword.getValue();
}
@Override
public String getNewPasswordConfirm() {
return newPasswordConfirm.getValue();
}
@Override
public void setLogoURL(String assetsURL) {
String skin = GenericClientFactoryImpl.KORNELL_SESSION.getInstitution().getSkin();
boolean isLightSkin = skin == null || !skin.contains("_light");
String barLogoFileName = "logo300x80" + (isLightSkin ? "_light" : "") + ".png";
imgLogo.setUrl(mkurl(assetsURL, barLogoFileName));
}
@Override
public void showRegistrationOption(boolean show) {
btnRegister.setVisible(show);
panelHR.setVisible(show);
}
@Override
public void setRegistrationEmail(String email) {
this.registrationEmail = email;
}
@Override
public boolean isForcedPasswordUpdate() {
return forcedPasswordUpdate;
}
@Override
public void setForcedPasswordUpdate(boolean forcedPasswordUpdate) {
this.forcedPasswordUpdate = forcedPasswordUpdate;
}
}