Pessoal, tenho uma lista num dataTable e para cada registro dessa lista quero poder editar seu campo correspondente, mas não to conseguindo pegar o objeto em questão (alarm).
Preciso passar algum parametro para o MB? Como minha lista alarmes é um @DataModel e o objeto alarm é um @DataModelSelection achei que não precisasse, vi algo sobre f:setPropertyActionListener mas não entendi como seria o target="#{}" e o value="#{}" para o meu caso, e nem como recupero no MB. Segue o código:
[code]rich:panel
<f:facet name=“header”>Central de Alarmes: #{alarms.size} resultado(s)</f:facet>
<h:form id=“alarm”>
<rich:dataTable id=“alarmList” var="_alarm"
value="#{alarms}" rows=“15” reRender=“ds” rowKeyVar=“row”>
rich:column
<f:facet name=“header”>Ponto</f:facet>
<h:outputText value="#{_alarm.measure.point.name}" />
</rich:column>
<rich:column styleClass=“action”>
<f:facet name=“header”>Acao</f:facet>
<a:commandButton ajaxSingle="true" id="editlink" image="/img/edit.gif"
oncomplete="#{rich:component('editPanel')}.show()"
reRender="panelGrid">
<rich:toolTip for="editlink" value="Editar" />
</a:commandButton>
// MODAL PANEL
<rich:modalPanel id="editPanel" autosized="true" rendered="true">
<f:facet name="header">
<h:outputText value="Adicionar Comentario" />
</f:facet>
<f:facet name="controls">
<h:panelGroup>
<h:graphicImage value="/img/close.png" id="hidelink"
styleClass="hidelink" />
<rich:componentControl for="editPanel" attachTo="hidelink"
operation="hide" event="onclick" />
</h:panelGroup>
</f:facet>
<h:form>
<h:panelGrid columns="1">
<a:outputPanel>
<h:panelGrid columns="2" id="panelGrid">
<h:outputText value="Comentario" />
<h:inputText value="#{alarmAction.alarm.comment}" />
// já tentei passar como "_alarm.comment" mas não deu certo também
</h:panelGrid>
</a:outputPanel>
<a:commandButton value="Salvar"
action="#{alarmAction.saveAlarm}"
oncomplete="#{rich:component('editPanel')}.hide();" />
</h:panelGrid>
</h:form>
</rich:modalPanel>
</rich:column>
</rich:dataTable>
</h:form>
</div>
</rich:panel>
[/code]
[code]@Name(“alarmAction”)
@Scope(ScopeType.CONVERSATION)
public class AlarmAction {
@DataModel
private List<Alarm> alarms;
@DataModelSelection
@Out(required=false)
private Alarm alarm;
@Factory("alarms")
public void listAlarms() {
alarms = entityManager.createQuery("select a from Alarm a")
.getResultList();
}
public String saveAlarm() {
// como pego o alarm.comment aqui?
alarm.setSolutionDatetime(new Date());
entityManager.merge(alarm);
return "saveAlarm";
}
}[/code]
Lembrando que o modal tá abrindo normalmente, mas quando submeto nada acontece, inclusive o modal continua aberto.
Outro detalhe é que se tirar o modal panel do dataTable atualiza o primeiro registro da lista, ou seja, meu problema realmente é conseguir pegar o objeto da linha.
Abraços!
Bom, eu tentaria o seguinte, trocaria o <a:commandButton> na chamada do modal por um <s:button>, pois este vai te dar o propagation e este deve estar como begin.
Se não quiser usar o <s:button>, pode colocar no action do <a:commandButton> chamando um método do seu MB, tipo um editar, que estará com a anotação @begin ou @begin(join=true), se tiver alguma conversação que vc queria juntar a sua.
Depois, no método saveAlarm, coloque a anotação @end .
Não garanto que vai funcionar, mas, como está no contexto de conversação, pode ser que seu objeto esteja em uma conversação diferente da que vc está editando no momento.
Espero ter ajudado.
[quote=jcmaster]Bom, eu tentaria o seguinte, trocaria o <a:commandButton> na chamada do modal por um <s:button>, pois este vai te dar o propagation e este deve estar como begin.
Se não quiser usar o <s:button>, pode colocar no action do <a:commandButton> chamando um método do seu MB, tipo um editar, que estará com a anotação @begin ou @begin(join=true), se tiver alguma conversação que vc queria juntar a sua.
Depois, no método saveAlarm, coloque a anotação @end .
Não garanto que vai funcionar, mas, como está no contexto de conversação, pode ser que seu objeto esteja em uma conversação diferente da que vc está editando no momento.
Espero ter ajudado.[/quote]
Como chamo o modal com o s:button?
Com o a:commandButton fica assim: oncomplete="#{rich:component('editPanel')}.show()"
Tentei fazer o que sugeriu, chamar uma função editar e depois salvar, acaba que nem entra na função salvar, não sei porque.
Valeu por enquanto!
você pode cercar o <a:commandButton> com <s:button>
<s:button propagation=“begin”>
ou
<s:button action"#{mb.editar}">
<a:commandButton />
</s:button>
Resolvi o problema da seguinte maneira:
1 - Ao abrir o modal, chamo um método editAlarm() e passo o objeto com
setPropertyActionListener:
<a:commandButton ajaxSingle="true" id="editlink" image="/img/edit.gif"
oncomplete="#{rich:component('editPanel')}.show()"
action="#{alarmAction.editAlarm}" reRender="editPanel">
<f:setPropertyActionListener target="#{alarmAction.alarm}"
value="#{_alarm}" />
<rich:toolTip for="editlink" value="Editar" />
</a:commandButton>
2 - No MB inicio uma conversação:
[code]@Begin(join=true)
public void editAlarm() {
entityManager.refresh(alarm);
}[/code]
3 - Tirei o modalPanel de dentro do dataTable e ao chamar o método
saveAlarm() o objeto é persistido normalmente:
[code]<a:commandButton value=“Salvar”
action="#{alarmAction.saveAlarm}" >>>> reRender=“alarmList” <<<<
oncomplete="#{rich:component(‘editPanel’)}.hide();" />
@End
public String saveAlarm() {
entityManager.merge(alarm);
listAlarms();
return “saveAlarm”;
}[/code]
Através do reRender=“alarmList” o dataTable é atualizado, por exemplo:
Linha 1 - Comentário: “aaaa”
Linha 2 - Comentário: “bbbb”
Se eu modificar a Linha 1 para “cccc”, como já disse, o dataTable é atualizado e a Linha 1 passa a ser “cccc”, só que se eu clicar para abrir o dataPanel da linha 2 ela virá como “cccc” também, o objeto tá ali ainda, só “morre” se eu der um F5, aí sim se eu abrir o dataPanel da linha 2 ele virá como “bbbb”…reparem que eu chamo a lista depois que salvo…
Sabe como contornar isso?
[quote=fabiocsilva]Dá um saque aqui:
http://livedemo.exadel.com/richfaces-demo/richfaces/dataTable.jsf?tab=editDataTable&cid=13653125[/quote]
Valeu Fábio, eu já tinha visto esse exemplo, mas não me ajudou muito nessa questão de atualizar a lista…
vc precisa mesmo disto?
<f:setPropertyActionListener target="#{alarmAction.alarm}" value="#{_alarm}" />
Eu costumo não passar esse cara não e ele ejeta certinho o cara selecionado na lista, exatamente como vc fez usando o método editar pra colocar o objeto managed no JPA e iniciar a conversação.
[quote=jcmaster]vc precisa mesmo disto?
<f:setPropertyActionListener target="#{alarmAction.alarm}" value="#{_alarm}" />
Eu costumo não passar esse cara não e ele ejeta certinho o cara selecionado na lista, exatamente como vc fez usando o método editar pra colocar o objeto managed no JPA e iniciar a conversação.
[/quote]
Realmente não precisava, já tirei…
Só que o problema continua, enquanto não dou um F5 o objeto modificado vai para todas as linhas, entende?
Quando clicar no botão pra salvar, dê um reRender=“alarmList”. Provavelmente funcionará.
Então velho, eu já faço isso, inclusive citei isso numa mensagem anterior:
[i]"Através do reRender=“alarmList” o dataTable é atualizado, por exemplo:
Linha 1 - Comentário: “aaaa”
Linha 2 - Comentário: “bbbb”
Se eu modificar a Linha 1 para “cccc”, como já disse, o dataTable é atualizado e a Linha 1 passa a ser “cccc”, só que se eu clicar para abrir o dataPanel da linha 2 ela virá como “cccc” também, o objeto tá ali ainda, só “morre” se eu der um F5, aí sim se eu abrir o dataPanel da linha 2 ele virá como “bbbb”…reparem que eu chamo a lista depois que salvo…" [/i]
Foda isso, tem hora que eu odeio JSF… :lol:
Não sei mais oq tentar…
Cara, tenta isso no seu salvar:
entityManager.merge(alarm);
entityManager.refresh(alarm);
Pode parecer meio besta, mas, vc tá garantindo que o cara que vc está manipulando é o mesmo do banco.
[quote=jcmaster]Cara, tenta isso no seu salvar:
entityManager.merge(alarm);
entityManager.refresh(alarm);
Pode parecer meio besta, mas, vc tá garantindo que o cara que vc está manipulando é o mesmo do banco.[/quote]
Eu utilizo o refresh() para recuperar o objeto no método editAlarm().
Cara, na real acabei percebendo que o treco tá ainda mais bizarro do que eu imaginava: ele não tá pegando o último objeto persistido não, tá pegando sempre o primeiro resultado da lista!!!
Supondo que tenha na tela:
Id 1 - Comentário “aaa”
Id 2 - Comentário “bbb”
Id 3 - Comentário “ccc”
Id 4 - Comentário null
E chame editAlarm() do Id 4 assim:
[code]<a:commandLink ajaxSingle=“true” id=“editlink”
oncomplete="#{rich:component(‘editPanel’)}.show()"
action="#{alarmAction.editAlarm}" reRender=“editPanel”>
<h:graphicImage value="/img/edit.gif" style=“border:0” />
</a:commandLink>
@Begin(join = true)
public void editAlarm() {
entityManager.refresh(alarm);
System.out.println("TESTE: " + alarm.getComment()); // imprime “aaa” no console assim que acessa a lista!
}[/code]
Não importe o que faça, sempre que acesso a página ou modifico qualquer linha ele pega a 1a linha (“aaa”)!! :lol: :x 
Resolvi o problema, na verdade não era no modal e sim no escopo da minha classe DAO, que deveria ser Conversation e estava como Page.
Valeu a todos que responderam!