La modifica della cella Primefaces rimane in modalità di modifica quando la convalida non riesce

Aug 17 2020

Sto usando p:dataTablecon la modifica delle celle e il validatore su un p:selectOneMenucon modificabile = true. Voglio che lo stato di modifica della cella rimanga in modalità di modifica (secondo screenshot) se il valore p: selectOneMenu selezionato o il valore digitato non è valido e mostri la casella rossa attorno all'input come posso se utilizzo un modulo normale (terzo screenshot). Quando la convalida fallisce, il ringhio e i messaggi vengono visualizzati ma la casella rossa attorno al menu a discesa non persiste e temo che possa passare inosservata dall'utente (primo screenshot). Non riesco a capire come eseguire gli aggiornamenti ajax per mostrare la casella rossa, ma mantieni la cella in modalità di modifica in modo che il menu a discesa e la casella rossa siano ancora visibili.

<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>

In questo screenshot ho provato a cambiare l'account in un preferito memorizzato che è stato salvato con uno spazio e non vogliamo più spazi. (Sì, ora ho la convalida per non consentire uno spazio quando l'utente salva i numeri di account preferiti, ma ci sono altre convalide che implementeremo) Quando la convalida fallisce, vengono visualizzati solo l'intestazione e il messaggio di ringhio. La linea rossa non è visibile finché non fanno di nuovo clic sul menu a discesa, come mostrato nella seconda schermata.

Risposte

jeff Sep 12 2020 at 01:31

La ajaxchiamata aveva l'id datatable tablenel suo updateattributo. Ho rimosso quel ClientID e rimossodisabled="#{facesContext.validationFailed}"

Penso che la cellEditfunzione aggiorni automaticamente il componente ClientId che sta implementando cellEdit. Quindi non è necessario specificare esplicitamente anche nel mio tag ajax.

E immagino anche che il tag ajax esegua sempre l'aggiornamento, ma l'ascoltatore solo con successo.

Potrei non capire appieno il motivo, ma questo è ciò che funziona per me:

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