The basic idea is to enable the selectManyCheckbox
when the selectBooleanCheckbox
is not checked. When I first load the page and uncheck the selectBooleanCheckbox
the rendering in ajax seems not to be working because the selectManyCheckbox
remains disabled. How can I check what's wrong? Or what am I missing?
This happens just when I first load the page, If I hit the button and play with the checkboxes suddenly it starts working.
Cheers,
<h:form id="formActualizacionCubo">
<rich:panel id="panelActualizacionCubo"
style="width: 350px">
<f:facet name="header">
<h:outputText value="Administracion Cubo de Información PEC"/>
</f:facet>
<h:outputLabel for="selectDependenciasCubo"
value="Actualizar TODO el Cubo de informacion?"/>
<h:selectBooleanCheckbox id="selectDependenciasCubo"
value="#{administrationBean.actualizaTodasDependencias}">
<f:ajax event="click"
listener="#{administrationBean.doClearCuboLabels}"
render="opcionesDependenciasCubo seleccionDependencias messageActualizaCubo actualizacionCuboCorrecta"/>
</h:selectBooleanCheckbox>
<a4j:outputPanel id="opcionesDependenciasCubo">
<h:selectManyCheckbox id="seleccionDependencias"
layout="pageDirection" required="true"
requiredMessage="Seleccione al menos una dependencia."
disabled="#{administrationBean.actualizaTodasDependencias}"
value="#{administrationBean.dependenciasPorActualizar}">
<f:selectItems value="#{administrationBean.dependenciasOpciones}"/>
<f:ajax event="click"
listener="#{administrationBean.doClearCuboLabels}"
render="messageActualizaCubo actualizacionCuboCorrecta"/>
</h:selectManyCheckbox>
<rich:message id="messageActualizaCubo"
for="seleccionDependencias"/>
</a4j:outputPanel>
<h:panelGrid columns="3">
<a4j:commandButton id="btnActualizaCubo" value="Actualizar Cubo PEC"
render="messageActualizaCubo actualizacionCuboCorrecta @this"
onbegin="this.disabled=true;
document.getElementById('formActualizacionCubo:imgProcesandoCubo').style.display='block'"
oncomplete="this.disabled=false;
document.getElementById('formActualizacionCubo:imgProcesandoCubo').style.display='none'"
action="#{administrationBean.doActualizaCubo}"/>
<h:panelGroup/>
<h:graphicImage id="imgProcesandoCubo" url="img/imgLoading.gif"
style="display: none"/>
</h:panelGrid>
<a4j:outputPanel id="actualizacionCuboCorrecta" style="font-size: 14px; color: #D17100">
<h:outputText rendered="#{administrationBean.actualizacionCuboCorrectaLabelRendered}"
value="Actualización correcta !"/>
<h:outputText rendered="#{administrationBean.actualizacionCuboFalloLabelRendered}"
value="Fallo la actualización !"/>
</a4j:outputPanel>
</rich:panel>
</h:form>
UPDATE
Post my Backing bean code, maybe you can find something wrong with it
private HashMap<String, String> dependencias;
private boolean actualizaTodoCuboChecked = true;
private List<String> dependenciasOpciones;
private List<String> dependenciasPorActualizar;
private boolean actualizacionCuboCorrectaLabelRendered = false;
private boolean actualizacionCuboFalloLabelRendered = false;
public boolean isActualizaTodoCuboChecked() {
return actualizaTodoCuboChecked;
}
public void setActualizaTodoCuboChecked(boolean actualizaTodoCuboChecked) {
this.actualizaTodoCuboChecked = actualizaTodoCuboChecked;
dependenciasPorActualizar.clear();
}
public List<String> getDependenciasOpciones() {
return dependenciasOpciones;
}
public void setDependenciasOpciones(List<String> dependenciasOpciones) {
this.dependenciasOpciones = dependenciasOpciones;
}
public List<String> getDependenciasPorActualizar() {
return dependenciasPorActualizar;
}
public void setDependenciasPorActualizar(List<String> dependenciasPorActualizar) {
this.dependenciasPorActualizar = dependenciasPorActualizar;
}
public boolean isActualizacionCuboCorrectaLabelRendered() {
return actualizacionCuboCorrectaLabelRendered;
}
public boolean isActualizacionCuboFalloLabelRendered() {
return actualizacionCuboFalloLabelRendered;
}
public void doClearCuboLabels(){
actualizacionCuboCorrectaLabelRendered = false;
actualizacionCuboFalloLabelRendered = false;
}
public void doActualizaCubo() {
if (actualizaTodoCuboChecked) {
//Actualiza todas las dependencias
//actualizacionCuboCorrectaLabelRendered = db.actualizarCuboInformacion(dependenciasOpciones);
} else {
//Actualiza solo las dependencias seleccionadas
//actualizacionCuboCorrectaLabelRendered = db.actualizarCuboInformacion(dependenciasPorActualizar);
}
actualizacionCuboCorrectaLabelRendered = true; //Eliminar esta fila cuando se descomenten las llamadas en el IF-ELSE
actualizacionCuboFalloLabelRendered = !actualizacionCuboCorrectaLabelRendered;
}
private void loadDependenciesFromXML() {
XStream reader = new XStream(new DomDriver());
reader.alias("root", Map.class);
dependencias =
(HashMap<String, String>) reader.fromXML(new File(ROOT_DIR + "/confFiles/dependencias.xml"));
dependenciasOpciones = new ArrayList<String>();
for (String s : dependencias.keySet()) {
dependenciasOpciones.add(s);
}
}
Finally after checking all my code step by step I realized that the two Lists were not initialized. So the problem got solved changing from this:
private List<String> dependenciasOpciones;
private List<String> dependenciasPorActualizar;
to this
private List<String> dependenciasOpciones = new ArrayList<String>();
private List<String> dependenciasPorActualizar = new ArrayList<String>();
and then everything worked perfect.