@progress/kendo-react-data-tools
Version:
Includes React Pager & React Filter component, an intuitive interface to create complex filter descriptions. KendoReact Data Tools package
234 lines (233 loc) • 7.21 kB
JavaScript
/**
* @license
*-------------------------------------------------------------------------------------------
* Copyright © 2025 Progress Software Corporation. All rights reserved.
* Licensed under commercial license. See LICENSE.md in the package root for more information
*-------------------------------------------------------------------------------------------
*/
"use client";
import * as n from "react";
import s from "prop-types";
import { PagerNumericButtons as ze } from "./PagerNumericButtons.mjs";
import { PagerInput as De } from "./PagerInput.mjs";
import { PagerPageSizes as ke } from "./PagerPageSizes.mjs";
import { Button as Le } from "@progress/kendo-react-buttons";
import { pagerFirstPage as we, pagerPreviousPage as Ke, pagerNextPage as xe, pagerLastPage as Be, pagerInfo as Oe, pagerAriaKeyshortcuts as Te, pagerPage as qe, pagerOf as Ae, pagerTotalPages as _e } from "../messages/index.mjs";
import { useLocalization as Fe, useInternationalization as $e } from "@progress/kendo-react-intl";
import { classNames as J, kendoThemeMaps as Ve, Keys as l, focusFirstFocusableChild as Ge, enableNavigatableContainer as He, disableNavigatableContainer as We, keepFocusInContainer as je, TABBABLE_ELEMENTS as Ue } from "@progress/kendo-react-common";
import { getL10NMessage as u, translateMessage as S, getFirstButtonProps as Je, getPrevButtonProps as Qe, getNextButtonProps as Xe, getLastButtonProps as Ye } from "./utils.mjs";
const Q = 600, Ze = 768, X = n.forwardRef((g, Y) => {
const {
buttonCount: x = P.buttonCount,
info: Z = P.info,
type: ee = P.type,
size: f = P.size,
disabled: b = P.disabled,
total: C,
skip: N,
take: v,
className: te,
style: se,
pageSizes: B,
pageSizeValue: ae,
previousNext: ne,
responsive: M,
messagesMap: r,
dir: O,
navigatable: m
} = g, i = Fe(), z = $e(), p = n.useRef({ element: null, props: g }), h = n.useRef(null);
n.useImperativeHandle(
p,
() => ({
get element() {
return re();
},
props: g
})
), n.useImperativeHandle(Y, () => p.current);
const re = () => h.current, [T, D] = n.useState(!0), [oe, q] = n.useState(!0);
n.useEffect(() => (window.addEventListener("resize", k), k(), () => {
window.removeEventListener("resize", k);
}), []);
const y = O === "rtl", o = Math.floor(N / v) + 1, c = Math.ceil((C || 0) / v), d = (t, e) => {
g.onPageChange && t > 0 && t <= c && g.onPageChange({
target: p.current,
skip: (t - 1) * g.take,
take: g.take,
syntheticEvent: e,
nativeEvent: e.nativeEvent,
targetEvent: e
});
}, ie = (t) => {
const e = h.current, a = t.keyCode;
!e || !m || ((a === l.home || t.metaKey && a === l.left) && d(1, t), (a === l.end || t.metaKey && a === l.right) && d(c, t), document.activeElement === e ? (a === l.enter && (Ge(e), He(e)), (a === l.left || a === l.up) && d(o - 1, t), (a === l.right || a === l.down) && d(o + 1, t)) : (a === l.esc && (e.focus(), We(e)), je(t, e, Ue)));
}, k = () => {
const t = h.current;
if (!t || !M)
return;
const e = t.offsetWidth;
e < Q ? D(!1) : e >= Q && e < Ze ? (q(!1), D(!0)) : (q(!0), D(!0));
}, le = (t, e) => {
const a = {
target: p == null ? void 0 : p.current,
syntheticEvent: e.syntheticEvent,
nativeEvent: e.nativeEvent,
targetEvent: e,
...t
};
g.onPageChange && g.onPageChange(a);
}, ge = u(we, r), ue = u(Ke, r), ce = u(xe, r), fe = u(Be, r), A = u(Oe, r), _ = u(Te, r), F = u(qe, r), $ = u(Ae, r), E = u(_e, r), de = `${i.toLanguageString(
F.messageKey,
F.defaultMessage
)} ${z.format(i.toLanguageString(E.messageKey, E.defaultMessage), [
o
])} ${i.toLanguageString($.messageKey, $.defaultMessage)} ${z.format(
i.toLanguageString(E.messageKey, E.defaultMessage),
[c]
)}`, I = (t, e, a, L, w, K) => /* @__PURE__ */ n.createElement(
Le,
{
fillMode: "flat",
themeColor: "base",
size: f,
rounded: null,
className: e,
icon: L,
svgIcon: w,
title: a,
role: "button",
"aria-disabled": K,
tabIndex: m ? -1 : void 0,
onClick: (R) => {
R.preventDefault(), d(t, R);
}
}
), V = B && /* @__PURE__ */ n.createElement(
ke,
{
pageChange: le,
pageSize: v,
pageSizes: B,
value: ae,
messagesMap: r,
size: f,
navigatable: m
}
), G = Z && /* @__PURE__ */ n.createElement("span", { className: "k-pager-info" }, z.format(i.toLanguageString(A.messageKey, A.defaultMessage), [
Math.min(N + 1, C),
Math.min(N + v, C),
C
])), me = ee === "numeric" ? /* @__PURE__ */ n.createElement(
ze,
{
type: M && !T ? "dropdown" : "numbers",
buttonCount: x || 0,
totalPages: c,
currentPage: o,
pageChange: d,
messagesMap: r,
size: f,
navigatable: m
}
) : /* @__PURE__ */ n.createElement(
De,
{
buttonCount: x || 0,
totalPages: c,
currentPage: o,
pageChange: d,
messagesMap: r,
size: f,
navigatable: m
}
);
let H, W, j, U;
if (ne) {
const t = S(i, ge), {
rtlClass: e,
rtlIcon: a,
isDisabledClass: L,
isDisabled: w
} = Je(y, o, b);
H = I(1, L, t, e, a, w);
const K = S(i, ue), {
rtlClass: R,
rtlIcon: pe,
isDisabledClass: be,
isDisabled: Pe
} = Qe(y, o, b);
W = I(o - 1, be, K, R, pe, Pe);
const Ce = S(i, ce), {
rtlClass: ve,
rtlIcon: Me,
isDisabledClass: he,
isDisabled: ye
} = Xe(y, o, c, b);
j = I(o + 1, he, Ce, ve, Me, ye);
const Ee = S(i, fe), {
rtlClass: Ie,
rtlIcon: Re,
isDisabledClass: Se,
isDisabled: Ne
} = Ye(y, o, c, b);
U = I(c, Se, Ee, Ie, Re, Ne);
}
return /* @__PURE__ */ n.createElement(
"div",
{
ref: h,
className: J(
"k-pager",
{
[`k-pager-${Ve.sizeMap[f] || f}`]: f,
"k-disabled": b
},
te
),
style: se,
role: "application",
"aria-roledescription": "pager",
dir: O,
"aria-keyshortcuts": i.toLanguageString(
_.messageKey,
_.defaultMessage
),
"aria-label": de,
tabIndex: m ? 0 : void 0,
onKeyDown: ie
},
/* @__PURE__ */ n.createElement("div", { className: J("k-pager-numbers-wrap") }, H, W, me, j, U),
M ? T && V : V,
M ? oe && G : G
);
}), P = {
buttonCount: 10,
info: !0,
type: "numeric",
size: "medium",
disabled: !1
};
X.displayName = "Pager";
X.propTypes = {
className: s.string,
style: s.object,
total: s.number.isRequired,
skip: s.number.isRequired,
take: s.number.isRequired,
buttonCount: s.number,
info: s.bool,
type: s.oneOf(["numeric", "input"]),
pageSizes: s.oneOfType([
s.arrayOf(s.number.isRequired),
s.arrayOf(s.oneOfType([s.number.isRequired, s.string.isRequired]).isRequired)
]),
previousNext: s.bool,
onPageChange: s.func,
messagesMap: s.func,
size: s.oneOf([null, "small", "medium", "large"]),
dir: s.string,
disabled: s.bool
};
export {
X as Pager
};