added lease_id for nitos leases + do not reset slider on date change
[unfold.git] / plugins / scheduler2 / static / js / scheduler2.js
index 5f35a0f..e58a062 100755 (executable)
@@ -176,7 +176,7 @@ var SCHEDULER_COLWIDTH = 50;
 \r
         $scope._create_new_lease = function(resource_urn, start_time, end_time)\r
         {\r
-            var lease_key, new_lease;\r
+            var lease_key, new_lease, data;\r
 \r
             lease_key = manifold.metadata.get_key('lease');\r
 \r
@@ -190,7 +190,13 @@ var SCHEDULER_COLWIDTH = 50;
             new_lease.hashCode = manifold.record_hashcode(lease_key.sort());\r
             new_lease.equals   = manifold.record_equals(lease_key);\r
 \r
-            manifold.raise_event($scope.instance.options.query_lease_uuid, SET_ADD, new_lease);\r
+            data = {\r
+                state: STATE_SET,\r
+                key  : null,\r
+                op   : STATE_SET_ADD,\r
+                value: new_lease\r
+            }\r
+            manifold.raise_event($scope.instance.options.query_lease_uuid, FIELD_STATE_CHANGED, data);\r
             /* Add to local cache also, unless we listen to events from outside */\r
             if (!(resource_urn in $scope._leases_by_resource))\r
                 $scope._leases_by_resource[resource_urn] = [];\r
@@ -199,7 +205,7 @@ var SCHEDULER_COLWIDTH = 50;
 \r
         $scope._remove_lease = function(other)\r
         {\r
-            var lease_key, other_key;\r
+            var lease_key, other_key, data;\r
 \r
             lease_key = manifold.metadata.get_key('lease');\r
 \r
@@ -212,14 +218,22 @@ var SCHEDULER_COLWIDTH = 50;
             other_key.hashCode = manifold.record_hashcode(lease_key.sort());\r
             other_key.equals   = manifold.record_equals(lease_key);\r
 \r
-            manifold.raise_event($scope.instance.options.query_lease_uuid, SET_REMOVED, other_key);\r
+            data = {\r
+                state: STATE_SET,\r
+                key  : null,\r
+                op   : STATE_SET_REMOVE,\r
+                value: other_key\r
+            }\r
+            manifold.raise_event($scope.instance.options.query_lease_uuid, FIELD_STATE_CHANGED, data);\r
             /* Remove from local cache also, unless we listen to events from outside */\r
-            $.grep($scope._leases_by_resource[other.resource], function(x) { return x != other; });\r
+            $scope._leases_by_resource[other.resource] = $.grep($scope._leases_by_resource[other.resource], function(x) { return x != other; });\r
 \r
         }\r
 \r
         $scope.select = function(index, model_lease, model_resource)\r
         {\r
+            var data;\r
+\r
             console.log("Selected", index, model_lease, model_resource);\r
 \r
             var day_timestamp = SchedulerDateSelected.getTime() / 1000;\r
@@ -256,9 +270,15 @@ var SCHEDULER_COLWIDTH = 50;
                             other_key.hashCode = manifold.record_hashcode(lease_key.sort());\r
                             other_key.equals   = manifold.record_equals(lease_key);\r
         \r
-                            manifold.raise_event($scope.instance.options.query_lease_uuid, SET_REMOVED, other_key);\r
+                            data = {\r
+                                state: STATE_SET,\r
+                                key  : null,\r
+                                op   : STATE_SET_REMOVE,\r
+                                value: other_key\r
+                            }\r
+                            manifold.raise_event($scope.instance.options.query_lease_uuid, FIELD_STATE_CHANGED, data);\r
                             /* Remove from local cache also, unless we listen to events from outside */\r
-                            $.grep($scope._leases_by_resource[model_resource.urn], function(x) { return x != other; });\r
+                            $scope._leases_by_resource[model_resource.urn] = $.grep($scope._leases_by_resource[model_resource.urn], function(x) { return x != other; });\r
                             return false; // ~ break\r
                         });\r
         \r
@@ -270,7 +290,6 @@ var SCHEDULER_COLWIDTH = 50;
                             /* The lease 'other' is just after, and there should not exist\r
                              * any other lease after it */\r
                             end_time = other.end_time;\r
-                            // XXX SET_ADD and SET_REMOVE should accept full objects\r
                             other_key = {\r
                                 resource:   other.resource,\r
                                 start_time: other.start_time,\r
@@ -280,15 +299,21 @@ var SCHEDULER_COLWIDTH = 50;
                             other_key.hashCode = manifold.record_hashcode(lease_key.sort());\r
                             other_key.equals   = manifold.record_equals(lease_key);\r
         \r
-                            manifold.raise_event($scope.instance.options.query_lease_uuid, SET_REMOVED, other_key);\r
+                            data = {\r
+                                state: STATE_SET,\r
+                                key  : null,\r
+                                op   : STATE_SET_REMOVE,\r
+                                value: other_key\r
+                            }\r
+                            manifold.raise_event($scope.instance.options.query_lease_uuid, FIELD_STATE_CHANGED, data);\r
                             /* Remove from local cache also, unless we listen to events from outside */\r
-                            $.grep($scope._leases_by_resource[model_resource.urn], function(x) { return x != other; });\r
+                            $scope._leases_by_resource[model_resource.urn] = $.grep($scope._leases_by_resource[model_resource.urn], function(x) { return x != other; });\r
                             return false; // ~ break\r
                         });\r
                     }\r
         \r
                     $scope._create_new_lease(model_resource.urn, start_time, end_time);\r
-                    model_lease.status = 'pendingin'; \r
+                    model_lease.status = (model_lease.status == 'free') ? 'pendingin' : 'selected';\r
                     // unless the exact same lease already existed (pending_out status for the lease, not the cell !!)\r
 \r
                     break;\r
@@ -326,7 +351,7 @@ var SCHEDULER_COLWIDTH = 50;
                     }\r
                 \r
                     // cf comment in previous switch case\r
-                    model_lease.status = 'pendingout'; \r
+                    model_lease.status = (model_lease.status == 'selected') ? 'pendingout' : 'free';\r
 \r
                     break;\r
 \r
@@ -337,7 +362,7 @@ var SCHEDULER_COLWIDTH = 50;
             }\r
             \r
 \r
-            //$scope._dump_leases();\r
+            $scope._dump_leases();\r
         };\r
   \r
         $scope._dump_leases = function()\r
@@ -470,6 +495,7 @@ var SCHEDULER_COLWIDTH = 50;
             do_resize: function()\r
             {\r
                 var scope = this._get_scope();\r
+                var num_hidden_cells, new_max;\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
@@ -486,12 +512,15 @@ var SCHEDULER_COLWIDTH = 50;
                 scope.lcm_colspan = this._lcm_colspan;\r
 \r
                 // Slider max value\r
-\r
                 if ($('#tblSlider').data('slider') != undefined) {\r
-                    var new_max = (this._all_slots.length - this._num_visible_cells) / this._lcm_colspan;\r
-                    $('#tblSlider').slider('setAttribute', 'max', new_max);\r
+                    num_hidden_cells = this._all_slots.length - this._num_visible_cells;\r
+\r
+                    $('#tblSlider').slider('setAttribute', 'max', num_hidden_cells);\r
+                    $('#tblSlider').slider('setValue', scope.from, true);\r
+                    this._get_scope().$apply();\r
                 }\r
 \r
+\r
             },\r
 \r
             on_show: function(e)\r
@@ -542,18 +571,23 @@ var SCHEDULER_COLWIDTH = 50;
 \r
             _scope_clear_leases: function()\r
             {\r
+                var time, now;\r
                 var self = this;\r
                 var scope = this._get_scope();\r
 \r
+                now = new Date().getTime();\r
+\r
                 // 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
+                    time = SchedulerDateSelected.getTime();\r
                     for (i=0; i < self._all_slots.length / colspan_lease; i++) { // divide by granularity\r
                         resource.leases.push({\r
                             id:     'coucou',\r
-                            status: 'free', // 'selected', 'reserved', 'maintenance' XXX pending ??\r
+                            status: (time < now) ? 'disabled':  'free', // 'selected', 'reserved', 'maintenance' XXX pending ??\r
                         });\r
+                        time += resource.granularity * 1000;\r
                     }\r
                 });\r
 \r
@@ -564,11 +598,9 @@ var SCHEDULER_COLWIDTH = 50;
                 var self = this;\r
                 var scope = this._get_scope();\r
             \r
-                var leases = manifold.query_store.get_records(this.options.query_lease_uuid);\r
-                $.each(leases, function(i, lease) {\r
+                manifold.query_store.iter_records(this.options.query_lease_uuid, function(lease_key, lease) {\r
 \r
-                    console.log("SET LEASES", new Date(lease.start_time* 1000));\r
-                    console.log("          ", new Date(lease.end_time* 1000));\r
+                    console.log("SET LEASES", lease.resource, new Date(lease.start_time* 1000), new Date(lease.end_time* 1000));\r
                     // XXX We should ensure leases are correctly merged, otherwise our algorithm won't work\r
 \r
                     // Populate leases by resource array: this will help us merging leases later\r
@@ -576,30 +608,17 @@ var SCHEDULER_COLWIDTH = 50;
                         scope._leases_by_resource[lease.resource] = [];\r
                     scope._leases_by_resource[lease.resource].push(lease);\r
 \r
-                    var resource = self.scope_resources_by_key[lease.resource];\r
-                    var day_timestamp = SchedulerDateSelected.getTime() / 1000;\r
+                });\r
 \r
-                    var id_start = (lease.start_time - day_timestamp) / resource.granularity;\r
-                    if (id_start < 0) {\r
-                        /* Some leases might be in the past */\r
-                        id_start = 0;\r
-                    }\r
-    \r
-                    var id_end   = (lease.end_time   - day_timestamp) / resource.granularity - 1;\r
-                    var colspan_lease = resource.granularity / self._granularity; //eg. 3600 / 1800 => 2 cells\r
-                    if (id_end >= self._all_slots.length / colspan_lease) {\r
-                        /* Limit the display to the current day */\r
-                        id_end = self._all_slots.length / colspan_lease\r
-                    }\r
+                this._set_all_lease_slots();\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
-                        resource.leases[i].status = 'selected'; \r
+            _set_all_lease_slots: function()\r
+            {\r
+                var self = this;\r
+            \r
+                manifold.query_store.iter_records(this.options.query_lease_uuid, function(lease_key, lease) {\r
+                    self._set_lease_slots(lease_key, lease);\r
                 });\r
             },\r
 \r
@@ -633,8 +652,121 @@ var SCHEDULER_COLWIDTH = 50;
             on_leases_filter_removed:    function(filter) { this._get_scope().$apply(); },\r
             on_leases_filter_clear:      function()       { this._get_scope().$apply(); },\r
 \r
+            on_field_state_changed: function(data)\r
+            {\r
+                /*\r
+                this._set_lease_slots(lease_key, lease);\r
+\r
+                switch(data.state) {\r
+                    case STATE_SET:\r
+                        switch(data.op) {\r
+                            case STATE_SET_IN:\r
+                            case STATE_SET_IN_SUCCESS:\r
+                            case STATE_SET_OUT_FAILURE:\r
+                                this.set_checkbox_from_data(data.value, true);\r
+                                this.set_bgcolor(data.value, QUERYTABLE_BGCOLOR_RESET);\r
+                                break;  \r
+                            case STATE_SET_OUT:\r
+                            case STATE_SET_OUT_SUCCESS:\r
+                            case STATE_SET_IN_FAILURE:\r
+                                this.set_checkbox_from_data(data.value, false);\r
+                                this.set_bgcolor(data.value, QUERYTABLE_BGCOLOR_RESET);\r
+                                break;\r
+                            case STATE_SET_IN_PENDING:\r
+                                this.set_checkbox_from_data(data.key, true);\r
+                                this.set_bgcolor(data.value, QUERYTABLE_BGCOLOR_ADDED);\r
+                                break;  \r
+                            case STATE_SET_OUT_PENDING:\r
+                                this.set_checkbox_from_data(data.key, false);\r
+                                this.set_bgcolor(data.value, QUERYTABLE_BGCOLOR_REMOVED);\r
+                                break;\r
+                        }\r
+                        break;\r
+\r
+                    case STATE_WARNINGS:\r
+                        this.change_status(data.key, data.value);\r
+                        break;\r
+                }\r
+                */\r
+            },\r
+\r
+\r
             /* INTERNAL FUNCTIONS */\r
 \r
+            _set_lease_slots: function(lease_key, lease)\r
+            {\r
+                var resource, lease_status, lease_class;\r
+                var day_timestamp, id_start, id_end, colspan_lease;\r
+\r
+                resource = this.scope_resources_by_key[lease.resource];\r
+                day_timestamp = SchedulerDateSelected.getTime() / 1000;\r
+                id_start = Math.floor((lease.start_time - day_timestamp) / resource.granularity);\r
+\r
+                /* Some leases might be in the past */\r
+                if (id_start < 0)\r
+                    id_start = 0;\r
+                /* Leases in the future: ignore */\r
+                if (id_start >= this._all_slots.length)\r
+                    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
+                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
+\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 = 'reserved'; // other leases\r
+                            lease_success = 'success';\r
+                            break;\r
+                        case STATE_SET_IN_FAILURE:\r
+                            lease_class = 'reserved'; // 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
+            },\r
+\r
 /* XXX IN TEMPLATE XXX\r
                 if (SchedulerDataViewData.length == 0) {\r
                     $("#plugin-scheduler").hide();\r
@@ -654,6 +786,9 @@ var SCHEDULER_COLWIDTH = 50;
             _initUI: function() \r
             {\r
                 var self = this;\r
+                var scope = self._get_scope();\r
+\r
+                var num_hidden_cells;\r
 \r
                 $("#DateToRes").datepicker({\r
                     onRender: function(date) {\r
@@ -663,77 +798,36 @@ var SCHEDULER_COLWIDTH = 50;
                     SchedulerDateSelected = new Date(ev.date);\r
                     SchedulerDateSelected.setHours(0,0,0,0);\r
                     // Set slider to origin\r
-                    $('#tblSlider').slider('setValue', 0); // XXX\r
+                    //$('#tblSlider').slider('setValue', 0); // XXX\r
                     // Refresh leases\r
                     self._scope_clear_leases();\r
-                    self._scope_set_leases();\r
+                    self._set_all_lease_slots();\r
                     // Refresh display\r
                     self._get_scope().$apply();\r
                 }).datepicker('setValue', SchedulerDateSelected); //.data('datepicker');\r
 \r
                 //init Slider\r
+                num_hidden_cells = self._all_slots.length - self._num_visible_cells;\r
+                init_cell = (new Date().getHours() - 1) * 3600 / self._granularity;\r
+                if (init_cell > num_hidden_cells)\r
+                    init_cell = num_hidden_cells;\r
+                \r
                 $('#tblSlider').slider({\r
                     min: 0,\r
-                    max: (self._all_slots.length - self._num_visible_cells) / self._lcm_colspan,\r
-                    value: 0,\r
+                    max: num_hidden_cells, // / self._lcm_colspan,\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.$apply();\r
                 });\r
+                scope.from = init_cell;\r
+                scope.$apply();\r
 \r
                 $("#plugin-scheduler-loader").hide();\r
                 $("#plugin-scheduler").show();\r
             },\r
 \r
-        // GUI EVENTS\r
-\r
-        // TO BE REMOVED\r
-        _on_submit : function()\r
-        {\r
-            var leasesForCommit = new Array();\r
-            var tmpDateTime = SchedulerDateSelected;\r
-            for (var i = 0; i < SchedulerData.length; i++)\r
-            {\r
-                var tpmR = SchedulerData[i];\r
-                //for capturing start and end of the lease\r
-                var newLeaseStarted = false;\r
-                for (var j = 0; j < tpmR.leases.length; j++) {\r
-                    var tpmL = tpmR.leases[j];\r
-                    if (newLeaseStarted == false && tpmL.status == 'selected') {\r
-                        //get date of the slot\r
-                        tmpDateTime = schedulerGetDateTimeFromSlotId(tpmL.id, tmpDateTime);\r
-                        var unixStartTime = tmpDateTime.getTime() / 1000;\r
-                        //add lease object\r
-                        leasesForCommit.push({\r
-                            resource: tpmR.id,\r
-                            //granularity: tpmR.granularity,\r
-                            //lease_type: null,\r
-                            //slice: null,\r
-                            start_time: unixStartTime,\r
-                            end_time: null,\r
-                            //duration: null\r
-                        });\r
-                        console.log(tpmR.id);\r
-                        newLeaseStarted = true;\r
-                    } else if (newLeaseStarted == true && tpmL.status != 'selected') {\r
-                        //get date of the slot\r
-                        tmpDateTime = schedulerGetDateTimeFromSlotId(tpmL.id, tmpDateTime);\r
-                        var unixEndTime = tmpDateTime.getTime() / 1000;\r
-                        //upate end_time\r
-                        var tmpCL = leasesForCommit[leasesForCommit.length - 1];\r
-                        tmpCL.end_time = unixEndTime;\r
-                        //tmpCL.duration = schedulerFindDuration(tmpCL.start_time, tmpCL.end_time, tmpCL.granularity);\r
-                        newLeaseStarted = false;\r
-                    }\r
-                }\r
-            }\r
-            console.log(leasesForCommit);\r
-            for (var i = 0; i < leasesForCommit.length; i++) {\r
-                manifold.raise_event(scheduler2Instance.options.query_lease_uuid, SET_ADD, leasesForCommit[i]);\r
-            }\r
-        },\r
-        \r
         // PRIVATE METHODS\r
 \r
         /**\r