|
34 | 34 | afterSlide: '&?',
|
35 | 35 | beforeSlide: '&?',
|
36 | 36 | minWidth: '=?',
|
37 |
| - expand: '=?' |
| 37 | + expand: '=?', |
| 38 | + alwaysFill: '=?' |
38 | 39 | },
|
39 | 40 | templateUrl: 'app/components/kaarousel/templates/angular-kaarousel.html',
|
40 | 41 | transclude: true,
|
|
49 | 50 | function KaarouselController($scope, $element, $attrs, $interval, $window, $timeout, $swipe) {
|
50 | 51 |
|
51 | 52 | // @todo some settings don't work ( mainly when center active )
|
52 |
| - |
53 | 53 | var vm = this;
|
| 54 | + |
| 55 | + var PREFIX = 'kaarousel'; |
| 56 | + |
54 | 57 | var booleanAttributes = [
|
55 | 58 | 'autoplay',
|
56 | 59 | 'pauseOnHover',
|
|
62 | 65 | 'pagerOnHover',
|
63 | 66 | 'swipable',
|
64 | 67 | 'loop',
|
65 |
| - 'expand' |
| 68 | + 'expand', |
| 69 | + 'alwaysFill' |
66 | 70 | ];
|
67 | 71 |
|
68 |
| - var animations = ['slide', 'fade']; |
| 72 | + var animations = [ |
| 73 | + 'slide', |
| 74 | + 'fade' |
| 75 | + ]; |
| 76 | + |
| 77 | + var kOptions = [ |
| 78 | + 'displayed', |
| 79 | + 'perSlide', |
| 80 | + 'autoplay', |
| 81 | + 'direction', |
| 82 | + 'pauseOnHover', |
| 83 | + 'centerActive', |
| 84 | + 'timeInterval', |
| 85 | + 'transitionDuration', |
| 86 | + 'updateRate', |
| 87 | + 'stopAfterAction', |
| 88 | + 'hideNav', |
| 89 | + 'hidePager', |
| 90 | + 'navOnHover', |
| 91 | + 'pagerOnHover', |
| 92 | + 'swipable', |
| 93 | + 'sync', |
| 94 | + 'animation', |
| 95 | + 'loop', |
| 96 | + 'options', |
| 97 | + 'afterSlide', |
| 98 | + 'beforeSlide', |
| 99 | + 'minWidth', |
| 100 | + 'expand', |
| 101 | + 'alwaysFill' |
| 102 | + ]; |
69 | 103 |
|
70 | 104 | vm.init = init;
|
71 | 105 | vm.register = register;
|
|
98 | 132 | beforeSlide: null,
|
99 | 133 | minWidth: null,
|
100 | 134 | expand: true,
|
101 |
| - swipeThreshold: 100 |
| 135 | + swipeThreshold: 100, |
| 136 | + alwaysFill: true |
102 | 137 | };
|
103 | 138 |
|
104 | 139 | vm.state = {};
|
|
107 | 142 |
|
108 | 143 | function init() {
|
109 | 144 | setElements();
|
110 |
| - setClasses(); |
111 | 145 | setOptions();
|
112 | 146 | setWatchers();
|
113 |
| - setSettings(); |
114 | 147 |
|
115 | 148 | vm.ready = true;
|
116 | 149 | }
|
|
122 | 155 |
|
123 | 156 | function setElements() {
|
124 | 157 | vm.kaarousel = $element[0];
|
125 |
| - vm.kaarousel.classList.add('kaarousel'); |
| 158 | + vm.kaarousel.classList.add(PREFIX); |
126 | 159 |
|
127 | 160 | //////////////////////
|
128 | 161 |
|
129 |
| - vm.kaarouselSliderContainer = $element[0].querySelector('kaarousel-slider-container'); |
130 |
| - vm.kaarouselWrapper = $element[0].querySelector('kaarousel-wrapper'); |
131 |
| - vm.kaarouselSlider = $element[0].querySelector('kaarousel-slider'); |
132 |
| - } |
133 |
| - |
134 |
| - function setClasses() { |
135 |
| - vm.kaarousel.classList.add('kaarousel'); |
| 162 | + vm.kaarouselSliderContainer = vm.kaarousel.querySelector(PREFIX + '-slider-container'); |
| 163 | + vm.kaarouselWrapper = vm.kaarousel.querySelector(PREFIX + '-wrapper'); |
| 164 | + vm.kaarouselSlider = vm.kaarousel.querySelector(PREFIX + '-slider'); |
136 | 165 | }
|
137 | 166 |
|
138 | 167 | function getScopeOptions() {
|
139 |
| - var options; |
| 168 | + var options = {}; |
140 | 169 | if (!_.isEmpty($scope.options)) {
|
141 | 170 | options = angular.copy($scope.options);
|
142 | 171 |
|
|
146 | 175 |
|
147 | 176 | return options;
|
148 | 177 | }
|
149 |
| - options = { |
150 |
| - displayed: $scope.displayed, |
151 |
| - perSlide: $scope.perSlide, |
152 |
| - autoplay: $scope.autoplay, |
153 |
| - direction: $scope.direction, |
154 |
| - pauseOnHover: $scope.pauseOnHover, |
155 |
| - centerActive: $scope.centerActive, |
156 |
| - timeInterval: $scope.timeInterval, |
157 |
| - transitionDuration: $scope.transitionDuration, |
158 |
| - updateRate: $scope.updateRate, |
159 |
| - stopAfterAction: $scope.stopAfterAction, |
160 |
| - hideNav: $scope.hideNav, |
161 |
| - hidePager: $scope.hidePager, |
162 |
| - navOnHover: $scope.navOnHover, |
163 |
| - pagerOnHover: $scope.pagerOnHover, |
164 |
| - swipable: $scope.swipable, |
165 |
| - sync: $scope.sync, |
166 |
| - animation: $scope.animation, |
167 |
| - loop: $scope.loop, |
168 |
| - options: $scope.options, |
169 |
| - afterSlide: $scope.afterSlide, |
170 |
| - beforeSlide: $scope.beforeSlide, |
171 |
| - minWidth: $scope.minWidth, |
172 |
| - expand: $scope.expand || true |
173 |
| - }; |
| 178 | + _.forEach(kOptions, function(option) { |
| 179 | + options[option] = angular.isDefined($scope[option]) ? $scope[option] : vm.defaultOptions[option]; |
| 180 | + }); |
174 | 181 |
|
175 | 182 | options = assumeBoolean(options);
|
176 | 183 |
|
|
215 | 222 | var fn;
|
216 | 223 |
|
217 | 224 | switch (option) {
|
| 225 | + case 'timeInterval': |
| 226 | + stop(); |
| 227 | + play(); |
| 228 | + break; |
218 | 229 | case 'animation':
|
219 | 230 | setAnimationClass(value);
|
220 | 231 | break;
|
|
240 | 251 | case 'centerActive':
|
241 | 252 | move(vm.currentIndex, false, true);
|
242 | 253 | break;
|
| 254 | + case 'perSlide': |
| 255 | + move(vm.currentIndex, false, true); |
| 256 | + break; |
243 | 257 | case 'minWidth':
|
244 | 258 | setSlidesDimensions();
|
245 | 259 | break;
|
| 260 | + case 'alwaysFill': |
| 261 | + vm.move(vm.currentIndex, false, true); |
| 262 | + break; |
246 | 263 | }
|
247 | 264 |
|
248 | 265 | if ((option === 'displayed' || option === 'expand' || option === 'animation') && !angular.isNumber(vm.options.minWidth)) {
|
|
293 | 310 | function setOptions(option, value) {
|
294 | 311 | vm.options = _.merge({}, vm.defaultOptions, checkValues(getScopeOptions()));
|
295 | 312 |
|
296 |
| - |
297 | 313 | if (option) {
|
298 | 314 | vm.options[option] = value;
|
299 | 315 | vm.options = checkValues(vm.options);
|
300 | 316 | handleImportantChanges(option, vm.options[option]);
|
301 | 317 | } else {
|
302 |
| - vm.options = checkValues(vm.options); |
303 | 318 | setDefaultState();
|
304 | 319 | }
|
305 | 320 |
|
|
403 | 418 | var response;
|
404 | 419 | switch (type) {
|
405 | 420 | case 'prev':
|
406 |
| - response = vm.currentIndex < vm.options.displayed; |
| 421 | + response = vm.currentIndex < vm.options.perSlide; |
407 | 422 | break;
|
408 | 423 | case 'next':
|
409 |
| - response = vm.currentIndex > vm.slides.length - vm.options.displayed; |
| 424 | + response = vm.currentIndex > (vm.slides.length - 1) - vm.options.perSlide; |
410 | 425 | break;
|
411 | 426 | }
|
412 | 427 | return response;
|
|
433 | 448 | });
|
434 | 449 |
|
435 | 450 | // On resize stop & play after it stopped
|
436 |
| - $window.addEventListener('resize', _.debounce(resetAfterWindowResize, 500)); |
437 | 451 | $window.addEventListener('resize', function() {
|
| 452 | + _.debounce(resetAfterWindowResize, 500)(); |
438 | 453 | if (vm.isPlaying) {
|
439 | 454 | stop();
|
440 | 455 | }
|
|
610 | 625 | var index,
|
611 | 626 | ref = getRef();
|
612 | 627 |
|
| 628 | + if (!vm.options.alwaysFill) { |
| 629 | + var half = vm.options.displayed / 2; |
| 630 | + if (vm.options.centerActive && ref > half) { |
| 631 | + ref -= parseInt(half) !== half ? Math.floor(half) : 0; |
| 632 | + } |
| 633 | + return vm.slides[ref].element[0]; |
| 634 | + } |
| 635 | + |
613 | 636 | var limits = getLimits();
|
614 | 637 |
|
615 | 638 | if (limits.up < 0) limits.up = vm.slides.length;
|
|
624 | 647 | function applyStyles(offset) {
|
625 | 648 |
|
626 | 649 | if (vm.options.animation === 'slide') {
|
627 |
| - |
628 | 650 | var elementPos = getLastInView()[vm.isHorizontal ? 'offsetLeft' : 'offsetTop'];
|
629 | 651 | var property = vm.isHorizontal ? 'translateX' : 'translateY';
|
630 | 652 | var value = -(elementPos + (offset || 0)) + 'px';
|
|
901 | 923 | }
|
902 | 924 | });
|
903 | 925 | }
|
904 |
| - |
905 | 926 | }
|
906 | 927 | KaarouselController.$inject = ["$scope", "$element", "$attrs", "$interval", "$window", "$timeout", "$swipe"];
|
907 | 928 |
|
908 |
| - |
909 | 929 | })();
|
910 | 930 |
|
911 | 931 | (function() {
|
|
0 commit comments