class ProjectManager extends Listenable { constructor() { super(); this.projectListeners = { }; this.projects = { }; this.loadProjectsRequest = new Request(OnTime.REQUEST_URI + "Projects", Request.GET, this.loadedProjects.bind(this), this.projectLoadingError.bind(this)); this.loadProjectsInterval = setInterval(this.loadProjects.bind(this), 60000); this.loadProjects(); this.deleteProjectRequest = new Request(OnTime.REQUEST_URI + "Project/Delete", Request.POST, this.deletedProject.bind(this), this.projectDeletionError.bind(this)); this.createProjectRequest = new Request(OnTime.REQUEST_URI + "Project/Create", Request.POST, this.createdProject.bind(this), this.projectCreationError.bind(this)); this.updateProjectRequest = new Request(OnTime.REQUEST_URI + "Project", Request.POST, this.updatedProject.bind(this), this.projectUpdatingError.bind(this)); } performInitialCalls(eventType, callback) { if (eventType == "projectadded") { for (var projectKey in this.projects) { var addedProject = this.projects[projectKey]; var projectAddedEvent = new Event("projectadded"); projectAddedEvent.project = addedProject; callback(projectAddedEvent); } } } loadProjects() { if (this.loadProjectsRequest.ready) { this.loadProjectsRequest.send(); } } loadedProjects(projects) { //Check for deleted and updated projects. for (var projectKey in this.projects) { var localProject = this.projects[projectKey]; if (!(projectKey in projects)) { this.callProjectListeners(projectKey, null); var projectDeletedEvent = new Event("projectremoved"); projectDeletedEvent.project = localProject; this.dispatchEvent(projectDeletedEvent); continue; } var remoteProject = projects[projectKey]; if (!Object.equals(localProject, remoteProject)) { this.callProjectListeners(projectKey, remoteProject); var projectChangedEvent = new Event("projectchanged"); projectChangedEvent.project = remoteProject; this.dispatchEvent(projectChangedEvent); } } //Check for new projects. for (var projectKey in projects) { if (!(projectKey in this.projects)) { this.callProjectListeners(projectKey, projects[projectKey]); var projectAddedEvent = new Event("projectadded"); projectAddedEvent.project = projects[projectKey]; this.dispatchEvent(projectAddedEvent); } } this.projects = projects; } projectLoadingError(request, status, error) { alert("Error during the loading of the projects:\r\n\r\n" + JSON.stringify(error, true)); } /** * Attempts to delete the given project on the server side. */ deleteProject(project) { this.deleteProjectRequest.send(project); } deletedProject(response) { this.callProjectListeners(response.project_key, null); var projectDeletedEvent = new Event("projectremoved"); projectDeletedEvent.project = this.projects[response.project_key]; this.dispatchEvent(projectDeletedEvent); delete this.projects[response.project_key]; //Remove the project from all users locally. var roles = OnTime.userManager.roles; for (var roleKey in roles) { for (var email in roles[roleKey].users) { var user = roles[roleKey].users[email]; if (user.projects && (response.project_key in user.projects)) { delete roles[roleKey].users[email].projects[response.project_key]; } } } OnTime.userManager.loadedUsers(roles); } projectDeletionError(request, status, error) { alert("Error during the deletion of the project:\r\n\r\n" + JSON.stringify(error, true)); } /** * Attempts to create a project with the given data on the server side. */ createProject(project) { this.createProjectRequest.send(project); } createdProject(response) { this.projects[response.project_key] = response; var projectAddedEvent = new Event("projectadded"); projectAddedEvent.project = response; this.dispatchEvent(projectAddedEvent); } projectCreationError(request, status, error) { alert("Error during the creation of the project:\r\n\r\n" + JSON.stringify(error, true)); } /** * Attempts to save the given project data on the server. */ updateProject(project) { this.updateProjectRequest.send(project); } updatedProject(response) { this.projects[response.project_key] = response; this.callProjectListeners(response.project_key, response); var projectChangedEvent = new Event("projectchanged"); projectChangedEvent.project = response; this.dispatchEvent(projectChangedEvent); } projectUpdatingError(request, status, error) { alert("Error while updating the project:\r\n\r\n" + JSON.stringify(error, true)); } /** * The project listeners are called when a specific project is loaded initially or when it has changed. * The listeners are also called when the project was deleted, but with null instead of the project as a parameter. */ addProjectListener(projectKey, callback) { if (!(projectKey in this.projectListeners)) { this.projectListeners[projectKey] = [ ]; } if (this.projectListeners[projectKey].indexOf(callback) == -1) { this.projectListeners[projectKey].push(callback); if (projectKey in this.projects) { callback(this.projects[projectKey]); } } } removeProjectListener(projectKey, callback) { if (!(projectKey in this.projectListeners)) { return; } var index = this.projectListeners[projectKey].indexOf(callback); if (index != -1) { this.projectListeners[projectKey].splice(index, 1); } } callProjectListeners(projectKey, projectData) { if (!(projectKey in this.projectListeners)) { return; } var listeners = this.projectListeners[projectKey]; for (var i = 0; i < listeners.length; i++) { listeners[i](projectData); } } getProjectByKey(projectKey) { if (projectKey in this.projects) { return this.projects[projectKey]; } return null; } }