RT#34237 installer scheduling [javascript debugging]
authorJonathan Prykop <jonathan@freeside.biz>
Fri, 19 Feb 2016 08:29:10 +0000 (02:29 -0600)
committerJonathan Prykop <jonathan@freeside.biz>
Fri, 19 Feb 2016 08:29:10 +0000 (02:29 -0600)
rt/share/html/Elements/CalendarSlotSchedule
rt/share/html/Search/Schedule.html

index 72c5316..b82997b 100644 (file)
 %#          revert:      'invalid',
           revert: true,
           revertDuration: 0,
+          stop: clear_drag_hi,
         });
         $('#<% $td_id %>').data('ticketid', <% $draggable_ticketid %>);
         $('#<% $td_id %>').data('length',   <% $draggable_length * 60 %>);
index 96670cd..0dbe8c3 100644 (file)
 
 % }
 
+% # it would be better if we had draggable-specific droppables, but this will prevent overlap for now...
+  function can_drop ($where, cells) {
+    for (var c=0; c < cells; c++) {
+      if (!$where.is('.ui-droppable')) {
+        return false;
+      }
+      var rownum = $where.parent().prevAll('tr').length;
+      var colnum = $where.prevAll('td').length;
+      $where = $where.parent().parent().children('tr').eq(rownum+1).children('td').eq(colnum);
+    }
+    return true;
+  }
+
   var drag_cells = 0;
   var drag_hi;
+
+  // on drag stop (regardless of if it was dropped)
+  function clear_drag_hi () {
+    if ( drag_hi ) {
+      boxoff_do(drag_hi);
+      drag_hi = undefined;
+    }
+  }
+
+  // on drag over
   function boxon_drop(event, ui) {
     //var $this = $(what);
     var $this = $(this);
 
     drag_cells = ui.draggable.data('cells');
 
-    if ( drag_hi ) {
-      boxoff_do(drag_hi);
-    }
+    clear_drag_hi();
+
+    if (!can_drop($this, drag_cells)) return;
+
     drag_hi = $this;
 
     for ( var c=0; c < drag_cells; c++) {
 
   }
 
+  // clears highlighted box, used by clear_hi_drag (drag stop event)
   function boxoff_do(what) {
 
     var $this = what;
     }
   }
 
+  // drop event
   function reschedule_appointment( event, ui ) {
 
+    var $this = $(this);
+
+    if (!can_drop($this, ui.draggable.data('cells'))) return;
+
 %   #get the ticket number and appointment length (from the draggable object)
     var ticketid = ui.draggable.data('ticketid');
     var length   = ui.draggable.data('length');
     var bgcolor  = ui.draggable.data('bgcolor');
 
 %   #and.. the new date and time, and username (from the droppable object)
-    var starts   = $(this).data('starts');
-    var username = $(this).data('username');
+    var starts   = $this.data('starts');
+    var username = $this.data('username');
 
     var due = parseInt(starts) + parseInt(length);
 
-    var n_epoch        = $(this).data('epoch');
-    var n_st_tod_row   = $(this).data('tod_row');
+    var n_epoch        = $this.data('epoch');
+    var n_st_tod_row   = $this.data('tod_row');
 
     var draggable = ui.draggable;
-    var droppable = $(this);
+    var droppable = $this;
     draggable.effect( "transfer", { to: droppable }, 420 );
 
 %   #tell the backend to reschedule it
 
 %       #maybe use that animation which shows the box from point A to B
 
-        if ( drag_hi ) {
-          boxoff_do(drag_hi);
-        }
+        clear_drag_hi();
         for ( var d=0; d < cells; d++) {
           var n_tod_row = parseInt(n_st_tod_row) + (d * <%$timestep%>);
           var n_td_id = 'td_' + n_epoch +
 %#              revert:      'invalid',
               revert: true,
               revertDuration: 0,
+              stop: clear_drag_hi,
             });
             $('#'+n_td_id).data('ticketid', ticketid );
             $('#'+n_td_id).data('length',   length );