Revised version of the resource page + related plugins
[myslice.git] / plugins / scheduler2 / static / js / scheduler-SchedulerCtrl.js
index 5105144..2732044 100755 (executable)
@@ -14,6 +14,13 @@ myApp.factory('$exceptionHandler', function () {
     };\r
 });\r
 \r
+myApp.filter('offset', function() {\r
+  return function(input, start) {\r
+    start = parseInt(start, 10);\r
+    return input.slice(start);\r
+  };\r
+});\r
+\r
 // Create a private execution space for our controller. When\r
 // executing this function expression, we're going to pass in\r
 // the Angular reference and our application module.\r
@@ -30,13 +37,15 @@ myApp.factory('$exceptionHandler', function () {
         // Set up the default scope value.\r
         this.scope.errorMessage = null;\r
         this.scope.name = "";\r
+\r
         //Pagin\r
-        $scope.totalPages = 4;\r
-        $scope.curPage = 0;\r
-        this.scope.pageSize = 25;\r
+        $scope.current_page = 1;\r
+        this.scope.items_per_page = 10;\r
+        $scope.from = 0; // JORDAN\r
 \r
         $scope.resources = new Array();\r
         $scope.slots = SchedulerSlotsViewData;\r
+        $scope.granularity = DEFAULT_GRANULARITY; /* Will be setup */\r
         //$scope.msg = "hello";\r
 \r
         angular.element(document).ready(function() {\r
@@ -45,41 +54,291 @@ myApp.factory('$exceptionHandler', function () {
             //afterAngularRendered();\r
         });\r
 \r
+        // Jordan\r
+/*\r
+        $scope.redraw = function()\r
+        {\r
+\r
+            // Refresh slots\r
+            $scope.slots = [];\r
+            for (var i = $scope.from; i < $scope.from + SchedulerTotalVisibleCells; i++)\r
+                $scope.slots.push(SchedulerSlots[i]);\r
+\r
+\r
+            // Collect lease information. This could be made once if no refresh... \r
+            lease_by_resource = {};\r
+            manifold.query_store.iter_visible_records($scope.options.query_lease_uuid, function (record_key, record) {\r
+                lease_by_resource[record['resource']] = record;\r
+                // Need something to interrupt the loop\r
+            });\r
+\r
+            // Create resources\r
+            $scope.resources = [];\r
+            // current_page, items_per_page indicates which resources to show\r
+            manifold.query_store.iter_visible_records($scope.options.query_uuid, function (record_key, record) {\r
+                // copy not to modify original record\r
+                var resource = jQuery.extend(true, {}, record);\r
+                resource.leases = []; // a list of occupied timeslots\r
+\r
+                // How many timeslots ? SchedulerTotalVisibleCells\r
+                // SchedulerDateSelected\r
+                // from : to ??\r
+                // slot duration ?\r
+                for (i=0; i < SchedulerTotalVisibleCells; i++) {\r
+                    resource.leases.push({\r
+                        'id': 'coucou',\r
+                        'status': 'free', // 'selected', 'reserved', 'maintenance'\r
+                    });\r
+                }\r
+\r
+                // For each lease we need to mark slots appropriately\r
+                if (lease_by_resource[resource['urn']]) {\r
+                    $.each(lease_by_resource[resource['urn']], function(i, lease) {\r
+                        // $scope.from * GRANULARITY minutes since start\r
+                        $scope.from * GRANULARITY\r
+                        from_date = new Date(date.getTime() + ($scope.from * GRANULARITY) * 60000);\r
+                        to_date   = new Date(date.getTime() + (($scope.from + SchedulerTotalVisibleCells) * GRANULARITY) * 60000);\r
+                        // start_time, end_time\r
+                    });\r
+                }\r
+                \r
+                $scope.resources.push(resource);\r
+                $scope.$apply();\r
+            });\r
+        }\r
+*/\r
         $scope.clearStuff = function() {\r
             $scope.resources = new Array();\r
             $scope.$apply();\r
         }\r
 \r
-        $scope.initSchedulerResources = function (pageSize) {\r
+        // Called at initialization, after filtering, and after changing the date.\r
+        // this is like setpage(1) ???\r
+/*\r
+        $scope.initSchedulerResources = function (items_per_page) {\r
             $scope.resources = new Array();\r
 \r
-            for (var k = 0; k < pageSize; k++) {\r
-                if ($scope.resources.length < SchedulerDataViewData.length)\r
-                    $scope.resources.push(jQuery.extend(true, {}, SchedulerDataViewData[k]));\r
+            for (var k = 0; k < items_per_page; k++) {\r
+                $scope.resources.push(jQuery.extend(true, {}, SchedulerDataViewData[k]));\r
                 $scope.resources[k].leases = [];\r
             }\r
-            $scope.pageSize = pageSize;\r
-            $scope.curPage = 0;\r
-            $scope.totalPages = parseInt(Math.ceil(SchedulerDataViewData.length / $scope.pageSize));\r
+            $scope.items_per_page = items_per_page;\r
+            $scope.current_page = 0;\r
+            $scope.totalPages = parseInt(Math.ceil(SchedulerDataViewData.length / $scope.items_per_page));\r
             $scope.initSlots(0, SchedulerTotalVisibleCells);\r
         };\r
+*/\r
+\r
+        // Pagination\r
+\r
+        $scope.range = function() {\r
+            var range_size = $scope.page_count() > DEFAULT_PAGE_RANGE ? DEFAULT_PAGE_RANGE : $scope.page_count();\r
+            var ret = [];\r
+            var start;\r
+\r
+            start = $scope.current_page;\r
+            if ( start > $scope.page_count()-range_size ) {\r
+              start = $scope.page_count()-range_size+1;\r
+            }\r
+\r
+            for (var i=start; i<start+range_size; i++) {\r
+              ret.push(i);\r
+            }\r
+            return ret;\r
+        };\r
+\r
+        $scope.prevPage = function() {\r
+          if ($scope.current_page > 1) {\r
+            $scope.current_page--;\r
+          }\r
+        };\r
 \r
+        $scope.prevPageDisabled = function() {\r
+          return $scope.current_page === 1 ? "disabled" : "";\r
+        };\r
+  \r
+        $scope.page_count = function() {\r
+          return Math.ceil($scope.resources.length/$scope.items_per_page);\r
+        };\r
+  \r
+        $scope.nextPage = function() {\r
+          if ($scope.current_page < $scope.page_count()) {\r
+            $scope.current_page++;\r
+          }\r
+        };\r
+  \r
+        $scope.nextPageDisabled = function() {\r
+          return $scope.current_page === $scope.page_count() ? "disabled" : "";\r
+        }; \r
+\r
+        $scope.setPage = function(n) {\r
+            $scope.current_page = n;\r
+        };\r
+        // END pagination\r
+\r
+        // FILTER\r
+\r
+        $scope.filter_visible = function(resource)\r
+        {\r
+            return manifold.query_store.get_record_state($scope.options.query_uuid, resource['urn'], STATE_VISIBLE);\r
+        };\r
+\r
+        // SELECTION\r
+\r
+        $scope.select = function(index, model_lease, model_resource)\r
+        {\r
+            // XXX\r
+            // XXX Events won't work until we properly handle sets with composite keys\r
+            // XXX\r
+            console.log("Selected", index, model_lease, model_resource);\r
+\r
+            if (model_lease.status != 'free') {\r
+                console.log("Already selected slot");\r
+                return;\r
+            }\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_date = new Date(start_time * 1000);\r
+            var end_date   = new Date(end_time   * 1000);\r
+\r
+            var lease_key = manifold.metadata.get_key('lease');\r
+\r
+            // We search for leases in the cache we previously constructed\r
+            var resource_leases = $scope._leases_by_resource[model_resource.urn];\r
+            if (resource_leases) {\r
+                /* Search for leases before */\r
+                $.each(resource_leases, function(i, other) {\r
+                    if (other.end_time != start_time)\r
+                        return true; // ~ continue\r
+\r
+                    /* The lease 'other' is just before, and there should not exist\r
+                     * any other lease before it */\r
+                    start_time = other.start_time;\r
+\r
+                    other_key = {\r
+                        resource:   other.resource,\r
+                        start_time: other.start_time,\r
+                        end_time:   other.end_time\r
+                    }\r
+                    // This is needed to create a hashable object\r
+                    other_key.hashCode = manifold.record_hashcode(lease_key.sort());\r
+                    other_key.equals   = manifold.record_equals(lease_key);\r
+\r
+                    manifold.raise_event($scope.options.query_lease_uuid, SET_REMOVED, other_key);\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
+                    return false; // ~ break\r
+                });\r
+\r
+                /* Search for leases after */\r
+                $.each(resource_leases, function(i, other) {\r
+                    if (other.start_time != end_time)\r
+                        return true; // ~ continue\r
+\r
+                    /* 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
+                        end_time:   other.end_time\r
+                    }\r
+                    // This is needed to create a hashable object\r
+                    other_key.hashCode = manifold.record_hashcode(lease_key.sort());\r
+                    other_key.equals   = manifold.record_equals(lease_key);\r
+\r
+                    manifold.raise_event($scope.options.query_lease_uuid, SET_REMOVED, other_key);\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
+                    return false; // ~ break\r
+                });\r
+            }\r
+\r
+            /* Create a new lease */\r
+            new_lease = {\r
+                resource:   model_resource.urn,\r
+                start_time: start_time,\r
+                end_time:   end_time,\r
+            };\r
+\r
+            // This is needed to create a hashable object\r
+            new_lease.hashCode = manifold.record_hashcode(lease_key.sort());\r
+            new_lease.equals   = manifold.record_equals(lease_key);\r
+\r
+            manifold.raise_event($scope.options.query_lease_uuid, SET_ADD, new_lease);\r
+            /* Add to local cache also, unless we listen to events from outside */\r
+            if (!(model_resource.urn in $scope._leases_by_resource))\r
+                $scope._leases_by_resource[model_resource.urn] = [];\r
+            $scope._leases_by_resource[model_resource.urn].push(new_lease);\r
+\r
+            // XXX Shall we set it or wait for manifold event ?\r
+            model_lease.status = 'reserved'; // XXX pending\r
+\r
+            // DEBUG: display all leases and their status in the log\r
+            var leases = manifold.query_store.get_records($scope.options.query_lease_uuid);\r
+            console.log("--------------------");\r
+            $.each(leases, function(i, lease) {\r
+                var key = manifold.metadata.get_key('lease');\r
+                var lease_key = manifold.record_get_value(lease, key);\r
+                var state = manifold.query_store.get_record_state($scope.options.query_lease_uuid, lease_key, STATE_SET);\r
+                var state_str;\r
+                switch(state) {\r
+                    case STATE_SET_IN:\r
+                        state_str = 'STATE_SET_IN';\r
+                        break;\r
+                    case STATE_SET_OUT:\r
+                        state_str = 'STATE_SET_OUT';\r
+                        break;\r
+                    case STATE_SET_IN_PENDING:\r
+                        state_str = 'STATE_SET_IN_PENDING';\r
+                        break;\r
+                    case STATE_SET_OUT_PENDING:\r
+                        state_str = 'STATE_SET_OUT_PENDING';\r
+                        break;\r
+                    case STATE_SET_IN_SUCCESS:\r
+                        state_str = 'STATE_SET_IN_SUCCESS';\r
+                        break;\r
+                    case STATE_SET_OUT_SUCCESS:\r
+                        state_str = 'STATE_SET_OUT_SUCCESS';\r
+                        break;\r
+                    case STATE_SET_IN_FAILURE:\r
+                        state_str = 'STATE_SET_IN_FAILURE';\r
+                        break;\r
+                    case STATE_SET_OUT_FAILURE:\r
+                        state_str = 'STATE_SET_OUT_FAILURE';\r
+                        break;\r
+                }\r
+                console.log("LEASE", new Date(lease.start_time * 1000), new Date(lease.end_time * 1000), lease.resource, state_str);\r
+            });\r
+        };\r
+  \r
+\r
+/*\r
         $scope.setPage = function(page) {\r
-            var tmpFrm = $scope.pageSize * page;\r
-            var tmpTo = tmpFrm + $scope.pageSize;\r
-            $scope.curPage = page;\r
+            var tmpFrm = $scope.items_per_page * page;\r
+            var tmpTo = tmpFrm + $scope.items_per_page;\r
+            tmpTo = SchedulerDataViewData.length < tmpTo ? SchedulerDataViewData.length : tmpTo;\r
+            $scope.current_page = page;\r
             $scope.resources = [];\r
             var j = 0;\r
             for (var k = tmpFrm; k < tmpTo; k++) {\r
-                if ($scope.resources.length < SchedulerDataViewData.length)\r
-                    $scope.resources.push(jQuery.extend(true, {}, SchedulerDataViewData[k]));\r
+                $scope.resources.push(jQuery.extend(true, {}, SchedulerDataViewData[k]));\r
                 $scope.resources[j].leases = [];\r
                 j++;\r
             }\r
+            //fix slider\r
+            $('#tblSlider').slider('value', 0);\r
+            //init Slots\r
             $scope.initSlots(0, SchedulerTotalVisibleCells);\r
-        };\r
+        };*/\r
 \r
+        // Typically we will only init visible slots\r
         $scope.initSlots = function (from, to) {\r
+            return; // JORDAN !!!\r
+\r
             //init\r
             $scope.slots = [];\r
 \r
@@ -87,7 +346,7 @@ myApp.factory('$exceptionHandler', function () {
             //set\r
             for (var i = from; i < to; i++) {\r
                 $scope.slots.push(SchedulerSlots[i]);\r
-                resourceIndex = $scope.pageSize * $scope.curPage;\r
+                resourceIndex = $scope.items_per_page * $scope.current_page;\r
                 for (var j = 0; j < $scope.resources.length; j++) {\r
                     if (i == from) {\r
                         $scope.resources[j].leases = [];\r
@@ -100,41 +359,9 @@ myApp.factory('$exceptionHandler', function () {
             $scope.$apply();\r
         };\r
 \r
-        $scope.moveFrontSlot = function(from, to) {\r
-            //$scope.slots.shift();\r
-            //$scope.slots.push(SchedulerSlots[to]);\r
-            //for (var j = 0; j < $scope.resources.length; j++) {\r
-            //    $scope.resources[j].leases.shift();\r
-            //    $scope.resources[j].leases.push(SchedulerData[j].leases[to]);\r
-            //}\r
-            //try {\r
-            //    $scope.$digest();\r
-            //    //$scope.$apply();\r
-            //} catch (err) {\r
-            //    $scope.initSlots(from, to);\r
-            //}\r
-            $scope.initSlots(from, to);\r
-        };\r
-\r
-        $scope.moveBackSlot = function(from, to) {\r
-            //$scope.$apply(function() {\r
-                //try {\r
-                //    $scope.slots.pop();\r
-                //    $scope.slots.unshift(SchedulerSlots[from]);\r
-                //    for (var j = 0; j < $scope.resources.length; j++) {\r
-                //        $scope.resources[j].leases.pop();\r
-                //        $scope.resources[j].leases.unshift(SchedulerData[j].leases[from]);\r
-                //    }\r
-                //} catch (err) {\r
-                //    alert("error");\r
-                //}\r
-\r
-            $scope.initSlots(from, to);\r
-            //});\r
-        };\r
-\r
+/*\r
         $scope.getPageNumbers = function () {\r
-            var totalNumbersShowned = ($scope.totalPages > 10 ? 10 : $scope.totalPages );\r
+            var totalNumbersShowned = ($scope.totalPages > 10 ? 10 : $scope.totalPages + 1 );\r
             var tmtNumDiv = totalNumbersShowned / 2;\r
             //local\r
             var numFrom = 1;\r
@@ -144,13 +371,13 @@ myApp.factory('$exceptionHandler', function () {
             if (totalNumbersShowned > 1) {\r
                 //set from - to\r
                 if ($scope.totalPages > totalNumbersShowned) {\r
-                    if ($scope.curPage <= tmtNumDiv) {\r
+                    if ($scope.current_page <= tmtNumDiv) {\r
                         //nothing\r
-                    } else if ($scope.curPage >= $scope.totalPages - tmtNumDiv) {\r
+                    } else if ($scope.current_page >= $scope.totalPages - tmtNumDiv) {\r
                         numTo = $scope.totalPages;\r
                         numFrom = numTo - totalNumbersShowned;\r
                     } else {\r
-                        numFrom = $scope.curPage - tmtNumDiv;\r
+                        numFrom = $scope.current_page - tmtNumDiv;\r
                         numTo = numFrom + totalNumbersShowned;\r
                     }\r
                 }\r
@@ -162,7 +389,7 @@ myApp.factory('$exceptionHandler', function () {
             }\r
             return rtrnArr;\r
         };\r
-\r
+*/\r
         // Return this object reference.\r
         return (this);\r
 \r
@@ -173,4 +400,4 @@ myApp.factory('$exceptionHandler', function () {
     app.controller("SchedulerCtrl", Controller);\r
 \r
 \r
-})(angular, myApp);
\ No newline at end of file
+})(angular, myApp);\r