rails-angularstrap 2.2.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 (148) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +89 -0
  3. data/Rakefile +2 -0
  4. data/lib/rails/angularstrap.rb +8 -0
  5. data/lib/rails/angularstrap/version.rb +5 -0
  6. data/vendor/assets/javascripts/angular-strap/LICENSE.md +21 -0
  7. data/vendor/assets/javascripts/angular-strap/README.md +112 -0
  8. data/vendor/assets/javascripts/angular-strap/angular-strap.nuspec +23 -0
  9. data/vendor/assets/javascripts/angular-strap/bower.json +53 -0
  10. data/vendor/assets/javascripts/angular-strap/dist/angular-strap.js +5014 -0
  11. data/vendor/assets/javascripts/angular-strap/dist/angular-strap.min.js +11 -0
  12. data/vendor/assets/javascripts/angular-strap/dist/angular-strap.min.js.map +1 -0
  13. data/vendor/assets/javascripts/angular-strap/dist/angular-strap.tpl.js +89 -0
  14. data/vendor/assets/javascripts/angular-strap/dist/angular-strap.tpl.min.js +8 -0
  15. data/vendor/assets/javascripts/angular-strap/dist/modules/affix.js +249 -0
  16. data/vendor/assets/javascripts/angular-strap/dist/modules/affix.min.js +9 -0
  17. data/vendor/assets/javascripts/angular-strap/dist/modules/affix.min.js.map +1 -0
  18. data/vendor/assets/javascripts/angular-strap/dist/modules/alert.js +120 -0
  19. data/vendor/assets/javascripts/angular-strap/dist/modules/alert.min.js +9 -0
  20. data/vendor/assets/javascripts/angular-strap/dist/modules/alert.min.js.map +1 -0
  21. data/vendor/assets/javascripts/angular-strap/dist/modules/alert.tpl.js +14 -0
  22. data/vendor/assets/javascripts/angular-strap/dist/modules/alert.tpl.min.js +8 -0
  23. data/vendor/assets/javascripts/angular-strap/dist/modules/aside.js +96 -0
  24. data/vendor/assets/javascripts/angular-strap/dist/modules/aside.min.js +9 -0
  25. data/vendor/assets/javascripts/angular-strap/dist/modules/aside.min.js.map +1 -0
  26. data/vendor/assets/javascripts/angular-strap/dist/modules/aside.tpl.js +14 -0
  27. data/vendor/assets/javascripts/angular-strap/dist/modules/aside.tpl.min.js +8 -0
  28. data/vendor/assets/javascripts/angular-strap/dist/modules/button.js +177 -0
  29. data/vendor/assets/javascripts/angular-strap/dist/modules/button.min.js +9 -0
  30. data/vendor/assets/javascripts/angular-strap/dist/modules/button.min.js.map +1 -0
  31. data/vendor/assets/javascripts/angular-strap/dist/modules/collapse.js +273 -0
  32. data/vendor/assets/javascripts/angular-strap/dist/modules/collapse.min.js +9 -0
  33. data/vendor/assets/javascripts/angular-strap/dist/modules/collapse.min.js.map +1 -0
  34. data/vendor/assets/javascripts/angular-strap/dist/modules/date-formatter.js +61 -0
  35. data/vendor/assets/javascripts/angular-strap/dist/modules/date-formatter.min.js +9 -0
  36. data/vendor/assets/javascripts/angular-strap/dist/modules/date-formatter.min.js.map +1 -0
  37. data/vendor/assets/javascripts/angular-strap/dist/modules/date-parser.js +273 -0
  38. data/vendor/assets/javascripts/angular-strap/dist/modules/date-parser.min.js +9 -0
  39. data/vendor/assets/javascripts/angular-strap/dist/modules/date-parser.min.js.map +1 -0
  40. data/vendor/assets/javascripts/angular-strap/dist/modules/datepicker.js +640 -0
  41. data/vendor/assets/javascripts/angular-strap/dist/modules/datepicker.min.js +9 -0
  42. data/vendor/assets/javascripts/angular-strap/dist/modules/datepicker.min.js.map +1 -0
  43. data/vendor/assets/javascripts/angular-strap/dist/modules/datepicker.tpl.js +14 -0
  44. data/vendor/assets/javascripts/angular-strap/dist/modules/datepicker.tpl.min.js +8 -0
  45. data/vendor/assets/javascripts/angular-strap/dist/modules/debounce.js +62 -0
  46. data/vendor/assets/javascripts/angular-strap/dist/modules/debounce.min.js +9 -0
  47. data/vendor/assets/javascripts/angular-strap/dist/modules/debounce.min.js.map +1 -0
  48. data/vendor/assets/javascripts/angular-strap/dist/modules/dimensions.js +156 -0
  49. data/vendor/assets/javascripts/angular-strap/dist/modules/dimensions.min.js +9 -0
  50. data/vendor/assets/javascripts/angular-strap/dist/modules/dimensions.min.js.map +1 -0
  51. data/vendor/assets/javascripts/angular-strap/dist/modules/dropdown.js +149 -0
  52. data/vendor/assets/javascripts/angular-strap/dist/modules/dropdown.min.js +9 -0
  53. data/vendor/assets/javascripts/angular-strap/dist/modules/dropdown.min.js.map +1 -0
  54. data/vendor/assets/javascripts/angular-strap/dist/modules/dropdown.tpl.js +14 -0
  55. data/vendor/assets/javascripts/angular-strap/dist/modules/dropdown.tpl.min.js +8 -0
  56. data/vendor/assets/javascripts/angular-strap/dist/modules/modal.js +349 -0
  57. data/vendor/assets/javascripts/angular-strap/dist/modules/modal.min.js +9 -0
  58. data/vendor/assets/javascripts/angular-strap/dist/modules/modal.min.js.map +1 -0
  59. data/vendor/assets/javascripts/angular-strap/dist/modules/modal.tpl.js +14 -0
  60. data/vendor/assets/javascripts/angular-strap/dist/modules/modal.tpl.min.js +8 -0
  61. data/vendor/assets/javascripts/angular-strap/dist/modules/navbar.js +72 -0
  62. data/vendor/assets/javascripts/angular-strap/dist/modules/navbar.min.js +9 -0
  63. data/vendor/assets/javascripts/angular-strap/dist/modules/navbar.min.js.map +1 -0
  64. data/vendor/assets/javascripts/angular-strap/dist/modules/parse-options.js +76 -0
  65. data/vendor/assets/javascripts/angular-strap/dist/modules/parse-options.min.js +9 -0
  66. data/vendor/assets/javascripts/angular-strap/dist/modules/parse-options.min.js.map +1 -0
  67. data/vendor/assets/javascripts/angular-strap/dist/modules/popover.js +112 -0
  68. data/vendor/assets/javascripts/angular-strap/dist/modules/popover.min.js +9 -0
  69. data/vendor/assets/javascripts/angular-strap/dist/modules/popover.min.js.map +1 -0
  70. data/vendor/assets/javascripts/angular-strap/dist/modules/popover.tpl.js +14 -0
  71. data/vendor/assets/javascripts/angular-strap/dist/modules/popover.tpl.min.js +8 -0
  72. data/vendor/assets/javascripts/angular-strap/dist/modules/raf.js +61 -0
  73. data/vendor/assets/javascripts/angular-strap/dist/modules/raf.min.js +9 -0
  74. data/vendor/assets/javascripts/angular-strap/dist/modules/raf.min.js.map +1 -0
  75. data/vendor/assets/javascripts/angular-strap/dist/modules/scrollspy.js +261 -0
  76. data/vendor/assets/javascripts/angular-strap/dist/modules/scrollspy.min.js +9 -0
  77. data/vendor/assets/javascripts/angular-strap/dist/modules/scrollspy.min.js.map +1 -0
  78. data/vendor/assets/javascripts/angular-strap/dist/modules/select.js +325 -0
  79. data/vendor/assets/javascripts/angular-strap/dist/modules/select.min.js +9 -0
  80. data/vendor/assets/javascripts/angular-strap/dist/modules/select.min.js.map +1 -0
  81. data/vendor/assets/javascripts/angular-strap/dist/modules/select.tpl.js +14 -0
  82. data/vendor/assets/javascripts/angular-strap/dist/modules/select.tpl.min.js +8 -0
  83. data/vendor/assets/javascripts/angular-strap/dist/modules/tab.js +186 -0
  84. data/vendor/assets/javascripts/angular-strap/dist/modules/tab.min.js +9 -0
  85. data/vendor/assets/javascripts/angular-strap/dist/modules/tab.min.js.map +1 -0
  86. data/vendor/assets/javascripts/angular-strap/dist/modules/tab.tpl.js +14 -0
  87. data/vendor/assets/javascripts/angular-strap/dist/modules/tab.tpl.min.js +8 -0
  88. data/vendor/assets/javascripts/angular-strap/dist/modules/timepicker.js +485 -0
  89. data/vendor/assets/javascripts/angular-strap/dist/modules/timepicker.min.js +9 -0
  90. data/vendor/assets/javascripts/angular-strap/dist/modules/timepicker.min.js.map +1 -0
  91. data/vendor/assets/javascripts/angular-strap/dist/modules/timepicker.tpl.js +14 -0
  92. data/vendor/assets/javascripts/angular-strap/dist/modules/timepicker.tpl.min.js +8 -0
  93. data/vendor/assets/javascripts/angular-strap/dist/modules/tooltip.js +690 -0
  94. data/vendor/assets/javascripts/angular-strap/dist/modules/tooltip.min.js +9 -0
  95. data/vendor/assets/javascripts/angular-strap/dist/modules/tooltip.min.js.map +1 -0
  96. data/vendor/assets/javascripts/angular-strap/dist/modules/tooltip.tpl.js +14 -0
  97. data/vendor/assets/javascripts/angular-strap/dist/modules/tooltip.tpl.min.js +8 -0
  98. data/vendor/assets/javascripts/angular-strap/dist/modules/typeahead.js +266 -0
  99. data/vendor/assets/javascripts/angular-strap/dist/modules/typeahead.min.js +9 -0
  100. data/vendor/assets/javascripts/angular-strap/dist/modules/typeahead.min.js.map +1 -0
  101. data/vendor/assets/javascripts/angular-strap/dist/modules/typeahead.tpl.js +14 -0
  102. data/vendor/assets/javascripts/angular-strap/dist/modules/typeahead.tpl.min.js +8 -0
  103. data/vendor/assets/javascripts/angular-strap/gulpfile.js +489 -0
  104. data/vendor/assets/javascripts/angular-strap/package.json +73 -0
  105. data/vendor/assets/javascripts/angular-strap/src/affix/affix.js +258 -0
  106. data/vendor/assets/javascripts/angular-strap/src/alert/alert.js +113 -0
  107. data/vendor/assets/javascripts/angular-strap/src/alert/alert.tpl.html +4 -0
  108. data/vendor/assets/javascripts/angular-strap/src/aside/aside.js +89 -0
  109. data/vendor/assets/javascripts/angular-strap/src/aside/aside.tpl.html +14 -0
  110. data/vendor/assets/javascripts/angular-strap/src/button/button.js +174 -0
  111. data/vendor/assets/javascripts/angular-strap/src/collapse/collapse.js +266 -0
  112. data/vendor/assets/javascripts/angular-strap/src/datepicker/datepicker.js +633 -0
  113. data/vendor/assets/javascripts/angular-strap/src/datepicker/datepicker.tpl.html +33 -0
  114. data/vendor/assets/javascripts/angular-strap/src/dropdown/dropdown.js +143 -0
  115. data/vendor/assets/javascripts/angular-strap/src/dropdown/dropdown.tpl.html +6 -0
  116. data/vendor/assets/javascripts/angular-strap/src/helpers/date-formatter.js +54 -0
  117. data/vendor/assets/javascripts/angular-strap/src/helpers/date-parser.js +266 -0
  118. data/vendor/assets/javascripts/angular-strap/src/helpers/debounce.js +55 -0
  119. data/vendor/assets/javascripts/angular-strap/src/helpers/dimensions.js +212 -0
  120. data/vendor/assets/javascripts/angular-strap/src/helpers/parse-options.js +69 -0
  121. data/vendor/assets/javascripts/angular-strap/src/helpers/raf.js +54 -0
  122. data/vendor/assets/javascripts/angular-strap/src/modal/modal.js +348 -0
  123. data/vendor/assets/javascripts/angular-strap/src/modal/modal.tpl.html +14 -0
  124. data/vendor/assets/javascripts/angular-strap/src/module.js +19 -0
  125. data/vendor/assets/javascripts/angular-strap/src/navbar/navbar.js +65 -0
  126. data/vendor/assets/javascripts/angular-strap/src/popover/popover.js +111 -0
  127. data/vendor/assets/javascripts/angular-strap/src/popover/popover.tpl.html +5 -0
  128. data/vendor/assets/javascripts/angular-strap/src/scrollspy/scrollspy.js +254 -0
  129. data/vendor/assets/javascripts/angular-strap/src/select/select.js +321 -0
  130. data/vendor/assets/javascripts/angular-strap/src/select/select.tpl.html +14 -0
  131. data/vendor/assets/javascripts/angular-strap/src/tab/tab.js +183 -0
  132. data/vendor/assets/javascripts/angular-strap/src/tab/tab.tpl.html +7 -0
  133. data/vendor/assets/javascripts/angular-strap/src/timepicker/timepicker.js +493 -0
  134. data/vendor/assets/javascripts/angular-strap/src/timepicker/timepicker.tpl.html +62 -0
  135. data/vendor/assets/javascripts/angular-strap/src/tooltip/tooltip.js +806 -0
  136. data/vendor/assets/javascripts/angular-strap/src/tooltip/tooltip.tpl.html +4 -0
  137. data/vendor/assets/javascripts/angular-strap/src/typeahead/typeahead.js +262 -0
  138. data/vendor/assets/javascripts/angular-strap/src/typeahead/typeahead.tpl.html +5 -0
  139. data/vendor/assets/javascripts/angular/README.md +64 -0
  140. data/vendor/assets/javascripts/angular/angular-csp.css +13 -0
  141. data/vendor/assets/javascripts/angular/angular.js +26181 -0
  142. data/vendor/assets/javascripts/angular/angular.min.js +250 -0
  143. data/vendor/assets/javascripts/angular/angular.min.js.gzip +0 -0
  144. data/vendor/assets/javascripts/angular/angular.min.js.map +8 -0
  145. data/vendor/assets/javascripts/angular/bower.json +8 -0
  146. data/vendor/assets/javascripts/angular/index.js +2 -0
  147. data/vendor/assets/javascripts/angular/package.json +25 -0
  148. metadata +237 -0
@@ -0,0 +1,89 @@
1
+ 'use strict';
2
+
3
+ angular.module('mgcrea.ngStrap.aside', ['mgcrea.ngStrap.modal'])
4
+
5
+ .provider('$aside', function() {
6
+
7
+ var defaults = this.defaults = {
8
+ animation: 'am-fade-and-slide-right',
9
+ prefixClass: 'aside',
10
+ prefixEvent: 'aside',
11
+ placement: 'right',
12
+ template: 'aside/aside.tpl.html',
13
+ contentTemplate: false,
14
+ container: false,
15
+ element: null,
16
+ backdrop: true,
17
+ keyboard: true,
18
+ html: false,
19
+ show: true
20
+ };
21
+
22
+ this.$get = function($modal) {
23
+
24
+ function AsideFactory(config) {
25
+
26
+ var $aside = {};
27
+
28
+ // Common vars
29
+ var options = angular.extend({}, defaults, config);
30
+
31
+ $aside = $modal(options);
32
+
33
+ return $aside;
34
+
35
+ }
36
+
37
+ return AsideFactory;
38
+
39
+ };
40
+
41
+ })
42
+
43
+ .directive('bsAside', function($window, $sce, $aside) {
44
+
45
+ var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;
46
+
47
+ return {
48
+ restrict: 'EAC',
49
+ scope: true,
50
+ link: function postLink(scope, element, attr, transclusion) {
51
+ // Directive options
52
+ var options = {scope: scope, element: element, show: false};
53
+ angular.forEach(['template', 'contentTemplate', 'placement', 'backdrop', 'keyboard', 'html', 'container', 'animation'], function(key) {
54
+ if(angular.isDefined(attr[key])) options[key] = attr[key];
55
+ });
56
+
57
+ // Support scope as data-attrs
58
+ angular.forEach(['title', 'content'], function(key) {
59
+ attr[key] && attr.$observe(key, function(newValue, oldValue) {
60
+ scope[key] = $sce.trustAsHtml(newValue);
61
+ });
62
+ });
63
+
64
+ // Support scope as an object
65
+ attr.bsAside && scope.$watch(attr.bsAside, function(newValue, oldValue) {
66
+ if(angular.isObject(newValue)) {
67
+ angular.extend(scope, newValue);
68
+ } else {
69
+ scope.content = newValue;
70
+ }
71
+ }, true);
72
+
73
+ // Initialize aside
74
+ var aside = $aside(options);
75
+
76
+ // Trigger
77
+ element.on(attr.trigger || 'click', aside.toggle);
78
+
79
+ // Garbage collection
80
+ scope.$on('$destroy', function() {
81
+ if (aside) aside.destroy();
82
+ options = null;
83
+ aside = null;
84
+ });
85
+
86
+ }
87
+ };
88
+
89
+ });
@@ -0,0 +1,14 @@
1
+ <div class="aside" tabindex="-1" role="dialog">
2
+ <div class="aside-dialog">
3
+ <div class="aside-content">
4
+ <div class="aside-header" ng-show="title">
5
+ <button type="button" class="close" ng-click="$hide()">&times;</button>
6
+ <h4 class="aside-title" ng-bind="title"></h4>
7
+ </div>
8
+ <div class="aside-body" ng-bind="content"></div>
9
+ <div class="aside-footer">
10
+ <button type="button" class="btn btn-default" ng-click="$hide()">Close</button>
11
+ </div>
12
+ </div>
13
+ </div>
14
+ </div>
@@ -0,0 +1,174 @@
1
+ 'use strict';
2
+
3
+ angular.module('mgcrea.ngStrap.button', [])
4
+
5
+ .provider('$button', function() {
6
+
7
+ var defaults = this.defaults = {
8
+ activeClass:'active',
9
+ toggleEvent:'click'
10
+ };
11
+
12
+ this.$get = function() {
13
+ return {defaults: defaults};
14
+ };
15
+
16
+ })
17
+
18
+ .directive('bsCheckboxGroup', function() {
19
+
20
+ return {
21
+ restrict: 'A',
22
+ require: 'ngModel',
23
+ compile: function postLink(element, attr) {
24
+ element.attr('data-toggle', 'buttons');
25
+ element.removeAttr('ng-model');
26
+ var children = element[0].querySelectorAll('input[type="checkbox"]');
27
+ angular.forEach(children, function(child) {
28
+ var childEl = angular.element(child);
29
+ childEl.attr('bs-checkbox', '');
30
+ childEl.attr('ng-model', attr.ngModel + '.' + childEl.attr('value'));
31
+ });
32
+ }
33
+
34
+ };
35
+
36
+ })
37
+
38
+ .directive('bsCheckbox', function($button, $$rAF) {
39
+
40
+ var defaults = $button.defaults;
41
+ var constantValueRegExp = /^(true|false|\d+)$/;
42
+
43
+ return {
44
+ restrict: 'A',
45
+ require: 'ngModel',
46
+ link: function postLink(scope, element, attr, controller) {
47
+
48
+ var options = defaults;
49
+
50
+ // Support label > input[type="checkbox"]
51
+ var isInput = element[0].nodeName === 'INPUT';
52
+ var activeElement = isInput ? element.parent() : element;
53
+
54
+ var trueValue = angular.isDefined(attr.trueValue) ? attr.trueValue : true;
55
+ if(constantValueRegExp.test(attr.trueValue)) {
56
+ trueValue = scope.$eval(attr.trueValue);
57
+ }
58
+ var falseValue = angular.isDefined(attr.falseValue) ? attr.falseValue : false;
59
+ if(constantValueRegExp.test(attr.falseValue)) {
60
+ falseValue = scope.$eval(attr.falseValue);
61
+ }
62
+
63
+ // Parse exotic values
64
+ var hasExoticValues = typeof trueValue !== 'boolean' || typeof falseValue !== 'boolean';
65
+ if(hasExoticValues) {
66
+ controller.$parsers.push(function(viewValue) {
67
+ // console.warn('$parser', element.attr('ng-model'), 'viewValue', viewValue);
68
+ return viewValue ? trueValue : falseValue;
69
+ });
70
+ // modelValue -> $formatters -> viewValue
71
+ controller.$formatters.push(function(modelValue) {
72
+ // console.warn('$formatter("%s"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue);
73
+ return angular.equals(modelValue, trueValue);
74
+ });
75
+ // Fix rendering for exotic values
76
+ scope.$watch(attr.ngModel, function(newValue, oldValue) {
77
+ controller.$render();
78
+ });
79
+ }
80
+
81
+ // model -> view
82
+ controller.$render = function () {
83
+ // console.warn('$render', element.attr('ng-model'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);
84
+ var isActive = angular.equals(controller.$modelValue, trueValue);
85
+ $$rAF(function() {
86
+ if(isInput) element[0].checked = isActive;
87
+ activeElement.toggleClass(options.activeClass, isActive);
88
+ });
89
+ };
90
+
91
+ // view -> model
92
+ element.bind(options.toggleEvent, function() {
93
+ scope.$apply(function () {
94
+ // console.warn('!click', element.attr('ng-model'), 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue, 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue);
95
+ if(!isInput) {
96
+ controller.$setViewValue(!activeElement.hasClass('active'));
97
+ }
98
+ if(!hasExoticValues) {
99
+ controller.$render();
100
+ }
101
+ });
102
+ });
103
+
104
+ }
105
+
106
+ };
107
+
108
+ })
109
+
110
+ .directive('bsRadioGroup', function() {
111
+
112
+ return {
113
+ restrict: 'A',
114
+ require: 'ngModel',
115
+ compile: function postLink(element, attr) {
116
+ element.attr('data-toggle', 'buttons');
117
+ element.removeAttr('ng-model');
118
+ var children = element[0].querySelectorAll('input[type="radio"]');
119
+ angular.forEach(children, function(child) {
120
+ angular.element(child).attr('bs-radio', '');
121
+ angular.element(child).attr('ng-model', attr.ngModel);
122
+ });
123
+ }
124
+
125
+ };
126
+
127
+ })
128
+
129
+ .directive('bsRadio', function($button, $$rAF) {
130
+
131
+ var defaults = $button.defaults;
132
+ var constantValueRegExp = /^(true|false|\d+)$/;
133
+
134
+ return {
135
+ restrict: 'A',
136
+ require: 'ngModel',
137
+ link: function postLink(scope, element, attr, controller) {
138
+
139
+ var options = defaults;
140
+
141
+ // Support `label > input[type="radio"]` markup
142
+ var isInput = element[0].nodeName === 'INPUT';
143
+ var activeElement = isInput ? element.parent() : element;
144
+
145
+ var value;
146
+ attr.$observe('value', function(v) {
147
+ value = constantValueRegExp.test(v) ? scope.$eval(v) : v;
148
+ controller.$render();
149
+ });
150
+
151
+ // model -> view
152
+ controller.$render = function () {
153
+ // console.warn('$render', element.attr('value'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);
154
+ var isActive = angular.equals(controller.$modelValue, value);
155
+ $$rAF(function() {
156
+ if(isInput) element[0].checked = isActive;
157
+ activeElement.toggleClass(options.activeClass, isActive);
158
+ });
159
+ };
160
+
161
+ // view -> model
162
+ element.bind(options.toggleEvent, function() {
163
+ scope.$apply(function () {
164
+ // console.warn('!click', element.attr('value'), 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue, 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue);
165
+ controller.$setViewValue(value);
166
+ controller.$render();
167
+ });
168
+ });
169
+
170
+ }
171
+
172
+ };
173
+
174
+ });
@@ -0,0 +1,266 @@
1
+ 'use strict';
2
+
3
+ angular.module('mgcrea.ngStrap.collapse', [])
4
+
5
+ .provider('$collapse', function() {
6
+
7
+ var defaults = this.defaults = {
8
+ animation: 'am-collapse',
9
+ disallowToggle: false,
10
+ activeClass: 'in',
11
+ startCollapsed: false,
12
+ allowMultiple: false
13
+ };
14
+
15
+ var controller = this.controller = function($scope, $element, $attrs) {
16
+ var self = this;
17
+
18
+ // Attributes options
19
+ self.$options = angular.copy(defaults);
20
+ angular.forEach(['animation', 'disallowToggle', 'activeClass', 'startCollapsed', 'allowMultiple'], function (key) {
21
+ if(angular.isDefined($attrs[key])) self.$options[key] = $attrs[key];
22
+ });
23
+
24
+ self.$toggles = [];
25
+ self.$targets = [];
26
+
27
+ self.$viewChangeListeners = [];
28
+
29
+ self.$registerToggle = function(element) {
30
+ self.$toggles.push(element);
31
+ };
32
+ self.$registerTarget = function(element) {
33
+ self.$targets.push(element);
34
+ };
35
+
36
+ self.$unregisterToggle = function(element) {
37
+ var index = self.$toggles.indexOf(element);
38
+ // remove toggle from $toggles array
39
+ self.$toggles.splice(index, 1);
40
+ };
41
+ self.$unregisterTarget = function(element) {
42
+ var index = self.$targets.indexOf(element);
43
+
44
+ // remove element from $targets array
45
+ self.$targets.splice(index, 1);
46
+
47
+ if (self.$options.allowMultiple) {
48
+ // remove target index from $active array values
49
+ deactivateItem(element);
50
+ }
51
+
52
+ // fix active item indexes
53
+ fixActiveItemIndexes(index);
54
+
55
+ self.$viewChangeListeners.forEach(function(fn) {
56
+ fn();
57
+ });
58
+ };
59
+
60
+ // use array to store all the currently open panels
61
+ self.$targets.$active = !self.$options.startCollapsed ? [0] : [];
62
+ self.$setActive = $scope.$setActive = function(value) {
63
+ if(angular.isArray(value)) {
64
+ self.$targets.$active = angular.copy(value);
65
+ }
66
+ else if(!self.$options.disallowToggle) {
67
+ // toogle element active status
68
+ isActive(value) ? deactivateItem(value) : activateItem(value);
69
+ } else {
70
+ activateItem(value);
71
+ }
72
+
73
+ self.$viewChangeListeners.forEach(function(fn) {
74
+ fn();
75
+ });
76
+ };
77
+
78
+ self.$activeIndexes = function() {
79
+ return self.$options.allowMultiple ? self.$targets.$active :
80
+ self.$targets.$active.length === 1 ? self.$targets.$active[0] : -1;
81
+ };
82
+
83
+ function fixActiveItemIndexes(index) {
84
+ // item with index was removed, so we
85
+ // need to adjust other items index values
86
+ var activeIndexes = self.$targets.$active;
87
+ for(var i = 0; i < activeIndexes.length; i++) {
88
+ if (index < activeIndexes[i]) {
89
+ activeIndexes[i] = activeIndexes[i] - 1;
90
+ }
91
+
92
+ // the last item is active, so we need to
93
+ // adjust its index
94
+ if (activeIndexes[i] === self.$targets.length) {
95
+ activeIndexes[i] = self.$targets.length - 1;
96
+ }
97
+ }
98
+ }
99
+
100
+ function isActive(value) {
101
+ var activeItems = self.$targets.$active;
102
+ return activeItems.indexOf(value) === -1 ? false : true;
103
+ }
104
+
105
+ function deactivateItem(value) {
106
+ var index = self.$targets.$active.indexOf(value);
107
+ if (index !== -1) {
108
+ self.$targets.$active.splice(index, 1);
109
+ }
110
+ }
111
+
112
+ function activateItem(value) {
113
+ if (!self.$options.allowMultiple) {
114
+ // remove current selected item
115
+ self.$targets.$active.splice(0, 1);
116
+ }
117
+
118
+ if (self.$targets.$active.indexOf(value) === -1) {
119
+ self.$targets.$active.push(value);
120
+ }
121
+ }
122
+
123
+ };
124
+
125
+ this.$get = function() {
126
+ var $collapse = {};
127
+ $collapse.defaults = defaults;
128
+ $collapse.controller = controller;
129
+ return $collapse;
130
+ };
131
+
132
+ })
133
+
134
+ .directive('bsCollapse', function($window, $animate, $collapse) {
135
+
136
+ var defaults = $collapse.defaults;
137
+
138
+ return {
139
+ require: ['?ngModel', 'bsCollapse'],
140
+ controller: ['$scope', '$element', '$attrs', $collapse.controller],
141
+ link: function postLink(scope, element, attrs, controllers) {
142
+
143
+ var ngModelCtrl = controllers[0];
144
+ var bsCollapseCtrl = controllers[1];
145
+
146
+ if(ngModelCtrl) {
147
+
148
+ // Update the modelValue following
149
+ bsCollapseCtrl.$viewChangeListeners.push(function() {
150
+ ngModelCtrl.$setViewValue(bsCollapseCtrl.$activeIndexes());
151
+ });
152
+
153
+ // modelValue -> $formatters -> viewValue
154
+ ngModelCtrl.$formatters.push(function(modelValue) {
155
+ // console.warn('$formatter("%s"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue);
156
+ if (angular.isArray(modelValue)) {
157
+ // model value is an array, so just replace
158
+ // the active items directly
159
+ bsCollapseCtrl.$setActive(modelValue);
160
+ }
161
+ else {
162
+ var activeIndexes = bsCollapseCtrl.$activeIndexes();
163
+
164
+ if (angular.isArray(activeIndexes)) {
165
+ // we have an array of selected indexes
166
+ if (activeIndexes.indexOf(modelValue * 1) === -1) {
167
+ // item with modelValue index is not active
168
+ bsCollapseCtrl.$setActive(modelValue * 1);
169
+ }
170
+ }
171
+ else if (activeIndexes !== modelValue * 1) {
172
+ bsCollapseCtrl.$setActive(modelValue * 1);
173
+ }
174
+ }
175
+ return modelValue;
176
+ });
177
+
178
+ }
179
+
180
+ }
181
+ };
182
+
183
+ })
184
+
185
+ .directive('bsCollapseToggle', function() {
186
+
187
+ return {
188
+ require: ['^?ngModel', '^bsCollapse'],
189
+ link: function postLink(scope, element, attrs, controllers) {
190
+
191
+ var ngModelCtrl = controllers[0];
192
+ var bsCollapseCtrl = controllers[1];
193
+
194
+ // Add base attr
195
+ element.attr('data-toggle', 'collapse');
196
+
197
+ // Push pane to parent bsCollapse controller
198
+ bsCollapseCtrl.$registerToggle(element);
199
+
200
+ // remove toggle from collapse controller when toggle is destroyed
201
+ scope.$on('$destroy', function() {
202
+ bsCollapseCtrl.$unregisterToggle(element);
203
+ });
204
+
205
+ element.on('click', function() {
206
+ var index = attrs.bsCollapseToggle || bsCollapseCtrl.$toggles.indexOf(element);
207
+ bsCollapseCtrl.$setActive(index * 1);
208
+ scope.$apply();
209
+ });
210
+
211
+ }
212
+ };
213
+
214
+ })
215
+
216
+ .directive('bsCollapseTarget', function($animate) {
217
+
218
+ return {
219
+ require: ['^?ngModel', '^bsCollapse'],
220
+ // scope: true,
221
+ link: function postLink(scope, element, attrs, controllers) {
222
+
223
+ var ngModelCtrl = controllers[0];
224
+ var bsCollapseCtrl = controllers[1];
225
+
226
+ // Add base class
227
+ element.addClass('collapse');
228
+
229
+ // Add animation class
230
+ if(bsCollapseCtrl.$options.animation) {
231
+ element.addClass(bsCollapseCtrl.$options.animation);
232
+ }
233
+
234
+ // Push pane to parent bsCollapse controller
235
+ bsCollapseCtrl.$registerTarget(element);
236
+
237
+ // remove pane target from collapse controller when target is destroyed
238
+ scope.$on('$destroy', function() {
239
+ bsCollapseCtrl.$unregisterTarget(element);
240
+ });
241
+
242
+ function render() {
243
+ var index = bsCollapseCtrl.$targets.indexOf(element);
244
+ var active = bsCollapseCtrl.$activeIndexes();
245
+ var action = 'removeClass';
246
+ if (angular.isArray(active)) {
247
+ if (active.indexOf(index) !== -1) {
248
+ action = 'addClass';
249
+ }
250
+ }
251
+ else if (index === active) {
252
+ action = 'addClass';
253
+ }
254
+
255
+ $animate[action](element, bsCollapseCtrl.$options.activeClass);
256
+ }
257
+
258
+ bsCollapseCtrl.$viewChangeListeners.push(function() {
259
+ render();
260
+ });
261
+ render();
262
+
263
+ }
264
+ };
265
+
266
+ });