Commit 5af8017d525310c9e9dcfaa67a27850cd6a192c3
1 parent
c73e431e
Exists in
master
and in
26 other branches
Adding counters to statistics block
Showing
7 changed files
with
162 additions
and
27 deletions
Show diff stats
src/app/layout/blocks/statistics/statistics-block.component.spec.ts
| 1 | -import {TestComponentBuilder} from 'ng-forward/cjs/testing/test-component-builder'; | ||
| 2 | -import {Component} from 'ng-forward'; | ||
| 3 | - | 1 | +import {ComponentTestHelper, createClass} from './../../../../spec/component-test-helper'; |
| 4 | import {StatisticsBlockComponent} from './statistics-block.component'; | 2 | import {StatisticsBlockComponent} from './statistics-block.component'; |
| 5 | - | ||
| 6 | -const tcb = new TestComponentBuilder(); | 3 | +import * as helpers from "../../../../spec/helpers"; |
| 7 | 4 | ||
| 8 | const htmlTemplate: string = '<noosfero-statistics-block [block]="ctrl.block" [owner]="ctrl.owner"></noosfero-statistics-block>'; | 5 | const htmlTemplate: string = '<noosfero-statistics-block [block]="ctrl.block" [owner]="ctrl.owner"></noosfero-statistics-block>'; |
| 9 | 6 | ||
| 10 | describe("Components", () => { | 7 | describe("Components", () => { |
| 11 | 8 | ||
| 12 | describe("Statistics Block Component", () => { | 9 | describe("Statistics Block Component", () => { |
| 13 | - | 10 | + let helper: ComponentTestHelper<StatisticsBlockComponent>; |
| 14 | beforeEach(angular.mock.module("templates")); | 11 | beforeEach(angular.mock.module("templates")); |
| 15 | - beforeEach(angular.mock.module("ngSanitize")); | ||
| 16 | - | ||
| 17 | - it("display title stored in block attribute", done => { | ||
| 18 | 12 | ||
| 19 | - @Component({ | ||
| 20 | - selector: 'test-container-component', | 13 | + beforeEach((done) => { |
| 14 | + let cls = createClass({ | ||
| 21 | template: htmlTemplate, | 15 | template: htmlTemplate, |
| 22 | directives: [StatisticsBlockComponent], | 16 | directives: [StatisticsBlockComponent], |
| 23 | - }) | ||
| 24 | - class CustomBlockType { | ||
| 25 | - block: any = { settings: { user_counter: '<em>block content</em>' } }; | ||
| 26 | - owner: any = { name: 'profile-name' }; | ||
| 27 | - } | ||
| 28 | - tcb.createAsync(CustomBlockType).then(fixture => { | ||
| 29 | - expect(fixture.debugElement.query(".statistics-block").text().trim()).toEqual('block content'); | ||
| 30 | - done(); | 17 | + providers: helpers.provideFilters("translateFilter"), |
| 18 | + properties: { | ||
| 19 | + block: { | ||
| 20 | + user_counter: 1, users: 10, enterprise_counter: 1, enterprises: 20, | ||
| 21 | + product_counter: 1, products: 30, community_counter: 1, communities: 40, | ||
| 22 | + category_counter: 1, categories: 50, tag_counter: 1, tags: 60, | ||
| 23 | + comment_counter: 1, comments: 70, hit_counter: 1, hits: 80 | ||
| 24 | + } | ||
| 25 | + } | ||
| 26 | + // this.counters.push({ 'should_display': this.block.enterprise_counter, 'value': this.block.enterprises, 'name': 'enterprises' }) | ||
| 27 | + // this.counters.push({ 'should_display': this.block.product_counter, 'value': this.block.products, 'name': 'products' }) | ||
| 28 | + // this.counters.push({ 'should_display': this.block.community_counter, 'value': this.block.communities, 'name': 'communities' }) | ||
| 29 | + // this.counters.push({ 'should_display': this.block.category_counter, 'value': this.block.categories, 'name': 'categories' }) | ||
| 30 | + // this.counters.push({ 'should_display': this.block.tag_counter, 'value': this.block.tags, 'name': 'tags' }) | ||
| 31 | + // this.counters.push({ 'should_display': this.block.comment_counter, 'value': this.block.comments, 'name': 'comments' }) | ||
| 32 | + // this.counters.push({ 'should_display': this.block.hit_counter, 'value': this.block.hits, 'name': 'hits' }) | ||
| 31 | }); | 33 | }); |
| 34 | + helper = new ComponentTestHelper<StatisticsBlockComponent>(cls, done); | ||
| 32 | }); | 35 | }); |
| 33 | 36 | ||
| 34 | - }); | 37 | + it("get user counter information in array", () => { |
| 38 | + helper.component.counters.forEach((obj: any) => { delete obj.$$hashKey; }); | ||
| 39 | + expect(helper.component.counters).toContain({ 'should_display': 1, 'value': 10, 'name': 'users' }); | ||
| 40 | + }); | ||
| 41 | + | ||
| 42 | + it("get user enterprise information in array", () => { | ||
| 43 | + helper.component.counters.forEach((obj: any) => { delete obj.$$hashKey; }); | ||
| 44 | + expect(helper.component.counters).toContain({ 'should_display': 1, 'value': 20, 'name': 'enterprises' }); | ||
| 45 | + }); | ||
| 46 | + | ||
| 47 | + it("get product counter information in array", () => { | ||
| 48 | + helper.component.counters.forEach((obj: any) => { delete obj.$$hashKey; }); | ||
| 49 | + expect(helper.component.counters).toContain({ 'should_display': 1, 'value': 30, 'name': 'products' }); | ||
| 50 | + }); | ||
| 51 | + | ||
| 52 | + it("get community counter information in array", () => { | ||
| 53 | + helper.component.counters.forEach((obj: any) => { delete obj.$$hashKey; }); | ||
| 54 | + expect(helper.component.counters).toContain({ 'should_display': 1, 'value': 40, 'name': 'communities' }); | ||
| 55 | + }); | ||
| 56 | + | ||
| 57 | + it("get category counter information in array", () => { | ||
| 58 | + helper.component.counters.forEach((obj: any) => { delete obj.$$hashKey; }); | ||
| 59 | + expect(helper.component.counters).toContain({ 'should_display': 1, 'value': 50, 'name': 'categories' }); | ||
| 60 | + }); | ||
| 35 | 61 | ||
| 62 | + it("get tag counter information in array", () => { | ||
| 63 | + helper.component.counters.forEach((obj: any) => { delete obj.$$hashKey; }); | ||
| 64 | + expect(helper.component.counters).toContain({ 'should_display': 1, 'value': 60, 'name': 'tags' }); | ||
| 65 | + }); | ||
| 66 | + | ||
| 67 | + it("get comment counter information in array", () => { | ||
| 68 | + helper.component.counters.forEach((obj: any) => { delete obj.$$hashKey; }); | ||
| 69 | + expect(helper.component.counters).toContain({ 'should_display': 1, 'value': 70, 'name': 'comments' }); | ||
| 70 | + }); | ||
| 71 | + | ||
| 72 | + it("get hit counter information in array", () => { | ||
| 73 | + helper.component.counters.forEach((obj: any) => { delete obj.$$hashKey; }); | ||
| 74 | + expect(helper.component.counters).toContain({ 'should_display': 1, 'value': 80, 'name': 'hits' }); | ||
| 75 | + }); | ||
| 76 | + | ||
| 77 | + it("should render the user count information", () => { | ||
| 78 | + expect(helper.find('.list-group-item.users').length).toEqual(1, "The statistics-block should have a list item with users class"); | ||
| 79 | + }); | ||
| 80 | + | ||
| 81 | + | ||
| 82 | + // it("should not render user count information if has no configuration on block", () => { | ||
| 83 | + // helper.component.counters.forEach((obj: any) => { delete obj.$$hashKey }); | ||
| 84 | + // expect(helper.component.counters).toContain({ 'should_display': 1, 'value': 30, 'name': 'enterprises' }); | ||
| 85 | + // }); | ||
| 86 | + | ||
| 87 | + // this.counters.push({ 'should_display': this.block.enterprise_counter, 'value': this.block.enterprises, 'name': 'enterprises' }) | ||
| 88 | + // this.counters.push({ 'should_display': this.block.product_counter, 'value': this.block.products, 'name': 'products' }) | ||
| 89 | + // this.counters.push({ 'should_display': this.block.community_counter, 'value': this.block.communities, 'name': 'communities' }) | ||
| 90 | + // this.counters.push({ 'should_display': this.block.category_counter, 'value': this.block.categories, 'name': 'categories' }) | ||
| 91 | + // this.counters.push({ 'should_display': this.block.tag_counter, 'value': this.block.tags, 'name': 'tags' }) | ||
| 92 | + // this.counters.push({ 'should_display': this.block.comment_counter, 'value': this.block.comments, 'name': 'comments' }) | ||
| 93 | + // this.counters.push({ 'should_display': this.block.hit_counter, 'value': this.block.hits, 'name': 'hits' }) | ||
| 94 | + | ||
| 95 | + /** | ||
| 96 | + * There are helper functions to access the JQuery DOM like this. | ||
| 97 | + */ | ||
| 98 | + // it("render the profile image for each person", () => { | ||
| 99 | + // expect(helper.all("list-group-item").length).toEqual(3); | ||
| 100 | + // }); | ||
| 101 | + | ||
| 102 | + /** | ||
| 103 | + * The main debugElement element is also available | ||
| 104 | + */ | ||
| 105 | + // it("render the main noosfero people block", () => { | ||
| 106 | + // expect(helper.debugElement.children().length).toEqual(1, "The people-block should have a div children"); | ||
| 107 | + // }); | ||
| 108 | + | ||
| 109 | + /** | ||
| 110 | + * Just another example of a JQuery DOM helper function | ||
| 111 | + */ | ||
| 112 | + // it("render the noosfero people block div", () => { | ||
| 113 | + // let div = helper.findChildren("noosfero-people-block", "div"); | ||
| 114 | + // expect(div.className).toBe('people-block', "The class should be people-block"); | ||
| 115 | + // }); | ||
| 116 | + }); | ||
| 36 | }); | 117 | }); |
src/app/layout/blocks/statistics/statistics-block.component.ts
| 1 | -import {Component, Input} from "ng-forward"; | 1 | +import {Input, Inject, Component} from "ng-forward"; |
| 2 | 2 | ||
| 3 | @Component({ | 3 | @Component({ |
| 4 | selector: "noosfero-statistics-block", | 4 | selector: "noosfero-statistics-block", |
| @@ -7,12 +7,20 @@ import {Component, Input} from "ng-forward"; | @@ -7,12 +7,20 @@ import {Component, Input} from "ng-forward"; | ||
| 7 | 7 | ||
| 8 | export class StatisticsBlockComponent { | 8 | export class StatisticsBlockComponent { |
| 9 | 9 | ||
| 10 | - @Input() block: any; | 10 | + @Input() block: noosfero.StatisticsBlock; |
| 11 | @Input() owner: any; | 11 | @Input() owner: any; |
| 12 | 12 | ||
| 13 | - html: string; | 13 | + counters: any = []; |
| 14 | 14 | ||
| 15 | ngOnInit() { | 15 | ngOnInit() { |
| 16 | - this.html = this.block.settings.user_counter; | 16 | + this.counters.push({ 'should_display': this.block.user_counter, 'value': this.block.users, 'name': 'users' }); |
| 17 | + this.counters.push({ 'should_display': this.block.enterprise_counter, 'value': this.block.enterprises, 'name': 'enterprises' }); | ||
| 18 | + this.counters.push({ 'should_display': this.block.product_counter, 'value': this.block.products, 'name': 'products' }); | ||
| 19 | + this.counters.push({ 'should_display': this.block.community_counter, 'value': this.block.communities, 'name': 'communities' }); | ||
| 20 | + this.counters.push({ 'should_display': this.block.category_counter, 'value': this.block.categories, 'name': 'categories' }); | ||
| 21 | + this.counters.push({ 'should_display': this.block.tag_counter, 'value': this.block.tags, 'name': 'tags' }); | ||
| 22 | + this.counters.push({ 'should_display': this.block.comment_counter, 'value': this.block.comments, 'name': 'comments' }); | ||
| 23 | + this.counters.push({ 'should_display': this.block.hit_counter, 'value': this.block.hits, 'name': 'hits' }); | ||
| 24 | + | ||
| 17 | } | 25 | } |
| 18 | } | 26 | } |
src/app/layout/blocks/statistics/statistics-block.html
| 1 | -<div class="statistics-block" ng-bind-html="ctrl.html"> | 1 | +<div class="statistics-block"> |
| 2 | + <ul class="list-group"> | ||
| 3 | + <li ng-repeat="counter in ctrl.counters" class="list-group-item {{counter.name}}" ng-show="counter.should_display" > | ||
| 4 | + <span class="badge {{counter.name}}">{{counter.value}}</span> | ||
| 5 | + {{"statistics." + counter.name | translate}} | ||
| 6 | + </li> | ||
| 7 | + | ||
| 8 | + </ul> | ||
| 2 | </div> | 9 | </div> |
src/languages/en.json
| @@ -46,5 +46,13 @@ | @@ -46,5 +46,13 @@ | ||
| 46 | "article.basic_editor.success.message": "Article saved!", | 46 | "article.basic_editor.success.message": "Article saved!", |
| 47 | "article.basic_editor.visibility": "Visibility", | 47 | "article.basic_editor.visibility": "Visibility", |
| 48 | "article.basic_editor.visibility.public": "Public", | 48 | "article.basic_editor.visibility.public": "Public", |
| 49 | - "article.basic_editor.visibility.private": "Private" | 49 | + "article.basic_editor.visibility.private": "Private", |
| 50 | + "statistics.users": "Users", | ||
| 51 | + "statistics.enterprises": "Enterprises", | ||
| 52 | + "statistics.products": "Products", | ||
| 53 | + "statistics.communities": "Communities", | ||
| 54 | + "statistics.categories": "Categories", | ||
| 55 | + "statistics.tags": "Tags", | ||
| 56 | + "statistics.comments": "Comments", | ||
| 57 | + "statistics.hits": "Hits" | ||
| 50 | } | 58 | } |
src/languages/pt.json
| @@ -46,5 +46,13 @@ | @@ -46,5 +46,13 @@ | ||
| 46 | "article.basic_editor.success.message": "Artigo salvo com sucesso!", | 46 | "article.basic_editor.success.message": "Artigo salvo com sucesso!", |
| 47 | "article.basic_editor.visibility": "Visibilidade", | 47 | "article.basic_editor.visibility": "Visibilidade", |
| 48 | "article.basic_editor.visibility.public": "Público", | 48 | "article.basic_editor.visibility.public": "Público", |
| 49 | - "article.basic_editor.visibility.private": "Privado" | 49 | + "article.basic_editor.visibility.private": "Privado", |
| 50 | + "statistics.users": "Usuários", | ||
| 51 | + "statistics.enterprises": "Empreendimentos", | ||
| 52 | + "statistics.products": "Produtos", | ||
| 53 | + "statistics.communities": "Comunidades", | ||
| 54 | + "statistics.categories": "Categorias", | ||
| 55 | + "statistics.tags": "Tags", | ||
| 56 | + "statistics.comments": "Comentários", | ||
| 57 | + "statistics.hits": "Acessos" | ||
| 50 | } | 58 | } |
| @@ -0,0 +1,20 @@ | @@ -0,0 +1,20 @@ | ||
| 1 | +namespace noosfero { | ||
| 2 | + export interface StatisticsBlock extends Block { | ||
| 3 | + user_counter: boolean; | ||
| 4 | + users: number; | ||
| 5 | + enterprise_counter: boolean; | ||
| 6 | + enterprises: number; | ||
| 7 | + product_counter: boolean; | ||
| 8 | + products: number; | ||
| 9 | + community_counter: boolean; | ||
| 10 | + communities: number; | ||
| 11 | + category_counter: boolean; | ||
| 12 | + categories: number; | ||
| 13 | + tag_counter: boolean; | ||
| 14 | + tags: number; | ||
| 15 | + comment_counter: boolean; | ||
| 16 | + comments: number; | ||
| 17 | + hit_counter: boolean; | ||
| 18 | + hits: number; | ||
| 19 | + } | ||
| 20 | +} |