JSF - Campos sendo renderizados por um botão

Bom dia galera :slight_smile:

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

Já vi tópicos parecidos aqui no forum,
mas o rendered nao era mudado dinamicamente.

Era algo estático quando a pagina era carregada.
Alguem ja fez isso?

up

d34d_d3v1l , não dê UP no seu tópico, ele não é mais importante que os outros. Além do mais, hoje é domingo e nem todos que estão online conseguirão te ajudar.

Deixa ver se entendi:

Você quer que seja exibido no seu formulário um SelectOne, exemplo:

[code]- Inserir carro

  • Inserir tijolo
  • Vender boneco
    [ OK ][/code]

E quando você acionar o botão, irá exibir o campo para isso?

# Inserir Carro # Modelo: Ano: Cor:

É isso mesmo?

Não é isto.

Desculpe pelo UP, mas me responda (sinceramente), se eu não tivesse postado o ‘up’ vc teria visto o tópico?

Na verdade não… Bom vou exlpicar em partes.

Eu tenho um select com

         <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" />    

Aí o cara clica no mais, e isto vai mudar o valor do rendered desse campo…
A ideia é mais ou menos essa :slight_smile:

Tenho Um MAP com o id do campo e um boolean…
Aí depois eu tento por ajax atulizar o form…

ja tentei

:filterForm
filterForm
@this
(@this)
@form

mas nao cfunciona

vlw
@(for,)

Não vi pois estou procurando solução pro meu problema e estou estudando. mostra como esse botão mais está funcionando.