gaga.paging.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. /*
  2. * Pagination Common Java Script written by gagamel.
  3. *
  4. * Copyright (c) 2019 gagamel
  5. * Dual licensed under GPL (GPL-LICENSE.txt) licenses.
  6. *
  7. * $Date: 2019-07-21 $
  8. *
  9. * 사용 예)
  10. * // HTML 태그는 다음과 같은 구조로 되어 있어야 한다.
  11. * <div class="tablePaging" id="pagination">
  12. * <a href="#pageNo=1">1</a>
  13. * <a href="#pageNo=2">2</a>
  14. * ...
  15. * </div>
  16. *
  17. * // Import할 자바스크립트 파일
  18. * <script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js"></script>
  19. *
  20. * <script type="text/javascript">
  21. * // Initialize a pagination
  22. * gagaPaging.init('searchForm', fnSearchGoodsQnaCallback, 'pagination');
  23. *
  24. * // Load data
  25. * gagaPaging.load($('#searchForm input[name=pageNo]').val(), $('#searchForm select[name=pageSize]').val());
  26. *
  27. * var fnSearchGoodsQnaCallback = function(result) {
  28. * // Handle Data
  29. * ...
  30. *
  31. * // Create pagination
  32. * gagaPaging.createPagination(result.goodsAsk.pageable);
  33. * }
  34. * </script>
  35. */
  36. var gagaPaging = {
  37. oFormId : '',
  38. oCallbackFn : '',
  39. oPaginationId : '',
  40. nPageSize : 50,
  41. nPageUnit : 10,
  42. /**
  43. * Initialize a pagination
  44. * @param formId - Form ID. 검색조건 폼 ID
  45. * @param callbackFn - Callback function. 데이터 조회 후 처리하는 콜백함수
  46. * @param paginationId - Pagination ID. 페이징을 구성하는 div 태그 ID
  47. * @param pageSize - 조회할 데이터 row수. 옵션
  48. * @param pageUnit - 그룹핑 페이지 단위. 옵션
  49. * 사용 예)
  50. * // Initialize a pagination
  51. * gagaPaging.init('searchForm', fnSearchGoodsQnaCallback, 'pagination');
  52. * or
  53. * gagaPaging.init('searchForm', fnSearchGoodsQnaCallback, 'pagination', 50);
  54. * or
  55. * gagaPaging.init('searchForm', fnSearchGoodsQnaCallback, 'pagination', 50, 10);
  56. */
  57. init : function(formId, callbackFn, paginationId, pageSize, pageUnit) {
  58. oFormId = formId;
  59. oCallbackFn = callbackFn;
  60. oPaginationId = paginationId;
  61. if (typeof(pageSize) != 'undefined') nPageSize = pageSize;
  62. if (typeof(pageUnit) != 'undefined') nPageUnit = pageUnit;
  63. },
  64. /**
  65. * Create a pagination
  66. * @param pageable - page 정보
  67. */
  68. createPagination : function(pageable) {
  69. // Generate pagination
  70. var html;
  71. if (gagajf.isNull(pageable.generatedPagination)) {
  72. html = gagaPaging.generatedPagination(pageable);
  73. } else {
  74. html = pageable.generatedPagination;
  75. }
  76. $('#' + oPaginationId).html(html);
  77. // Bind event
  78. gagaPaging.bind();
  79. },
  80. /**
  81. * Bind the pagination's event
  82. * Paging 처리 시 다음과 같이 지정
  83. * 사용 예)
  84. * // HTML 태그는 다음과 같은 구조로 되어 있어야 한다.
  85. * <div class="tablePaging" id="pagination">
  86. * <a href="#pageNo=1">1</a>
  87. * <a href="#pageNo=2">2</a>
  88. * ...
  89. * </div>
  90. */
  91. bind : function() {
  92. $('#' + oPaginationId + ' a').on('click', function(e) {
  93. var params = $(this).attr('href');
  94. params = params.replace(/^.*#/, '');
  95. var pageNo = 1;
  96. if (!gagajf.isNull(params)) {
  97. pageNo = params.split("=")[1];
  98. }
  99. gagaPaging.load(pageNo);
  100. return false;
  101. });
  102. },
  103. /**
  104. * Load data and call a callback function
  105. * JSON 형태로 보내고 받는 후 콜백함수에서 데이터를 처리한다.
  106. * @param pageNo - 조회할 페이지번호
  107. */
  108. load : function(pageNo) {
  109. $('#' + oFormId + ' input[name=pageNo]').val(pageNo);
  110. $('#' + oFormId + ' input[name=pageSize]').val(nPageSize);
  111. // comma(,) 제거
  112. gagajf.removeCommaAtNumberFormattedInput('#' + oFormId);
  113. var jsonData = JSON.stringify($('#' + oFormId).serializeObject());
  114. $.ajax({
  115. type : 'POST',
  116. url : $('#' + oFormId).prop('action'),
  117. data : jsonData,
  118. dataType : 'JSON',
  119. beforeSend : function(xhr, settings) {
  120. // dataType: "json"일 때
  121. xhr.setRequestHeader('Accept', 'application/json');
  122. xhr.setRequestHeader('Content-Type', 'application/json');
  123. // Button disabled & progressBar creation
  124. //gagajf.showProgressbar(true);
  125. },
  126. complete : function() {
  127. // Button abled & progressBar remove
  128. //gagajf.showProgressbar(false);
  129. },
  130. success : function(result) {
  131. try {
  132. if (!gagajf.isNull(result.error.message)) {
  133. mcxDialog.alert(result.error.message);
  134. return;
  135. }
  136. } catch(e) {
  137. // Do nothing
  138. }
  139. if (typeof(oCallbackFn) == 'function') {
  140. oCallbackFn.call(this, result);
  141. }
  142. },
  143. error : function(result) {
  144. mcxDialog.alert('오류로 인해 처리되지 않았습니다.');
  145. }
  146. });
  147. },
  148. generatedPagination : function (pageable) {
  149. let pageNo = pageable.pageNo;
  150. let pageSize = pageable.pageSize;
  151. let pageUnit = pageable.pageUnit;
  152. let totalCount = pageable.totalCount;
  153. let firstCount = (getPageGroup() - 1) * pageable.pageUnit + 1;
  154. let loopCount = firstCount + pageUnit;
  155. if (loopCount > getTotalPage()) {
  156. loopCount = Number(getTotalPage() + 1);
  157. }
  158. let pageTag = '';
  159. if (!(firstCount == 1 && loopCount == 1)) {
  160. if (pageNo == 1) {
  161. pageTag += '<li class="disabled"><a href="#" alt="맨처음">«</a></li>\n';
  162. } else {
  163. pageTag += '<li><a href="#pageNo=1" alt="맨처음">«</a></li>\n';
  164. }
  165. if (getPageGroup() == 1) {
  166. if (pageNo == 1) {
  167. pageTag += '<li class="prev disabled"><a href="#" alt="이전페이지">‹</a></li>\n';
  168. } else {
  169. pageTag += '<li class="prev"><a href="#" alt="이전페이지">‹</a></li>\n';
  170. }
  171. } else {
  172. pageTag += '<li class="prev"><a href="#pageNo=' + (getPageGroup()-1) * pageUnit + '" alt="이전페이지">‹</a></li>\n';
  173. }
  174. for (let i = firstCount; i < loopCount; i++) {
  175. if (pageNo == i) {
  176. pageTag += '<li class="active"><a href="#">' + i + '</a></li>\n';
  177. } else {
  178. pageTag += '<li><a href="#pageNo=' + i + '">' + i + '</a></li>\n';
  179. }
  180. }
  181. if (loopCount <= (Number(getTotalPage() + 1))) {
  182. if (getTotalPage() > loopCount) {
  183. pageTag += '<li class="next"><a href="#pageNo=' + (getPageGroup() * pageUnit + 1) + '" alt="다음페이지">›</a></li>\n';
  184. } else {
  185. pageTag += '<li class="next"><a href="#pageNo=' + getTotalPage() + '" alt="다음페이지">›</a></li>\n';
  186. }
  187. pageTag += '<li><a href="#pageNo=' + getTotalPage() + '" alt="맨마지막">»</a></li>\n';
  188. }
  189. }
  190. function getPageGroup() {
  191. return parseInt((pageNo-1) / pageUnit + 1 );
  192. }
  193. function getTotalPage() {
  194. let totalPage = parseInt(totalCount / pageSize);
  195. if (totalCount % pageSize > 0) {
  196. totalPage++;
  197. }
  198. return totalPage;
  199. }
  200. return pageTag;
  201. }
  202. }