I'm facing an issue with switching dynaforms and form validation. When I validate my form fields in the first dynaform that is rendered every validation message shows up just fine. When I then switch to a different dynaform via an ajax update and validate the form fields the label in the validation messages, e.g for required input fields, is always the label of the last input field of the first dynaform.
View
Code: Select all
<h:form id="myForm">
<p:outputPanel id="dynaFormGroup">
<p:selectOneButton value="#{myController.selectedType}" >
<f:selectItems value="#{myController.typeDefinitions}" var="def" itemLabel="#{def.type}" itemValue="#{def.type}"/>
<p:ajax event="change" update="dynaPanel" process="@this" />
</p:selectOneButton>
<p:outputPanel id="dynaPanel">
<pe:dynaForm id="dynaForm" value="#{myController.model}" var="data">
<f:facet name="header"/>
<pe:dynaFormControl type="input" for="txt">
<p:outputLabel id="txtLabel" for="txt" value="#{data.type}"/>
<p:inputText id="txt" value="#{data.value}" validator="#{my.validate}"
required="#{data.partDefinition.required}" maxlength="#{data.partDefinition.maxLength}"
>
<f:attribute name="validatorId" value="#{data.partDefinition.validatorId}" />
<p:ajax event="blur" update="txt txtMsg txtLabel" />
</p:inputText>
<p:message id="txtMsg" for="txt"/>
</pe:dynaFormControl>
</pe:dynaForm>
</p:outputPanel>
</p:outputPanel>
</h:form>
Code: Select all
@Named
@ConversationScoped
public class MyController implements Serializable {
private DynaFormModel model;
private String selectedType = "Type1";
private String lastSelectedType = "";
@PostConstruct
public void init() {
if (model == null) {
updateModel();
}
}
public DynaFormModel getModel() {
return model;
}
public void setModel(DynaFormModel model) {
this.model = model;
}
public String getSelectedType() {
return selectedType;
}
public void setSelectedType(String selectedType) {
this.selectedType = selectedType;
updateModelIfTypeChanged(selectedType);
}
private void updateModelIfTypeChanged(String selectedType) {
if (!lastSelectedType.equals(selectedType)) {
updateModel();
resetEditableValueHolders();
lastSelectedType = selectedType;
}
}
private void updateModel() {
model = new DynaFormModel();
List<Part> parts = getParts(selectedType);
addToModel(parts);
}
private List<Part> getParts(String selectedType) {
List<Part> parts = new ArrayList<Parts>();
// create Parts for given type, e.g Type1, Type2
......
return parts ;
}
private void addToModel(List<Part> parts) {
for (Part part : parts) {
DynaFormRow row = model.createRegularRow();
PartDefinition partDefinition = part.getPartDefinition();
row.addControl(part, partDefinition.getControlType(), 1, 1);
}
}
/**
* Resets the DynaForm component so that input data of value holders with validation errors are reset.
*/
public void resetEditableValueHolders() {
RequestContext.getCurrentInstance().reset("form:dynaPanel");
}
}
Any idea how I can work around that or what is wrong in my code?
Thanks,
Alex
P.S.: I couldn't use the labels provided by the DynaForm Component as they don't have an ID and I didn't find a way to update them. If not updated after ajax validation they stay marked red even though the form might already be valid again.