Get all the children components recursively for all UI Components

Problem- Need to reset all the input Components in the page on the click of a button.On first thought developer think of do this in the bean by getting the binding of the outermost layout component and then using the getChildren() method for that UIComponent.Then for all the UI components in the list,set the reset property to true.But problem here is that page contain multiple layout components. And getChildren() method would not recursively search for all the UI components (including inside the other layout components such as panelgrouplayout.


Implementation –
Its plain java.Call the method recursively.get each input Component and reset it.

// reset all the child uicomponents
private void resetValueInputItems(AdfFacesContext adfFacesContext,
                                 UIComponent component){
   List<UIComponent> items = component.getChildren();
   for ( UIComponent item : items ) {
      
       resetValueInputItems(adfFacesContext,item);
      
       if ( item instanceof RichInputText  ) {
           RichInputText input = (RichInputText)item;
           if ( !input.isDisabled() ) {
               input.resetValue() ;
               adfFacesContext.addPartialTarget(input);
           };
       } else if ( item instanceof RichInputDate ) {
           RichInputDate input = (RichInputDate)item;
           if ( !input.isDisabled() ) {
               input.resetValue() ;
               adfFacesContext.addPartialTarget(input);
           };
       }
   }
} 
 

Happy learning with Vinay Kumar in techartifact…

Open and close all af:showDetail in Oracle ADF

Requirement- functionality to open/close all
Implementation- Use forEach instead of iterator so that you can access children from panelGroupLayout parent component.

Here is the sample code:

    <af:commandButton id="cbShow" text="Show All" icon="/gfx/icons/show.gif" action="#{toggleShowDetails.showAll}"   styleClass="info showHide" iconPosition="trailing" partialSubmit="true"/>  
    <af:panelGroupLayout binding="#{toggleShowDetails.pglDetails}">  
        <af:forEach items="#{pageFlowScope.informationList}" var="blok" varStatus="status">  
              <af:showDetail id="sdInfo" disclosedText="Disclosed" undisclosedText="Undisclosed" partialTriggers="cbShow">  
                   <af:outputText value="Some value"/>  
             </af:showDetail>  
         </af:forEach>  
    </af:panelGroupLayout>  
 
 

    public String showAll() {  
        for(UIComponent child : pglDetails.getChildren()){  
            if(child instanceof RichShowDetail){  
                RichShowDetail showDetail = (RichShowDetail)child;  
                showDetail.setDisclosed(true);  
            }  
          DisclosureEvent event = new DisclosureEvent(showDetail, false);
          event.queue();
        }  
        return null;  
    }  
 

af:iterator is a component by ADF whereas af:forEach is an ADF extension to the JSTL tag c:forEach.
af:iterator doesn’t create multiple copies of each sub component, hence you can’t access all dynamically generated instances for modifying from bean and should not use af:iterator

Happy Learning wit Vinay Kumar