2017-07-01 2 views
1

J'ai un bouton de commande qui accepte les données requises dans un formulaire, puis crée un DefaultScheduleModel avec DefaultScheduleEvents. Le bouton de commande doit ensuite mettre à jour un autre formulaire contenant TabView en créant dynamiquement un nouvel onglet et un nouveau calendrier avec tous les événements qui doivent être créés.Ajout dynamique d'événements Primefaces Schedule et Schedule à la mise à jour ajax

Le problème est que, pour une raison étrange, les nouveaux onglets ainsi que les programmes/événements respectifs ne sont pas créés lors de la mise à jour ajax. La seule chose que je reçois est un onglet avec un calendrier vide, où les soumissions ultérieures ne créent pas d'autres onglets/calendriers/événements.

Voici mon avis:

<h:form> 

     <b:panel id="createSchedule" title="Create Schedule-o-matic" > 

       <f:facet name="append"> 
        <b:commandButton look="danger" value="Delete" ajax="true" actionListener="#{onCallJSFBean.deleteTeamMember(teamMember)}" iconAwesome="times" icon-align="right" 
          update="rosterTable"/> 
       </f:facet> 
       </b:inputText> 
      </h:column> 
      </h:dataTable> 
      <b:commandButton value="Add Team Member" ajax="true" update="createSchedule" actionListener="#{onCallJSFBean.addTeamMember}"/> 
      <f:facet name="footer"> 
      <b:buttonToolbar> 
       <b:buttonGroup> 
       <b:commandButton id='scheduleCancel' look="danger" ajax="true" value="Close" icon-awesome="window-close" update="createSchedule" 
         onclick="ajax:onCallJSFBean.cancelSchedule();" 
         oncomplete="$('#j_id_12\\:createSchedule').hide();"/> 
       <b:commandButton id='scheduleCreate' look="success" ajax="true" value="Submit" icon-awesome="fa-check" 
         actionListener="#{onCallJSFBean.createSchedule()}" update="@(.scheduleClass)" 
         /> 
       </b:buttonGroup> 
      </b:buttonToolbar> 
      </f:facet> 

     </b:panel> 

      </h:form> 
<h:form class="scheduleClass"> 
      <b:row> 
      <p:tabView dynamic="true" value="#{onCallJSFBean.scheduleDOs}" var="scheduleList" scrollable="true"> 
       <p:tab title="#{scheduleList.scheduleTitle}"> 
       <h:outputText value="#{scheduleList.startTime} #{scheduleList.endTime} #{scheduleList.scheduleModel.eventCount}"/> 

       </p:tab> 
      </p:tabView> 
      </b:row> 
     </h:form> 

Et voici le contrôleur respectif:

//When canceling/closing the schedule creation panel  
public void cancelSchedule(){ 
     this.createScheduleTitle=""; 
     this.createScheduleCycleTime = null; 
     this.slotStartTimePeriod = null; 
     this.slotEndTimePeriod = null; 
     this.createScheduleRoster = new ArrayList<>(); 
     System.err.println(scheduleDOs.size()); 
} 

     public void createSchedule(){ 


     if(submitFail == true){ 
      this.scheduleDOs.add(createScheduleData()); 
      System.err.println(this.scheduleDOs.size()+" Size of tab"); 
     } 

     System.err.println("Finished"); 
     } 

     private ScheduleDO createScheduleData(){ 
     ScheduleModel scheduleModel = new DefaultScheduleModel(); 

     if(createScheduleCycleTime == 1){ 
      populateDailySchedule(scheduleModel); 
     } 

     ScheduleDO onCall = new ScheduleDO(createScheduleTitle, createScheduleCycleTime, 
      slotStartTimePeriod, slotEndTimePeriod, createScheduleRoster, scheduleModel); 

     return onCall; 
     } 

     private int rosterCounter = 0; 
     private String nextTeamMember(List<SimpleStringWrapper> roster){ 
     String tmp; 
     if(rosterCounter >= roster.size()){ 
      rosterCounter=0; 
      tmp = roster.get(rosterCounter).getValue(); 
     }else{ 
      tmp = roster.get(rosterCounter).getValue(); 
     } 
     rosterCounter+=1; 
     return tmp; 
     } 

     private void populateDailySchedule(ScheduleModel scheduleModel){ 
     DateTime startDate = DateTime.now(); 
     Period period = Period.months(6); 
     DateTime endDate = startDate.plus(period); 
     Days day = Days.daysBetween(startDate, endDate); 

     int numDays = day.getDays(); 

     for(int i = 0;i<numDays;i++){ 
      MutableDateTime startTime = new MutableDateTime(startDate.plusDays(i)); 
      startTime.setHourOfDay(this.slotStartTimePeriod); 
      MutableDateTime endTime = new MutableDateTime(startDate.plusDays(i)); 
      endTime.setHourOfDay(this.slotEndTimePeriod); 

      String teamMember = nextTeamMember(createScheduleRoster); 
    //  System.err.println(teamMember+" "+startTime.toDate()+" "+endTime.toDate()); 
      DefaultScheduleEvent event = new DefaultScheduleEvent(teamMember, startTime.toDate(), endTime.toDate()); 
      scheduleModel.addEvent(event); 
     } 
     System.err.println(scheduleModel.getEventCount()); 
     } 

J'utilise Primefaces 6.0 avec Bootsfaces 1.1.1

+0

J'ai essayé de copier vos extraits de code dans mon propre projet. Malheureusement, la classe du bean est incomplète et nécessite JodaDateTime. Cela rend difficile pour les autres de comprendre le problème et de vous aider. –

Répondre

1

j'ai réalisé mon erreur avait été dans la façon dont j'avais mis à jour le tabview/schedule, au lieu d'avoir deux formes et le bouton de commande de soumission ciblant le second ID de formulaire, à la place, j'avais le bouton de soumission mettre à jour le t abview lui-même.

+0

Pourquoi combiner les deux formes en une seule forme aide-t-elle? Avez-vous vraiment besoin des deux changements? –

+0

Non que je sache, je suppose qu'il pourrait être retiré. – landocalrissian