diff --git a/src/app/environment/environment.html b/src/app/environment/environment.html index fb560ba..c78a7c6 100644 --- a/src/app/environment/environment.html +++ b/src/app/environment/environment.html @@ -1,5 +1,5 @@
- +
diff --git a/src/app/layout/boxes/box.html b/src/app/layout/boxes/box.html index 4550503..33359c9 100644 --- a/src/app/layout/boxes/box.html +++ b/src/app/layout/boxes/box.html @@ -1,5 +1,5 @@
-
+

{{block.title}}

diff --git a/src/app/layout/boxes/boxes.component.spec.ts b/src/app/layout/boxes/boxes.component.spec.ts index b7e0293..942cd9e 100644 --- a/src/app/layout/boxes/boxes.component.spec.ts +++ b/src/app/layout/boxes/boxes.component.spec.ts @@ -1,14 +1,7 @@ import {Component} from 'ng-forward'; - import {BoxesComponent} from './boxes.component'; - -import { - createComponentFromClass, - quickCreateComponent, - provideEmptyObjects, - createProviderToValue, - provideFilters -} from "../../../spec/helpers"; +import * as helpers from "../../../spec/helpers"; +import {ComponentTestHelper, createClass} from '../../../spec/component-test-helper'; // this htmlTemplate will be re-used between the container components in this spec file const htmlTemplate: string = ''; @@ -16,49 +9,63 @@ const htmlTemplate: string = ' { + let helper: ComponentTestHelper; beforeEach(() => { angular.mock.module("templates"); }); - @Component({ - selector: 'test-container-component', - template: htmlTemplate, - directives: [BoxesComponent], - providers: [] - }) - class BoxesContainerComponent { - boxes: noosfero.Box[] = [ + let properties = { + boxes: [ { id: 1, position: 1 }, { id: 2, position: 2 } - ]; - - owner: noosfero.Profile = { + ], + owner: { id: 1, identifier: 'profile-name', type: 'Person' - }; - } + } + }; + beforeEach((done) => { + let cls = createClass({ + template: htmlTemplate, + directives: [BoxesComponent], + properties: properties, + providers: [ + helpers.createProviderToValue('SessionService', helpers.mocks.sessionWithCurrentUser({})), + helpers.createProviderToValue('AuthService', helpers.mocks.authService), + helpers.createProviderToValue('$state', state) + ] + }); + helper = new ComponentTestHelper(cls, done); + }); - it("renders boxes into a container", (done: Function) => { - createComponentFromClass(BoxesContainerComponent).then((fixture) => { - let boxesHtml = fixture.debugElement; - expect(boxesHtml.query('div.col-md-7').length).toEqual(1); - expect(boxesHtml.query('div.col-md-2-5').length).toEqual(1); + let state = jasmine.createSpyObj("state", ["current"]); + state.current = { name: "" }; - done(); - }); + it("renders boxes into a container", () => { + expect(helper.find('div.col-md-7').length).toEqual(1); + expect(helper.find('div.col-md-2-5').length).toEqual(1); }); - it("check the boxes order", (done: Function) => { - createComponentFromClass(BoxesContainerComponent).then((fixture) => { + it("check the boxes order", () => { + expect(helper.component.boxesOrder(properties['boxes'][0])).toEqual(1); + expect(helper.component.boxesOrder(properties['boxes'][1])).toEqual(0); + }); - let boxesComponent: BoxesComponent = fixture.debugElement.componentViewChildren[0].componentInstance; - let boxesContainer: BoxesContainerComponent = fixture.componentInstance; + it("set isHomepage as false by default", () => { + expect(helper.component.isHomepage).toBeFalsy(); + }); - expect(boxesComponent.boxesOrder(boxesContainer.boxes[0])).toEqual(1); - expect(boxesComponent.boxesOrder(boxesContainer.boxes[1])).toEqual(0); + it("set isHomepage as true when in profile home page", () => { + state.current = { name: "main.profile.home" }; + helper.component.ngOnInit(); + expect(helper.component.isHomepage).toBeTruthy(); + }); - done(); - }); + it("set isHomepage as true when in environment home page", () => { + state.current = { name: "main.environment.home" }; + helper.component.owner = {}; + helper.component.ngOnInit(); + expect(helper.component.isHomepage).toBeTruthy(); }); }); diff --git a/src/app/layout/boxes/boxes.component.ts b/src/app/layout/boxes/boxes.component.ts index 75d41ab..6933113 100644 --- a/src/app/layout/boxes/boxes.component.ts +++ b/src/app/layout/boxes/boxes.component.ts @@ -1,16 +1,45 @@ import {Input, Inject, Component} from 'ng-forward'; +import {SessionService, AuthService, AuthEvents} from "../../login"; +import {DisplayBlocks} from "./display-blocks.filter"; @Component({ selector: "noosfero-boxes", - templateUrl: "app/layout/boxes/boxes.html" + templateUrl: "app/layout/boxes/boxes.html", + directives: [DisplayBlocks] }) +@Inject("SessionService", 'AuthService', "$state") export class BoxesComponent { @Input() boxes: noosfero.Box[]; - @Input() owner: noosfero.Profile; + @Input() owner: noosfero.Profile | noosfero.Environment; + + currentUser: noosfero.User; + isHomepage = true; + + constructor(private session: SessionService, private authService: AuthService, private $state: ng.ui.IStateService) { + this.currentUser = this.session.currentUser(); + this.authService.subscribe(AuthEvents[AuthEvents.loginSuccess], () => { + this.currentUser = this.session.currentUser(); + }); + this.authService.subscribe(AuthEvents[AuthEvents.logoutSuccess], () => { + this.currentUser = this.session.currentUser(); + }); + } + + ngOnInit() { + this.verifyHomepage(); + } boxesOrder(box: noosfero.Box) { if (box.position === 2) return 0; return box.position; } + + private verifyHomepage() { + if (this.owner && ["Profile", "Community", "Person"].indexOf((this.owner)['type']) >= 0) { + this.isHomepage = this.$state.current.name === "main.profile.home"; + } else { + this.isHomepage = this.$state.current.name === "main.environment.home"; + } + } } diff --git a/src/app/layout/boxes/display-blocks.filter.spec.ts b/src/app/layout/boxes/display-blocks.filter.spec.ts new file mode 100644 index 0000000..962a698 --- /dev/null +++ b/src/app/layout/boxes/display-blocks.filter.spec.ts @@ -0,0 +1,76 @@ +import {quickCreateComponent} from "../../../spec/helpers"; +import {DisplayBlocks} from './display-blocks.filter'; + +describe("Filters", () => { + describe("Display Blocks Filter", () => { + + it("not fail when blocks is null", done => { + let filter = new DisplayBlocks(); + expect(filter.transform(null, true, {})).toEqual([]); + done(); + }); + + it("return blocks when no setting is passed", done => { + let blocks = [{}]; + let filter = new DisplayBlocks(); + expect(filter.transform(blocks, true, {})).toEqual(blocks); + done(); + }); + + it("return blocks when no display is passed", done => { + let blocks = [{ setting: {} }]; + let filter = new DisplayBlocks(); + expect(filter.transform(blocks, true, {})).toEqual(blocks); + done(); + }); + + it("filter invisible blocks", done => { + let blocks = [{ settings: { display: "never" } }]; + let filter = new DisplayBlocks(); + expect(filter.transform(blocks, true, {})).toEqual([]); + done(); + }); + + it("filter blocks with except_home_page in homepage", done => { + let blocks = [{ settings: { display: "except_home_page" } }]; + let filter = new DisplayBlocks(); + expect(filter.transform(blocks, true, {})).toEqual([]); + done(); + }); + + it("filter blocks with home_page_only outside homepage", done => { + let blocks = [{ settings: { display: "home_page_only" } }]; + let filter = new DisplayBlocks(); + expect(filter.transform(blocks, false, {})).toEqual([]); + done(); + }); + + it("show all blocks when display_user is all for logged user", done => { + let blocks = [{ settings: { display_user: "all" } }]; + let filter = new DisplayBlocks(); + expect(filter.transform(blocks, true, {})).toEqual(blocks); + done(); + }); + + it("show all blocks when display_user is all for not logged user", done => { + let blocks = [{ settings: { display_user: "all" } }]; + let filter = new DisplayBlocks(); + expect(filter.transform(blocks, true, null)).toEqual(blocks); + done(); + }); + + it("filter blocks when display_user is logged for not logged user", done => { + let blocks = [{ settings: { display_user: "logged" } }]; + let filter = new DisplayBlocks(); + expect(filter.transform(blocks, true, null)).toEqual([]); + done(); + }); + + it("filter blocks when display_user is not_logged for logged user", done => { + let blocks = [{ settings: { display_user: "not_logged" } }]; + let filter = new DisplayBlocks(); + expect(filter.transform(blocks, true, {})).toEqual([]); + done(); + }); + }); +}); diff --git a/src/app/layout/boxes/display-blocks.filter.ts b/src/app/layout/boxes/display-blocks.filter.ts new file mode 100644 index 0000000..2ba4a89 --- /dev/null +++ b/src/app/layout/boxes/display-blocks.filter.ts @@ -0,0 +1,27 @@ +import {Pipe, Inject} from "ng-forward"; + +@Pipe("displayBlocks") +export class DisplayBlocks { + + transform(blocks: noosfero.Block[], isHomepage: boolean, currentUser: noosfero.User) { + let selected: noosfero.Block[] = []; + blocks = blocks || []; + for (let block of blocks) { + if (this.visible(block, isHomepage) && this.displayToUser(block, currentUser)) { + selected.push(block); + } + } + return selected; + } + + private visible(block: noosfero.Block, isHomepage: boolean) { + let display = block.settings ? (block.settings)['display'] : null; + return !display || ((isHomepage ? display !== "except_home_page" : display !== "home_page_only") && display !== "never"); + } + + private displayToUser(block: noosfero.Block, currentUser: noosfero.User) { + let displayUser = block.settings ? (block.settings)['display_user'] : null; + return !displayUser || displayUser === "all" || + (currentUser ? displayUser === "logged" : displayUser === "not_logged"); + } +} diff --git a/src/app/profile/profile.html b/src/app/profile/profile.html index de36a0d..5a205ca 100644 --- a/src/app/profile/profile.html +++ b/src/app/profile/profile.html @@ -1,7 +1,7 @@
- +
-- libgit2 0.21.2