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 <p:selectBooleanCheckbox> que define o endereço como sendo principal.
O que necessito validar neste <p:selectBooleanCheckbox>.
- 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
[code] // 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");
}
}
}[/code]
Nesta seguinte situação o checkbox esta validando na chamada da janela, mas o evento do <p:selectBooleanCheckbox> nao chama (não faz nada) e o salvar tambem nao está fazendo nada!!
se alterar a propriedade <p:selectBooleanCheckbox> deixando sem value e o <p:ajax> 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 <p:ajax> 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