package is.idega.idegaweb.egov.bpm.application;
import is.idega.idegaweb.egov.application.business.ApplicationType.ApplicationTypeHandlerComponent;
import is.idega.idegaweb.egov.application.data.Application;
import is.idega.idegaweb.egov.application.presentation.ApplicationCreator;
import is.idega.idegaweb.egov.bpm.IWBundleStarter;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.html.HtmlMessage;
import javax.faces.context.FacesContext;
import org.springframework.beans.factory.annotation.Autowired;
import com.idega.block.web2.business.JQuery;
import com.idega.core.accesscontrol.business.AccessController;
import com.idega.core.accesscontrol.data.ICRole;
import com.idega.idegaweb.IWBundle;
import com.idega.idegaweb.IWResourceBundle;
import com.idega.jbpm.exe.BPMFactory;
import com.idega.presentation.Block;
import com.idega.presentation.IWContext;
import com.idega.presentation.Layer;
import com.idega.presentation.ui.CheckBox;
import com.idega.presentation.ui.DropdownMenu;
import com.idega.presentation.ui.Label;
import com.idega.presentation.ui.SelectOption;
import com.idega.presentation.ui.SelectPanel;
import com.idega.util.CoreConstants;
import com.idega.util.expression.ELUtil;
/**
* @author <a href="civilis@idega.com">Vytautas Čivilis</a>
* @version $Revision: 1.7 $
*
* Last modified: $Date: 2008/09/03 13:49:03 $ by $Author: civilis $
*
*/
public class UIApplicationTypeBPMHandler extends Block implements ApplicationTypeHandlerComponent {
public static final String rolesToStartCaseNeedToBeCheckedParam = "rolesToStartCaseNeedToBeChecked";
public static final String rolesToStartCaseParam = "rolesToStartCase";
private Application application;
static final String MENU_PARAM = "procDefId";
@Autowired
private BPMFactory bpmFactory;
@Autowired
private ApplicationTypeBPM applicationTypeBPM;
@Autowired
private JQuery jQuery;
@Override
public void main(IWContext iwc) throws Exception {
String procDef = iwc.getParameter(MENU_PARAM);
DropdownMenu menu = new DropdownMenu(MENU_PARAM);
menu.setId(MENU_PARAM);
menu.addMenuElement("-1", "Select");
ApplicationTypeBPM appTypeBPM = getApplicationTypeBPM();
appTypeBPM.fillMenu(menu);
if(application != null) {
menu.setSelectedElement(getApplicationTypeBPM().getSelectedElement(application));
}
if(procDef != null && !procDef.equals("-1")) {
menu.setSelectedElement(procDef);
}
Layer container = new Layer(Layer.SPAN);
Layer errorItem = new Layer(Layer.SPAN);
errorItem.setStyleClass("error");
Label label = new Label("BPM process", menu);
HtmlMessage msg = (HtmlMessage)iwc.getApplication().createComponent(HtmlMessage.COMPONENT_TYPE);
msg.setFor(menu.getId());
errorItem.add(msg);
container.add(label);
container.add(menu);
container.add(errorItem);
Layer rolesContainer = new Layer(Layer.DIV);
container.add(rolesContainer);
CheckBox cb = new CheckBox(rolesToStartCaseNeedToBeCheckedParam, Boolean.TRUE.toString());
label = new Label("Only roles selected can submit application", cb);
rolesContainer.add(label);
rolesContainer.add(cb);
rolesContainer = new Layer(Layer.DIV);
container.add(rolesContainer);
AccessController ac = iwc.getAccessController();
Collection<ICRole> roles = ac.getAllRoles();
final List<String> selectedRoles;
boolean isSelected = iwc.isParameterSet(rolesToStartCaseNeedToBeCheckedParam);
if(iwc.isParameterSet(rolesToStartCaseParam)) {
String[] vals = iwc.getParameterValues(rolesToStartCaseParam);
selectedRoles = Arrays.asList(vals);
} else if((procDef != null && !procDef.equals("-1")) || application != null) {
final Long pdId;
if(procDef != null && !procDef.equals("-1")) {
pdId = new Long(procDef);
} else
pdId = new Long(getApplicationTypeBPM().getSelectedElement(application));
selectedRoles = getApplicationTypeBPM().getRolesCanStartProcess(pdId, application.getPrimaryKey());
isSelected = selectedRoles != null && !selectedRoles.isEmpty();
} else
selectedRoles = null;
if(isSelected)
cb.setChecked(true, true);
SelectPanel rolesMenu = new SelectPanel(rolesToStartCaseParam);
rolesMenu.setSize(10);
rolesMenu.setMultiple(true);
if(roles != null) {
for (ICRole role : roles) {
SelectOption option = new SelectOption(role.getRoleKey(), role.getRoleKey());
if(selectedRoles != null && selectedRoles.contains(role.getRoleKey()))
option.setSelected(true);
rolesMenu.addOption(option);
}
}
Layer rolesSpan = new Layer(Layer.SPAN);
if(!isSelected)
rolesSpan.setStyleAttribute("display: none");
label = new Label("Select roles", rolesMenu);
rolesSpan.add(label);
rolesSpan.add(rolesMenu);
rolesContainer.add(rolesSpan);
IWBundle bundle = getBundle(iwc);
String includeJs1 = "'"+getjQuery().getBundleURIToJQueryLib()+"', '"+bundle.getVirtualPathWithFileNameString("javascript/ApplicationTypeBPMHandler.js")+"'";
String act = "LazyLoader.loadMultiple(["+includeJs1+"], function() {AppTypeBPM.processRolesCheckbox('"+cb.getId()+"', '"+rolesSpan.getId()+"', '"+rolesMenu.getId()+"')});";
cb.setOnClick(act);
String includeJs2 = "'"+CoreConstants.DWR_ENGINE_SCRIPT+"', '/dwr/interface/ApplicationTypeBPM.js'";
act = "LazyLoader.loadMultiple(["+includeJs1+", "+includeJs2+"], function() {AppTypeBPM.processProcessesSelector('"+menu.getId()+"', '"+rolesMenu.getId()+"', '"+rolesSpan.getId()+"', '"+cb.getId()+"', "+(application != null ? application.getPrimaryKey().toString() : null)+");});";
menu.setOnChange(act);
add(container);
//PresentationUtil.addJavaScriptActionToBody(iwc, "");
}
public void setApplication(Application application) {
this.application = application;
}
@Override
public String getBundleIdentifier() {
return IWBundleStarter.IW_BUNDLE_IDENTIFIER;
}
@Override
public UIComponent getUIComponent(FacesContext ctx, Application app) {
UIApplicationTypeBPMHandler h = new UIApplicationTypeBPMHandler();
h.setApplication(app);
return h;
}
@Override
public boolean validate(IWContext iwc) {
boolean valid = true;
IWResourceBundle iwrb = getResourceBundle(iwc);
String procDef = iwc.getParameter(MENU_PARAM);
String action = iwc.getParameter(ApplicationCreator.ACTION);
if((procDef == null || procDef.equals("-1")) && ApplicationCreator.SAVE_ACTION.equals(action)) {
iwc.addMessage(MENU_PARAM, new FacesMessage(iwrb.getLocalizedString("bpm_proc_select", "'BPM process' field value is not selected")));
valid = false;
}
return valid;
}
public BPMFactory getBpmFactory() {
if(bpmFactory == null)
ELUtil.getInstance().autowire(this);
return bpmFactory;
}
public void setBpmFactory(BPMFactory bpmFactory) {
this.bpmFactory = bpmFactory;
}
public void setApplicationTypeBPM(ApplicationTypeBPM applicationTypeBPM) {
this.applicationTypeBPM = applicationTypeBPM;
}
public ApplicationTypeBPM getApplicationTypeBPM() {
if(applicationTypeBPM == null)
ELUtil.getInstance().autowire(this);
return applicationTypeBPM;
}
public JQuery getjQuery() {
if (jQuery == null) {
ELUtil.getInstance().autowire(this);
}
return jQuery;
}
public void setjQuery(JQuery jQuery) {
this.jQuery = jQuery;
}
}