rails-angular-strap 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +21 -0
  4. data/lib/rails-angular-strap.rb +11 -0
  5. data/lib/rails-angular-strap/engine.rb +4 -0
  6. data/lib/rails-angular-strap/version.rb +4 -0
  7. data/vendor/assets/javascripts/angular-strap.js +2 -0
  8. data/vendor/assets/javascripts/angular-strap.min.js +2 -0
  9. data/vendor/assets/javascripts/angular-strap/angular-strap.js +5014 -0
  10. data/vendor/assets/javascripts/angular-strap/angular-strap.min.js +11 -0
  11. data/vendor/assets/javascripts/angular-strap/angular-strap.tpl.js +89 -0
  12. data/vendor/assets/javascripts/angular-strap/angular-strap.tpl.min.js +8 -0
  13. data/vendor/assets/javascripts/angular-strap/modules/affix.js +249 -0
  14. data/vendor/assets/javascripts/angular-strap/modules/affix.min.js +9 -0
  15. data/vendor/assets/javascripts/angular-strap/modules/affix.min.js.map +1 -0
  16. data/vendor/assets/javascripts/angular-strap/modules/alert.js +120 -0
  17. data/vendor/assets/javascripts/angular-strap/modules/alert.min.js +9 -0
  18. data/vendor/assets/javascripts/angular-strap/modules/alert.min.js.map +1 -0
  19. data/vendor/assets/javascripts/angular-strap/modules/alert.tpl.js +14 -0
  20. data/vendor/assets/javascripts/angular-strap/modules/alert.tpl.min.js +8 -0
  21. data/vendor/assets/javascripts/angular-strap/modules/aside.js +96 -0
  22. data/vendor/assets/javascripts/angular-strap/modules/aside.min.js +9 -0
  23. data/vendor/assets/javascripts/angular-strap/modules/aside.min.js.map +1 -0
  24. data/vendor/assets/javascripts/angular-strap/modules/aside.tpl.js +14 -0
  25. data/vendor/assets/javascripts/angular-strap/modules/aside.tpl.min.js +8 -0
  26. data/vendor/assets/javascripts/angular-strap/modules/button.js +177 -0
  27. data/vendor/assets/javascripts/angular-strap/modules/button.min.js +9 -0
  28. data/vendor/assets/javascripts/angular-strap/modules/button.min.js.map +1 -0
  29. data/vendor/assets/javascripts/angular-strap/modules/collapse.js +273 -0
  30. data/vendor/assets/javascripts/angular-strap/modules/collapse.min.js +9 -0
  31. data/vendor/assets/javascripts/angular-strap/modules/collapse.min.js.map +1 -0
  32. data/vendor/assets/javascripts/angular-strap/modules/date-formatter.js +61 -0
  33. data/vendor/assets/javascripts/angular-strap/modules/date-formatter.min.js +9 -0
  34. data/vendor/assets/javascripts/angular-strap/modules/date-formatter.min.js.map +1 -0
  35. data/vendor/assets/javascripts/angular-strap/modules/date-parser.js +273 -0
  36. data/vendor/assets/javascripts/angular-strap/modules/date-parser.min.js +9 -0
  37. data/vendor/assets/javascripts/angular-strap/modules/date-parser.min.js.map +1 -0
  38. data/vendor/assets/javascripts/angular-strap/modules/datepicker.js +640 -0
  39. data/vendor/assets/javascripts/angular-strap/modules/datepicker.min.js +9 -0
  40. data/vendor/assets/javascripts/angular-strap/modules/datepicker.min.js.map +1 -0
  41. data/vendor/assets/javascripts/angular-strap/modules/datepicker.tpl.js +14 -0
  42. data/vendor/assets/javascripts/angular-strap/modules/datepicker.tpl.min.js +8 -0
  43. data/vendor/assets/javascripts/angular-strap/modules/debounce.js +62 -0
  44. data/vendor/assets/javascripts/angular-strap/modules/debounce.min.js +9 -0
  45. data/vendor/assets/javascripts/angular-strap/modules/debounce.min.js.map +1 -0
  46. data/vendor/assets/javascripts/angular-strap/modules/dimensions.js +156 -0
  47. data/vendor/assets/javascripts/angular-strap/modules/dimensions.min.js +9 -0
  48. data/vendor/assets/javascripts/angular-strap/modules/dimensions.min.js.map +1 -0
  49. data/vendor/assets/javascripts/angular-strap/modules/dropdown.js +149 -0
  50. data/vendor/assets/javascripts/angular-strap/modules/dropdown.min.js +9 -0
  51. data/vendor/assets/javascripts/angular-strap/modules/dropdown.min.js.map +1 -0
  52. data/vendor/assets/javascripts/angular-strap/modules/dropdown.tpl.js +14 -0
  53. data/vendor/assets/javascripts/angular-strap/modules/dropdown.tpl.min.js +8 -0
  54. data/vendor/assets/javascripts/angular-strap/modules/modal.js +349 -0
  55. data/vendor/assets/javascripts/angular-strap/modules/modal.min.js +9 -0
  56. data/vendor/assets/javascripts/angular-strap/modules/modal.min.js.map +1 -0
  57. data/vendor/assets/javascripts/angular-strap/modules/modal.tpl.js +14 -0
  58. data/vendor/assets/javascripts/angular-strap/modules/modal.tpl.min.js +8 -0
  59. data/vendor/assets/javascripts/angular-strap/modules/navbar.js +72 -0
  60. data/vendor/assets/javascripts/angular-strap/modules/navbar.min.js +9 -0
  61. data/vendor/assets/javascripts/angular-strap/modules/navbar.min.js.map +1 -0
  62. data/vendor/assets/javascripts/angular-strap/modules/parse-options.js +76 -0
  63. data/vendor/assets/javascripts/angular-strap/modules/parse-options.min.js +9 -0
  64. data/vendor/assets/javascripts/angular-strap/modules/parse-options.min.js.map +1 -0
  65. data/vendor/assets/javascripts/angular-strap/modules/popover.js +112 -0
  66. data/vendor/assets/javascripts/angular-strap/modules/popover.min.js +9 -0
  67. data/vendor/assets/javascripts/angular-strap/modules/popover.min.js.map +1 -0
  68. data/vendor/assets/javascripts/angular-strap/modules/popover.tpl.js +14 -0
  69. data/vendor/assets/javascripts/angular-strap/modules/popover.tpl.min.js +8 -0
  70. data/vendor/assets/javascripts/angular-strap/modules/raf.js +61 -0
  71. data/vendor/assets/javascripts/angular-strap/modules/raf.min.js +9 -0
  72. data/vendor/assets/javascripts/angular-strap/modules/raf.min.js.map +1 -0
  73. data/vendor/assets/javascripts/angular-strap/modules/scrollspy.js +261 -0
  74. data/vendor/assets/javascripts/angular-strap/modules/scrollspy.min.js +9 -0
  75. data/vendor/assets/javascripts/angular-strap/modules/scrollspy.min.js.map +1 -0
  76. data/vendor/assets/javascripts/angular-strap/modules/select.js +325 -0
  77. data/vendor/assets/javascripts/angular-strap/modules/select.min.js +9 -0
  78. data/vendor/assets/javascripts/angular-strap/modules/select.min.js.map +1 -0
  79. data/vendor/assets/javascripts/angular-strap/modules/select.tpl.js +14 -0
  80. data/vendor/assets/javascripts/angular-strap/modules/select.tpl.min.js +8 -0
  81. data/vendor/assets/javascripts/angular-strap/modules/tab.js +186 -0
  82. data/vendor/assets/javascripts/angular-strap/modules/tab.min.js +9 -0
  83. data/vendor/assets/javascripts/angular-strap/modules/tab.min.js.map +1 -0
  84. data/vendor/assets/javascripts/angular-strap/modules/tab.tpl.js +14 -0
  85. data/vendor/assets/javascripts/angular-strap/modules/tab.tpl.min.js +8 -0
  86. data/vendor/assets/javascripts/angular-strap/modules/timepicker.js +485 -0
  87. data/vendor/assets/javascripts/angular-strap/modules/timepicker.min.js +9 -0
  88. data/vendor/assets/javascripts/angular-strap/modules/timepicker.min.js.map +1 -0
  89. data/vendor/assets/javascripts/angular-strap/modules/timepicker.tpl.js +14 -0
  90. data/vendor/assets/javascripts/angular-strap/modules/timepicker.tpl.min.js +8 -0
  91. data/vendor/assets/javascripts/angular-strap/modules/tooltip.js +690 -0
  92. data/vendor/assets/javascripts/angular-strap/modules/tooltip.min.js +9 -0
  93. data/vendor/assets/javascripts/angular-strap/modules/tooltip.min.js.map +1 -0
  94. data/vendor/assets/javascripts/angular-strap/modules/tooltip.tpl.js +14 -0
  95. data/vendor/assets/javascripts/angular-strap/modules/tooltip.tpl.min.js +8 -0
  96. data/vendor/assets/javascripts/angular-strap/modules/typeahead.js +266 -0
  97. data/vendor/assets/javascripts/angular-strap/modules/typeahead.min.js +9 -0
  98. data/vendor/assets/javascripts/angular-strap/modules/typeahead.min.js.map +1 -0
  99. data/vendor/assets/javascripts/angular-strap/modules/typeahead.tpl.js +14 -0
  100. data/vendor/assets/javascripts/angular-strap/modules/typeahead.tpl.min.js +8 -0
  101. metadata +143 -0
@@ -0,0 +1,9 @@
1
+ /**
2
+ * angular-strap
3
+ * @version v2.1.6 - 2015-01-11
4
+ * @link http://mgcrea.github.io/angular-strap
5
+ * @author Olivier Louvignes (olivier@mg-crea.com)
6
+ * @license MIT License, http://www.opensource.org/licenses/MIT
7
+ */
8
+ "use strict";angular.module("mgcrea.ngStrap.alert",["mgcrea.ngStrap.modal"]).provider("$alert",function(){var t=this.defaults={animation:"am-fade",prefixClass:"alert",prefixEvent:"alert",placement:null,template:"alert/alert.tpl.html",container:!1,element:null,backdrop:!1,keyboard:!0,show:!0,duration:!1,type:!1,dismissable:!0};this.$get=["$modal","$timeout",function(e,n){function a(a){var r={},i=angular.extend({},t,a);r=e(i),r.$scope.dismissable=!!i.dismissable,i.type&&(r.$scope.type=i.type);var o=r.show;return i.duration&&(r.show=function(){o(),n(function(){r.hide()},1e3*i.duration)}),r}return a}]}).directive("bsAlert",["$window","$sce","$alert",function(t,e,n){t.requestAnimationFrame||t.setTimeout;return{restrict:"EAC",scope:!0,link:function(t,a,r){var i={scope:t,element:a,show:!1};angular.forEach(["template","placement","keyboard","html","container","animation","duration","dismissable"],function(t){angular.isDefined(r[t])&&(i[t]=r[t])}),angular.forEach(["title","content","type"],function(n){r[n]&&r.$observe(n,function(a){t[n]=e.trustAsHtml(a)})}),r.bsAlert&&t.$watch(r.bsAlert,function(e){angular.isObject(e)?angular.extend(t,e):t.content=e},!0);var o=n(i);a.on(r.trigger||"click",o.toggle),t.$on("$destroy",function(){o&&o.destroy(),i=null,o=null})}}}]);
9
+ //# sourceMappingURL=alert.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["alert/alert.js"],"names":[],"mappings":"qBAaM,OAAA,wBAAa,kCAEb,SAAU,cAEV,GAAS,KAAA,UACT,UAAU,UACV,YAAU,QACV,YAAM,uBAEN,SAAU,uBACV,WAAM,EACN,QAAA,6BAGF,MAAK,EAEH,UAAS,uBAEH,QAGJ,MAAI,SAAU,WAAe,SAAI,EAAU,WAE3C,GAAgB,YAKd,EAAO,QAAO,UAAe,EAAA,UAK/B,EAAG,OAAQ,cAAU,EAAA,YACnB,EAAO,SACL,OAAA,KAAA,EAAA,yDAOJ,sEAiBI,WAAS,UAAS,OAAO,SAAe,SAAA,EAAc,EAAA,yDAKrD,uCAKH,IAAa,MAAK,EAAS,QAAK,EAAS,MAAU,WACjD,SAAa,WAAK,YAAY,WAAA,OAAA,YAAA,YAAA,WAAA,eAAA,SAAA,0CAKlC,QAAK,SAAW,QAAM,UAAY,QAAS,SAAS,GAClD,EAAG,IAAQ,EAAA,SAAS,EAAW,SAAA,GAC7B,EAAA,GAAQ,EAAO,YAAO,qEAOtB,QAAQ,OAAO,EAAA,uBAOjB,GAAI,EAAa,gFAQtB,EAAA","file":"alert.min.js","sourcesContent":["'use strict';\n\n// @BUG: following snippet won't compile correctly\n// @TODO: submit issue to core\n// '<span ng-if=\"title\"><strong ng-bind=\"title\"></strong>&nbsp;</span><span ng-bind-html=\"content\"></span>' +\n\nangular.module('mgcrea.ngStrap.alert', ['mgcrea.ngStrap.modal'])\n\n .provider('$alert', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade',\n prefixClass: 'alert',\n prefixEvent: 'alert',\n placement: null,\n template: 'alert/alert.tpl.html',\n container: false,\n element: null,\n backdrop: false,\n keyboard: true,\n show: true,\n // Specific options\n duration: false,\n type: false,\n dismissable: true\n };\n\n this.$get = function($modal, $timeout) {\n\n function AlertFactory(config) {\n\n var $alert = {};\n\n // Common vars\n var options = angular.extend({}, defaults, config);\n\n $alert = $modal(options);\n\n // Support scope as string options [/*title, content, */ type, dismissable]\n $alert.$scope.dismissable = !!options.dismissable;\n if(options.type) {\n $alert.$scope.type = options.type;\n }\n\n // Support auto-close duration\n var show = $alert.show;\n if(options.duration) {\n $alert.show = function() {\n show();\n $timeout(function() {\n $alert.hide();\n }, options.duration * 1000);\n };\n }\n\n return $alert;\n\n }\n\n return AlertFactory;\n\n };\n\n })\n\n .directive('bsAlert', function($window, $sce, $alert) {\n\n var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;\n\n return {\n restrict: 'EAC',\n scope: true,\n link: function postLink(scope, element, attr, transclusion) {\n\n // Directive options\n var options = {scope: scope, element: element, show: false};\n angular.forEach(['template', 'placement', 'keyboard', 'html', 'container', 'animation', 'duration', 'dismissable'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Support scope as data-attrs\n angular.forEach(['title', 'content', 'type'], function(key) {\n attr[key] && attr.$observe(key, function(newValue, oldValue) {\n scope[key] = $sce.trustAsHtml(newValue);\n });\n });\n\n // Support scope as an object\n attr.bsAlert && scope.$watch(attr.bsAlert, function(newValue, oldValue) {\n if(angular.isObject(newValue)) {\n angular.extend(scope, newValue);\n } else {\n scope.content = newValue;\n }\n }, true);\n\n // Initialize alert\n var alert = $alert(options);\n\n // Trigger\n element.on(attr.trigger || 'click', alert.toggle);\n\n // Garbage collection\n scope.$on('$destroy', function() {\n if (alert) alert.destroy();\n options = null;\n alert = null;\n });\n\n }\n };\n\n });\n"],"sourceRoot":"/source/"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * angular-strap
3
+ * @version v2.1.6 - 2015-01-11
4
+ * @link http://mgcrea.github.io/angular-strap
5
+ * @author Olivier Louvignes (olivier@mg-crea.com)
6
+ * @license MIT License, http://www.opensource.org/licenses/MIT
7
+ */
8
+ 'use strict';
9
+
10
+ angular.module('mgcrea.ngStrap.alert').run(['$templateCache', function($templateCache) {
11
+
12
+ $templateCache.put('alert/alert.tpl.html', '<div class="alert" ng-class="[type ? \'alert-\' + type : null]"><button type="button" class="close" ng-if="dismissable" ng-click="$hide()">&times;</button> <strong ng-bind="title"></strong>&nbsp;<span ng-bind-html="content"></span></div>');
13
+
14
+ }]);
@@ -0,0 +1,8 @@
1
+ /**
2
+ * angular-strap
3
+ * @version v2.1.6 - 2015-01-11
4
+ * @link http://mgcrea.github.io/angular-strap
5
+ * @author Olivier Louvignes (olivier@mg-crea.com)
6
+ * @license MIT License, http://www.opensource.org/licenses/MIT
7
+ */
8
+ "use strict";angular.module("mgcrea.ngStrap.alert").run(["$templateCache",function(t){t.put("alert/alert.tpl.html",'<div class="alert" ng-class="[type ? \'alert-\' + type : null]"><button type="button" class="close" ng-if="dismissable" ng-click="$hide()">&times;</button> <strong ng-bind="title"></strong>&nbsp;<span ng-bind-html="content"></span></div>')}]);
@@ -0,0 +1,96 @@
1
+ /**
2
+ * angular-strap
3
+ * @version v2.1.6 - 2015-01-11
4
+ * @link http://mgcrea.github.io/angular-strap
5
+ * @author Olivier Louvignes (olivier@mg-crea.com)
6
+ * @license MIT License, http://www.opensource.org/licenses/MIT
7
+ */
8
+ 'use strict';
9
+
10
+ angular.module('mgcrea.ngStrap.aside', ['mgcrea.ngStrap.modal'])
11
+
12
+ .provider('$aside', function() {
13
+
14
+ var defaults = this.defaults = {
15
+ animation: 'am-fade-and-slide-right',
16
+ prefixClass: 'aside',
17
+ prefixEvent: 'aside',
18
+ placement: 'right',
19
+ template: 'aside/aside.tpl.html',
20
+ contentTemplate: false,
21
+ container: false,
22
+ element: null,
23
+ backdrop: true,
24
+ keyboard: true,
25
+ html: false,
26
+ show: true
27
+ };
28
+
29
+ this.$get = ["$modal", function($modal) {
30
+
31
+ function AsideFactory(config) {
32
+
33
+ var $aside = {};
34
+
35
+ // Common vars
36
+ var options = angular.extend({}, defaults, config);
37
+
38
+ $aside = $modal(options);
39
+
40
+ return $aside;
41
+
42
+ }
43
+
44
+ return AsideFactory;
45
+
46
+ }];
47
+
48
+ })
49
+
50
+ .directive('bsAside', ["$window", "$sce", "$aside", function($window, $sce, $aside) {
51
+
52
+ var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;
53
+
54
+ return {
55
+ restrict: 'EAC',
56
+ scope: true,
57
+ link: function postLink(scope, element, attr, transclusion) {
58
+ // Directive options
59
+ var options = {scope: scope, element: element, show: false};
60
+ angular.forEach(['template', 'contentTemplate', 'placement', 'backdrop', 'keyboard', 'html', 'container', 'animation'], function(key) {
61
+ if(angular.isDefined(attr[key])) options[key] = attr[key];
62
+ });
63
+
64
+ // Support scope as data-attrs
65
+ angular.forEach(['title', 'content'], function(key) {
66
+ attr[key] && attr.$observe(key, function(newValue, oldValue) {
67
+ scope[key] = $sce.trustAsHtml(newValue);
68
+ });
69
+ });
70
+
71
+ // Support scope as an object
72
+ attr.bsAside && scope.$watch(attr.bsAside, function(newValue, oldValue) {
73
+ if(angular.isObject(newValue)) {
74
+ angular.extend(scope, newValue);
75
+ } else {
76
+ scope.content = newValue;
77
+ }
78
+ }, true);
79
+
80
+ // Initialize aside
81
+ var aside = $aside(options);
82
+
83
+ // Trigger
84
+ element.on(attr.trigger || 'click', aside.toggle);
85
+
86
+ // Garbage collection
87
+ scope.$on('$destroy', function() {
88
+ if (aside) aside.destroy();
89
+ options = null;
90
+ aside = null;
91
+ });
92
+
93
+ }
94
+ };
95
+
96
+ }]);
@@ -0,0 +1,9 @@
1
+ /**
2
+ * angular-strap
3
+ * @version v2.1.6 - 2015-01-11
4
+ * @link http://mgcrea.github.io/angular-strap
5
+ * @author Olivier Louvignes (olivier@mg-crea.com)
6
+ * @license MIT License, http://www.opensource.org/licenses/MIT
7
+ */
8
+ "use strict";angular.module("mgcrea.ngStrap.aside",["mgcrea.ngStrap.modal"]).provider("$aside",function(){var e=this.defaults={animation:"am-fade-and-slide-right",prefixClass:"aside",prefixEvent:"aside",placement:"right",template:"aside/aside.tpl.html",contentTemplate:!1,container:!1,element:null,backdrop:!0,keyboard:!0,html:!1,show:!0};this.$get=["$modal",function(t){function n(n){var a={},i=angular.extend({},e,n);return a=t(i)}return n}]}).directive("bsAside",["$window","$sce","$aside",function(e,t,n){e.requestAnimationFrame||e.setTimeout;return{restrict:"EAC",scope:!0,link:function(e,a,i){var r={scope:e,element:a,show:!1};angular.forEach(["template","contentTemplate","placement","backdrop","keyboard","html","container","animation"],function(e){angular.isDefined(i[e])&&(r[e]=i[e])}),angular.forEach(["title","content"],function(n){i[n]&&i.$observe(n,function(a){e[n]=t.trustAsHtml(a)})}),i.bsAside&&e.$watch(i.bsAside,function(t){angular.isObject(t)?angular.extend(e,t):e.content=t},!0);var o=n(r);a.on(i.trigger||"click",o.toggle),e.$on("$destroy",function(){o&&o.destroy(),r=null,o=null})}}}]);
9
+ //# sourceMappingURL=aside.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["aside/aside.js"],"names":[],"mappings":"qBASM,OAAA,wBAAa,kCAEb,SAAU,cAEV,GAAW,KAAA,UACX,UAAS,0BACT,YAAU,QACV,YAAU,QACV,UAAM,QACN,SAAM,uDAGR,QAAK,iBAEH,UAAS,gBAEH,QAGJ,MAAI,SAAU,SAAQ,WAEtB,GAAgB,GAEhB,GAAA,oEAiBI,WAAS,UAAS,OAAO,SAAe,SAAA,EAAc,EAAA,GAEpC,EAAO,uBAAwB,EAAA,kEAOnD,IAAa,MAAK,EAAS,QAAK,EAAS,MAAU,WACjD,SAAa,WAAK,kBAAY,YAAA,WAAA,WAAA,OAAA,YAAA,aAAA,SAAA,0CAKlC,QAAK,SAAW,QAAM,WAAY,SAAS,GACzC,EAAG,IAAQ,EAAA,SAAS,EAAW,SAAA,GAC7B,EAAA,GAAQ,EAAO,YAAO,qEAOtB,QAAQ,OAAO,EAAA,uBAOjB,GAAI,EAAa,gFAQtB,EAAA","file":"aside.min.js","sourcesContent":["'use strict';\n\nangular.module('mgcrea.ngStrap.aside', ['mgcrea.ngStrap.modal'])\n\n .provider('$aside', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade-and-slide-right',\n prefixClass: 'aside',\n prefixEvent: 'aside',\n placement: 'right',\n template: 'aside/aside.tpl.html',\n contentTemplate: false,\n container: false,\n element: null,\n backdrop: true,\n keyboard: true,\n html: false,\n show: true\n };\n\n this.$get = function($modal) {\n\n function AsideFactory(config) {\n\n var $aside = {};\n\n // Common vars\n var options = angular.extend({}, defaults, config);\n\n $aside = $modal(options);\n\n return $aside;\n\n }\n\n return AsideFactory;\n\n };\n\n })\n\n .directive('bsAside', function($window, $sce, $aside) {\n\n var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;\n\n return {\n restrict: 'EAC',\n scope: true,\n link: function postLink(scope, element, attr, transclusion) {\n // Directive options\n var options = {scope: scope, element: element, show: false};\n angular.forEach(['template', 'contentTemplate', 'placement', 'backdrop', 'keyboard', 'html', 'container', 'animation'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Support scope as data-attrs\n angular.forEach(['title', 'content'], function(key) {\n attr[key] && attr.$observe(key, function(newValue, oldValue) {\n scope[key] = $sce.trustAsHtml(newValue);\n });\n });\n\n // Support scope as an object\n attr.bsAside && scope.$watch(attr.bsAside, function(newValue, oldValue) {\n if(angular.isObject(newValue)) {\n angular.extend(scope, newValue);\n } else {\n scope.content = newValue;\n }\n }, true);\n\n // Initialize aside\n var aside = $aside(options);\n\n // Trigger\n element.on(attr.trigger || 'click', aside.toggle);\n\n // Garbage collection\n scope.$on('$destroy', function() {\n if (aside) aside.destroy();\n options = null;\n aside = null;\n });\n\n }\n };\n\n });\n"],"sourceRoot":"/source/"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * angular-strap
3
+ * @version v2.1.6 - 2015-01-11
4
+ * @link http://mgcrea.github.io/angular-strap
5
+ * @author Olivier Louvignes (olivier@mg-crea.com)
6
+ * @license MIT License, http://www.opensource.org/licenses/MIT
7
+ */
8
+ 'use strict';
9
+
10
+ angular.module('mgcrea.ngStrap.aside').run(['$templateCache', function($templateCache) {
11
+
12
+ $templateCache.put('aside/aside.tpl.html', '<div class="aside" tabindex="-1" role="dialog"><div class="aside-dialog"><div class="aside-content"><div class="aside-header" ng-show="title"><button type="button" class="close" ng-click="$hide()">&times;</button><h4 class="aside-title" ng-bind="title"></h4></div><div class="aside-body" ng-bind="content"></div><div class="aside-footer"><button type="button" class="btn btn-default" ng-click="$hide()">Close</button></div></div></div></div>');
13
+
14
+ }]);
@@ -0,0 +1,8 @@
1
+ /**
2
+ * angular-strap
3
+ * @version v2.1.6 - 2015-01-11
4
+ * @link http://mgcrea.github.io/angular-strap
5
+ * @author Olivier Louvignes (olivier@mg-crea.com)
6
+ * @license MIT License, http://www.opensource.org/licenses/MIT
7
+ */
8
+ "use strict";angular.module("mgcrea.ngStrap.aside").run(["$templateCache",function(t){t.put("aside/aside.tpl.html",'<div class="aside" tabindex="-1" role="dialog"><div class="aside-dialog"><div class="aside-content"><div class="aside-header" ng-show="title"><button type="button" class="close" ng-click="$hide()">&times;</button><h4 class="aside-title" ng-bind="title"></h4></div><div class="aside-body" ng-bind="content"></div><div class="aside-footer"><button type="button" class="btn btn-default" ng-click="$hide()">Close</button></div></div></div></div>')}]);
@@ -0,0 +1,177 @@
1
+ /**
2
+ * angular-strap
3
+ * @version v2.1.6 - 2015-01-11
4
+ * @link http://mgcrea.github.io/angular-strap
5
+ * @author Olivier Louvignes (olivier@mg-crea.com)
6
+ * @license MIT License, http://www.opensource.org/licenses/MIT
7
+ */
8
+ 'use strict';
9
+
10
+ angular.module('mgcrea.ngStrap.button', [])
11
+
12
+ .provider('$button', function() {
13
+
14
+ var defaults = this.defaults = {
15
+ activeClass:'active',
16
+ toggleEvent:'click'
17
+ };
18
+
19
+ this.$get = function() {
20
+ return {defaults: defaults};
21
+ };
22
+
23
+ })
24
+
25
+ .directive('bsCheckboxGroup', function() {
26
+
27
+ return {
28
+ restrict: 'A',
29
+ require: 'ngModel',
30
+ compile: function postLink(element, attr) {
31
+ element.attr('data-toggle', 'buttons');
32
+ element.removeAttr('ng-model');
33
+ var children = element[0].querySelectorAll('input[type="checkbox"]');
34
+ angular.forEach(children, function(child) {
35
+ var childEl = angular.element(child);
36
+ childEl.attr('bs-checkbox', '');
37
+ childEl.attr('ng-model', attr.ngModel + '.' + childEl.attr('value'));
38
+ });
39
+ }
40
+
41
+ };
42
+
43
+ })
44
+
45
+ .directive('bsCheckbox', ["$button", "$$rAF", function($button, $$rAF) {
46
+
47
+ var defaults = $button.defaults;
48
+ var constantValueRegExp = /^(true|false|\d+)$/;
49
+
50
+ return {
51
+ restrict: 'A',
52
+ require: 'ngModel',
53
+ link: function postLink(scope, element, attr, controller) {
54
+
55
+ var options = defaults;
56
+
57
+ // Support label > input[type="checkbox"]
58
+ var isInput = element[0].nodeName === 'INPUT';
59
+ var activeElement = isInput ? element.parent() : element;
60
+
61
+ var trueValue = angular.isDefined(attr.trueValue) ? attr.trueValue : true;
62
+ if(constantValueRegExp.test(attr.trueValue)) {
63
+ trueValue = scope.$eval(attr.trueValue);
64
+ }
65
+ var falseValue = angular.isDefined(attr.falseValue) ? attr.falseValue : false;
66
+ if(constantValueRegExp.test(attr.falseValue)) {
67
+ falseValue = scope.$eval(attr.falseValue);
68
+ }
69
+
70
+ // Parse exotic values
71
+ var hasExoticValues = typeof trueValue !== 'boolean' || typeof falseValue !== 'boolean';
72
+ if(hasExoticValues) {
73
+ controller.$parsers.push(function(viewValue) {
74
+ // console.warn('$parser', element.attr('ng-model'), 'viewValue', viewValue);
75
+ return viewValue ? trueValue : falseValue;
76
+ });
77
+ // modelValue -> $formatters -> viewValue
78
+ controller.$formatters.push(function(modelValue) {
79
+ // console.warn('$formatter("%s"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue);
80
+ return angular.equals(modelValue, trueValue);
81
+ });
82
+ // Fix rendering for exotic values
83
+ scope.$watch(attr.ngModel, function(newValue, oldValue) {
84
+ controller.$render();
85
+ });
86
+ }
87
+
88
+ // model -> view
89
+ controller.$render = function () {
90
+ // console.warn('$render', element.attr('ng-model'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);
91
+ var isActive = angular.equals(controller.$modelValue, trueValue);
92
+ $$rAF(function() {
93
+ if(isInput) element[0].checked = isActive;
94
+ activeElement.toggleClass(options.activeClass, isActive);
95
+ });
96
+ };
97
+
98
+ // view -> model
99
+ element.bind(options.toggleEvent, function() {
100
+ scope.$apply(function () {
101
+ // console.warn('!click', element.attr('ng-model'), 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue, 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue);
102
+ if(!isInput) {
103
+ controller.$setViewValue(!activeElement.hasClass('active'));
104
+ }
105
+ if(!hasExoticValues) {
106
+ controller.$render();
107
+ }
108
+ });
109
+ });
110
+
111
+ }
112
+
113
+ };
114
+
115
+ }])
116
+
117
+ .directive('bsRadioGroup', function() {
118
+
119
+ return {
120
+ restrict: 'A',
121
+ require: 'ngModel',
122
+ compile: function postLink(element, attr) {
123
+ element.attr('data-toggle', 'buttons');
124
+ element.removeAttr('ng-model');
125
+ var children = element[0].querySelectorAll('input[type="radio"]');
126
+ angular.forEach(children, function(child) {
127
+ angular.element(child).attr('bs-radio', '');
128
+ angular.element(child).attr('ng-model', attr.ngModel);
129
+ });
130
+ }
131
+
132
+ };
133
+
134
+ })
135
+
136
+ .directive('bsRadio', ["$button", "$$rAF", function($button, $$rAF) {
137
+
138
+ var defaults = $button.defaults;
139
+ var constantValueRegExp = /^(true|false|\d+)$/;
140
+
141
+ return {
142
+ restrict: 'A',
143
+ require: 'ngModel',
144
+ link: function postLink(scope, element, attr, controller) {
145
+
146
+ var options = defaults;
147
+
148
+ // Support `label > input[type="radio"]` markup
149
+ var isInput = element[0].nodeName === 'INPUT';
150
+ var activeElement = isInput ? element.parent() : element;
151
+
152
+ var value = constantValueRegExp.test(attr.value) ? scope.$eval(attr.value) : attr.value;
153
+
154
+ // model -> view
155
+ controller.$render = function () {
156
+ // console.warn('$render', element.attr('value'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);
157
+ var isActive = angular.equals(controller.$modelValue, value);
158
+ $$rAF(function() {
159
+ if(isInput) element[0].checked = isActive;
160
+ activeElement.toggleClass(options.activeClass, isActive);
161
+ });
162
+ };
163
+
164
+ // view -> model
165
+ element.bind(options.toggleEvent, function() {
166
+ scope.$apply(function () {
167
+ // console.warn('!click', element.attr('value'), 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue, 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue);
168
+ controller.$setViewValue(value);
169
+ controller.$render();
170
+ });
171
+ });
172
+
173
+ }
174
+
175
+ };
176
+
177
+ }]);
@@ -0,0 +1,9 @@
1
+ /**
2
+ * angular-strap
3
+ * @version v2.1.6 - 2015-01-11
4
+ * @link http://mgcrea.github.io/angular-strap
5
+ * @author Olivier Louvignes (olivier@mg-crea.com)
6
+ * @license MIT License, http://www.opensource.org/licenses/MIT
7
+ */
8
+ "use strict";angular.module("mgcrea.ngStrap.button",[]).provider("$button",function(){var e=this.defaults={activeClass:"active",toggleEvent:"click"};this.$get=function(){return{defaults:e}}}).directive("bsCheckboxGroup",function(){return{restrict:"A",require:"ngModel",compile:function(e,t){e.attr("data-toggle","buttons"),e.removeAttr("ng-model");var a=e[0].querySelectorAll('input[type="checkbox"]');angular.forEach(a,function(e){var a=angular.element(e);a.attr("bs-checkbox",""),a.attr("ng-model",t.ngModel+"."+a.attr("value"))})}}}).directive("bsCheckbox",["$button","$$rAF",function(e,t){var a=e.defaults,n=/^(true|false|\d+)$/;return{restrict:"A",require:"ngModel",link:function(e,r,u,l){var o=a,i="INPUT"===r[0].nodeName,c=i?r.parent():r,s=angular.isDefined(u.trueValue)?u.trueValue:!0;n.test(u.trueValue)&&(s=e.$eval(u.trueValue));var d=angular.isDefined(u.falseValue)?u.falseValue:!1;n.test(u.falseValue)&&(d=e.$eval(u.falseValue));var f="boolean"!=typeof s||"boolean"!=typeof d;f&&(l.$parsers.push(function(e){return e?s:d}),l.$formatters.push(function(e){return angular.equals(e,s)}),e.$watch(u.ngModel,function(){l.$render()})),l.$render=function(){var e=angular.equals(l.$modelValue,s);t(function(){i&&(r[0].checked=e),c.toggleClass(o.activeClass,e)})},r.bind(o.toggleEvent,function(){e.$apply(function(){i||l.$setViewValue(!c.hasClass("active")),f||l.$render()})})}}}]).directive("bsRadioGroup",function(){return{restrict:"A",require:"ngModel",compile:function(e,t){e.attr("data-toggle","buttons"),e.removeAttr("ng-model");var a=e[0].querySelectorAll('input[type="radio"]');angular.forEach(a,function(e){angular.element(e).attr("bs-radio",""),angular.element(e).attr("ng-model",t.ngModel)})}}}).directive("bsRadio",["$button","$$rAF",function(e,t){var a=e.defaults,n=/^(true|false|\d+)$/;return{restrict:"A",require:"ngModel",link:function(e,r,u,l){var o=a,i="INPUT"===r[0].nodeName,c=i?r.parent():r,s=n.test(u.value)?e.$eval(u.value):u.value;l.$render=function(){var e=angular.equals(l.$modelValue,s);t(function(){i&&(r[0].checked=e),c.toggleClass(o.activeClass,e)})},r.bind(o.toggleEvent,function(){e.$apply(function(){l.$setViewValue(s),l.$render()})})}}}]);
9
+ //# sourceMappingURL=button.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["button/button.js"],"names":[],"mappings":"iEAWS,UAAO,+FAQZ,OAAO,SAAA,gBAKH,kBAAmB,2BAGb,YACJ,kBACA,SAAa,EAAiB,mQAelC,cAAS,UAAA,QAAA,SAAA,EAAA,oBAGP,EAAc,qCAGV,YACA,iCAGJ,GAAG,GAAA,EAGC,EAA+B,UAA/B,EAAa,GAAQ,SACtB,EAAA,EAAyB,EAAK,SAAa,+FAM9C,IAAG,GAAA,QAAiB,UAAA,EAAA,YAAA,EAAA,YAAA,CAClB,GAAoB,KAAK,EAAA,0CAKzB,GAAqC,iBAAd,IAA0B,iBAAA,SAEvC,SAAQ,KAAO,SAAA,4GAWzB,EAAI,uEAQN,GAAQ,WACN,IAAa,EAAA,GAAY,QAAA,uCAMrB,KAAA,EAAW,YAAA,2GAkBjB,eAAmB,2BAGjB,YACA,+QAeJ,WAAS,UAAA,QAAA,SAAA,EAAA,oBAGP,EAAc,qCAGV,YACA,mEAOF,EAAe,EAAQ,EAAO,SAAW,EAEvC,EAAG,EAAoB,KAAU,EAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,gEAMrC,GAAQ,WACN,IAAa,EAAA,GAAY,QAAA","file":"button.min.js","sourcesContent":["'use strict';\n\nangular.module('mgcrea.ngStrap.button', [])\n\n .provider('$button', function() {\n\n var defaults = this.defaults = {\n activeClass:'active',\n toggleEvent:'click'\n };\n\n this.$get = function() {\n return {defaults: defaults};\n };\n\n })\n\n .directive('bsCheckboxGroup', function() {\n\n return {\n restrict: 'A',\n require: 'ngModel',\n compile: function postLink(element, attr) {\n element.attr('data-toggle', 'buttons');\n element.removeAttr('ng-model');\n var children = element[0].querySelectorAll('input[type=\"checkbox\"]');\n angular.forEach(children, function(child) {\n var childEl = angular.element(child);\n childEl.attr('bs-checkbox', '');\n childEl.attr('ng-model', attr.ngModel + '.' + childEl.attr('value'));\n });\n }\n\n };\n\n })\n\n .directive('bsCheckbox', function($button, $$rAF) {\n\n var defaults = $button.defaults;\n var constantValueRegExp = /^(true|false|\\d+)$/;\n\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function postLink(scope, element, attr, controller) {\n\n var options = defaults;\n\n // Support label > input[type=\"checkbox\"]\n var isInput = element[0].nodeName === 'INPUT';\n var activeElement = isInput ? element.parent() : element;\n\n var trueValue = angular.isDefined(attr.trueValue) ? attr.trueValue : true;\n if(constantValueRegExp.test(attr.trueValue)) {\n trueValue = scope.$eval(attr.trueValue);\n }\n var falseValue = angular.isDefined(attr.falseValue) ? attr.falseValue : false;\n if(constantValueRegExp.test(attr.falseValue)) {\n falseValue = scope.$eval(attr.falseValue);\n }\n\n // Parse exotic values\n var hasExoticValues = typeof trueValue !== 'boolean' || typeof falseValue !== 'boolean';\n if(hasExoticValues) {\n controller.$parsers.push(function(viewValue) {\n // console.warn('$parser', element.attr('ng-model'), 'viewValue', viewValue);\n return viewValue ? trueValue : falseValue;\n });\n // modelValue -> $formatters -> viewValue\n controller.$formatters.push(function(modelValue) {\n // console.warn('$formatter(\"%s\"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue);\n return angular.equals(modelValue, trueValue);\n });\n // Fix rendering for exotic values\n scope.$watch(attr.ngModel, function(newValue, oldValue) {\n controller.$render();\n });\n }\n\n // model -> view\n controller.$render = function () {\n // console.warn('$render', element.attr('ng-model'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);\n var isActive = angular.equals(controller.$modelValue, trueValue);\n $$rAF(function() {\n if(isInput) element[0].checked = isActive;\n activeElement.toggleClass(options.activeClass, isActive);\n });\n };\n\n // view -> model\n element.bind(options.toggleEvent, function() {\n scope.$apply(function () {\n // console.warn('!click', element.attr('ng-model'), 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue, 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue);\n if(!isInput) {\n controller.$setViewValue(!activeElement.hasClass('active'));\n }\n if(!hasExoticValues) {\n controller.$render();\n }\n });\n });\n\n }\n\n };\n\n })\n\n .directive('bsRadioGroup', function() {\n\n return {\n restrict: 'A',\n require: 'ngModel',\n compile: function postLink(element, attr) {\n element.attr('data-toggle', 'buttons');\n element.removeAttr('ng-model');\n var children = element[0].querySelectorAll('input[type=\"radio\"]');\n angular.forEach(children, function(child) {\n angular.element(child).attr('bs-radio', '');\n angular.element(child).attr('ng-model', attr.ngModel);\n });\n }\n\n };\n\n })\n\n .directive('bsRadio', function($button, $$rAF) {\n\n var defaults = $button.defaults;\n var constantValueRegExp = /^(true|false|\\d+)$/;\n\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function postLink(scope, element, attr, controller) {\n\n var options = defaults;\n\n // Support `label > input[type=\"radio\"]` markup\n var isInput = element[0].nodeName === 'INPUT';\n var activeElement = isInput ? element.parent() : element;\n\n var value = constantValueRegExp.test(attr.value) ? scope.$eval(attr.value) : attr.value;\n\n // model -> view\n controller.$render = function () {\n // console.warn('$render', element.attr('value'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);\n var isActive = angular.equals(controller.$modelValue, value);\n $$rAF(function() {\n if(isInput) element[0].checked = isActive;\n activeElement.toggleClass(options.activeClass, isActive);\n });\n };\n\n // view -> model\n element.bind(options.toggleEvent, function() {\n scope.$apply(function () {\n // console.warn('!click', element.attr('value'), 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue, 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue);\n controller.$setViewValue(value);\n controller.$render();\n });\n });\n\n }\n\n };\n\n });\n"],"sourceRoot":"/source/"}
@@ -0,0 +1,273 @@
1
+ /**
2
+ * angular-strap
3
+ * @version v2.1.6 - 2015-01-11
4
+ * @link http://mgcrea.github.io/angular-strap
5
+ * @author Olivier Louvignes (olivier@mg-crea.com)
6
+ * @license MIT License, http://www.opensource.org/licenses/MIT
7
+ */
8
+ 'use strict';
9
+
10
+ angular.module('mgcrea.ngStrap.collapse', [])
11
+
12
+ .provider('$collapse', function() {
13
+
14
+ var defaults = this.defaults = {
15
+ animation: 'am-collapse',
16
+ disallowToggle: false,
17
+ activeClass: 'in',
18
+ startCollapsed: false,
19
+ allowMultiple: false
20
+ };
21
+
22
+ var controller = this.controller = function($scope, $element, $attrs) {
23
+ var self = this;
24
+
25
+ // Attributes options
26
+ self.$options = angular.copy(defaults);
27
+ angular.forEach(['animation', 'disallowToggle', 'activeClass', 'startCollapsed', 'allowMultiple'], function (key) {
28
+ if(angular.isDefined($attrs[key])) self.$options[key] = $attrs[key];
29
+ });
30
+
31
+ self.$toggles = [];
32
+ self.$targets = [];
33
+
34
+ self.$viewChangeListeners = [];
35
+
36
+ self.$registerToggle = function(element) {
37
+ self.$toggles.push(element);
38
+ };
39
+ self.$registerTarget = function(element) {
40
+ self.$targets.push(element);
41
+ };
42
+
43
+ self.$unregisterToggle = function(element) {
44
+ var index = self.$toggles.indexOf(element);
45
+ // remove toggle from $toggles array
46
+ self.$toggles.splice(index, 1);
47
+ };
48
+ self.$unregisterTarget = function(element) {
49
+ var index = self.$targets.indexOf(element);
50
+
51
+ // remove element from $targets array
52
+ self.$targets.splice(index, 1);
53
+
54
+ if (self.$options.allowMultiple) {
55
+ // remove target index from $active array values
56
+ deactivateItem(element);
57
+ }
58
+
59
+ // fix active item indexes
60
+ fixActiveItemIndexes(index);
61
+
62
+ self.$viewChangeListeners.forEach(function(fn) {
63
+ fn();
64
+ });
65
+ };
66
+
67
+ // use array to store all the currently open panels
68
+ self.$targets.$active = !self.$options.startCollapsed ? [0] : [];
69
+ self.$setActive = $scope.$setActive = function(value) {
70
+ if(angular.isArray(value)) {
71
+ self.$targets.$active = angular.copy(value);
72
+ }
73
+ else if(!self.$options.disallowToggle) {
74
+ // toogle element active status
75
+ isActive(value) ? deactivateItem(value) : activateItem(value);
76
+ } else {
77
+ activateItem(value);
78
+ }
79
+
80
+ self.$viewChangeListeners.forEach(function(fn) {
81
+ fn();
82
+ });
83
+ };
84
+
85
+ self.$activeIndexes = function() {
86
+ return self.$options.allowMultiple ? self.$targets.$active :
87
+ self.$targets.$active.length === 1 ? self.$targets.$active[0] : -1;
88
+ };
89
+
90
+ function fixActiveItemIndexes(index) {
91
+ // item with index was removed, so we
92
+ // need to adjust other items index values
93
+ var activeIndexes = self.$targets.$active;
94
+ for(var i = 0; i < activeIndexes.length; i++) {
95
+ if (index < activeIndexes[i]) {
96
+ activeIndexes[i] = activeIndexes[i] - 1;
97
+ }
98
+
99
+ // the last item is active, so we need to
100
+ // adjust its index
101
+ if (activeIndexes[i] === self.$targets.length) {
102
+ activeIndexes[i] = self.$targets.length - 1;
103
+ }
104
+ }
105
+ }
106
+
107
+ function isActive(value) {
108
+ var activeItems = self.$targets.$active;
109
+ return activeItems.indexOf(value) === -1 ? false : true;
110
+ }
111
+
112
+ function deactivateItem(value) {
113
+ var index = self.$targets.$active.indexOf(value);
114
+ if (index !== -1) {
115
+ self.$targets.$active.splice(index, 1);
116
+ }
117
+ }
118
+
119
+ function activateItem(value) {
120
+ if (!self.$options.allowMultiple) {
121
+ // remove current selected item
122
+ self.$targets.$active.splice(0, 1);
123
+ }
124
+
125
+ if (self.$targets.$active.indexOf(value) === -1) {
126
+ self.$targets.$active.push(value);
127
+ }
128
+ }
129
+
130
+ };
131
+
132
+ this.$get = function() {
133
+ var $collapse = {};
134
+ $collapse.defaults = defaults;
135
+ $collapse.controller = controller;
136
+ return $collapse;
137
+ };
138
+
139
+ })
140
+
141
+ .directive('bsCollapse', ["$window", "$animate", "$collapse", function($window, $animate, $collapse) {
142
+
143
+ var defaults = $collapse.defaults;
144
+
145
+ return {
146
+ require: ['?ngModel', 'bsCollapse'],
147
+ controller: ['$scope', '$element', '$attrs', $collapse.controller],
148
+ link: function postLink(scope, element, attrs, controllers) {
149
+
150
+ var ngModelCtrl = controllers[0];
151
+ var bsCollapseCtrl = controllers[1];
152
+
153
+ if(ngModelCtrl) {
154
+
155
+ // Update the modelValue following
156
+ bsCollapseCtrl.$viewChangeListeners.push(function() {
157
+ ngModelCtrl.$setViewValue(bsCollapseCtrl.$activeIndexes());
158
+ });
159
+
160
+ // modelValue -> $formatters -> viewValue
161
+ ngModelCtrl.$formatters.push(function(modelValue) {
162
+ // console.warn('$formatter("%s"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue);
163
+ if (angular.isArray(modelValue)) {
164
+ // model value is an array, so just replace
165
+ // the active items directly
166
+ bsCollapseCtrl.$setActive(modelValue);
167
+ }
168
+ else {
169
+ var activeIndexes = bsCollapseCtrl.$activeIndexes();
170
+
171
+ if (angular.isArray(activeIndexes)) {
172
+ // we have an array of selected indexes
173
+ if (activeIndexes.indexOf(modelValue * 1) === -1) {
174
+ // item with modelValue index is not active
175
+ bsCollapseCtrl.$setActive(modelValue * 1);
176
+ }
177
+ }
178
+ else if (activeIndexes !== modelValue * 1) {
179
+ bsCollapseCtrl.$setActive(modelValue * 1);
180
+ }
181
+ }
182
+ return modelValue;
183
+ });
184
+
185
+ }
186
+
187
+ }
188
+ };
189
+
190
+ }])
191
+
192
+ .directive('bsCollapseToggle', function() {
193
+
194
+ return {
195
+ require: ['^?ngModel', '^bsCollapse'],
196
+ link: function postLink(scope, element, attrs, controllers) {
197
+
198
+ var ngModelCtrl = controllers[0];
199
+ var bsCollapseCtrl = controllers[1];
200
+
201
+ // Add base attr
202
+ element.attr('data-toggle', 'collapse');
203
+
204
+ // Push pane to parent bsCollapse controller
205
+ bsCollapseCtrl.$registerToggle(element);
206
+
207
+ // remove toggle from collapse controller when toggle is destroyed
208
+ scope.$on('$destroy', function() {
209
+ bsCollapseCtrl.$unregisterToggle(element);
210
+ });
211
+
212
+ element.on('click', function() {
213
+ var index = attrs.bsCollapseToggle || bsCollapseCtrl.$toggles.indexOf(element);
214
+ bsCollapseCtrl.$setActive(index * 1);
215
+ scope.$apply();
216
+ });
217
+
218
+ }
219
+ };
220
+
221
+ })
222
+
223
+ .directive('bsCollapseTarget', ["$animate", function($animate) {
224
+
225
+ return {
226
+ require: ['^?ngModel', '^bsCollapse'],
227
+ // scope: true,
228
+ link: function postLink(scope, element, attrs, controllers) {
229
+
230
+ var ngModelCtrl = controllers[0];
231
+ var bsCollapseCtrl = controllers[1];
232
+
233
+ // Add base class
234
+ element.addClass('collapse');
235
+
236
+ // Add animation class
237
+ if(bsCollapseCtrl.$options.animation) {
238
+ element.addClass(bsCollapseCtrl.$options.animation);
239
+ }
240
+
241
+ // Push pane to parent bsCollapse controller
242
+ bsCollapseCtrl.$registerTarget(element);
243
+
244
+ // remove pane target from collapse controller when target is destroyed
245
+ scope.$on('$destroy', function() {
246
+ bsCollapseCtrl.$unregisterTarget(element);
247
+ });
248
+
249
+ function render() {
250
+ var index = bsCollapseCtrl.$targets.indexOf(element);
251
+ var active = bsCollapseCtrl.$activeIndexes();
252
+ var action = 'removeClass';
253
+ if (angular.isArray(active)) {
254
+ if (active.indexOf(index) !== -1) {
255
+ action = 'addClass';
256
+ }
257
+ }
258
+ else if (index === active) {
259
+ action = 'addClass';
260
+ }
261
+
262
+ $animate[action](element, bsCollapseCtrl.$options.activeClass);
263
+ }
264
+
265
+ bsCollapseCtrl.$viewChangeListeners.push(function() {
266
+ render();
267
+ });
268
+ render();
269
+
270
+ }
271
+ };
272
+
273
+ }]);