diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/datacontroller.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/datacontroller.js index 49617e2f99ed680ded9c754148d7d33487ff75bb..567bf54947cdfe6e0b730bc320d30ea4661b8380 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/datacontroller.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/datacontroller.js @@ -662,26 +662,26 @@ dataControllerMod.controller('DataController', $scope.openViewFromDatePopup = function() { $scope.viewFromDatePopupOpened = true; }; $scope.openViewToDatePopup = function() { $scope.viewToDatePopupOpened = true; }; - $scope.jumpTimespanWidths = [{value:30, name:'30 Minutes'}, {value:60, name:'1 Hour'}, {value:3*60, name:'3 Hours'}, {value:6*60, name:'6 Hours'}, {value:12*60, name:'12 Hours'}, {value:24*60, name:'1 Day'}, {value:2*24*60, name:'2 Days'}, {value:3*24*60, name:'3 Days'}, {value:5*24*60, name:'5 Days'}, {value:7*24*60, name:'1 Week'}, {value:14*24*60, name:'2 Weeks'}, {value:28*24*60, name:'4 Weeks'}]; - $scope.jumpTimespanWidth = $scope.jumpTimespanWidths[7]; + $scope.zoomTimespans = [{value:30, name:'30 Minutes'}, {value:60, name:'1 Hour'}, {value:3*60, name:'3 Hours'}, {value:6*60, name:'6 Hours'}, {value:12*60, name:'12 Hours'}, {value:24*60, name:'1 Day'}, {value:2*24*60, name:'2 Days'}, {value:3*24*60, name:'3 Days'}, {value:5*24*60, name:'5 Days'}, {value:7*24*60, name:'1 Week'}, {value:14*24*60, name:'2 Weeks'}, {value:28*24*60, name:'4 Weeks'}, {value:1, name:'Custom (1 min)'}]; + $scope.zoomTimespan = $scope.zoomTimespans[5]; $scope.jumpToNow = function() { var floorLofarTime = dataService.floorDate(dataService.lofarTime, 1, 5); dataService.viewTimeSpan = { - from: dataService.floorDate(new Date(floorLofarTime.getTime() - 0.33*$scope.jumpTimespanWidth.value*60*1000), 1, 5), - to: dataService.ceilDate(new Date(floorLofarTime.getTime() + 0.67*$scope.jumpTimespanWidth.value*60*1000), 1, 5) + from: dataService.floorDate(new Date(floorLofarTime.getTime() - 0.4*$scope.zoomTimespan.value*60*1000), 1, 5), + to: dataService.floorDate(new Date(floorLofarTime.getTime() + 0.6*$scope.zoomTimespan.value*60*1000), 1, 5) }; + }; + + $scope.jumpToNow(); - //automatically select current task + $scope.selectCurrentTask = function() { var currentTasks = dataService.tasks.filter(function(t) { return t.starttime <= dataService.viewTimeSpan.to && t.endime >= dataService.viewTimeSpan.from; }); if(currentTasks.lenght > 0) { dataService.selected_task_id = currentTasks[0].id; } }; - //initialize are now - $scope.jumpToNow(); - - $scope.jumpToSelectedTasks = function() { + $scope.jumpToSelectedTask = function() { if(dataService.selected_task_id == undefined) return; @@ -694,17 +694,20 @@ dataControllerMod.controller('DataController', var taskDurationInMinutes = taskDurationInmsec/60000; var viewSpanInMinutes = taskDurationInMinutes; - var fittingSpans = $scope.jumpTimespanWidths.filter(function(w) { return w.value >= taskDurationInMinutes; }); + var fittingSpans = $scope.zoomTimespans.filter(function(w) { return w.value >= taskDurationInMinutes; }); if(fittingSpans.length > 0) { - $scope.jumpTimespanWidth = fittingSpans[0]; - viewSpanInMinutes = $scope.jumpTimespanWidth.value; + $scope.zoomTimespan = fittingSpans[0]; + //select one span larger if possible + if(fittingSpans.length > 1) + $scope.zoomTimespan = fittingSpans[1]; + viewSpanInMinutes = $scope.zoomTimespan.value; } var focusTime = new Date(task.starttime.getTime() + 0.5*taskDurationInmsec); dataService.viewTimeSpan = { - from: dataService.floorDate(new Date(focusTime.getTime() - 0.33*viewSpanInMinutes*60*1000), 1, 5), - to: dataService.ceilDate(new Date(focusTime.getTime() + 0.67*viewSpanInMinutes*60*1000), 1, 5) + from: dataService.floorDate(new Date(focusTime.getTime() - 0.4*viewSpanInMinutes*60*1000), 1, 5), + to: dataService.floorDate(new Date(focusTime.getTime() + 0.6*viewSpanInMinutes*60*1000), 1, 5) }; }; @@ -726,10 +729,13 @@ dataControllerMod.controller('DataController', }; }; - $scope.onJumpTimespanWidthChanged = function(span) { - var focusTime = dataService.floorDate(dataService.lofarTime, 1, 5); + $scope.onZoomTimespanChanged = function(span) { + var viewTimeSpanInmsec = dataService.viewTimeSpan.to.getTime() - dataService.viewTimeSpan.from.getTime(); + var focusTime = new Date(dataService.viewTimeSpan.from + 0.5*viewTimeSpanInmsec); - if(dataService.selected_task_id != undefined) { + if(dataService.autoFollowNow) { + focusTime = dataService.floorDate(dataService.lofarTime, 1, 5); + } else if(dataService.selected_task_id != undefined) { var task = dataService.taskDict[dataService.selected_task_id]; if(task) { @@ -738,26 +744,44 @@ dataControllerMod.controller('DataController', } dataService.viewTimeSpan = { - from: dataService.floorDate(new Date(focusTime.getTime() - 0.33*$scope.jumpTimespanWidth.value*60*1000)), - to: dataService.ceilDate(new Date(focusTime.getTime() + 0.67*$scope.jumpTimespanWidth.value*60*1000)) + from: dataService.floorDate(new Date(focusTime.getTime() - 0.4*$scope.zoomTimespan.value*60*1000)), + to: dataService.floorDate(new Date(focusTime.getTime() + 0.6*$scope.zoomTimespan.value*60*1000)) }; }; + $scope.selectZoomTimespan = function() { + var viewTimeSpanInmsec = dataService.viewTimeSpan.to.getTime() - dataService.viewTimeSpan.from.getTime(); + var viewTimeSpanInMinutes = Math.round(viewTimeSpanInmsec/60000); + + var foundZoomTimespan = $scope.zoomTimespans.find(function(zts) { return zts.value == viewTimeSpanInMinutes; }); + + if(foundZoomTimespan) { + $scope.zoomTimespan = foundZoomTimespan; + } else { + var customZoomTimespan = $scope.zoomTimespans.find(function(zts) { return zts.name.startsWith('Custom'); }); + customZoomTimespan.value = viewTimeSpanInMinutes; + customZoomTimespan.name = 'Custom (' + viewTimeSpanInMinutes + ' min)'; + $scope.zoomTimespan = customZoomTimespan; + } + }; + $scope.$watch('dataService.viewTimeSpan.from', function() { if(dataService.viewTimeSpan.from >= dataService.viewTimeSpan.to) { - dataService.viewTimeSpan.to = dataService.ceilDate(new Date(dataService.viewTimeSpan.from.getTime() + 60*60*1000), 1, 5); + dataService.viewTimeSpan.from = dataService.floorDate(new Date(dataService.viewTimeSpan.to.getTime() - 5*60*1000), 1, 5); } }); $scope.$watch('dataService.viewTimeSpan.to', function() { if(dataService.viewTimeSpan.to <= dataService.viewTimeSpan.from) { - dataService.viewTimeSpan.from = dataService.floorDate(new Date(dataService.viewTimeSpan.to.getTime() - 60*60*1000), 1, 5); + dataService.viewTimeSpan.to = dataService.floorDate(new Date(dataService.viewTimeSpan.from.getTime() + 5*60*1000), 1, 5); } }); $scope.$watch('dataService.viewTimeSpan', function() { - dataService.clearTasksAndClaimsOutsideViewSpan(); - dataService.getTasksAndClaimsForViewSpan(); + $scope.selectZoomTimespan(); + + $scope.$evalAsync(function() { dataService.clearTasksAndClaimsOutsideViewSpan(); }); + $scope.$evalAsync(function() { dataService.getTasksAndClaimsForViewSpan(); }); }, true); $scope.$watch('dataService.filteredTasks', dataService.computeMinMaxTaskTimes); @@ -768,6 +792,18 @@ dataControllerMod.controller('DataController', } }); + $scope.$watch('dataService.lofarTime', function() { + if(dataService.autoFollowNow && (Math.round(dataService.lofarTime.getTime()/1000))%5==0) { + $scope.jumpToNow(); + } + }); + + $scope.$watch('dataService.autoFollowNow', function() { + if(dataService.autoFollowNow) { + $scope.jumpToNow(); + } + }); + dataService.initialLoad(); //clock ticking every second diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/ganttprojectcontroller.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/ganttprojectcontroller.js index 8fb1940a1aaacc9f1c52d2922cd8feefa46de67f..456830fe0d54bb4b614d834bc6ba48c11dc1a644 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/ganttprojectcontroller.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/ganttprojectcontroller.js @@ -64,7 +64,7 @@ ganttProjectControllerMod.controller('GanttProjectController', ['$scope', 'dataS element.bind('dblclick', function(event) { if(directiveScope.task.model.raTask) { $scope.dataService.selected_task_id = directiveScope.task.model.raTask.id; - $scope.jumpToSelectedTasks(); + $scope.jumpToSelectedTask(); } }); } diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/gridcontroller.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/gridcontroller.js index 8671ca77386a10e80991a4255822430dfce39027..a3bc405df79b6a11506c4e90efc95cd633040b89 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/gridcontroller.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/gridcontroller.js @@ -45,7 +45,7 @@ gridControllerMod.controller('GridController', ['$scope', 'dataService', 'uiGrid }, { field: 'duration', displayName: 'Duration', - width: '8%', + width: '7%', enableFiltering: false, enableCellEdit: false, enableCellEditOnFocus: false, @@ -53,7 +53,7 @@ gridControllerMod.controller('GridController', ['$scope', 'dataService', 'uiGrid }, { field: 'status', enableCellEdit: true, - width: '8%', + width: '7%', filter: { type: uiGridConstants.filter.SELECT, selectOptions: [] diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/templates/index.html b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/templates/index.html index 4bcd97718867694dd1265de8e51c61912575cb58..5f4036320a22eda2b518d565739db8f92a5624e8 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/templates/index.html +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/templates/index.html @@ -75,23 +75,15 @@ <div class="col-md-2"> <label>Scroll:</label> <p class="input-group"> - <label title="Follow 'now' automatically" style="padding-right: 4px; vertical-align: top;">auto<input type="checkbox" ng-model="dataService.autoFollowNow"></label> + <label title="Automatically scroll 'From' and 'To' to watch live events" style="padding-right: 4px; vertical-align: top;">Live <input type="checkbox" ng-model="dataService.autoFollowNow"></label> <button title="Scroll back in time" type="button" class="btn btn-default" ng-click="scrollBack()"><i class="glyphicon glyphicon-step-backward"></i></button> <button title="Scroll forward in time"type="button" class="btn btn-default" ng-click="scrollForward()"><i class="glyphicon glyphicon-step-forward"></i></button> </p> </div> <div class="col-md-2"> - <label>Jump:</label> + <label>Zoom:</label> <p class="input-group"> - <span class="input-group-btn"> - <button type="button" class="btn btn-default" ng-click="jumpToSelectedTasks()" title="Jump to selected Task(s)">Task</button> - </span> - <span class="input-group-btn" style="width:10px;"></span> - <span class="input-group-btn"> - <button type="button" class="btn btn-default" ng-click="jumpToNow()" title="Jump to Now">Now</button> - </span> - <select class="form-control" ng-model=jumpTimespanWidth ng-options="option.name for option in jumpTimespanWidths track by option.value" ng-change="onJumpTimespanWidthChanged(span)"> - </select> + <select class="form-control" ng-model=zoomTimespan ng-options="option.name for option in zoomTimespans track by option.value" ng-change="onZoomTimespanChanged(span)"></select> </p> </div> </div>