2017-08-29 12 views
0

JSFおよびPrimefacesベースのJavaアプリケーションでは、ユーザーがコメントを追加するために動的に行を追加できるテーブルがあります。Primefacesデータテーブル内の行がまだ編集中かどうかを確認するBeanのメソッド

コメントのある表のコードです。コメントを追加するには、ボタンを押します。ボタンを押すと、表の上部にコメントが追加されます。 新しい行に入力されたテキストを保存するために、チェックアイコンを押した場合はすべて正常に機能します。ただし、ページ全体(コードは含まれません)を保存すると、作成者フィールドと日付フィールドのみが保存されます。入力されたテキストはすべて失われます。

私は、Primefacesデータテーブルの行がまだ編集されているかどうかを調べるために、それを保存するか、ユーザーに警告を表示するかを見つけようとしています。

これはXHTMLです:

<div class="ui-g-6 no-vertical-padding"> 
    <f:event type="preRenderView" listener="#{commentController.initPage()}"/> 
    <h:form id="CommentsForm"> 
     <p:commandButton style="width: 1px; height: 1px; position: fixed; top: -1000px;" 
         action="#{mainController.save}" styleClass="cleanDirtyButton"/> 
     <p:fieldset legend="Comments" style="height: 309px"> 
      <p:remoteCommand name="onCellEdit" update="commentTable" partialSubmit="true" 
          ignoreAutoUpdate="true"/> 

      <!--<h:inputHidden id="hiddenSizeId" value="#{commentForm.itemsSize}"/>--> 
      <!--<h:inputHidden id="hiddenIxId" value="#{commentForm.newItemIx}"/>--> 

      <!-- workarround --> 
      <h:inputHidden id="hiddenSizeId" value="1000000"/> 
      <h:inputHidden id="hiddenIxId" value="999999"/> 

      <script type="text/JavaScript"> 
       function getNewItemPos() { 

        var noOfItems = $("#CommentsForm\\:hiddenSizeId").val(); 
        var itemIx = $("#CommentsForm\\:hiddenIxId").val(); 


        var bucketHt = $("#CommentsForm\\:commentTable .ui-datatable-scrollable-body").height(); 
        var scrollHt = $("#CommentsForm\\:commentTable .ui-datatable-scrollable-body").prop("scrollHeight"); 

        var itemHt = parseInt(scrollHt)/parseInt(noOfItems); 
        var noItemsInBucket = parseInt(bucketHt)/parseFloat(itemHt); 

        var itemNo = parseInt(itemIx) + 1; 
        var targetBucket = parseInt(itemNo)/parseFloat(noItemsInBucket); 
        var halfBucketHt = parseInt(bucketHt)/2; 

        var scrollPos = 
          (parseInt(bucketHt) * (parseFloat(targetBucket) - 1)) + parseFloat(halfBucketHt); 
        var scrollPosInt = Math.round(parseFloat(scrollPos)); 

        $('#CommentsForm\\:commentTable .ui-datatable-scrollable-body').animate({scrollTop: scrollPosInt}); 
       } 

       function setCellFocus() { 
        $('.focus_comment:visible').delay().focus(); 
       } 

       function cellEdit() { 
        setTimeout(setCellFocus, 1500); 
        $('.editTable .ui-datatable-data tr').last().find('span.ui-icon-pencil').each(function() { 
         jQuery(this).click() 
        }); 
       } 

      </script> 

      <p:dataTable id="commentTable" 
         widgetVar="commentTableWidget" 
         value="#{projectForm.project.Comments}" 
         sortOrder="DESCENDING" 
         sortBy="#{comment.changedOn}" 
         var="comment" 
         editable="true" 
         rowIndexVar="rowIndex" 
         resizableColumns="true" 
         scrollable="true" 
         scrollRows="10" 
         liveScroll="true" 
         scrollHeight="212" 
         style="margin-top: 5px;" 
         emptyMessage="No comment found" 
         styleClass="ui-corner-all plus-button editTable noBackground"> 

       <f:facet name="footer"> 
        <p:commandButton id="addlink" 
            action="#{commentController.addComment()}" 
            oncomplete="getNewItemPos();cellEdit();setCellFocus();" 
            disabled="#{commentForm.editMode or !pR.hasPermission('PROJECTS:write')}" 
            process="@this" 
            partialSubmit="true" 
            update="commentTable" 
            value="Add Comment" 
            styleClass="table-plus-button" 
            icon="fa fa-plus" iconPos="right"> 
         <p:ajax update=":CommentsForm:commentTable :CommentsForm:hiddenIxId :CommentsForm:hiddenSizeId"/> 
        </p:commandButton> 

       </f:facet> 

       <p:ajax event="rowEdit" listener="#{commentController.onRowEdit}" 
         update="commentTable" 
         oncomplete="if (args &amp;&amp; !args.validationFailed) {onCellEdit();} else {$('.editTable tbody.ui-datatable-data tr td .deleteButton').hide();}"/> 
       <p:ajax event="rowEditCancel" listener="#{commentController.onRowCancel}" 
         onsuccess="onCellEdit();" update="commentTable"/> 
       <p:ajax event="rowEditInit" listener="#{commentForm.setEditMode(true)}" 
         update="addlink" 
         onstart="$('.editTable tbody.ui-datatable-data tr td .ui-icon-pencil').hide();$('.editTable tbody.ui-datatable-data tr td .deleteButton').hide();"/> 

       <p:column width="18%" headerText="date" sortBy="#{comment.changedOn}" 
          styleClass="align-top" 
          sortOrder="DESCENDING"> 
        <h:outputText value="#{comment.changedOn eq null ? 
           (comment.createdOn eq null ? '': comment.createdOn) : comment.changedOn}"> 
         <f:convertDateTime type="date" pattern="dd.MM.yyyy" timeZone="CET"/> 
        </h:outputText> 
       </p:column> 

       <p:column width="30%" headerText="Text"> 
        <p:cellEditor> 
         <f:facet name="output"> 
          <span style="width: 100%; height: 100%"> 
           <h:outputText escape="true" style="white-space:pre-line;" 
               id="commentDisplay" 
               value="#{comment.text.length() > 200 ? comment.text.substring(0, 200).concat(' ...'): comment.text}"> 
           </h:outputText> 
           <p:tooltip id="commentDisplayToolTip" 
              for="commentDisplay,commentDisplayToolTipTxt" 
              rendered="#{comment.text.length() gt 200}" 
              beforeShow="$('.ui-tooltip:visible').hide()" 
              myPosition="left bottom" atPosition="right bottom" 
              hideDelay="500"> 
            <p:outputLabel id="commentDisplayToolTipTxt" 
                styleClass="scrollOutputLabel" 
                value="#{comment.text}"/> 
           </p:tooltip> 
          </span> 
         </f:facet> 
         <f:facet name="input"> 
          <p:message for="text" id="nameMsg"/> 
          <p:inputTextarea value="#{comment.text}" id="text" 
              onkeypress="setConfirmUnload(true); if ((($.browser.mozilla &amp;&amp; event.ctrlKey &amp;&amp; event.keyCode==13) ||(($.browser.msie||$.browser.chrome) &amp;&amp; event.ctrlKey)) 
              &amp;&amp; (! (event.altKey &amp;&amp; event.ctrlKey))) 
          {$('.editTable tbody.ui-datatable-data tr td .ui-icon-check:visible').click(); $('#buttonForm\\:speichern').addClass('unsaved'); setConfirmUnload(true); }" 
              title="Text" 
              styleClass="Wid90 input_mandatory focus_comment"> 
          </p:inputTextarea> 
         </f:facet> 
        </p:cellEditor> 
       </p:column> 

       <p:column width="30%" headerText="author" sortBy="#{comment.changedBy}" 
          styleClass="align-top" 
          sortOrder="DESCENDING"> 
        <h:outputText 
          value="#{comment.changedBy eq null ? 
         (comment.createdBy eq null ? '' : commentController.extractUserData(comment.createdBy)) 
         :commentController.extractUserData(comment.changedBy)}"/> 
       </p:column> 

       <p:column width="83" id="editor" styleClass="NoPadding align-top"> 
        <p:rowEditor/> 
        <h:panelGroup id="deleteSpan"> 
         <p:commandButton id="delete" partialSubmit="true" 
             style="height: 41px;" 
             title="Löschen" 
             action="#{commentController.removeComment(comment)}" 
             update="commentTable" 
             process="@this commentTable" 
             immediate="true" 
             icon="fa fa-close" 
             iconPos="center" 
             styleClass="deleteButton Fright" 
             disabled="#{empty commentForm.project.Comments}"> 
          <p:confirm header="Confirmation" message="Delete Comment?" 
             icon="ui-icon-alert"/> 
         </p:commandButton> 
        </h:panelGroup> 
       </p:column> 
      </p:dataTable> 
     </p:fieldset> 
    </h:form> 
</div> 

そして、これはコントローラです:

@Named("commentController") 
@RequestScoped 
public class CommentController { 

    // this method is executed when pressing the add-comment button: 
    public void addComment() { 
     Comment comment = new Comment(); 
     commentForm.setComment(comment); 
     final DataTable commentTable = (DataTable) FacesContext.getCurrentInstance().getViewRoot().findComponent("commentsForm:commentTable"); 
     if (commentTable != null) { 
      commentTable.setValueExpression("sortBy", null); 
      commentTable.setValueExpression("sortOrder", null); 
     } 
     comment.setProject(projectForm.getProject); 
     projectForm.getProject().getComments().add(comment); 
     if (commentTable) { 
      commentTable.processValidators(getFacesContext()); 
     } 
    } 

    // not really relevant for my question, because: 
    // this method is only called when properly ending the rowEdit by pressing the green check 
    public void onRowEdit(RowEditEvent event) { 
     Comment comment = (Comment) event.getObject(); 
     if (!validateComment(comment)) { 
      getFacesContext().validationFailed(); 
     } else { 
      if (comment.getId() != 0 && commentForm.getProject().getComments().contains(comment)) { 
       projectForm.getProject().getComments().set(commentForm.getProject().getComments().indexOf(comment), comment); 
      } 
      commentForm.setEditMode(false); 
     } 
    } 
} 
+1

私は '追加することによって、問題を解決することができたの' ''この記事を見つけた後https://stackoverflow.com/a/44710044/6426882 – Robert

答えて

0

私は

<p:ajax update="commentTable"/> 

を追加することで問題を解決することができました

<p:inputTextarea...> 

このポストを見つけた後:stackoverflow.com/a/44710044/6426882

関連する問題