Changeset 2963

Show
Ignore:
Timestamp:
08/04/10 11:08:21
Author:
johnsa
Message:

user client: more changes to the scheduling grid
- autocomplete now runs against live carddav server
- can switch address books and type of items to search for
- moved "add attendee" to top of grid

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/deployment/resources/javascript/jquery/autocomplete/bw-jquery.autocomplete.js

    r2050 r2963  
    314314 
    315315  function receiveData(q, data) { 
    316     if ( data && data.length && hasFocus ) { 
     316    if ( data && data.length && hasFocus && data[0] != undefined) { 
    317317      stopLoading(); 
    318318      select.display(data, q); 
  • trunk/deployment/webuser/webapp/resources/demoskins/themes/bedeworkTheme/css/bwScheduling.css

    r2953 r2963  
    108108} 
    109109#bwScheduleTable #bwAddAttendeeFields { 
    110         margin: auto; 
    111         width: 170px; 
     110        white-space: nowrap; 
    112111} 
    113112#bwScheduleTable .bwAddAttendeeSubField { 
    114         float: left; 
    115113        font-size: 0.9em; 
    116114  margin: 0.5em 0.25em; 
    117115} 
    118116#bwScheduleTable .bwAddAttendeeSubFieldHead { 
    119   text-align: center; 
    120   background-color: #eee; 
    121   color: black; 
    122117} 
    123118#bwScheduleTable #attType { 
  • trunk/deployment/webuser/webapp/resources/demoskins/themes/bedeworkTheme/head.xsl

    r2950 r2963  
    186186        var bwGridAttees = new Array(<xsl:apply-templates select="/bedework/formElements/form/attendees" mode="loadBwGrid"/>); 
    187187        var bwGridOrganizer = "<xsl:value-of select="/bedework/formElements/form/organizer/organizerUri"/>"; 
    188         var bwGrid = new bwSchedulingGrid("bwFreeBusyDisplay",bwGridSDate,8,17,bwGridAttees,true,100,"<xsl:value-of select="$resourcesRoot"/>","<xsl:value-of select="$requestFreeBusy"/>","<xsl:value-of select="$event-attendeesForEvent"/>",bwGridOrganizer); 
     188        var bwGridCurUser = "<xsl:value-of select="/bedework/userid"/>"; 
     189        var bwGrid = new bwSchedulingGrid("bwFreeBusyDisplay",bwGridSDate,8,17,bwGridAttees,true,100,"<xsl:value-of select="$resourcesRoot"/>","<xsl:value-of select="$requestFreeBusy"/>","<xsl:value-of select="$event-attendeesForEvent"/>",bwGridOrganizer,bwGridCurUser); 
    189190         
    190191        // set the grid size 
  • trunk/deployment/webuser/webapp/resources/demoskins/themes/bedeworkTheme/javascript/bedeworkAttendees.js

    r2953 r2963  
    2626  extraParams: { 
    2727    format: 'json', 
    28     addrbook: '/public/locations' 
    29     //addrbook: '/user/johnsa/addressbook' 
     28    addrbook: function() { return $("#bwCardDavBookPath").val(); } 
    3029  }, 
    3130 
     
    3736  parse: function(data) { 
    3837    var parsed = []; 
    39     data = data.microformats.vcard; 
    40     for (var i = 0; i < data.length; i++) { 
    41        
    42       // pick out the best uri if one is available 
    43       // caladruri is first choice, email second 
    44       var cururi = ""; 
    45       if (data[i].caladruri != undefined && data[i].caladruri.value != undefined) { 
    46         cururi = data[i].caladruri.value; 
    47       } 
    48       if (cururi == "" && data[i].email[0] != undefined && data[i].email[0].value != undefined) { 
    49         var curEmail = data[i].email[0].value; 
    50         if (curEmail != "") { 
    51           cururi = "mailto:" + curEmail; 
     38    if (data.microformats != undefined && data.microformats.vcard != undefined) { 
     39      data = data.microformats.vcard; 
     40      for (var i = 0; i < data.length; i++) { 
     41         
     42        // pick out the best uri if one is available 
     43        // caladruri is first choice, email second 
     44        var cururi = ""; 
     45        if (data[i].caladruri != undefined && data[i].caladruri.value != undefined) { 
     46          cururi = data[i].caladruri.value; 
    5247        } 
    53       }       
    54       // check for the existence of fn 
    55       var curfn = ""; 
    56       if (data[i].fn != undefined && data[i].fn.value != undefined) { 
    57         curfn = data[i].fn.value; 
    58       } 
    59        
    60       // check for the existence of kind 
    61       var curkind = ""; 
    62       if (data[i].kind != undefined && data[i].kind.value != undefined) { 
    63         curkind = data[i].kind.value; 
    64       } 
    65        
    66       // skip if no uri  
    67       if (cururi != "") { 
    68         dataRow = { 
    69           fn: curfn, 
    70           uri: cururi,  
    71           type: curkind 
    72         }; 
    73         parsed[i] = { 
    74           data: dataRow, 
    75           value: curfn, 
    76           result: cururi 
    77         }; 
     48        if (cururi == "" && data[i].email != undefined && data[i].email[0] != undefined && data[i].email[0].value != undefined) { 
     49          var curEmail = data[i].email[0].value; 
     50          if (curEmail != "") { 
     51            cururi = "mailto:" + curEmail; 
     52          } 
     53        }       
     54        // check for the existence of fn 
     55        var curfn = ""; 
     56        if (data[i].fn != undefined && data[i].fn.value != undefined) { 
     57          curfn = data[i].fn.value; 
     58        } 
     59         
     60        // check for the existence of kind 
     61        var curkind = ""; 
     62        if (data[i].kind != undefined && data[i].kind.value != undefined) { 
     63          curkind = data[i].kind.value; 
     64        } 
     65         
     66        // skip if no uri  
     67        if (cururi != "") { 
     68          dataRow = { 
     69            fn: curfn, 
     70            uri: cururi,  
     71            type: curkind 
     72          }; 
     73          parsed[i] = { 
     74            data: dataRow, 
     75            value: curfn, 
     76            result: cururi 
     77          }; 
     78        } 
    7879      } 
    7980    } 
     
    8182  }, 
    8283  formatItem: function(item) { 
    83       return " \"" + item.fn + "\" [" + item.uri.substring(7) + "]"
     84      return " " + item.fn + " - " + item.uri.substring(7)
    8485  }, 
    8586 
    8687  formatMatch: function(item) { 
    87       return " \"" + item.fn + "\" [" + item.uri.substring(7) + "]"
     88      return " " + item.fn + " - " + item.uri.substring(7)
    8889  }, 
    8990  formatResult: function(item) { 
  • trunk/deployment/webuser/webapp/resources/demoskins/themes/bedeworkTheme/javascript/bedeworkScheduling.js

    r2953 r2963  
    1818 */ 
    1919 
    20  
    21 // ======================================================================== 
    22 // free/busy functions 
    23 // ======================================================================== 
     20/* ======================================================================== 
     21   This file builds a scheduling widget for the "meeting" tab of the  
     22   add/edit event form used for adding and removing attendees, observing 
     23   free/busy, and for picking available time in a free/busy grid.  
     24   ======================================================================== 
     25*/ 
    2426 
    2527// Constants and RFC-5445 values  
     
    6466var bwAttendeeExistsDisp = "attendee exists"; 
    6567var bwAddAttendeeRoleDisp = "Role:"; 
    66 var bwAddAttendeeTypeDisp = "Type"; 
    67 var bwAddAttendeeBookDisp = "Book"; 
     68var bwAddAttendeeTypeDisp = "Type:"; 
     69var bwAddAttendeeBookDisp = "Book:"; 
    6870var bwEventSubmitMeetingDisp = "send"; 
    6971 
     
    193195 * organizerUri:    string - e.g. "someone@mysite.edu"  
    194196 */ 
    195 var bwSchedulingGrid = function(displayId, startRange, startHoursRange, endHoursRange, attendees, workday, zoom, browserResourcesRoot, fbUrlPrefix, attUrlPrefix, organizerUri) { 
     197var bwSchedulingGrid = function(displayId, startRange, startHoursRange, endHoursRange, attendees, workday, zoom, browserResourcesRoot, fbUrlPrefix, attUrlPrefix, organizerUri, curUserId) { 
    196198  this.displayId = displayId; 
    197199  this.startRange = new Date(startRange); 
     
    207209  this.attUrlPrefix = attUrlPrefix; 
    208210  this.organizer = organizerUri; 
     211  this.curUser = curUserId; 
    209212   
    210213  // increment the endRange 
     
    663666      } 
    664667       
     668   // generate the "add attendee" row 
     669      fbDisplayAddAttendeeRow = fbDisplay.insertRow(fbDisplay.rows.length); 
     670       
     671      // create the add attendee form  
     672      var addAttendeeHtml = '<td class="addAttendee" colspan="4">'; 
     673      addAttendeeHtml += '<input type="text" value="' + bwAddAttendeeDisp +'" name="q" id="bwAddAttendee" class="pending" size="30"/>'; 
     674      addAttendeeHtml += '<span id="bwAddAttendeeAdd" class="invisible">' + bwAddDisp +'</span>'; 
     675      //addAttendeeHtml += '<span id="bwAddAttendeeAdvanced">advanced</span>'; 
     676      addAttendeeHtml += '<div id="bwAddAttendeeFields" class="invisible">'; 
     677      addAttendeeHtml += '  <div class="bwAddAttendeeSubField" id="bwAddAttendeeRoleBlock">'; 
     678      addAttendeeHtml += '    <span class="bwAddAttendeeSubFieldHead">' + bwAddAttendeeRoleDisp + '</span>'; 
     679      addAttendeeHtml += '    <select name="role" id="bwAddAttendeeRole">'; 
     680      addAttendeeHtml += '      <option value="REQ-PARTICIPANT">' + bwReqParticipantDisp + '</option>'; 
     681      addAttendeeHtml += '      <option value="OPT-PARTICIPANT">' + bwOptParticipantDisp + '</option>'; 
     682      addAttendeeHtml += '      <option value="CHAIR">' + bwChairDisp + '</option>'; 
     683      addAttendeeHtml += '      <option value="NON-PARTICIPANT">' + bwNonParticipant + '</option>'; 
     684      addAttendeeHtml += '    </select>'; 
     685      addAttendeeHtml += '  </div>'; 
     686      // DON'T include partstat except for testing.  This value should be determined by actual participants. 
     687      //addAttendeeHtml += '<select name="partstat" id="bwAddAttendeePartstat">'; 
     688      //addAttendeeHtml += '  <option value="NEEDS-ACTION">' + bwNeedsAction + '</option>'; 
     689      //addAttendeeHtml += '  <option value="ACCEPTED">' + bwAccepted + '</option>'; 
     690      //addAttendeeHtml += '  <option value="DECLINED">' + bwDeclined + '</option>'; 
     691      //addAttendeeHtml += '  <option value="TENTATIVE">' + bwTentative + '</option>'; 
     692      //addAttendeeHtml += '  <option value="DELEGATED">' + bwDelegated + '</option>'; 
     693      //addAttendeeHtml += '</select>'; 
     694      addAttendeeHtml += '  <div class="bwAddAttendeeSubField" id="bwAddAttendeeBookBlock">'; 
     695      addAttendeeHtml += '    <span class="bwAddAttendeeSubFieldHead">' + bwAddAttendeeBookDisp + '</span>'; 
     696      addAttendeeHtml += '    <input type="radio" name="bwAddAttendeeAddrBk" value="/user/' + bwGrid.curUser + '/addressbook" checked="checked" onclick="changeClass(\'bwAddAttendeeTypeBlock\',\'invisible\');bwGrid.updateBookPath(this.value);">personal'; 
     697      addAttendeeHtml += '    <input type="radio" name="bwAddAttendeeAddrBk" value="/public" onclick="changeClass(\'bwAddAttendeeTypeBlock\',\'bwAddAttendeeSubField\');bwGrid.updateBookPath(this.form.bwAddAttendeeType.value);">public'; 
     698      addAttendeeHtml += '  </div>'; 
     699      addAttendeeHtml += '  <div class="invisible" id="bwAddAttendeeTypeBlock">'; 
     700      addAttendeeHtml += '    <span class="bwAddAttendeeSubFieldHead">' + bwAddAttendeeTypeDisp + '</span>'; 
     701      addAttendeeHtml += '    <input type="radio" name="bwAddAttendeeType" value="/public/people" checked="checked" onclick="bwGrid.updateBookPath(this.value);"/>person'; 
     702      addAttendeeHtml += '    <input type="radio" name="bwAddAttendeeType" value="/public/groups" disabled="disabled" onclick="bwGrid.updateBookPath(this.value);"/>group'; 
     703      addAttendeeHtml += '    <input type="radio" name="bwAddAttendeeType" value="/public/locations" onclick="bwGrid.updateBookPath(this.value);"/>location'; 
     704      addAttendeeHtml += '  </div>'; 
     705      addAttendeeHtml += '  <input type="hidden" name="bwCardDavBookPath" id="bwCardDavBookPath" value="/user/' + bwGrid.curUser + '/addressbook"/>'; 
     706      addAttendeeHtml += '</div>'; 
     707      addAttendeeHtml += '</td><td class="fbBoundry"></td>'; 
     708       
     709      $(fbDisplayAddAttendeeRow).html(addAttendeeHtml); 
     710       
     711      for (i = 0; i < range; i++) { 
     712        var curDate = new Date(this.startRange); 
     713        curDate.setHours(startHour); 
     714        curDate.addDays(i); 
     715        // add the time cells by iterating over the hours 
     716        for (j = 0; j < hourRange; j++) { 
     717          for (k = 0; k < this.hourDivision; k++) { 
     718            var fbCell = document.createElement("td"); 
     719            fbCell.id = curDate.getTime() + "-add"; 
     720            $(fbCell).addClass("fbcell"); 
     721            $(fbCell).addClass(curDate.getTime().toString()); 
     722            if (curDate.getMinutes() == 0 && j != 0) { 
     723              $(fbCell).addClass("hourBoundry"); 
     724            }  
     725            $(fbDisplayAddAttendeeRow).append(fbCell); 
     726            curDate.addMinutes(60/this.hourDivision); 
     727          } 
     728        } 
     729        $(fbDisplayAddAttendeeRow).append('<td class="dayBoundry"></td>'); 
     730      } 
     731       
    665732      // generate the regular attendees rows 
    666733      for (attendee = 0; attendee < this.attendees.length; attendee++) { 
     
    780847      } 
    781848       
    782       // generate the "add attendee" row 
    783       fbDisplayAddAttendeeRow = fbDisplay.insertRow(fbDisplay.rows.length); 
    784        
    785       // create the add attendee form  
    786       var addAttendeeHtml = '<td class="addAttendee" colspan="4">'; 
    787       addAttendeeHtml += '<input type="text" value="' + bwAddAttendeeDisp +'" name="q" id="bwAddAttendee" class="pending" size="30"/>'; 
    788       addAttendeeHtml += '<span id="bwAddAttendeeAdd" class="invisible">' + bwAddDisp +'</span>'; 
    789       //addAttendeeHtml += '<span id="bwAddAttendeeAdvanced">advanced</span>'; 
    790       addAttendeeHtml += '<div id="bwAddAttendeeFields" class="invisible">'; 
    791       addAttendeeHtml += '  ' + bwAddAttendeeRoleDisp + ' '; 
    792       addAttendeeHtml += '  <select name="role" id="bwAddAttendeeRole">'; 
    793       addAttendeeHtml += '    <option value="REQ-PARTICIPANT">' + bwReqParticipantDisp + '</option>'; 
    794       addAttendeeHtml += '    <option value="OPT-PARTICIPANT">' + bwOptParticipantDisp + '</option>'; 
    795       addAttendeeHtml += '    <option value="CHAIR">' + bwChairDisp + '</option>'; 
    796       addAttendeeHtml += '    <option value="NON-PARTICIPANT">' + bwNonParticipant + '</option>'; 
    797       addAttendeeHtml += '  </select>'; 
    798       // DON'T include partstat except for testing.  This value should be determined by actual participants. 
    799       //addAttendeeHtml += '<select name="partstat" id="bwAddAttendeePartstat">'; 
    800       //addAttendeeHtml += '  <option value="NEEDS-ACTION">' + bwNeedsAction + '</option>'; 
    801       //addAttendeeHtml += '  <option value="ACCEPTED">' + bwAccepted + '</option>'; 
    802       //addAttendeeHtml += '  <option value="DECLINED">' + bwDeclined + '</option>'; 
    803       //addAttendeeHtml += '  <option value="TENTATIVE">' + bwTentative + '</option>'; 
    804       //addAttendeeHtml += '  <option value="DELEGATED">' + bwDelegated + '</option>'; 
    805       //addAttendeeHtml += '</select>'; 
    806       addAttendeeHtml += '  <div class="bwAddAttendeeSubField">'; 
    807       addAttendeeHtml += '    <div class="bwAddAttendeeSubFieldHead">' + bwAddAttendeeTypeDisp + '</div>'; 
    808       addAttendeeHtml += '    <input type="radio" name="bwAddAttendeeType" value="person" checked="checked">person<br/>'; 
    809       addAttendeeHtml += '    <input type="radio" name="bwAddAttendeeType" value="group" disabled="disabled">group<br/>'; 
    810       addAttendeeHtml += '    <input type="radio" name="bwAddAttendeeType" value="location"/>location'; 
    811       addAttendeeHtml += '  </div>'; 
    812       addAttendeeHtml += '  <div class="bwAddAttendeeSubField">'; 
    813       addAttendeeHtml += '    <div class="bwAddAttendeeSubFieldHead">' + bwAddAttendeeBookDisp + '</div>'; 
    814       addAttendeeHtml += '    <input type="radio" name="bwAddAttendeeAddrBk" value="person" checked="checked">personal<br/>'; 
    815       addAttendeeHtml += '    <input type="radio" name="bwAddAttendeeAddrBk" value="group">public<br/>'; 
    816       addAttendeeHtml += '  </div>'; 
    817       addAttendeeHtml += '</div>'; 
    818       addAttendeeHtml += '</td><td class="fbBoundry"></td>'; 
    819        
    820       $(fbDisplayAddAttendeeRow).html(addAttendeeHtml); 
    821        
    822       for (i = 0; i < range; i++) { 
    823         var curDate = new Date(this.startRange); 
    824         curDate.setHours(startHour); 
    825         curDate.addDays(i); 
    826         // add the time cells by iterating over the hours 
    827         for (j = 0; j < hourRange; j++) { 
    828           for (k = 0; k < this.hourDivision; k++) { 
    829             var fbCell = document.createElement("td"); 
    830             fbCell.id = curDate.getTime() + "-add"; 
    831             $(fbCell).addClass("fbcell"); 
    832             $(fbCell).addClass(curDate.getTime().toString()); 
    833             if (curDate.getMinutes() == 0 && j != 0) { 
    834               $(fbCell).addClass("hourBoundry"); 
    835             }  
    836             $(fbDisplayAddAttendeeRow).append(fbCell); 
    837             curDate.addMinutes(60/this.hourDivision); 
    838           } 
    839         } 
    840         $(fbDisplayAddAttendeeRow).append('<td class="dayBoundry"></td>'); 
    841       }  
    842        
    843849      // generate a blank row at the end (this is just for visual padding) 
    844850      fbDisplayBlankRow = fbDisplay.insertRow(fbDisplay.rows.length); 
     
    938944        } 
    939945      ); 
     946       
     947      this.updateBookPath = function(path) { 
     948        $("#bwCardDavBookPath").val(path); 
     949      } 
    940950       
    941951      this.gotoNextRange = function() { 
     
    10481058       var carddavUrlTemp = "/ucalrsrc/themes/bedeworkTheme/javascript/addrbookUsers.js" 
    10491059       //var carddavUrlTemp = "/ucalrsrc/themes/bedeworkTheme/javascript/addrbookLocations.js" 
    1050       $("#bwScheduleTable #bwAddAttendee").autocomplete(carddavUrlTemp, bwAutoCompleteOptions); 
     1060      $("#bwScheduleTable #bwAddAttendee").autocomplete(carddavUrl, bwAutoCompleteOptions); 
    10511061       
    10521062      // capture the enter key when entering an attendee; 
     
    10541064      $("#bwScheduleTable #bwAddAttendee").keypress ( 
    10551065          function (e) { 
    1056             if(e.keyCode == 13) { 
     1066            if(e.keyCode == 13) { // enter 
    10571067              e.preventDefault(); 
    10581068              bwGrid.addAttendeeFromGrid();