angular.module('agileApp').controller('TodoListController', ['$scope', '$filter', 'BackendService', 'LocalIdGenerator', 'UserAuthService', '$modal' , '$window', '$rootScope', '$timeout', function($scope, $filter, backendService, localIdGenerator, userAuthService, $modal, $window, $rootScope, $timeout) { $rootScope.bodyClass = 'app-layout'; $scope.todos = []; $scope.doings = []; $scope.dones = []; $window.onfocus = function(){ console.log("focused"); userAuthService.refreshToken(function() { backendService.requestFullSync(); }); } $scope.todoType = {title:'To Do', type:1, callout:"danger", cssClass:"todo"}; $scope.doingType = {title:'Doing', type:2, callout:"warning", cssClass:"doing"}; $scope.doneType = {title:'Done', type:3, callout:"info", cssClass:"done"}; $scope.projectList = backendService.projects; $scope.selectedProject = backendService.selectedProject; $scope.allTasks = backendService.tasks; $scope.syncError = function() { return backendService.syncError; } $scope.isLoading = function() { return backendService.syncing; } $scope.hasSynced = function() { return backendService.hasSynced; } $scope.lastSyncedTimeWrapper = backendService.lastSyncedTimeWrapper; $scope.$watch('allTasks', function() { $scope.todos = $filter('filter')($scope.allTasks, {data:{taskType:1}, deleted:false}); $scope.doings = $filter('filter')($scope.allTasks, {data:{taskType:2}, deleted:false}); $scope.dones = $filter('filter')($scope.allTasks, {data:{taskType:3}, deleted:false}); //console.log("all tasks watch", $scope.allTasks); }, true); //true is needed here and watchCollection didnt work quite right for delete all, need to investigate this $scope.selectProject = function(project) { $scope.editProject.$hide(); backendService.selectProject(project); }; $scope.newProjectTitle = ""; $scope.newProject = function() { if($scope.selectedProject.data.description == "") return; var newProject = { data: { description: $scope.newProjectTitle, localId:localIdGenerator.getNewId() }, ignored:["localId"], type:"AgileProject", deleted:false } backendService.projects.push(newProject); backendService.upsertIntoDirtyObjects(newProject); $scope.newProjectTitle = ''; $scope.selectProject(newProject); //no problem with this line //theres an issue when you create 2 offline projects then tasks inside them //need to investigate return true; }; $scope.addTodo = function(type, title, description) { //calculate position console.log("type:" + type + " title:" + title, + " desc:" + description); var list = $scope.getList(type); if(list && list.length > 0) { console.log(list); var position = list[0].data.position - 1; } else { var position = 0; } var newTask = { data: { alarmTime:-1, alarmType:0, description:description, position:position, taskType:type, title:title, localId:localIdGenerator.getNewId() }, indexes:["projectId"], ignored:["localId"], type:"AgileTask", deleted:false } //project has already been synced, use that for project id if($scope.selectedProject.entityId) { newTask.data.projectId = $scope.selectedProject.entityId; } else { //project has not been synced, need to inject the field //cant figure out why the objects around bound //but we can just look for the localId anyways var index = -1; for(var c = 0; c < backendService.dirtyObjects.length; c++) { if(backendService.dirtyObjects[c].data.localId == $scope.selectedProject.data.localId) { index = c; } } newTask.references = [{key:"projectId", arrayIndex: index}]; } $scope.allTasks.unshift(newTask); backendService.allTasks.unshift(newTask); backendService.upsertIntoDirtyObjects(newTask); }; $scope.getList = function(type) { if(type == 1) { return $scope.todos; } else if(type == 2) { return $scope.doings; } else if(type == 3) { return $scope.dones; } } $scope.setList = function(type, list) { if(type == 1) { $scope.todos = list; } else if(type == 2) { $scope.doings = list; } else if(type == 3) { $scope.dones = list; } } $scope.getProfile = function() { return userAuthService.getProfile(); } $scope.sync = function() { backendService.requestFullSync(); } backendService.requestFullSync(function() { //alert('success'); if(backendService.allTasks.length == 0 && backendService.projects.length == 0) { //alert('first sync, populating some demo tasks'); console.log("first sync, populating some demo tasks"); $scope.newProjectTitle = "My First Project"; $scope.newProject(); $scope.addTodo(1, "Drag tasks between lists when you're ready to work on them!", "Tasks can be reordered within a list too. Mess around with it!") $scope.addTodo(1, "Click to give your task a title", "Click to give your task a description") $scope.addTodo(2, "Your projects are on the left sidebar", "Create projects by pressing the + on the sidebar"); } }); $scope.onProjectEdited = function(project) { for(var c = 0; c < backendService.projects.length; c++) { if(project.data.localId == backendService.projects[c].data.localId) { backendService.projects[c].data.description = project.data.description; } } backendService.upsertIntoDirtyObjects(project); } $scope.deleteProjectModal = function(project) { var scope = $rootScope.$new(); scope.project = project; modalInstance = $modal.open({ scope: scope, animation: $scope.animationsEnabled, templateUrl: 'partials/modals/delete-project-modal-partial.html', windowClass: 'agile-modal', size: "m" }); modalInstance.result.then(function(reason) { if(reason == 1) { $scope.deleteProject(project); } }); } $scope.deleteProject = function(project) { backendService.deleteProject(project); } $scope.logout = function() { userAuthService.logout(); } $scope.getProfileImage = function() { return userAuthService.getProfileImage(); } }])