Commit 62f85230b4028963680cebe137982f1b6e3a0caa

Authored by Victor Costa
1 parent 167edf00

Move logic that show/hide blocks to block component

src/app/layout/blocks/block.component.spec.ts 0 → 100644
... ... @@ -0,0 +1,135 @@
  1 +import {Component} from 'ng-forward';
  2 +import {BlockComponent} from './block.component';
  3 +import * as helpers from "../../../spec/helpers";
  4 +import {ComponentTestHelper, createClass} from '../../../spec/component-test-helper';
  5 +
  6 +const htmlTemplate: string = '<noosfero-block [block]="ctrl.block" [owner]="ctrl.profile"></noosfero-block>';
  7 +
  8 +describe("Boxes Component", () => {
  9 +
  10 + let helper: ComponentTestHelper<BlockComponent>;
  11 + beforeEach(() => {
  12 + angular.mock.module("templates");
  13 + });
  14 +
  15 + let properties = {
  16 + block: { id: 1 },
  17 + owner: {
  18 + id: 1,
  19 + identifier: 'profile-name',
  20 + type: 'Person'
  21 + }
  22 + };
  23 + beforeEach((done) => {
  24 + let cls = createClass({
  25 + template: htmlTemplate,
  26 + directives: [BlockComponent],
  27 + properties: properties,
  28 + providers: [
  29 + helpers.createProviderToValue('SessionService', helpers.mocks.sessionWithCurrentUser({})),
  30 + helpers.createProviderToValue('AuthService', helpers.mocks.authService),
  31 + helpers.createProviderToValue('$state', state),
  32 + helpers.createProviderToValue('TranslatorService', translatorService),
  33 + helpers.createProviderToValue('$uibModal', helpers.mocks.$modal),
  34 + helpers.createProviderToValue('BlockService', blockService),
  35 + helpers.createProviderToValue('NotificationService', helpers.mocks.notificationService)
  36 + ]
  37 + });
  38 + helper = new ComponentTestHelper<BlockComponent>(cls, done);
  39 + });
  40 +
  41 + let translatorService = jasmine.createSpyObj("translatorService", ["currentLanguage"]);
  42 + let blockService = jasmine.createSpyObj("blockService", ["update"]);
  43 + let state = jasmine.createSpyObj("state", ["current"]);
  44 + state.current = { name: "" };
  45 +
  46 + it("set isHomepage as false by default", () => {
  47 + expect(helper.component.isHomepage).toBeFalsy();
  48 + });
  49 +
  50 + it("set isHomepage as true when in profile home page", () => {
  51 + state.current = { name: "main.profile.home" };
  52 + helper.component.ngOnInit();
  53 + expect(helper.component.isHomepage).toBeTruthy();
  54 + });
  55 +
  56 + it("set isHomepage as true when in profile info page", () => {
  57 + state.current = { name: "main.profile.info" };
  58 + helper.component.ngOnInit();
  59 + expect(helper.component.isHomepage).toBeTruthy();
  60 + });
  61 +
  62 + it("set isHomepage as true when in profile page", () => {
  63 + state.current = { name: "main.profile.page" };
  64 + state.params = { page: "/page" };
  65 + (<noosfero.Profile>helper.component.owner).homepage = '/page';
  66 + helper.component.ngOnInit();
  67 + expect(helper.component.isHomepage).toBeTruthy();
  68 + });
  69 +
  70 + it("set isHomepage as true when in environment home page", () => {
  71 + state.current = { name: "main.environment.home" };
  72 + helper.component.owner = <noosfero.Environment>{};
  73 + helper.component.ngOnInit();
  74 + expect(helper.component.isHomepage).toBeTruthy();
  75 + });
  76 +
  77 + it("return true in canDisplay when no display option is setted", () => {
  78 + helper.component.block = <any>{};
  79 + expect(helper.component.canDisplay()).toEqual(true);
  80 + });
  81 +
  82 + it("return false in canDisplay for an invisible block", () => {
  83 + helper.component.block = <any>{ settings: { display: "never" } };
  84 + expect(helper.component.canDisplay()).toEqual(false);
  85 + });
  86 +
  87 + it("return false in canDisplay with except_home_page in homepage", () => {
  88 + helper.component.block = <any>{ settings: { display_user: "except_home_page" } };
  89 + expect(helper.component.canDisplay()).toEqual(false);
  90 + });
  91 +
  92 + it("return false in canDisplay with home_page_only outside homepage", () => {
  93 + helper.component.block = <any>{ settings: { display_user: "home_page_only" } };
  94 + expect(helper.component.canDisplay()).toEqual(false);
  95 + });
  96 +
  97 + it("return true in canDisplay when display_user is all for logged user", () => {
  98 + helper.component.block = <any>{ settings: { display_user: "all" } };
  99 + expect(helper.component.canDisplay()).toEqual(true);
  100 + });
  101 +
  102 + it("return true in canDisplay when display_user is all for not logged user", () => {
  103 + helper.component.currentUser = null;
  104 + helper.component.block = <any>{ settings: { display_user: "all" } };
  105 + expect(helper.component.canDisplay()).toEqual(true);
  106 + });
  107 +
  108 + it("return false in canDisplay when display_user is logged for not logged user", () => {
  109 + helper.component.currentUser = null;
  110 + helper.component.block = <any>{ settings: { display_user: "logged" } };
  111 + expect(helper.component.canDisplay()).toEqual(false);
  112 + });
  113 +
  114 + it("return false in canDisplay when display_user is not_logged for logged user", () => {
  115 + helper.component.block = <any>{ settings: { display_user: "not_logged" } };
  116 + expect(helper.component.canDisplay()).toEqual(false);
  117 + });
  118 +
  119 + it("return false in canDisplay when current language is not equal to language in block settings", () => {
  120 + helper.component['translatorService'].currentLanguage = jasmine.createSpy("currentLanguage").and.returnValue("pt");
  121 + helper.component.block = <any>{ settings: { language: "en" } };
  122 + expect(helper.component.canDisplay()).toEqual(false);
  123 + });
  124 +
  125 + it("return false in canDisplay when hide is true", () => {
  126 + helper.component.block = <any>{ id: 1, hide: true };
  127 + expect(helper.component.canDisplay()).toEqual(false);
  128 + });
  129 +
  130 + it("return true in canDisplay when hide is not true", () => {
  131 + helper.component.block = <any>{ id: 1, hide: false };
  132 + expect(helper.component.canDisplay()).toEqual(true);
  133 + });
  134 +
  135 +});
... ...
src/app/layout/blocks/block.component.ts
1 1 import { Input, Component, Inject } from 'ng-forward';
2 2 import { BlockEditionComponent } from './block-edition/block-edition.component';
3 3 import { BlockService } from '../../../lib/ng-noosfero-api/http/block.service';
4   -import {NotificationService} from '../../shared/services/notification.service';
  4 +import { NotificationService } from '../../shared/services/notification.service';
  5 +import { AuthService, SessionService, AuthEvents } from "../../login";
  6 +import { TranslatorService } from "../../shared/services/translator.service";
5 7  
6 8 @Component({
7 9 selector: 'noosfero-block',
8 10 templateUrl: 'app/layout/blocks/block.html',
9 11 directives: [BlockEditionComponent]
10 12 })
11   -@Inject("$uibModal", "$scope", BlockService, NotificationService)
  13 +@Inject("$uibModal", "$scope", "$state", "$rootScope", BlockService, NotificationService, AuthService, SessionService, TranslatorService)
12 14 export class BlockComponent {
13 15  
14   - @Input() block: any;
15   - @Input() owner: any;
  16 + @Input() block: noosfero.Block;
  17 + @Input() owner: noosfero.Profile | noosfero.Environment;
16 18  
17 19 private modalInstance: any = null;
18 20 originalBlock: noosfero.Block;
19 21  
20   - constructor(private $uibModal: any, private $scope: ng.IScope, private blockService: BlockService, private notificationService: NotificationService) { }
  22 + currentUser: noosfero.User;
  23 + isHomepage = true;
  24 + editionMode = false;
  25 +
  26 + constructor(private $uibModal: any,
  27 + private $scope: ng.IScope,
  28 + private $state: ng.ui.IStateService,
  29 + private $rootScope: ng.IRootScopeService,
  30 + private blockService: BlockService,
  31 + private notificationService: NotificationService,
  32 + private authService: AuthService,
  33 + private session: SessionService,
  34 + private translatorService: TranslatorService) {
  35 +
  36 + this.currentUser = this.session.currentUser();
  37 + this.authService.subscribe(AuthEvents[AuthEvents.loginSuccess], () => {
  38 + this.currentUser = this.session.currentUser();
  39 + this.verifyHomepage();
  40 + });
  41 + this.authService.subscribe(AuthEvents[AuthEvents.logoutSuccess], () => {
  42 + this.currentUser = this.session.currentUser();
  43 + this.verifyHomepage();
  44 + });
  45 + this.$rootScope.$on("$stateChangeSuccess", (event: ng.IAngularEvent, toState: ng.ui.IState) => {
  46 + this.verifyHomepage();
  47 + });
  48 + }
  49 +
  50 + ngOnInit() {
  51 + this.verifyHomepage();
  52 + }
21 53  
22 54 openEdit() {
  55 + this.editionMode = true;
23 56 if (!this.originalBlock) this.originalBlock = JSON.parse(JSON.stringify(this.block)); // deep copy of block data
24 57 this.modalInstance = this.$uibModal.open({
25 58 templateUrl: 'app/layout/blocks/block-edition/block-edition.html',
... ... @@ -32,7 +65,8 @@ export class BlockComponent {
32 65 }
33 66  
34 67 save() {
35   - this.blockService.update(this.attributesToUpdate(this.block)).then(() => {
  68 + this.editionMode = false;
  69 + this.blockService.update(this.attributesToUpdate()).then(() => {
36 70 this.closeEdit();
37 71 this.notificationService.success({ title: "block.edition.success.title", message: "block.edition.success.message" });
38 72 });
... ... @@ -43,20 +77,59 @@ export class BlockComponent {
43 77 }
44 78  
45 79 cancel() {
  80 + this.editionMode = false;
46 81 this.block = this.originalBlock;
47 82 this.closeEdit();
48 83 }
49 84  
50   - protected attributesToUpdate(block: noosfero.Block) {
  85 + canDisplay() {
  86 + return this.visible() && this.displayToUser() &&
  87 + this.displayOnLanguage(this.translatorService.currentLanguage()) &&
  88 + !this.block.hide;
  89 + }
  90 +
  91 + protected visible() {
  92 + let display = this.block.settings ? (<any>this.block.settings)['display'] : null;
  93 + return !display || ((this.isHomepage ? display !== "except_home_page" : display !== "home_page_only") && display !== "never");
  94 + }
  95 +
  96 + protected displayToUser() {
  97 + let displayUser = this.block.settings ? (<any>this.block.settings)['display_user'] : null;
  98 + return !displayUser || displayUser === "all" ||
  99 + (this.currentUser ? displayUser === "logged" : displayUser === "not_logged");
  100 + }
  101 +
  102 + protected displayOnLanguage(language: string) {
  103 + let displayLanguage = this.block.settings ? (<any>this.block.settings)['language'] : null;
  104 + return !displayLanguage || displayLanguage === "all" ||
  105 + language === displayLanguage;
  106 + }
  107 +
  108 + protected attributesToUpdate() {
51 109 return <any>{
52 110 id: this.block.id,
53   - display: this.block.settings.display,
  111 + display: (<any>this.block.settings).display,
54 112 title: this.block.title,
55   - display_user: this.block.settings.display_user,
56   - language: this.block.settings.language
  113 + display_user: (<any>this.block.settings).display_user,
  114 + language: (<any>this.block.settings).language
57 115 };
58 116 }
59 117  
  118 + protected verifyHomepage() {
  119 + if (this.owner && ["Profile", "Community", "Person"].indexOf((<any>this.owner)['type']) >= 0) {
  120 + let profile = <noosfero.Profile>this.owner;
  121 + this.isHomepage = this.$state.current.name === "main.profile.home";
  122 + if (profile.homepage) {
  123 + this.isHomepage = this.isHomepage ||
  124 + (this.$state.current.name === "main.profile.page" && profile.homepage === this.$state.params['page']);
  125 + } else {
  126 + this.isHomepage = this.isHomepage || this.$state.current.name === "main.profile.info";
  127 + }
  128 + } else {
  129 + this.isHomepage = this.$state.current.name === "main.environment.home";
  130 + }
  131 + }
  132 +
60 133 private closeEdit() {
61 134 if (this.modalInstance) {
62 135 this.modalInstance.close();
... ...
src/app/layout/blocks/block.html
1   -<div class="noosfero-block" ng-mouseover="displayActions = true" ng-mouseleave="displayActions = false">
  1 +<div ng-show="ctrl.canDisplay() || ctrl.editionMode" ng-class="{'invisible-block': !ctrl.canDisplay()}" class="noosfero-block" ng-mouseover="displayActions = true" ng-mouseleave="displayActions = false">
2 2 <div ng-show="displayActions" class="actions" permission="ctrl.block.permissions" permission-action="allow_edit">
3 3 <button type="submit" class="btn btn-xs btn-default" ng-click="ctrl.openEdit()"><i class="fa fa-edit fa-fw"></i></button>
4 4 </div>
... ...
src/app/layout/boxes/box.html
1 1 <div ng-class="{'col-md-2-5': box.position!=1, 'col-md-7': box.position==1}">
2   - <noosfero-block ng-repeat="block in box.blocks | displayBlocks:ctrl.isHomepage:ctrl.currentUser | orderBy: 'position'" [block]="block" [owner]="ctrl.owner"></noosfero-block>
  2 + <noosfero-block ng-repeat="block in box.blocks | orderBy: 'position'" [block]="block" [owner]="ctrl.owner"></noosfero-block>
3 3 </div>
... ...
src/app/layout/boxes/boxes.component.spec.ts
... ... @@ -53,35 +53,4 @@ describe(&quot;Boxes Component&quot;, () =&gt; {
53 53 expect(helper.component.boxesOrder(properties['boxes'][0])).toEqual(1);
54 54 expect(helper.component.boxesOrder(properties['boxes'][1])).toEqual(0);
55 55 });
56   -
57   - it("set isHomepage as false by default", () => {
58   - expect(helper.component.isHomepage).toBeFalsy();
59   - });
60   -
61   - it("set isHomepage as true when in profile home page", () => {
62   - state.current = { name: "main.profile.home" };
63   - helper.component.ngOnInit();
64   - expect(helper.component.isHomepage).toBeTruthy();
65   - });
66   -
67   - it("set isHomepage as true when in profile info page", () => {
68   - state.current = { name: "main.profile.info" };
69   - helper.component.ngOnInit();
70   - expect(helper.component.isHomepage).toBeTruthy();
71   - });
72   -
73   - it("set isHomepage as true when in profile page", () => {
74   - state.current = { name: "main.profile.page" };
75   - state.params = { page: "/page" };
76   - (<noosfero.Profile>helper.component.owner).homepage = '/page';
77   - helper.component.ngOnInit();
78   - expect(helper.component.isHomepage).toBeTruthy();
79   - });
80   -
81   - it("set isHomepage as true when in environment home page", () => {
82   - state.current = { name: "main.environment.home" };
83   - helper.component.owner = <noosfero.Environment>{};
84   - helper.component.ngOnInit();
85   - expect(helper.component.isHomepage).toBeTruthy();
86   - });
87 56 });
... ...
src/app/layout/boxes/boxes.component.ts
1   -import {Input, Inject, Component} from 'ng-forward';
2   -import {SessionService, AuthService, AuthEvents} from "../../login";
3   -import {DisplayBlocks} from "./display-blocks.filter";
  1 +import {Input, Component} from 'ng-forward';
4 2  
5 3 @Component({
6 4 selector: "noosfero-boxes",
7   - templateUrl: "app/layout/boxes/boxes.html",
8   - directives: [DisplayBlocks]
  5 + templateUrl: "app/layout/boxes/boxes.html"
9 6 })
10   -@Inject("SessionService", 'AuthService', "$state", "$rootScope")
11 7 export class BoxesComponent {
12 8  
13 9 @Input() boxes: noosfero.Box[];
14 10 @Input() owner: noosfero.Profile | noosfero.Environment;
15 11  
16   - currentUser: noosfero.User;
17   - isHomepage = true;
18   -
19   - constructor(private session: SessionService,
20   - private authService: AuthService,
21   - private $state: ng.ui.IStateService,
22   - private $rootScope: ng.IRootScopeService) {
23   -
24   - this.currentUser = this.session.currentUser();
25   - this.authService.subscribe(AuthEvents[AuthEvents.loginSuccess], () => {
26   - this.currentUser = this.session.currentUser();
27   - this.verifyHomepage();
28   - });
29   - this.authService.subscribe(AuthEvents[AuthEvents.logoutSuccess], () => {
30   - this.currentUser = this.session.currentUser();
31   - this.verifyHomepage();
32   - });
33   - this.$rootScope.$on("$stateChangeSuccess", (event: ng.IAngularEvent, toState: ng.ui.IState) => {
34   - this.verifyHomepage();
35   - });
36   - }
37   -
38   - ngOnInit() {
39   - this.verifyHomepage();
40   - }
41   -
42 12 boxesOrder(box: noosfero.Box) {
43 13 if (box.position === 2) return 0;
44 14 return box.position;
45 15 }
46   -
47   - private verifyHomepage() {
48   - if (this.owner && ["Profile", "Community", "Person"].indexOf((<any>this.owner)['type']) >= 0) {
49   - let profile = <noosfero.Profile>this.owner;
50   - this.isHomepage = this.$state.current.name === "main.profile.home";
51   - if (profile.homepage) {
52   - this.isHomepage = this.isHomepage ||
53   - (this.$state.current.name === "main.profile.page" && profile.homepage === this.$state.params['page']);
54   - } else {
55   - this.isHomepage = this.isHomepage || this.$state.current.name === "main.profile.info";
56   - }
57   - } else {
58   - this.isHomepage = this.$state.current.name === "main.environment.home";
59   - }
60   - }
61 16 }
... ...
src/app/layout/boxes/display-blocks.filter.spec.ts
... ... @@ -1,100 +0,0 @@
1   -import {quickCreateComponent} from "../../../spec/helpers";
2   -import {DisplayBlocks} from './display-blocks.filter';
3   -
4   -describe("Filters", () => {
5   - describe("Display Blocks Filter", () => {
6   -
7   - let translatorService = jasmine.createSpyObj("translatorService", ["currentLanguage"]);
8   -
9   - it("not fail when blocks is null", done => {
10   - let filter = new DisplayBlocks(translatorService);
11   - expect(filter.transform(null, true, <noosfero.User>{})).toEqual([]);
12   - done();
13   - });
14   -
15   - it("return blocks when no setting is passed", done => {
16   - let blocks = [{}];
17   - let filter = new DisplayBlocks(translatorService);
18   - expect(filter.transform(<any>blocks, true, <noosfero.User>{})).toEqual(blocks);
19   - done();
20   - });
21   -
22   - it("return blocks when no display is passed", done => {
23   - let blocks = [{ setting: {} }];
24   - let filter = new DisplayBlocks(translatorService);
25   - expect(filter.transform(<any>blocks, true, <noosfero.User>{})).toEqual(blocks);
26   - done();
27   - });
28   -
29   - it("filter invisible blocks", done => {
30   - let blocks = [{ settings: { display: "never" } }];
31   - let filter = new DisplayBlocks(translatorService);
32   - expect(filter.transform(<any>blocks, true, <noosfero.User>{})).toEqual([]);
33   - done();
34   - });
35   -
36   - it("filter blocks with except_home_page in homepage", done => {
37   - let blocks = [{ settings: { display: "except_home_page" } }];
38   - let filter = new DisplayBlocks(translatorService);
39   - expect(filter.transform(<any>blocks, true, <noosfero.User>{})).toEqual([]);
40   - done();
41   - });
42   -
43   - it("filter blocks with home_page_only outside homepage", done => {
44   - let blocks = [{ settings: { display: "home_page_only" } }];
45   - let filter = new DisplayBlocks(translatorService);
46   - expect(filter.transform(<any>blocks, false, <noosfero.User>{})).toEqual([]);
47   - done();
48   - });
49   -
50   - it("show all blocks when display_user is all for logged user", done => {
51   - let blocks = [{ settings: { display_user: "all" } }];
52   - let filter = new DisplayBlocks(translatorService);
53   - expect(filter.transform(<any>blocks, true, <noosfero.User>{})).toEqual(blocks);
54   - done();
55   - });
56   -
57   - it("show all blocks when display_user is all for not logged user", done => {
58   - let blocks = [{ settings: { display_user: "all" } }];
59   - let filter = new DisplayBlocks(translatorService);
60   - expect(filter.transform(<any>blocks, true, null)).toEqual(blocks);
61   - done();
62   - });
63   -
64   - it("filter blocks when display_user is logged for not logged user", done => {
65   - let blocks = [{ settings: { display_user: "logged" } }];
66   - let filter = new DisplayBlocks(translatorService);
67   - expect(filter.transform(<any>blocks, true, null)).toEqual([]);
68   - done();
69   - });
70   -
71   - it("filter blocks when display_user is not_logged for logged user", done => {
72   - let blocks = [{ settings: { display_user: "not_logged" } }];
73   - let filter = new DisplayBlocks(translatorService);
74   - expect(filter.transform(<any>blocks, true, <noosfero.User>{})).toEqual([]);
75   - done();
76   - });
77   -
78   - it("filter blocks with different language", done => {
79   - let blocks = [{ settings: { language: "en" } }];
80   - translatorService.currentLanguage = jasmine.createSpy("currentLanguage").and.returnValue("pt");
81   - let filter = new DisplayBlocks(translatorService);
82   - expect(filter.transform(<any>blocks, true, <noosfero.User>{})).toEqual([]);
83   - done();
84   - });
85   -
86   - it("filter blocks when hide is true", done => {
87   - let blocks = [{ hide: true }];
88   - let filter = new DisplayBlocks(translatorService);
89   - expect(filter.transform(<any>blocks, true, null)).toEqual([]);
90   - done();
91   - });
92   -
93   - it("not filter blocks when hide is not true", done => {
94   - let blocks = [{ id: 1, hide: false }, { id: 2 }];
95   - let filter = new DisplayBlocks(translatorService);
96   - expect(filter.transform(<any>blocks, true, null)).toEqual(blocks);
97   - done();
98   - });
99   - });
100   -});
src/app/layout/boxes/display-blocks.filter.ts
... ... @@ -1,39 +0,0 @@
1   -import {Pipe, Inject} from "ng-forward";
2   -import {TranslatorService} from "../../shared/services/translator.service";
3   -
4   -@Pipe("displayBlocks")
5   -@Inject(TranslatorService)
6   -export class DisplayBlocks {
7   -
8   - constructor(private translatorService: TranslatorService) { }
9   -
10   - transform(blocks: noosfero.Block[], isHomepage: boolean, currentUser: noosfero.User) {
11   - let selected: noosfero.Block[] = [];
12   - blocks = blocks || [];
13   - for (let block of blocks) {
14   - if (this.visible(block, isHomepage) && this.displayToUser(block, currentUser) &&
15   - this.displayOnLanguage(block, this.translatorService.currentLanguage())
16   - && !block.hide) {
17   - selected.push(block);
18   - }
19   - }
20   - return selected;
21   - }
22   -
23   - private visible(block: noosfero.Block, isHomepage: boolean) {
24   - let display = block.settings ? (<any>block.settings)['display'] : null;
25   - return !display || ((isHomepage ? display !== "except_home_page" : display !== "home_page_only") && display !== "never");
26   - }
27   -
28   - private displayToUser(block: noosfero.Block, currentUser: noosfero.User) {
29   - let displayUser = block.settings ? (<any>block.settings)['display_user'] : null;
30   - return !displayUser || displayUser === "all" ||
31   - (currentUser ? displayUser === "logged" : displayUser === "not_logged");
32   - }
33   -
34   - private displayOnLanguage(block: noosfero.Block, language: string) {
35   - let displayLanguage = block.settings ? (<any>block.settings)['language'] : null;
36   - return !displayLanguage || displayLanguage === "all" ||
37   - language === displayLanguage;
38   - }
39   -}
src/lib/ng-noosfero-api/interfaces/block.ts
... ... @@ -5,5 +5,6 @@ namespace noosfero {
5 5 limit: number;
6 6 api_content: any;
7 7 hide: boolean;
  8 + title: string;
8 9 }
9 10 }
... ...