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.
- checksums.yaml +7 -0
- data/README.md +89 -0
- data/Rakefile +2 -0
- data/lib/rails/angularstrap.rb +8 -0
- data/lib/rails/angularstrap/version.rb +5 -0
- data/vendor/assets/javascripts/angular-strap/LICENSE.md +21 -0
- data/vendor/assets/javascripts/angular-strap/README.md +112 -0
- data/vendor/assets/javascripts/angular-strap/angular-strap.nuspec +23 -0
- data/vendor/assets/javascripts/angular-strap/bower.json +53 -0
- data/vendor/assets/javascripts/angular-strap/dist/angular-strap.js +5014 -0
- data/vendor/assets/javascripts/angular-strap/dist/angular-strap.min.js +11 -0
- data/vendor/assets/javascripts/angular-strap/dist/angular-strap.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/angular-strap.tpl.js +89 -0
- data/vendor/assets/javascripts/angular-strap/dist/angular-strap.tpl.min.js +8 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/affix.js +249 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/affix.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/affix.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/alert.js +120 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/alert.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/alert.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/alert.tpl.js +14 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/alert.tpl.min.js +8 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/aside.js +96 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/aside.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/aside.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/aside.tpl.js +14 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/aside.tpl.min.js +8 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/button.js +177 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/button.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/button.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/collapse.js +273 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/collapse.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/collapse.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/date-formatter.js +61 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/date-formatter.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/date-formatter.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/date-parser.js +273 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/date-parser.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/date-parser.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/datepicker.js +640 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/datepicker.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/datepicker.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/datepicker.tpl.js +14 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/datepicker.tpl.min.js +8 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/debounce.js +62 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/debounce.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/debounce.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/dimensions.js +156 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/dimensions.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/dimensions.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/dropdown.js +149 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/dropdown.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/dropdown.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/dropdown.tpl.js +14 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/dropdown.tpl.min.js +8 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/modal.js +349 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/modal.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/modal.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/modal.tpl.js +14 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/modal.tpl.min.js +8 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/navbar.js +72 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/navbar.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/navbar.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/parse-options.js +76 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/parse-options.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/parse-options.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/popover.js +112 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/popover.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/popover.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/popover.tpl.js +14 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/popover.tpl.min.js +8 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/raf.js +61 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/raf.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/raf.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/scrollspy.js +261 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/scrollspy.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/scrollspy.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/select.js +325 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/select.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/select.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/select.tpl.js +14 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/select.tpl.min.js +8 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/tab.js +186 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/tab.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/tab.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/tab.tpl.js +14 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/tab.tpl.min.js +8 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/timepicker.js +485 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/timepicker.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/timepicker.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/timepicker.tpl.js +14 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/timepicker.tpl.min.js +8 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/tooltip.js +690 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/tooltip.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/tooltip.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/tooltip.tpl.js +14 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/tooltip.tpl.min.js +8 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/typeahead.js +266 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/typeahead.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/typeahead.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/typeahead.tpl.js +14 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/typeahead.tpl.min.js +8 -0
- data/vendor/assets/javascripts/angular-strap/gulpfile.js +489 -0
- data/vendor/assets/javascripts/angular-strap/package.json +73 -0
- data/vendor/assets/javascripts/angular-strap/src/affix/affix.js +258 -0
- data/vendor/assets/javascripts/angular-strap/src/alert/alert.js +113 -0
- data/vendor/assets/javascripts/angular-strap/src/alert/alert.tpl.html +4 -0
- data/vendor/assets/javascripts/angular-strap/src/aside/aside.js +89 -0
- data/vendor/assets/javascripts/angular-strap/src/aside/aside.tpl.html +14 -0
- data/vendor/assets/javascripts/angular-strap/src/button/button.js +174 -0
- data/vendor/assets/javascripts/angular-strap/src/collapse/collapse.js +266 -0
- data/vendor/assets/javascripts/angular-strap/src/datepicker/datepicker.js +633 -0
- data/vendor/assets/javascripts/angular-strap/src/datepicker/datepicker.tpl.html +33 -0
- data/vendor/assets/javascripts/angular-strap/src/dropdown/dropdown.js +143 -0
- data/vendor/assets/javascripts/angular-strap/src/dropdown/dropdown.tpl.html +6 -0
- data/vendor/assets/javascripts/angular-strap/src/helpers/date-formatter.js +54 -0
- data/vendor/assets/javascripts/angular-strap/src/helpers/date-parser.js +266 -0
- data/vendor/assets/javascripts/angular-strap/src/helpers/debounce.js +55 -0
- data/vendor/assets/javascripts/angular-strap/src/helpers/dimensions.js +212 -0
- data/vendor/assets/javascripts/angular-strap/src/helpers/parse-options.js +69 -0
- data/vendor/assets/javascripts/angular-strap/src/helpers/raf.js +54 -0
- data/vendor/assets/javascripts/angular-strap/src/modal/modal.js +348 -0
- data/vendor/assets/javascripts/angular-strap/src/modal/modal.tpl.html +14 -0
- data/vendor/assets/javascripts/angular-strap/src/module.js +19 -0
- data/vendor/assets/javascripts/angular-strap/src/navbar/navbar.js +65 -0
- data/vendor/assets/javascripts/angular-strap/src/popover/popover.js +111 -0
- data/vendor/assets/javascripts/angular-strap/src/popover/popover.tpl.html +5 -0
- data/vendor/assets/javascripts/angular-strap/src/scrollspy/scrollspy.js +254 -0
- data/vendor/assets/javascripts/angular-strap/src/select/select.js +321 -0
- data/vendor/assets/javascripts/angular-strap/src/select/select.tpl.html +14 -0
- data/vendor/assets/javascripts/angular-strap/src/tab/tab.js +183 -0
- data/vendor/assets/javascripts/angular-strap/src/tab/tab.tpl.html +7 -0
- data/vendor/assets/javascripts/angular-strap/src/timepicker/timepicker.js +493 -0
- data/vendor/assets/javascripts/angular-strap/src/timepicker/timepicker.tpl.html +62 -0
- data/vendor/assets/javascripts/angular-strap/src/tooltip/tooltip.js +806 -0
- data/vendor/assets/javascripts/angular-strap/src/tooltip/tooltip.tpl.html +4 -0
- data/vendor/assets/javascripts/angular-strap/src/typeahead/typeahead.js +262 -0
- data/vendor/assets/javascripts/angular-strap/src/typeahead/typeahead.tpl.html +5 -0
- data/vendor/assets/javascripts/angular/README.md +64 -0
- data/vendor/assets/javascripts/angular/angular-csp.css +13 -0
- data/vendor/assets/javascripts/angular/angular.js +26181 -0
- data/vendor/assets/javascripts/angular/angular.min.js +250 -0
- data/vendor/assets/javascripts/angular/angular.min.js.gzip +0 -0
- data/vendor/assets/javascripts/angular/angular.min.js.map +8 -0
- data/vendor/assets/javascripts/angular/bower.json +8 -0
- data/vendor/assets/javascripts/angular/index.js +2 -0
- data/vendor/assets/javascripts/angular/package.json +25 -0
- 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()">×</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
|
+
});
|