title: PrimeFaces, can’t update tab disabled attribute
body: <p>I need to update a  tab’s disabled attribute when a user edits a dataTable using rowEditor.<br>
  I have a ajax tag in a dataTable listening for <code>event="rowEdit"</code> which calls a backing bean method that sets the tab's disabled attribute to true.<br>
  If I reference only the tab group with the tabView id as in <code>update=”:tabView”</code> the tab will update but only the edited row of the dataTable renders with no grid lines. If I reference the tab as in <code>update=”:tabView:tab”</code> IDs, the dataTable renders fine but the tab’s disabled attribute doesn't.<br>
  The tab being updated is not in the same tab as the dataTable being edited.<br>
  The dataTable is in the <code>rates</code> tab and he tab I'm trying to update is <code>tbVSelRates</code></p>
  
  <pre><code>&lt;p:tab id="rates" title="Select Rates" &gt;
      &lt;p:panelGrid id="pnlMultiDealUpdate"  header="Select Product Rates for Multipule Deal Update" style="margin-top:10px; border: 2px" &gt;
          &lt;p:row&gt;
              &lt;p:column&gt;
                  &lt;h:form id="frmSRDealRates" method="post" action=""&gt;
                      &lt;p:outputLabel id="lblRateAgreed" for="txtRateAgreed" value="#{msgs['srDeal.rates.agreed']}:"/&gt;
  
                      &lt;p:inputText id="txtRateAgreed" value="#{dealManagedBean.txtRateAgreedVal}" style="width:40px;" readonly="#{dealManagedBean.readOnly}"/&gt; %
  
                      &lt;p:outputLabel id="lblRateCat" for="pklRateCat" value="#{msgs['srDeal.rates.cat']}:"/&gt;
  
                      &lt;p:pickList id="pklRateCat" value="#{dealManagedBean.rateCats}" var="cat" itemLabel="#{cat}" itemValue="#{cat}" disabled="#{dealManagedBean.readOnly}"/&gt;
  
                      &lt;p:commandButton id="btnApply" value="#{msgs['srDeal.rates.btn.apply']}" style="width:100px;" disabled="#{dealManagedBean.readOnly}"
                                          actionListener="#{dealManagedBean.applyChangesMultiUpdate}" process="frmSRDealRates" update="productsTable,:tbVUpdateDeals"
                                          /&gt; &amp;nbsp;
  
                      &lt;p:commandButton id="btnUndo" value="#{msgs['srDeal.rates.btn.undo']}" style="width:100px;" disabled="#{dealManagedBean.readOnly}"
                                          onstart="return confirm('Are you sure that you want to undo all recent changes?\nDoing so will remove all rates.');"
                                          actionListener="#{dealManagedBean.undoMultiDealRateChanges}" process="frmSRDealRates" update="productsTable" /&gt;
  
                      &lt;p:dataTable var="pr" value="#{dealManagedBean.products}" filteredValue="#{filteredValueManagedBean.filteredProducts}" paginator="true" rows="10"
                                      id="productsTable" editable="true" rowKey="#{pr.molecule}" paginatorPosition="top"
                                      paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                                      rowsPerPageTemplate="10,50, 100, 1000"&gt;
                                                                                                  &lt;!-- process=":tbVUpdateDeals:frmSRDealRates" --&gt;        
                          &lt;p:ajax event="rowEdit" listener="#{dealManagedBean.applyRowChangesMassUpdate}"  update=":tbVUpdateDeals:tbVSelRates" /&gt;
                          &lt;f:facet name="header"&gt;
                              #{msgs['srDeal.rates.prod.header']}
                          &lt;/f:facet&gt;
  
                          &lt;p:column headerText="#{msgs['srDeal.rates.prod.cat']}" sortBy="#{pr.category}" filterBy="#{pr.category}"  id="category"
                                      filterOptions="#{dealManagedBean.categoryOptions}" filterMatchMode="exact" width="40" filterStyle="width:30px"&gt;
                              &lt;f:facet name="header" &gt;
                                  &lt;h:outputText value="#{msgs['srDeal.rates.prod.cat']}" /&gt;
                              &lt;/f:facet&gt; 
                              &lt;h:outputText value="#{pr.category}" /&gt;
                          &lt;/p:column&gt;
  
                          &lt;p:column headerText="#{msgs['srDeal.rates.prod.molecule']}" sortBy="#{pr.moleculeDescription}" filterBy="#{pr.moleculeDescription}"  filterMatchMode="contains" id="molecule"
                                      width="180" filterStyle="width:160px"&gt;
                              &lt;f:facet name="header" &gt;
                                  &lt;h:outputText value="#{msgs['srDeal.rates.prod.molecule']}" /&gt;
                              &lt;/f:facet&gt;
                              &lt;h:outputText value="#{pr.moleculeDescription}" /&gt;
                          &lt;/p:column&gt;
                          &lt;p:column headerText="#{msgs['srDeal.rates.prod.planrate']}" sortBy="#{pr.plannedRate}" id="plannedRateCellEdit" width="60"&gt;
                              &lt;p:cellEditor id="massUpdateRate"  &gt;
  
                                  &lt;f:facet name="output"&gt;
                                      &lt;h:outputText value="#{pr.plannedRate}" id="otxtRate"&gt;
                                          &lt;f:convertNumber maxFractionDigits="2" minFractionDigits="2"/&gt; 
                                      &lt;/h:outputText&gt;%
                                  &lt;/f:facet&gt;
                                  &lt;f:facet name="input"&gt;
                                      &lt;p:inputText value="#{pr.plannedRate}" style="width:100%" label="plndRate" id="txtRate" /&gt;
                                  &lt;/f:facet&gt;
                              &lt;/p:cellEditor&gt;
                          &lt;/p:column&gt;
                          &lt;p:column width="35" exportable="false"&gt;  
                              &lt;p:rowEditor/&gt; 
                          &lt;/p:column&gt;  
                      &lt;/p:dataTable&gt;
                      &lt;p:commandButton id="btnSelectRatesNext" value="Next" actionListener="#{dealManagedBean.goToConfirmRatesTab}" update=":tbVUpdateDeals" /&gt; &amp;nbsp;
                      &lt;p:commandButton value="Cancel" onclick="window.location='salesRepHome.jsf'" style="width:75px;" /&gt;
                  &lt;/h:form&gt;
              &lt;/p:column&gt;   
          &lt;/p:row&gt;
      &lt;/p:panelGrid&gt;
  &lt;/p:tab&gt;
  
  &lt;p:tab id="tbVSelRates" title="Confirm Rates" disabled="#{dealManagedBean.conRatesTabDisabled}"&gt;
      &lt;h:form id="frmSelProdRates" &gt;
          &lt;p:panelGrid id="pnlConRates" columns="1"&gt;
              &lt;p:dataTable var="pr" value="#{dealManagedBean.selectedUpdateProducts}" filteredValue="#{filteredValueManagedBean.filteredProducts}" paginator="true" rows="10"
                          id="dtSelProductsTable" editable="true" rowKey="#{pr.molecule}" paginatorPosition="top"
                          paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                          rowsPerPageTemplate="10,50, 100, 1000"&gt;
                  &lt;f:facet name="header"&gt;
                  Confirm Selected Product Rates
                  &lt;/f:facet&gt;
  
                  &lt;p:column headerText="#{msgs['srDeal.rates.prod.cat']}" sortBy="#{pr.category}" filterBy="#{pr.category}"  id="category"
                              filterOptions="#{dealManagedBean.categoryOptions}" filterMatchMode="exact" width="40" filterStyle="width:30px"&gt;
                      &lt;f:facet name="header" &gt;
                          &lt;h:outputText value="#{msgs['srDeal.rates.prod.cat']}" /&gt;
                      &lt;/f:facet&gt; 
                      &lt;h:outputText value="#{pr.category}" /&gt;
                  &lt;/p:column&gt;
  
                  &lt;p:column headerText="#{msgs['srDeal.rates.prod.molecule']}" sortBy="#{pr.moleculeDescription}" filterBy="#{pr.moleculeDescription}"  filterMatchMode="contains" id="molecule"
                              width="180" filterStyle="width:160px"&gt;
                      &lt;f:facet name="header" &gt;
                          &lt;h:outputText value="#{msgs['srDeal.rates.prod.molecule']}" /&gt;
                      &lt;/f:facet&gt;
                      &lt;h:outputText value="#{pr.moleculeDescription}" /&gt;
                  &lt;/p:column&gt;
  
                  &lt;p:column headerText="Planned Rate"   sortBy="#{pr.plannedRate}" id="plannedRate" width="60"&gt;
                      &lt;f:facet name="header" &gt;
                          &lt;h:outputText value="Planned Rate" /&gt;
                      &lt;/f:facet&gt;
                      &lt;h:outputText value="#{pr.plannedRate}" id="oTxtPlanedRate"&gt; 
                          &lt;f:convertNumber maxFractionDigits="2" minFractionDigits="2"/&gt; 
                      &lt;/h:outputText&gt;% 
                  &lt;/p:column&gt;
              &lt;/p:dataTable&gt;
              &lt;div style="float:left; margin-top:10px"&gt;
                  &lt;h:commandLink id="exAll" style="margin-left:10px;"&gt;  
                      &lt;spacer width="5"/&gt;   &lt;h:outputText value="#{msgs['srDeal.bg.bgs.excelall']}" /&gt;  
                      &lt;p:dataExporter type="xls" target="dtSelProductsTable" fileName="Product Rates for Mutil Deal Update"/&gt;  
                  &lt;/h:commandLink&gt;  
              &lt;/div&gt;
              &lt;div style="margin-top:10px; float:right"&gt;
                  &lt;p:commandButton id="btnNextDeals" value="Next" actionListener="#{dealManagedBean.goToSelectDealsTab}" update=":tbVUpdateDeals"/&gt;
              &lt;/div&gt;
          &lt;/p:panelGrid&gt;
      &lt;/h:form&gt;
  &lt;/p:tab&gt;
  </code></pre>
  
  <p>PrimeFaces 3.4.2, JBoss 6.0.1 JSF 2.0
  Hope this posts right, first time posting a question on StackOverflow
  Thanks</p>
  
  <pre><code>  public void applyRowChangesMassUpdate(RowEditEvent event){
      DataTable dtRates = (DataTable) event.getSource();
      Product dtRow = (Product)dtRates.getRowData();
      logger.log(Level.FINE, "Molecule: {0}", dtRow.getMolecule());
      logger.log(Level.FINE, "Projected Sales: {0}", dtRow.getYtdProjectedSales());
      logger.log(Level.FINE, "Planned Rate: {0}", dtRow.getPlannedRate());
      if(dtRow.getPlannedRate()!= null &amp;&amp; dtRow.getYtdProjectedSales() != null){
      dtRow.setPlannedPAProjected(new BigDecimal(0.01 *         dtRow.getYtdProjectedSales().doubleValue() * dtRow.getPlannedRate().doubleValue()));
      }
      logger.log(Level.FINE, "Planned PA Projected: {0}", dtRow.getPlannedPAProjected());
      conRatesTabDisabled = true;
      tabIndex = 1;
  }
  </code></pre>