|
6 | 6 | */
|
7 | 7 | function AjaxDataProvider() {
|
8 | 8 | // private
|
9 |
| - var perPage = 10; |
| 9 | + var pageSize = 10; |
| 10 | + var page = 0; |
| 11 | + var totalCount = 0; |
| 12 | + |
10 | 13 | var data = [];
|
11 | 14 | var url = "http://192.168.60.167:3002/api.php";
|
12 |
| - var timer = null; |
13 |
| - var req = null; // ajax timer |
| 15 | + var timeout = null; |
| 16 | + var req = null; |
| 17 | + var refreshHints = {}; |
14 | 18 |
|
15 | 19 | // events
|
16 | 20 | var onDataLoading = new Slick.Event();
|
17 | 21 | var onDataLoaded = new Slick.Event();
|
| 22 | + var onPagingInfoChanged = new Slick.Event(); |
18 | 23 |
|
19 | 24 | function init() {}
|
20 | 25 |
|
|
28 | 33 | return true;
|
29 | 34 | }
|
30 | 35 |
|
| 36 | + function setPagingOptions(args) { |
| 37 | + if (args.pageSize !== undefined) { |
| 38 | + pageSize = args.pageSize; |
| 39 | + page = pageSize ? Math.min(page, Math.max(0, Math.ceil(totalCount / pageSize) - 1)) : 0; |
| 40 | + } |
| 41 | + |
| 42 | + if (args.pageNum !== undefined) { |
| 43 | + page = Math.min(args.pageNum, Math.max(0, Math.ceil(totalCount / pageSize) - 1)); |
| 44 | + } |
| 45 | + |
| 46 | + onPagingInfoChanged.notify(getPagingInfo(), null, self); |
| 47 | + |
| 48 | + refresh(); |
| 49 | + } |
| 50 | + |
| 51 | + function getPagingInfo() { |
| 52 | + var totalPages = pageSize ? Math.max(1, Math.ceil(totalCount / pageSize)) : 1; |
| 53 | + return { |
| 54 | + pageSize: pageSize, |
| 55 | + pageNum: page, |
| 56 | + totalRows: totalCount, |
| 57 | + totalPages: totalPages, |
| 58 | + dataProvider: this |
| 59 | + }; |
| 60 | + } |
| 61 | + |
| 62 | + function setRefreshHints(hints) { |
| 63 | + refreshHints = hints; |
| 64 | + } |
| 65 | + |
31 | 66 | function clear() {
|
32 | 67 | for (var key in data) {
|
33 | 68 | delete data[key];
|
34 | 69 | }
|
35 | 70 | }
|
36 | 71 |
|
37 | 72 | function getData() {
|
| 73 | + prepareData(); |
38 | 74 | return data;
|
39 | 75 | }
|
40 | 76 |
|
41 |
| - function prepareData(from, to) { |
| 77 | + function prepareData() { |
42 | 78 | if (req) {
|
43 | 79 | req.abort();
|
44 | 80 | for (var i = req.fromPage; i <= req.toPage; i++) {
|
45 |
| - delete data[i * perPage]; |
| 81 | + delete data[i * pageSize]; |
46 | 82 | }
|
47 | 83 | }
|
48 | 84 |
|
49 |
| - if (from < 0) { |
50 |
| - from = 0; |
51 |
| - } |
| 85 | + var from = page; |
| 86 | + var to = page * pageSize; |
52 | 87 |
|
53 | 88 | if (data.length > 0) {
|
54 | 89 | to = Math.min(to, data.length - 1);
|
55 | 90 | }
|
56 | 91 |
|
57 |
| - var fromPage = Math.floor(from / perPage); |
58 |
| - var toPage = Math.floor(to / perPage); |
| 92 | + var fromPage = Math.floor(from / pageSize); |
| 93 | + var toPage = Math.floor(to / pageSize); |
59 | 94 |
|
60 |
| - while (data[fromPage * perPage] !== undefined && fromPage < toPage) |
| 95 | + while (data[fromPage * pageSize] !== undefined && fromPage < toPage) |
61 | 96 | fromPage++;
|
62 | 97 |
|
63 |
| - while (data[toPage * perPage] !== undefined && fromPage < toPage) |
| 98 | + while (data[toPage * pageSize] !== undefined && fromPage < toPage) |
64 | 99 | toPage--;
|
65 | 100 |
|
66 |
| - if (fromPage > toPage || ((fromPage == toPage) && data[fromPage * perPage] !== undefined)) { |
| 101 | + if (fromPage > toPage || ((fromPage == toPage) && data[fromPage * pageSize] !== undefined)) { |
67 | 102 | // TODO: look-ahead
|
68 | 103 | onDataLoaded.notify({from: from, to: to});
|
69 | 104 | return;
|
70 | 105 | }
|
71 | 106 |
|
72 |
| - var recStart = (fromPage * perPage); |
73 |
| - var recCount = (((toPage - fromPage) * perPage) + perPage); |
| 107 | + var recStart = (fromPage * pageSize); |
| 108 | + var recCount = (((toPage - fromPage) * pageSize) + pageSize); |
74 | 109 |
|
75 | 110 | url += "?page=" + recStart + "&count=" + recCount;
|
76 | 111 |
|
77 |
| - if (timer !== null) { |
78 |
| - clearTimeout(timer); |
| 112 | + if (timeout !== null) { |
| 113 | + clearTimeout(timeout); |
79 | 114 | }
|
80 | 115 |
|
81 |
| - timer = setTimeout(function () { |
| 116 | + timeout = setTimeout(function () { |
82 | 117 | for (var i = fromPage; i <= toPage; i++) {
|
83 |
| - data[i * perPage] = null; // null indicates a 'timered but not available yet' |
| 118 | + data[i * pageSize] = null; // null indicates a 'timered but not available yet' |
84 | 119 | }
|
85 | 120 |
|
86 | 121 | onDataLoading.notify({from: from, to: to});
|
|
143 | 178 | "isDataLoaded": isDataLoaded,
|
144 | 179 | "prepareData": prepareData,
|
145 | 180 | "refresh": refresh,
|
| 181 | + "getPagingInfo": getPagingInfo, |
| 182 | + "setRefreshHints": setRefreshHints, |
146 | 183 |
|
147 | 184 | // events
|
148 | 185 | "onDataLoading": onDataLoading,
|
149 |
| - "onDataLoaded": onDataLoaded |
| 186 | + "onDataLoaded": onDataLoaded, |
| 187 | + "onPagingInfoChanged": onPagingInfoChanged |
150 | 188 | };
|
151 | 189 | }
|
152 | 190 |
|
153 |
| - // Slick.RemoteDataProvider |
154 |
| - $.extend(true, window, { Flow: { AjaxDataProvider: AjaxDataProvider }}); |
| 191 | + $.extend(true, window, { Slick: { AjaxDataProvider: AjaxDataProvider }}); |
155 | 192 | })(jQuery);
|
0 commit comments