UNPKG

3.37 kBJavaScriptView Raw
1(function() {
2 'use strict';
3
4 window.Ractive.controller('pl-pagination', function(component, data, el, config, done) {
5
6 var refs = {
7 totalPages: 'total-pages',
8 pageSelected: 'page-selected',
9 displayPagesCount: 'display-pages-count',
10 displayFirstButton: 'display-first-button',
11 displayLastButton: 'display-last-button',
12 displayPreviousButton: 'display-previous-button',
13 displayNextButton: 'display-next-button'
14 };
15
16 $.each(refs, function(key, value) {
17 data[key] = data[value] && data[value] == 'false' ? false : true;
18 });
19
20 data.totalPages = data['total-pages'] ? parseInt(data['total-pages'], 10) : 20;
21 data.pageSelected = data['page-selected'] ? parseInt(data['page-selected'], 10) : 1;
22 data.displayPagesCount = data['display-pages-count'] ? parseInt(data['display-pages-count'], 10) : 7;
23
24 var Pagination = component({
25 plName: 'pl-pagination',
26 data: data
27 });
28
29 function _updatePages() {
30 var pages = [],
31 totalPages = parseInt(Pagination.get('totalPages'), 10),
32 pageSelected = parseInt(Pagination.get('pageSelected'), 10),
33 displayPagesCount = parseInt(Pagination.get('displayPagesCount'), 10),
34 selectIndex = Math.round(displayPagesCount / 2) - 1,
35 start = Math.max(1, pageSelected - selectIndex),
36 stop = Math.min(totalPages + 1, start + displayPagesCount);
37
38 if (stop - start < displayPagesCount && start > 1) {
39 start = Math.max(1, start - (displayPagesCount - (stop - start)));
40 }
41
42 for (var i = start; i < stop; i++) {
43 pages.push(i.toString());
44 }
45
46 Pagination.set('pages', pages);
47 }
48
49 $.each(refs, function(key, value) {
50 Pagination.observe(value, function(newValue) {
51 newValue = typeof newValue == 'undefined' ? true : newValue;
52
53 Pagination.set(key,
54 newValue == 'false' ? false : (
55 newValue == 'true' ? true : newValue
56 ));
57 });
58 });
59
60 Pagination.observe('pageSelected', function(newValue) {
61 var value = Math.max(1, Math.min(parseInt(Pagination.get('totalPages'), 10), newValue)).toString();
62 if (value !== newValue) {
63 setTimeout(function() {
64 Pagination.set('pageSelected', value);
65 });
66
67 return false;
68 }
69
70 var onpagselected = Pagination.get('onpagselected');
71 if (onpagselected) {
72 onpagselected(parseInt(value, 10));
73 }
74
75 _updatePages();
76 });
77
78 Pagination.observe('totalPages displayPagesCount', function() {
79 _updatePages();
80 Pagination.set('hasActionButtons', parseInt(data.totalPages, 10) > parseInt(data.displayPagesCount, 10));
81 });
82
83 _updatePages();
84
85 Pagination.on('selectPage', function(event) {
86 Pagination.set('pageSelected', event.context);
87 });
88
89 Pagination.on('previousPage', function() {
90 Pagination.set('pageSelected', parseInt(Pagination.get('pageSelected'), 10) - 1);
91 });
92
93 Pagination.on('nextPage', function() {
94 Pagination.set('pageSelected', parseInt(Pagination.get('pageSelected'), 10) + 1);
95 });
96
97 Pagination.on('firstPage', function() {
98 Pagination.set('pageSelected', '1');
99 });
100
101 Pagination.on('lastPage', function() {
102 Pagination.set('pageSelected', Pagination.get('totalPages'));
103 });
104
105 done();
106 });
107})();