From 7309dec7eb553f6697496fd8364618aab1854db1 Mon Sep 17 00:00:00 2001 From: Victor Costa Date: Wed, 13 Jul 2016 14:28:16 -0300 Subject: [PATCH] Add button to join in community --- src/app/layout/blocks/profile-image/profile-image-block.component.spec.ts | 46 +++++++++++++++++++++++++++++++++++++++++++++- src/app/layout/blocks/profile-image/profile-image-block.component.ts | 37 +++++++++++++++++++++++++++++++++++++ src/app/layout/blocks/profile-image/profile-image-block.html | 4 ++++ src/languages/en.json | 4 ++++ src/languages/pt.json | 4 ++++ src/lib/ng-noosfero-api/http/profile.service.spec.ts | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib/ng-noosfero-api/http/profile.service.ts | 25 +++++++++++++++++++++++++ 7 files changed, 169 insertions(+), 1 deletion(-) diff --git a/src/app/layout/blocks/profile-image/profile-image-block.component.spec.ts b/src/app/layout/blocks/profile-image/profile-image-block.component.spec.ts index 42bf07a..cf12c12 100644 --- a/src/app/layout/blocks/profile-image/profile-image-block.component.spec.ts +++ b/src/app/layout/blocks/profile-image/profile-image-block.component.spec.ts @@ -15,11 +15,18 @@ describe("Components", () => { beforeEach(angular.mock.module("templates")); + let profileService = jasmine.createSpyObj("ProfileService", ["isMember", "addMember", "removeMember"]); + profileService.isMember = jasmine.createSpy("isMember").and.returnValue(Promise.resolve(false)); + @Component({ selector: 'test-container-component', template: htmlTemplate, directives: [ProfileImageBlockComponent], - providers: helpers.provideFilters("translateFilter") + providers: [ + helpers.createProviderToValue('SessionService', helpers.mocks.sessionWithCurrentUser({})), + helpers.createProviderToValue('ProfileService', profileService), + helpers.createProviderToValue('NotificationService', helpers.mocks.notificationService) + ].concat(helpers.provideFilters("translateFilter")) }) class BlockContainerComponent { block = { type: 'Block' }; @@ -42,5 +49,42 @@ describe("Components", () => { }); }); + it("display button to join community", (done: Function) => { + helpers.tcb.createAsync(BlockContainerComponent).then(fixture => { + let elProfile = fixture.debugElement.componentViewChildren[0]; + expect(elProfile.query('.actions .join').length).toEqual(1); + done(); + }); + }); + + it("display button to leave community", (done: Function) => { + helpers.tcb.createAsync(BlockContainerComponent).then(fixture => { + let elProfile = fixture.debugElement.componentViewChildren[0]; + elProfile.componentInstance['isMember'] = true; + fixture.detectChanges(); + expect(elProfile.query('.actions .leave').length).toEqual(1); + done(); + }); + }); + + it("join community", (done: Function) => { + helpers.tcb.createAsync(BlockContainerComponent).then(fixture => { + let elProfile = fixture.debugElement.componentViewChildren[0]; + profileService.addMember = jasmine.createSpy("addMember").and.returnValue(Promise.resolve({ data: {} })); + elProfile.componentInstance.join(); + expect(profileService.addMember).toHaveBeenCalled(); + done(); + }); + }); + + it("leave community", (done: Function) => { + helpers.tcb.createAsync(BlockContainerComponent).then(fixture => { + let elProfile = fixture.debugElement.componentViewChildren[0]; + profileService.removeMember = jasmine.createSpy("removeMember").and.returnValue(Promise.resolve({ data: {} })); + elProfile.componentInstance.leave(); + expect(profileService.removeMember).toHaveBeenCalled(); + done(); + }); + }); }); }); diff --git a/src/app/layout/blocks/profile-image/profile-image-block.component.ts b/src/app/layout/blocks/profile-image/profile-image-block.component.ts index d82e600..0f94c83 100644 --- a/src/app/layout/blocks/profile-image/profile-image-block.component.ts +++ b/src/app/layout/blocks/profile-image/profile-image-block.component.ts @@ -1,14 +1,51 @@ import {Inject, Input, Component} from "ng-forward"; import {ProfileImageComponent} from "./../../../profile/image/image.component"; +import {ProfileService} from "../../../../lib/ng-noosfero-api/http/profile.service"; +import {SessionService} from "./../../../login"; +import {NotificationService} from "../../../shared/services/notification.service"; @Component({ selector: "noosfero-profile-image-block", templateUrl: 'app/layout/blocks/profile-image/profile-image-block.html', directives: [ProfileImageComponent] }) +@Inject(ProfileService, SessionService, NotificationService) export class ProfileImageBlockComponent { @Input() block: noosfero.Block; @Input() owner: noosfero.Profile; + private isMember: boolean; + + constructor(private profileService: ProfileService, private session: SessionService, private notificationService: NotificationService) { + } + + ngOnInit() { + this.loadMembership(); + } + + loadMembership() { + let person = this.session.currentUser() ? this.session.currentUser().person : null; + this.profileService.isMember(person, this.owner).then((val: boolean) => { + this.isMember = val; + }); + } + + join() { + let person = this.session.currentUser() ? this.session.currentUser().person : null; + this.profileService.addMember(person, this.owner).then((result: any) => { + if (result.data.pending) { + this.notificationService.success({ title: "blocks.profile_image.join.moderation.title", message: "blocks.profile_image.join.moderation.message" }); + } else { + this.loadMembership(); + } + }); + } + + leave() { + let person = this.session.currentUser() ? this.session.currentUser().person : null; + this.profileService.removeMember(person, this.owner).then(() => { + this.loadMembership(); + }); + } } diff --git a/src/app/layout/blocks/profile-image/profile-image-block.html b/src/app/layout/blocks/profile-image/profile-image-block.html index f9159e3..9750d52 100644 --- a/src/app/layout/blocks/profile-image/profile-image-block.html +++ b/src/app/layout/blocks/profile-image/profile-image-block.html @@ -3,4 +3,8 @@ {{"blocks.profile_image.control_panel" | translate}} +
+ {{"blocks.profile_image.join" | translate}} + {{"blocks.profile_image.leave" | translate}} +
diff --git a/src/languages/en.json b/src/languages/en.json index ec23074..686ece6 100644 --- a/src/languages/en.json +++ b/src/languages/en.json @@ -1,6 +1,10 @@ { "noosfero.name" : "Noosfero", "blocks.profile_image.control_panel": "Control Panel", + "blocks.profile_image.join": "Join community", + "blocks.profile_image.leave": "Leave community", + "blocks.profile_image.join.moderation.title": "Good job!", + "blocks.profile_image.join.moderation.message": "Your membership is waiting for approval", "navbar.profile": "Profile", "navbar.settings": "Settings", "navbar.logout": "Log Out", diff --git a/src/languages/pt.json b/src/languages/pt.json index 3676b51..fa9b78b 100644 --- a/src/languages/pt.json +++ b/src/languages/pt.json @@ -1,6 +1,10 @@ { "noosfero.name" : "Noosfero", "blocks.profile_image.control_panel": "Painel de Controle", + "blocks.profile_image.join": "Entrar na comunidade", + "blocks.profile_image.leave": "Sair da comunidade", + "blocks.profile_image.join.moderation.title": "Bom trabalho!", + "blocks.profile_image.join.moderation.message": "Sua participação está pendente de aprovação", "navbar.profile": "Perfil", "navbar.settings": "Configurações", "navbar.logout": "Sair", diff --git a/src/lib/ng-noosfero-api/http/profile.service.spec.ts b/src/lib/ng-noosfero-api/http/profile.service.spec.ts index 5548cd4..4615c5a 100644 --- a/src/lib/ng-noosfero-api/http/profile.service.spec.ts +++ b/src/lib/ng-noosfero-api/http/profile.service.spec.ts @@ -111,6 +111,56 @@ describe("Services", () => { }); $httpBackend.flush(); }); + + it("should return the profile members", (done) => { + let profileId = 1; + $httpBackend.expectGET(`/api/v1/profiles/${profileId}/members`).respond(200, { people: [{ id: 2 }] }); + profileService.getMembers({ id: profileId }).then((response: restangular.IResponse) => { + expect(response.data.people).toEqual([{ id: 2 }]); + done(); + }); + $httpBackend.flush(); + }); + + it("should return true if the person is a profile member", (done) => { + let profileId = 1; + $httpBackend.expectGET(`/api/v1/profiles/${profileId}/members`).respond(200, { people: [{ id: 2 }] }); + profileService.isMember({ id: 2 }, { id: profileId }).then((response: restangular.IResponse) => { + expect(response).toEqual(true); + done(); + }); + $httpBackend.flush(); + }); + + it("should return false if the person is a profile member", (done) => { + let profileId = 1; + $httpBackend.expectGET(`/api/v1/profiles/${profileId}/members`).respond(200, { people: [] }); + profileService.isMember({ id: 2 }, { id: profileId }).then((response: restangular.IResponse) => { + expect(response).toEqual(false); + done(); + }); + $httpBackend.flush(); + }); + + it("should add member to profile", (done) => { + let profileId = 1; + $httpBackend.expectPOST(`/api/v1/profiles/${profileId}/members`).respond(200, { pending: false }); + profileService.addMember({ id: 2 }, { id: profileId }).then((response: restangular.IResponse) => { + expect(response.data.pending).toEqual(false); + done(); + }); + $httpBackend.flush(); + }); + + it("should remove member from profile", (done) => { + let profileId = 1; + $httpBackend.expectDELETE(`/api/v1/profiles/${profileId}/members`).respond(200, { person: { id: 2 } }); + profileService.removeMember({ id: 2 }, { id: profileId }).then((response: restangular.IResponse) => { + expect(response.data.person).toEqual({ id: 2 }); + done(); + }); + $httpBackend.flush(); + }); }); diff --git a/src/lib/ng-noosfero-api/http/profile.service.ts b/src/lib/ng-noosfero-api/http/profile.service.ts index cd19c18..0b463db 100644 --- a/src/lib/ng-noosfero-api/http/profile.service.ts +++ b/src/lib/ng-noosfero-api/http/profile.service.ts @@ -64,4 +64,29 @@ export class ProfileService { let headers = { 'Content-Type': 'application/json' }; return this.get(profile.id).customPOST({ profile: profile }, null, null, headers); } + + getMembers(profile: noosfero.Profile, params?: any) { + let p = this.get(profile.id); + return p.customGET('members', params); + } + + isMember(person: noosfero.Person, profile: noosfero.Profile) { + let deferred = this.$q.defer(); + if (person) { + this.getMembers(profile, { identifier: person.identifier }).then((result: any) => { + deferred.resolve(result.data.people.length > 0); + }); + } else { + deferred.resolve(false); + } + return deferred.promise; + } + + addMember(person: noosfero.Person, profile: noosfero.Profile) { + return this.get(profile.id).customPOST({}, "members", null, null); + } + + removeMember(person: noosfero.Person, profile: noosfero.Profile) { + return this.get(profile.id).customDELETE("members", null, null); + } } -- libgit2 0.21.2