kms 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/kms/application.js +1 -0
  3. data/app/assets/javascripts/kms/application/controllers/assets_controller.coffee.erb +14 -4
  4. data/app/assets/javascripts/kms/application/controllers/pages_controller.coffee.erb +12 -2
  5. data/app/assets/javascripts/kms/application/controllers/snippets_controller.coffee.erb +13 -3
  6. data/app/assets/javascripts/kms/application/controllers/templates_controller.coffee.erb +13 -3
  7. data/app/assets/javascripts/kms/application/controllers/users_controller.coffee +5 -5
  8. data/app/assets/javascripts/kms/application/module.coffee +6 -2
  9. data/app/assets/javascripts/kms/application/routes.coffee.erb +10 -0
  10. data/app/assets/javascripts/templates/assets/edit.html.slim +2 -1
  11. data/app/assets/javascripts/templates/assets/form.html.slim +1 -1
  12. data/app/assets/javascripts/templates/pages/edit.html.slim +1 -0
  13. data/app/assets/javascripts/templates/shared/hotkey_notification.html.slim +6 -0
  14. data/app/assets/javascripts/templates/snippets/edit.html.slim +1 -0
  15. data/app/assets/javascripts/templates/templates/edit.html.slim +1 -0
  16. data/app/assets/javascripts/templates/users/edit.html.slim +5 -0
  17. data/app/assets/javascripts/templates/users/form.html.slim +3 -2
  18. data/app/assets/javascripts/templates/users/index.html.slim +2 -1
  19. data/app/assets/stylesheets/kms/custom.css.scss +10 -0
  20. data/app/controllers/kms/assets_controller.rb +6 -3
  21. data/app/controllers/kms/users_controller.rb +14 -0
  22. data/app/services/kms/resource_service.rb +3 -1
  23. data/app/views/layouts/kms/kms.html.erb +1 -1
  24. data/config/initializers/devise.rb +9 -0
  25. data/config/locales/en.yml +12 -0
  26. data/config/locales/ru.yml +12 -0
  27. data/config/routes.rb +1 -1
  28. data/lib/kms/engine.rb +1 -1
  29. data/lib/kms/version.rb +1 -1
  30. data/spec/controllers/kms/assets_controller_spec.rb +28 -10
  31. data/spec/controllers/kms/users_controller_spec.rb +23 -0
  32. data/spec/internal/config/routes.rb +1 -1
  33. data/spec/internal/log/test.log +0 -105823
  34. data/vendor/assets/bower.json +5 -4
  35. data/vendor/assets/bower_components/angular-cookies/angular-cookies.js +22 -18
  36. data/vendor/assets/bower_components/angular-cookies/angular-cookies.min.js +4 -4
  37. data/vendor/assets/bower_components/angular-cookies/angular-cookies.min.js.map +2 -2
  38. data/vendor/assets/bower_components/angular-cookies/bower.json +2 -2
  39. data/vendor/assets/bower_components/angular-cookies/package.json +1 -1
  40. data/vendor/assets/bower_components/angular-hotkeys/Gruntfile.js +118 -0
  41. data/vendor/assets/bower_components/angular-hotkeys/LICENSE +20 -0
  42. data/vendor/assets/bower_components/angular-hotkeys/README.md +248 -0
  43. data/vendor/assets/bower_components/angular-hotkeys/bower.json +19 -0
  44. data/vendor/assets/bower_components/angular-hotkeys/build/hotkeys.css +110 -0
  45. data/vendor/assets/bower_components/angular-hotkeys/build/hotkeys.js +1661 -0
  46. data/vendor/assets/bower_components/angular-hotkeys/build/hotkeys.min.css +1 -0
  47. data/vendor/assets/bower_components/angular-hotkeys/build/hotkeys.min.js +7 -0
  48. data/vendor/assets/bower_components/angular-hotkeys/package.json +45 -0
  49. data/vendor/assets/bower_components/angular-hotkeys/src/hotkeys.css +104 -0
  50. data/vendor/assets/bower_components/angular-hotkeys/src/hotkeys.js +633 -0
  51. data/vendor/assets/bower_components/angular-loading-bar/CHANGELOG.md +33 -0
  52. data/vendor/assets/bower_components/angular-loading-bar/CONTRIBUTING.md +17 -0
  53. data/vendor/assets/bower_components/angular-loading-bar/Gruntfile.js +9 -1
  54. data/vendor/assets/bower_components/angular-loading-bar/ISSUE_TEMPLATE.md +14 -0
  55. data/vendor/assets/bower_components/angular-loading-bar/PULL_REQUEST_TEMPLATE.md +13 -0
  56. data/vendor/assets/bower_components/angular-loading-bar/README.md +30 -3
  57. data/vendor/assets/bower_components/angular-loading-bar/bower.json +11 -6
  58. data/vendor/assets/bower_components/angular-loading-bar/build/loading-bar.css +5 -5
  59. data/vendor/assets/bower_components/angular-loading-bar/build/loading-bar.js +39 -12
  60. data/vendor/assets/bower_components/angular-loading-bar/build/loading-bar.min.css +1 -8
  61. data/vendor/assets/bower_components/angular-loading-bar/build/loading-bar.min.js +3 -3
  62. data/vendor/assets/bower_components/angular-loading-bar/index.js +2 -0
  63. data/vendor/assets/bower_components/angular-loading-bar/package.json +12 -15
  64. data/vendor/assets/bower_components/angular-loading-bar/src/loading-bar.css +3 -3
  65. data/vendor/assets/bower_components/angular-loading-bar/src/loading-bar.js +37 -10
  66. data/vendor/assets/bower_components/angular-sanitize/angular-sanitize.js +504 -386
  67. data/vendor/assets/bower_components/angular-sanitize/angular-sanitize.min.js +13 -12
  68. data/vendor/assets/bower_components/angular-sanitize/angular-sanitize.min.js.map +3 -3
  69. data/vendor/assets/bower_components/angular-sanitize/bower.json +2 -2
  70. data/vendor/assets/bower_components/angular-sanitize/package.json +1 -1
  71. data/vendor/assets/bower_components/angular-ui-router/CHANGELOG.md +1410 -0
  72. data/vendor/assets/bower_components/angular-ui-router/CONTRIBUTING.md +64 -16
  73. data/vendor/assets/bower_components/angular-ui-router/DOCS.md +48 -0
  74. data/vendor/assets/bower_components/angular-ui-router/ISSUE_TEMPLATE.md +53 -0
  75. data/vendor/assets/bower_components/angular-ui-router/LICENSE +1 -1
  76. data/vendor/assets/bower_components/angular-ui-router/README.md +24 -211
  77. data/vendor/assets/bower_components/angular-ui-router/artifacts.json +8 -0
  78. data/vendor/assets/bower_components/angular-ui-router/bower.json +1 -23
  79. data/vendor/assets/bower_components/angular-ui-router/karma.conf.js +105 -0
  80. data/vendor/assets/bower_components/angular-ui-router/release/angular-ui-router.js +9744 -3901
  81. data/vendor/assets/bower_components/angular-ui-router/release/angular-ui-router.js.map +192 -0
  82. data/vendor/assets/bower_components/angular-ui-router/release/angular-ui-router.min.js +9 -4
  83. data/vendor/assets/bower_components/angular-ui-router/release/angular-ui-router.min.js.map +1679 -0
  84. data/vendor/assets/bower_components/angular-ui-router/release/resolveService.js +83 -0
  85. data/vendor/assets/bower_components/angular-ui-router/release/resolveService.js.map +19 -0
  86. data/vendor/assets/bower_components/angular-ui-router/release/resolveService.min.js +8 -0
  87. data/vendor/assets/bower_components/angular-ui-router/release/resolveService.min.js.map +47 -0
  88. data/vendor/assets/bower_components/angular-ui-router/release/stateEvents.js +294 -0
  89. data/vendor/assets/bower_components/angular-ui-router/release/stateEvents.js.map +17 -0
  90. data/vendor/assets/bower_components/angular-ui-router/release/stateEvents.min.js +8 -0
  91. data/vendor/assets/bower_components/angular-ui-router/release/stateEvents.min.js.map +102 -0
  92. data/vendor/assets/bower_components/angular-ui-router/release/ui-router-angularjs.js +2014 -0
  93. data/vendor/assets/bower_components/angular-ui-router/release/ui-router-angularjs.js.map +70 -0
  94. data/vendor/assets/bower_components/angular-ui-router/release/ui-router-angularjs.min.js +9 -0
  95. data/vendor/assets/bower_components/angular-ui-router/release/ui-router-angularjs.min.js.map +541 -0
  96. data/vendor/assets/bower_components/angular-ui-router/rollup.config.js +116 -0
  97. data/vendor/assets/bower_components/angular-ui-router/tslint.json +60 -0
  98. data/vendor/assets/bower_components/angular-ui-router/yarn.lock +4146 -0
  99. data/vendor/assets/bower_components/angular-ui-tree/yarn.lock +4945 -0
  100. data/vendor/assets/bower_components/angular/angular.js +4019 -2449
  101. data/vendor/assets/bower_components/angular/angular.min.js +331 -319
  102. data/vendor/assets/bower_components/angular/angular.min.js.gzip +0 -0
  103. data/vendor/assets/bower_components/angular/angular.min.js.map +3 -3
  104. data/vendor/assets/bower_components/angular/bower.json +1 -1
  105. data/vendor/assets/bower_components/angular/package.json +1 -1
  106. data/vendor/assets/bower_components/angularjs-dropdown-multiselect/LICENSE +21 -0
  107. data/vendor/assets/bower_components/angularjs-dropdown-multiselect/README.md +14 -14
  108. data/vendor/assets/bower_components/angularjs-dropdown-multiselect/bower.json +25 -12
  109. data/vendor/assets/bower_components/angularjs-dropdown-multiselect/development_index.html +59 -52
  110. data/vendor/assets/bower_components/angularjs-dropdown-multiselect/dist/angularjs-dropdown-multiselect.min.js +1 -1
  111. data/vendor/assets/bower_components/angularjs-dropdown-multiselect/index.html +73 -0
  112. data/vendor/assets/bower_components/angularjs-dropdown-multiselect/package.json +19 -7
  113. data/vendor/assets/bower_components/angularjs-dropdown-multiselect/pages/javascripts/pages/home/ExampleCtrl.js +126 -3
  114. data/vendor/assets/bower_components/angularjs-dropdown-multiselect/pages/javascripts/pages/home/home.html +1262 -852
  115. data/vendor/assets/bower_components/angularjs-dropdown-multiselect/pages/stylesheets/stylesheet.css +10 -5
  116. data/vendor/assets/bower_components/angularjs-dropdown-multiselect/src/angularjs-dropdown-multiselect.js +612 -287
  117. metadata +66 -169
  118. data/spec/internal/config/database.yml +0 -7
  119. data/spec/internal/public/uploads/kms/asset/file/1/avatar.jpg +0 -0
  120. data/spec/internal/public/uploads/kms/asset/file/2/avatar.jpg +0 -0
  121. data/spec/internal/public/uploads/kms/asset/file/2/style.css +0 -1
  122. data/spec/internal/public/uploads/kms/asset/file/3/style.css +0 -1
  123. data/spec/internal/public/uploads/kms/asset/file/4/style.css +0 -1
  124. data/spec/internal/public/uploads/tmp/1500976987-41025-0002-0883/style.css +0 -1
  125. data/spec/internal/public/uploads/tmp/1500977082-41195-0002-6495/style.css +0 -1
  126. data/spec/internal/public/uploads/tmp/1500977109-41364-0002-4518/style.css +0 -1
  127. data/spec/internal/public/uploads/tmp/1500977152-41405-0002-2345/style.css +0 -1
  128. data/spec/internal/public/uploads/tmp/1500977327-41694-0002-5448/style.css +0 -1
  129. data/spec/internal/public/uploads/tmp/1500977376-41732-0002-7916/style.css +0 -1
  130. data/spec/internal/public/uploads/tmp/1500977392-41759-0002-7593/style.css +0 -1
  131. data/spec/internal/public/uploads/tmp/1500977410-42259-0002-7527/style.css +0 -1
  132. data/spec/internal/public/uploads/tmp/1500977429-42306-0002-5937/style.css +0 -1
  133. data/spec/internal/public/uploads/tmp/1500977437-42324-0002-5880/style.css +0 -1
  134. data/spec/internal/public/uploads/tmp/1500983228-53594-0002-4559/style.css +0 -1
  135. data/spec/internal/public/uploads/tmp/1500983284-53632-0002-6590/style.css +0 -1
  136. data/spec/internal/public/uploads/tmp/1500983360-53784-0002-7289/style.css +0 -1
  137. data/spec/internal/public/uploads/tmp/1500983469-54321-0002-0386/avatar.jpg +0 -0
  138. data/spec/internal/public/uploads/tmp/1500983469-54321-0004-5691/style.css +0 -1
  139. data/spec/internal/public/uploads/tmp/1500983511-54352-0002-5720/avatar.jpg +0 -0
  140. data/spec/internal/public/uploads/tmp/1500983511-54352-0004-1399/style.css +0 -1
  141. data/spec/internal/public/uploads/tmp/1500983610-54507-0002-4280/avatar.jpg +0 -0
  142. data/spec/internal/public/uploads/tmp/1500983610-54507-0004-9758/style.css +0 -1
  143. data/spec/internal/public/uploads/tmp/1500984466-57012-0002-4146/avatar.jpg +0 -0
  144. data/spec/internal/public/uploads/tmp/1500984466-57012-0004-5895/style.css +0 -1
  145. data/spec/internal/public/uploads/tmp/1500984509-57158-0002-9657/avatar.jpg +0 -0
  146. data/spec/internal/public/uploads/tmp/1500984509-57158-0004-5003/style.css +0 -1
  147. data/spec/internal/public/uploads/tmp/1500984616-57697-0002-7201/avatar.jpg +0 -0
  148. data/spec/internal/public/uploads/tmp/1500984616-57697-0004-6255/style.css +0 -1
  149. data/spec/internal/public/uploads/tmp/1500985257-58947-0002-3629/avatar.jpg +0 -0
  150. data/spec/internal/public/uploads/tmp/1500985257-58947-0004-5338/style.css +0 -1
  151. data/spec/internal/public/uploads/tmp/1500985407-58947-0006-5929/style.css +0 -1
  152. data/spec/internal/public/uploads/tmp/1500985473-59264-0002-0397/avatar.jpg +0 -0
  153. data/spec/internal/public/uploads/tmp/1500985473-59264-0004-6493/style.css +0 -1
  154. data/spec/internal/public/uploads/tmp/1500985475-59264-0007-8674/style.css +0 -1
  155. data/spec/internal/public/uploads/tmp/1500985538-59468-0002-9206/avatar.jpg +0 -0
  156. data/spec/internal/public/uploads/tmp/1500985538-59468-0004-2586/style.css +0 -1
  157. data/spec/internal/public/uploads/tmp/1500985538-59468-0007-6200/style.css +0 -1
  158. data/spec/internal/public/uploads/tmp/1500988358-65877-0002-4528/avatar.jpg +0 -0
  159. data/spec/internal/public/uploads/tmp/1500988358-65877-0004-5904/style.css +0 -1
  160. data/spec/internal/public/uploads/tmp/1500988358-65877-0007-7320/style.css +0 -1
  161. data/spec/internal/public/uploads/tmp/1500988407-65916-0002-3138/avatar.jpg +0 -0
  162. data/spec/internal/public/uploads/tmp/1500988407-65916-0004-5400/style.css +0 -1
  163. data/spec/internal/public/uploads/tmp/1500988407-65916-0007-1655/style.css +0 -1
  164. data/spec/internal/public/uploads/tmp/1500988421-65950-0002-9415/avatar.jpg +0 -0
  165. data/spec/internal/public/uploads/tmp/1500988421-65950-0004-7130/style.css +0 -1
  166. data/spec/internal/public/uploads/tmp/1500988421-65950-0007-9886/style.css +0 -1
  167. data/spec/internal/public/uploads/tmp/1500988435-65981-0002-3228/avatar.jpg +0 -0
  168. data/spec/internal/public/uploads/tmp/1500988435-65981-0004-3682/style.css +0 -1
  169. data/spec/internal/public/uploads/tmp/1500988435-65981-0007-1582/style.css +0 -1
  170. data/spec/internal/public/uploads/tmp/1500988475-66122-0002-9516/avatar.jpg +0 -0
  171. data/spec/internal/public/uploads/tmp/1500988475-66122-0004-5634/style.css +0 -1
  172. data/spec/internal/public/uploads/tmp/1500988530-66122-0007-2272/style.css +0 -1
  173. data/spec/internal/public/uploads/tmp/1500988554-66315-0002-6262/avatar.jpg +0 -0
  174. data/spec/internal/public/uploads/tmp/1500988554-66315-0004-6099/style.css +0 -1
  175. data/spec/internal/public/uploads/tmp/1500988554-66315-0007-1632/style.css +0 -1
  176. data/spec/internal/public/uploads/tmp/1500991751-73722-0002-9937/avatar.jpg +0 -0
  177. data/spec/internal/public/uploads/tmp/1500991751-73722-0004-8034/style.css +0 -1
  178. data/spec/internal/public/uploads/tmp/1500991751-73722-0007-7763/style.css +0 -1
  179. data/spec/internal/public/uploads/tmp/1501233238-34385-0002-3210/avatar.jpg +0 -0
  180. data/spec/internal/public/uploads/tmp/1501233238-34385-0004-5881/style.css +0 -1
  181. data/spec/internal/public/uploads/tmp/1501233238-34385-0007-6280/style.css +0 -1
  182. data/spec/internal/tmp/cache/assets/test/sprockets/v3.0/1XyAFYlYI0pK7WAgjR4PgXV6BgU6huJSviWmHetdCRs.cache +0 -1
  183. data/vendor/assets/bower_components/angular-ui-router/api/angular-ui-router.d.ts +0 -126
  184. data/vendor/assets/bower_components/angular-ui-router/src/common.js +0 -292
  185. data/vendor/assets/bower_components/angular-ui-router/src/resolve.js +0 -252
  186. data/vendor/assets/bower_components/angular-ui-router/src/state.js +0 -1373
  187. data/vendor/assets/bower_components/angular-ui-router/src/stateDirectives.js +0 -268
  188. data/vendor/assets/bower_components/angular-ui-router/src/stateFilters.js +0 -39
  189. data/vendor/assets/bower_components/angular-ui-router/src/templateFactory.js +0 -110
  190. data/vendor/assets/bower_components/angular-ui-router/src/urlMatcherFactory.js +0 -1036
  191. data/vendor/assets/bower_components/angular-ui-router/src/urlRouter.js +0 -413
  192. data/vendor/assets/bower_components/angular-ui-router/src/view.js +0 -71
  193. data/vendor/assets/bower_components/angular-ui-router/src/viewDirective.js +0 -302
  194. data/vendor/assets/bower_components/angular-ui-router/src/viewScroll.js +0 -52
  195. data/vendor/assets/bower_components/angularjs-dropdown-multiselect/pages/index.html +0 -67
  196. data/vendor/assets/bower_components/bootstrap/Gemfile.lock +0 -43
@@ -1,413 +0,0 @@
1
- /**
2
- * @ngdoc object
3
- * @name ui.router.router.$urlRouterProvider
4
- *
5
- * @requires ui.router.util.$urlMatcherFactoryProvider
6
- * @requires $locationProvider
7
- *
8
- * @description
9
- * `$urlRouterProvider` has the responsibility of watching `$location`.
10
- * When `$location` changes it runs through a list of rules one by one until a
11
- * match is found. `$urlRouterProvider` is used behind the scenes anytime you specify
12
- * a url in a state configuration. All urls are compiled into a UrlMatcher object.
13
- *
14
- * There are several methods on `$urlRouterProvider` that make it useful to use directly
15
- * in your module config.
16
- */
17
- $UrlRouterProvider.$inject = ['$locationProvider', '$urlMatcherFactoryProvider'];
18
- function $UrlRouterProvider( $locationProvider, $urlMatcherFactory) {
19
- var rules = [], otherwise = null, interceptDeferred = false, listener;
20
-
21
- // Returns a string that is a prefix of all strings matching the RegExp
22
- function regExpPrefix(re) {
23
- var prefix = /^\^((?:\\[^a-zA-Z0-9]|[^\\\[\]\^$*+?.()|{}]+)*)/.exec(re.source);
24
- return (prefix != null) ? prefix[1].replace(/\\(.)/g, "$1") : '';
25
- }
26
-
27
- // Interpolates matched values into a String.replace()-style pattern
28
- function interpolate(pattern, match) {
29
- return pattern.replace(/\$(\$|\d{1,2})/, function (m, what) {
30
- return match[what === '$' ? 0 : Number(what)];
31
- });
32
- }
33
-
34
- /**
35
- * @ngdoc function
36
- * @name ui.router.router.$urlRouterProvider#rule
37
- * @methodOf ui.router.router.$urlRouterProvider
38
- *
39
- * @description
40
- * Defines rules that are used by `$urlRouterProvider` to find matches for
41
- * specific URLs.
42
- *
43
- * @example
44
- * <pre>
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
- * </pre>
59
- *
60
- * @param {object} 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
- * <pre>
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
- * </pre>
95
- *
96
- * @param {string|object} 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. if handle is a string, it is
126
- * treated as a redirect, and is interpolated according to the syntax of match
127
- * (i.e. like `String.replace()` for `RegExp`, or like a `UrlMatcher` pattern otherwise).
128
- *
129
- * If the handler is a function, it is injectable. It gets invoked if `$location`
130
- * matches. You have the option of inject the match object as `$match`.
131
- *
132
- * The handler can return
133
- *
134
- * - **falsy** to indicate that the rule didn't match after all, then `$urlRouter`
135
- * will continue trying to find another one that matches.
136
- * - **string** which is treated as a redirect and passed to `$location.url()`
137
- * - **void** or any **truthy** value tells `$urlRouter` that the url was handled.
138
- *
139
- * @example
140
- * <pre>
141
- * var app = angular.module('app', ['ui.router.router']);
142
- *
143
- * app.config(function ($urlRouterProvider) {
144
- * $urlRouterProvider.when($state.url, function ($match, $stateParams) {
145
- * if ($state.$current.navigable !== state ||
146
- * !equalForKeys($match, $stateParams) {
147
- * $state.transitionTo(state, $match, false);
148
- * }
149
- * });
150
- * });
151
- * </pre>
152
- *
153
- * @param {string|object} what The incoming path that you want to redirect.
154
- * @param {string|object} handler The path you want to redirect your user to.
155
- */
156
- this.when = function (what, handler) {
157
- var redirect, handlerIsString = isString(handler);
158
- if (isString(what)) what = $urlMatcherFactory.compile(what);
159
-
160
- if (!handlerIsString && !isFunction(handler) && !isArray(handler))
161
- throw new Error("invalid 'handler' in when()");
162
-
163
- var strategies = {
164
- matcher: function (what, handler) {
165
- if (handlerIsString) {
166
- redirect = $urlMatcherFactory.compile(handler);
167
- handler = ['$match', function ($match) { return redirect.format($match); }];
168
- }
169
- return extend(function ($injector, $location) {
170
- return handleIfMatch($injector, handler, what.exec($location.path(), $location.search()));
171
- }, {
172
- prefix: isString(what.prefix) ? what.prefix : ''
173
- });
174
- },
175
- regex: function (what, handler) {
176
- if (what.global || what.sticky) throw new Error("when() RegExp must not be global or sticky");
177
-
178
- if (handlerIsString) {
179
- redirect = handler;
180
- handler = ['$match', function ($match) { return interpolate(redirect, $match); }];
181
- }
182
- return extend(function ($injector, $location) {
183
- return handleIfMatch($injector, handler, what.exec($location.path()));
184
- }, {
185
- prefix: regExpPrefix(what)
186
- });
187
- }
188
- };
189
-
190
- var check = { matcher: $urlMatcherFactory.isMatcher(what), regex: what instanceof RegExp };
191
-
192
- for (var n in check) {
193
- if (check[n]) return this.rule(strategies[n](what, handler));
194
- }
195
-
196
- throw new Error("invalid 'what' in when()");
197
- };
198
-
199
- /**
200
- * @ngdoc function
201
- * @name ui.router.router.$urlRouterProvider#deferIntercept
202
- * @methodOf ui.router.router.$urlRouterProvider
203
- *
204
- * @description
205
- * Disables (or enables) deferring location change interception.
206
- *
207
- * If you wish to customize the behavior of syncing the URL (for example, if you wish to
208
- * defer a transition but maintain the current URL), call this method at configuration time.
209
- * Then, at run time, call `$urlRouter.listen()` after you have configured your own
210
- * `$locationChangeSuccess` event handler.
211
- *
212
- * @example
213
- * <pre>
214
- * var app = angular.module('app', ['ui.router.router']);
215
- *
216
- * app.config(function ($urlRouterProvider) {
217
- *
218
- * // Prevent $urlRouter from automatically intercepting URL changes;
219
- * // this allows you to configure custom behavior in between
220
- * // location changes and route synchronization:
221
- * $urlRouterProvider.deferIntercept();
222
- *
223
- * }).run(function ($rootScope, $urlRouter, UserService) {
224
- *
225
- * $rootScope.$on('$locationChangeSuccess', function(e) {
226
- * // UserService is an example service for managing user state
227
- * if (UserService.isLoggedIn()) return;
228
- *
229
- * // Prevent $urlRouter's default handler from firing
230
- * e.preventDefault();
231
- *
232
- * UserService.handleLogin().then(function() {
233
- * // Once the user has logged in, sync the current URL
234
- * // to the router:
235
- * $urlRouter.sync();
236
- * });
237
- * });
238
- *
239
- * // Configures $urlRouter's listener *after* your custom listener
240
- * $urlRouter.listen();
241
- * });
242
- * </pre>
243
- *
244
- * @param {boolean} defer Indicates whether to defer location change interception. Passing
245
- no parameter is equivalent to `true`.
246
- */
247
- this.deferIntercept = function (defer) {
248
- if (defer === undefined) defer = true;
249
- interceptDeferred = defer;
250
- };
251
-
252
- /**
253
- * @ngdoc object
254
- * @name ui.router.router.$urlRouter
255
- *
256
- * @requires $location
257
- * @requires $rootScope
258
- * @requires $injector
259
- * @requires $browser
260
- *
261
- * @description
262
- *
263
- */
264
- this.$get = $get;
265
- $get.$inject = ['$location', '$rootScope', '$injector', '$browser'];
266
- function $get( $location, $rootScope, $injector, $browser) {
267
-
268
- var baseHref = $browser.baseHref(), location = $location.url(), lastPushedUrl;
269
-
270
- function appendBasePath(url, isHtml5, absolute) {
271
- if (baseHref === '/') return url;
272
- if (isHtml5) return baseHref.slice(0, -1) + url;
273
- if (absolute) return baseHref.slice(1) + url;
274
- return url;
275
- }
276
-
277
- // TODO: Optimize groups of rules with non-empty prefix into some sort of decision tree
278
- function update(evt) {
279
- if (evt && evt.defaultPrevented) return;
280
- var ignoreUpdate = lastPushedUrl && $location.url() === lastPushedUrl;
281
- lastPushedUrl = undefined;
282
- if (ignoreUpdate) return true;
283
-
284
- function check(rule) {
285
- var handled = rule($injector, $location);
286
-
287
- if (!handled) return false;
288
- if (isString(handled)) $location.replace().url(handled);
289
- return true;
290
- }
291
- var n = rules.length, i;
292
-
293
- for (i = 0; i < n; i++) {
294
- if (check(rules[i])) return;
295
- }
296
- // always check otherwise last to allow dynamic updates to the set of rules
297
- if (otherwise) check(otherwise);
298
- }
299
-
300
- function listen() {
301
- listener = listener || $rootScope.$on('$locationChangeSuccess', update);
302
- return listener;
303
- }
304
-
305
- if (!interceptDeferred) listen();
306
-
307
- return {
308
- /**
309
- * @ngdoc function
310
- * @name ui.router.router.$urlRouter#sync
311
- * @methodOf ui.router.router.$urlRouter
312
- *
313
- * @description
314
- * Triggers an update; the same update that happens when the address bar url changes, aka `$locationChangeSuccess`.
315
- * This method is useful when you need to use `preventDefault()` on the `$locationChangeSuccess` event,
316
- * perform some custom logic (route protection, auth, config, redirection, etc) and then finally proceed
317
- * with the transition by calling `$urlRouter.sync()`.
318
- *
319
- * @example
320
- * <pre>
321
- * angular.module('app', ['ui.router'])
322
- * .run(function($rootScope, $urlRouter) {
323
- * $rootScope.$on('$locationChangeSuccess', function(evt) {
324
- * // Halt state change from even starting
325
- * evt.preventDefault();
326
- * // Perform custom logic
327
- * var meetsRequirement = ...
328
- * // Continue with the update and state transition if logic allows
329
- * if (meetsRequirement) $urlRouter.sync();
330
- * });
331
- * });
332
- * </pre>
333
- */
334
- sync: function() {
335
- update();
336
- },
337
-
338
- listen: function() {
339
- return listen();
340
- },
341
-
342
- update: function(read) {
343
- if (read) {
344
- location = $location.url();
345
- return;
346
- }
347
- if ($location.url() === location) return;
348
-
349
- $location.url(location);
350
- $location.replace();
351
- },
352
-
353
- push: function(urlMatcher, params, options) {
354
- $location.url(urlMatcher.format(params || {}));
355
- lastPushedUrl = options && options.$$avoidResync ? $location.url() : undefined;
356
- if (options && options.replace) $location.replace();
357
- },
358
-
359
- /**
360
- * @ngdoc function
361
- * @name ui.router.router.$urlRouter#href
362
- * @methodOf ui.router.router.$urlRouter
363
- *
364
- * @description
365
- * A URL generation method that returns the compiled URL for a given
366
- * {@link ui.router.util.type:UrlMatcher `UrlMatcher`}, populated with the provided parameters.
367
- *
368
- * @example
369
- * <pre>
370
- * $bob = $urlRouter.href(new UrlMatcher("/about/:person"), {
371
- * person: "bob"
372
- * });
373
- * // $bob == "/about/bob";
374
- * </pre>
375
- *
376
- * @param {UrlMatcher} urlMatcher The `UrlMatcher` object which is used as the template of the URL to generate.
377
- * @param {object=} params An object of parameter values to fill the matcher's required parameters.
378
- * @param {object=} options Options object. The options are:
379
- *
380
- * - **`absolute`** - {boolean=false}, If true will generate an absolute url, e.g. "http://www.example.com/fullurl".
381
- *
382
- * @returns {string} Returns the fully compiled URL, or `null` if `params` fail validation against `urlMatcher`
383
- */
384
- href: function(urlMatcher, params, options) {
385
- if (!urlMatcher.validates(params)) return null;
386
-
387
- var isHtml5 = $locationProvider.html5Mode();
388
- if (angular.isObject(isHtml5)) {
389
- isHtml5 = isHtml5.enabled;
390
- }
391
-
392
- var url = urlMatcher.format(params);
393
- options = options || {};
394
-
395
- if (!isHtml5 && url !== null) {
396
- url = "#" + $locationProvider.hashPrefix() + url;
397
- }
398
- url = appendBasePath(url, isHtml5, options.absolute);
399
-
400
- if (!options.absolute || !url) {
401
- return url;
402
- }
403
-
404
- var slash = (!isHtml5 && url ? '/' : ''), port = $location.port();
405
- port = (port === 80 || port === 443 ? '' : ':' + port);
406
-
407
- return [$location.protocol(), '://', $location.host(), port, slash, url].join('');
408
- }
409
- };
410
- }
411
- }
412
-
413
- angular.module('ui.router.router').provider('$urlRouter', $UrlRouterProvider);
@@ -1,71 +0,0 @@
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
- if (result && options.notify) {
40
- /**
41
- * @ngdoc event
42
- * @name ui.router.state.$state#$viewContentLoading
43
- * @eventOf ui.router.state.$view
44
- * @eventType broadcast on root scope
45
- * @description
46
- *
47
- * Fired once the view **begins loading**, *before* the DOM is rendered.
48
- *
49
- * @param {Object} event Event object.
50
- * @param {Object} viewConfig The view config properties (template, controller, etc).
51
- *
52
- * @example
53
- *
54
- * <pre>
55
- * $scope.$on('$viewContentLoading',
56
- * function(event, viewConfig){
57
- * // Access to all the view config properties.
58
- * // and one special property 'targetView'
59
- * // viewConfig.targetView
60
- * });
61
- * </pre>
62
- */
63
- $rootScope.$broadcast('$viewContentLoading', options);
64
- }
65
- return result;
66
- }
67
- };
68
- }
69
- }
70
-
71
- angular.module('ui.router.state').provider('$view', $ViewProvider);