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 | 17 | * Route States: |
| 18 | 18 | * - noosfero-route-main |
| 19 | 19 | * - noosfero-route-main.profile.info |
| 20 | + * | |
| 21 | + * Show the all content in full mode: | |
| 22 | + * - full-content | |
| 20 | 23 | */ |
| 21 | 24 | @Injectable() |
| 22 | 25 | @Inject("$rootScope", "$document", "$state", AuthService) | ... | ... |
| ... | ... | @@ -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 @@ |
| 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 | -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 | -<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 | 2 | import {ComponentTestHelper, createClass} from '../../../spec/component-test-helper'; |
| 3 | 3 | import {providers} from 'ng-forward/cjs/testing/providers'; |
| 4 | 4 | import {SidebarComponent} from './sidebar.component'; |
| 5 | -import {SidebarSectionsComponent} from './sidebar-sections.component'; | |
| 5 | +import {SidebarSectionComponent} from './sidebar-section.component'; | |
| 6 | 6 | import * as helpers from '../../../spec/helpers'; |
| 7 | 7 | |
| 8 | 8 | const htmlTemplate: string = '<sidebar [visible]="false"></sidebar>'; |
| ... | ... | @@ -43,8 +43,8 @@ describe('Sidebar Component', () => { |
| 43 | 43 | provide('SessionService', { |
| 44 | 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 | 81 | |
| 82 | 82 | notifyService.setVisibility(true); |
| 83 | 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 | 1 | import {Component, Inject, Input} from "ng-forward"; |
| 2 | 2 | import {SidebarNotificationService} from "./sidebar.notification.service"; |
| 3 | 3 | import {SessionService} from '../../login/session.service'; |
| 4 | -import {SidebarSectionsComponent} from './sidebar-sections.component'; | |
| 4 | +import {SidebarSectionComponent} from './sidebar-section.component'; | |
| 5 | 5 | |
| 6 | 6 | @Component({ |
| 7 | 7 | selector: 'sidebar', |
| 8 | 8 | templateUrl: 'app/layout/sidebar/sidebar.html', |
| 9 | - directives: [SidebarSectionsComponent] | |
| 9 | + directives: [SidebarSectionComponent] | |
| 10 | 10 | }) |
| 11 | 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 | 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 | 37 | @Input() |
| 15 | 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 | 47 | @Input('showstatus') |
| 18 | 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 | 57 | @Input() |
| 21 | 58 | public user: { name: string } = { |
| 22 | 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 | 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 | 80 | ngOnInit() { |
| 29 | 81 | |
| 30 | 82 | let userData: any = this.session.currentUser(); |
| ... | ... | @@ -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 | 101 | isVisible(): boolean { |
| 42 | 102 | return <boolean>this.visible; |
| 43 | 103 | } | ... | ... |
src/app/layout/sidebar/sidebar.html
| ... | ... | @@ -7,14 +7,7 @@ |
| 7 | 7 | <span class="name"> |
| 8 | 8 | <a href="#" class="dropdown-toggle" data-toggle="dropdown"> |
| 9 | 9 | {{ctrl.user.name}} |
| 10 | - <i class="fa fa-angle-down"></i> | |
| 11 | 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 | 11 | </span> |
| 19 | 12 | <span class="status" ng-show="ctrl.showStatus"> |
| 20 | 13 | <i class="fa fa-circle"></i> {{ctrl.user.status}} |
| ... | ... | @@ -23,7 +16,7 @@ |
| 23 | 16 | </div> |
| 24 | 17 | |
| 25 | 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 | 20 | </div> |
| 28 | 21 | </div> |
| 29 | 22 | </section> | ... | ... |