vue-use-paginator
Version:
Vue use-hook for renderless pagination logic
70 lines (69 loc) • 2.24 kB
JavaScript
import { ref as m, computed as h, watch as z } from "vue";
const B = {
page: 1,
pageSize: 5,
numItems: 0,
numButtons: 5
}, b = (e) => {
const s = { ...B, ...e }, u = m(s.page), t = m(s.pageSize), n = m(s.numItems), o = m(s.numButtons), l = h({
get: () => u.value,
set: (p) => {
p <= 0 ? u.value = 1 : p > a.value ? u.value = a.value || 1 : u.value = p;
}
}), a = h(() => Math.ceil(n.value / t.value));
z(a, () => {
l.value > a.value && (l.value = a.value);
});
const i = h(() => {
const p = (l.value - 1) * t.value, S = Math.min(p + t.value, n.value);
return [p, S];
}), c = h(() => l.value > 1), r = h(() => l.value < a.value), f = () => (c.value && l.value--, l.value), d = () => (r.value && l.value++, l.value), M = () => (l.value = 1, 1), g = () => (l.value = a.value, a.value), x = h(() => a.value <= o.value ? I(l.value, a.value) : N(l.value, a.value, o.value));
return {
page: l,
pageSize: t,
numItems: n,
numButtons: o,
numPages: a,
slice: i,
hasPrev: c,
hasNext: r,
goPrev: f,
goNext: d,
goStart: M,
goEnd: g,
buttons: x
};
};
function I(e, s) {
return v(1, e).concat({ page: e, active: !0, ellipsis: !1 }).concat(v(e + 1, s + 1));
}
function N(e, s, u) {
let t = 0, n = 0;
const o = Math.floor(u / 2);
e <= o ? (t = e - 1, n = u - t - 1) : e >= s - o ? (n = s - e, t = u - n - 1) : u % 2 === 0 ? (t = o - 1, n = o) : (t = o, n = o);
const l = e - 1, a = s - e;
let i = [];
if (l <= t)
i = v(1, l + 1);
else if (t > 0) {
const c = t === 2 ? 2 : Math.ceil(t / 2), r = t - c;
let f = Math.ceil(l / 2);
l % 2 === 0 && f++, i = v(1, c).concat({ page: f, active: !1, ellipsis: !0 }).concat(v(e - r, e));
}
if (i.push({ page: e, active: !0, ellipsis: !1 }), a <= n)
i = i.concat(v(e + 1, s + 1));
else if (n > 0) {
const c = n === 2 ? 1 : Math.floor(n / 2) + 1, r = n - c, f = e + Math.ceil(a / 2);
i = i.concat(v(e + 1, e + c)).concat({ page: f, active: !1, ellipsis: !0 }).concat(v(s - r + 1, s + 1));
}
return i;
}
function v(e, s) {
const u = [];
for (let t = e; t < s; t++)
u.push({ page: t, active: !1, ellipsis: !1 });
return u;
}
export {
b as default
};