Bom dia galera 
Eu quero fazer um ‘formulário’ dinâmico…
Mas na verdade não e´dinamico. Bom, eis a ideia…
Um selectOne com o nome dos campos,
um botão para adicionar esse campo ao formulario.
Só que o campo já vai estar ‘escrito’ no xhtml, só que rendered = false.
Então quando o usuario clicar no + vai mudar o valor do rendered para true
e por ajax dar um update no formulário. Deveria funcionar né?
Na prática, nao funcionou.
Aqui o selectOneMenu com os campos
<h:form id="filterForm">
<p:panelGrid columns="6" style="margin: 0px auto;">
<f:facet name="header">
<p:selectOneMenu value="#{grupoController.selectedFilter}">
<f:selectItem itemLabel="Selecione um filtro..." itemValue="" />
<f:selectItem itemLabel="Idade" itemValue="filterIdade" />
<f:selectItem itemLabel="Data" itemValue="filterData" />
<f:selectItem itemLabel="Descricao/Unidade" itemValue="filterUnidadeDesc" />
</p:selectOneMenu>
<p:commandButton icon="ui-icon-circle-plus" actionListener="#{grupoController.givePermission()}" update=":filterForm"/>
</f:facet>
<!-- ID -->
<p:outputLabel for="filterId" value="#{msg['entity.codigo']}"/>
<p:inputText id="filterId" value="#{grupoController.entityFilter.id}"/>
<p:outputLabel for="filterIdOperation" value="#{msg['label.operation']}"/>
<p:selectOneMenu id="filterIdOperation" converter="queryOperationConverter" value="#{grupoController.entityFilter.idOperation}" >
<f:selectItems value="#{grupoController.queryOperationAsArray}" />
</p:selectOneMenu>
<p:outputLabel for="filterIdMatch" value="#{msg['label.match']}"/>
<p:selectOneMenu id="filterIdMatch" converter="matchModeConverter" value="#{grupoController.entityFilter.idMatch}" >
<f:selectItems value="#{grupoController.matchModeAsArray}" />
</p:selectOneMenu>
<!-- Descricao -->
<p:outputLabel for="filterDesc" value="#{msg['entity.descricao']}"/>
<p:inputText id="filterDesc" value="#{grupoController.entityFilter.descricao}"/>
<p:outputLabel for="filterDescOperation" value="#{msg['label.operation']}"/>
<p:selectOneMenu id="filterDescOperation" converter="queryOperationConverter" value="#{grupoController.entityFilter.descOperation}" >
<f:selectItems value="#{grupoController.queryOperationAllAsArray}" />
</p:selectOneMenu>
<p:outputLabel for="filterDescMatch" value="#{msg['label.match']}"/>
<p:selectOneMenu id="filterDescMatch" converter="matchModeConverter" value="#{grupoController.entityFilter.descMatch}" >
<f:selectItems value="#{grupoController.matchModeAsArray}" />
</p:selectOneMenu>
<!-- Idade -->
<p:outputLabel rendered="#{grupoController.filterIsVisible(filterIdade)}" for="filterIdade" value="#{msg['entity.idade']}"/>
<p:inputText rendered="#{grupoController.filterIsVisible(filterIdade)}" id="filterIdade" value="#{grupoController.entityFilter.idade}"/>
<p:outputLabel rendered="#{grupoController.filterIsVisible(filterIdade)}" for="filterIdadeOperation" value="#{msg['label.operation']}"/>
<p:selectOneMenu rendered="#{grupoController.filterIsVisible(filterIdade)}" id="filterIdadeOperation" converter="queryOperationConverter" value="#{grupoController.entityFilter.idadeOperation}" >
<f:selectItems value="#{grupoController.queryOperationAsArray}" />
</p:selectOneMenu>
<p:outputLabel rendered="#{grupoController.filterIsVisible(filterIdade)}" for="filterIdadeMatch" value="#{msg['label.match']}"/>
<p:selectOneMenu rendered="#{grupoController.filterIsVisible(filterIdade)}" id="filterIdadeMatch" converter="matchModeConverter" value="#{grupoController.entityFilter.idadeMatch}" >
<f:selectItems value="#{grupoController.matchModeAsArray}" />
</p:selectOneMenu>
Alguns campos não tem o rendered pq são ‘padroes’ para pesquisa…
O método no MB
public void givePermission(){
filtersMap.put(selectedFilter, Boolean.TRUE);
}
public void forbidPermission(){
filtersMap.put(selectedFilter, Boolean.FALSE);
}
public Boolean filterIsVisible(String filter){
Boolean value = filtersMap.get(filter);
return ObjectUtil.naoNulos(value) ? value : false;
}
Como podem ver, um MAP que vai armazenar os valores…
E depois o me´todo filterIsVisible para ver se o campo está visível ou não
Eu fiz algo errado?
Bom, a ideia é boa né?
Alguem me ajuda a arrumar isto OU fazer de alguma outra forma?
Abraços