A edição da célula do Primefaces sai no modo de edição quando a validação falha

Aug 17 2020

Estou usando p:dataTablecom edição de célula e validador em um p:selectOneMenucom editable = true. Desejo que o estado de edição da célula permaneça no modo de edição (segunda captura de tela) se o valor p: selectOneMenu selecionado ou o valor digitado for inválido e mostre a caixa vermelha ao redor da entrada como posso se usar um formulário regular (terceira captura de tela). Quando a validação falha, o rosnado e as mensagens são exibidos, mas a caixa vermelha ao redor da lista suspensa não persiste e temo que possa passar despercebida pelo usuário (primeira captura de tela). Não consigo descobrir como fazer atualizações ajax para mostrar a caixa vermelha, mas manter a célula no modo de edição para que a lista suspensa e a caixa vermelha ainda estejam visíveis.

<p:dataTable id="table" value="#{bean.data}" var="lineItem" editable="true" editMode="cell">

<p:column headerText="* Account">
  <p:cellEditor>
    <f:facet name="output">
       <h:outputText value="#{lineItem.account}" />
    </f:facet>

    <f:facet name="input">
      <p:selectOneMenu id="so" value="#{lineItem.account}" editable="true" dynamic="true"  converter="omnifaces.SelectItemsConverter" title="Type an account or select a stored favorite" validator="com.gdeb.rozycki.app.acountValidator" >

      <f:selectItem noSelectionOption="true" itemLabel="---Favorites" itemValue="null" />
      <f:selectItems value="#{bean.favorites}" var="fav" itemLabel="#{fav.acctNum}" itemValue="#{fav}" />
                                            
      <p:ajax disabled="#{facesContext.validationFailed}" update="table growl messages" listener="#{bean.updateAccountInline(lineItem)}" />
      </p:selectOneMenu>
    </f:facet>
  </p:cellEditor>
</p:column>

Esta captura de tela eu tentei mudar a conta para um favorito armazenado que foi salvo com um espaço e não queremos mais espaços. (Sim, agora tenho validação para não permitir um espaço quando o usuário salvar seus números de conta favoritos, mas há outras validações que iremos implementar) Quando a validação falhar, apenas o cabeçalho e a mensagem de rosnado serão exibidos. A linha vermelha não é visível até que eles cliquem no menu suspenso novamente, como mostrado na segunda captura de tela.

Respostas

jeff Sep 12 2020 at 01:31

A ajaxchamada tinha o id da tabela de dados tableem seu updateatributo. Eu removi aquele ClientID e removidisabled="#{facesContext.validationFailed}"

Acho que a cellEditfunção atualiza automaticamente o componente ClientId que está implementando o cellEdit. Portanto, não há necessidade de especificar explicitamente em minha tag ajax.

E também estou supondo que a tag ajax sempre executa a atualização, mas o ouvinte apenas com sucesso.

Posso não entender completamente o porquê, mas isso é o que funciona para mim:

  <p:ajax update="growl messages" listener="#{bean.updateAccountInline(lineItem)}" />