Skip to content

coderigo/cr-bootstrap-navbar

Repository files navigation

Angular (UI-Router) Bootstrap Navbar

A basic AngularJS directive for Bootstrap's navbar that builds itself based on data entered into Angular UI-Router's app configuration.

This is very much a work in progress and could do with a lot of work.

Check out the Demo.

Requirements and installation

It is fully intended to be used in conjunction with Angular UI-Router so you'll need that, as well as bootstrap, underscore, and angular-underscore. These will all be installed by the following if you don't already have them:

bower install --save angular-bootstrap-navbar

Then make sure your project includes all of the dependencies:

<script src="bower_components/angular-ui-router/release/angular-ui-router.js"></script>
<script src="bower_components/bootstrap/dist/js/bootstrap.js"></script>
<script src="bower_components/underscore/underscore.js"></script>
<script src="bower_components/angular-underscore/angular-underscore.js"></script>
<script src="bower_components/cr-bootstrap-navbar/src/cr-bootstrap-navbar.js"></script>

Example

Check out the Demo for more context.

Suppose we wanted to create the following navbar using data in UI Router's state configurations:

Layout

In your HTML, where you want your navbar, you'd place the directive and first and second level ui-views:

<!-- Stuff here ....-->

    <body ng-app="myapp">
        
        <!-- The navbar directive, by default not inverse class -->
        <div cr-bootstrap-navbar css-inverse="true"></div>

        <!-- Some demo content -->
        <div class="container">

            <div class="row marketing">

              <div ui-view> <!-- First (top) view level -->

                <div ui-view></div> <!-- Second level nesting -->

              </div>

            </div>

        </div>
    </body>

<!-- More stuff here ....-->

In your app configuration, you'd specify the states as groups of links. This is done by adding a bsNav property to the custom data object of the UI Router state you want to show up in the navbar. For this example it would look like this:

angular
    .module('myApp', [
        'ui.router',
        'cr.bootstrap.navbar'
    ])
    .config(function($stateProvider, $urlRouterProvider){

        //     stuff here

        $urlRouterProvider.otherwise('/readme');

        $stateProvider
                // First group of nav links
                .state('readme', {
                    url         : '/readme',
                    templateUrl : 'views/readme.html',
                    data        : {
                        bsNav : {
                            type        : 'brand',
                            textDisplay : 'cr-bootstrap-navbar',
                            group       : 0
                        }
                    }
                })
                // Second group of navlinks (left-aligned by default)
                .state('home', {
                    url         : '/home',
                    templateUrl : 'views/home.html',
                    data        : {
                        bsNav : {
                            textDisplay : 'Home',
                            group       : 1
                        }
                    }
                })
                .state('about', {
                    url         : '/about',
                    templateUrl : 'views/about.html',
                    data        : {
                        bsNav : {
                            textDisplay : 'About',
                            group       : 1
                        }
                    }
                })
                .state('multi', {
                    url        : '/multi',
                    abstract   : true,
                    controller : demoController,
                    data       : {
                        bsNav : {
                            isDropdown  : true,
                            textDisplay : 'Multi-Section',
                            group       : 1
                        }
                    }
                })
                    .state('multi.first', {
                        parent      : 'multi',
                        url         : '/first',
                        templateUrl : 'views/multi.first.html',

                        data        : {
                            bsNav : {
                                type        : 'dropdownLink',
                                textDisplay : 'Section1'
                            }
                        }
                    })
                    .state('multi.second', {
                        parent      : 'multi',
                        url         : '/second',
                        templateUrl : 'views/multi.second.html',

                        data        : {
                            bsNav : {
                                type        : 'dropdownLink',
                                textDisplay : 'Section2'
                            }
                        }
                    })
                    .state('multi.third', {
                        parent      : 'multi',
                        url         : '/third',
                        templateUrl : 'views/multi.third.html',

                        data        : {
                            bsNav : {
                                type          : 'dropdownLink',
                                textDisplay   : 'Section3'
                            }
                        }
                    })
                // Third group of navlinks (explicity right-aligned on first declaration)
                .state('Help', {
                    url         : '/help',
                    templateUrl : 'views/help.html',
                    data        : {
                        bsNav : {
                            textDisplay : 'Help',
                            group       : 2,
                            align       : 'right'
                        }
                    }
                })
                .state('user', {
                    url  : '/user',
                    data : {
                        bsNav : {
                            textDisplay : 'Pippo',
                            group       : 2
                        }
                    }
                });

        // More stuff here

});

API

The bsNav object contains the following properties

bsNav : {

    // defaults to "link" but can be "dropDownLink" (a link with 
    // sub-links in a dropdown) or "brand" (a right-aligned link with "brand" bootstrap class)
    type : "link" ,

    // The text to display on the navbar for this state
    textDisplay : "About" ,

    // The link group (zero-based) `ul` this link belongs to (see picture above)
    group : 1 ,

    // Whether to align the link group left (default) or right. 
    // It only needs to be declared on the first state belonging to the link group
    align : "right" 
}

Limitations/To-Dos

  • Test coverage is undercooked.
  • Allow forms to be included in navbar
  • Allow icon classes to be specified

Contributions

This is still pretty raw but if it's useful to others contributions are welcome.

To contribute install prerequisites:

npm install && bower install

Then spin up the demo to begin developing and watching changes:

grunt demo

Tests can be run with:

grunt test

Building can be done with:

grunt build

About

Angular UI-Router based Bootstrap Navbar directive

Resources

Stars

Watchers

Forks

Packages

No packages published