[RESOLVIDO] <p:selectBooleanCheckbox> evento ao clicar (tikar o quadradinho)

1 resposta
O

Galera boa noite! Estou com uma pedra no meu sapato já faz 2 dias, conto com a ajuda de voceis em =D.

IDEIA: Estou desenvolvendo um sistema onde uma pessoa possa ter vários endereços. Criei a seguinte regra. "Que dentro de todos os endereços de uma empresa, devera ser especificado um endereço como sendo o principal, para que possa utilizado em impressões etc. Atributo este definido como String(length = 1)

PROBLEMA:Em minha tela de cadastro de empresa(herda pessoa) eu listo todos os endereços dessa empresa, onde lá eu posso incluir , excluir , alterar. Ao realizar a inclusão ou alteração de um endereço, eu chamo uma dialog para fazer esta inclusão ou alteração. Nesta dialo possuo um que define o endereço como sendo principal.

O que necessito validar neste .

* Se já existe algum outro endereço sendo Principal (devendo bloquear o campo para que não seja possível marca-lo) - OK
* Se o endereço que escolhi para alterar é o endereço principal. (devendo deixar o campo liberado caso queira desmarca-lo como principal) - OK
* Ao clicar no campo devo automaticamente definir o endereço como principal. - OK

O meu problema começa realmente nesta parte:

Eu já criei os metodos para validar os 3 itens citados acima. Mas não consigo fazer a chamada do metodo ao clicar no evento.

Vou colocar como está meu dialog a baixo e o que eu já tentei fazer:

Dialog:
<p:dialog id="modalEndereco" header="Cadastro de Endereço" widgetVar="modEnd" appendToBody="true" resizable="false" modal="true">
            <h:form>
                <p:panelGrid id="pnCadEnd">
                    <p:row>
                        <p:column style="text-align: right;">Tipo Endereco:</p:column>
                        <p:column style="text-align: left;">
                            <h:selectOneMenu style="width:150px" value="#{empresaController.endereco.tpEndereco}">
                                <f:selectItem itemLabel="Tipo Endereço" itemDisabled="true"/>
                                <f:selectItems value="#{empresaController.endereco.tpEndereco.tipos}"/>
                            </h:selectOneMenu>
                        </p:column>
                        <p:column style="text-align: left;">
                            <h:outputLabel value="Endereço Principal?: "/>
                            <p:selectBooleanCheckbox value="#{empresaController.isEnderecoPrincipal()}"  disabled="#{empresaController.checaEnderecoPrincipal()}">
                                <p:ajax event="click" listener="#{empresaController.setaEnderecoPrincipal()}"/>
                            </p:selectBooleanCheckbox>     
                        </p:column>
                    </p:row>
                    <p:row>
                        <p:column style="text-align: right;">Cep:</p:column>
                        <p:column style="text-align: left;" colspan="2">
                            <p:inputMask mask="99999-999" value="#{empresaController.endereco.cep}"/>
                        </p:column>
                    </p:row>
                    <p:row>
                        <p:column style="text-align: right;">Logradouro:</p:column>
                        <p:column colspan="2">
                            <p:inputText value="#{empresaController.endereco.endereco}" size="80"/>
                        </p:column>
                    </p:row>
                    <p:row>
                        <p:column style="text-align: right;">Número:</p:column>
                        <p:column style="text-align: left;" colspan="2">
                            <p:inputText value="#{empresaController.endereco.num}" size="8" />
                        </p:column>
                    </p:row>
                    <p:row>
                        <p:column style="text-align: right;">Cidade:</p:column>
                        <p:column colspan="2" style="text-align: left;">
                            <h:selectOneMenu style="width:200px" value="#{empresaController.endereco.cidade}" converter="#{enderecoController.converterCidade}">
                                <f:selectItem itemLabel="Escolha uma Cidade" itemDisabled="true"/>
                                <f:selectItems value="#{enderecoController.cidades}"/>
                            </h:selectOneMenu>
                        </p:column>
                    </p:row>
                    <p:row>
                        <p:column style="text-align: right;">Bairro:</p:column>
                        <p:column colspan="2" style="text-align: left;">
                            <h:selectOneMenu style="width:200px" value="#{empresaController.endereco.bairro}" converter="#{enderecoController.converterBairro}">
                                <f:selectItem itemLabel="Escolha um Bairro" itemDisabled="true"/>
                                <f:selectItems value="#{enderecoController.bairros}"/>
                            </h:selectOneMenu>
                        </p:column>
                    </p:row>
                    <p:row>
                        <p:column style="text-align: right;">Complemento:</p:column>
                        <p:column colspan="2" style="text-align: left;">
                            <p:inputText value="#{empresaController.endereco.complemento}" size="80"/>
                        </p:column>
                    </p:row>
                </p:panelGrid>
                <br/>
                <p:separator/>
                <p:commandButton value="Salvar" immediate="true" actionListener="#{empresaController.salvarEndereco}" update=":form_cadastro" oncomplete="modEnd.hide()" icon="btn_salvar"/>
                <p:commandButton value="Cancelar" immediate="true" icon="btn_cancela" oncomplete="modEnd.hide()"/>
            </h:form>
        </p:dialog>

Metodos no MB

// Metodo que checa se existe dentro todos os endereços algum endereço principal
    public boolean checaEnderecoPrincipal() {
        boolean resultado = false;
        if (endereco != null) {
            for (Endereco end : empresa.getEndereco()) {
                if (end.getStatus_principal().equals("S")) {
                    resultado = true; // se achar é para bloquear o campo
                    break;
                } else {
                    resultado = false; // se nao achar libera para poder setar
                }
            }
            if (endereco.getStatus_principal().equals("S")){
                resultado = false;
            }                                     // se o usuario selecionado for o endereco principal deve ficar
                                                  // liberado para poder desmarcar
        } else {
            resultado = true;
        }
        return resultado;
    }

    // Metodo que traz o checkbox marcado caso ele tenha escolhido o endereço principal
    public boolean isEnderecoPrincipal() {
        if (endereco != null) {
            if (endereco.getStatus_principal().equals("S")) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    // Metodo a ser chamado no evento ao clicar no checkbox
    public void setaEnderecoPrincipal() {
        if (endereco != null) {
            if (endereco.getStatus_principal().equals("S")) {
                endereco.setStatus_principal("N");
            } else {
                endereco.setStatus_principal("S");
            }
        }
    }

Nesta seguinte situação o checkbox esta validando na chamada da janela, mas o evento do nao chama (não faz nada) e o salvar tambem nao está fazendo nada!!

se alterar a propriedade deixando sem value e o sem event igual está no site do primefaces

<p:selectBooleanCheckbox disabled="#{empresaController.checaEnderecoPrincipal()}">
                                <p:ajax listener="#{empresaController.setaEnderecoPrincipal()}"/>
                            </p:selectBooleanCheckbox>

o Salvar funciona, o evento de clicar no checkbox tambem funciona, MAS NÃO CONSIGO TRAZER EN TELA O BENDITO DO CHECKBOX MARCADO.

já tentei colocar o metodo do click recebendo parametro de AjaxBehaviorEvent.

já tentei colocar o como immediate.

Não sei o que fazer, já pensei em nao executar evento algum ao clicar e tentar recuperar o estado do checkbox diretamente pelo MB.

Se alguem tiver a solução,
Se alguem tiver uma maneira melhor de trabalhar com + de 1 endereço,
Se alguem mandar eu mudar toda esta ideia louca, e fazer apenas com um endereço.

Estou aceitando responstas... Grato =D

1 Resposta

O

Já resolvi, defini o atributo como do tipo boleano e atribui pro value do checkbox. Pois verifiquei que o checkbox ja trata automaticamente em quando marcalo/desmarcalo alterar o valor do atributo para true e false.

Criado 7 de setembro de 2012
Ultima resposta 8 de set. de 2012
Respostas 1
Participantes 1