pagination.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. Object.defineProperties(exports, {
  2. __esModule: { value: true },
  3. [Symbol.toStringTag]: { value: "Module" }
  4. });
  5. require("../../../_virtual/_rolldown/runtime.js");
  6. const require_event = require("../../../constants/event.js");
  7. const require_types = require("../../../utils/types.js");
  8. const require_error = require("../../../utils/error.js");
  9. const require_runtime$1 = require("../../../utils/vue/props/runtime.js");
  10. const require_icon = require("../../../utils/vue/icon.js");
  11. const require_typescript = require("../../../utils/typescript.js");
  12. const require_index = require("../../../hooks/use-deprecated/index.js");
  13. const require_index$1 = require("../../../hooks/use-locale/index.js");
  14. const require_index$2 = require("../../../hooks/use-namespace/index.js");
  15. const require_index$3 = require("../../../hooks/use-size/index.js");
  16. const require_constants = require("./constants.js");
  17. const require_prev = require("./components/prev2.js");
  18. const require_next = require("./components/next2.js");
  19. const require_sizes = require("./components/sizes2.js");
  20. const require_jumper = require("./components/jumper2.js");
  21. const require_total = require("./components/total2.js");
  22. const require_pager = require("./components/pager2.js");
  23. let _element_plus_icons_vue = require("@element-plus/icons-vue");
  24. let vue = require("vue");
  25. //#region ../../packages/components/pagination/src/pagination.ts
  26. /**
  27. * It it user's responsibility to guarantee that the value of props.total... is number
  28. * (same as pageSize, defaultPageSize, currentPage, defaultCurrentPage, pageCount)
  29. * Otherwise we can reasonable infer that the corresponding field is absent
  30. */
  31. const isAbsent = (v) => typeof v !== "number";
  32. const paginationProps = require_runtime$1.buildProps({
  33. /**
  34. * @description options of item count per page
  35. */
  36. pageSize: Number,
  37. /**
  38. * @description default initial value of page size, not setting is the same as setting 10
  39. */
  40. defaultPageSize: Number,
  41. /**
  42. * @description total item count
  43. */
  44. total: Number,
  45. /**
  46. * @description total page count. Set either `total` or `page-count` and pages will be displayed; if you need `page-sizes`, `total` is required
  47. */
  48. pageCount: Number,
  49. /**
  50. * @description number of pagers. Pagination collapses when the total page count exceeds this value
  51. */
  52. pagerCount: {
  53. type: Number,
  54. validator: (value) => {
  55. return require_types.isNumber(value) && Math.trunc(value) === value && value > 4 && value < 22 && value % 2 === 1;
  56. },
  57. default: 7
  58. },
  59. /**
  60. * @description current page number
  61. */
  62. currentPage: Number,
  63. /**
  64. * @description default initial value of current-page, not setting is the same as setting 1
  65. */
  66. defaultCurrentPage: Number,
  67. /**
  68. * @description layout of Pagination, elements separated with a comma
  69. */
  70. layout: {
  71. type: String,
  72. default: [
  73. "prev",
  74. "pager",
  75. "next",
  76. "jumper",
  77. "->",
  78. "total"
  79. ].join(", ")
  80. },
  81. /**
  82. * @description item count of each page
  83. */
  84. pageSizes: {
  85. type: require_runtime$1.definePropType(Array),
  86. default: () => require_typescript.mutable([
  87. 10,
  88. 20,
  89. 30,
  90. 40,
  91. 50,
  92. 100
  93. ])
  94. },
  95. /**
  96. * @description custom class name for the page size Select's dropdown
  97. */
  98. popperClass: {
  99. type: String,
  100. default: ""
  101. },
  102. /**
  103. * @description custom style for the page size Select's dropdown
  104. */
  105. popperStyle: { type: require_runtime$1.definePropType([String, Object]) },
  106. /**
  107. * @description text for the prev button
  108. */
  109. prevText: {
  110. type: String,
  111. default: ""
  112. },
  113. /**
  114. * @description icon for the prev button, higher priority of `prev-text`
  115. */
  116. prevIcon: {
  117. type: require_icon.iconPropType,
  118. default: () => _element_plus_icons_vue.ArrowLeft
  119. },
  120. /**
  121. * @description text for the next button
  122. */
  123. nextText: {
  124. type: String,
  125. default: ""
  126. },
  127. /**
  128. * @description icon for the next button, higher priority of `next-text`
  129. */
  130. nextIcon: {
  131. type: require_icon.iconPropType,
  132. default: () => _element_plus_icons_vue.ArrowRight
  133. },
  134. /**
  135. * @description whether Pagination size is teleported to body
  136. */
  137. teleported: {
  138. type: Boolean,
  139. default: true
  140. },
  141. /**
  142. * @description whether to use small pagination
  143. */
  144. small: Boolean,
  145. /**
  146. * @description set page size
  147. */
  148. size: require_index$3.useSizeProp,
  149. /**
  150. * @description whether the buttons have a background color
  151. */
  152. background: Boolean,
  153. /**
  154. * @description whether Pagination is disabled
  155. */
  156. disabled: Boolean,
  157. /**
  158. * @description whether to hide when there's only one page
  159. */
  160. hideOnSinglePage: Boolean,
  161. /**
  162. * @description which element the size dropdown appends to.
  163. */
  164. appendSizeTo: String
  165. });
  166. const paginationEmits = {
  167. "update:current-page": (val) => require_types.isNumber(val),
  168. "update:page-size": (val) => require_types.isNumber(val),
  169. "size-change": (val) => require_types.isNumber(val),
  170. change: (currentPage, pageSize) => require_types.isNumber(currentPage) && require_types.isNumber(pageSize),
  171. "current-change": (val) => require_types.isNumber(val),
  172. "prev-click": (val) => require_types.isNumber(val),
  173. "next-click": (val) => require_types.isNumber(val)
  174. };
  175. const componentName = "ElPagination";
  176. var pagination_default = (0, vue.defineComponent)({
  177. name: componentName,
  178. props: paginationProps,
  179. emits: paginationEmits,
  180. setup(props, { emit, slots }) {
  181. const { t } = require_index$1.useLocale();
  182. const ns = require_index$2.useNamespace("pagination");
  183. const vnodeProps = (0, vue.getCurrentInstance)().vnode.props || {};
  184. const _globalSize = require_index$3.useGlobalSize();
  185. const _size = (0, vue.computed)(() => props.small ? "small" : props.size ?? _globalSize.value);
  186. require_index.useDeprecated({
  187. from: "small",
  188. replacement: "size",
  189. version: "3.0.0",
  190. scope: "el-pagination",
  191. ref: "https://element-plus.org/zh-CN/component/pagination.html"
  192. }, (0, vue.computed)(() => !!props.small));
  193. const hasCurrentPageListener = "onUpdate:currentPage" in vnodeProps || "onUpdate:current-page" in vnodeProps || "onCurrentChange" in vnodeProps;
  194. const hasPageSizeListener = "onUpdate:pageSize" in vnodeProps || "onUpdate:page-size" in vnodeProps || "onSizeChange" in vnodeProps;
  195. const assertValidUsage = (0, vue.computed)(() => {
  196. if (isAbsent(props.total) && isAbsent(props.pageCount)) return false;
  197. if (!isAbsent(props.currentPage) && !hasCurrentPageListener) return false;
  198. if (props.layout.includes("sizes")) {
  199. if (!isAbsent(props.pageCount)) {
  200. if (!hasPageSizeListener) return false;
  201. } else if (!isAbsent(props.total)) {
  202. if (!isAbsent(props.pageSize)) {
  203. if (!hasPageSizeListener) return false;
  204. }
  205. }
  206. }
  207. return true;
  208. });
  209. const innerPageSize = (0, vue.ref)(isAbsent(props.defaultPageSize) ? 10 : props.defaultPageSize);
  210. const innerCurrentPage = (0, vue.ref)(isAbsent(props.defaultCurrentPage) ? 1 : props.defaultCurrentPage);
  211. const pageSizeBridge = (0, vue.computed)({
  212. get() {
  213. return isAbsent(props.pageSize) ? innerPageSize.value : props.pageSize;
  214. },
  215. set(v) {
  216. if (isAbsent(props.pageSize)) innerPageSize.value = v;
  217. if (hasPageSizeListener) {
  218. emit("update:page-size", v);
  219. emit("size-change", v);
  220. }
  221. }
  222. });
  223. const pageCountBridge = (0, vue.computed)(() => {
  224. let pageCount = 0;
  225. if (!isAbsent(props.pageCount)) pageCount = props.pageCount;
  226. else if (!isAbsent(props.total)) pageCount = Math.max(1, Math.ceil(props.total / pageSizeBridge.value));
  227. return pageCount;
  228. });
  229. const currentPageBridge = (0, vue.computed)({
  230. get() {
  231. return isAbsent(props.currentPage) ? innerCurrentPage.value : props.currentPage;
  232. },
  233. set(v) {
  234. let newCurrentPage = v;
  235. if (v < 1) newCurrentPage = 1;
  236. else if (v > pageCountBridge.value) newCurrentPage = pageCountBridge.value;
  237. if (isAbsent(props.currentPage)) innerCurrentPage.value = newCurrentPage;
  238. if (hasCurrentPageListener) {
  239. emit("update:current-page", newCurrentPage);
  240. emit("current-change", newCurrentPage);
  241. }
  242. }
  243. });
  244. (0, vue.watch)(pageCountBridge, (val) => {
  245. if (currentPageBridge.value > val) currentPageBridge.value = val;
  246. });
  247. (0, vue.watch)([currentPageBridge, pageSizeBridge], (value) => {
  248. emit(require_event.CHANGE_EVENT, ...value);
  249. }, { flush: "post" });
  250. function handleCurrentChange(val) {
  251. currentPageBridge.value = val;
  252. }
  253. function handleSizeChange(val) {
  254. pageSizeBridge.value = val;
  255. const newPageCount = pageCountBridge.value;
  256. if (currentPageBridge.value > newPageCount) currentPageBridge.value = newPageCount;
  257. }
  258. function prev() {
  259. if (props.disabled) return;
  260. currentPageBridge.value -= 1;
  261. emit("prev-click", currentPageBridge.value);
  262. }
  263. function next() {
  264. if (props.disabled) return;
  265. currentPageBridge.value += 1;
  266. emit("next-click", currentPageBridge.value);
  267. }
  268. function addClass(element, cls) {
  269. if (element) {
  270. if (!element.props) element.props = {};
  271. element.props.class = [element.props.class, cls].join(" ");
  272. }
  273. }
  274. (0, vue.provide)(require_constants.elPaginationKey, {
  275. pageCount: pageCountBridge,
  276. disabled: (0, vue.computed)(() => props.disabled),
  277. currentPage: currentPageBridge,
  278. changeEvent: handleCurrentChange,
  279. handleSizeChange
  280. });
  281. return () => {
  282. if (!assertValidUsage.value) {
  283. require_error.debugWarn(componentName, t("el.pagination.deprecationWarning"));
  284. return null;
  285. }
  286. if (!props.layout) return null;
  287. if (props.hideOnSinglePage && pageCountBridge.value <= 1) return null;
  288. const rootChildren = [];
  289. const rightWrapperChildren = [];
  290. const rightWrapperRoot = (0, vue.h)("div", { class: ns.e("rightwrapper") }, rightWrapperChildren);
  291. const TEMPLATE_MAP = {
  292. prev: (0, vue.h)(require_prev.default, {
  293. disabled: props.disabled,
  294. currentPage: currentPageBridge.value,
  295. prevText: props.prevText,
  296. prevIcon: props.prevIcon,
  297. onClick: prev
  298. }),
  299. jumper: (0, vue.h)(require_jumper.default, { size: _size.value }),
  300. pager: (0, vue.h)(require_pager.default, {
  301. currentPage: currentPageBridge.value,
  302. pageCount: pageCountBridge.value,
  303. pagerCount: props.pagerCount,
  304. onChange: handleCurrentChange,
  305. disabled: props.disabled
  306. }),
  307. next: (0, vue.h)(require_next.default, {
  308. disabled: props.disabled,
  309. currentPage: currentPageBridge.value,
  310. pageCount: pageCountBridge.value,
  311. nextText: props.nextText,
  312. nextIcon: props.nextIcon,
  313. onClick: next
  314. }),
  315. sizes: (0, vue.h)(require_sizes.default, {
  316. pageSize: pageSizeBridge.value,
  317. pageSizes: props.pageSizes,
  318. popperClass: props.popperClass,
  319. popperStyle: props.popperStyle,
  320. disabled: props.disabled,
  321. teleported: props.teleported,
  322. size: _size.value,
  323. appendSizeTo: props.appendSizeTo
  324. }),
  325. slot: slots?.default?.() ?? null,
  326. total: (0, vue.h)(require_total.default, { total: isAbsent(props.total) ? 0 : props.total })
  327. };
  328. const components = props.layout.split(",").map((item) => item.trim());
  329. let haveRightWrapper = false;
  330. components.forEach((c) => {
  331. if (c === "->") {
  332. haveRightWrapper = true;
  333. return;
  334. }
  335. if (!haveRightWrapper) rootChildren.push(TEMPLATE_MAP[c]);
  336. else rightWrapperChildren.push(TEMPLATE_MAP[c]);
  337. });
  338. addClass(rootChildren[0], ns.is("first"));
  339. addClass(rootChildren[rootChildren.length - 1], ns.is("last"));
  340. if (haveRightWrapper && rightWrapperChildren.length > 0) {
  341. addClass(rightWrapperChildren[0], ns.is("first"));
  342. addClass(rightWrapperChildren[rightWrapperChildren.length - 1], ns.is("last"));
  343. rootChildren.push(rightWrapperRoot);
  344. }
  345. return (0, vue.h)("div", { class: [
  346. ns.b(),
  347. ns.is("background", props.background),
  348. ns.m(_size.value)
  349. ] }, rootChildren);
  350. };
  351. }
  352. });
  353. //#endregion
  354. exports.default = pagination_default;
  355. exports.paginationEmits = paginationEmits;
  356. exports.paginationProps = paginationProps;
  357. //# sourceMappingURL=pagination.js.map