Optional UI Components
Any UI component on a web page can be made optional. ‘optional’ means two things here:
- Depending on some application logic, the component is displayed or not. Example: When a user checks a checkbox ‘Additional Data Entry’, more input fields are displayed and available for input.
- In web application A, a UI component of a web page is displayed, whereas in a web application B, that UI component is not displayed.
Modeling¶
In the model you can make individual UI components being optional.
You can also make all components of a section of a web page being optional by setting set Optional = true;
on the ‘display’ level.
layout PersonView {
link Children = PersonData, AdditionalPersonData;
}
display PersonData {
component Input1 : TextField;
component Input2 : TextField {
set Optional = true;
}
...
}
display AdditionalPersonData {
set Optional = true;
component Input3 : TextField;
...
}
Generated Code in Web Fragment¶
The following code fragments are related to the above example model.
In PersonViewBean.java you find the following:
private boolean renderedInput1PersonData = true;
private boolean renderedAdditionalPersonData = true;
...
public boolean isRenderedInput1PersonData() {
...
}
public boolean isRenderedAdditionalPersonData() {
...
}
In PersonViewBeanCustomization.java you find the same kind of code, which has the purpose of setting a default value and allowing to override that default setting from a web application.
private boolean renderedInput1PersonData = true;
private boolean renderedAdditionalPersonData = true;
...
public boolean isRenderedInput1PersonData() {
...
}
public boolean isRenderedAdditionalPersonData() {
...
}
In personView_generated.xhtml you find the following code that uses the above methods. Please note that some code has been left out and a few line breaks are added here to make the sample code more readable.
...
<p:panelGrid
id="mainForm_personDataPanelGrid">
...
<p:outputLabel
id="personDataPanelGrid_Input1Label"
for="personDataPanelGrid_input1"
...
rendered="#{personViewBeanCustomization.isRenderedInput1PersonData()
and
personViewBean.renderedInput1PersonData}"/>
<p:inputText
id="personDataPanelGrid_input1"
...
rendered="#{personViewBeanCustomization.isRenderedInput1PersonData()
and
personViewBean.renderedInput1PersonData}"/>
...
</p:panelGrid>
...
<p:panelGrid
id="mainForm_additionalPersonDataPanelGrid"
...
rendered="#{personViewBeanCustomization.isRenderedAdditionalPersonData()
and
personViewBean.renderedAdditionalPersonData}">
...
</p:panelGrid>
If the isRendered...()
method in the PersonViewBeanCustomization
class returns false, then the corresponding UI component is not displayed.
Customize the code in that class when you want a UI component not being displayed by default.
If you want a UI component being displayed depending on application logic, then set the field rendered...
in PersonViewBean
class.
Finally, if you want to overwrite the default setting for the rendering of a UI component, you have to manually write code in classes that are generated by the web application generator.
Note
The visibility of a label that is related to an optional UI component is automatically controlled with the same logic as the UI component itself. No additional modeling or coding is required to get that.
Generated Code in Web Application¶
The web application contains a generated Java class AppPersonViewBeanCustomization
. That class has the following code:
public Boolean isRenderedInput1PersonData() {
return null;
}
public Boolean isRenderedAdditionalPersonData() {
return null;
}
By default these methods return null
. When you want a UI component not being displayed at all, then let the corresponding method return false (return Boolean.FALSE;
).