/****************************************************************************** * 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.util.Properties; import java.util.ResourceBundle; import org.adempiere.webui.LayoutUtils; 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.exception.ApplicationException; 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.window.LoginWindow; import org.compiere.model.MRole; import org.compiere.model.MSysConfig; 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.zkoss.zhtml.Table; import org.zkoss.zhtml.Td; import org.zkoss.zhtml.Tr; import org.zkoss.zk.au.out.AuFocus; 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.util.Clients; import org.zkoss.zul.Button; import org.zkoss.zul.Comboitem; import org.zkoss.zul.Div; import org.zkoss.zul.Image; /** * * @author <a href="mailto:agramdass@gmail.com">Ashley G Ramdass</a> * @date Feb 25, 2007 * @version $Revision: 0.10 $ * @author <a href="mailto:sendy.yagambrum@posterita.org">Sendy Yagambrum</a> * @date July 18, 2007 */ public class RolePanel extends Window implements EventListener, Deferrable { /** * */ private static final long serialVersionUID = -2210467236654772389L; private static final String RESOURCE = "org.compiere.apps.ALoginRes"; private LoginWindow wndLogin; private Login login; private KeyNamePair rolesKNPairs[]; private Combobox lstRole, lstClient, lstOrganisation, lstWarehouse; private Label lblRole, lblClient, lblOrganisation, lblWarehouse; private Button btnOk, btnCancel; public RolePanel(Properties ctx, LoginWindow loginWindow, String userName, String password) { this.wndLogin = loginWindow; login = new Login(ctx); rolesKNPairs = login.getRoles(userName, password); if(rolesKNPairs == null) throw new ApplicationException("Login is invalid, UserName: " + userName + " and Password:" + password); initComponents(); init(); this.setId("rolePanel"); AuFocus auf = new AuFocus(lstRole); Clients.response(auf); } private void init() { Div div = new Div(); div.setSclass(ITheme.LOGIN_BOX_HEADER_CLASS); Label label = new Label("Login"); 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("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("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("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); div = new Div(); div.setSclass(ITheme.LOGIN_BOX_FOOTER_CLASS); ConfirmPanel pnlButtons = new ConfirmPanel(true); pnlButtons.addActionListener(this); LayoutUtils.addSclass(ITheme.LOGIN_BOX_FOOTER_PANEL_CLASS, pnlButtons); pnlButtons.setWidth(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); } private void initComponents() { Language language = Env.getLanguage(Env.getCtx()); ResourceBundle res = ResourceBundle.getBundle(RESOURCE, language.getLocale()); lblRole = new Label(); lblRole.setId("lblRole"); lblRole.setValue(res.getString("Role")); lblClient = new Label(); lblClient.setId("lblClient"); lblClient.setValue(res.getString("Client")); lblOrganisation = new Label(); lblOrganisation.setId("lblOrganisation"); lblOrganisation.setValue(res.getString("Organization")); lblWarehouse = new Label(); lblWarehouse.setId("lblWarehouse"); lblWarehouse.setValue(res.getString("Warehouse")); lstRole = new Combobox(); lstRole.setAutocomplete(true); lstRole.setAutodrop(true); lstRole.setId("lstRole"); lstRole.addEventListener(Events.ON_SELECT, this); lstRole.setWidth("220px"); lstClient = new Combobox(); lstClient.setAutocomplete(true); lstClient.setAutodrop(true); lstClient.setId("lstClient"); lstClient.addEventListener(Events.ON_SELECT, this); lstClient.setWidth("220px"); lstOrganisation = new Combobox(); lstOrganisation.setAutocomplete(true); lstOrganisation.setAutodrop(true); lstOrganisation.setId("lstOrganisation"); lstOrganisation.addEventListener(Events.ON_SELECT, this); lstOrganisation.setWidth("220px"); lstWarehouse = new Combobox(); lstWarehouse.setAutocomplete(true); lstWarehouse.setAutodrop(true); lstWarehouse.setId("lstWarehouse"); lstWarehouse.addEventListener(Events.ON_SELECT, this); lstWarehouse.setWidth("220px"); btnOk = new Button(); btnOk.setId("btnOk"); btnOk.setLabel("Ok"); btnOk.addEventListener("onClick", this); btnCancel = new Button(); btnCancel.setId("btnCancel"); btnCancel.setLabel("Cancel"); btnCancel.addEventListener("onClick", this); // initial role - Elaine 2009/02/06 UserPreference userPreference = SessionManager.getSessionApplication().getUserPreference(); String initDefault = userPreference.getProperty(UserPreference.P_ROLE); for(int i = 0; i < rolesKNPairs.length; i++) { ComboItem ci = new ComboItem(rolesKNPairs[i].getName(), rolesKNPairs[i].getID()); lstRole.appendChild(ci); if(rolesKNPairs[i].getID().equals(initDefault)) lstRole.setSelectedItem(ci); } if (lstRole.getSelectedIndex() == -1 && lstRole.getItemCount() > 0) lstRole.setSelectedIndex(0); // // If we have only one role, we can hide the combobox - metas-2009_0021_AP1_G94 if (lstRole.getItemCount() == 1 && ! MSysConfig.getBooleanValue("ALogin_ShowOneRole", true)) { lstRole.setSelectedIndex(0); lblRole.setVisible(false); lstRole.setVisible(false); } else { lblRole.setVisible(true); lstRole.setVisible(true); } updateClientList(); } private void updateClientList() { lstClient.getItems().clear(); Comboitem lstItemRole = lstRole.getSelectedItem(); if(lstItemRole != null) { // initial client - Elaine 2009/02/06 UserPreference userPreference = SessionManager.getSessionApplication().getUserPreference(); String initDefault = userPreference.getProperty(UserPreference.P_CLIENT); KeyNamePair roleKNPair = new KeyNamePair(new Integer((String)lstItemRole.getValue()), lstItemRole.getLabel()); KeyNamePair clientKNPairs[] = login.getClients(roleKNPair); if(clientKNPairs != null && clientKNPairs.length > 0) { for(int i = 0; i < clientKNPairs.length; i++) { ComboItem ci = new ComboItem(clientKNPairs[i].getName(), clientKNPairs[i].getID()); lstClient.appendChild(ci); if(clientKNPairs[i].getID().equals(initDefault)) lstClient.setSelectedItem(ci); } if (lstClient.getSelectedIndex() == -1 && lstClient.getItemCount() > 0) lstClient.setSelectedIndex(0); } // //force reload of default role MRole.getDefault(Env.getCtx(), true); } updateOrganisationList(); } private void updateOrganisationList() { lstOrganisation.getItems().clear(); lstOrganisation.setText(""); Comboitem lstItemClient = lstClient.getSelectedItem(); if(lstItemClient != null) { // initial organisation - Elaine 2009/02/06 UserPreference userPreference = SessionManager.getSessionApplication().getUserPreference(); String initDefault = userPreference.getProperty(UserPreference.P_ORG); KeyNamePair clientKNPair = new KeyNamePair(new Integer((String)lstItemClient.getValue()), lstItemClient.getLabel()); KeyNamePair orgKNPairs[] = login.getOrgs(clientKNPair); if(orgKNPairs != null && orgKNPairs.length > 0) { for(int i = 0; i < orgKNPairs.length; i++) { ComboItem ci = new ComboItem(orgKNPairs[i].getName(), orgKNPairs[i].getID()); lstOrganisation.appendChild(ci); if(orgKNPairs[i].getID().equals(initDefault)) lstOrganisation.setSelectedItem(ci); } if (lstOrganisation.getSelectedIndex() == -1 && lstOrganisation.getItemCount() > 0) lstOrganisation.setSelectedIndex(0); } // } updateWarehouseList(); } 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); KeyNamePair organisationKNPair = new KeyNamePair(new Integer((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()); lstWarehouse.appendChild(ci); if(warehouseKNPairs[i].getID().equals(initDefault)) lstWarehouse.setSelectedItem(ci); } if (lstWarehouse.getSelectedIndex() == -1 && lstWarehouse.getItemCount() > 0) lstWarehouse.setSelectedIndex(0); } // } } public void onEvent(Event event) { String eventCompId = event.getTarget().getId(); String eventName = event.getName(); if(eventName.equals("onSelect")) { if(eventCompId.equals(lstRole.getId())) updateClientList(); else if(eventCompId.equals(lstClient.getId())) updateOrganisationList(); else if(eventCompId.equals(lstOrganisation.getId())) updateWarehouseList(); } if (event.getTarget().getId().equals(ConfirmPanel.A_OK)) { validateRoles(); } else if (event.getTarget().getId().equals(ConfirmPanel.A_CANCEL)) { wndLogin.loginCancelled(); } } /** * validate Roles * **/ public void validateRoles() { Comboitem lstItemRole = lstRole.getSelectedItem(); Comboitem lstItemClient = lstClient.getSelectedItem(); Comboitem lstItemOrg = lstOrganisation.getSelectedItem(); Comboitem lstItemWarehouse = lstWarehouse.getSelectedItem(); if(lstItemRole == null || lstItemRole.getValue() == null) { throw new WrongValueException(lstRole, Msg.getMsg(Env.getCtx(), "FillMandatory") + lblRole.getValue()); } else if(lstItemClient == null || lstItemClient.getValue() == null) { throw new WrongValueException(lstClient, Msg.getMsg(Env.getCtx(), "FillMandatory") + lblClient.getValue()); } else if(lstItemOrg == null || lstItemOrg.getValue() == null) { throw new WrongValueException(lstOrganisation, Msg.getMsg(Env.getCtx(), "FillMandatory") + lblOrganisation.getValue()); } 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()); } String msg = login.validateLogin(orgKNPair); if (msg != null && msg.length() > 0) { throw new WrongValueException(msg); } msg = login.loadPreferences(orgKNPair, warehouseKNPair, null, null); if(!(msg == null || msg.length() == 0)) { throw new WrongValueException(msg); } wndLogin.loginCompleted(); // Elaine 2009/02/06 save preference to AD_Preference UserPreference userPreference = SessionManager.getSessionApplication().getUserPreference(); userPreference.setProperty(UserPreference.P_LANGUAGE, Env.getContext(Env.getCtx(), UserPreference.LANGUAGE_NAME)); userPreference.setProperty(UserPreference.P_ROLE, lstItemRole != null ? (String) lstItemRole.getValue() : "0"); userPreference.setProperty(UserPreference.P_CLIENT, lstItemClient != null ? (String) lstItemClient.getValue() : "0"); userPreference.setProperty(UserPreference.P_ORG, lstItemOrg != null ? (String) lstItemOrg.getValue() : "0"); userPreference.setProperty(UserPreference.P_WAREHOUSE, lstItemWarehouse != null ? (String) lstItemWarehouse.getValue() : "0"); userPreference.savePreference(); // } public boolean isDeferrable() { return false; } }