grunt >= 0.4.x
. Make sure to upgrade your environment and read the
53 | [Migration Guide](http://gruntjs.com/upgrading-from-0.3-to-0.4).
54 |
55 | Dependencies for building from source and running tests:
56 |
57 | * [grunt-cli](https://github.com/gruntjs/grunt-cli) - run: `$ npm install -g grunt-cli`
58 | * Then, install the development dependencies by running `$ npm install` from the project directory
59 |
60 | There are a number of targets in the gruntfile that are used to generating different builds:
61 |
62 | * `grunt`: Perform a normal build, runs jshint and karma tests
63 | * `grunt build`: Perform a normal build
64 | * `grunt dist`: Perform a clean build and generate documentation
65 | * `grunt dev`: Run dev server (sample app) and watch for changes, builds and runs karma tests on changes.
66 |
--------------------------------------------------------------------------------
/bower_components/angular-ui-router/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License
2 |
3 | Copyright (c) 2013-2015 The AngularUI Team, Karsten Sperling
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in
13 | all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | THE SOFTWARE.
22 |
--------------------------------------------------------------------------------
/bower_components/angular-ui-router/README.md:
--------------------------------------------------------------------------------
1 | # AngularUI Router [](https://travis-ci.org/angular-ui/ui-router)
2 |
3 | #### The de-facto solution to flexible routing with nested views
4 | ---
5 | **[Download 0.2.18](https://cdn.rawgit.com/angular-ui/ui-router/0.2.18/release/angular-ui-router.js)** (or **[Minified](https://cdn.rawgit.com/angular-ui/ui-router/0.2.18/release/angular-ui-router.min.js)**) **|**
6 | **[Guide](https://github.com/angular-ui/ui-router/wiki) |**
7 | **[API](http://angular-ui.github.io/ui-router/site) |**
8 | **[Sample](http://angular-ui.github.com/ui-router/sample/) ([Src](https://github.com/angular-ui/ui-router/tree/gh-pages/sample)) |**
9 | **[FAQ](https://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions) |**
10 | **[Resources](#resources) |**
11 | **[Report an Issue](https://github.com/angular-ui/ui-router/blob/master/CONTRIBUTING.md#report-an-issue) |**
12 | **[Contribute](https://github.com/angular-ui/ui-router/blob/master/CONTRIBUTING.md#contribute) |**
13 | **[Help!](http://stackoverflow.com/questions/ask?tags=angularjs,angular-ui-router) |**
14 | **[Discuss](https://groups.google.com/forum/#!categories/angular-ui/router)**
15 |
16 | ---
17 |
18 | *_Please help us out by testing the 1.0 alpha release!_*
19 |
20 | [1.0.0alpha0 Announcement](https://github.com/angular-ui/ui-router/releases/tag/1.0.0alpha0) ([Source Code](https://github.com/angular-ui/ui-router/tree/master)) | [Sample App](http://ui-router.github.io/sample-app/) ([Source Code](https://github.com/ui-router/sample-app)) | [Known Issues](https://github.com/angular-ui/ui-router/issues?q=is%3Aissue+is%3Aopen+label%3A1.0)
21 |
22 |
23 | ---
24 |
25 | AngularUI Router is a routing framework for [AngularJS](http://angularjs.org), which allows you to organize the
26 | parts of your interface into a [*state machine*](https://en.wikipedia.org/wiki/Finite-state_machine). Unlike the
27 | [`$route` service](http://docs.angularjs.org/api/ngRoute.$route) in the Angular ngRoute module, which is organized around URL
28 | routes, UI-Router is organized around [*states*](https://github.com/angular-ui/ui-router/wiki),
29 | which may optionally have routes, as well as other behavior, attached.
30 |
31 | States are bound to *named*, *nested* and *parallel views*, allowing you to powerfully manage your application's interface.
32 |
33 | Check out the sample app: http://angular-ui.github.io/ui-router/sample/
34 |
35 | -
36 | **Note:** *UI-Router is under active development. As such, while this library is well-tested, the API may change. Consider using it in production applications only if you're comfortable following a changelog and updating your usage accordingly.*
37 |
38 |
39 | ## Get Started
40 |
41 | **(1)** Get UI-Router in one of the following ways:
42 | - clone & [build](CONTRIBUTING.md#developing) this repository
43 | - [download the release](http://angular-ui.github.io/ui-router/release/angular-ui-router.js) (or [minified](http://angular-ui.github.io/ui-router/release/angular-ui-router.min.js))
44 | - [link to cdn](http://cdnjs.com/libraries/angular-ui-router)
45 | - via **[jspm](http://jspm.io/)**: by running `$ jspm install angular-ui-router` from your console
46 | - or via **[npm](https://www.npmjs.org/)**: by running `$ npm install angular-ui-router` from your console
47 | - or via **[Bower](http://bower.io/)**: by running `$ bower install angular-ui-router` from your console
48 | - or via **[Component](https://github.com/component/component)**: by running `$ component install angular-ui/ui-router` from your console
49 |
50 | **(2)** Include `angular-ui-router.js` (or `angular-ui-router.min.js`) in your `index.html`, after including Angular itself (For Component users: ignore this step)
51 |
52 | **(3)** Add `'ui.router'` to your main module's list of dependencies (For Component users: replace `'ui.router'` with `require('angular-ui-router')`)
53 |
54 | When you're done, your setup should look similar to the following:
55 |
56 | >
57 | ```html
58 |
59 |
60 |
61 |
62 |
63 |
68 | ...
69 |
70 |
71 | ...
72 |
73 |
74 | ```
75 |
76 | ### [Nested States & Views](http://plnkr.co/edit/u18KQc?p=preview)
77 |
78 | The majority of UI-Router's power is in its ability to nest states & views.
79 |
80 | **(1)** First, follow the [setup](#get-started) instructions detailed above.
81 |
82 | **(2)** Then, add a [`ui-view` directive](https://github.com/angular-ui/ui-router/wiki/Quick-Reference#ui-view) to the `30 | * $resolve.study(invocables)(locals, parent, self) 31 | *32 | * is equivalent to 33 | *
34 | * $resolve.resolve(invocables, locals, parent, self) 35 | *36 | * but the former is more efficient (in fact `resolve` just calls `study` 37 | * internally). 38 | * 39 | * @param {object} invocables Invocable objects 40 | * @return {function} a function to pass in locals, parent and self 41 | */ 42 | this.study = function (invocables) { 43 | if (!isObject(invocables)) throw new Error("'invocables' must be an object"); 44 | var invocableKeys = objectKeys(invocables || {}); 45 | 46 | // Perform a topological sort of invocables to build an ordered plan 47 | var plan = [], cycle = [], visited = {}; 48 | function visit(value, key) { 49 | if (visited[key] === VISIT_DONE) return; 50 | 51 | cycle.push(key); 52 | if (visited[key] === VISIT_IN_PROGRESS) { 53 | cycle.splice(0, indexOf(cycle, key)); 54 | throw new Error("Cyclic dependency: " + cycle.join(" -> ")); 55 | } 56 | visited[key] = VISIT_IN_PROGRESS; 57 | 58 | if (isString(value)) { 59 | plan.push(key, [ function() { return $injector.get(value); }], NO_DEPENDENCIES); 60 | } else { 61 | var params = $injector.annotate(value); 62 | forEach(params, function (param) { 63 | if (param !== key && invocables.hasOwnProperty(param)) visit(invocables[param], param); 64 | }); 65 | plan.push(key, value, params); 66 | } 67 | 68 | cycle.pop(); 69 | visited[key] = VISIT_DONE; 70 | } 71 | forEach(invocables, visit); 72 | invocables = cycle = visited = null; // plan is all that's required 73 | 74 | function isResolve(value) { 75 | return isObject(value) && value.then && value.$$promises; 76 | } 77 | 78 | return function (locals, parent, self) { 79 | if (isResolve(locals) && self === undefined) { 80 | self = parent; parent = locals; locals = null; 81 | } 82 | if (!locals) locals = NO_LOCALS; 83 | else if (!isObject(locals)) { 84 | throw new Error("'locals' must be an object"); 85 | } 86 | if (!parent) parent = NO_PARENT; 87 | else if (!isResolve(parent)) { 88 | throw new Error("'parent' must be a promise returned by $resolve.resolve()"); 89 | } 90 | 91 | // To complete the overall resolution, we have to wait for the parent 92 | // promise and for the promise for each invokable in our plan. 93 | var resolution = $q.defer(), 94 | result = resolution.promise, 95 | promises = result.$$promises = {}, 96 | values = extend({}, locals), 97 | wait = 1 + plan.length/3, 98 | merged = false; 99 | 100 | function done() { 101 | // Merge parent values we haven't got yet and publish our own $$values 102 | if (!--wait) { 103 | if (!merged) merge(values, parent.$$values); 104 | result.$$values = values; 105 | result.$$promises = result.$$promises || true; // keep for isResolve() 106 | delete result.$$inheritedValues; 107 | resolution.resolve(values); 108 | } 109 | } 110 | 111 | function fail(reason) { 112 | result.$$failure = reason; 113 | resolution.reject(reason); 114 | } 115 | 116 | // Short-circuit if parent has already failed 117 | if (isDefined(parent.$$failure)) { 118 | fail(parent.$$failure); 119 | return result; 120 | } 121 | 122 | if (parent.$$inheritedValues) { 123 | merge(values, omit(parent.$$inheritedValues, invocableKeys)); 124 | } 125 | 126 | // Merge parent values if the parent has already resolved, or merge 127 | // parent promises and wait if the parent resolve is still in progress. 128 | extend(promises, parent.$$promises); 129 | if (parent.$$values) { 130 | merged = merge(values, omit(parent.$$values, invocableKeys)); 131 | result.$$inheritedValues = omit(parent.$$values, invocableKeys); 132 | done(); 133 | } else { 134 | if (parent.$$inheritedValues) { 135 | result.$$inheritedValues = omit(parent.$$inheritedValues, invocableKeys); 136 | } 137 | parent.then(done, fail); 138 | } 139 | 140 | // Process each invocable in the plan, but ignore any where a local of the same name exists. 141 | for (var i=0, ii=plan.length; i
85 | * Home | About | Next page 86 | * 87 | *
96 | * Home | About | Next page 97 | * 98 | *109 | * 110 | * Home 111 | * 112 | * 113 | * @param {string} ui-sref 'stateName' can be any valid absolute or relative state 114 | * @param {Object} ui-sref-opts options to pass to {@link ui.router.state.$state#methods_go $state.go()} 115 | */ 116 | $StateRefDirective.$inject = ['$state', '$timeout']; 117 | function $StateRefDirective($state, $timeout) { 118 | return { 119 | restrict: 'A', 120 | require: ['?^uiSrefActive', '?^uiSrefActiveEq'], 121 | link: function(scope, element, attrs, uiSrefActive) { 122 | var ref = parseStateRef(attrs.uiSref, $state.current.name); 123 | var def = { state: ref.state, href: null, params: null }; 124 | var type = getTypeInfo(element); 125 | var active = uiSrefActive[1] || uiSrefActive[0]; 126 | var unlinkInfoFn = null; 127 | var hookFn; 128 | 129 | def.options = extend(defaultOpts(element, $state), attrs.uiSrefOpts ? scope.$eval(attrs.uiSrefOpts) : {}); 130 | 131 | var update = function(val) { 132 | if (val) def.params = angular.copy(val); 133 | def.href = $state.href(ref.state, def.params, def.options); 134 | 135 | if (unlinkInfoFn) unlinkInfoFn(); 136 | if (active) unlinkInfoFn = active.$$addStateInfo(ref.state, def.params); 137 | if (def.href !== null) attrs.$set(type.attr, def.href); 138 | }; 139 | 140 | if (ref.paramExpr) { 141 | scope.$watch(ref.paramExpr, function(val) { if (val !== def.params) update(val); }, true); 142 | def.params = angular.copy(scope.$eval(ref.paramExpr)); 143 | } 144 | update(); 145 | 146 | if (!type.clickable) return; 147 | hookFn = clickHook(element, $state, $timeout, type, function() { return def; }); 148 | element.bind("click", hookFn); 149 | scope.$on('$destroy', function() { 150 | element.unbind("click", hookFn); 151 | }); 152 | } 153 | }; 154 | } 155 | 156 | /** 157 | * @ngdoc directive 158 | * @name ui.router.state.directive:ui-state 159 | * 160 | * @requires ui.router.state.uiSref 161 | * 162 | * @restrict A 163 | * 164 | * @description 165 | * Much like ui-sref, but will accept named $scope properties to evaluate for a state definition, 166 | * params and override options. 167 | * 168 | * @param {string} ui-state 'stateName' can be any valid absolute or relative state 169 | * @param {Object} ui-state-params params to pass to {@link ui.router.state.$state#methods_href $state.href()} 170 | * @param {Object} ui-state-opts options to pass to {@link ui.router.state.$state#methods_go $state.go()} 171 | */ 172 | $StateRefDynamicDirective.$inject = ['$state', '$timeout']; 173 | function $StateRefDynamicDirective($state, $timeout) { 174 | return { 175 | restrict: 'A', 176 | require: ['?^uiSrefActive', '?^uiSrefActiveEq'], 177 | link: function(scope, element, attrs, uiSrefActive) { 178 | var type = getTypeInfo(element); 179 | var active = uiSrefActive[1] || uiSrefActive[0]; 180 | var group = [attrs.uiState, attrs.uiStateParams || null, attrs.uiStateOpts || null]; 181 | var watch = '[' + group.map(function(val) { return val || 'null'; }).join(', ') + ']'; 182 | var def = { state: null, params: null, options: null, href: null }; 183 | var unlinkInfoFn = null; 184 | var hookFn; 185 | 186 | function runStateRefLink (group) { 187 | def.state = group[0]; def.params = group[1]; def.options = group[2]; 188 | def.href = $state.href(def.state, def.params, def.options); 189 | 190 | if (unlinkInfoFn) unlinkInfoFn(); 191 | if (active) unlinkInfoFn = active.$$addStateInfo(def.state, def.params); 192 | if (def.href) attrs.$set(type.attr, def.href); 193 | } 194 | 195 | scope.$watch(watch, runStateRefLink, true); 196 | runStateRefLink(scope.$eval(watch)); 197 | 198 | if (!type.clickable) return; 199 | hookFn = clickHook(element, $state, $timeout, type, function() { return def; }); 200 | element.bind("click", hookFn); 201 | scope.$on('$destroy', function() { 202 | element.unbind("click", hookFn); 203 | }); 204 | } 205 | }; 206 | } 207 | 208 | 209 | /** 210 | * @ngdoc directive 211 | * @name ui.router.state.directive:ui-sref-active 212 | * 213 | * @requires ui.router.state.$state 214 | * @requires ui.router.state.$stateParams 215 | * @requires $interpolate 216 | * 217 | * @restrict A 218 | * 219 | * @description 220 | * A directive working alongside ui-sref to add classes to an element when the 221 | * related ui-sref directive's state is active, and removing them when it is inactive. 222 | * The primary use-case is to simplify the special appearance of navigation menus 223 | * relying on `ui-sref`, by having the "active" state's menu button appear different, 224 | * distinguishing it from the inactive menu items. 225 | * 226 | * ui-sref-active can live on the same element as ui-sref or on a parent element. The first 227 | * ui-sref-active found at the same level or above the ui-sref will be used. 228 | * 229 | * Will activate when the ui-sref's target state or any child state is active. If you 230 | * need to activate only when the ui-sref target state is active and *not* any of 231 | * it's children, then you will use 232 | * {@link ui.router.state.directive:ui-sref-active-eq ui-sref-active-eq} 233 | * 234 | * @example 235 | * Given the following template: 236 | *
237 | *
248 | *
260 | *
276 | *280 | * 281 | * When the current state is "admin.roles" the "active" class will be applied 282 | * to both the277 | * Roles 278 | *279 | *
45 | * var app = angular.module('app', ['ui.router.router']); 46 | * 47 | * app.config(function ($urlRouterProvider) { 48 | * // Here's an example of how you might allow case insensitive urls 49 | * $urlRouterProvider.rule(function ($injector, $location) { 50 | * var path = $location.path(), 51 | * normalized = path.toLowerCase(); 52 | * 53 | * if (path !== normalized) { 54 | * return normalized; 55 | * } 56 | * }); 57 | * }); 58 | *59 | * 60 | * @param {function} rule Handler function that takes `$injector` and `$location` 61 | * services as arguments. You can use them to return a valid path as a string. 62 | * 63 | * @return {object} `$urlRouterProvider` - `$urlRouterProvider` instance 64 | */ 65 | this.rule = function (rule) { 66 | if (!isFunction(rule)) throw new Error("'rule' must be a function"); 67 | rules.push(rule); 68 | return this; 69 | }; 70 | 71 | /** 72 | * @ngdoc object 73 | * @name ui.router.router.$urlRouterProvider#otherwise 74 | * @methodOf ui.router.router.$urlRouterProvider 75 | * 76 | * @description 77 | * Defines a path that is used when an invalid route is requested. 78 | * 79 | * @example 80 | *
81 | * var app = angular.module('app', ['ui.router.router']); 82 | * 83 | * app.config(function ($urlRouterProvider) { 84 | * // if the path doesn't match any of the urls you configured 85 | * // otherwise will take care of routing the user to the 86 | * // specified url 87 | * $urlRouterProvider.otherwise('/index'); 88 | * 89 | * // Example of using function rule as param 90 | * $urlRouterProvider.otherwise(function ($injector, $location) { 91 | * return '/a/valid/url'; 92 | * }); 93 | * }); 94 | *95 | * 96 | * @param {string|function} rule The url path you want to redirect to or a function 97 | * rule that returns the url path. The function version is passed two params: 98 | * `$injector` and `$location` services, and must return a url string. 99 | * 100 | * @return {object} `$urlRouterProvider` - `$urlRouterProvider` instance 101 | */ 102 | this.otherwise = function (rule) { 103 | if (isString(rule)) { 104 | var redirect = rule; 105 | rule = function () { return redirect; }; 106 | } 107 | else if (!isFunction(rule)) throw new Error("'rule' must be a function"); 108 | otherwise = rule; 109 | return this; 110 | }; 111 | 112 | 113 | function handleIfMatch($injector, handler, match) { 114 | if (!match) return false; 115 | var result = $injector.invoke(handler, handler, { $match: match }); 116 | return isDefined(result) ? result : true; 117 | } 118 | 119 | /** 120 | * @ngdoc function 121 | * @name ui.router.router.$urlRouterProvider#when 122 | * @methodOf ui.router.router.$urlRouterProvider 123 | * 124 | * @description 125 | * Registers a handler for a given url matching. 126 | * 127 | * If the handler is a string, it is 128 | * treated as a redirect, and is interpolated according to the syntax of match 129 | * (i.e. like `String.replace()` for `RegExp`, or like a `UrlMatcher` pattern otherwise). 130 | * 131 | * If the handler is a function, it is injectable. It gets invoked if `$location` 132 | * matches. You have the option of inject the match object as `$match`. 133 | * 134 | * The handler can return 135 | * 136 | * - **falsy** to indicate that the rule didn't match after all, then `$urlRouter` 137 | * will continue trying to find another one that matches. 138 | * - **string** which is treated as a redirect and passed to `$location.url()` 139 | * - **void** or any **truthy** value tells `$urlRouter` that the url was handled. 140 | * 141 | * @example 142 | *
143 | * var app = angular.module('app', ['ui.router.router']); 144 | * 145 | * app.config(function ($urlRouterProvider) { 146 | * $urlRouterProvider.when($state.url, function ($match, $stateParams) { 147 | * if ($state.$current.navigable !== state || 148 | * !equalForKeys($match, $stateParams) { 149 | * $state.transitionTo(state, $match, false); 150 | * } 151 | * }); 152 | * }); 153 | *154 | * 155 | * @param {string|object} what The incoming path that you want to redirect. 156 | * @param {string|function} handler The path you want to redirect your user to. 157 | */ 158 | this.when = function (what, handler) { 159 | var redirect, handlerIsString = isString(handler); 160 | if (isString(what)) what = $urlMatcherFactory.compile(what); 161 | 162 | if (!handlerIsString && !isFunction(handler) && !isArray(handler)) 163 | throw new Error("invalid 'handler' in when()"); 164 | 165 | var strategies = { 166 | matcher: function (what, handler) { 167 | if (handlerIsString) { 168 | redirect = $urlMatcherFactory.compile(handler); 169 | handler = ['$match', function ($match) { return redirect.format($match); }]; 170 | } 171 | return extend(function ($injector, $location) { 172 | return handleIfMatch($injector, handler, what.exec($location.path(), $location.search())); 173 | }, { 174 | prefix: isString(what.prefix) ? what.prefix : '' 175 | }); 176 | }, 177 | regex: function (what, handler) { 178 | if (what.global || what.sticky) throw new Error("when() RegExp must not be global or sticky"); 179 | 180 | if (handlerIsString) { 181 | redirect = handler; 182 | handler = ['$match', function ($match) { return interpolate(redirect, $match); }]; 183 | } 184 | return extend(function ($injector, $location) { 185 | return handleIfMatch($injector, handler, what.exec($location.path())); 186 | }, { 187 | prefix: regExpPrefix(what) 188 | }); 189 | } 190 | }; 191 | 192 | var check = { matcher: $urlMatcherFactory.isMatcher(what), regex: what instanceof RegExp }; 193 | 194 | for (var n in check) { 195 | if (check[n]) return this.rule(strategies[n](what, handler)); 196 | } 197 | 198 | throw new Error("invalid 'what' in when()"); 199 | }; 200 | 201 | /** 202 | * @ngdoc function 203 | * @name ui.router.router.$urlRouterProvider#deferIntercept 204 | * @methodOf ui.router.router.$urlRouterProvider 205 | * 206 | * @description 207 | * Disables (or enables) deferring location change interception. 208 | * 209 | * If you wish to customize the behavior of syncing the URL (for example, if you wish to 210 | * defer a transition but maintain the current URL), call this method at configuration time. 211 | * Then, at run time, call `$urlRouter.listen()` after you have configured your own 212 | * `$locationChangeSuccess` event handler. 213 | * 214 | * @example 215 | *
216 | * var app = angular.module('app', ['ui.router.router']); 217 | * 218 | * app.config(function ($urlRouterProvider) { 219 | * 220 | * // Prevent $urlRouter from automatically intercepting URL changes; 221 | * // this allows you to configure custom behavior in between 222 | * // location changes and route synchronization: 223 | * $urlRouterProvider.deferIntercept(); 224 | * 225 | * }).run(function ($rootScope, $urlRouter, UserService) { 226 | * 227 | * $rootScope.$on('$locationChangeSuccess', function(e) { 228 | * // UserService is an example service for managing user state 229 | * if (UserService.isLoggedIn()) return; 230 | * 231 | * // Prevent $urlRouter's default handler from firing 232 | * e.preventDefault(); 233 | * 234 | * UserService.handleLogin().then(function() { 235 | * // Once the user has logged in, sync the current URL 236 | * // to the router: 237 | * $urlRouter.sync(); 238 | * }); 239 | * }); 240 | * 241 | * // Configures $urlRouter's listener *after* your custom listener 242 | * $urlRouter.listen(); 243 | * }); 244 | *245 | * 246 | * @param {boolean} defer Indicates whether to defer location change interception. Passing 247 | no parameter is equivalent to `true`. 248 | */ 249 | this.deferIntercept = function (defer) { 250 | if (defer === undefined) defer = true; 251 | interceptDeferred = defer; 252 | }; 253 | 254 | /** 255 | * @ngdoc object 256 | * @name ui.router.router.$urlRouter 257 | * 258 | * @requires $location 259 | * @requires $rootScope 260 | * @requires $injector 261 | * @requires $browser 262 | * 263 | * @description 264 | * 265 | */ 266 | this.$get = $get; 267 | $get.$inject = ['$location', '$rootScope', '$injector', '$browser', '$sniffer']; 268 | function $get( $location, $rootScope, $injector, $browser, $sniffer) { 269 | 270 | var baseHref = $browser.baseHref(), location = $location.url(), lastPushedUrl; 271 | 272 | function appendBasePath(url, isHtml5, absolute) { 273 | if (baseHref === '/') return url; 274 | if (isHtml5) return baseHref.slice(0, -1) + url; 275 | if (absolute) return baseHref.slice(1) + url; 276 | return url; 277 | } 278 | 279 | // TODO: Optimize groups of rules with non-empty prefix into some sort of decision tree 280 | function update(evt) { 281 | if (evt && evt.defaultPrevented) return; 282 | var ignoreUpdate = lastPushedUrl && $location.url() === lastPushedUrl; 283 | lastPushedUrl = undefined; 284 | // TODO: Re-implement this in 1.0 for https://github.com/angular-ui/ui-router/issues/1573 285 | //if (ignoreUpdate) return true; 286 | 287 | function check(rule) { 288 | var handled = rule($injector, $location); 289 | 290 | if (!handled) return false; 291 | if (isString(handled)) $location.replace().url(handled); 292 | return true; 293 | } 294 | var n = rules.length, i; 295 | 296 | for (i = 0; i < n; i++) { 297 | if (check(rules[i])) return; 298 | } 299 | // always check otherwise last to allow dynamic updates to the set of rules 300 | if (otherwise) check(otherwise); 301 | } 302 | 303 | function listen() { 304 | listener = listener || $rootScope.$on('$locationChangeSuccess', update); 305 | return listener; 306 | } 307 | 308 | if (!interceptDeferred) listen(); 309 | 310 | return { 311 | /** 312 | * @ngdoc function 313 | * @name ui.router.router.$urlRouter#sync 314 | * @methodOf ui.router.router.$urlRouter 315 | * 316 | * @description 317 | * Triggers an update; the same update that happens when the address bar url changes, aka `$locationChangeSuccess`. 318 | * This method is useful when you need to use `preventDefault()` on the `$locationChangeSuccess` event, 319 | * perform some custom logic (route protection, auth, config, redirection, etc) and then finally proceed 320 | * with the transition by calling `$urlRouter.sync()`. 321 | * 322 | * @example 323 | *
324 | * angular.module('app', ['ui.router']) 325 | * .run(function($rootScope, $urlRouter) { 326 | * $rootScope.$on('$locationChangeSuccess', function(evt) { 327 | * // Halt state change from even starting 328 | * evt.preventDefault(); 329 | * // Perform custom logic 330 | * var meetsRequirement = ... 331 | * // Continue with the update and state transition if logic allows 332 | * if (meetsRequirement) $urlRouter.sync(); 333 | * }); 334 | * }); 335 | *336 | */ 337 | sync: function() { 338 | update(); 339 | }, 340 | 341 | listen: function() { 342 | return listen(); 343 | }, 344 | 345 | update: function(read) { 346 | if (read) { 347 | location = $location.url(); 348 | return; 349 | } 350 | if ($location.url() === location) return; 351 | 352 | $location.url(location); 353 | $location.replace(); 354 | }, 355 | 356 | push: function(urlMatcher, params, options) { 357 | var url = urlMatcher.format(params || {}); 358 | 359 | // Handle the special hash param, if needed 360 | if (url !== null && params && params['#']) { 361 | url += '#' + params['#']; 362 | } 363 | 364 | $location.url(url); 365 | lastPushedUrl = options && options.$$avoidResync ? $location.url() : undefined; 366 | if (options && options.replace) $location.replace(); 367 | }, 368 | 369 | /** 370 | * @ngdoc function 371 | * @name ui.router.router.$urlRouter#href 372 | * @methodOf ui.router.router.$urlRouter 373 | * 374 | * @description 375 | * A URL generation method that returns the compiled URL for a given 376 | * {@link ui.router.util.type:UrlMatcher `UrlMatcher`}, populated with the provided parameters. 377 | * 378 | * @example 379 | *
380 | * $bob = $urlRouter.href(new UrlMatcher("/about/:person"), { 381 | * person: "bob" 382 | * }); 383 | * // $bob == "/about/bob"; 384 | *385 | * 386 | * @param {UrlMatcher} urlMatcher The `UrlMatcher` object which is used as the template of the URL to generate. 387 | * @param {object=} params An object of parameter values to fill the matcher's required parameters. 388 | * @param {object=} options Options object. The options are: 389 | * 390 | * - **`absolute`** - {boolean=false}, If true will generate an absolute url, e.g. "http://www.example.com/fullurl". 391 | * 392 | * @returns {string} Returns the fully compiled URL, or `null` if `params` fail validation against `urlMatcher` 393 | */ 394 | href: function(urlMatcher, params, options) { 395 | if (!urlMatcher.validates(params)) return null; 396 | 397 | var isHtml5 = $locationProvider.html5Mode(); 398 | if (angular.isObject(isHtml5)) { 399 | isHtml5 = isHtml5.enabled; 400 | } 401 | 402 | isHtml5 = isHtml5 && $sniffer.history; 403 | 404 | var url = urlMatcher.format(params); 405 | options = options || {}; 406 | 407 | if (!isHtml5 && url !== null) { 408 | url = "#" + $locationProvider.hashPrefix() + url; 409 | } 410 | 411 | // Handle special hash param, if needed 412 | if (url !== null && params && params['#']) { 413 | url += '#' + params['#']; 414 | } 415 | 416 | url = appendBasePath(url, isHtml5, options.absolute); 417 | 418 | if (!options.absolute || !url) { 419 | return url; 420 | } 421 | 422 | var slash = (!isHtml5 && url ? '/' : ''), port = $location.port(); 423 | port = (port === 80 || port === 443 ? '' : ':' + port); 424 | 425 | return [$location.protocol(), '://', $location.host(), port, slash, url].join(''); 426 | } 427 | }; 428 | } 429 | } 430 | 431 | angular.module('ui.router.router').provider('$urlRouter', $UrlRouterProvider); 432 | -------------------------------------------------------------------------------- /bower_components/angular-ui-router/src/view.js: -------------------------------------------------------------------------------- 1 | 2 | $ViewProvider.$inject = []; 3 | function $ViewProvider() { 4 | 5 | this.$get = $get; 6 | /** 7 | * @ngdoc object 8 | * @name ui.router.state.$view 9 | * 10 | * @requires ui.router.util.$templateFactory 11 | * @requires $rootScope 12 | * 13 | * @description 14 | * 15 | */ 16 | $get.$inject = ['$rootScope', '$templateFactory']; 17 | function $get( $rootScope, $templateFactory) { 18 | return { 19 | // $view.load('full.viewName', { template: ..., controller: ..., resolve: ..., async: false, params: ... }) 20 | /** 21 | * @ngdoc function 22 | * @name ui.router.state.$view#load 23 | * @methodOf ui.router.state.$view 24 | * 25 | * @description 26 | * 27 | * @param {string} name name 28 | * @param {object} options option object. 29 | */ 30 | load: function load(name, options) { 31 | var result, defaults = { 32 | template: null, controller: null, view: null, locals: null, notify: true, async: true, params: {} 33 | }; 34 | options = extend(defaults, options); 35 | 36 | if (options.view) { 37 | result = $templateFactory.fromConfig(options.view, options.params, options.locals); 38 | } 39 | return result; 40 | } 41 | }; 42 | } 43 | } 44 | 45 | angular.module('ui.router.state').provider('$view', $ViewProvider); 46 | -------------------------------------------------------------------------------- /bower_components/angular-ui-router/src/viewDirective.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @ngdoc directive 3 | * @name ui.router.state.directive:ui-view 4 | * 5 | * @requires ui.router.state.$state 6 | * @requires $compile 7 | * @requires $controller 8 | * @requires $injector 9 | * @requires ui.router.state.$uiViewScroll 10 | * @requires $document 11 | * 12 | * @restrict ECA 13 | * 14 | * @description 15 | * The ui-view directive tells $state where to place your templates. 16 | * 17 | * @param {string=} name A view name. The name should be unique amongst the other views in the 18 | * same state. You can have views of the same name that live in different states. 19 | * 20 | * @param {string=} autoscroll It allows you to set the scroll behavior of the browser window 21 | * when a view is populated. By default, $anchorScroll is overridden by ui-router's custom scroll 22 | * service, {@link ui.router.state.$uiViewScroll}. This custom service let's you 23 | * scroll ui-view elements into view when they are populated during a state activation. 24 | * 25 | * *Note: To revert back to old [`$anchorScroll`](http://docs.angularjs.org/api/ng.$anchorScroll) 26 | * functionality, call `$uiViewScrollProvider.useAnchorScroll()`.* 27 | * 28 | * @param {string=} onload Expression to evaluate whenever the view updates. 29 | * 30 | * @example 31 | * A view can be unnamed or named. 32 | *
33 | * 34 | * 35 | * 36 | * 37 | * 38 | *39 | * 40 | * You can only have one unnamed view within any template (or root html). If you are only using a 41 | * single view and it is unnamed then you can populate it like so: 42 | *
43 | * 44 | * $stateProvider.state("home", { 45 | * template: "48 | * 49 | * The above is a convenient shortcut equivalent to specifying your view explicitly with the {@link ui.router.state.$stateProvider#methods_state `views`} 50 | * config property, by name, in this case an empty name: 51 | *HELLO!
" 46 | * }) 47 | *
52 | * $stateProvider.state("home", { 53 | * views: { 54 | * "": { 55 | * template: "60 | * 61 | * But typically you'll only use the views property if you name your view or have more than one view 62 | * in the same template. There's not really a compelling reason to name a view if its the only one, 63 | * but you could if you wanted, like so: 64 | *HELLO!
" 56 | * } 57 | * } 58 | * }) 59 | *
65 | * 66 | *67 | *
68 | * $stateProvider.state("home", { 69 | * views: { 70 | * "main": { 71 | * template: "76 | * 77 | * Really though, you'll use views to set up multiple views: 78 | *HELLO!
" 72 | * } 73 | * } 74 | * }) 75 | *
79 | * 80 | * 81 | * 82 | *83 | * 84 | *
85 | * $stateProvider.state("home", { 86 | * views: { 87 | * "": { 88 | * template: "99 | * 100 | * Examples for `autoscroll`: 101 | * 102 | *HELLO!
" 89 | * }, 90 | * "chart": { 91 | * template: "" 92 | * }, 93 | * "data": { 94 | * template: " " 95 | * } 96 | * } 97 | * }) 98 | *
103 | * 105 | *113 | * 114 | * Resolve data: 115 | * 116 | * The resolved data from the state's `resolve` block is placed on the scope as `$resolve` (this 117 | * can be customized using [[ViewDeclaration.resolveAs]]). This can be then accessed from the template. 118 | * 119 | * Note that when `controllerAs` is being used, `$resolve` is set on the controller instance *after* the 120 | * controller is instantiated. The `$onInit()` hook can be used to perform initialization code which 121 | * depends on `$resolve` data. 122 | * 123 | * Example usage of $resolve in a view template 124 | *106 | * 107 | * 109 | * 110 | * 111 | * 112 | *
125 | * $stateProvider.state('home', { 126 | * template: '132 | */ 133 | $ViewDirective.$inject = ['$state', '$injector', '$uiViewScroll', '$interpolate', '$q']; 134 | function $ViewDirective( $state, $injector, $uiViewScroll, $interpolate, $q) { 135 | 136 | function getService() { 137 | return ($injector.has) ? function(service) { 138 | return $injector.has(service) ? $injector.get(service) : null; 139 | } : function(service) { 140 | try { 141 | return $injector.get(service); 142 | } catch (e) { 143 | return null; 144 | } 145 | }; 146 | } 147 | 148 | var service = getService(), 149 | $animator = service('$animator'), 150 | $animate = service('$animate'); 151 | 152 | // Returns a set of DOM manipulation functions based on which Angular version 153 | // it should use 154 | function getRenderer(attrs, scope) { 155 | var statics = function() { 156 | return { 157 | enter: function (element, target, cb) { target.after(element); cb(); }, 158 | leave: function (element, cb) { element.remove(); cb(); } 159 | }; 160 | }; 161 | 162 | if ($animate) { 163 | return { 164 | enter: function(element, target, cb) { 165 | if (angular.version.minor > 2) { 166 | $animate.enter(element, null, target).then(cb); 167 | } else { 168 | $animate.enter(element, null, target, cb); 169 | } 170 | }, 171 | leave: function(element, cb) { 172 | if (angular.version.minor > 2) { 173 | $animate.leave(element).then(cb); 174 | } else { 175 | $animate.leave(element, cb); 176 | } 177 | } 178 | }; 179 | } 180 | 181 | if ($animator) { 182 | var animate = $animator && $animator(scope, attrs); 183 | 184 | return { 185 | enter: function(element, target, cb) {animate.enter(element, null, target); cb(); }, 186 | leave: function(element, cb) { animate.leave(element); cb(); } 187 | }; 188 | } 189 | 190 | return statics(); 191 | } 192 | 193 | var directive = { 194 | restrict: 'ECA', 195 | terminal: true, 196 | priority: 400, 197 | transclude: 'element', 198 | compile: function (tElement, tAttrs, $transclude) { 199 | return function (scope, $element, attrs) { 200 | var previousEl, currentEl, currentScope, latestLocals, 201 | onloadExp = attrs.onload || '', 202 | autoScrollExp = attrs.autoscroll, 203 | renderer = getRenderer(attrs, scope), 204 | inherited = $element.inheritedData('$uiView'); 205 | 206 | scope.$on('$stateChangeSuccess', function() { 207 | updateView(false); 208 | }); 209 | 210 | updateView(true); 211 | 212 | function cleanupLastView() { 213 | if (previousEl) { 214 | previousEl.remove(); 215 | previousEl = null; 216 | } 217 | 218 | if (currentScope) { 219 | currentScope.$destroy(); 220 | currentScope = null; 221 | } 222 | 223 | if (currentEl) { 224 | var $uiViewData = currentEl.data('$uiViewAnim'); 225 | renderer.leave(currentEl, function() { 226 | $uiViewData.$$animLeave.resolve(); 227 | previousEl = null; 228 | }); 229 | 230 | previousEl = currentEl; 231 | currentEl = null; 232 | } 233 | } 234 | 235 | function updateView(firstTime) { 236 | var newScope, 237 | name = getUiViewName(scope, attrs, $element, $interpolate), 238 | previousLocals = name && $state.$current && $state.$current.locals[name]; 239 | 240 | if (!firstTime && previousLocals === latestLocals) return; // nothing to do 241 | newScope = scope.$new(); 242 | latestLocals = $state.$current.locals[name]; 243 | 244 | /** 245 | * @ngdoc event 246 | * @name ui.router.state.directive:ui-view#$viewContentLoading 247 | * @eventOf ui.router.state.directive:ui-view 248 | * @eventType emits on ui-view directive scope 249 | * @description 250 | * 251 | * Fired once the view **begins loading**, *before* the DOM is rendered. 252 | * 253 | * @param {Object} event Event object. 254 | * @param {string} viewName Name of the view. 255 | */ 256 | newScope.$emit('$viewContentLoading', name); 257 | 258 | var clone = $transclude(newScope, function(clone) { 259 | var animEnter = $q.defer(), animLeave = $q.defer(); 260 | var viewAnimData = { 261 | $animEnter: animEnter.promise, 262 | $animLeave: animLeave.promise, 263 | $$animLeave: animLeave 264 | }; 265 | 266 | clone.data('$uiViewAnim', viewAnimData); 267 | renderer.enter(clone, $element, function onUiViewEnter() { 268 | animEnter.resolve(); 269 | if(currentScope) { 270 | currentScope.$emit('$viewContentAnimationEnded'); 271 | } 272 | 273 | if (angular.isDefined(autoScrollExp) && !autoScrollExp || scope.$eval(autoScrollExp)) { 274 | $uiViewScroll(clone); 275 | } 276 | }); 277 | cleanupLastView(); 278 | }); 279 | 280 | currentEl = clone; 281 | currentScope = newScope; 282 | /** 283 | * @ngdoc event 284 | * @name ui.router.state.directive:ui-view#$viewContentLoaded 285 | * @eventOf ui.router.state.directive:ui-view 286 | * @eventType emits on ui-view directive scope 287 | * @description 288 | * Fired once the view is **loaded**, *after* the DOM is rendered. 289 | * 290 | * @param {Object} event Event object. 291 | * @param {string} viewName Name of the view. 292 | */ 293 | currentScope.$emit('$viewContentLoaded', name); 294 | currentScope.$eval(onloadExp); 295 | } 296 | }; 297 | } 298 | }; 299 | 300 | return directive; 301 | } 302 | 303 | $ViewDirectiveFill.$inject = ['$compile', '$controller', '$state', '$interpolate']; 304 | function $ViewDirectiveFill ( $compile, $controller, $state, $interpolate) { 305 | return { 306 | restrict: 'ECA', 307 | priority: -400, 308 | compile: function (tElement) { 309 | var initial = tElement.html(); 310 | return function (scope, $element, attrs) { 311 | var current = $state.$current, 312 | name = getUiViewName(scope, attrs, $element, $interpolate), 313 | locals = current && current.locals[name]; 314 | 315 | if (! locals) { 316 | return; 317 | } 318 | 319 | $element.data('$uiView', { name: name, state: locals.$$state }); 320 | $element.html(locals.$template ? locals.$template : initial); 321 | 322 | var resolveData = angular.extend({}, locals); 323 | scope[locals.$$resolveAs] = resolveData; 324 | 325 | var link = $compile($element.contents()); 326 | 327 | if (locals.$$controller) { 328 | locals.$scope = scope; 329 | locals.$element = $element; 330 | var controller = $controller(locals.$$controller, locals); 331 | if (locals.$$controllerAs) { 332 | scope[locals.$$controllerAs] = controller; 333 | scope[locals.$$controllerAs][locals.$$resolveAs] = resolveData; 334 | } 335 | if (isFunction(controller.$onInit)) controller.$onInit(); 336 | $element.data('$ngControllerController', controller); 337 | $element.children().data('$ngControllerController', controller); 338 | } 339 | 340 | link(scope); 341 | }; 342 | } 343 | }; 344 | } 345 | 346 | /** 347 | * Shared ui-view code for both directives: 348 | * Given scope, element, and its attributes, return the view's name 349 | */ 350 | function getUiViewName(scope, attrs, element, $interpolate) { 351 | var name = $interpolate(attrs.uiView || attrs.name || '')(scope); 352 | var uiViewCreatedBy = element.inheritedData('$uiView'); 353 | return name.indexOf('@') >= 0 ? name : (name + '@' + (uiViewCreatedBy ? uiViewCreatedBy.state.name : '')); 354 | } 355 | 356 | angular.module('ui.router.state').directive('uiView', $ViewDirective); 357 | angular.module('ui.router.state').directive('uiView', $ViewDirectiveFill); 358 | -------------------------------------------------------------------------------- /bower_components/angular-ui-router/src/viewScroll.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @ngdoc object 3 | * @name ui.router.state.$uiViewScrollProvider 4 | * 5 | * @description 6 | * Provider that returns the {@link ui.router.state.$uiViewScroll} service function. 7 | */ 8 | function $ViewScrollProvider() { 9 | 10 | var useAnchorScroll = false; 11 | 12 | /** 13 | * @ngdoc function 14 | * @name ui.router.state.$uiViewScrollProvider#useAnchorScroll 15 | * @methodOf ui.router.state.$uiViewScrollProvider 16 | * 17 | * @description 18 | * Reverts back to using the core [`$anchorScroll`](http://docs.angularjs.org/api/ng.$anchorScroll) service for 19 | * scrolling based on the url anchor. 20 | */ 21 | this.useAnchorScroll = function () { 22 | useAnchorScroll = true; 23 | }; 24 | 25 | /** 26 | * @ngdoc object 27 | * @name ui.router.state.$uiViewScroll 28 | * 29 | * @requires $anchorScroll 30 | * @requires $timeout 31 | * 32 | * @description 33 | * When called with a jqLite element, it scrolls the element into view (after a 34 | * `$timeout` so the DOM has time to refresh). 35 | * 36 | * If you prefer to rely on `$anchorScroll` to scroll the view to the anchor, 37 | * this can be enabled by calling {@link ui.router.state.$uiViewScrollProvider#methods_useAnchorScroll `$uiViewScrollProvider.useAnchorScroll()`}. 38 | */ 39 | this.$get = ['$anchorScroll', '$timeout', function ($anchorScroll, $timeout) { 40 | if (useAnchorScroll) { 41 | return $anchorScroll; 42 | } 43 | 44 | return function ($element) { 45 | return $timeout(function () { 46 | $element[0].scrollIntoView(); 47 | }, 0, false); 48 | }; 49 | }]; 50 | } 51 | 52 | angular.module('ui.router.state').provider('$uiViewScroll', $ViewScrollProvider); 53 | -------------------------------------------------------------------------------- /bower_components/angular/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular", 3 | "version": "1.5.7", 4 | "license": "MIT", 5 | "main": "./angular.js", 6 | "ignore": [], 7 | "dependencies": {}, 8 | "homepage": "https://github.com/angular/bower-angular", 9 | "_release": "1.5.7", 10 | "_resolution": { 11 | "type": "version", 12 | "tag": "v1.5.7", 13 | "commit": "8b7bc41468112797f501b2f6502a2be5c6a1bf5f" 14 | }, 15 | "_source": "https://github.com/angular/bower-angular.git", 16 | "_target": ">=1.4.0", 17 | "_originalSource": "angular" 18 | } -------------------------------------------------------------------------------- /bower_components/angular/LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Angular 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /bower_components/angular/README.md: -------------------------------------------------------------------------------- 1 | # packaged angular 2 | 3 | This repo is for distribution on `npm` and `bower`. The source for this module is in the 4 | [main AngularJS repo](https://github.com/angular/angular.js). 5 | Please file issues and pull requests against that repo. 6 | 7 | ## Install 8 | 9 | You can install this package either with `npm` or with `bower`. 10 | 11 | ### npm 12 | 13 | ```shell 14 | npm install angular 15 | ``` 16 | 17 | Then add a ` 21 | ``` 22 | 23 | Or `require('angular')` from your code. 24 | 25 | ### bower 26 | 27 | ```shell 28 | bower install angular 29 | ``` 30 | 31 | Then add a ` 35 | ``` 36 | 37 | ## Documentation 38 | 39 | Documentation is available on the 40 | [AngularJS docs site](http://docs.angularjs.org/). 41 | 42 | ## License 43 | 44 | The MIT License 45 | 46 | Copyright (c) 2010-2015 Google, Inc. http://angularjs.org 47 | 48 | Permission is hereby granted, free of charge, to any person obtaining a copy 49 | of this software and associated documentation files (the "Software"), to deal 50 | in the Software without restriction, including without limitation the rights 51 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 52 | copies of the Software, and to permit persons to whom the Software is 53 | furnished to do so, subject to the following conditions: 54 | 55 | The above copyright notice and this permission notice shall be included in 56 | all copies or substantial portions of the Software. 57 | 58 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 59 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 60 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 61 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 62 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 63 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 64 | THE SOFTWARE. 65 | -------------------------------------------------------------------------------- /bower_components/angular/angular-csp.css: -------------------------------------------------------------------------------- 1 | /* Include this file in your html if you are using the CSP mode. */ 2 | 3 | @charset "UTF-8"; 4 | 5 | [ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], 6 | .ng-cloak, .x-ng-cloak, 7 | .ng-hide:not(.ng-hide-animate) { 8 | display: none !important; 9 | } 10 | 11 | ng\:form { 12 | display: block; 13 | } 14 | 15 | .ng-animate-shim { 16 | visibility:hidden; 17 | } 18 | 19 | .ng-anchor { 20 | position:absolute; 21 | } 22 | -------------------------------------------------------------------------------- /bower_components/angular/angular.min.js.gzip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikemeding/Angular-Bootstrap-Modal-Forms/acfcf75e8cbd4de4a6297f02d53af842c5277012/bower_components/angular/angular.min.js.gzip -------------------------------------------------------------------------------- /bower_components/angular/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular", 3 | "version": "1.5.7", 4 | "license": "MIT", 5 | "main": "./angular.js", 6 | "ignore": [], 7 | "dependencies": { 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /bower_components/angular/index.js: -------------------------------------------------------------------------------- 1 | require('./angular'); 2 | module.exports = angular; 3 | -------------------------------------------------------------------------------- /bower_components/angular/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular", 3 | "version": "1.5.7", 4 | "description": "HTML enhanced for web apps", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/angular/angular.js.git" 12 | }, 13 | "keywords": [ 14 | "angular", 15 | "framework", 16 | "browser", 17 | "client-side" 18 | ], 19 | "author": "Angular Core Team', 127 | * resolve: { 128 | * user: function(UserService) { return UserService.fetchUser(); } 129 | * } 130 | * }); 131 | *
Click on the "Add Data" button to launch the add data modal. Click on a table row to launch an edit data modal.
50 |Further details, source code, and a detailed explanation can be found here in my github repo. 52 |
53 | 54 | 55 | 56 | 57 |Customer Name | 67 |Street Address | 68 |City | 69 |State | 70 |Active | 71 |
---|---|---|---|---|
{{customer.customerName}} | 78 |{{customer.street}} | 79 |{{customer.city}} | 80 |{{customer.usState}} | 81 |82 | 83 | | 84 |