From 7205a81d4a525daeee24d948e8d8126e6c012872 Mon Sep 17 00:00:00 2001 From: Victor Costa Date: Fri, 22 Jul 2016 18:00:25 -0300 Subject: [PATCH] Emit and subscribe to events for task accept/reject --- src/app/known-events.ts | 5 +++-- src/app/main/main.component.spec.ts | 3 ++- src/app/shared/services/events-hub.service.ts | 6 +++--- src/app/task/task-list/task-accept.component.spec.ts | 2 +- src/app/task/task-list/task-list.component.spec.ts | 10 ++++++---- src/app/task/task-list/task-list.component.ts | 31 +++++++++++++++++++++++++------ src/app/task/tasks-menu/tasks-menu.component.spec.ts | 2 ++ src/app/task/tasks-menu/tasks-menu.component.ts | 16 ++++++++++++++-- src/app/task/types/add-member/add-member-accept.html | 2 +- src/languages/en.json | 3 ++- src/languages/pt.json | 3 ++- 11 files changed, 61 insertions(+), 22 deletions(-) diff --git a/src/app/known-events.ts b/src/app/known-events.ts index 9a655bd..f6d76c8 100644 --- a/src/app/known-events.ts +++ b/src/app/known-events.ts @@ -1,9 +1,10 @@ import { EventsHubKnownEventNames } from './shared/services/events-hub.service'; -export class NoosferoKnownEvents implements EventsHubKnownEventNames { +export class NoosferoKnownEvents implements EventsHubKnownEventNames { IMAGE_PROFILE_UPDATED: string = 'IMAGE_PROFILE_UPDATED'; PROFILE_INFO_UPDATED: string = 'PROFILE_INFO_UPDATED'; ARTICLE_UPDATED: string = 'ARTICLE_UPDATED'; + TASK_CLOSED: string = 'TASK_CLOSED'; constructor() { } @@ -11,4 +12,4 @@ export class NoosferoKnownEvents implements EventsHubKnownEventNames { getNames() { return Object.getOwnPropertyNames(this); } -} \ No newline at end of file +} diff --git a/src/app/main/main.component.spec.ts b/src/app/main/main.component.spec.ts index fae1c76..a46e231 100644 --- a/src/app/main/main.component.spec.ts +++ b/src/app/main/main.component.spec.ts @@ -40,7 +40,8 @@ describe("MainComponent", function () { useValue: [ 'IMAGE_PROFILE_UPDATED', 'PROFILE_INFO_UPDATED', - 'ARTICLE_UPDATED' + 'ARTICLE_UPDATED', + 'TASK_CLOSED' ] }), ] diff --git a/src/app/shared/services/events-hub.service.ts b/src/app/shared/services/events-hub.service.ts index f9b1c5c..2eccb75 100644 --- a/src/app/shared/services/events-hub.service.ts +++ b/src/app/shared/services/events-hub.service.ts @@ -31,13 +31,13 @@ export class EventsHubService { emitEvent(eventType: string, payload?: any) { this.checkKnownEvent(eventType); let event = this.emitters.get(eventType); - if ( event ) this.emitters.get(eventType).next(payload); + if (event) this.emitters.get(eventType).next(payload); } subscribeToEvent(eventType: string, generatorOrNext?: ((p?: T) => void), error?: any, complete?: any) { this.checkKnownEvent(eventType); let event = this.emitters.get(eventType); - if (event) event.subscribe(generatorOrNext, error, complete); + if (event) event.subscribe(generatorOrNext, error, complete); } private setupEmitters() { @@ -53,4 +53,4 @@ export class EventsHubService { } -} \ No newline at end of file +} diff --git a/src/app/task/task-list/task-accept.component.spec.ts b/src/app/task/task-list/task-accept.component.spec.ts index 33491e5..0e3436c 100644 --- a/src/app/task/task-list/task-accept.component.spec.ts +++ b/src/app/task/task-list/task-accept.component.spec.ts @@ -19,7 +19,7 @@ describe("Components", () => { properties: { task: task }, providers: [ helpers.createProviderToValue("RoleService", roleService) - ] + ].concat(helpers.provideFilters("translateFilter")) }); } diff --git a/src/app/task/task-list/task-list.component.spec.ts b/src/app/task/task-list/task-list.component.spec.ts index cbe27ca..ae0b9a3 100644 --- a/src/app/task/task-list/task-list.component.spec.ts +++ b/src/app/task/task-list/task-list.component.spec.ts @@ -12,6 +12,7 @@ describe("Components", () => { let taskService = jasmine.createSpyObj("taskService", ["getAllPending"]); let tasks = [{ id: 1 }, { id: 2 }]; let modal = helpers.mocks.$modal; + let eventsHubService = jasmine.createSpyObj("eventsHubService", ["subscribeToEvent", "emitEvent"]); taskService.getAllPending = jasmine.createSpy("getAllPending").and.returnValue(Promise.resolve({ headers: () => { }, data: tasks })); beforeEach(angular.mock.module("templates")); @@ -22,6 +23,7 @@ describe("Components", () => { directives: [TaskListComponent], providers: [ helpers.createProviderToValue("TaskService", taskService), + helpers.createProviderToValue("EventsHubService", eventsHubService), helpers.createProviderToValue('NotificationService', helpers.mocks.notificationService), helpers.createProviderToValue('$uibModal', modal), ].concat(helpers.provideFilters("groupByFilter")), @@ -66,24 +68,24 @@ describe("Components", () => { expect(helper.component.callReject).toHaveBeenCalled(); }); - it("call cancel and remove the current task when accept was called successfully", () => { + it("call cancel and emit event when accept was called successfully", () => { helper.component.currentTask = { id: 1 }; let result = helpers.mocks.promiseResultTemplate({ data: { id: 1 } }); taskService.finishTask = jasmine.createSpy("finishTask").and.returnValue(result); helper.component.cancel = jasmine.createSpy("cancel"); helper.component.callAccept(); expect(helper.component.cancel).toHaveBeenCalled(); - expect(helper.component.tasks).toEqual([{ id: 2 }]); + expect((helper.component)['eventsHubService'].emitEvent).toHaveBeenCalled(); }); - it("call cancel and remove the current task when reject was called successfully", () => { + it("call cancel and emit event when reject was called successfully", () => { helper.component.currentTask = { id: 1 }; let result = helpers.mocks.promiseResultTemplate({ data: { id: 1 } }); taskService.cancelTask = jasmine.createSpy("cancelTask").and.returnValue(result); helper.component.cancel = jasmine.createSpy("cancel"); helper.component.callReject(); expect(helper.component.cancel).toHaveBeenCalled(); - expect(helper.component.tasks).toEqual([{ id: 2 }]); + expect((helper.component)['eventsHubService'].emitEvent).toHaveBeenCalled(); }); it("reset currentTask and close modal when call cancel", () => { diff --git a/src/app/task/task-list/task-list.component.ts b/src/app/task/task-list/task-list.component.ts index 6653aa7..025abdc 100644 --- a/src/app/task/task-list/task-list.component.ts +++ b/src/app/task/task-list/task-list.component.ts @@ -1,15 +1,20 @@ -import { Component, Input, Inject } from "ng-forward"; +import { Component, Input, Inject, provide } from "ng-forward"; import { NotificationService } from "../../shared/services/notification.service"; import { TaskService } from "../../../lib/ng-noosfero-api/http/task.service"; import { TaskAcceptComponent } from "./task-accept.component"; import { Arrays } from "../../../lib/util/arrays"; +import { EventsHubService } from "../../shared/services/events-hub.service"; +import { NoosferoKnownEvents } from "../../known-events"; @Component({ selector: "task-list", templateUrl: "app/task/task-list/task-list.html", - directives: [TaskAcceptComponent] + directives: [TaskAcceptComponent], + providers: [ + provide('eventsHubService', { useClass: EventsHubService }) + ] }) -@Inject(NotificationService, "$scope", "$uibModal", TaskService) +@Inject(NotificationService, "$scope", "$uibModal", TaskService, EventsHubService) export class TaskListComponent { @Input() tasks: noosfero.Task[]; @@ -18,9 +23,23 @@ export class TaskListComponent { currentTask: noosfero.Task; confirmationTask: noosfero.Task; + eventsNames: NoosferoKnownEvents; private modalInstance: any = null; - constructor(private notificationService: NotificationService, private $scope: ng.IScope, private $uibModal: any, private taskService: TaskService) { } + constructor(private notificationService: NotificationService, + private $scope: ng.IScope, + private $uibModal: any, + private taskService: TaskService, + private eventsHubService: EventsHubService) { + + this.eventsNames = new NoosferoKnownEvents(); + } + + ngOnInit() { + this.eventsHubService.subscribeToEvent(this.eventsNames.TASK_CLOSED, (task: noosfero.Task) => { + Arrays.remove(this.tasks, task); + }); + } getTaskTemplate(task: noosfero.Task) { if (this.taskTemplates.indexOf(task.type) >= 0) { @@ -65,7 +84,7 @@ export class TaskListComponent { callAccept() { this.taskService.finishTask(this.confirmationTask).then(() => { - Arrays.remove(this.tasks, this.currentTask); + this.eventsHubService.emitEvent(this.eventsNames.TASK_CLOSED, this.currentTask); this.notificationService.success({ title: "tasks.actions.accept.title", message: "tasks.actions.accept.message" }); }).finally(() => { this.cancel(); @@ -74,7 +93,7 @@ export class TaskListComponent { callReject() { this.taskService.cancelTask(this.confirmationTask).then(() => { - Arrays.remove(this.tasks, this.currentTask); + this.eventsHubService.emitEvent(this.eventsNames.TASK_CLOSED, this.currentTask); this.notificationService.success({ title: "tasks.actions.reject.title", message: "tasks.actions.reject.message" }); }).finally(() => { this.cancel(); diff --git a/src/app/task/tasks-menu/tasks-menu.component.spec.ts b/src/app/task/tasks-menu/tasks-menu.component.spec.ts index a177db3..6a29a29 100644 --- a/src/app/task/tasks-menu/tasks-menu.component.spec.ts +++ b/src/app/task/tasks-menu/tasks-menu.component.spec.ts @@ -12,6 +12,7 @@ describe("Components", () => { let helper: ComponentTestHelper; let taskService = jasmine.createSpyObj("taskService", ["getAllPending"]); let tasks = [{ id: 1 }, { id: 2 }]; + let eventsHubService = jasmine.createSpyObj("eventsHubService", ["subscribeToEvent", "emitEvent"]); taskService.getAllPending = jasmine.createSpy("getAllPending").and.returnValue(Promise.resolve({ headers: () => { }, data: tasks })); beforeEach(angular.mock.module("templates")); @@ -22,6 +23,7 @@ describe("Components", () => { directives: [TasksMenuComponent], providers: [ helpers.createProviderToValue("TaskService", taskService), + helpers.createProviderToValue("EventsHubService", eventsHubService), helpers.createProviderToValue('SessionService', helpers.mocks.sessionWithCurrentUser({})) ] }); diff --git a/src/app/task/tasks-menu/tasks-menu.component.ts b/src/app/task/tasks-menu/tasks-menu.component.ts index ea0ab6f..334debe 100644 --- a/src/app/task/tasks-menu/tasks-menu.component.ts +++ b/src/app/task/tasks-menu/tasks-menu.component.ts @@ -1,22 +1,34 @@ import { Component, Inject } from "ng-forward"; import { TaskService } from "../../../lib/ng-noosfero-api/http/task.service"; import { AuthService, SessionService, AuthEvents } from "./../../login"; +import { EventsHubService } from "../../shared/services/events-hub.service"; +import { NoosferoKnownEvents } from "../../known-events"; @Component({ selector: "tasks-menu", templateUrl: "app/task/tasks-menu/tasks-menu.html" }) -@Inject(TaskService, SessionService, AuthService) +@Inject(TaskService, SessionService, AuthService, EventsHubService) export class TasksMenuComponent { tasks: noosfero.Task[]; total: number; perPage = 5; person: noosfero.Person; + eventsNames: NoosferoKnownEvents; - constructor(private taskService: TaskService, private session: SessionService, private authService: AuthService) { } + constructor(private taskService: TaskService, + private session: SessionService, + private authService: AuthService, + private eventsHubService: EventsHubService) { + + this.eventsNames = new NoosferoKnownEvents(); + } ngOnInit() { + this.eventsHubService.subscribeToEvent(this.eventsNames.TASK_CLOSED, (task: noosfero.Task) => { + this.total--; + }); this.authService.subscribe(AuthEvents[AuthEvents.loginSuccess], () => { this.loadTasks(); }); diff --git a/src/app/task/types/add-member/add-member-accept.html b/src/app/task/types/add-member/add-member-accept.html index 460d341..d204767 100644 --- a/src/app/task/types/add-member/add-member-accept.html +++ b/src/app/task/types/add-member/add-member-accept.html @@ -1,5 +1,5 @@
- +
{{role.name}} diff --git a/src/languages/en.json b/src/languages/en.json index 10cad11..9e07e64 100644 --- a/src/languages/en.json +++ b/src/languages/en.json @@ -139,5 +139,6 @@ "tasks.actions.reject.title": "Good job!", "tasks.actions.accept.message": "Task Accepted", "tasks.actions.reject.message": "Task Rejected", - "tasks.actions.reject.explanation.label": "Rejection explanation" + "tasks.actions.reject.explanation.label": "Rejection explanation", + "tasks.add_member.accept.select_role": "Select Roles:" } diff --git a/src/languages/pt.json b/src/languages/pt.json index d481e68..514ef0d 100644 --- a/src/languages/pt.json +++ b/src/languages/pt.json @@ -142,5 +142,6 @@ "tasks.actions.reject.title": "Bom trabalho!", "tasks.actions.accept.message": "Tarefa Aceita", "tasks.actions.reject.message": "Tarefa Rejeitada", - "tasks.actions.reject.explanation.label": "Motivo da rejeição" + "tasks.actions.reject.explanation.label": "Motivo da rejeição", + "tasks.add_member.accept.select_role": "Selecionar papéis:" } -- libgit2 0.21.2