-
Jorrit Schaap authoredJorrit Schaap authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
datacontroller.js 10.75 KiB
// $Id$
angular.module('raeApp').factory("dataService", ['$http', function($http){
var self = this;
self.tasks = [];
self.resources = [];
self.resourceGroups = [];
self.resourceClaims = [];
self.tasktypes = [];
self.taskstatustypes = [];
self.taskDict = {};
self.resourceDict = {};
self.resourceGroupsDict = {};
self.resourceGroupMemberships = {};
self.resourceClaimDict = {};
self.tasktypesDict = {};
self.momProjects = [];
self.momProjectsDict = {};
self.resourcesWithClaims = [];
self.filteredTasks = [];
self.filteredTaskDict = {};
//start with local client time
//lofarTime will be synced with server,
//because local machine might have incorrect clock
self.lofarTime = new Date(Date.now());
self.toIdBasedDict = function(list) {
var dict = {}
for(var i = list.length-1; i >=0; i--) {
var item = list[i];
dict[item.id] = item;
}
return dict;
};
self.getTasks = function() {
$http.get('/rest/tasks').success(function(result) {
//convert datetime strings to Date objects
for(var i = result.tasks.length-1; i >=0; i--) {
var task = result.tasks[i];
task.starttime = new Date(task.starttime);
task.endtime = new Date(task.endtime);
}
self.tasks = result.tasks;
self.taskDict = self.toIdBasedDict(self.tasks);
self.filteredTasks = self.tasks;
self.filteredTaskDict = self.taskDict;
});
};
self.putTask = function(task) {
$http.put('/rest/tasks/' + task.id, task).error(function(result) {
console.log("Error. Could not update task. " + result);
})
};
self.getResources = function() {
$http.get('/rest/resources').success(function(result) {
self.resources = result.resources;
self.resourceDict = self.toIdBasedDict(self.resources);
});
};
self.getResourceClaims = function() {
$http.get('/rest/resourceclaims').success(function(result) {
//convert datetime strings to Date objects
for(var i = result.resourceclaims.length-1; i >=0; i--) {
var resourceclaim = result.resourceclaims[i];
resourceclaim.starttime = new Date(resourceclaim.starttime);
resourceclaim.endtime = new Date(resourceclaim.endtime);
}
self.resourceClaims = result.resourceclaims;
self.resourceClaimDict = self.toIdBasedDict(self.resourceClaims);
});
};
self.getResourceGroups = function() {
$http.get('/rest/resourcegroups').success(function(result) {
self.resourceGroups = result.resourcegroups;
self.resourceGroupsDict = self.toIdBasedDict(self.resourceGroups);
});
};
self.getResourceGroupMemberships = function() {
$http.get('/rest/resourcegroupmemberships').success(function(result) {
self.resourceGroupMemberships = result.resourcegroupmemberships;
});
};
self.getTaskTypes = function() {
$http.get('/rest/tasktypes').success(function(result) {
self.tasktypes = result.tasktypes;
self.tasktypesDict = self.toIdBasedDict(self.tasktypes);
});
};
self.getTaskStatusTypes = function() {
$http.get('/rest/taskstatustypes').success(function(result) {
self.taskstatustypes = result.taskstatustypes;
});
};
self.getMoMProjects = function() {
$http.get('/rest/momprojects').success(function(result) {
//convert datetime strings to Date objects
var dict = {};
var list = [];
for(var i = result.momprojects.length-1; i >=0; i--) {
var momproject = result.momprojects[i];
momproject.statustime = new Date(momproject.statustime);
dict[momproject.mom_id] = momproject;
list.push(momproject);
}
list.sort(function(a, b) { return ((a.name < b.name) ? -1 : ((a.name > b.name) ? 1 : 0)); });
self.momProjects = list;
self.momProjectsDict = dict;
});
};
self.getMoMObjectDetailsForTask = function(task) {
$http.get('/rest/momobjectdetails/'+task.mom_id).success(function(result) {
if(result.momobjectdetails) {
task.name = result.momobjectdetails.object_name;
task.project_name = result.momobjectdetails.project_name;
task.project_id = result.momobjectdetails.project_mom_id;
}
});
};
self._syncLofarTimeWithServer = function() {
$http.get('/rest/lofarTime').success(function(result) {
self.lofarTime = new Date(result.lofarTime);
});
setTimeout(self._syncLofarTimeWithServer, 60000);
};
self._syncLofarTimeWithServer();
self.lastUpdateChangeNumber = undefined;
self.initialLoad = function() {
$http.get('/rest/mostRecentChangeNumber').success(function(result) {
if(result.mostRecentChangeNumber >= 0) {
self.lastUpdateChangeNumber = result.mostRecentChangeNumber;
}
self.getMoMProjects();
self.getTaskTypes();
self.getTaskStatusTypes();
self.getTasks();
self.getResourceGroups();
self.getResources();
self.getResourceGroupMemberships();
self.getResourceClaims();
self.subscribeToUpdates();
});
};
self.subscribeToUpdates = function() {
var url = '/rest/updates';
if(self.lastUpdateChangeNumber) {
url += '/' + self.lastUpdateChangeNumber;
}
$http.get(url, {timeout:300000}).success(function(result) {
try {
var changeNumbers = result.changes.map(function(item) { return item.changeNumber; });
self.lastUpdateChangeNumber = changeNumbers.reduce(function(a, b, idx, arr) { return a > b ? a : b; }, undefined);
for(var i = result.changes.length-1; i >=0; i--) {
try {
var change = result.changes[i];
if(change.objectType == 'task') {
var changedTask = change.value;
if(change.changeType == 'update') {
var task = self.taskDict[changedTask.id];
if(task) {
task.status = changedTask.status;
task.mom_id = changedTask.mom_id;
task.otdb_id = changedTask.otdb_id;
task.starttime = new Date(changedTask.starttime);
task.endtime = new Date(changedTask.endtime);
task.predecessor_ids = changedTask.predecessor_ids;
task.successor_ids = changedTask.successor_ids;
}
} else if(change.changeType == 'insert') {
var task = self.taskDict[changedTask.id];
if(!task) {
self.tasks.push(changedTask);
self.taskDict[changedTask.id] = changedTask;
}
} else if(change.changeType == 'delete') {
delete self.taskDict[changedTask.id]
for(var k = self.tasks.length-1; k >= 0; k--) {
if(self.tasks[k].id == changedTask.id) {
self.tasks.splice(k, 1);
break;
}
}
}
} else if(change.objectType == 'resourceClaim') {
var changedClaim = change.value;
if(change.changeType == 'update') {
var claim = self.resourceClaimDict[changedClaim.id];
if(claim) {
claim.status = changedClaim.status;
claim.starttime = new Date(changedClaim.starttime);
claim.endtime = new Date(changedClaim.endtime);
}
} else if(change.changeType == 'insert') {
var claim = self.resourceClaimDict[changedClaim.id];
if(!claim) {
self.resourceClaims.push(changedClaim);
self.resourceClaimDict[changedClaim.id] = changedClaim;
}
} else if(change.changeType == 'delete') {
delete self.resourceClaimDict[changedClaim.id]
for(var k = self.resourceClaims.length-1; k >= 0; k--) {
if(self.resourceClaims[k].id == changedClaim.id) {
self.resourceClaims.splice(k, 1);
break;
}
}
}
}
} catch(err) {
console.log(err)
}
}
} catch(err) {
console.log(err)
}
//and update again
self.subscribeToUpdates();
}).error(function() {
setTimeout(self.subscribeToUpdates, 1000);
});
};
return self;
}]);
var dataControllerMod = angular.module('DataControllerMod', ['ngResource']);
dataControllerMod.controller('DataController',
['$scope', 'dataService',
function($scope, dataService) {
var self = this;
self.dataService = dataService;
dataService.initialLoad();
//clock ticking every second
//updating current lofarTime by the elapsed time since previous tick
//lofarTime is synced every minute with server utc time.
self._prevTick = Date.now();
self._doTimeTick = function() {
var tick = Date.now();
var elapsed = tick - self._prevTick;
self._prevTick = tick;
//evalAsync, so lofarTime will be seen by watches
$scope.$evalAsync(function() { dataService.lofarTime = new Date(dataService.lofarTime.getTime() + elapsed); });
setTimeout(self._doTimeTick, 1000);
};
self._doTimeTick();
}
]);