many cosmetic changes
[myslice.git] / plugins / scheduler2 / static / js / scheduler2.js
index 0b294b4..6b55b92 100755 (executable)
@@ -232,13 +232,15 @@ var SCHEDULER_COLWIDTH = 50;
 \r
         $scope.select = function(index, model_lease, model_resource)\r
         {\r
-            var data;\r
+            var data, resource_granularity;\r
+\r
+            //resource_granularity = model_resource.granularity === undefined ? RESOURCE_DEFAULT_GRANULARITY : model_resource.granularity;\r
 \r
             console.log("Selected", index, model_lease, model_resource);\r
 \r
             var day_timestamp = SchedulerDateSelected.getTime() / 1000;\r
-            var start_time = day_timestamp + index       * model_resource.granularity;\r
-            var end_time   = day_timestamp + (index + 1) * model_resource.granularity;\r
+            var start_time = day_timestamp + index       * model_resource.granularity; // XXX resource_granularity\r
+            var end_time   = day_timestamp + (index + 1) * model_resource.granularity; //\r
             var start_date = new Date(start_time * 1000);\r
             var end_date   = new Date(end_time   * 1000);\r
 \r
@@ -478,10 +480,6 @@ var SCHEDULER_COLWIDTH = 50;
                  * be updated when resources arrive.  Should be the pgcd in fact XXX */\r
                 this._granularity = DEFAULT_GRANULARITY;\r
                 scope.granularity = this._granularity;\r
-                this._all_slots = this._generate_all_slots();\r
-\r
-                // A list of {id, time} dictionaries representing the slots for the given day\r
-                scope.slots = this._all_slots;\r
                 this.scope_resources_by_key = {};\r
 \r
                 this.do_resize();\r
@@ -495,7 +493,16 @@ var SCHEDULER_COLWIDTH = 50;
             do_resize: function()\r
             {\r
                 var scope = this._get_scope();\r
-                var num_hidden_cells, new_max;\r
+                var num_hidden_cells, new_max, lcm;\r
+\r
+                // do_resize has to be called when the window is resized, or one parameter changes\r
+                // e.g. when new resources have been received\r
+                //\r
+                this.resource_granularities = [3600, 1800]; //, 2400]; /* s */\r
+\r
+                /* Compute the slot length to accommodate all resources. This\r
+                 * is the GCD of all resource granularities. */\r
+                this._slot_length = this._gcdn(this.resource_granularities);\r
 \r
                 $('#' + schedulerTblId + ' thead tr th:eq(0)').css("width", SCHEDULER_FIRST_COLWIDTH);\r
                 //self get width might need fix depending on the template \r
@@ -503,13 +510,23 @@ var SCHEDULER_COLWIDTH = 50;
 \r
                 /* Number of visible cells...*/\r
                 this._num_visible_cells = parseInt((tblwidth - SCHEDULER_FIRST_COLWIDTH) / SCHEDULER_COLWIDTH);\r
+\r
                 /* ...should be a multiple of the lcm of all encountered granularities. */\r
-                // XXX Should be updated everytime a new resource is added\r
-                this._lcm_colspan = this._lcm(this._granularity, RESOURCE_DEFAULT_GRANULARITY) / this._granularity;\r
-                this._num_visible_cells = this._num_visible_cells - this._num_visible_cells % this._lcm_colspan;\r
+                lcm = this._lcmn(this.resource_granularities) / this._slot_length;\r
+                this._num_visible_cells = this._num_visible_cells - this._num_visible_cells % lcm;\r
+\r
+                // A list of {id, time} dictionaries representing the slots for the given day\r
+                this._all_slots = this._generate_all_slots();\r
+\r
                 /* scope also needs this value */\r
+                scope.slots = this._all_slots;\r
+                scope.slot_length = this._slot_length;\r
                 scope.num_visible_cells = this._num_visible_cells;\r
-                scope.lcm_colspan = this._lcm_colspan;\r
+                scope.lcm_colspan = this._lcmn(this.resource_granularities); // XXX WHY ?\r
+\r
+                /* Redraw... */\r
+                this._scope_clear_leases();\r
+                this._set_all_lease_slots();\r
 \r
                 // Slider max value\r
                 if ($('#tblSlider').data('slider') != undefined) {\r
@@ -517,8 +534,8 @@ var SCHEDULER_COLWIDTH = 50;
 \r
                     $('#tblSlider').slider('setAttribute', 'max', num_hidden_cells);\r
                     $('#tblSlider').slider('setValue', scope.from, true);\r
-                    this._get_scope().$apply();\r
                 }\r
+                this._get_scope().$apply();\r
 \r
 \r
             },\r
@@ -561,7 +578,9 @@ var SCHEDULER_COLWIDTH = 50;
                     var resource = jQuery.extend(true, {}, record);\r
 \r
                     // Fix granularity\r
-                    resource.granularity = typeof(resource.granularity) == "number" ? resource.granularity : RESOURCE_DEFAULT_GRANULARITY;\r
+                    //resource_granularity = ((resource.granularity === undefined) || (typeof(resource.granularity) != "number")) ? RESOURCE_DEFAULT_GRANULARITY : resource.granularity;\r
+                    if (typeof(resource.granularity) != "number")\r
+                        resource.granularity = RESOURCE_DEFAULT_GRANULARITY;\r
                     resource.leases = []; // a list of occupied timeslots\r
 \r
                     self.scope_resources_by_key[resource['urn']] = resource;\r
@@ -580,7 +599,7 @@ var SCHEDULER_COLWIDTH = 50;
                 // Setup leases with a default free status...\r
                 $.each(this.scope_resources_by_key, function(resource_key, resource) {\r
                     resource.leases = [];\r
-                    var colspan_lease = resource.granularity / self._granularity; //eg. 3600 / 1800 => 2 cells\r
+                    var colspan_lease = resource.granularity / self._slot_length; //eg. 3600 / 1800 => 2 cells\r
                     time = SchedulerDateSelected.getTime();\r
                     for (i=0; i < self._all_slots.length / colspan_lease; i++) { // divide by granularity\r
                         resource.leases.push({\r
@@ -715,58 +734,58 @@ var SCHEDULER_COLWIDTH = 50;
                     return true; // ~ continue\r
 \r
                 id_end   = Math.ceil((lease.end_time   - day_timestamp) / resource.granularity);\r
-                colspan_lease = resource.granularity / this._granularity; //eg. 3600 / 1800 => 2 cells\r
+                colspan_lease = resource.granularity / this._slot_length; //eg. 3600 / 1800 => 2 cells\r
                 if (id_end >= this._all_slots.length / colspan_lease) {\r
                     /* Limit the display to the current day */\r
                     id_end = this._all_slots.length / colspan_lease\r
                 }\r
+                lease_status = manifold.query_store.get_record_state(this.options.query_lease_uuid, lease_key, STATE_SET);\r
+                // the same slots might be affected multiple times.\r
+                // PENDING_IN + PENDING_OUT => IN \r
+                //\r
+                // RESERVED vs SELECTED !\r
+                //\r
+                // PENDING !!\r
+                switch(lease_status) {\r
+                    case STATE_SET_IN:\r
+                        lease_class = 'selected'; // my leases\r
+                        lease_success = '';\r
+                        break;\r
+                    case STATE_SET_IN_SUCCESS:\r
+                        lease_class = 'selected'; // my leases\r
+                        lease_success = 'success';\r
+                    case STATE_SET_OUT_FAILURE:\r
+                        lease_class = 'selected'; // my leases\r
+                        lease_success = 'failure';\r
+                        break;\r
+                    case STATE_SET_OUT:\r
+                        lease_class = 'reserved'; // other leases\r
+                        lease_success = '';\r
+                        break;\r
+                    case STATE_SET_OUT_SUCCESS:\r
+                        lease_class = 'free'; // other leases\r
+                        lease_success = 'success';\r
+                        break;\r
+                    case STATE_SET_IN_FAILURE:\r
+                        lease_class = 'free'; // other leases\r
+                        lease_success = 'failure';\r
+                        break;\r
+                    case STATE_SET_IN_PENDING:\r
+                        lease_class = 'pendingin';\r
+                        lease_success = '';\r
+                        break;\r
+                    case STATE_SET_OUT_PENDING:\r
+                        // pending_in & pending_out == IN == replacement\r
+                        if (resource.leases[i].status == 'pendingin')\r
+                            lease_class = 'pendingin'\r
+                        else\r
+                            lease_class = 'pendingout';\r
+                        lease_success = '';\r
+                        break;\r
+                \r
+                }\r
 \r
                 for (i = id_start; i < id_end; i++) {\r
-                    // the same slots might be affected multiple times.\r
-                    // PENDING_IN + PENDING_OUT => IN \r
-                    //\r
-                    // RESERVED vs SELECTED !\r
-                    //\r
-                    // PENDING !!\r
-                    lease_status = manifold.query_store.get_record_state(this.options.query_lease_uuid, lease_key, STATE_SET);\r
-                    switch(lease_status) {\r
-                        case STATE_SET_IN:\r
-                            lease_class = 'selected'; // my leases\r
-                            lease_success = '';\r
-                            break;\r
-                        case STATE_SET_IN_SUCCESS:\r
-                            lease_class = 'selected'; // my leases\r
-                            lease_success = 'success';\r
-                        case STATE_SET_OUT_FAILURE:\r
-                            lease_class = 'selected'; // my leases\r
-                            lease_success = 'failure';\r
-                            break;\r
-                        case STATE_SET_OUT:\r
-                            lease_class = 'reserved'; // other leases\r
-                            lease_success = '';\r
-                            break;\r
-                        case STATE_SET_OUT_SUCCESS:\r
-                            lease_class = 'free'; // other leases\r
-                            lease_success = 'success';\r
-                            break;\r
-                        case STATE_SET_IN_FAILURE:\r
-                            lease_class = 'free'; // other leases\r
-                            lease_success = 'failure';\r
-                            break;\r
-                        case STATE_SET_IN_PENDING:\r
-                            lease_class = 'pendingin';\r
-                            lease_success = '';\r
-                            break;\r
-                        case STATE_SET_OUT_PENDING:\r
-                            // pending_in & pending_out == IN == replacement\r
-                            if (resource.leases[i].status == 'pendingin')\r
-                                lease_class = 'pendingin'\r
-                            else\r
-                                lease_class = 'pendingout';\r
-                            lease_success = '';\r
-                            break;\r
-                    \r
-                    }\r
                     resource.leases[i].status = lease_class;\r
                     resource.leases[i].success = lease_success;\r
                 }\r
@@ -796,6 +815,7 @@ var SCHEDULER_COLWIDTH = 50;
                 var num_hidden_cells;\r
 \r
                 $("#DateToRes").datepicker({\r
+                       dateFormat: "D, d M yy",\r
                     onRender: function(date) {\r
                         return date.valueOf() < now.valueOf() ? 'disabled' : '';\r
                     }\r
@@ -816,14 +836,14 @@ var SCHEDULER_COLWIDTH = 50;
                 init_cell = (new Date().getHours() - 1) * 3600 / self._granularity;\r
                 if (init_cell > num_hidden_cells)\r
                     init_cell = num_hidden_cells;\r
-                \r
+\r
                 $('#tblSlider').slider({\r
                     min: 0,\r
-                    max: num_hidden_cells, // / self._lcm_colspan,\r
+                    max: num_hidden_cells,\r
                     value: init_cell,\r
                 }).on('slide', function(ev) {\r
                     var scope = self._get_scope();\r
-                    scope.from = ev.value * self._lcm_colspan;\r
+                    scope.from = ev.value;\r
                     scope.$apply();\r
                 });\r
                 scope.from = init_cell;\r
@@ -843,6 +863,12 @@ var SCHEDULER_COLWIDTH = 50;
             return (y==0) ? x : this._gcd(y, x % y);\r
         },\r
 \r
+        _gcdn : function(array)\r
+        {\r
+            var self = this;\r
+            return array.reduce(function(prev, cur, idx, arr) { return self._gcd(prev, cur); });\r
+        },\r
+\r
         /**\r
          * Least common multiple\r
          */\r
@@ -850,6 +876,12 @@ var SCHEDULER_COLWIDTH = 50;
         {\r
             return x * y / this._gcd(x, y);\r
         },\r
+\r
+        _lcmn : function(array)\r
+        {\r
+            var self = this;\r
+            return array.reduce(function(prev, cur, idx, arr) { return self._lcm(prev, cur); });\r
+        },\r
     \r
         _pad_str : function(i)\r
         {\r
@@ -876,7 +908,7 @@ var SCHEDULER_COLWIDTH = 50;
                 /// ...and add the slot to the list of results\r
                 slots.push({ id: i, time: tmpTime });\r
                 // Increment the date with the granularity\r
-                d = new Date(d.getTime() + this._granularity * 1000);\r
+                d = new Date(d.getTime() + this._slot_length * 1000);\r
                 i++;\r
             }\r
             return slots;\r