Commit 7e4cecee778feb5e4c5b6458cd2dfc2b9d97e91d
1 parent
af427f22
Exists in
master
and in
26 other branches
Added @ngdoc documentation and refactor the SidebarSection component
Showing
8 changed files
with
217 additions
and
66 deletions
Show diff stats
src/app/layout/services/body-state-classes.service.ts
| @@ -17,6 +17,9 @@ export interface StartParams { | @@ -17,6 +17,9 @@ export interface StartParams { | ||
| 17 | * Route States: | 17 | * Route States: |
| 18 | * - noosfero-route-main | 18 | * - noosfero-route-main |
| 19 | * - noosfero-route-main.profile.info | 19 | * - noosfero-route-main.profile.info |
| 20 | + * | ||
| 21 | + * Show the all content in full mode: | ||
| 22 | + * - full-content | ||
| 20 | */ | 23 | */ |
| 21 | @Injectable() | 24 | @Injectable() |
| 22 | @Inject("$rootScope", "$document", "$state", AuthService) | 25 | @Inject("$rootScope", "$document", "$state", AuthService) |
| @@ -0,0 +1,126 @@ | @@ -0,0 +1,126 @@ | ||
| 1 | +import {Component, Input} from "ng-forward"; | ||
| 2 | + | ||
| 3 | +@Component({ | ||
| 4 | + selector: 'sidebar-section', | ||
| 5 | + templateUrl: 'app/layout/sidebar/sidebar-section.html' | ||
| 6 | +}) | ||
| 7 | +/** | ||
| 8 | + * @ngdoc object | ||
| 9 | + * @name sidebar.SidebarSectionComponent | ||
| 10 | + * @description | ||
| 11 | + * This is a widget to render sections to | ||
| 12 | + * SidebarComponent. | ||
| 13 | + * | ||
| 14 | + * <b>Usage example:</b> | ||
| 15 | + * @example | ||
| 16 | + * <pre> | ||
| 17 | + * let section: SidebarSectionComponent = new SidebarSectionComponent('MySection'); | ||
| 18 | + * section.addItem({ | ||
| 19 | + * title: 'Friends', | ||
| 20 | + * count: 0, | ||
| 21 | + * url: '#', | ||
| 22 | + * className: 'active', | ||
| 23 | + * icon: 'fa-users', //A font-awesome icon class | ||
| 24 | + * subitems: [ | ||
| 25 | + * { title: 'Example' } | ||
| 26 | + * ] | ||
| 27 | + * }); | ||
| 28 | + * </pre> | ||
| 29 | + */ | ||
| 30 | +export class SidebarSectionComponent { | ||
| 31 | + | ||
| 32 | + /** | ||
| 33 | + * @ngdoc property | ||
| 34 | + * @name name | ||
| 35 | + * @propertyOf sidebar.SidebarComponent | ||
| 36 | + * @description | ||
| 37 | + * The name of the section | ||
| 38 | + */ | ||
| 39 | + @Input() | ||
| 40 | + public name: string; | ||
| 41 | + | ||
| 42 | + /** | ||
| 43 | + * @ngdoc property | ||
| 44 | + * @name items | ||
| 45 | + * @propertyOf sidebar.SidebarComponent | ||
| 46 | + * @description | ||
| 47 | + * Array of items to render into this sidebar menu | ||
| 48 | + */ | ||
| 49 | + @Input() | ||
| 50 | + public items: any[] = [ | ||
| 51 | + { | ||
| 52 | + title: 'Friends', | ||
| 53 | + count: 0, | ||
| 54 | + url: '#', | ||
| 55 | + className: 'active', | ||
| 56 | + icon: 'fa-users' | ||
| 57 | + } | ||
| 58 | + ]; | ||
| 59 | + | ||
| 60 | + /** | ||
| 61 | + * @ngdoc method | ||
| 62 | + * @name constructor | ||
| 63 | + * @methodOf sidebar.SidebarSectionComponent | ||
| 64 | + * @param {string} name The name of the section (optional) | ||
| 65 | + * @description | ||
| 66 | + * The constructor for this component. The name of section | ||
| 67 | + * can be assigned here, optionally | ||
| 68 | + */ | ||
| 69 | + constructor(name?: string) { | ||
| 70 | + this.name = name; | ||
| 71 | + } | ||
| 72 | + | ||
| 73 | + /** | ||
| 74 | + * @ngdoc method | ||
| 75 | + * @name addItem | ||
| 76 | + * @methodOf sidebar.SidebarSectionComponent | ||
| 77 | + * @param {Object} item Literal object with properties to render a menu item | ||
| 78 | + * @returns {SidebarSectionComponent} This own component type, using the "Fluent Interface" pattern | ||
| 79 | + * @description | ||
| 80 | + * Use this method to add new items for a section instance | ||
| 81 | + * | ||
| 82 | + * <b>Usage example:</b> | ||
| 83 | + * @example | ||
| 84 | + * <pre> | ||
| 85 | + * section.addItem({ | ||
| 86 | + * title: 'Friends', | ||
| 87 | + * count: 0, | ||
| 88 | + * url: '#', | ||
| 89 | + * className: 'active', | ||
| 90 | + * icon: 'fa-users', //A font-awesome icon class | ||
| 91 | + * subitems: [ | ||
| 92 | + * { title: 'Example' } //A subitem literal object | ||
| 93 | + * ] | ||
| 94 | + * }); | ||
| 95 | + * </pre> | ||
| 96 | + */ | ||
| 97 | + addItem(item: any): SidebarSectionComponent { | ||
| 98 | + this.items.push(item); | ||
| 99 | + return this; | ||
| 100 | + } | ||
| 101 | + | ||
| 102 | + /** | ||
| 103 | + * @ngdoc method | ||
| 104 | + * @name setName | ||
| 105 | + * @methodOf sidebar.SidebarSectionComponent | ||
| 106 | + * @param {string} name The name of the section | ||
| 107 | + * @returns {SidebarSectionComponent} This own component type, using the "Fluent Interface" pattern | ||
| 108 | + * @description | ||
| 109 | + * Change the name of the section assigned on constructor | ||
| 110 | + * | ||
| 111 | + * <b>Usage example:</b> | ||
| 112 | + * @example | ||
| 113 | + * <pre> | ||
| 114 | + * section.setName('MyAnotherSection') | ||
| 115 | + * .addItem({ | ||
| 116 | + * //Item here | ||
| 117 | + * ... | ||
| 118 | + * }); | ||
| 119 | + * </pre> | ||
| 120 | + */ | ||
| 121 | + setName(name: string): SidebarSectionComponent { | ||
| 122 | + this.name = name; | ||
| 123 | + return this; | ||
| 124 | + } | ||
| 125 | + | ||
| 126 | +} |
| @@ -0,0 +1,21 @@ | @@ -0,0 +1,21 @@ | ||
| 1 | +<ul class="nav nav-pills nav-stacked"> | ||
| 2 | + <li class="nav-header nav-header-first hidden-sm hidden-xs"> | ||
| 3 | + {{ctrl.name}} | ||
| 4 | + </li> | ||
| 5 | + | ||
| 6 | + <li ng-click="widgetExpanded = !widgetExpanded" ng-repeat="item in ctrl.items" class="{{item.className}}"> | ||
| 7 | + <a href="{{item.url}}" class="dropdown-toggle"> | ||
| 8 | + <i class="fa {{item.icon}}"></i> | ||
| 9 | + <span>{{item.title}}</span> | ||
| 10 | + <span class="label label-primary label-circle pull-right" ng-class="{'submenu-count': item.subitems}" ng-show="item.count != undefined">{{item.count}}</span> | ||
| 11 | + <i class="fa fa-angle-right drop-icon" ng-show="item.subitems"></i> | ||
| 12 | + </a> | ||
| 13 | + <ul class="submenu" ng-show="widgetExpanded && item.subitems"> | ||
| 14 | + <li ng-repeat="subitem in item.subitems"> | ||
| 15 | + <a href="{{subitem.url}}"> | ||
| 16 | + {{subitem.title}} | ||
| 17 | + </a> | ||
| 18 | + </li> | ||
| 19 | + </ul> | ||
| 20 | + </li> | ||
| 21 | +</ul> |
src/app/layout/sidebar/sidebar-sections.component.ts
| @@ -1,30 +0,0 @@ | @@ -1,30 +0,0 @@ | ||
| 1 | -import {Component, Inject, Input} from "ng-forward"; | ||
| 2 | - | ||
| 3 | -@Component({ | ||
| 4 | - selector: 'sidebar-sections', | ||
| 5 | - templateUrl: 'app/layout/sidebar/sidebar-sections.html' | ||
| 6 | -}) | ||
| 7 | - | ||
| 8 | -//@Inject('translateFilter') | ||
| 9 | -export class SidebarSectionsComponent { | ||
| 10 | - | ||
| 11 | - @Input() | ||
| 12 | - public items: any[] = [ | ||
| 13 | - { | ||
| 14 | - title: 'Friends', | ||
| 15 | - count: 0, | ||
| 16 | - url: '#', | ||
| 17 | - className: 'active', | ||
| 18 | - icon: 'fa-users', | ||
| 19 | - subitems: [ | ||
| 20 | - { title: 'Example' } | ||
| 21 | - ] | ||
| 22 | - } | ||
| 23 | - ]; | ||
| 24 | - | ||
| 25 | - addItem(item: any): SidebarSectionsComponent { | ||
| 26 | - this.items.push(item); | ||
| 27 | - return this; | ||
| 28 | - } | ||
| 29 | - | ||
| 30 | -} |
src/app/layout/sidebar/sidebar-sections.html
| @@ -1,21 +0,0 @@ | @@ -1,21 +0,0 @@ | ||
| 1 | -<ul class="nav nav-pills nav-stacked"> | ||
| 2 | - <li class="nav-header nav-header-first hidden-sm hidden-xs"> | ||
| 3 | - Navigation | ||
| 4 | - </li> | ||
| 5 | - | ||
| 6 | - <li ng-click="widgetExpanded = !widgetExpanded" ng-repeat="item in ctrl.items" class="{{item.className}}"> | ||
| 7 | - <a href="{{item.url}}" class="dropdown-toggle"> | ||
| 8 | - <i class="fa {{item.icon}}"></i> | ||
| 9 | - <span>{{item.title}}</span> | ||
| 10 | - <span class="label label-primary label-circle pull-right" ng-class="{'submenu-count': item.subitems}" ng-show="item.count != undefined">{{item.count}}</span> | ||
| 11 | - <i class="fa fa-angle-right drop-icon" ng-show="item.subitems"></i> | ||
| 12 | - </a> | ||
| 13 | - <ul class="submenu" ng-show="widgetExpanded && item.subitems"> | ||
| 14 | - <li ng-repeat="subitem in item.subitems"> | ||
| 15 | - <a href="{{subitem.url}}"> | ||
| 16 | - {{subitem.title}} | ||
| 17 | - </a> | ||
| 18 | - </li> | ||
| 19 | - </ul> | ||
| 20 | - </li> | ||
| 21 | -</ul> |
src/app/layout/sidebar/sidebar.component.spec.ts
| @@ -2,7 +2,7 @@ import {provide} from 'ng-forward'; | @@ -2,7 +2,7 @@ import {provide} from 'ng-forward'; | ||
| 2 | import {ComponentTestHelper, createClass} from '../../../spec/component-test-helper'; | 2 | import {ComponentTestHelper, createClass} from '../../../spec/component-test-helper'; |
| 3 | import {providers} from 'ng-forward/cjs/testing/providers'; | 3 | import {providers} from 'ng-forward/cjs/testing/providers'; |
| 4 | import {SidebarComponent} from './sidebar.component'; | 4 | import {SidebarComponent} from './sidebar.component'; |
| 5 | -import {SidebarSectionsComponent} from './sidebar-sections.component'; | 5 | +import {SidebarSectionComponent} from './sidebar-section.component'; |
| 6 | import * as helpers from '../../../spec/helpers'; | 6 | import * as helpers from '../../../spec/helpers'; |
| 7 | 7 | ||
| 8 | const htmlTemplate: string = '<sidebar [visible]="false"></sidebar>'; | 8 | const htmlTemplate: string = '<sidebar [visible]="false"></sidebar>'; |
| @@ -43,8 +43,8 @@ describe('Sidebar Component', () => { | @@ -43,8 +43,8 @@ describe('Sidebar Component', () => { | ||
| 43 | provide('SessionService', { | 43 | provide('SessionService', { |
| 44 | useValue: sessionService | 44 | useValue: sessionService |
| 45 | }), | 45 | }), |
| 46 | - provide('SidebarSectionsComponent', { | ||
| 47 | - useValue: SidebarSectionsComponent | 46 | + provide('SidebarSectionComponent', { |
| 47 | + useValue: SidebarSectionComponent | ||
| 48 | }) | 48 | }) |
| 49 | ]; | 49 | ]; |
| 50 | }); | 50 | }); |
| @@ -81,7 +81,6 @@ describe('Sidebar Component', () => { | @@ -81,7 +81,6 @@ describe('Sidebar Component', () => { | ||
| 81 | 81 | ||
| 82 | notifyService.setVisibility(true); | 82 | notifyService.setVisibility(true); |
| 83 | expect(helper.debugElement.query('li.active a span').text()).toMatch('Friends'); | 83 | expect(helper.debugElement.query('li.active a span').text()).toMatch('Friends'); |
| 84 | - expect(helper.debugElement.query('li.active .submenu li a').text()).toMatch('Example'); | ||
| 85 | }); | 84 | }); |
| 86 | 85 | ||
| 87 | }); | 86 | }); |
src/app/layout/sidebar/sidebar.component.ts
| 1 | import {Component, Inject, Input} from "ng-forward"; | 1 | import {Component, Inject, Input} from "ng-forward"; |
| 2 | import {SidebarNotificationService} from "./sidebar.notification.service"; | 2 | import {SidebarNotificationService} from "./sidebar.notification.service"; |
| 3 | import {SessionService} from '../../login/session.service'; | 3 | import {SessionService} from '../../login/session.service'; |
| 4 | -import {SidebarSectionsComponent} from './sidebar-sections.component'; | 4 | +import {SidebarSectionComponent} from './sidebar-section.component'; |
| 5 | 5 | ||
| 6 | @Component({ | 6 | @Component({ |
| 7 | selector: 'sidebar', | 7 | selector: 'sidebar', |
| 8 | templateUrl: 'app/layout/sidebar/sidebar.html', | 8 | templateUrl: 'app/layout/sidebar/sidebar.html', |
| 9 | - directives: [SidebarSectionsComponent] | 9 | + directives: [SidebarSectionComponent] |
| 10 | }) | 10 | }) |
| 11 | @Inject(SidebarNotificationService, SessionService) | 11 | @Inject(SidebarNotificationService, SessionService) |
| 12 | +/** | ||
| 13 | + * @ngdoc object | ||
| 14 | + * @name sidebar.SidebarComponent | ||
| 15 | + * @requires [SidebarNotificationService, SessionService] | ||
| 16 | + * @description | ||
| 17 | + * This is a widget to a sidebar with visible control. | ||
| 18 | + * Needs a SidebarSectionComponent to show sections/items/subitems | ||
| 19 | + * menu | ||
| 20 | + * | ||
| 21 | + * <b>Usage example:</b> | ||
| 22 | + * @example | ||
| 23 | + * <pre> | ||
| 24 | + * let sidebar: SidebarComponent = new SidebarComponent(SidebarNotificationService, SessionService); | ||
| 25 | + * sidebar.visible = true; | ||
| 26 | + * </pre> | ||
| 27 | + */ | ||
| 12 | export class SidebarComponent { | 28 | export class SidebarComponent { |
| 13 | 29 | ||
| 30 | + /** | ||
| 31 | + * @ngdoc property | ||
| 32 | + * @name visible | ||
| 33 | + * @propertyOf sidebar.SidebarComponent | ||
| 34 | + * @description | ||
| 35 | + * Controls if this component is show/hide | ||
| 36 | + */ | ||
| 14 | @Input() | 37 | @Input() |
| 15 | private visible: boolean = false; | 38 | private visible: boolean = false; |
| 16 | 39 | ||
| 40 | + /** | ||
| 41 | + * @ngdoc property | ||
| 42 | + * @name showStatus | ||
| 43 | + * @propertyOf sidebar.SidebarComponent | ||
| 44 | + * @description | ||
| 45 | + * Controls the show/hide state of the circle user status | ||
| 46 | + */ | ||
| 17 | @Input('showstatus') | 47 | @Input('showstatus') |
| 18 | public showStatus: boolean = false; | 48 | public showStatus: boolean = false; |
| 19 | 49 | ||
| 50 | + /** | ||
| 51 | + * @ngdoc property | ||
| 52 | + * @name user | ||
| 53 | + * @propertyOf sidebar.SidebarComponent | ||
| 54 | + * @description | ||
| 55 | + * The user data to show into sidebar | ||
| 56 | + */ | ||
| 20 | @Input() | 57 | @Input() |
| 21 | public user: { name: string } = { | 58 | public user: { name: string } = { |
| 22 | name: '' | 59 | name: '' |
| 23 | }; | 60 | }; |
| 24 | 61 | ||
| 25 | - | 62 | + /** |
| 63 | + * @ngdoc method | ||
| 64 | + * @name constructor | ||
| 65 | + * @methodOf sidebar.SidebarComponent | ||
| 66 | + * @param {SidebarNotificationService} notificationService The service that emmits events to show/hide this component | ||
| 67 | + * @param {SessionService} session The service that loads the user data when user is logged | ||
| 68 | + * @description | ||
| 69 | + * The constructor for this component. Loads the dependencies services | ||
| 70 | + */ | ||
| 26 | constructor(private notificationService: SidebarNotificationService, private session: SessionService) { } | 71 | constructor(private notificationService: SidebarNotificationService, private session: SessionService) { } |
| 27 | 72 | ||
| 73 | + /** | ||
| 74 | + * @ngdoc method | ||
| 75 | + * @name ngOnInit | ||
| 76 | + * @methodOf sidebar.SidebarComponent | ||
| 77 | + * @description | ||
| 78 | + * Check the initial visibility when this component is loaded | ||
| 79 | + */ | ||
| 28 | ngOnInit() { | 80 | ngOnInit() { |
| 29 | 81 | ||
| 30 | let userData: any = this.session.currentUser(); | 82 | let userData: any = this.session.currentUser(); |
| @@ -38,6 +90,14 @@ export class SidebarComponent { | @@ -38,6 +90,14 @@ export class SidebarComponent { | ||
| 38 | }); | 90 | }); |
| 39 | } | 91 | } |
| 40 | 92 | ||
| 93 | + /** | ||
| 94 | + * @ngdoc method | ||
| 95 | + * @name isVisible | ||
| 96 | + * @methodOf sidebar.SidebarComponent | ||
| 97 | + * @returns {boolean} True, whether this component is visible, otherwise returns false | ||
| 98 | + * @description | ||
| 99 | + * Verify whether sidebar is visible or not | ||
| 100 | + */ | ||
| 41 | isVisible(): boolean { | 101 | isVisible(): boolean { |
| 42 | return <boolean>this.visible; | 102 | return <boolean>this.visible; |
| 43 | } | 103 | } |
src/app/layout/sidebar/sidebar.html
| @@ -7,14 +7,7 @@ | @@ -7,14 +7,7 @@ | ||
| 7 | <span class="name"> | 7 | <span class="name"> |
| 8 | <a href="#" class="dropdown-toggle" data-toggle="dropdown"> | 8 | <a href="#" class="dropdown-toggle" data-toggle="dropdown"> |
| 9 | {{ctrl.user.name}} | 9 | {{ctrl.user.name}} |
| 10 | - <i class="fa fa-angle-down"></i> | ||
| 11 | </a> | 10 | </a> |
| 12 | - <ul class="dropdown-menu"> | ||
| 13 | - <li><a href="user-profile.html"><i class="fa fa-user"></i>Profile</a></li> | ||
| 14 | - <li><a href="#"><i class="fa fa-cog"></i>Settings</a></li> | ||
| 15 | - <li><a href="#"><i class="fa fa-envelope-o"></i>Messages</a></li> | ||
| 16 | - <li><a href="#"><i class="fa fa-power-off"></i>Logout</a></li> | ||
| 17 | - </ul> | ||
| 18 | </span> | 11 | </span> |
| 19 | <span class="status" ng-show="ctrl.showStatus"> | 12 | <span class="status" ng-show="ctrl.showStatus"> |
| 20 | <i class="fa fa-circle"></i> {{ctrl.user.status}} | 13 | <i class="fa fa-circle"></i> {{ctrl.user.status}} |
| @@ -23,7 +16,7 @@ | @@ -23,7 +16,7 @@ | ||
| 23 | </div> | 16 | </div> |
| 24 | 17 | ||
| 25 | <div class="collapse navbar-collapse navbar-ex1-collapse" id="sidebar-nav"> | 18 | <div class="collapse navbar-collapse navbar-ex1-collapse" id="sidebar-nav"> |
| 26 | - <sidebar-sections></sidebar-sections> | 19 | + <sidebar-section [name]='Navigation'></sidebar-section> |
| 27 | </div> | 20 | </div> |
| 28 | </div> | 21 | </div> |
| 29 | </section> | 22 | </section> |