Commit 12120fb18df30f29b66558c25c6fcb346585acce

Authored by ABNER SILVA DE OLIVEIRA
2 parents bf8b50ac f3a9c42c

merge with ngforward

src/app/components/language-selector/language-selector.component.spec.ts
... ... @@ -11,16 +11,16 @@ describe("Components", () => {
11 11  
12 12 beforeEach(angular.mock.module("templates"));
13 13  
14   - let languageService: any;
  14 + let translatorService: any;
15 15  
16 16 let buildComponent = (): Promise<ComponentFixture> => {
17   - languageService = jasmine.createSpyObj("languageService", ["availableLanguages", "currentLanguage"]);
  17 + translatorService = jasmine.createSpyObj("translatorService", ["availableLanguages", "currentLanguage"])
18 18 return helpers.quickCreateComponent({
19 19 template: "<language-selector></language-selector>",
20 20 directives: [LanguageSelector],
21 21 providers: [
22   - provide('LanguageService', {
23   - useValue: languageService
  22 + provide('TranslatorService', {
  23 + useValue: translatorService
24 24 })
25 25 ].concat(helpers.provideFilters("translateFilter"))
26 26 });
... ... @@ -34,5 +34,13 @@ describe(&quot;Components&quot;, () =&gt; {
34 34 });
35 35 });
36 36  
  37 + it("call the translator service when change the language", (done) => {
  38 + let translatorService = jasmine.createSpyObj("translatorService", ["changeLanguage"]);
  39 + let languageSelector = new LanguageSelector(<any>translatorService);
  40 + languageSelector.changeLanguage("en");
  41 + expect(translatorService.changeLanguage).toHaveBeenCalledWith("en");
  42 + done();
  43 + });
  44 +
37 45 });
38 46 });
... ...
src/app/components/language-selector/language-selector.component.ts
1 1 import {Component, Inject} from "ng-forward";
2   -import {LanguageService} from "./language.service";
  2 +import {TranslatorService} from "../translator/translator.service";
3 3  
4 4 @Component({
5 5 selector: "language-selector",
6 6 templateUrl: "app/components/language-selector/language-selector.html"
7 7 })
8   -@Inject(LanguageService)
  8 +@Inject(TranslatorService)
9 9 export class LanguageSelector {
10 10  
11   - constructor(private languageService: LanguageService) { }
  11 + constructor(private translatorService: TranslatorService) { }
12 12  
13 13 currentLanguage() {
14   - return this.languageService.currentLanguage();
  14 + return this.translatorService.currentLanguage();
15 15 }
16 16  
17 17 changeLanguage(language: string) {
18   - this.languageService.changeLanguage(language);
  18 + this.translatorService.changeLanguage(language);
19 19 }
20 20  
21 21 availableLanguages() {
22   - return this.languageService.availableLanguages;
  22 + return this.translatorService.availableLanguages;
23 23 }
24 24 }
... ...
src/app/components/language-selector/language.service.spec.ts
... ... @@ -1,61 +0,0 @@
1   -import {ComponentFixture} from 'ng-forward/cjs/testing/test-component-builder';
2   -import {provide} from 'ng-forward';
3   -
4   -import {LanguageService} from './language.service';
5   -
6   -import * as helpers from "../../../spec/helpers";
7   -
8   -describe("Services", () => {
9   -
10   - describe("Language Service", () => {
11   -
12   - let $rootScope: ng.IScope;
13   - let $q: ng.IQService;
14   -
15   - beforeEach(inject((_$rootScope_: ng.IRootScopeService, _$q_: ng.IQService) => {
16   - $rootScope = _$rootScope_;
17   - $q = _$q_;
18   - }));
19   -
20   - it("set available languages when change language", (done) => {
21   - let component: LanguageService = new LanguageService(
22   - <any>helpers.mocks.$translate,
23   - <any>helpers.mocks.tmhDynamicLocale,
24   - <any>helpers.mocks.amMoment,
25   - <any>helpers.mocks.angularLoad,
26   - helpers.mocks.scopeWithEvents
27   - );
28   - component.availableLanguages = null;
29   - expect(component.availableLanguages).toBeNull();
30   - component.changeLanguage('en');
31   - expect(component.availableLanguages).toBeDefined();
32   - done();
33   - });
34   -
35   - it("change the language", (done) => {
36   - let component: LanguageService = new LanguageService(
37   - <any>helpers.mocks.$translate,
38   - <any>helpers.mocks.tmhDynamicLocale,
39   - <any>helpers.mocks.amMoment,
40   - <any>helpers.mocks.angularLoad,
41   - helpers.mocks.scopeWithEvents
42   - );
43   - let loadScripPromise = $q.defer();
44   - loadScripPromise.resolve();
45   - component["angularLoad"].loadScript = jasmine.createSpy("loadScript").and.returnValue(loadScripPromise.promise);
46   - component["tmhDynamicLocale"].set = jasmine.createSpy("set");
47   - component["tmhDynamicLocale"].get = jasmine.createSpy("get").and.returnValue("en");
48   - component["$translate"].use = jasmine.createSpy("use");
49   -
50   - component.changeLanguage('pt');
51   - $rootScope.$digest();
52   -
53   - expect(component["angularLoad"].loadScript).toHaveBeenCalledWith("/bower_components/moment/locale/pt.js");
54   - expect(component["angularLoad"].loadScript).toHaveBeenCalledWith("/bower_components/messageformat/locale/pt.js");
55   - expect(component["tmhDynamicLocale"].set).toHaveBeenCalledWith("pt");
56   - expect(component["$translate"].use).toHaveBeenCalledWith("pt");
57   - done();
58   - });
59   -
60   - });
61   -});
src/app/components/language-selector/language.service.ts
... ... @@ -1,59 +0,0 @@
1   -import {Injectable, Inject} from "ng-forward";
2   -
3   -@Injectable()
4   -@Inject("$translate", "tmhDynamicLocale", "amMoment", "angularLoad", "$rootScope")
5   -export class LanguageService {
6   -
7   - availableLanguages: any;
8   -
9   - constructor(private $translate: angular.translate.ITranslateService,
10   - private tmhDynamicLocale: angular.dynamicLocale.tmhDynamicLocaleService,
11   - private amMoment: any,
12   - private angularLoad: any,
13   - private $rootScope: any) {
14   -
15   - this.configAvailableLanguages();
16   - this.$rootScope.$on("$localeChangeSuccess", () => {
17   - this.changeLanguage(tmhDynamicLocale.get() || $translate.use());
18   - });
19   - }
20   -
21   - currentLanguage() {
22   - return this.$translate.use();
23   - }
24   -
25   - changeLanguage(language: string) {
26   - if (!language) {
27   - console.log("WARN: language undefined");
28   - return;
29   - }
30   - this.changeMomentLocale(language);
31   - this.tmhDynamicLocale.set(language);
32   - this.angularLoad.loadScript(`/bower_components/messageformat/locale/${language}.js`).then(() => {
33   - return this.$translate.use(language);
34   - }).then(() => {
35   - this.configAvailableLanguages();
36   - });
37   - }
38   -
39   - translate(text: string) {
40   - return this.$translate.instant(text);
41   - }
42   -
43   - private configAvailableLanguages() {
44   - this.availableLanguages = {
45   - "en": this.$translate.instant("language.en"),
46   - "pt": this.$translate.instant("language.pt")
47   - };
48   - }
49   -
50   - private changeMomentLocale(language: string) {
51   - let localePromise = Promise.resolve();
52   - if (language !== "en") {
53   - localePromise = this.angularLoad.loadScript(`/bower_components/moment/locale/${language}.js`);
54   - }
55   - localePromise.then(() => {
56   - this.amMoment.changeLocale(language);
57   - });
58   - }
59   -}
src/app/components/navbar/navbar.spec.ts
... ... @@ -71,8 +71,8 @@ describe(&quot;Components&quot;, () =&gt; {
71 71 AUTH_EVENTS
72 72 }
73 73 }),
74   - provide('LanguageService', {
75   - useValue: helpers.mocks.languageService
  74 + provide('TranslatorService', {
  75 + useValue: helpers.mocks.translatorService
76 76 })
77 77 ].concat(helpers.provideFilters("translateFilter")),
78 78 directives: [Navbar],
... ...
src/app/components/notification/notification.component.spec.ts
... ... @@ -13,11 +13,25 @@ describe(&quot;Components&quot;, () =&gt; {
13 13  
14 14 beforeEach(angular.mock.module("templates"));
15 15  
  16 + it("display an error message when notify an error", done => {
  17 + let sweetAlert = jasmine.createSpyObj("sweetAlert", ["swal"]);
  18 + sweetAlert.swal = jasmine.createSpy("swal");
  19 +
  20 + let component: Notification = new Notification(<any>helpers.mocks.$log, <any>sweetAlert, <any>helpers.mocks.translatorService);
  21 + component.error("message", "title");
  22 + expect(sweetAlert.swal).toHaveBeenCalledWith(jasmine.objectContaining({
  23 + text: "message",
  24 + title: "title",
  25 + type: "error"
  26 + }));
  27 + done();
  28 + });
  29 +
16 30 it("use the default message when call notification component without a message", done => {
17 31 let sweetAlert = jasmine.createSpyObj("sweetAlert", ["swal"]);
18 32 sweetAlert.swal = jasmine.createSpy("swal");
19 33  
20   - let component: Notification = new Notification(<any>helpers.mocks.$log, <any>sweetAlert, <any>helpers.mocks.languageService);
  34 + let component: Notification = new Notification(<any>helpers.mocks.$log, <any>sweetAlert, <any>helpers.mocks.translatorService);
21 35 component.error();
22 36 expect(sweetAlert.swal).toHaveBeenCalledWith(jasmine.objectContaining({
23 37 text: Notification.DEFAULT_ERROR_MESSAGE,
... ... @@ -30,7 +44,7 @@ describe(&quot;Components&quot;, () =&gt; {
30 44 let sweetAlert = jasmine.createSpyObj("sweetAlert", ["swal"]);
31 45 sweetAlert.swal = jasmine.createSpy("swal");
32 46  
33   - let component: Notification = new Notification(<any>helpers.mocks.$log, <any>sweetAlert, <any>helpers.mocks.languageService);
  47 + let component: Notification = new Notification(<any>helpers.mocks.$log, <any>sweetAlert, <any>helpers.mocks.translatorService);
34 48 component.success("title", "message", 1000);
35 49 expect(sweetAlert.swal).toHaveBeenCalledWith(jasmine.objectContaining({
36 50 type: "success"
... ... @@ -42,7 +56,7 @@ describe(&quot;Components&quot;, () =&gt; {
42 56 let sweetAlert = jasmine.createSpyObj("sweetAlert", ["swal"]);
43 57 sweetAlert.swal = jasmine.createSpy("swal");
44 58  
45   - let component: Notification = new Notification(<any>helpers.mocks.$log, <any>sweetAlert, <any>helpers.mocks.languageService);
  59 + let component: Notification = new Notification(<any>helpers.mocks.$log, <any>sweetAlert, <any>helpers.mocks.translatorService);
46 60 component.httpError(500, {});
47 61 expect(sweetAlert.swal).toHaveBeenCalledWith(jasmine.objectContaining({
48 62 text: "notification.http_error.500.message"
... ... @@ -54,7 +68,7 @@ describe(&quot;Components&quot;, () =&gt; {
54 68 let sweetAlert = jasmine.createSpyObj("sweetAlert", ["swal"]);
55 69 sweetAlert.swal = jasmine.createSpy("swal");
56 70  
57   - let component: Notification = new Notification(<any>helpers.mocks.$log, <any>sweetAlert, <any>helpers.mocks.languageService);
  71 + let component: Notification = new Notification(<any>helpers.mocks.$log, <any>sweetAlert, <any>helpers.mocks.translatorService);
58 72 component.success("title", "message");
59 73 expect(sweetAlert.swal).toHaveBeenCalledWith(jasmine.objectContaining({
60 74 type: "success",
... ...
src/app/components/notification/notification.component.ts
1 1 import {Injectable, Inject} from "ng-forward";
2   -import {LanguageService} from "../language-selector/language.service";
  2 +import {TranslatorService} from "../translator/translator.service";
3 3  
4 4 @Injectable()
5   -@Inject("$log", "SweetAlert", LanguageService)
  5 +@Inject("$log", "SweetAlert", TranslatorService)
6 6 export class Notification {
7 7  
8 8 constructor(
9 9 private $log: ng.ILogService,
10 10 private SweetAlert: any,
11   - private languageService: LanguageService
  11 + private translatorService: TranslatorService
12 12 ) { }
13 13  
14 14 public static DEFAULT_ERROR_TITLE = "notification.error.default.title";
... ... @@ -16,10 +16,10 @@ export class Notification {
16 16 public static DEFAULT_SUCCESS_TIMER = 1000;
17 17  
18 18 error(message: string = Notification.DEFAULT_ERROR_MESSAGE, title: string = Notification.DEFAULT_ERROR_TITLE) {
19   - this.$log.debug("Notification error:", title, message, this.languageService.currentLanguage());
  19 + this.$log.debug("Notification error:", title, message, this.translatorService.currentLanguage());
20 20 this.SweetAlert.swal({
21   - title: this.languageService.translate(title),
22   - text: this.languageService.translate(message),
  21 + title: this.translatorService.translate(title),
  22 + text: this.translatorService.translate(message),
23 23 type: "error"
24 24 });
25 25 }
... ...
src/app/components/translator/translator.service.spec.ts 0 → 100644
... ... @@ -0,0 +1,116 @@
  1 +import {ComponentFixture} from 'ng-forward/cjs/testing/test-component-builder';
  2 +import {provide} from 'ng-forward';
  3 +
  4 +import {TranslatorService} from './translator.service';
  5 +
  6 +import * as helpers from "../../../spec/helpers";
  7 +
  8 +describe("Services", () => {
  9 +
  10 + describe("Translator Service", () => {
  11 +
  12 + let $rootScope: ng.IScope;
  13 + let $q: ng.IQService;
  14 +
  15 + beforeEach(inject((_$rootScope_: ng.IRootScopeService, _$q_: ng.IQService) => {
  16 + $rootScope = _$rootScope_;
  17 + $q = _$q_;
  18 + }));
  19 +
  20 + function createComponent() {
  21 + return new TranslatorService(
  22 + <any>helpers.mocks.$translate,
  23 + <any>helpers.mocks.tmhDynamicLocale,
  24 + <any>helpers.mocks.amMoment,
  25 + <any>helpers.mocks.angularLoad,
  26 + $rootScope
  27 + );
  28 + }
  29 +
  30 + it("set available languages when change language", (done) => {
  31 + let component: TranslatorService = createComponent();
  32 + component.availableLanguages = null;
  33 + expect(component.availableLanguages).toBeNull();
  34 + $rootScope.$emit("$translateChangeSuccess");
  35 + expect(component.availableLanguages).not.toBeNull();
  36 + done();
  37 + });
  38 +
  39 + it("change the language", (done) => {
  40 + let component: TranslatorService = createComponent();
  41 + let loadScripPromise = $q.defer();
  42 + loadScripPromise.resolve();
  43 + component["angularLoad"].loadScript = jasmine.createSpy("loadScript").and.returnValue(loadScripPromise.promise);
  44 + component["tmhDynamicLocale"].set = jasmine.createSpy("set");
  45 + component["tmhDynamicLocale"].get = jasmine.createSpy("get").and.returnValue("en");
  46 + component["$translate"].use = jasmine.createSpy("use");
  47 +
  48 + component.changeLanguage('pt');
  49 + $rootScope.$digest();
  50 +
  51 + expect(component["angularLoad"].loadScript).toHaveBeenCalledWith("/bower_components/moment/locale/pt.js");
  52 + expect(component["angularLoad"].loadScript).toHaveBeenCalledWith("/bower_components/messageformat/locale/pt.js");
  53 + expect(component["tmhDynamicLocale"].set).toHaveBeenCalledWith("pt");
  54 + expect(component["$translate"].use).toHaveBeenCalledWith("pt");
  55 + done();
  56 + });
  57 +
  58 + it("do not load moment locale when change the language to english", (done) => {
  59 + let component: TranslatorService = createComponent();
  60 + component["angularLoad"].loadScript = jasmine.createSpy("loadScript").and.returnValue($q.defer().promise);
  61 + component.changeLanguage('en');
  62 + expect(component["angularLoad"].loadScript).not.toHaveBeenCalledWith("/bower_components/moment/locale/pt.js");
  63 + done();
  64 + });
  65 +
  66 + it("do nothing when call change language with null", (done) => {
  67 + let component: TranslatorService = createComponent();
  68 + component["angularLoad"].loadScript = jasmine.createSpy("loadScript");
  69 + component["tmhDynamicLocale"].set = jasmine.createSpy("set");
  70 + component["$translate"].use = jasmine.createSpy("use");
  71 +
  72 + component.changeLanguage(null);
  73 +
  74 + expect(component["angularLoad"].loadScript).not.toHaveBeenCalled();
  75 + expect(component["tmhDynamicLocale"].set).not.toHaveBeenCalled();
  76 + expect(component["$translate"].use).not.toHaveBeenCalled();
  77 + done();
  78 + });
  79 +
  80 + it("return the current language used by the translator", (done) => {
  81 + let component: TranslatorService = createComponent();
  82 + component["$translate"].use = jasmine.createSpy("use").and.returnValue("en");
  83 + expect(component.currentLanguage()).toEqual("en");
  84 + expect(component["$translate"].use).toHaveBeenCalled();
  85 + done();
  86 + });
  87 +
  88 + it("call translate service when translate a text", (done) => {
  89 + let component: TranslatorService = createComponent();
  90 + component["$translate"].instant = jasmine.createSpy("instant");
  91 + component.translate("text");
  92 + expect(component["$translate"].instant).toHaveBeenCalledWith("text");
  93 + done();
  94 + });
  95 +
  96 + it("change the language when receive an event", (done) => {
  97 + let component: TranslatorService = createComponent();
  98 + component.changeLanguage = jasmine.createSpy("changeLanguage");
  99 + $rootScope.$emit("$localeChangeSuccess");
  100 + expect(component.changeLanguage).toHaveBeenCalled();
  101 + done();
  102 + });
  103 +
  104 + it("use the translate language when receive a change language event and there is no language previously selected", (done) => {
  105 + let component: TranslatorService = createComponent();
  106 + component.changeLanguage = jasmine.createSpy("changeLanguage");
  107 + component["tmhDynamicLocale"].get = jasmine.createSpy("get").and.returnValue(null);
  108 + component["$translate"].use = jasmine.createSpy("use").and.returnValue("en");
  109 +
  110 + $rootScope.$emit("$localeChangeSuccess");
  111 + expect(component["$translate"].use).toHaveBeenCalled();
  112 + expect(component.changeLanguage).toHaveBeenCalledWith("en");
  113 + done();
  114 + });
  115 + });
  116 +});
... ...
src/app/components/translator/translator.service.ts 0 → 100644
... ... @@ -0,0 +1,59 @@
  1 +import {Injectable, Inject} from "ng-forward";
  2 +
  3 +@Injectable()
  4 +@Inject("$translate", "tmhDynamicLocale", "amMoment", "angularLoad", "$rootScope")
  5 +export class TranslatorService {
  6 +
  7 + availableLanguages: any;
  8 +
  9 + constructor(private $translate: angular.translate.ITranslateService,
  10 + private tmhDynamicLocale: angular.dynamicLocale.tmhDynamicLocaleService,
  11 + private amMoment: any,
  12 + private angularLoad: any,
  13 + private $rootScope: any) {
  14 +
  15 + this.$rootScope.$on("$localeChangeSuccess", () => {
  16 + this.changeLanguage(tmhDynamicLocale.get() || $translate.use());
  17 + });
  18 + this.$rootScope.$on("$translateChangeSuccess", () => {
  19 + this.configAvailableLanguages();
  20 + });
  21 + }
  22 +
  23 + currentLanguage() {
  24 + return this.$translate.use();
  25 + }
  26 +
  27 + changeLanguage(language: string) {
  28 + if (!language) {
  29 + console.log("WARN: language undefined");
  30 + return;
  31 + }
  32 + this.changeMomentLocale(language);
  33 + this.tmhDynamicLocale.set(language);
  34 + this.angularLoad.loadScript(`/bower_components/messageformat/locale/${language}.js`).then(() => {
  35 + return this.$translate.use(language);
  36 + });
  37 + }
  38 +
  39 + translate(text: string) {
  40 + return this.$translate.instant(text);
  41 + }
  42 +
  43 + private configAvailableLanguages() {
  44 + this.availableLanguages = {
  45 + "en": this.$translate.instant("language.en"),
  46 + "pt": this.$translate.instant("language.pt")
  47 + };
  48 + }
  49 +
  50 + private changeMomentLocale(language: string) {
  51 + let localePromise = Promise.resolve();
  52 + if (language !== "en") {
  53 + localePromise = this.angularLoad.loadScript(`/bower_components/moment/locale/${language}.js`);
  54 + }
  55 + localePromise.then(() => {
  56 + this.amMoment.changeLocale(language);
  57 + });
  58 + }
  59 +}
... ...
src/app/index.route.ts
... ... @@ -1,11 +0,0 @@
1   -
2   -
3   -/** @ngInject */
4   -export function routeConfig($stateProvider: ng.ui.IStateProvider, $urlRouterProvider: ng.ui.IUrlRouterProvider) {
5   - $stateProvider
6   - .state("main.profile.settings", {
7   - url: "^/myprofile/:profile"
8   - });
9   -
10   - $urlRouterProvider.otherwise("/");
11   -}
src/app/index.ts
1 1 import {NoosferoApp} from "./index.module";
2 2 import {noosferoModuleConfig} from "./index.config";
3 3 import {noosferoAngularRunBlock} from "./index.run";
4   -import {routeConfig} from "./index.route";
5 4  
6 5 import {Main} from "./main/main.component";
7 6 import {bootstrap, bundle} from "ng-forward";
... ... @@ -28,5 +27,3 @@ NoosferoApp.addConstants(&quot;AUTH_EVENTS&quot;, AUTH_EVENTS);
28 27  
29 28 NoosferoApp.addConfig(noosferoModuleConfig);
30 29 NoosferoApp.run(noosferoAngularRunBlock);
31   -
32   -NoosferoApp.addConfig(routeConfig);
... ...
src/app/profile/myprofile.component.ts 0 → 100644
... ... @@ -0,0 +1,9 @@
  1 +import {Component} from "ng-forward";
  2 +
  3 +@Component({
  4 + selector: 'profile',
  5 + templateUrl: "app/profile/profile.html",
  6 +})
  7 +export class MyProfile {
  8 +
  9 +}
... ...
src/app/profile/profile.component.ts
... ... @@ -7,6 +7,7 @@ import {ContentViewerActions} from &quot;../content-viewer/content-viewer-actions.com
7 7 import {NoosferoActivities} from "../components/noosfero-activities/activities.component";
8 8 import {ProfileService} from "../../lib/ng-noosfero-api/http/profile.service";
9 9 import {Notification} from "../components/notification/notification.component";
  10 +import {MyProfile} from "./myprofile.component";
10 11  
11 12  
12 13 /**
... ... @@ -39,6 +40,11 @@ import {Notification} from &quot;../components/notification/notification.component&quot;;
39 40 }
40 41 },
41 42 {
  43 + name: 'main.profile.settings',
  44 + url: "^/myprofile/:profile",
  45 + component: MyProfile
  46 + },
  47 + {
42 48 name: 'main.profile.cms',
43 49 url: "^/myprofile/:profile/cms",
44 50 component: Cms,
... ...
src/languages/en.json
... ... @@ -20,6 +20,6 @@
20 20 "navbar.content_viewer_actions.new_post": "New Post",
21 21 "notification.error.default.message": "Something went wrong!",
22 22 "notification.error.default.title": "Oops...",
23   - "notification.profile.not_found": "Profile not found",
  23 + "notification.profile.not_found": "Page not found",
24 24 "notification.http_error.401.message": "Unauthorized"
25 25 }
... ...
src/languages/pt.json
... ... @@ -20,6 +20,6 @@
20 20 "navbar.content_viewer_actions.new_post": "Novo Artigo",
21 21 "notification.error.default.message": "Algo deu errado!",
22 22 "notification.error.default.title": "Oops...",
23   - "notification.profile.not_found": "Perfil não encontrado",
  23 + "notification.profile.not_found": "Página não encontrada",
24 24 "notification.http_error.401.message": "Não autorizado"
25 25 }
... ...
src/spec/mocks.ts
... ... @@ -107,7 +107,7 @@ export var mocks = {
107 107 $log: {
108 108 debug: () => { }
109 109 },
110   - languageService: {
  110 + translatorService: {
111 111 currentLanguage: () => { },
112 112 changeLanguage: (lang: string) => { },
113 113 translate: (text: string) => { return text; }
... ...