Changeset 2891

Show
Ignore:
Timestamp:
05/04/10 16:48:14
Author:
johnsa
Message:

more updates to freebusy mockup - preparations for integrating into user client

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/deployment/webuser/webapp/resources/demoskins/fbMockup/bedeworkFb.js

    r2888 r2891  
    7070 * status:          String - participation status (PARTSTAT) 
    7171 * type:            String - person, location, other resource 
     72 * selected:        Boolean - if attendee is included in picknext selections (checkbox next to attendee in grid)  
    7273 */ 
    7374var bwAttendee = function(name, uid, freebusyStrings, role, status, type) { 
     
    7879  this.status = status; 
    7980  this.type = type; 
     81  this.selected = true; 
    8082   
    8183  //populate the freebusy objects 
     
    191193     
    192194  // how much will we divide the hour in the grid? 
    193   // this is a constant for now, but could be variable. 
    194   // ALWAYS set as a factor of 60 
     195  // ALWAYS set as a factor of 60 and never below 1 
     196  // Be forewarned: changing this value quantizes the set of 
     197  // times to be displayed, e.g. hourDivision = 4 quantizes the  
     198  // display to 15 minute increments; hourDivision = 1 locks the events to the 
     199  // nearest hour (not a good outcome) 
     200  // 4, 6, or 12 is preferred (and higher begins to slow down the display) 
     201  // If in doubt, leave this at 4 
    195202  this.hourDivision = 4; 
    196203   
     
    204211  var selecting = false;      // are we currently selecting?  If true, we'll highlight as we hover 
    205212  var cellsInDuration = durationMils / incrementMils; // calculate the number of cells in the duration for use in setting freeTime lookup 
     213  var pickNextClicked = false; // false until the first time we click "pick next" - allows us to show the first free time window on first click 
    206214   
    207215 
     
    213221  } 
    214222   
    215   this.deleteAttendee = function(index) { 
     223  this.removeAttendee = function(index) { 
    216224    this.attendees.splice(index, 1); 
    217     this.diplay(); 
     225    this.display(); 
    218226  } 
    219227   
     
    223231     
    224232    // go to the next freeTime if available and highlight it 
    225     if (this.freeTimeIndex < this.freeTime.length - 1) { 
     233    // don't increment if it's the very first time we've clicked the button 
     234    if (this.freeTimeIndex < this.freeTime.length - 1 && pickNextClicked) { 
    226235      this.freeTimeIndex += 1; 
    227236    } 
    228  
     237     
    229238    // set the start of the selection range using the freeTimeIndex 
    230239    var curSelectionTime = Number(this.freeTime[this.freeTimeIndex]); 
     
    239248      } 
    240249    }); 
     250     
     251    // we've clicked pickedNext - so set the pickNextClicked flag to true 
     252    // this flag lets us highlight the very first free time window on first click 
     253    pickNextClicked = true; 
    241254  }  
    242255   
     
    283296      } 
    284297    } 
     298  } 
     299   
     300  this.setIncrement = function(val) { 
     301    this.hourDivision = val; 
     302    this.display(); 
    285303  } 
    286304   
     
    338356      fbDisplayTimesRow = fbDisplay.insertRow(fbDisplay.rows.length); 
    339357      $(fbDisplayTimesRow).addClass("allAttendees"); 
    340       $(fbDisplayTimesRow).html('<td class="status"></td><td class="role"></td><td class="name">All Attendees</td><td class="check"><input type="checkbox" checked="checked" name="selectAllToggle" class="selectAllToggle"/></td><td class="fbBoundry"></td>'); 
     358      $(fbDisplayTimesRow).html('<td class="status"></td><td class="role"></td><td class="name">All Attendees</td><td></td><td class="fbBoundry"></td>'); 
    341359      for (i=0; i < range; i++) { 
    342360        var curDate = new Date(this.startRange);  
     
    364382                // in which the class was always offset by one table cell - should find cause 
    365383                var curDateUTC = curDate.getTime() + tzoffset + (60 / this.hourDivision * 60000); 
    366                 if (this.attendees[att].freebusy[m].contains(curDateUTC)) { 
     384                if (this.attendees[att].freebusy[m].contains(curDateUTC) && this.attendees[att].selected) { 
    367385                  $(fbCell).addClass("busy"); 
    368386                  // change the last added fb in the hash to true 
     
    382400      // generate the regular attendees rows 
    383401      for (attendee = 0; attendee < this.attendees.length; attendee++) { 
    384         fbDisplayAttendeeRow = fbDisplay.insertRow(fbDisplay.rows.length);  
     402        fbDisplayAttendeeRow = fbDisplay.insertRow(fbDisplay.rows.length); 
    385403        var curAttendee = this.attendees[attendee]; 
     404         
     405        // if the current attendee is deselected, mark the row as such 
     406        if (!curAttendee.selected) { 
     407          $(fbDisplayAttendeeRow).addClass("deselected"); 
     408        } 
    386409         
    387410        // set the status icon and class  
    388411        // the status class is used for rollover descriptions of the icon 
    389412        switch (curAttendee.status) { 
    390           case bwAttendeeStatusAccepted : // &#10004; - make an image to avoid font issues 
     413          case bwAttendeeStatusAccepted: // &#10004; - make an image to avoid font issues 
    391414            $(fbDisplayAttendeeRow).html('<td class="status accepted"><span class="icon"><img src="check.gif" alt="accepted" width="15" height="15"/></span><span class="tip">' + bwAttendeeDispStatusAccepted + '</span></td>'); 
    392415            break; 
    393           case bwAttendeeStatusDeclined :  
     416          case bwAttendeeStatusDeclined: 
    394417            $(fbDisplayAttendeeRow).html('<td class="status declined"><span class="icon">x</span><span class="tip">' + bwAttendeeDispStatusDeclined + '</span></td>'); 
    395418            break; 
    396           case bwAttendeeStatusTentative :  
     419          case bwAttendeeStatusTentative: 
    397420            $(fbDisplayAttendeeRow).html('<td class="status tentative"><span class="icon">-</span><span class="tip">' + bwAttendeeDispStatusTentative + '</span></td>'); 
    398421            break; 
    399           case bwAttendeeStatusDelegated :  
     422          case bwAttendeeStatusDelegated: 
    400423            $(fbDisplayAttendeeRow).html('<td class="status delegated"><span class="icon"></span><span class="tip">' + bwAttendeeDispStatusDelegated + '</span></td>'); 
    401424            break; 
    402           case bwAttendeeStatusCompleted :  
     425          case bwAttendeeStatusCompleted: 
    403426            $(fbDisplayAttendeeRow).html('<td class="status completed"><span class="icon"></span><span class="tip">' + bwAttendeeDispStatusCompleted + '</span></td>'); 
    404427            break; 
    405           case bwAttendeeStatusInProcess :  
     428          case bwAttendeeStatusInProcess: 
    406429            $(fbDisplayAttendeeRow).html('<td class="status inprocess"><span class="icon"></span><span class="tip">' + bwAttendeeDispStatusInProcess + '</span></td>'); 
    407430            break; 
    408           default : // default to bwAttendeeStatusNeedsAction - display question mark 
     431          default: // default to bwAttendeeStatusNeedsAction - display question mark 
    409432            $(fbDisplayAttendeeRow).html('<td class="status needsaction"><span class="icon">?</span><span class="tip">' + bwAttendeeDispStatusNeedsAction + '</span></td>'); 
    410433        } 
    411  
     434         
    412435        // set the role icon 
    413436        // the role class is used for rollover descriptions of the icon 
    414437        switch (curAttendee.role) { 
    415           case bwAttendeeRoleChair : // displays writing hand icon - &#9997; 
     438          case bwAttendeeRoleChair: // displays writing hand icon - &#9997; 
    416439            $(fbDisplayAttendeeRow).append('<td class="role chair"><span class="icon"><img src="chair.gif" alt="chair" width="17" height="15"/></span><span class="tip">' + bwAttendeeDispRoleChair + '</span></td>'); 
    417440            break; 
    418           case bwAttendeeRoleRequired : // displays right-pointing arrow icon - &#10137; 
     441          case bwAttendeeRoleRequired: // displays right-pointing arrow icon - &#10137; 
    419442            $(fbDisplayAttendeeRow).append('<td class="role required"><span class="icon"><img src="reqArrow.gif" alt="required" width="17" height="12"/></span><span class="tip">' + bwAttendeeDispRoleRequired + '</span></td>'); 
    420443            break; 
    421           case bwAttendeeRoleNonParticipant : // non-participant 
     444          case bwAttendeeRoleNonParticipant: // non-participant 
    422445            $(fbDisplayAttendeeRow).append('<td class="role nonparticipant"><span class="icon">x</span><span class="tip">' + bwAttendeeDispRoleNonParticipant + '</span></td>'); 
    423446            break; 
    424           default : // bwAttendeeRoleOptional - no icon (use a space to provide a rollover) 
     447          default: // bwAttendeeRoleOptional - no icon (use a space to provide a rollover) 
    425448            $(fbDisplayAttendeeRow).append('<td class="role optional"><span class="icon">&#160;</span><span class="tip">' + bwAttendeeDispRoleOptional + '</span></td>'); 
    426449        } 
     
    429452        // output the attendee name or address (depending on which we have available) 
    430453        // and add attendee functions 
    431         var attendeeNameHtml = '<td class="name">'; 
     454        var attendeeAddress = curAttendee.uid.substr(curAttendee.uid.lastIndexOf(":") + 1); 
     455        var attendeeNameHtml = '<td class="name"><span class="bwAttendee" id="' + attendeeAddress + '">'; 
    432456        if (curAttendee.name && curAttendee.name != "") { 
    433           attendeeNameHtml += curAttendee.name; 
     457          attendeeNameHtml += curAttendee.name; 
    434458        } else { 
    435           attendeeNameHtml +=  curAttendee.uid.substr(curAttendee.uid.lastIndexOf(":")+1); 
    436         } 
     459          attendeeNameHtml += attendeeAddress; 
     460        } 
     461        attendeeNameHtml += '</span>'; 
     462        //attendeeNameHtml += '<div id="' + attendeeAddress + '-menu" class="attendeeMenu">hi</div>'; 
    437463        attendeeNameHtml += '</td>'; 
    438464        $(fbDisplayAttendeeRow).append(attendeeNameHtml); 
    439465         
    440         // output checkbox for attendee 
    441         $(fbDisplayAttendeeRow).append('<td class="check"><input type="checkbox" checked="checked" name="selectAllToggle" class="selectAllToggle"/></td><td class="fbBoundry"></td>'); 
    442         
     466        // output delete mark and checkbox for attendee 
     467        if (curAttendee.selected) { 
     468          $(fbDisplayAttendeeRow).append('<td class="check"><span id="' + attendeeAddress + '-rm" class="removeAttendee">x</span> <input type="checkbox" checked="checked" name="selectedToggle" class="selectedToggle"/></td><td class="fbBoundry"></td>'); 
     469        } else { 
     470          $(fbDisplayAttendeeRow).append('<td class="check"><span id="' + attendeeAddress + '-rm" class="removeAttendee">x</span> <input type="checkbox" name="selectedToggle" class="selectedToggle"/></td><td class="fbBoundry"></td>'); 
     471        } 
     472         
    443473         
    444474        // build the time row for an attendee 
     
    451481            for (k = 0; k < this.hourDivision; k++) { 
    452482              var fbCell = document.createElement("td"); 
    453               fbCell.id = curDate.getTime() + "-" + curAttendee.uid.substr(curAttendee.uid.lastIndexOf(":")+1); 
     483              fbCell.id = curDate.getTime() + "-" + curAttendee.uid.substr(curAttendee.uid.lastIndexOf(":") + 1); 
    454484              $(fbCell).addClass("fbcell"); 
    455485              $(fbCell).addClass(curDate.getTime().toString()); 
    456486              if (curDate.getMinutes() == 0 && j != 0) { 
    457487                $(fbCell).addClass("hourBoundry"); 
    458               }  
     488              } 
    459489              for (m = 0; m < curAttendee.freebusy.length; m++) { 
    460490                var tzoffset = -curDate.getTimezoneOffset() * 60000; // in milliseconds 
    461491                // adding the hourdivision increment in the calculation below is to correct for a bug 
    462492                // in which the class was always offset by one table cell - should find cause 
    463                 var curDateUTC = curDate.getTime() + tzoffset + (60 / this.hourDivision * 60000);                 
     493                var curDateUTC = curDate.getTime() + tzoffset + (60 / this.hourDivision * 60000); 
    464494                if (curAttendee.freebusy[m].contains(curDateUTC)) { 
    465495                  if (curAttendee.freebusy[m].type.match("TENTATIVE")) { 
    466496                    $(fbCell).addClass("tentative"); 
    467497                  } else { 
    468                     $(fbCell).addClass("busy");                     
     498                    $(fbCell).addClass("busy"); 
    469499                  } 
    470500                  $(fbCell).addClass("activeCell"); 
     
    474504              } 
    475505              $(fbDisplayAttendeeRow).append(fbCell); 
    476               curDate.addMinutes(60/this.hourDivision); 
     506              curDate.addMinutes(60 / this.hourDivision); 
    477507            } 
    478508          } 
     
    504534          for (k = 0; k < this.hourDivision; k++) { 
    505535            var fbCell = document.createElement("td"); 
    506             fbCell.id = curDate.getTime() + "-" + curAttendee.uid.substr(curAttendee.uid.lastIndexOf(":")+1)
     536            fbCell.id = curDate.getTime() + "-add"
    507537            $(fbCell).addClass("fbcell"); 
    508538            $(fbCell).addClass(curDate.getTime().toString()); 
     
    528558          for (k = 0; k < this.hourDivision; k++) { 
    529559            var fbCell = document.createElement("td"); 
    530             fbCell.id = curDate.getTime() + "-" + curAttendee.uid.substr(curAttendee.uid.lastIndexOf(":")+1)
     560            fbCell.id = curDate.getTime() + "-blank"
    531561            $(fbCell).addClass("fbcell"); 
    532562            $(fbCell).addClass(curDate.getTime().toString()); 
     
    593623          for (i = 0; i < bwGrid.freeTime.length; i++) { 
    594624            if (Number(bwGrid.freeTime[i]) >= Number(startSelectionMils)) { 
    595               bwGrid.freeTimeIndex = i; 
     625              bwGrid.freeTimeIndex = i - 1; // this will make pick previous jump an extra gap after clicking in a busy space, but it makes pick next work correctly in the same circumstance 
     626              if (bwGrid.freeTimeIndex < 0) { 
     627                bwGrid.freeTimeIndex = 0; 
     628              } 
    596629              break; 
    597630            } 
     
    660693          $(this).addClass("active"); 
    661694          $(this).removeClass("pending"); 
     695        } 
     696      ); 
     697       
     698      $("#bwScheduleTable .removeAttendee").click ( 
     699        function () { 
     700          var i = $("#bwScheduleTable .removeAttendee").index(this); 
     701          bwGrid.removeAttendee(i); 
     702        } 
     703      ); 
     704       
     705      $("#bwScheduleTable input.selectedToggle").click ( 
     706        function () { 
     707          var i = $("#bwScheduleTable input.selectedToggle").index(this); 
     708          if (this.checked) { 
     709             bwGrid.attendees[i].selected = true; 
     710          } else { 
     711             bwGrid.attendees[i].selected = false; 
     712          } 
     713          bwGrid.display(); 
    662714        } 
    663715      ); 
  • trunk/deployment/webuser/webapp/resources/demoskins/fbMockup/index.html

    r2886 r2891  
    110110        </tr> 
    111111        <tr> 
    112           <td class="zoom"> 
     112          <td class="zoom">             
     113            <!-- 
    113114            <span class="zoomControl">-</span> 
    114115            <select name="zoom"> 
     
    121122            </select> 
    122123            <span class="zoomControl">+</span> 
     124            --> 
    123125          </td> 
    124126          <td> 
  • trunk/deployment/webuser/webapp/resources/demoskins/fbMockup/schedule.css

    r2886 r2891  
    3232  padding-right: 16px; 
    3333} 
     34#bwScheduleTable tr.deselected { 
     35  background-color: #f8f8f8; 
     36  color: #aaa; 
     37} 
     38 
    3439#bwScheduleTable .icon, 
    3540#bwScheduleTable .activeCell { 
     
    101106} 
    102107#bwScheduleTable td.busy { 
    103   background-color: #b1cbfa !important
     108  background-color: #b1cbfa
    104109  color: black; 
    105110} 
     111#bwScheduleTable tr.deselected td.busy { 
     112  background-color: #D8E4FA; 
     113  color: black; 
     114}  
    106115#bwScheduleTable td.tentative { 
    107   background: #eef url("tentativeLines.gif") !important
     116  background: #eef url("tentativeLines.gif")
    108117  color: black; 
    109118} 
     
    132141  color: black; 
    133142} 
     143#bwScheduleTable .removeAttendee { 
     144  cursor: pointer;  
     145  font-weight: bold; 
     146  color: #999; 
     147  background-color: transparent; 
     148}  
     149#bwScheduleTable .attendeeMenu { 
     150  position: absolute;  
     151  margin: 0 0 0 1em; 
     152  background-color: #ffe; 
     153  color: black; 
     154  padding: 0.5em; 
     155  border: 1px solid #ccc; 
     156  display: none; 
     157} 
    134158#bwScheduleControls { 
    135159  margin: 1.5em 1em;