Chrysostomos for scheduler
authorChrysostomos Kolovos <xrklvs@gmail.com>
Fri, 2 May 2014 21:48:08 +0000 (00:48 +0300)
committerChrysostomos Kolovos <xrklvs@gmail.com>
Fri, 2 May 2014 21:48:08 +0000 (00:48 +0300)
plugins/scheduler2/static/js/scheduler-helpers.js
plugins/scheduler2/static/js/scheduler-table-selector.js
plugins/scheduler2/static/js/scheduler2.js
plugins/scheduler2/templates/scheduler.html

index 5de21cb..d6f3224 100755 (executable)
@@ -61,6 +61,7 @@ function schedulerGetSlots(slotSpan) {
 }\r
 \r
 function schedulerGetLeases(slotSpan, granularity) {\r
+    granularity = granularity / 60;\r
     if (slotSpan == 0) slotSpan = 10;\r
     var slots = [];\r
     var d = new Date(2014, 1, 1, 0, 0, 0, 0);\r
@@ -84,6 +85,7 @@ function schedulerGetLeases(slotSpan, granularity) {
 //\r
 //GetSlotId from time\r
 function schedulerGetSlotId(startTime, duration, granularity) {\r
+    //granularity in seconds\r
     startTime = parseInt(startTime);\r
     var d = new Date(startTime * 1000);\r
     var timespan = 60 / schedulerSlotsPerHour;\r
@@ -92,15 +94,67 @@ function schedulerGetSlotId(startTime, duration, granularity) {
     slotid += d.getMinutes() / timespan;\r
     return slotid;\r
 }\r
+//\r
+//GetSlotId from time\r
+function schedulerGetDateTimeFromSlotId(slotId, tmpDateTime) {\r
+    \r
+    var timespan = 60 / schedulerSlotsPerHour;\r
+    var totalMinutes = slotId * timespan;\r
+    var totalHours = totalMinutes / 60;\r
+    if (totalHours >= 1) {\r
+        totalHours = Math.floor(totalHours);\r
+        totalMinutes = totalMinutes - totalHours * 60;\r
+    } else {\r
+        totalHours = 0;\r
+    }\r
+    tmpDateTime.setHours(totalHours, totalMinutes, 0, 0);\r
 \r
+    return tmpDateTime;\r
+}\r
+//\r
+//GetSlotId from time\r
+function schedulerFindDuration(startTime, endTime, granularity) {\r
+    var duration = 0;\r
+    var fd = new Date(startTime * 1000);\r
+    var td = new Date(endTime * 1000);\r
+    while (fd < td) {\r
+        duration++;\r
+        fd.setMinutes(fd.getMinutes() + granularity);\r
+    }\r
+    return duration;\r
+}\r
+\r
+//\r
+// Set Select - Free Slots *******Start\r
 function schedulerSelectSlot(slotId, rowIndex, resourceIndex) {\r
-    SchedulerDataViewData[rowIndex].leases[slotId].status = 'selected';\r
-    SchedulerData[resourceIndex].leases[slotId].status = 'selected';\r
+    _schedulerSetStatusSlot(slotId, rowIndex, resourceIndex, 'selected');\r
 }\r
 function schedulerFreeSlot(slotId, rowIndex, resourceIndex) {\r
-    SchedulerDataViewData[rowIndex].leases[slotId].status = 'free';\r
-    SchedulerData[resourceIndex].leases[slotId].status = 'free';\r
+    _schedulerSetStatusSlot(slotId, rowIndex, resourceIndex, 'free');\r
 }\r
+\r
+function _schedulerSetStatusSlot(slotId, rowIndex, resourceIndex, classText) {\r
+    var tmpVS = SchedulerDataViewData[rowIndex].leases[slotId];  // for the display\r
+    var tmpS = SchedulerData[resourceIndex].leases[slotId];     // for the data\r
+    tmpVS.status = classText;\r
+    tmpS.status = classText;\r
+    //select other from the group in the same granularity\r
+    var slotSpan = 60 / schedulerSlotsPerHour;\r
+    var maxg = (SchedulerData[resourceIndex].granularity / 60) / slotSpan;\r
+\r
+    var startSlotId = tmpVS.groupIndex == 0 ? 0 : slotId - tmpVS.groupIndex;\r
+    for (var s = 0; s < maxg; s++) {\r
+        if (tmpVS.groupIndex != s) {\r
+            SchedulerDataViewData[rowIndex].leases[startSlotId].status = classText;\r
+            SchedulerData[rowIndex].leases[startSlotId].status = classText;\r
+        }\r
+        startSlotId++;\r
+    }\r
+\r
+}\r
+//\r
+// Set Select - Free Slots *******End\r
+\r
 //\r
 //Find Resource By Id\r
 function schedulerFindResourceById(Resources, id) {\r
index 6f5f4a9..abd8a69 100755 (executable)
@@ -28,9 +28,10 @@ function rangeMouseDown(e) {
         //var allCells = $("#tblReservation td");\r
         //dragStart = allCells.index($(this));\r
 \r
-        if ( $(this).hasClass("free"))\r
+        if ( $(this).hasClass("free")){\r
             $(this).addClass("selected_tmp");\r
-\r
+            $(this).siblings("td[data-groupid='" + $(this).data('groupid') + "']").addClass("selected_tmp");\r
+        }\r
         schedulerTableIsDragging = true;\r
         //selectRange();\r
 \r
@@ -82,6 +83,7 @@ function selectRange(isTemp) {
     if (!schedulerCtrlPressed)\r
         $("#" + schedulerTblId + "  td.selected, #" + schedulerTblId + "  td.selected_tmp").each(function() {\r
             $(this).removeClass('selected selected_tmp').addClass('free');\r
+            $(this).siblings("td[data-groupid='" + $(this).data('groupid') + "']").removeClass('selected selected_tmp').addClass("free");\r
             schedulerFreeSlot($(this).data('slotid'), $(this).siblings('th').data('rowindex'), $(this).siblings('th').data('resourceindex'));\r
         });\r
 \r
@@ -116,38 +118,50 @@ function selectRange(isTemp) {
             switch (curClass) {\r
                 case "free_tmp":\r
                     $(cell).removeClass('selected_tmp selected free_tmp free');\r
-                    if (isTemp)\r
+                    $(cell).siblings("td[data-groupid='" + $(cell).data('groupid') + "']").removeClass("selected_tmp selected free_tmp free");\r
+                    if (isTemp){\r
                         $(cell).addClass("free_tmp");\r
-                    else{\r
+                        $(cell).siblings("td[data-groupid='" + $(cell).data('groupid') + "']").addClass("free");\r
+                    } else {\r
                         schedulerFreeSlot($(cell).data('slotid'), $(cell).siblings('th').data('rowindex'), $(cell).siblings('th').data('resourceindex'));\r
                         $(cell).addClass("free");\r
+                        $(cell).siblings("td[data-groupid='" + $(cell).data('groupid') + "']").addClass("free");\r
                     }\r
                     break;\r
                 case "free":\r
                     $(cell).removeClass('selected_tmp selected free_tmp free');\r
-                    if (isTemp)\r
+                    $(cell).siblings("td[data-groupid='" + $(cell).data('groupid') + "']").removeClass("selected_tmp selected free_tmp free");\r
+                    if (isTemp){\r
                         $(cell).addClass("selected_tmp");\r
-                    else {\r
+                        $(cell).siblings("td[data-groupid='" + $(cell).data('groupid') + "']").addClass("selected_tmp");\r
+                    }else {\r
                         schedulerSelectSlot($(cell).data('slotid'), $(cell).siblings('th').data('rowindex'), $(cell).siblings('th').data('resourceindex'));\r
                         $(cell).addClass("selected");\r
+                        $(cell).siblings("td[data-groupid='" + $(cell).data('groupid') + "']").addClass("selected");\r
                     }\r
                     break;\r
                 case "selected_tmp":\r
                     $(cell).removeClass('selected_tmp selected free_tmp free');\r
-                    if (isTemp)\r
+                    $(cell).siblings("td[data-groupid='" + $(cell).data('groupid') + "']").removeClass("selected_tmp selected free_tmp free");\r
+                    if (isTemp){\r
                         $(cell).addClass("selected_tmp");\r
-                    else {\r
+                        $(cell).siblings("td[data-groupid='" + $(cell).data('groupid') + "']").addClass("selected_tmp");\r
+                    } else {\r
                         schedulerSelectSlot($(cell).data('slotid'), $(cell).siblings('th').data('rowindex'), $(cell).siblings('th').data('resourceindex'));\r
                         $(cell).addClass("selected");\r
+                        $(cell).siblings("td[data-groupid='" + $(cell).data('groupid') + "']").addClass("selected");\r
                     }\r
                     break;\r
                 case "selected":\r
                     $(cell).removeClass('selected_tmp selected free_tmp free');\r
-                    if (isTemp)\r
+                    $(cell).siblings("td[data-groupid='" + $(cell).data('groupid') + "']").removeClass("selected_tmp selected free_tmp free");\r
+                    if (isTemp){\r
                         $(cell).addClass("free_tmp");\r
-                    else {\r
+                        $(cell).siblings("td[data-groupid='" + $(cell).data('groupid') + "']").addClass("free_tmp");\r
+                    } else {\r
                         schedulerFreeSlot($(cell).data('slotid'), $(cell).siblings('th').data('rowindex'), $(cell).siblings('th').data('resourceindex'));\r
                         $(cell).addClass("free");\r
+                        $(cell).siblings("td[data-groupid='" + $(cell).data('groupid') + "']").addClass("free");\r
                     }\r
                     break;\r
                 case "closed":\r
index 8f786de..3b59755 100755 (executable)
@@ -53,277 +53,324 @@ var schedulerDebug = true;
 //tmp to delete\r
 var tmpSchedulerLeases = [];\r
 \r
-(function ($) {\r
-    scheduler2 = Plugin.extend({\r
+(function($) {\r
+        scheduler2 = Plugin.extend({\r
 \r
-        /** XXX to check\r
+            /** XXX to check\r
          * @brief Plugin constructor\r
          * @param options : an associative array of setting values\r
          * @param element : \r
          * @return : a jQuery collection of objects on which the plugin is\r
          *     applied, which allows to maintain chainability of calls\r
          */\r
-        init: function (options, element) {\r
-            this.classname="scheduler2";\r
-            // Call the parent constructor, see FAQ when forgotten\r
-            this._super(options, element);\r
-            scheduler2Instance = this;\r
-            // We need to remember the active filter for datatables filtering
-            this.filters = Array();\r
-\r
-\r
-            SchedulerSlots = schedulerGetSlots(60/schedulerSlotsPerHour);\r
-            //selection from table \r
-            $(window).keydown(function (evt) {\r
-                if (evt.which == 17) { // ctrl\r
-                    schedulerCtrlPressed = true;\r
+            init: function(options, element) {\r
+                this.classname = "scheduler2";\r
+                // Call the parent constructor, see FAQ when forgotten\r
+                this._super(options, element);\r
+                scheduler2Instance = this;\r
+                // We need to remember the active filter for datatables filtering\r
+                this.filters = Array();\r
+\r
+\r
+                SchedulerSlots = schedulerGetSlots(60 / schedulerSlotsPerHour);\r
+                //selection from table \r
+                $(window).keydown(function(evt) {\r
+                    if (evt.which == 17) { // ctrl\r
+                        schedulerCtrlPressed = true;\r
+                    }\r
+                }).keyup(function(evt) {\r
+                    if (evt.which == 17) { // ctrl\r
+                        schedulerCtrlPressed = false;\r
+                    }\r
+                });\r
+                $("#" + schedulerTblId).on('mousedown', 'td', rangeMouseDown).on('mouseup', 'td', rangeMouseUp).on('mousemove', 'td', rangeMouseMove);\r
+\r
+                // Explain this will allow query events to be handled\r
+                // What happens when we don't define some events ?\r
+                // Some can be less efficient\r
+\r
+                if (schedulerDebug) console.time("Listening_to_queries");\r
+                /* Listening to queries */\r
+\r
+                this.listen_query(options.query_uuid);\r
+                this.listen_query(options.query_all_uuid, 'all');\r
+                this.listen_query(options.query_all_resources_uuid, 'all_resources');\r
+                this.listen_query(options.query_lease_uuid, 'lease');\r
+                //this.listen_query(options.query_lease_uuid, 'lease');\r
+                if (schedulerDebug) console.timeEnd("Listening_to_queries");\r
+\r
+            },\r
+\r
+            /* Handlers */\r
+\r
+            /* all_ev QUERY HANDLERS Start */\r
+            on_all_ev_clear_records: function(data) {\r
+                //alert('all_ev clear_records');\r
+            },\r
+            on_all_ev_query_in_progress: function(data) {\r
+                // alert('all_ev query_in_progress');\r
+            },\r
+            on_all_ev_new_record: function(data) {\r
+                //alert('all_ev new_record');\r
+            },\r
+            on_all_ev_query_done: function(data) {\r
+                //alert('all_ev query_done');\r
+            },\r
+            //another plugin has modified something, that requires you to update your display. \r
+            on_all_ev_field_state_changed: function(data) {\r
+                //alert('all_ev query_done');\r
+            },\r
+            /* all_ev QUERY HANDLERS End */\r
+            /* all_resources QUERY HANDLERS Start */\r
+            on_all_resources_clear_records: function(data) {\r
+                //data is empty on load\r
+            },\r
+            on_all_resources_query_in_progress: function(data) {\r
+                //data is empty on load\r
+            },\r
+            on_all_resources_new_record: function(data) {\r
+                //alert(data.toSource());\r
+                if (data.exclusive == true) {\r
+                    var tmpGran = schedulerDebug && data.granularity == null ? 1800 : data.granularity;\r
+                    SchedulerData.push({\r
+                        id: data.urn,\r
+                        index: SchedulerData.length,\r
+                        name: data.hrn,\r
+                        granularity: tmpGran,\r
+                        leases: schedulerGetLeases(60 / schedulerSlotsPerHour, tmpGran),\r
+                        type: data.type,\r
+                        org_resource: data\r
+                    });\r
+                    /*if (schedulerDebug && SchedulerData[SchedulerData.length - 1].org_resource.network_hrn == 'omf') {\r
+                        SchedulerData[SchedulerData.length - 1].granularity = 1800;\r
+                    }*/\r
                 }\r
-            }).keyup(function (evt) {\r
-                if (evt.which == 17) { // ctrl\r
-                    schedulerCtrlPressed = false;\r
+                //alert(data.toSource());\r
+\r
+            },\r
+            on_all_resources_query_done: function(data) {\r
+                _resourcesDone = true;\r
+                this._initScheduler();\r
+            },\r
+            //another plugin has modified something, that requires you to update your display. \r
+            on_all_resources_field_state_changed: function(data) {\r
+                //alert('all_resources query_done');\r
+            },\r
+            /* all_resources QUERY HANDLERS End */\r
+            /* lease QUERY HANDLERS Start */\r
+            on_lease_clear_records: function(data) { console.log('clear_records'); },\r
+            on_lease_query_in_progress: function(data) { console.log('lease_query_in_progress'); },\r
+            on_lease_new_record: function(data) {\r
+                if (data.resource.indexOf("nitos") > -1) {\r
+                    tmpSchedulerLeases.push({\r
+                        id: schedulerGetSlotId(data.start_time, data.duration, data.granularity),\r
+                        end_id: schedulerGetSlotId(data.end_time, data.duration, data.granularity),\r
+                        slice: data.slice,\r
+                        status: 'reserved',\r
+                        resource: data.resource,\r
+                        network: data.network,\r
+                        start_time: new Date(data.start_time * 1000),\r
+                        start_time_unixtimestamp: data.start_time,\r
+                        end_time: new Date(data.end_time * 1000),\r
+                        end_time_unixtimestamp: data.end_time,\r
+                        lease_type: data.lease_type,\r
+                        granularity: data.granularity,\r
+                        duration: data.duration\r
+                    });\r
                 }\r
-            });\r
-            $("#" + schedulerTblId).on('mousedown', 'td', rangeMouseDown).on('mouseup', 'td', rangeMouseUp).on('mousemove', 'td', rangeMouseMove);\r
-\r
-            // Explain this will allow query events to be handled\r
-            // What happens when we don't define some events ?\r
-            // Some can be less efficient\r
-\r
-            if (schedulerDebug) console.time("Listening_to_queries");\r
-            /* Listening to queries */\r
-
-            this.listen_query(options.query_uuid);
-            this.listen_query(options.query_all_uuid, 'all');\r
-            this.listen_query(options.query_all_resources_uuid, 'all_resources');\r
-            this.listen_query(options.query_lease_uuid, 'lease');\r
-            //this.listen_query(options.query_lease_uuid, 'lease');\r
-            if (schedulerDebug) console.timeEnd("Listening_to_queries");\r
-\r
-        },\r
-\r
-        /* Handlers */\r
-\r
-        /* all_ev QUERY HANDLERS Start */\r
-        on_all_ev_clear_records: function (data) {\r
-            //alert('all_ev clear_records');\r
-        },\r
-        on_all_ev_query_in_progress: function (data) {\r
-           // alert('all_ev query_in_progress');\r
-        },\r
-        on_all_ev_new_record: function (data) {\r
-            //alert('all_ev new_record');\r
-        },\r
-        on_all_ev_query_done: function (data) {\r
-            //alert('all_ev query_done');\r
-        },\r
-        //another plugin has modified something, that requires you to update your display. \r
-        on_all_ev_field_state_changed: function (data) {\r
-            //alert('all_ev query_done');\r
-        },\r
-        /* all_ev QUERY HANDLERS End */\r
-        /* all_resources QUERY HANDLERS Start */\r
-        on_all_resources_clear_records: function (data) {\r
-            //data is empty on load\r
-        },\r
-        on_all_resources_query_in_progress: function (data) {\r
-            //data is empty on load\r
-        },\r
-        on_all_resources_new_record: function (data) {\r
-            //alert(data.toSource());\r
-            if (data.exclusive == true){\r
-                SchedulerData.push({\r
-                    id: data.urn,\r
-                    index: SchedulerData.length,\r
-                    name: data.hrn,\r
-                    granularity: data.granularity,\r
-                    leases: schedulerGetLeases(60 / schedulerSlotsPerHour, data.granularity),\r
-                    type: data.type,\r
-                    org_resource: data\r
-                });\r
-                if (schedulerDebug && SchedulerData[SchedulerData.length - 1].org_resource.network_hrn == 'omf') {\r
-                    SchedulerData[SchedulerData.length - 1].granularity = 1800;\r
+                //console.log(data.toSource()); console.log('lease_new_record');\r
+            },\r
+            on_lease_query_done: function(data) {\r
+                _leasesDone = true;\r
+                this._initScheduler();\r
+                // console.log('lease_query_done');\r
+            },\r
+            //another plugin has modified something, that requires you to update your display. \r
+            on_lease_field_state_changed: function(data) { console.log('lease_field_state_changed'); },\r
+            /* lease QUERY HANDLERS End */\r
+\r
+\r
+            // no prefix\r
+            on_filter_added: function(filter) {\r
+                this.filters.push(filter);\r
+                this._SetFiletredResources(this.filters);\r
+                //angular and UI\r
+                var tmpScope = angular.element(document.getElementById('SchedulerCtrl')).scope();\r
+                if (SchedulerDataViewData.length == 0) {\r
+                    $("#plugin-scheduler").hide();\r
+                    $("#plugin-scheduler-empty").show();\r
+                    tmpScope.clearStuff();\r
+                } else {\r
+                    $("#plugin-scheduler-empty").hide();\r
+                    $("#plugin-scheduler").show();\r
+                    tmpScope.initSchedulerResources(schedulerMaxRows < SchedulerDataViewData.length ? schedulerMaxRows : SchedulerDataViewData.length);\r
                 }\r
-            }\r
-            //alert(data.toSource());\r
+            },\r
 \r
-        },\r
-        on_all_resources_query_done: function (data) {\r
-            _resourcesDone = true;\r
-            this._initScheduler();\r
-        },\r
-        //another plugin has modified something, that requires you to update your display. \r
-        on_all_resources_field_state_changed: function (data) {\r
-            //alert('all_resources query_done');\r
-        },\r
-        /* all_resources QUERY HANDLERS End */\r
-        /* lease QUERY HANDLERS Start */\r
-        on_lease_clear_records: function (data) { console.log('clear_records'); },\r
-        on_lease_query_in_progress: function (data) { console.log('lease_query_in_progress'); },\r
-        on_lease_new_record: function (data) {\r
-            if (data.resource.indexOf("nitos")>-1){\r
-                tmpSchedulerLeases.push({\r
-                    id: schedulerGetSlotId(data.start_time, data.duration, data.granularity),\r
-                    end_id: schedulerGetSlotId(data.end_time, data.duration, data.granularity),\r
-                    slice: data.slice,\r
-                    status: 'reserved',\r
-                    resource: data.resource,\r
-                    network: data.network,\r
-                    start_time: new Date(data.start_time * 1000),\r
-                    start_time_unixtimestamp: data.start_time,\r
-                    end_time: new Date(data.end_time * 1000),\r
-                    end_time_unixtimestamp: data.end_time,\r
-                    lease_type: data.lease_type,\r
-                    granularity: data.granularity,\r
-                    duration: data.duration\r
+            on_filter_removed: function(filter) {\r
+                // Remove corresponding filters\r
+                this.filters = $.grep(this.filters, function(x) {\r
+                    return x == filter;\r
                 });\r
-            }\r
-            //console.log(data.toSource()); console.log('lease_new_record');\r
-        },\r
-        on_lease_query_done: function (data) {\r
-            _leasesDone = true;\r
-            this._initScheduler();\r
-            // console.log('lease_query_done');\r
-        },\r
-        //another plugin has modified something, that requires you to update your display. \r
-        on_lease_field_state_changed: function (data) { console.log('lease_field_state_changed'); },\r
-        /* lease QUERY HANDLERS End */\r
-\r
-\r
-        // no prefix\r
-        on_filter_added: function (filter) {\r
-            this.filters.push(filter);\r
-            this._SetFiletredResources(this.filters);\r
-            //angular and UI\r
-            var tmpScope = angular.element(document.getElementById('SchedulerCtrl')).scope();\r
-            if (SchedulerDataViewData.length == 0) {\r
-                $("#plugin-scheduler").hide();\r
-                $("#plugin-scheduler-empty").show();\r
-                tmpScope.clearStuff();\r
-            } else {\r
-                $("#plugin-scheduler-empty").hide();\r
-                $("#plugin-scheduler").show();\r
-                tmpScope.initSchedulerResources(schedulerMaxRows < SchedulerDataViewData.length ? schedulerMaxRows : SchedulerDataViewData.length);\r
-            }\r
-        },
-
-        on_filter_removed: function (filter) {
-            // Remove corresponding filters
-            this.filters = $.grep(this.filters, function (x) {\r
-                return x == filter;\r
-            });\r
-            this._SetFiletredResources(this.filters);\r
-            //angular and UI\r
-            var tmpScope = angular.element(document.getElementById('SchedulerCtrl')).scope();\r
-            if (SchedulerDataViewData.length == 0) {\r
-                $("#plugin-scheduler").hide();\r
-                $("#plugin-scheduler-empty").show();\r
-                tmpScope.clearStuff();\r
-            } else {\r
-                $("#plugin-scheduler-empty").hide();\r
-                $("#plugin-scheduler").show();\r
-                tmpScope.initSchedulerResources(schedulerMaxRows < SchedulerDataViewData.length ? schedulerMaxRows : SchedulerDataViewData.length);\r
-            }\r
-        },
-
-        on_filter_clear: function () {\r
-            this.filters = [];\r
-            this._SetFiletredResources(this.filters);\r
-            //angular and UI\r
-            var tmpScope = angular.element(document.getElementById('SchedulerCtrl')).scope();\r
-            if (SchedulerDataViewData.length == 0) {\r
-                $("#plugin-scheduler").hide();\r
-                $("#plugin-scheduler-empty").show();\r
-                tmpScope.clearStuff();\r
-            } else {\r
-                $("#plugin-scheduler-empty").hide();\r
-                $("#plugin-scheduler").show();\r
-                tmpScope.initSchedulerResources(schedulerMaxRows < SchedulerDataViewData.length ? schedulerMaxRows : SchedulerDataViewData.length);\r
-            }\r
-        },\r
-\r
-        // ... be sure to list all events here\r
-\r
-        /* RECORD HANDLERS */\r
-        on_all_new_record: function (record) {\r
-            //alert('on_all_new_record');\r
-        },\r
+                this._SetFiletredResources(this.filters);\r
+                //angular and UI\r
+                var tmpScope = angular.element(document.getElementById('SchedulerCtrl')).scope();\r
+                if (SchedulerDataViewData.length == 0) {\r
+                    $("#plugin-scheduler").hide();\r
+                    $("#plugin-scheduler-empty").show();\r
+                    tmpScope.clearStuff();\r
+                } else {\r
+                    $("#plugin-scheduler-empty").hide();\r
+                    $("#plugin-scheduler").show();\r
+                    tmpScope.initSchedulerResources(schedulerMaxRows < SchedulerDataViewData.length ? schedulerMaxRows : SchedulerDataViewData.length);\r
+                }\r
+            },\r
+\r
+            on_filter_clear: function() {\r
+                this.filters = [];\r
+                this._SetFiletredResources(this.filters);\r
+                //angular and UI\r
+                var tmpScope = angular.element(document.getElementById('SchedulerCtrl')).scope();\r
+                if (SchedulerDataViewData.length == 0) {\r
+                    $("#plugin-scheduler").hide();\r
+                    $("#plugin-scheduler-empty").show();\r
+                    tmpScope.clearStuff();\r
+                } else {\r
+                    $("#plugin-scheduler-empty").hide();\r
+                    $("#plugin-scheduler").show();\r
+                    tmpScope.initSchedulerResources(schedulerMaxRows < SchedulerDataViewData.length ? schedulerMaxRows : SchedulerDataViewData.length);\r
+                }\r
+            },\r
 \r
-        debug : function (logTxt) {\r
-            if (typeof window.console != 'undefined') {\r
-                console.debug(logTxt);\r
-            }\r
-        },\r
+            // ... be sure to list all events here\r
 \r
-        /* INTERNAL FUNCTIONS */\r
-        _initScheduler: function () {\r
-            if (_resourcesDone && _leasesDone)\r
-            {\r
-                SchedulerDataViewData = SchedulerData;\r
-                /* GUI setup and event binding */\r
-                this._FixLeases();\r
-                this._initUI();\r
-            }\r
-        },\r
+            /* RECORD HANDLERS */\r
+            on_all_new_record: function(record) {\r
+                //alert('on_all_new_record');\r
+            },\r
 \r
-        _initUI: function () {\r
-            //alert(1);\r
-            if (schedulerDebug) console.time("_initUI");\r
-            //init DatePicker Start\r
-            $("#DateToRes").datepicker({\r
-                dateFormat: "yy-mm-dd",\r
-                minDate: 0,\r
-                numberOfMonths: 3\r
-            }).change(function () {\r
-                //Scheduler2.loadWithDate();\r
-                SchedulerDateSelected = $("#DateToRes").datepicker("getDate");\r
-                if (SchedulerDateSelected != null && SchedulerDateSelected != '') {\r
-                    for (var i=0; i < SchedulerData.length; i++) {\r
-                        SchedulerData[i].leases = schedulerGetLeases(60 / schedulerSlotsPerHour, SchedulerData[i].granularity);\r
-                    }\r
-                    scheduler2Instance._FixLeases();\r
-                    $('#tblSlider').slider('value', 0);\r
-                    var tmpScope = angular.element(document.getElementById('SchedulerCtrl')).scope();\r
-                    tmpScope.initSchedulerResources(schedulerMaxRows < SchedulerDataViewData.length ? schedulerMaxRows : SchedulerDataViewData.length);\r
-                } else {\r
-                    alert("Please select a date, so the scheduler can reserve leases.");\r
+            debug: function(logTxt) {\r
+                if (typeof window.console != 'undefined') {\r
+                    console.debug(logTxt);\r
                 }\r
-            }).datepicker('setDate', SchedulerDateSelected);\r
-            /*.click(function () {\r
+            },\r
+\r
+            /* INTERNAL FUNCTIONS */\r
+            _initScheduler: function() {\r
+                if (_resourcesDone && _leasesDone) {\r
+                    SchedulerDataViewData = SchedulerData;\r
+                    /* GUI setup and event binding */\r
+                    this._FixLeases();\r
+                    this._initUI();\r
+                }\r
+            },\r
+\r
+            _initUI: function() {\r
+                //alert(1);\r
+                if (schedulerDebug) console.time("_initUI");\r
+                //init DatePicker Start\r
+                $("#DateToRes").datepicker({\r
+                    dateFormat: "yy-mm-dd",\r
+                    minDate: 0,\r
+                    numberOfMonths: 3\r
+                }).change(function() {\r
+                    //Scheduler2.loadWithDate();\r
+                    SchedulerDateSelected = $("#DateToRes").datepicker("getDate");\r
+                    if (SchedulerDateSelected != null && SchedulerDateSelected != '') {\r
+                        for (var i = 0; i < SchedulerData.length; i++) {\r
+                            SchedulerData[i].leases = schedulerGetLeases(60 / schedulerSlotsPerHour, SchedulerData[i].granularity);\r
+                        }\r
+                        scheduler2Instance._FixLeases();\r
+                        $('#tblSlider').slider('value', 0);\r
+                        var tmpScope = angular.element(document.getElementById('SchedulerCtrl')).scope();\r
+                        tmpScope.initSchedulerResources(schedulerMaxRows < SchedulerDataViewData.length ? schedulerMaxRows : SchedulerDataViewData.length);\r
+                    } else {\r
+                        alert("Please select a date, so the scheduler can reserve leases.");\r
+                    }\r
+                }).datepicker('setDate', SchedulerDateSelected);\r
+                /*.click(function () {\r
                 $("#ui-datepicker-div").css("z-index", 5);\r
             })*/\r
-            //End init DatePicker\r
-            \r
-            //init Table\r
-            this._FixTable();\r
-            //End init Table\r
-\r
-            //init Slider\r
-            $('#tblSlider').slider({\r
-                min: 0,\r
-                max: SchedulerTotalCells - SchedulerTotalVisibleCells,\r
-                value: 0,\r
-                slide: function (event, ui) {\r
-                    //$("#amount").val("$" + ui.values[0] + " - $" + ui.values[1]);\r
-                    //console.log(ui.value);\r
-                    var angScope = angular.element(document.getElementById('SchedulerCtrl')).scope();\r
-                    if (_schedulerCurrentCellPosition > ui.value) {\r
-                        angScope.moveBackSlot(ui.value, ui.value + SchedulerTotalVisibleCells);\r
+                //End init DatePicker\r
+\r
+                //init Table\r
+                this._FixTable();\r
+                //End init Table\r
+\r
+                //init Slider\r
+                $('#tblSlider').slider({\r
+                    min: 0,\r
+                    max: SchedulerTotalCells - SchedulerTotalVisibleCells,\r
+                    value: 0,\r
+                    slide: function(event, ui) {\r
+                        //$("#amount").val("$" + ui.values[0] + " - $" + ui.values[1]);\r
+                        //console.log(ui.value);\r
+                        var angScope = angular.element(document.getElementById('SchedulerCtrl')).scope();\r
+                        if (_schedulerCurrentCellPosition > ui.value) {\r
+                            angScope.moveBackSlot(ui.value, ui.value + SchedulerTotalVisibleCells);\r
+                        } else if (_schedulerCurrentCellPosition < ui.value) {\r
+                            angScope.moveFrontSlot(ui.value, ui.value + SchedulerTotalVisibleCells);\r
+                        }\r
+                        _schedulerCurrentCellPosition = ui.value;\r
+                    }\r
+                });\r
+                //End init Slider\r
+\r
+\r
+                //btn Submit leases\r
+                $('#btnSchedulerSubmit').click(function () {\r
+                    var leasesForCommit = new Array();\r
+                    var newLeaseStarted = false;\r
+                    var tmpDateTime = SchedulerDateSelected;\r
+                    for (var i = 0; i < SchedulerData.length; i++)\r
+                    {\r
+                        var tpmR = SchedulerData[i];\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
+                                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
-                    else if (_schedulerCurrentCellPosition < ui.value) {\r
-                        angScope.moveFrontSlot(ui.value, ui.value + SchedulerTotalVisibleCells);\r
+\r
+                    for (var i = 0; i < leasesForCommit.length; i++) {\r
+                        //manifold.raise_event(scheduler.options.query_lease_uuid, SET_ADD, new_lease);\r
                     }\r
-                    _schedulerCurrentCellPosition = ui.value;\r
-                }\r
-            });\r
-            //End init Slider\r
-\r
-            //other stuff\r
-            $("#plugin-scheduler-loader").hide();\r
-            $("#plugin-scheduler").show();\r
-            //fixOddEvenClasses();\r
-            //$("#" + schedulerTblId + " td:not([class])").addClass("free");\r
-            if (schedulerDebug) console.timeEnd("_initUI");\r
-        },\r
+                });\r
+                //\r
+\r
+\r
+                //End btn Submit leases\r
+\r
+                //other stuff\r
+                $("#plugin-scheduler-loader").hide();\r
+                $("#plugin-scheduler").show();\r
+                //fixOddEvenClasses();\r
+                //$("#" + schedulerTblId + " td:not([class])").addClass("free");\r
+                if (schedulerDebug) console.timeEnd("_initUI");\r
+            },\r
 \r
         _FixLeases  : function () {\r
             for (var i = 0; i < tmpSchedulerLeases.length; i++) {\r
@@ -427,7 +474,7 @@ var tmpSchedulerLeases = [];
             if (schedulerDebug &&  colValue == 'omf') colValue = 'nitos';\r
 \r
             if (op == '=' || op == '==') {\r
-                if (colValue != value || colValue == null || colValue == "" || colValue == "n/a")
+                if (colValue != value || colValue == null || colValue == "" || colValue == "n/a")\r
                     ret = false;\r
             } else if (op == 'included') {\r
                 $.each(value, function (i, x) {\r
@@ -439,7 +486,7 @@ var tmpSchedulerLeases = [];
                     }\r
                 });\r
             } else if (op == '!=') {\r
-                if (colValue == value || colValue == null || colValue == "" || colValue == "n/a")
+                if (colValue == value || colValue == null || colValue == "" || colValue == "n/a")\r
                     ret = false;\r
             }\r
 \r
index f5faba9..d7cd16e 100755 (executable)
@@ -16,6 +16,7 @@
             <span class="glyphicon glyphicon-calendar"></span>\r
         </div>\r
         <div class="col-md-2 text-center">\r
+            {% comment %}\r
             <div id="TopologyModal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">\r
                 <div class="modal-dialog">\r
                     <div class="modal-header">\r
@@ -28,6 +29,8 @@
                 </div><!-- /.modal-dialog -->\r
             </div><!-- /.modal TopologyModal -->\r
             <button type="button" class="btn btn-primary btn-md" data-toggle="modal" data-target="#TopologyModal">Topology</button>\r
+            {% endcomment  %}\r
+            <button id="btnSchedulerSubmit" type="button" class="btn btn-primary btn-md">Submit Leases</button>\r
 \r
         </div>\r
     </div>\r
@@ -51,7 +54,7 @@
                 <thead>\r
                     <tr>\r
                         <th>#</th>\r
-                        <th ng-repeat="slot in slots" >\r
+                        <th ng-repeat="slot in slots">\r
                             {[{ slot.time }]}\r
                         </th>\r
                     </tr>\r
@@ -59,7 +62,7 @@
                 <tbody>\r
                     <tr ng-repeat="resource in resources" ng-class-odd="''" ng-class-even="'even'">\r
                         <th data-resourceid="{[{ resource.id }]}" data-rowindex="{[{ $index }]}" data-resourceindex="{[{ resource.index }]}" style="word-wrap: break-word; word-break: break-all; ">{[{ resource.name }]}</th>\r
-                        <td ng-repeat="lease in resource.leases" data-slotid="{[{ lease.id }]}" ng-class="{{ 'lease.status' }}"></td>\r
+                        <td ng-repeat="lease in resource.leases" data-slotid="{[{ lease.id }]}" data-groupid="{[{ lease.groupid }]}" ng-class="{{ 'lease.status' }}"></td>\r
                     </tr>\r
                 </tbody>\r
             </table>\r
                     </div>\r
                 </div>\r
             </div>\r
-        {% comment %}\r
-        <div id="reservation-table-scroll-container">\r
-            <table id='{{domid}}-reservation-table' class='table table-bordered'>\r
-                <thead>\r
-                    <tr>\r
-                        {% for ts in time_slots %}\r
-                        <th class='center info'>{{ ts|safe }}</th>\r
-                        {% endfor %}\r
-                    </tr>\r
-                </thead>\r
-                <tbody>\r
+            {% comment %}\r
+            <div id="reservation-table-scroll-container">\r
+                <table id='{{domid}}-reservation-table' class='table table-bordered'>\r
+                    <thead>\r
+                        <tr>\r
+                            {% for ts in time_slots %}\r
+                            <th class='center info'>{{ ts|safe }}</th>\r
+                            {% endfor %}\r
+                        </tr>\r
+                    </thead>\r
+                    <tbody>\r
 \r
-                    {% for itms in nodes %}\r
-                    {% for n in itms.1 %}\r
-                    <tr data-trindex="">\r
-                        {% for ts in time_slots %}\r
-                        {% if n == 'node020' %}\r
-                        <td class="maintenance closed" data-tdindex="{{forloop.counter}}"></td>\r
-                        {% elif n == 'node023' or n == 'node030' %}\r
-                        <td class="closed" data-tdindex="{{forloop.counter}}"></td>\r
-                        {% else %}\r
-                        <td class="" data-tdindex="{{forloop.counter}}"></td>\r
-                        {% endif %}\r
+                        {% for itms in nodes %}\r
+                        {% for n in itms.1 %}\r
+                        <tr data-trindex="">\r
+                            {% for ts in time_slots %}\r
+                            {% if n == 'node020' %}\r
+                            <td class="maintenance closed" data-tdindex="{{forloop.counter}}"></td>\r
+                            {% elif n == 'node023' or n == 'node030' %}\r
+                            <td class="closed" data-tdindex="{{forloop.counter}}"></td>\r
+                            {% else %}\r
+                            <td class="" data-tdindex="{{forloop.counter}}"></td>\r
+                            {% endif %}\r
+                            {% endfor %}\r
+                        </tr>\r
                         {% endfor %}\r
-                    </tr>\r
-                    {% endfor %}\r
-                    {% endfor %}\r
-                </tbody>\r
-            </table>\r
-        </div>\r
-        {% endcomment  %}\r
+                        {% endfor %}\r
+                    </tbody>\r
+                </table>\r
+            </div>\r
+            {% endcomment  %}\r
 \r
-        <div class="legend">\r
-            <ol>\r
-                <li class="free">free</li>\r
-                <li class="selected">selected</li>\r
-                <li class="closed">reserved</li>\r
-                <li class="maintenance">maintenance</li>\r
-            </ol>\r
-        </div>\r
-    </div><!-- / scheduler plugin -->\r
-    <script type="text/javascript">\r
-        //alert("1");\r
-    </script>\r
-</div>
\ No newline at end of file
+            <div class="legend">\r
+                <ol>\r
+                    <li class="free">free</li>\r
+                    <li class="selected">selected</li>\r
+                    <li class="closed">reserved</li>\r
+                    <li class="maintenance">maintenance</li>\r
+                </ol>\r
+            </div>\r
+        </div><!-- / scheduler plugin -->\r
+        <script type="text/javascript">\r
+            //alert("1");\r
+        </script>\r
+    </div>\r