Inquisitive
Inquisitive

Reputation: 7846

How can the dependencies between drop downs be managed?

I am using JSF2.0. I have three drop downs :

  1. masterDropDown.
  2. childDropDownA
  3. childDropDownB

The business rule that needs to be enforced is :

  1. Whenever masterDropDown changes , I need to populate childDropDownA and childDropDownB.
  2. The contents of childDropDownA and childDropDownB are same except that when the user selects something from childDropDownA, childDropDownB should have its old contents except the one selected by user in childDropDownA. The same rule applies when the user selects childDropDownB first.

What is the cleanest way to achieve this in JSF?

Upvotes: 2

Views: 85

Answers (1)

Luiggi Mendoza
Luiggi Mendoza

Reputation: 85779

Plain JSF 2:

<h:form>
    <h:selectOneMenu id="ddlMaster" value="#{bean.ddlMasterSelected}">
        <f:listItems value="#{bean.ddlMasterData}" />
        <f:ajax listener="#{bean.fillChildren}" render="ddlChildA ddlChildB" />
    </h:selectOneMenu>
    <h:selectOneMenu id="ddlChildA" value="#{bean.ddlChildASelected}">
        <f:listItems value="#{bean.ddlChildAData}" />
        <f:ajax listener="#{bean.refillChildB}" render="ddlChildB" />
    </h:selectOneMenu>
    <h:selectOneMenu id="ddlChildB" value="#{bean.ddlChildBSelected}">
        <f:listItems value="#{bean.ddlChildBData}" />
        <f:ajax listener="#{bean.refillChildA}" render="ddlChildA" />
    </h:selectOneMenu>
</h:form>

Managed bean

@ManagedBean
@ViewScoped
public class Bean {
    private Map<String, String> ddlMasterData;
    private Map<String, String> ddlChildAData;
    private Map<String, String> ddlChildBData;
    private String ddlMasterSelected;
    private String ddlChildASelected;
    private String ddlChildBSelected;

    @PostConstruct
    public void init() {
        //fill initial values for the drop down lists...
        //this is a raw idea, you must refine it
        DDLService ddlService = new DDLService();
        ddlMasterData = ddlService.getDDLMasterData();
        //empty data for children ddls
        ddlChildAData = new LinkedHashMap<String, String>();
        ddlChildBData = new LinkedHashMap<String, String>();
    }

    public void refillChildB(AjaxBehaviorEvent event) {
        //filling the children ddls
        DDLService ddlService = new DDLService();
        ddlChildASelected = ddlService.getDDLChildData();
        //same method to fill child data on ddlChildBSelected  because is same data
        ddlChildBSelected = ddlService.getDDLChildData();
    }

    public void fillChildren(AjaxBehaviorEvent event) {
        //when the user selects something from childDropDownA
        //childDropDownB should have its old contents
        //I assume it must be cleared, you can change this behavior though
        ddlChildBData = new LinkedHashMap<String, String>();
    }

    public void refillChildA(AjaxBehaviorEvent event) {
        //The same rule applies when the user selects childDropDownB first
        //I assume it must be cleared, you can change this behavior though
        ddlChildAData = new LinkedHashMap<String, String>();
    }
}

Upvotes: 4

Related Questions