Merge Request #35

Merged
noosfero-themes/angular-theme!35
Created by Ábner Oliveira

Change environment name

Updated to shows the EnvironmentName dinamically on the navbar component.

Some changes were made to bring the request to the api to return the environment to the @StateConfig resolve function of the mainComponent.

Milestone: 2016.05

Merged by Carlos Purificação

Source branch has been removed
Commits (2)
2 participants
src/app/article/comment/comments.component.ts
... ... @@ -36,7 +36,7 @@ export class CommentsComponent {
36 36 comment.__show_reply = false;
37 37 if (comment.reply_of) {
38 38 this.comments.forEach((commentOnList) => {
39   - if (commentOnList.id == comment.reply_of.id) {
  39 + if (commentOnList.id === comment.reply_of.id) {
40 40 if (commentOnList.replies) {
41 41 commentOnList.replies.push(comment);
42 42 } else {
... ...
src/app/environment/environment-home.component.ts
... ... @@ -22,7 +22,7 @@ export class EnvironmentHomeComponent {
22 22 environment: noosfero.Environment;
23 23  
24 24 constructor(private environmentService: EnvironmentService, private $sce: ng.ISCEService) {
25   - environmentService.getByIdentifier("default").then((result: noosfero.Environment) => {
  25 + environmentService.get().then((result: noosfero.Environment) => {
26 26 this.environment = result;
27 27 });
28 28 }
... ...
src/app/environment/environment.component.spec.ts
... ... @@ -9,6 +9,7 @@ describe("Components", () => {
9 9 let environmentServiceMock: any;
10 10 let notificationMock: any;
11 11 let $state: any;
  12 + let defaultEnvironment = <any> {id: 1, name: 'Noosfero' };
12 13  
13 14 beforeEach(inject((_$rootScope_: ng.IRootScopeService, _$q_: ng.IQService) => {
14 15 $rootScope = _$rootScope_;
... ... @@ -17,44 +18,40 @@ describe(&quot;Components&quot;, () =&gt; {
17 18  
18 19 beforeEach(() => {
19 20 $state = jasmine.createSpyObj("$state", ["transitionTo"]);
20   - environmentServiceMock = jasmine.createSpyObj("environmentServiceMock", ["getByIdentifier", "getBoxes"]);
  21 + environmentServiceMock = jasmine.createSpyObj("environmentServiceMock", ["get", "getBoxes"]);
21 22 notificationMock = jasmine.createSpyObj("notificationMock", ["error"]);
22 23  
23   - let environmentResponse = $q.defer();
24   - environmentResponse.resolve({ id: 1 });
25 24 let getBoxesResponse = $q.defer();
26 25 getBoxesResponse.resolve({ data: { boxes: [{ id: 2 }] } });
27 26  
28   - environmentServiceMock.getByIdentifier = jasmine.createSpy('getByIdentifier').and.returnValue(environmentResponse.promise);
29 27 environmentServiceMock.getBoxes = jasmine.createSpy("getBoxes").and.returnValue(getBoxesResponse.promise);
30 28 });
31 29  
32 30 it("get the default environment", done => {
33   - let component: EnvironmentComponent = new EnvironmentComponent(environmentServiceMock, $state, notificationMock);
  31 + let component: EnvironmentComponent = new EnvironmentComponent(environmentServiceMock, $state, notificationMock, defaultEnvironment);
34 32 $rootScope.$apply();
35   - expect(component.environment).toEqual({ id: 1 });
  33 + expect(component.environment).toEqual({ id: 1, name: 'Noosfero' });
36 34 done();
37 35 });
38 36  
39 37 it("get the environment boxes", done => {
40   - let component: EnvironmentComponent = new EnvironmentComponent(environmentServiceMock, $state, notificationMock);
  38 + let component: EnvironmentComponent = new EnvironmentComponent(environmentServiceMock, $state, notificationMock, defaultEnvironment);
41 39 $rootScope.$apply();
42 40 expect(environmentServiceMock.getBoxes).toHaveBeenCalled();
43 41 expect(component.boxes).toEqual({ data: { boxes: [{ id: 2 }] } });
44 42 done();
45 43 });
46 44  
47   - it("display notification error when the environment wasn't found", done => {
  45 + it("display notification error when does not find boxes to the environment", done => {
48 46 let environmentResponse = $q.defer();
49 47 environmentResponse.reject();
50 48  
51   - environmentServiceMock.getByIdentifier = jasmine.createSpy('getByIdentifier').and.returnValue(environmentResponse.promise);
  49 + environmentServiceMock.getBoxes = jasmine.createSpy('getBoxes').and.returnValue(environmentResponse.promise);
52 50  
53   - let component: EnvironmentComponent = new EnvironmentComponent(environmentServiceMock, $state, notificationMock);
  51 + let component: EnvironmentComponent = new EnvironmentComponent(environmentServiceMock, $state, notificationMock, defaultEnvironment);
54 52 $rootScope.$apply();
55 53  
56 54 expect(notificationMock.error).toHaveBeenCalled();
57   - expect(component.environment).toBeUndefined();
58 55 done();
59 56 });
60 57  
... ...
src/app/environment/environment.component.ts
... ... @@ -31,21 +31,23 @@ import {EnvironmentHomeComponent} from &quot;./environment-home.component&quot;;
31 31 }
32 32 }
33 33 ])
34   -@Inject(EnvironmentService, "$state")
  34 +@Inject(EnvironmentService, "$state", "currentEnvironment")
35 35 export class EnvironmentComponent {
36 36  
37 37 boxes: noosfero.Box[];
38 38 environment: noosfero.Environment;
39 39  
40   - constructor(environmentService: EnvironmentService, $state: ng.ui.IStateService, notificationService: NotificationService) {
41   - let boxesPromisse = environmentService.getByIdentifier("default").then((environment: noosfero.Environment) => {
42   - this.environment = environment;
43   - return environmentService.getBoxes(this.environment.id);
44   - }).then((boxes: noosfero.Box[]) => {
45   - this.boxes = boxes;
46   - }).catch(() => {
47   - $state.transitionTo('main');
48   - notificationService.error({ message: "notification.environment.not_found" });
49   - });
  40 + constructor(private environmentService: EnvironmentService, private $state: ng.ui.IStateService, private notificationService: NotificationService, currentEnvironment: noosfero.Environment) {
  41 + this.environment = currentEnvironment;
  42 +
  43 + this.environmentService.getBoxes(this.environment.id)
  44 + .then((boxes: noosfero.Box[]) => {
  45 + this.boxes = boxes;
  46 + }).catch(() => {
  47 + this.$state.transitionTo('main');
  48 + this.notificationService.error({ message: "notification.environment.not_found" });
  49 + });
  50 +
50 51 }
  52 +
51 53 }
... ...
src/app/layout/navbar/navbar.html
... ... @@ -7,7 +7,7 @@
7 7 </button>
8 8 <a class="navbar-brand" ui-sref="main.environment.home">
9 9 <span class="noosfero-logo"> </span>
10   - <span class="noosfero-name">{{"noosfero.name" | translate}}</span>
  10 + <span class="noosfero-name">{{ ctrl.currentEnvironment.name }}</span>
11 11 </a>
12 12 </div>
13 13  
... ...
src/app/layout/navbar/navbar.spec.ts
... ... @@ -69,6 +69,11 @@ describe(&quot;Components&quot;, () =&gt; {
69 69 AuthEvents
70 70 }
71 71 }),
  72 + provide('EnvironmentService', {
  73 + useValue: {
  74 + getCurrentEnviroment: () => { return { id: 1, name: 'Nosofero' }; }
  75 + }
  76 + }),
72 77 provide('TranslatorService', {
73 78 useValue: helpers.mocks.translatorService
74 79 })
... ...
src/app/layout/navbar/navbar.ts
1 1 import {Component, Inject, EventEmitter, Input} from "ng-forward";
2 2 import {LanguageSelectorComponent} from "../language-selector/language-selector.component";
3 3 import {SessionService, AuthService, AuthController, AuthEvents} from "./../../login";
  4 +import {EnvironmentService} from "./../../../lib/ng-noosfero-api/http/environment.service";
4 5 import {SidebarNotificationService} from "../sidebar/sidebar.notification.service";
5 6 import {BodyStateClassesService} from '../services/body-state-classes.service';
6 7  
... ... @@ -8,15 +9,15 @@ import {BodyStateClassesService} from &#39;../services/body-state-classes.service&#39;;
8 9 selector: "acme-navbar",
9 10 templateUrl: "app/layout/navbar/navbar.html",
10 11 directives: [LanguageSelectorComponent],
11   - providers: [AuthService, SessionService, SidebarNotificationService]
  12 + providers: [AuthService, SessionService, SidebarNotificationService, EnvironmentService]
12 13 })
13   -@Inject("$uibModal", AuthService, "SessionService", "$state", SidebarNotificationService, BodyStateClassesService)
  14 +@Inject("$uibModal", AuthService, "SessionService", "$state", SidebarNotificationService, BodyStateClassesService, EnvironmentService)
14 15 export class Navbar {
15 16  
16 17 private currentUser: noosfero.User;
17 18 private modalInstance: any = null;
18   -
19 19 public showHamburguer: boolean = false;
  20 + public currentEnvironment: noosfero.Environment = <any>{ name: '' };
20 21  
21 22 /**
22 23 *
... ... @@ -27,9 +28,11 @@ export class Navbar {
27 28 private session: SessionService,
28 29 private $state: ng.ui.IStateService,
29 30 private sidebarNotificationService: SidebarNotificationService,
30   - private bodyStateService: BodyStateClassesService
  31 + private bodyStateService: BodyStateClassesService,
  32 + private environmentService: EnvironmentService
31 33 ) {
32 34 this.currentUser = this.session.currentUser();
  35 + this.currentEnvironment = environmentService.getCurrentEnviroment();
33 36  
34 37 this.showHamburguer = this.authService.isAuthenticated();
35 38 this.bodyStateService.addContentClass(!this.sidebarNotificationService.sidebarVisible);
... ...
src/app/main/main.component.spec.ts 0 → 100644
... ... @@ -0,0 +1,81 @@
  1 +
  2 +import { provide, Component, componentStore, bundleStore } from "ng-forward";
  3 +import {MainComponent} from "./main.component";
  4 +import {TestComponentBuilder, ComponentFixture} from "ng-forward/cjs/testing/test-component-builder";
  5 +
  6 +import {quickCreateComponent} from "./../../spec/helpers";
  7 +
  8 +describe("MainComponent", function () {
  9 +
  10 + let localFixture: ComponentFixture;
  11 + let $state: angular.ui.IStateService;
  12 + let $q: ng.IQService;
  13 + let authService: any = jasmine.createSpyObj("authService", ["loginFromCookie"]);
  14 + let environmentService: any = jasmine.createSpyObj("environmentService", ["get"]);
  15 +
  16 + beforeEach(angular.mock.module("ui.router"));
  17 + beforeEach(angular.mock.module("templates"));
  18 +
  19 + @Component({
  20 + selector: "parent",
  21 + template: "<main></main>",
  22 + directives: [MainComponent],
  23 + providers: [
  24 + provide("AuthService",
  25 + {
  26 + useValue: authService
  27 + }),
  28 +
  29 + provide("EnvironmentService",
  30 + {
  31 + useValue: environmentService
  32 + }),
  33 + ]
  34 + })
  35 + class MainComponentParent {
  36 + constructor() {
  37 +
  38 + }
  39 + }
  40 +
  41 + beforeEach(() => {
  42 + authService.loginFromCookie = jasmine.createSpy("loginFromCookie").and.returnValue({ id: 1, name: "user1" });
  43 + environmentService.get = jasmine.createSpy("get").and.returnValue({ id: 1, name: "Noosfero Default Environment" });
  44 + });
  45 +
  46 + it("renders the main component only when the login and environment were resolved", (done) => {
  47 + quickCreateComponent({ directives: [MainComponentParent], template: "<parent></parent>" })
  48 + .then((fixture) => {
  49 + localFixture = fixture;
  50 + // get the $state service to navigate between routes
  51 + $state = fixture.debugElement.getLocal("$state");
  52 + // navigates to the environment home
  53 + $state.go("main.environment.home");
  54 + localFixture.detectChanges();
  55 + // after changes were detected it checks the current $state route
  56 + expect($state.current.name).toEqual("main.environment.home");
  57 + done();
  58 + });
  59 +
  60 + });
  61 +
  62 + it("does not render the main component when get error loading the environment", (done) => {
  63 + quickCreateComponent({ directives: [MainComponentParent], template: "<parent></parent>" })
  64 + .then((fixture) => {
  65 + localFixture = fixture;
  66 + // get the $state service to navigate between routes
  67 + $state = fixture.debugElement.getLocal("$state");
  68 + // get the $q service to create a rejected promise
  69 + $q = fixture.debugElement.getLocal("$q");
  70 + // mock the environmentService to force a rejected promise
  71 + environmentService.get = jasmine.createSpy("get").and.returnValue($q.reject("Error simulated"));
  72 + // tries to navigate to the environment home
  73 + $state.go("main.environment.home");
  74 + localFixture.detectChanges();
  75 + // after the changes were detected the state remains '' because the environment could not be loaded
  76 + expect($state.current.name).toEqual("");
  77 + done();
  78 + });
  79 +
  80 + });
  81 +});
... ...
src/app/main/main.component.ts
... ... @@ -28,7 +28,7 @@ import {DateFormat} from &quot;../shared/pipes/date-format.filter&quot;;
28 28  
29 29 import {AuthService} from "../login/auth.service";
30 30 import {SessionService} from "../login/session.service";
31   -
  31 +import {EnvironmentService} from "./../../lib/ng-noosfero-api/http/environment.service";
32 32 import {NotificationService} from "../shared/services/notification.service";
33 33  
34 34 import {BodyStateClassesService} from "./../layout/services/body-state-classes.service";
... ... @@ -114,6 +114,9 @@ export class EnvironmentContent {
114 114 resolve: {
115 115 currentUser: function(AuthService: AuthService) {
116 116 return AuthService.loginFromCookie();
  117 + },
  118 + currentEnvironment: function(EnvironmentService: EnvironmentService) {
  119 + return EnvironmentService.get();
117 120 }
118 121 }
119 122 },
... ...
src/lib/ng-noosfero-api/http/environment.service.ts
... ... @@ -4,12 +4,16 @@ import { Injectable, Inject } from &quot;ng-forward&quot;;
4 4 @Inject("Restangular", "$q")
5 5 export class EnvironmentService {
6 6  
7   - private _currentEnvironmentPromise: ng.IDeferred<noosfero.Environment>;
8 7  
  8 + private currentEnvironment: noosfero.Environment = null;
9 9 constructor(private restangular: restangular.IService, private $q: ng.IQService) {
10 10  
11 11 }
12 12  
  13 + getCurrentEnviroment(): noosfero.Environment {
  14 + return this.currentEnvironment;
  15 + }
  16 +
13 17 getEnvironmentPeople(params: any): ng.IPromise<noosfero.Person[]> {
14 18 let p = this.restangular.one('people').get(params);
15 19 let deferred = this.$q.defer<noosfero.Person[]>();
... ... @@ -18,10 +22,19 @@ export class EnvironmentService {
18 22 return deferred.promise;
19 23 }
20 24  
21   - getByIdentifier(identifier: string): ng.IPromise<noosfero.Environment> {
  25 + get(identifier: string = 'default'): ng.IPromise<noosfero.Environment> {
22 26 let p = this.restangular.one('environment').customGET(identifier);
23 27 let deferred = this.$q.defer<noosfero.Environment>();
24   - p.then(this.getHandleSuccessFunction<noosfero.Environment>(deferred));
  28 + if (identifier === 'default') {
  29 + p.then((response) => {
  30 + let data = this.restangular.stripRestangular(response.data);
  31 + this.currentEnvironment = data;
  32 + this.getHandleSuccessFunction<noosfero.Environment>(deferred).bind(this)(response);
  33 + });
  34 + } else {
  35 + p.then(this.getHandleSuccessFunction<noosfero.Environment>(deferred));
  36 + }
  37 +
25 38 p.catch(this.getHandleErrorFunction<noosfero.Environment>(deferred));
26 39 return deferred.promise;
27 40 }
... ... @@ -37,7 +50,7 @@ export class EnvironmentService {
37 50 /** TODO - Please, use the base class RestangularService
38 51 * (description)
39 52 *
40   - * @template T
  53 + * @template T_currentEnvironmentPromise
41 54 * @param {ng.IDeferred<T>} deferred (description)
42 55 * @returns {(response: restangular.IResponse) => void} (description)
43 56 */
... ...