/******************************************************************************
* Product: Posterita Ajax UI *
* Copyright (C) 2007 Posterita Ltd. All Rights Reserved. *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
* For the text or an alternative of this public license, you may reach us *
* Posterita Ltd., 3, Draper Avenue, Quatre Bornes, Mauritius *
* or via info@posterita.org or http://www.posterita.org/ *
* *
* Contributors: *
* - Heng Sin Low *
* *
* Sponsors: *
* - Idalica Corporation *
*****************************************************************************/
package org.adempiere.webui.panel;
import java.io.IOException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Locale;
import java.util.Properties;
import org.adempiere.base.sso.SSOUtils;
import org.adempiere.util.Callback;
import org.adempiere.webui.AdempiereIdGenerator;
import org.adempiere.webui.LayoutUtils;
import org.adempiere.webui.apps.AEnv;
import org.adempiere.webui.component.Button;
import org.adempiere.webui.component.ComboItem;
import org.adempiere.webui.component.Combobox;
import org.adempiere.webui.component.ConfirmPanel;
import org.adempiere.webui.component.Label;
import org.adempiere.webui.component.Window;
import org.adempiere.webui.editor.WDateEditor;
import org.adempiere.webui.session.SessionManager;
import org.adempiere.webui.theme.ITheme;
import org.adempiere.webui.theme.ThemeManager;
import org.adempiere.webui.util.UserPreference;
import org.adempiere.webui.util.ZKUpdateUtil;
import org.adempiere.webui.window.Dialog;
import org.adempiere.webui.window.LoginWindow;
import org.compiere.model.MRole;
import org.compiere.model.MSysConfig;
import org.compiere.model.MUser;
import org.compiere.model.SystemProperties;
import org.compiere.util.Env;
import org.compiere.util.KeyNamePair;
import org.compiere.util.Language;
import org.compiere.util.Login;
import org.compiere.util.Msg;
import org.compiere.util.Util;
import org.compiere.util.WebUtil;
import org.zkoss.util.Locales;
import org.zkoss.web.Attributes;
import org.zkoss.zhtml.Table;
import org.zkoss.zhtml.Td;
import org.zkoss.zhtml.Tr;
import org.zkoss.zk.au.out.AuFocus;
import org.zkoss.zk.au.out.AuScript;
import org.zkoss.zk.ui.Desktop;
import org.zkoss.zk.ui.AbstractComponent;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.event.Deferrable;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zk.ui.sys.ComponentCtrl;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Div;
import org.zkoss.zul.Image;
/**
* Select role panel
* @author Ashley G Ramdass
* @date Feb 25, 2007
* @version $Revision: 0.10 $
* @author Sendy Yagambrum
* @date July 18, 2007
*/
public class RolePanel extends Window implements EventListener, Deferrable
{
/**
*
*/
private static final long serialVersionUID = -8077156023041816851L;
protected LoginWindow wndLogin;
protected Login login;
protected Combobox lstRole, lstClient, lstOrganisation, lstWarehouse;
protected Label lblRole, lblClient, lblDef, lblOrganisation, lblWarehouse, lblDate;
protected Label lblLanguage;
protected WDateEditor lstDate;
protected Combobox lstLanguage;
protected String validLstLanguage = null;
protected ConfirmPanel pnlButtons;
/** Context */
protected Properties m_ctx;
/** Username */
protected String m_userName;
/** Password */
protected KeyNamePair[] m_clientKNPairs;
protected UserPreference m_userpreference=null;
protected boolean m_showRolePanel = true;
private RolePanel component;
private boolean isChangeRole = false;
private boolean m_isClientDefined;
public boolean isChangeRole() {
return isChangeRole;
}
public void setChangeRole(boolean isChangeRole) {
this.isChangeRole = isChangeRole;
}
// backup old value
private Properties ctxBeforeChangeRole = null;
private static final String ON_DEFER_LOGOUT = "onDeferLogout";
/**
* @param ctx
* @param loginWindow
* @param userName
* @param show
* @param clientsKNPairs
* @param isClientDefined
*/
public RolePanel(Properties ctx, LoginWindow loginWindow, String userName, boolean show, KeyNamePair[] clientsKNPairs, boolean isClientDefined) {
this.wndLogin = loginWindow;
m_ctx = ctx;
m_userName = userName;
login = new Login(ctx);
m_showRolePanel = show;
m_isClientDefined = isClientDefined;
m_clientKNPairs = clientsKNPairs;
m_userpreference = SessionManager.getSessionApplication().getUserPreference();
if( m_clientKNPairs.length == 1 && !m_showRolePanel ){
Env.setContext(m_ctx, Env.AD_CLIENT_ID, (String) m_clientKNPairs[0].getID());
MUser user = MUser.get (m_ctx, Login.getAppUser(m_userName));
m_userpreference.loadPreference(user.get_ID());
} else {
m_userpreference.loadPreference(-1);
}
initComponents();
init();
this.setId("rolePanel");
this.setSclass("login-box");
if (! m_showRolePanel) {
// check if all mandatory fields are ok to not show
if ( lstRole.getSelectedItem() == null || lstRole.getSelectedItem().getValue() == null
|| lstClient.getSelectedItem() == null || lstClient.getSelectedItem().getValue() == null
|| lstOrganisation.getSelectedItem() == null || lstOrganisation.getSelectedItem().getValue() == null) {
m_showRolePanel = true;
}
}
if (m_showRolePanel) {
AuFocus auf = null;
if (lstClient.getItemCount() > 1) {
auf = new AuFocus(lstClient);
} else if (lstRole.getItemCount() > 1) {
auf = new AuFocus(lstRole);
} else {
auf = new AuFocus(lstOrganisation);
}
Clients.response(auf);
}
}
/**
* Layout panel
*/
private void init()
{
Clients.response(new AuScript("zAu.cmd0.clearBusy()"));
createUI();
}
/**
* Layout panel
*/
protected void createUI() {
Div div = new Div();
div.setSclass(ITheme.LOGIN_BOX_HEADER_CLASS);
Label label = new Label(Msg.getMsg(Env.getCtx(), "SelectRole"));
label.setSclass(ITheme.LOGIN_BOX_HEADER_TXT_CLASS);
div.appendChild(label);
this.appendChild(div);
Table table = new Table();
table.setId("grdChooseRole");
table.setDynamicProperty("cellpadding", "0");
table.setDynamicProperty("cellspacing", "5");
table.setSclass(ITheme.LOGIN_BOX_BODY_CLASS);
this.appendChild(table);
Tr tr = new Tr();
table.appendChild(tr);
Td td = new Td();
td.setSclass(ITheme.LOGIN_BOX_HEADER_LOGO_CLASS);
tr.appendChild(td);
td.setDynamicProperty("colspan", "2");
Image image = new Image();
image.setSrc(ThemeManager.getLargeLogo());
td.appendChild(image);
tr = new Tr();
tr.setId("rowclient");
table.appendChild(tr);
td = new Td();
tr.appendChild(td);
td.setSclass(ITheme.LOGIN_LABEL_CLASS);
td.appendChild(lblClient.rightAlign());
td = new Td();
td.setSclass(ITheme.LOGIN_FIELD_CLASS);
tr.appendChild(td);
td.appendChild(lstClient);
tr = new Tr();
tr.setId("rowRole");
table.appendChild(tr);
td = new Td();
tr.appendChild(td);
td.setSclass(ITheme.LOGIN_LABEL_CLASS);
td.appendChild(lblRole.rightAlign());
td = new Td();
td.setSclass(ITheme.LOGIN_FIELD_CLASS);
tr.appendChild(td);
td.appendChild(lstRole);
tr = new Tr();
tr.setId("rowLabelDefault");
table.appendChild(tr);
//td = new Td();
//tr.appendChild(td);
td = new Td();
tr.appendChild(td);
td.setSclass(ITheme.LOGIN_LABEL_CLASS);
div = new Div();
div.setStyle("text-align: right; text-decoration: underline");
div.appendChild(lblDef);
td.appendChild(div);
tr = new Tr();
tr.setId("rowOrganisation");
table.appendChild(tr);
td = new Td();
tr.appendChild(td);
td.setSclass(ITheme.LOGIN_LABEL_CLASS);
td.appendChild(lblOrganisation.rightAlign());
td = new Td();
td.setSclass(ITheme.LOGIN_FIELD_CLASS);
tr.appendChild(td);
td.appendChild(lstOrganisation);
tr = new Tr();
tr.setId("rowWarehouse");
table.appendChild(tr);
td = new Td();
tr.appendChild(td);
td.setSclass(ITheme.LOGIN_LABEL_CLASS);
td.appendChild(lblWarehouse.rightAlign());
td = new Td();
td.setSclass(ITheme.LOGIN_FIELD_CLASS);
tr.appendChild(td);
td.appendChild(lstWarehouse);
tr = new Tr();
tr.setId("rowLanguage");
table.appendChild(tr);
td = new Td();
tr.appendChild(td);
td.setSclass(ITheme.LOGIN_LABEL_CLASS);
td.appendChild(lblLanguage.rightAlign());
td = new Td();
td.setSclass(ITheme.LOGIN_FIELD_CLASS);
tr.appendChild(td);
td.appendChild(lstLanguage);
tr = new Tr();
tr.setId("rowDate");
table.appendChild(tr);
td = new Td();
tr.appendChild(td);
td.setSclass(ITheme.LOGIN_LABEL_CLASS);
td.appendChild(lblDate.rightAlign());
td = new Td();
td.setSclass(ITheme.LOGIN_FIELD_CLASS);
tr.appendChild(td);
td.appendChild(lstDate.getComponent());
div = new Div();
div.setSclass(ITheme.LOGIN_BOX_FOOTER_CLASS);
pnlButtons = new ConfirmPanel(true, false, false, false, false, false, true);
pnlButtons.addActionListener(this);
Button okBtn = pnlButtons.getButton(ConfirmPanel.A_OK);
okBtn.setWidgetListener("onClick", "zAu.cmd0.showBusy(null)");
okBtn.addCallback(ComponentCtrl.AFTER_PAGE_DETACHED, t -> ((AbstractComponent)t).setWidgetListener("onClick", null));
Button helpButton = pnlButtons.createButton(ConfirmPanel.A_HELP);
helpButton.addEventListener(Events.ON_CLICK, this);
helpButton.setSclass(ITheme.LOGIN_BUTTON_CLASS);
pnlButtons.addComponentsRight(helpButton);
LayoutUtils.addSclass(ITheme.LOGIN_BOX_FOOTER_PANEL_CLASS, pnlButtons);
ZKUpdateUtil.setWidth(pnlButtons, null);
pnlButtons.getButton(ConfirmPanel.A_OK).setSclass(ITheme.LOGIN_BUTTON_CLASS);
pnlButtons.getButton(ConfirmPanel.A_CANCEL).setSclass(ITheme.LOGIN_BUTTON_CLASS);
div.appendChild(pnlButtons);
this.appendChild(div);
if(validLstLanguage!=null)
languageChanged(validLstLanguage);
}
/**
* Create components
*/
private void initComponents()
{
Language language = Env.getLanguage(m_ctx);
lblClient = new Label();
lblClient.setId("lblClient");
lblClient.setValue(Msg.getMsg(language,"Client"));
lblRole = new Label();
lblRole.setId("lblRole");
lblRole.setValue(Msg.getMsg(language,"Role"));
lblDef = new Label();
lblDef.setId("lblDef");
lblDef.setValue(Msg.getMsg(language,"Defaults"));
lblOrganisation = new Label();
lblOrganisation.setId("lblOrganisation");
lblOrganisation.setValue(Msg.getMsg(language,"Organization"));
lblWarehouse = new Label();
lblWarehouse.setId("lblWarehouse");
lblWarehouse.setValue(Msg.getMsg(language,"Warehouse"));
lblLanguage = new Label();
lblLanguage.setId("lblLanguage");
lblLanguage.setValue("Language");
lblDate = new Label();
lblDate.setId("lblDate");
lblDate.setValue(Msg.getMsg(language,"Date"));
lstRole = new Combobox();
lstRole.setAutocomplete(true);
lstRole.setAutodrop(true);
lstRole.setId("lstRole");
lstRole.addEventListener(Events.ON_SELECT, this);
ZKUpdateUtil.setWidth(lstRole, "220px");
lstClient = new Combobox();
lstClient.setAutocomplete(true);
lstClient.setAutodrop(true);
lstClient.setId("lstClient");
lstClient.addEventListener(Events.ON_SELECT, this);
ZKUpdateUtil.setWidth(lstClient, "220px");
lstOrganisation = new Combobox();
lstOrganisation.setAutocomplete(true);
lstOrganisation.setAutodrop(true);
lstOrganisation.setId("lstOrganisation");
lstOrganisation.addEventListener(Events.ON_SELECT, this);
ZKUpdateUtil.setWidth(lstOrganisation, "220px");
lstWarehouse = new Combobox();
lstWarehouse.setAutocomplete(true);
lstWarehouse.setAutodrop(true);
lstWarehouse.setId("lstWarehouse");
lstWarehouse.addEventListener(Events.ON_SELECT, this);
ZKUpdateUtil.setWidth(lstWarehouse, "220px");
lstDate = new WDateEditor();
lstDate.setValue(new Timestamp(System.currentTimeMillis()));
lstDate.getComponent().setId("loginDate");
// initial client - Elaine 2009/02/06
UserPreference userPreference = SessionManager.getSessionApplication().getUserPreference();
String initDefault = userPreference.getProperty(UserPreference.P_CLIENT);
if( initDefault.length() == 0 && !m_showRolePanel && m_userpreference != null )
{
initDefault=m_userpreference.getProperty( UserPreference.P_CLIENT );
}
if (m_clientKNPairs != null && m_clientKNPairs.length > 0)
{
for(int i = 0; i < m_clientKNPairs.length; i++)
{
ComboItem ci = new ComboItem(m_clientKNPairs[i].getName(), m_clientKNPairs[i].getID());
if (SystemProperties.isZkUnitTest()) {
String id = AdempiereIdGenerator.escapeId(ci.getLabel());
if (lstClient.getFellowIfAny(id) == null)
ci.setId(id);
}
lstClient.appendChild(ci);
if (m_clientKNPairs[i].getID().equals(initDefault))
lstClient.setSelectedItem(ci);
}
if (lstClient.getSelectedIndex() == -1 && lstClient.getItemCount() > 0) {
m_showRolePanel = true; // didn't find default client
lstClient.setSelectedIndex(0);
}
}
//
if (m_clientKNPairs!=null && m_clientKNPairs.length == 1) {
// disable client if is just one
lstClient.setSelectedIndex(0);
lstClient.setEnabled(false);
} else {
lstClient.setEnabled(true);
}
// Disable date combo-box at login screen
if (!MSysConfig.getBooleanValue(MSysConfig.ALogin_ShowDate, true))
{
lstDate.setReadWrite(false);
}
lstLanguage = new Combobox();
lstLanguage.setAutocomplete(true);
lstLanguage.setAutodrop(true);
lstLanguage.setId("lstLanguage");
ZKUpdateUtil.setWidth(lstLanguage, "220px");
// Update Language List
lstLanguage.getItems().clear();
ArrayList supported = Env.getLoginLanguages();
String[] availableLanguages = Language.getNames();
for (String langName : availableLanguages)
{
Language lang = Language.getLanguage(langName);
if (!supported.contains(lang.getAD_Language()))
continue;
lstLanguage.appendItem(langName, lang.getAD_Language());
}
if(language!=null)
{
validLstLanguage = language.getName();
lstLanguage.setValue(validLstLanguage);
}
else if (lstLanguage.getItems().size() > 0)
{
validLstLanguage = (String) lstLanguage.getItems().get(0).getLabel();
lstLanguage.setValue(validLstLanguage);
}
lstLanguage.addEventListener(Events.ON_SELECT, this);
setUserID();
updateRoleList();
this.component = this;
component.addEventListener(ON_DEFER_LOGOUT, this);
}
/**
* Update roles available for selection (after selection of tenant)
*/
private void updateRoleList()
{
lstRole.getItems().clear();
lstRole.setText("");
setUserID();
UserPreference userPreference = SessionManager.getSessionApplication().getUserPreference();
Comboitem lstItemClient = lstClient.getSelectedItem();
if (lstItemClient != null)
{
userPreference.loadPreference(Env.getContextAsInt(m_ctx, Env.AD_USER_ID));
// initial role
String initDefault = userPreference.getProperty(UserPreference.P_ROLE);
if( initDefault.length() == 0 && !m_showRolePanel && m_userpreference != null )
{
initDefault=m_userpreference.getProperty( UserPreference.P_ROLE );
}
int clientId = Integer.valueOf((String)lstItemClient.getValue());
KeyNamePair clientKNPair = new KeyNamePair(clientId, lstItemClient.getLabel());
KeyNamePair roleKNPairs[] = login.getRoles(m_userName, clientKNPair, LoginPanel.ROLE_TYPES_WEBUI);
if (roleKNPairs != null && roleKNPairs.length > 0)
{
for (int i = 0; i < roleKNPairs.length; i++)
{
ComboItem ci = new ComboItem(roleKNPairs[i].getName(), roleKNPairs[i].getID());
if (SystemProperties.isZkUnitTest()) {
String id = AdempiereIdGenerator.escapeId(ci.getLabel());
if (lstRole.getFellowIfAny(id) == null)
ci.setId(id);
}
lstRole.appendChild(ci);
if (roleKNPairs[i].getID().equals(initDefault))
lstRole.setSelectedItem(ci);
}
if (lstRole.getSelectedIndex() == -1 && lstRole.getItemCount() > 0) {
m_showRolePanel = true; // didn't find default role
lstRole.setSelectedIndex(0);
}
}
//
// If we have only one role, we can make readonly the combobox
if (lstRole.getItemCount() == 1)
{
lstRole.setSelectedIndex(0);
lstRole.setEnabled(false);
} else {
lstRole.setEnabled(true);
}
}
updateOrganisationList();
updateLanguage();
if (lstClient.getChildren().size() > 1) {
userPreference.loadPreference(Env.getContextAsInt(m_ctx, Env.AD_USER_ID));
// saving the preferences was postponed until the user selects the client
Comboitem lstItemRole = lstRole.getSelectedItem();
Comboitem lstItemOrg = lstOrganisation.getSelectedItem();
Comboitem lstItemWarehouse = lstWarehouse.getSelectedItem();
Comboitem lstItemLanguage = lstLanguage.getSelectedItem();
if (lstItemLanguage != null && lstItemLanguage.getValue() != null)
userPreference.setProperty(UserPreference.P_LANGUAGE, (String) lstItemLanguage.getValue());
else
userPreference.setProperty(UserPreference.P_LANGUAGE, Env.getContext(m_ctx, UserPreference.LANGUAGE_NAME));
if (lstItemRole != null && lstItemRole.getValue() != null)
userPreference.setProperty(UserPreference.P_ROLE, (String) lstItemRole.getValue());
if (lstItemClient != null && lstItemClient.getValue() != null)
userPreference.setProperty(UserPreference.P_CLIENT, (String) lstItemClient.getValue());
if (lstItemOrg != null && lstItemOrg.getValue() != null)
userPreference.setProperty(UserPreference.P_ORG, (String) lstItemOrg.getValue());
if (lstItemWarehouse != null && lstItemWarehouse.getValue() != null)
userPreference.setProperty(UserPreference.P_WAREHOUSE, (String) lstItemWarehouse.getValue());
userPreference.savePreference();
}
}
private void updateLanguage()
{
UserPreference userPreference = SessionManager.getSessionApplication().getUserPreference();
String initDefault = userPreference.getProperty(UserPreference.P_LANGUAGE);
for (int i = 0; i < lstLanguage.getItemCount(); i++)
{
Comboitem li = lstLanguage.getItemAtIndex(i);
if (li.getLabel().equals(initDefault))
{
lstLanguage.setSelectedIndex(i);
languageChanged(li.getLabel()); // Elaine 2009/04/17 language changed
break;
}
}
if (lstLanguage.getItemCount() == 1)
{
lstLanguage.setSelectedIndex(0);
lstLanguage.setEnabled(false);
}
else
{
lstLanguage.setEnabled(true);
}
}
private void languageChanged(String langName)
{
Language language = findLanguage(langName);
lblClient.setValue(Msg.getMsg(language, "Client"));
lblRole.setValue(Msg.getMsg(language, "Role"));
lblDef.setValue(Msg.getMsg(language, "Defaults"));
lblOrganisation.setValue(Msg.getMsg(language, "Organization"));
lblWarehouse.setValue(Msg.getMsg(language, "Warehouse"));
lblLanguage.setValue(Msg.getMsg(language, "Language"));
lblDate.setValue(Msg.getMsg(language, "Date"));
if (pnlButtons != null) {
pnlButtons.getButton(ConfirmPanel.A_OK).setLabel(Util.cleanAmp(Msg.getMsg(language, ConfirmPanel.A_OK)));
pnlButtons.getButton(ConfirmPanel.A_HELP)
.setLabel(Util.cleanAmp(Msg.getMsg(language, ConfirmPanel.A_HELP)));
pnlButtons.getButton(ConfirmPanel.A_CANCEL)
.setLabel(Util.cleanAmp(Msg.getMsg(language, ConfirmPanel.A_CANCEL)));
}
}
private Language findLanguage(String langName)
{
Language tmp = Language.getLanguage(langName);
Language language = new Language(tmp.getName(), tmp.getAD_Language(), tmp.getLocale(), tmp.isDecimalPoint(),
tmp.getDateFormat().toPattern(), tmp.getMediaSize());
Env.verifyLanguage(m_ctx, language);
Env.setContext(m_ctx, Env.LANGUAGE, language.getAD_Language());
Env.setContext(m_ctx, AEnv.LOCALE, language.getLocale().toString());
// cph::erp added this in order to get the processing dialog in the correct language
Locale locale = language.getLocale();
try
{
Clients.reloadMessages(locale);
}
catch (IOException e)
{
Dialog.warn(0, e.getLocalizedMessage(), e.getMessage());
}
Locales.setThreadLocal(locale);
// cph::erp end
return language;
}
/**
* After organizations available for selection (after selection of role)
*/
private void updateOrganisationList()
{
lstOrganisation.getItems().clear();
lstOrganisation.setText("");
Comboitem lstItemRole = lstRole.getSelectedItem();
if(lstItemRole != null)
{
// initial organisation - Elaine 2009/02/06
UserPreference userPreference = SessionManager.getSessionApplication().getUserPreference();
String initDefault = userPreference.getProperty(UserPreference.P_ORG);
if( initDefault.length() == 0 && !m_showRolePanel && m_userpreference != null )
{
initDefault=m_userpreference.getProperty( UserPreference.P_ORG );
}
KeyNamePair RoleKNPair = new KeyNamePair(Integer.valueOf((String)lstItemRole.getValue()), lstItemRole.getLabel());
KeyNamePair orgKNPairs[] = login.getOrgs(RoleKNPair);
if(orgKNPairs != null && orgKNPairs.length > 0)
{
for(int i = 0; i < orgKNPairs.length; i++)
{
ComboItem ci = new ComboItem(orgKNPairs[i].getName(), orgKNPairs[i].getID());
if (SystemProperties.isZkUnitTest()) {
String id = AdempiereIdGenerator.escapeId(ci.getLabel());
if (lstOrganisation.getFellowIfAny(id) == null)
ci.setId(id);
}
lstOrganisation.appendChild(ci);
if(orgKNPairs[i].getID().equals(initDefault))
lstOrganisation.setSelectedItem(ci);
}
if (lstOrganisation.getSelectedIndex() == -1 && lstOrganisation.getItemCount() > 0) {
m_showRolePanel = true; // didn't find default organisation
lstOrganisation.setSelectedIndex(0);
}
}
// If we have only one org, we can make readonly the combobox
if (lstOrganisation.getItemCount() == 1)
{
lstOrganisation.setSelectedIndex(0);
lstOrganisation.setEnabled(false);
} else {
lstOrganisation.setEnabled(true);
}
//
}
updateWarehouseList();
}
/**
* Update list of warehouse available for selection (after selection of organization)
*/
private void updateWarehouseList()
{
lstWarehouse.getItems().clear();
lstWarehouse.setText("");
Comboitem lstItemOrganisation = lstOrganisation.getSelectedItem();
if(lstItemOrganisation != null)
{
// initial warehouse - Elaine 2009/02/06
UserPreference userPreference = SessionManager.getSessionApplication().getUserPreference();
String initDefault = userPreference.getProperty(UserPreference.P_WAREHOUSE);
if( initDefault.length() == 0 && !m_showRolePanel && m_userpreference != null )
{
initDefault=m_userpreference.getProperty( UserPreference.P_WAREHOUSE );
}
KeyNamePair organisationKNPair = new KeyNamePair(Integer.valueOf((String)lstItemOrganisation.getValue()), lstItemOrganisation.getLabel());
KeyNamePair warehouseKNPairs[] = login.getWarehouses(organisationKNPair);
if(warehouseKNPairs != null && warehouseKNPairs.length > 0)
{
for(int i = 0; i < warehouseKNPairs.length; i++)
{
ComboItem ci = new ComboItem(warehouseKNPairs[i].getName(), warehouseKNPairs[i].getID());
ci.setLabel(ci.getLabel());
lstWarehouse.appendChild(ci);
if(warehouseKNPairs[i].getID().equals(initDefault))
lstWarehouse.setSelectedItem(ci);
}
if (lstWarehouse.getSelectedIndex() == -1 && lstWarehouse.getItemCount() > 0) {
lstWarehouse.setSelectedIndex(0);
}
}
//
}
}
@Override
public void onEvent(Event event)
{
String eventCompId = event.getTarget().getId();
String eventName = event.getName();
if(eventName.equals("onSelect"))
{
if(eventCompId.equals(lstClient.getId())){
checkMandatoryField(lstClient, lblClient);
updateRoleList();
}
else if(eventCompId.equals(lstRole.getId())) {
checkMandatoryField(lstRole, lblRole);
setUserID();
updateOrganisationList();
}
else if(eventCompId.equals(lstOrganisation.getId())) {
checkMandatoryField(lstOrganisation, lblOrganisation);
updateWarehouseList();
}
else if (eventCompId.equals(lstLanguage.getId()))
{
if (lstLanguage.getSelectedItem() == null)
{
lstLanguage.setValue(validLstLanguage);
}
else
{
validLstLanguage = lstLanguage.getSelectedItem().getLabel();
}
languageChanged(validLstLanguage);
}
}
if (event.getTarget().getId().equals(ConfirmPanel.A_OK))
{
validateRoles(false);
}
else if (event.getTarget().getId().equals(ConfirmPanel.A_HELP))
{
openLoginHelp();
}
else if (event.getTarget().getId().equals(ConfirmPanel.A_CANCEL))
{
if (isChangeRole()) {
changeRole(ctxBeforeChangeRole);
validateRoles(false);
} else {
ctxBeforeChangeRole = null;
SessionManager.logoutSession();
//wndLogin.loginCancelled();
}
}
else if (ON_DEFER_LOGOUT.equals(event.getName()))
{
SessionManager.logoutSession();
//wndLogin.loginCancelled();
}
}
private void openLoginHelp() {
String lang = Env.getContext(Env.getCtx(), Env.LANGUAGE);
lang = lang.substring(0, 2);
String helpURL = MSysConfig.getValue(MSysConfig.LOGIN_SELECT_ROLE_HELP_URL, "https://wiki.idempiere.org/{lang}/Login_Select_Role_Help");
if (helpURL.contains("{lang}")) {
String rawURL = helpURL;
helpURL = Util.replace(rawURL, "{lang}", lang);
if (!"en".equals(lang) && !WebUtil.isUrlOk(helpURL))
helpURL = Util.replace(rawURL, "{lang}", "en"); // default to English
}
try {
Executions.getCurrent().sendRedirect(helpURL, "_blank");
}
catch (Exception e) {
String message = e.getMessage();
Dialog.warn(0, "URLnotValid", message);
}
}
/**
* Set user id to environment context
*/
private void setUserID() {
if (lstClient.getSelectedItem() != null) {
Env.setContext(m_ctx, Env.AD_CLIENT_ID, (String) lstClient.getSelectedItem().getValue());
} else {
Env.setContext(m_ctx, Env.AD_CLIENT_ID, (String) null);
}
MUser user = MUser.get (m_ctx, Login.getAppUser(m_userName));
if (user != null) {
Env.setContext(m_ctx, Env.AD_USER_ID, user.getAD_User_ID() );
Env.setContext(m_ctx, Env.AD_USER_NAME, user.getName() );
Env.setContext(m_ctx, Env.SALESREP_ID, user.getAD_User_ID() );
}
}
/**
* show UI for change role
* @param ctx env context
*/
public void changeRole(Properties ctx) {
ctxBeforeChangeRole = new Properties();
ctxBeforeChangeRole.putAll(ctx);
int AD_Client_ID = Env.getAD_Client_ID(ctx);
lstClient.setValue(AD_Client_ID);
updateRoleList();
int AD_Role_ID = Env.getAD_Role_ID(ctx);
lstRole.setValue(AD_Role_ID);
updateOrganisationList();
int AD_Org_ID = Env.getContextAsInt(ctx, "#AD_Org_ID_ChangeRole");
lstOrganisation.setValue(AD_Org_ID);
updateWarehouseList();
int M_Warehouse_ID = Env.getContextAsInt(ctx, Env.M_WAREHOUSE_ID);
lstWarehouse.setValue(M_Warehouse_ID);
}
/**
* Validate fields
* @param isMFAValidated
*
*/
public void validateRoles(boolean isMFAValidated)
{
Clients.clearBusy();
Comboitem lstItemRole = lstRole.getSelectedItem();
Comboitem lstItemClient = lstClient.getSelectedItem();
Comboitem lstItemOrg = lstOrganisation.getSelectedItem();
Comboitem lstItemWarehouse = lstWarehouse.getSelectedItem();
Comboitem lstItemLanguage = lstLanguage.getSelectedItem();
checkMandatoryField(lstClient, lblClient);
checkMandatoryField(lstRole, lblRole);
checkMandatoryField(lstOrganisation, lblOrganisation);
int orgId = 0, warehouseId = 0;
orgId = Integer.parseInt((String)lstItemOrg.getValue());
KeyNamePair orgKNPair = new KeyNamePair(orgId, lstItemOrg.getLabel());
KeyNamePair warehouseKNPair = null;
if(lstItemWarehouse != null && lstItemWarehouse.getValue() != null)
{
warehouseId = Integer.parseInt((String)lstItemWarehouse.getValue());
warehouseKNPair = new KeyNamePair(warehouseId, lstItemWarehouse.getLabel());
}
Timestamp date = (Timestamp)lstDate.getValue();
String msg = login.loadPreferences(orgKNPair, warehouseKNPair, date, null);
if (! Util.isEmpty(msg))
{
Env.getCtx().clear();
Dialog.error(0, "Error", msg, new Callback() {
@Override
public void onCallback(Integer result) {
Events.echoEvent(new Event(ON_DEFER_LOGOUT, component));
}
});
return;
}
// Elaine 2009/02/06 save preference to AD_Preference
UserPreference userPreference = SessionManager.getSessionApplication().getUserPreference();
if (lstItemLanguage != null && lstItemLanguage.getValue() != null)
userPreference.setProperty(UserPreference.P_LANGUAGE, (String) lstItemLanguage.getValue());
else
userPreference.setProperty(UserPreference.P_LANGUAGE, Env.getContext(m_ctx, UserPreference.LANGUAGE_NAME));
userPreference.setProperty(UserPreference.P_ROLE, (String) lstItemRole.getValue());
userPreference.setProperty(UserPreference.P_CLIENT, (String) lstItemClient.getValue());
userPreference.setProperty(UserPreference.P_ORG, (String) lstItemOrg.getValue());
userPreference.setProperty(UserPreference.P_WAREHOUSE,
lstItemWarehouse != null ? (String) lstItemWarehouse.getValue() : "0");
userPreference.savePreference();
// force reload of default role when more than 1 client
if (lstClient.getChildren().size() > 1)
MRole.getDefault(m_ctx, true);
String langName = null;
if (lstLanguage.getSelectedItem() != null)
langName = (String) lstLanguage.getSelectedItem().getLabel();
else
langName = Language.getBaseLanguage().getName();
Language language = findLanguage(langName);
Env.setContext(m_ctx, UserPreference.LANGUAGE_NAME, language.getName());
Locale locale = language.getLocale();
Desktop desktop = Executions.getCurrent().getDesktop();
desktop.getSession().setAttribute(Attributes.PREFERRED_LOCALE, locale);
try
{
Clients.reloadMessages(locale);
}
catch (IOException e)
{
Dialog.warn(0, e.getLocalizedMessage(), e.getMessage());
}
Locales.setThreadLocal(locale);
if (m_isClientDefined || isMFAValidated)
wndLogin.loginCompleted(login, orgKNPair, this);
else
wndLogin.validateMFA(orgKNPair, m_isClientDefined, m_userName, m_showRolePanel, m_clientKNPairs);
desktop.getSession().setAttribute(SSOUtils.ISCHANGEROLE_REQUEST, false);
}
/**
* Check if the field is filled, throws WrongValueException if not
* @param lst
* @param lbl
*/
private void checkMandatoryField(Combobox lst, Label lbl) {
Comboitem item = lst.getSelectedItem();
if (item == null || item.getValue() == null) {
throw new WrongValueException(lst, Msg.getMsg(m_ctx, "FillMandatory") + lbl.getValue());
}
}
@Override
public boolean isDeferrable() {
return false;
}
/**
* @return true if role selection panel will be shown to user
*/
public boolean show() {
return m_showRolePanel;
}
}