|
1 | 1 | angular.module('ui.bootstrap.collapse', [])
|
2 | 2 |
|
3 |
| - .directive('collapse', ['$animate', '$injector', function($animate, $injector) { |
| 3 | + .directive('uibCollapse', ['$animate', '$injector', function($animate, $injector) { |
4 | 4 | var $animateCss = $injector.has('$animateCss') ? $injector.get('$animateCss') : null;
|
5 | 5 | return {
|
6 | 6 | link: function(scope, element, attrs) {
|
@@ -64,6 +64,91 @@ angular.module('ui.bootstrap.collapse', [])
|
64 | 64 | .addClass('collapse');
|
65 | 65 | }
|
66 | 66 |
|
| 67 | + scope.$watch(attrs.uibCollapse, function(shouldCollapse) { |
| 68 | + if (shouldCollapse) { |
| 69 | + collapse(); |
| 70 | + } else { |
| 71 | + expand(); |
| 72 | + } |
| 73 | + }); |
| 74 | + } |
| 75 | + }; |
| 76 | + }]); |
| 77 | + |
| 78 | +/* Deprecated collapse below */ |
| 79 | + |
| 80 | +angular.module('ui.bootstrap.collapse') |
| 81 | + |
| 82 | + .value('$collapseSuppressWarning', false) |
| 83 | + |
| 84 | + .directive('collapse', ['$animate', '$injector', '$log', '$collapseSuppressWarning', function($animate, $injector, $log, $collapseSuppressWarning) { |
| 85 | + var $animateCss = $injector.has('$animateCss') ? $injector.get('$animateCss') : null; |
| 86 | + return { |
| 87 | + link: function(scope, element, attrs) { |
| 88 | + if (!$collapseSuppressWarning) { |
| 89 | + $log.warn('collapse is now deprecated. Use uib-collapse instead.'); |
| 90 | + } |
| 91 | + |
| 92 | + function expand() { |
| 93 | + element.removeClass('collapse') |
| 94 | + .addClass('collapsing') |
| 95 | + .attr('aria-expanded', true) |
| 96 | + .attr('aria-hidden', false); |
| 97 | + |
| 98 | + if ($animateCss) { |
| 99 | + $animateCss(element, { |
| 100 | + addClass: 'in', |
| 101 | + easing: 'ease', |
| 102 | + to: { height: element[0].scrollHeight + 'px' } |
| 103 | + }).start().done(expandDone); |
| 104 | + } else { |
| 105 | + $animate.addClass(element, 'in', { |
| 106 | + to: { height: element[0].scrollHeight + 'px' } |
| 107 | + }).then(expandDone); |
| 108 | + } |
| 109 | + } |
| 110 | + |
| 111 | + function expandDone() { |
| 112 | + element.removeClass('collapsing') |
| 113 | + .addClass('collapse') |
| 114 | + .css({height: 'auto'}); |
| 115 | + } |
| 116 | + |
| 117 | + function collapse() { |
| 118 | + if (!element.hasClass('collapse') && !element.hasClass('in')) { |
| 119 | + return collapseDone(); |
| 120 | + } |
| 121 | + |
| 122 | + element |
| 123 | + // IMPORTANT: The height must be set before adding "collapsing" class. |
| 124 | + // Otherwise, the browser attempts to animate from height 0 (in |
| 125 | + // collapsing class) to the given height here. |
| 126 | + .css({height: element[0].scrollHeight + 'px'}) |
| 127 | + // initially all panel collapse have the collapse class, this removal |
| 128 | + // prevents the animation from jumping to collapsed state |
| 129 | + .removeClass('collapse') |
| 130 | + .addClass('collapsing') |
| 131 | + .attr('aria-expanded', false) |
| 132 | + .attr('aria-hidden', true); |
| 133 | + |
| 134 | + if ($animateCss) { |
| 135 | + $animateCss(element, { |
| 136 | + removeClass: 'in', |
| 137 | + to: {height: '0'} |
| 138 | + }).start().done(collapseDone); |
| 139 | + } else { |
| 140 | + $animate.removeClass(element, 'in', { |
| 141 | + to: {height: '0'} |
| 142 | + }).then(collapseDone); |
| 143 | + } |
| 144 | + } |
| 145 | + |
| 146 | + function collapseDone() { |
| 147 | + element.css({height: '0'}); // Required so that collapse works when animation is disabled |
| 148 | + element.removeClass('collapsing') |
| 149 | + .addClass('collapse'); |
| 150 | + } |
| 151 | + |
67 | 152 | scope.$watch(attrs.collapse, function(shouldCollapse) {
|
68 | 153 | if (shouldCollapse) {
|
69 | 154 | collapse();
|
|
0 commit comments