Oi pessoal.
Ao clicar num botão é exibido um dialog para edição de dados, onde contém um selectOneMenu que mostra prefixos e, após selecionar um desses prefixos, três selectCheckboxMenus são carregados com dados de funcionários.
<p:outputLabel value="prefix" for="prefixo" />
<h:panelGroup>
<p:selectOneMenu id="prefixo" value="#{demandasController.selected.prefixo}" converter="prefixosConverter" filter="true" filterMatchMode="contains">
<f:selectItem itemLabel="#{adeBundle.SelectOneMessage}" itemValue="#{null}" />
<f:selectItems value="#{prefixosController.items}"
var="prefixoItem"
itemValue="#{prefixoItem}"
itemLabel="#{prefixoItem.prefixo} - #{prefixoItem.nomePrefixo}"
/>
<p:ajax event="valueChange" update="uorPosCollection uorPosCollection1 uorPosCollection2" listener="#{demandasController.changePrefixo}"/>
</p:selectOneMenu>
</h:panelGroup>
<p:outputLabel value="Executivo(s)" for="uorPosCollection" />
<p:selectCheckboxMenu id="uorPosCollection" value="#{demandasController.selected.uorPosCollection}" label="Executivo(s)" multiple="true" converter="uorPosConverter" filter="true" filterMatchMode="contains" >
<f:selectItems value="#{demandasController.availableExecutivos}"
var="uorPosCollectionItem"
itemValue="#{uorPosCollectionItem}"
itemLabel="#{uorPosCollectionItem.matricula} - #{uorPosCollectionItem.nome} (#{uorPosCollectionItem.prefixo.prefixo})" />
</p:selectCheckboxMenu>
<!-- código análogo omitido-->
O Listener:
public void changePrefixo(AjaxBehaviorEvent event) {
availableExecutivos = LoadExecutivosListCombo(super.getSelected().getPrefixo());
//código análogo omitido
}
Os métodos para carregar as listas de funcionários:
private List<UorPos> LoadExecutivosListCombo(Prefixos prefixos) {
List<SelectItem> listExecutivosCombo = new ArrayList<>();
List<UorPos> listExecutivos = uorPosFacade.findUorPosExecutivosByPrefixo(prefixos);
for (int i = 0; i < listExecutivos.size(); i++) {
listExecutivosCombo.add(new SelectItem(listExecutivos.get(i)));
}
return listExecutivos;
}
//código análogo omitido
Native queries para recuperar no banco de dados:
public List<UorPos> findUorPosExecutivosByPrefixo(Prefixos prefixo) {
return (List<UorPos>) getEntityManager().createNativeQuery("SELECT * FROM UorPos WHERE prefixo=9951", UorPos.class).setParameter(1, prefixo.getPrefixo()).getResultList();
}
//código análogo omitido
Tudo funciona ok, porém, ao abrir o form para editar um registro previamente salvo, eles estão aparecendo o id junto com o nome da classe (o que eu não quero) e as listas dentro dos combobox não são carregadas:
Exemplo: na figura acima, o prefixo 9882 é exibido como esperado e os três comboboxes estão vazios e são exibidos o id com o nome da classe. Se eu selecionar um valor diferente de 9882, o ajax é ativado e os comboboxes são carregados, mas os ids com o nome das classes continuam sendo exibidos. Mas se eu selecionar 9882 novamente, os ids são exibidos como deveriam, ou seja, sem os nomes das classes e as listas nos comboboxes são carregadas:
Estou tentando resolver isso ativando o ajax ao carregar o dialog, mas não sei como chamar o Listener na função:
<p:dialog onShow="CallAjaxFunction()" modal="true" >
<script>
function CallAjaxFunction() {
<!-- como ativar o ajax /Listener aqui ?-->
alert("exibido após carregar o dialog.")
}
</script>
...
</p:dialog>
Alguém sabe como fazer para acionar o ajax ao carregar um formulário?
Ou, se alguém tiver outra solução para exibir os valores nos labels (sem o nome da classe) e carregar automaticamente as listas nos comboboxes seria ótimo.
Desde já, obrigado.