asterui 0.12.56 → 0.12.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/DatePicker.d.ts +3 -1
- package/dist/components/DatePicker.js +85 -83
- package/dist/components/DatePicker.js.map +1 -1
- package/dist/components/Dropdown.d.ts +5 -4
- package/dist/components/Dropdown.js +228 -222
- package/dist/components/Dropdown.js.map +1 -1
- package/dist/components/InputNumber.d.ts +2 -0
- package/dist/components/InputNumber.js +92 -88
- package/dist/components/InputNumber.js.map +1 -1
- package/dist/components/Menu.d.ts +3 -1
- package/dist/components/Menu.js +38 -37
- package/dist/components/Menu.js.map +1 -1
- package/dist/components/Modal.d.ts +40 -18
- package/dist/components/Modal.js +180 -156
- package/dist/components/Modal.js.map +1 -1
- package/dist/components/OTPInput.d.ts +2 -0
- package/dist/components/OTPInput.js +55 -53
- package/dist/components/OTPInput.js.map +1 -1
- package/dist/components/Pagination.d.ts +3 -1
- package/dist/components/Pagination.js +104 -90
- package/dist/components/Pagination.js.map +1 -1
- package/dist/components/Popconfirm.d.ts +3 -1
- package/dist/components/Popconfirm.js +63 -59
- package/dist/components/Popconfirm.js.map +1 -1
- package/dist/components/Tabs.d.ts +3 -2
- package/dist/components/Tabs.js +74 -72
- package/dist/components/Tabs.js.map +1 -1
- package/dist/components/Transfer.d.ts +3 -1
- package/dist/components/Transfer.js +127 -120
- package/dist/components/Transfer.js.map +1 -1
- package/dist/components/Upload.d.ts +3 -1
- package/dist/components/Upload.js +144 -142
- package/dist/components/Upload.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,105 +1,107 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { forwardRef as
|
|
3
|
-
import { useConfig as
|
|
4
|
-
const
|
|
1
|
+
import { jsx as O } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as M, useState as V, useRef as Z, useImperativeHandle as B, useEffect as j, useCallback as l } from "react";
|
|
3
|
+
import { useConfig as F } from "./ConfigProvider.js";
|
|
4
|
+
const H = "input", X = "input-xs", q = "input-sm", G = "input-lg", J = "input-error", Q = "input-disabled", U = M(
|
|
5
5
|
({
|
|
6
6
|
length: r = 6,
|
|
7
7
|
value: p = "",
|
|
8
8
|
onChange: o,
|
|
9
9
|
onComplete: m,
|
|
10
|
-
size:
|
|
10
|
+
size: k,
|
|
11
11
|
type: u = "number",
|
|
12
|
-
mask:
|
|
12
|
+
mask: y = !1,
|
|
13
13
|
disabled: c = !1,
|
|
14
|
-
error:
|
|
15
|
-
autoFocus:
|
|
16
|
-
placeholder:
|
|
17
|
-
className:
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
error: z = !1,
|
|
15
|
+
autoFocus: I = !1,
|
|
16
|
+
placeholder: P = "",
|
|
17
|
+
className: b = "",
|
|
18
|
+
"data-testid": w
|
|
19
|
+
}, g) => {
|
|
20
|
+
const { componentSize: R } = F(), S = (t) => w ? `${w}-${t}` : void 0, T = k ?? R ?? "md", [a, f] = V(() => {
|
|
20
21
|
const t = p.split("").slice(0, r);
|
|
21
22
|
return [...t, ...Array(r - t.length).fill("")];
|
|
22
|
-
}), n =
|
|
23
|
-
xs: `${
|
|
24
|
-
sm: `${
|
|
23
|
+
}), n = Z([]), E = {
|
|
24
|
+
xs: `${X} w-8 h-8 text-sm`,
|
|
25
|
+
sm: `${q} w-10 h-10 text-base`,
|
|
25
26
|
md: "w-12 h-12 text-lg",
|
|
26
|
-
lg: `${
|
|
27
|
+
lg: `${G} w-14 h-14 text-xl`,
|
|
27
28
|
xl: "w-16 h-16 text-2xl"
|
|
28
29
|
};
|
|
29
|
-
|
|
30
|
+
B(g, () => ({
|
|
30
31
|
focus: () => {
|
|
31
32
|
n.current[0]?.focus();
|
|
32
33
|
},
|
|
33
34
|
clear: () => {
|
|
34
|
-
|
|
35
|
+
f(Array(r).fill("")), n.current[0]?.focus();
|
|
35
36
|
}
|
|
36
|
-
})),
|
|
37
|
-
|
|
38
|
-
}, [
|
|
37
|
+
})), j(() => {
|
|
38
|
+
I && n.current[0]?.focus();
|
|
39
|
+
}, [I]), j(() => {
|
|
39
40
|
const t = p.split("").slice(0, r);
|
|
40
|
-
|
|
41
|
+
f([...t, ...Array(r - t.length).fill("")]);
|
|
41
42
|
}, [p, r]);
|
|
42
|
-
const
|
|
43
|
+
const $ = l(
|
|
43
44
|
(t, e) => {
|
|
44
45
|
if (c || u === "number" && !/^\d*$/.test(e) || u === "text" && !/^[a-zA-Z0-9]*$/.test(e)) return;
|
|
45
|
-
const s = [...
|
|
46
|
+
const s = [...a];
|
|
46
47
|
if (e.length > 1) {
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
t +
|
|
50
|
-
}),
|
|
48
|
+
const v = e.slice(0, r - t).split("");
|
|
49
|
+
v.forEach((K, A) => {
|
|
50
|
+
t + A < r && (s[t + A] = K);
|
|
51
|
+
}), f(s);
|
|
51
52
|
const D = s.join("");
|
|
52
53
|
o?.(D);
|
|
53
|
-
const
|
|
54
|
-
n.current[
|
|
54
|
+
const x = Math.min(t + v.length, r - 1);
|
|
55
|
+
n.current[x]?.focus(), D.length === r && m?.(D);
|
|
55
56
|
return;
|
|
56
57
|
}
|
|
57
|
-
s[t] = e,
|
|
58
|
+
s[t] = e, f(s);
|
|
58
59
|
const i = s.join("");
|
|
59
60
|
o?.(i), e && t < r - 1 && n.current[t + 1]?.focus(), i.length === r && !i.includes("") && m?.(i);
|
|
60
61
|
},
|
|
61
|
-
[
|
|
62
|
-
),
|
|
62
|
+
[a, r, u, c, o, m]
|
|
63
|
+
), L = l(
|
|
63
64
|
(t, e) => {
|
|
64
65
|
if (!c)
|
|
65
66
|
if (e.key === "Backspace") {
|
|
66
67
|
e.preventDefault();
|
|
67
|
-
const s = [...
|
|
68
|
-
|
|
68
|
+
const s = [...a];
|
|
69
|
+
a[t] ? (s[t] = "", f(s), o?.(s.join(""))) : t > 0 && (s[t - 1] = "", f(s), o?.(s.join("")), n.current[t - 1]?.focus());
|
|
69
70
|
} else e.key === "ArrowLeft" && t > 0 ? (e.preventDefault(), n.current[t - 1]?.focus()) : e.key === "ArrowRight" && t < r - 1 && (e.preventDefault(), n.current[t + 1]?.focus());
|
|
70
71
|
},
|
|
71
|
-
[
|
|
72
|
-
),
|
|
72
|
+
[a, r, c, o]
|
|
73
|
+
), N = l(
|
|
73
74
|
(t) => {
|
|
74
75
|
if (t.preventDefault(), c) return;
|
|
75
76
|
const e = t.clipboardData.getData("text"), s = u === "number" ? e.replace(/\D/g, "") : e.replace(/[^a-zA-Z0-9]/g, "");
|
|
76
|
-
s &&
|
|
77
|
+
s && $(0, s);
|
|
77
78
|
},
|
|
78
|
-
[u, c,
|
|
79
|
-
),
|
|
79
|
+
[u, c, $]
|
|
80
|
+
), d = l((t) => {
|
|
80
81
|
t.target.select();
|
|
81
82
|
}, []);
|
|
82
|
-
return /* @__PURE__ */
|
|
83
|
+
return /* @__PURE__ */ O("div", { className: `flex gap-2 ${b}`, "data-testid": w, children: a.map((t, e) => /* @__PURE__ */ O(
|
|
83
84
|
"input",
|
|
84
85
|
{
|
|
85
86
|
ref: (s) => {
|
|
86
87
|
n.current[e] = s;
|
|
87
88
|
},
|
|
88
|
-
|
|
89
|
+
"data-testid": S(`input-${e}`),
|
|
90
|
+
type: y ? "password" : u === "number" ? "tel" : "text",
|
|
89
91
|
inputMode: u === "number" ? "numeric" : "text",
|
|
90
92
|
maxLength: 1,
|
|
91
93
|
value: t,
|
|
92
|
-
placeholder:
|
|
94
|
+
placeholder: P,
|
|
93
95
|
disabled: c,
|
|
94
|
-
onChange: (s) =>
|
|
95
|
-
onKeyDown: (s) =>
|
|
96
|
-
onPaste:
|
|
97
|
-
onFocus:
|
|
96
|
+
onChange: (s) => $(e, s.target.value),
|
|
97
|
+
onKeyDown: (s) => L(e, s),
|
|
98
|
+
onPaste: N,
|
|
99
|
+
onFocus: d,
|
|
98
100
|
className: `
|
|
99
|
-
${
|
|
100
|
-
${
|
|
101
|
-
${
|
|
102
|
-
${c ? `${
|
|
101
|
+
${H} text-center font-mono
|
|
102
|
+
${E[T]}
|
|
103
|
+
${z ? J : ""}
|
|
104
|
+
${c ? `${Q} opacity-50` : ""}
|
|
103
105
|
`,
|
|
104
106
|
"aria-label": `OTP digit ${e + 1}`
|
|
105
107
|
},
|
|
@@ -107,8 +109,8 @@ const F = "input", H = "input-xs", X = "input-sm", q = "input-lg", G = "input-er
|
|
|
107
109
|
)) });
|
|
108
110
|
}
|
|
109
111
|
);
|
|
110
|
-
|
|
112
|
+
U.displayName = "OTPInput";
|
|
111
113
|
export {
|
|
112
|
-
|
|
114
|
+
U as OTPInput
|
|
113
115
|
};
|
|
114
116
|
//# sourceMappingURL=OTPInput.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OTPInput.js","sources":["../../src/components/OTPInput.tsx"],"sourcesContent":["import React, { useRef, useState, useEffect, useCallback, forwardRef, useImperativeHandle } from 'react'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dInput = 'input'\nconst dInputXs = 'input-xs'\nconst dInputSm = 'input-sm'\nconst dInputLg = 'input-lg'\nconst dInputError = 'input-error'\nconst dInputDisabled = 'input-disabled'\n\nexport interface OTPInputProps {\n /** Number of input fields */\n length?: number\n /** Current value */\n value?: string\n /** Callback when value changes */\n onChange?: (value: string) => void\n /** Callback when all fields are filled */\n onComplete?: (value: string) => void\n /** Input size */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Input type - number only or alphanumeric */\n type?: 'number' | 'text'\n /** Mask input (show dots instead of characters) */\n mask?: boolean\n /** Disabled state */\n disabled?: boolean\n /** Error state */\n error?: boolean\n /** Auto focus first input on mount */\n autoFocus?: boolean\n /** Placeholder character */\n placeholder?: string\n /** Additional CSS classes */\n className?: string\n}\n\nexport interface OTPInputRef {\n focus: () => void\n clear: () => void\n}\n\nexport const OTPInput = forwardRef<OTPInputRef, OTPInputProps>(\n (\n {\n length = 6,\n value = '',\n onChange,\n onComplete,\n size,\n type = 'number',\n mask = false,\n disabled = false,\n error = false,\n autoFocus = false,\n placeholder = '',\n className = '',\n },\n ref\n ) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n const [otp, setOtp] = useState<string[]>(() => {\n const initial = value.split('').slice(0, length)\n return [...initial, ...Array(length - initial.length).fill('')]\n })\n\n const inputRefs = useRef<(HTMLInputElement | null)[]>([])\n\n const sizeClasses = {\n xs: `${dInputXs} w-8 h-8 text-sm`,\n sm: `${dInputSm} w-10 h-10 text-base`,\n md: 'w-12 h-12 text-lg',\n lg: `${dInputLg} w-14 h-14 text-xl`,\n xl: 'w-16 h-16 text-2xl',\n }\n\n useImperativeHandle(ref, () => ({\n focus: () => {\n inputRefs.current[0]?.focus()\n },\n clear: () => {\n setOtp(Array(length).fill(''))\n inputRefs.current[0]?.focus()\n },\n }))\n\n useEffect(() => {\n if (autoFocus) {\n inputRefs.current[0]?.focus()\n }\n }, [autoFocus])\n\n useEffect(() => {\n const newOtp = value.split('').slice(0, length)\n setOtp([...newOtp, ...Array(length - newOtp.length).fill('')])\n }, [value, length])\n\n const handleChange = useCallback(\n (index: number, char: string) => {\n if (disabled) return\n\n // Validate input\n if (type === 'number' && !/^\\d*$/.test(char)) return\n if (type === 'text' && !/^[a-zA-Z0-9]*$/.test(char)) return\n\n const newOtp = [...otp]\n\n // Handle paste of multiple characters\n if (char.length > 1) {\n const chars = char.slice(0, length - index).split('')\n chars.forEach((c, i) => {\n if (index + i < length) {\n newOtp[index + i] = c\n }\n })\n setOtp(newOtp)\n\n const newValue = newOtp.join('')\n onChange?.(newValue)\n\n // Focus appropriate field\n const nextIndex = Math.min(index + chars.length, length - 1)\n inputRefs.current[nextIndex]?.focus()\n\n if (newValue.length === length) {\n onComplete?.(newValue)\n }\n return\n }\n\n // Single character\n newOtp[index] = char\n setOtp(newOtp)\n\n const newValue = newOtp.join('')\n onChange?.(newValue)\n\n // Move to next input\n if (char && index < length - 1) {\n inputRefs.current[index + 1]?.focus()\n }\n\n if (newValue.length === length && !newValue.includes('')) {\n onComplete?.(newValue)\n }\n },\n [otp, length, type, disabled, onChange, onComplete]\n )\n\n const handleKeyDown = useCallback(\n (index: number, e: React.KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return\n\n if (e.key === 'Backspace') {\n e.preventDefault()\n const newOtp = [...otp]\n\n if (otp[index]) {\n // Clear current field\n newOtp[index] = ''\n setOtp(newOtp)\n onChange?.(newOtp.join(''))\n } else if (index > 0) {\n // Move to previous field and clear it\n newOtp[index - 1] = ''\n setOtp(newOtp)\n onChange?.(newOtp.join(''))\n inputRefs.current[index - 1]?.focus()\n }\n } else if (e.key === 'ArrowLeft' && index > 0) {\n e.preventDefault()\n inputRefs.current[index - 1]?.focus()\n } else if (e.key === 'ArrowRight' && index < length - 1) {\n e.preventDefault()\n inputRefs.current[index + 1]?.focus()\n }\n },\n [otp, length, disabled, onChange]\n )\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent) => {\n e.preventDefault()\n if (disabled) return\n\n const pastedData = e.clipboardData.getData('text')\n const filteredData =\n type === 'number'\n ? pastedData.replace(/\\D/g, '')\n : pastedData.replace(/[^a-zA-Z0-9]/g, '')\n\n if (filteredData) {\n handleChange(0, filteredData)\n }\n },\n [type, disabled, handleChange]\n )\n\n const handleFocus = useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n e.target.select()\n }, [])\n\n return (\n <div className={`flex gap-2 ${className}`}>\n {otp.map((digit, index) => (\n <input\n key={index}\n ref={(el) => {\n inputRefs.current[index] = el\n }}\n type={mask ? 'password' : type === 'number' ? 'tel' : 'text'}\n inputMode={type === 'number' ? 'numeric' : 'text'}\n maxLength={1}\n value={digit}\n placeholder={placeholder}\n disabled={disabled}\n onChange={(e) => handleChange(index, e.target.value)}\n onKeyDown={(e) => handleKeyDown(index, e)}\n onPaste={handlePaste}\n onFocus={handleFocus}\n className={`\n ${dInput} text-center font-mono\n ${sizeClasses[effectiveSize]}\n ${error ? dInputError : ''}\n ${disabled ? `${dInputDisabled} opacity-50` : ''}\n `}\n aria-label={`OTP digit ${index + 1}`}\n />\n ))}\n </div>\n )\n }\n)\n\nOTPInput.displayName = 'OTPInput'\n"],"names":["dInput","dInputXs","dInputSm","dInputLg","dInputError","dInputDisabled","OTPInput","forwardRef","length","value","onChange","onComplete","size","type","mask","disabled","error","autoFocus","placeholder","className","ref","componentSize","useConfig","effectiveSize","otp","setOtp","useState","initial","inputRefs","useRef","sizeClasses","useImperativeHandle","useEffect","newOtp","handleChange","useCallback","index","char","chars","c","i","newValue","nextIndex","handleKeyDown","handlePaste","e","pastedData","filteredData","handleFocus","jsx","digit","el"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OTPInput.js","sources":["../../src/components/OTPInput.tsx"],"sourcesContent":["import React, { useRef, useState, useEffect, useCallback, forwardRef, useImperativeHandle } from 'react'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dInput = 'input'\nconst dInputXs = 'input-xs'\nconst dInputSm = 'input-sm'\nconst dInputLg = 'input-lg'\nconst dInputError = 'input-error'\nconst dInputDisabled = 'input-disabled'\n\nexport interface OTPInputProps {\n /** Number of input fields */\n length?: number\n /** Current value */\n value?: string\n /** Callback when value changes */\n onChange?: (value: string) => void\n /** Callback when all fields are filled */\n onComplete?: (value: string) => void\n /** Input size */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Input type - number only or alphanumeric */\n type?: 'number' | 'text'\n /** Mask input (show dots instead of characters) */\n mask?: boolean\n /** Disabled state */\n disabled?: boolean\n /** Error state */\n error?: boolean\n /** Auto focus first input on mount */\n autoFocus?: boolean\n /** Placeholder character */\n placeholder?: string\n /** Additional CSS classes */\n className?: string\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport interface OTPInputRef {\n focus: () => void\n clear: () => void\n}\n\nexport const OTPInput = forwardRef<OTPInputRef, OTPInputProps>(\n (\n {\n length = 6,\n value = '',\n onChange,\n onComplete,\n size,\n type = 'number',\n mask = false,\n disabled = false,\n error = false,\n autoFocus = false,\n placeholder = '',\n className = '',\n 'data-testid': testId,\n },\n ref\n ) => {\n const { componentSize } = useConfig()\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n const effectiveSize = size ?? componentSize ?? 'md'\n const [otp, setOtp] = useState<string[]>(() => {\n const initial = value.split('').slice(0, length)\n return [...initial, ...Array(length - initial.length).fill('')]\n })\n\n const inputRefs = useRef<(HTMLInputElement | null)[]>([])\n\n const sizeClasses = {\n xs: `${dInputXs} w-8 h-8 text-sm`,\n sm: `${dInputSm} w-10 h-10 text-base`,\n md: 'w-12 h-12 text-lg',\n lg: `${dInputLg} w-14 h-14 text-xl`,\n xl: 'w-16 h-16 text-2xl',\n }\n\n useImperativeHandle(ref, () => ({\n focus: () => {\n inputRefs.current[0]?.focus()\n },\n clear: () => {\n setOtp(Array(length).fill(''))\n inputRefs.current[0]?.focus()\n },\n }))\n\n useEffect(() => {\n if (autoFocus) {\n inputRefs.current[0]?.focus()\n }\n }, [autoFocus])\n\n useEffect(() => {\n const newOtp = value.split('').slice(0, length)\n setOtp([...newOtp, ...Array(length - newOtp.length).fill('')])\n }, [value, length])\n\n const handleChange = useCallback(\n (index: number, char: string) => {\n if (disabled) return\n\n // Validate input\n if (type === 'number' && !/^\\d*$/.test(char)) return\n if (type === 'text' && !/^[a-zA-Z0-9]*$/.test(char)) return\n\n const newOtp = [...otp]\n\n // Handle paste of multiple characters\n if (char.length > 1) {\n const chars = char.slice(0, length - index).split('')\n chars.forEach((c, i) => {\n if (index + i < length) {\n newOtp[index + i] = c\n }\n })\n setOtp(newOtp)\n\n const newValue = newOtp.join('')\n onChange?.(newValue)\n\n // Focus appropriate field\n const nextIndex = Math.min(index + chars.length, length - 1)\n inputRefs.current[nextIndex]?.focus()\n\n if (newValue.length === length) {\n onComplete?.(newValue)\n }\n return\n }\n\n // Single character\n newOtp[index] = char\n setOtp(newOtp)\n\n const newValue = newOtp.join('')\n onChange?.(newValue)\n\n // Move to next input\n if (char && index < length - 1) {\n inputRefs.current[index + 1]?.focus()\n }\n\n if (newValue.length === length && !newValue.includes('')) {\n onComplete?.(newValue)\n }\n },\n [otp, length, type, disabled, onChange, onComplete]\n )\n\n const handleKeyDown = useCallback(\n (index: number, e: React.KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return\n\n if (e.key === 'Backspace') {\n e.preventDefault()\n const newOtp = [...otp]\n\n if (otp[index]) {\n // Clear current field\n newOtp[index] = ''\n setOtp(newOtp)\n onChange?.(newOtp.join(''))\n } else if (index > 0) {\n // Move to previous field and clear it\n newOtp[index - 1] = ''\n setOtp(newOtp)\n onChange?.(newOtp.join(''))\n inputRefs.current[index - 1]?.focus()\n }\n } else if (e.key === 'ArrowLeft' && index > 0) {\n e.preventDefault()\n inputRefs.current[index - 1]?.focus()\n } else if (e.key === 'ArrowRight' && index < length - 1) {\n e.preventDefault()\n inputRefs.current[index + 1]?.focus()\n }\n },\n [otp, length, disabled, onChange]\n )\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent) => {\n e.preventDefault()\n if (disabled) return\n\n const pastedData = e.clipboardData.getData('text')\n const filteredData =\n type === 'number'\n ? pastedData.replace(/\\D/g, '')\n : pastedData.replace(/[^a-zA-Z0-9]/g, '')\n\n if (filteredData) {\n handleChange(0, filteredData)\n }\n },\n [type, disabled, handleChange]\n )\n\n const handleFocus = useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n e.target.select()\n }, [])\n\n return (\n <div className={`flex gap-2 ${className}`} data-testid={testId}>\n {otp.map((digit, index) => (\n <input\n key={index}\n ref={(el) => {\n inputRefs.current[index] = el\n }}\n data-testid={getTestId(`input-${index}`)}\n type={mask ? 'password' : type === 'number' ? 'tel' : 'text'}\n inputMode={type === 'number' ? 'numeric' : 'text'}\n maxLength={1}\n value={digit}\n placeholder={placeholder}\n disabled={disabled}\n onChange={(e) => handleChange(index, e.target.value)}\n onKeyDown={(e) => handleKeyDown(index, e)}\n onPaste={handlePaste}\n onFocus={handleFocus}\n className={`\n ${dInput} text-center font-mono\n ${sizeClasses[effectiveSize]}\n ${error ? dInputError : ''}\n ${disabled ? `${dInputDisabled} opacity-50` : ''}\n `}\n aria-label={`OTP digit ${index + 1}`}\n />\n ))}\n </div>\n )\n }\n)\n\nOTPInput.displayName = 'OTPInput'\n"],"names":["dInput","dInputXs","dInputSm","dInputLg","dInputError","dInputDisabled","OTPInput","forwardRef","length","value","onChange","onComplete","size","type","mask","disabled","error","autoFocus","placeholder","className","testId","ref","componentSize","useConfig","getTestId","suffix","effectiveSize","otp","setOtp","useState","initial","inputRefs","useRef","sizeClasses","useImperativeHandle","useEffect","newOtp","handleChange","useCallback","index","char","chars","c","i","newValue","nextIndex","handleKeyDown","handlePaste","e","pastedData","filteredData","handleFocus","jsx","digit","el"],"mappings":"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"}
|
|
@@ -14,5 +14,7 @@ export interface PaginationProps extends Omit<React.HTMLAttributes<HTMLDivElemen
|
|
|
14
14
|
simple?: boolean;
|
|
15
15
|
size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
16
16
|
disabled?: boolean;
|
|
17
|
+
/** Test ID prefix for child elements */
|
|
18
|
+
'data-testid'?: string;
|
|
17
19
|
}
|
|
18
|
-
export declare const Pagination: React.
|
|
20
|
+
export declare const Pagination: React.ForwardRefExoticComponent<PaginationProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -1,35 +1,36 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import
|
|
3
|
-
import { useConfig as
|
|
4
|
-
const
|
|
5
|
-
current:
|
|
6
|
-
defaultCurrent:
|
|
7
|
-
total:
|
|
8
|
-
pageSize:
|
|
9
|
-
defaultPageSize:
|
|
10
|
-
pageSizeOptions:
|
|
1
|
+
import { jsxs as u, jsx as a } from "react/jsx-runtime";
|
|
2
|
+
import x, { forwardRef as V } from "react";
|
|
3
|
+
import { useConfig as W } from "./ConfigProvider.js";
|
|
4
|
+
const d = "btn", T = "btn-ghost", Y = "btn-active", Z = "btn-disabled", _ = "btn-xs", ee = "btn-sm", te = "btn-lg", se = "btn-xl", ne = "select", ae = "select-bordered", ie = "join", p = "join-item", le = "input", me = V(function({
|
|
5
|
+
current: f,
|
|
6
|
+
defaultCurrent: y = 1,
|
|
7
|
+
total: h,
|
|
8
|
+
pageSize: b,
|
|
9
|
+
defaultPageSize: J = 10,
|
|
10
|
+
pageSizeOptions: w = [10, 20, 50, 100],
|
|
11
11
|
onChange: N,
|
|
12
12
|
onShowSizeChange: I,
|
|
13
|
-
showSizeChanger:
|
|
14
|
-
showQuickJumper:
|
|
15
|
-
showTotal:
|
|
16
|
-
simple:
|
|
17
|
-
size:
|
|
18
|
-
disabled:
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
13
|
+
showSizeChanger: M = !1,
|
|
14
|
+
showQuickJumper: z = !1,
|
|
15
|
+
showTotal: v = !1,
|
|
16
|
+
simple: D = !1,
|
|
17
|
+
size: G,
|
|
18
|
+
disabled: l = !1,
|
|
19
|
+
"data-testid": g,
|
|
20
|
+
className: P = "",
|
|
21
|
+
...C
|
|
22
|
+
}, B) {
|
|
23
|
+
const { componentSize: L, locale: R } = W(), X = G ?? L ?? "md", i = (e) => g ? `${g}-${e}` : void 0, m = R.Pagination ?? {}, A = m.itemsPerPage ?? "/ page", E = m.goTo ?? "Go to", [F, S] = x.useState(y), [K, q] = x.useState(J), [k, j] = x.useState(""), t = f !== void 0 ? f : F, $ = b !== void 0 ? b : K, n = Math.ceil(h / $), r = (e) => {
|
|
24
|
+
e < 1 || e > n || l || (f === void 0 && S(e), N?.(e, $));
|
|
25
|
+
}, H = (e) => {
|
|
26
|
+
const o = Math.ceil(h / e), s = t > o ? o : t;
|
|
27
|
+
b === void 0 && q(e), f === void 0 && s !== t && S(s), I?.(s, e), N?.(s, e);
|
|
28
|
+
}, O = (e) => {
|
|
28
29
|
if (e.key === "Enter") {
|
|
29
|
-
const
|
|
30
|
-
!isNaN(
|
|
30
|
+
const o = parseInt(k);
|
|
31
|
+
!isNaN(o) && o >= 1 && o <= n && (r(o), j(""));
|
|
31
32
|
}
|
|
32
|
-
},
|
|
33
|
+
}, Q = () => {
|
|
33
34
|
const e = [];
|
|
34
35
|
if (n <= 7)
|
|
35
36
|
for (let s = 1; s <= n; s++)
|
|
@@ -50,126 +51,139 @@ const r = "btn", B = "btn-ghost", q = "btn-active", H = "btn-disabled", O = "btn
|
|
|
50
51
|
}
|
|
51
52
|
return e;
|
|
52
53
|
}, c = {
|
|
53
|
-
xs:
|
|
54
|
-
sm:
|
|
54
|
+
xs: _,
|
|
55
|
+
sm: ee,
|
|
55
56
|
md: "",
|
|
56
|
-
lg:
|
|
57
|
-
xl:
|
|
58
|
-
}[
|
|
59
|
-
(t - 1) *
|
|
60
|
-
Math.min(t *
|
|
57
|
+
lg: te,
|
|
58
|
+
xl: se
|
|
59
|
+
}[X], U = [
|
|
60
|
+
(t - 1) * $ + 1,
|
|
61
|
+
Math.min(t * $, h)
|
|
61
62
|
];
|
|
62
|
-
return
|
|
63
|
-
/* @__PURE__ */
|
|
63
|
+
return D ? /* @__PURE__ */ u("div", { ref: B, className: `flex items-center gap-2 ${P}`, "data-testid": g, ...C, children: [
|
|
64
|
+
/* @__PURE__ */ a(
|
|
64
65
|
"button",
|
|
65
66
|
{
|
|
66
|
-
className: `${
|
|
67
|
-
onClick: () =>
|
|
68
|
-
disabled:
|
|
67
|
+
className: `${d} ${T} ${c}`,
|
|
68
|
+
onClick: () => r(t - 1),
|
|
69
|
+
disabled: l || t === 1,
|
|
70
|
+
"data-testid": i("prev"),
|
|
71
|
+
"aria-label": m.prev ?? "Previous",
|
|
69
72
|
children: "‹"
|
|
70
73
|
}
|
|
71
74
|
),
|
|
72
|
-
/* @__PURE__ */
|
|
75
|
+
/* @__PURE__ */ u("span", { className: "text-sm", children: [
|
|
73
76
|
t,
|
|
74
77
|
" / ",
|
|
75
78
|
n
|
|
76
79
|
] }),
|
|
77
|
-
/* @__PURE__ */
|
|
80
|
+
/* @__PURE__ */ a(
|
|
78
81
|
"button",
|
|
79
82
|
{
|
|
80
|
-
className: `${
|
|
81
|
-
onClick: () =>
|
|
82
|
-
disabled:
|
|
83
|
+
className: `${d} ${T} ${c}`,
|
|
84
|
+
onClick: () => r(t + 1),
|
|
85
|
+
disabled: l || t === n,
|
|
86
|
+
"data-testid": i("next"),
|
|
87
|
+
"aria-label": m.next ?? "Next",
|
|
83
88
|
children: "›"
|
|
84
89
|
}
|
|
85
90
|
)
|
|
86
|
-
] }) : /* @__PURE__ */
|
|
87
|
-
|
|
88
|
-
|
|
91
|
+
] }) : /* @__PURE__ */ u("div", { ref: B, className: `flex flex-wrap items-center gap-4 ${P}`, "data-testid": g, ...C, children: [
|
|
92
|
+
v && /* @__PURE__ */ a("div", { className: "text-sm text-base-content/70", "data-testid": i("total"), children: typeof v == "function" ? v(h, U) : `Total ${h} ${m.items ?? "items"}` }),
|
|
93
|
+
M && /* @__PURE__ */ a(
|
|
89
94
|
"select",
|
|
90
95
|
{
|
|
91
|
-
className: `${
|
|
92
|
-
value:
|
|
93
|
-
onChange: (e) =>
|
|
94
|
-
disabled:
|
|
95
|
-
|
|
96
|
+
className: `${ne} ${ae} ${c}`,
|
|
97
|
+
value: $,
|
|
98
|
+
onChange: (e) => H(Number(e.target.value)),
|
|
99
|
+
disabled: l,
|
|
100
|
+
"data-testid": i("size-changer"),
|
|
101
|
+
children: w.map((e) => /* @__PURE__ */ u("option", { value: e, children: [
|
|
96
102
|
e,
|
|
97
|
-
"
|
|
103
|
+
" ",
|
|
104
|
+
A
|
|
98
105
|
] }, e))
|
|
99
106
|
}
|
|
100
107
|
),
|
|
101
|
-
/* @__PURE__ */
|
|
102
|
-
/* @__PURE__ */
|
|
108
|
+
/* @__PURE__ */ u("div", { className: ie, "data-testid": i("controls"), children: [
|
|
109
|
+
/* @__PURE__ */ a(
|
|
103
110
|
"button",
|
|
104
111
|
{
|
|
105
|
-
className: `${
|
|
106
|
-
onClick: () =>
|
|
107
|
-
disabled:
|
|
108
|
-
|
|
112
|
+
className: `${p} ${d} ${c}`,
|
|
113
|
+
onClick: () => r(1),
|
|
114
|
+
disabled: l || t === 1,
|
|
115
|
+
"aria-label": "First page",
|
|
116
|
+
"data-testid": i("first"),
|
|
109
117
|
children: "«"
|
|
110
118
|
}
|
|
111
119
|
),
|
|
112
|
-
/* @__PURE__ */
|
|
120
|
+
/* @__PURE__ */ a(
|
|
113
121
|
"button",
|
|
114
122
|
{
|
|
115
|
-
className: `${
|
|
116
|
-
onClick: () =>
|
|
117
|
-
disabled:
|
|
118
|
-
|
|
123
|
+
className: `${p} ${d} ${c}`,
|
|
124
|
+
onClick: () => r(t - 1),
|
|
125
|
+
disabled: l || t === 1,
|
|
126
|
+
"aria-label": m.prev ?? "Previous",
|
|
127
|
+
"data-testid": i("prev"),
|
|
119
128
|
children: "‹"
|
|
120
129
|
}
|
|
121
130
|
),
|
|
122
|
-
|
|
131
|
+
Q().map((e, o) => e === "ellipsis" ? /* @__PURE__ */ a("button", { className: `${p} ${d} ${Z} ${c}`, children: "..." }, `ellipsis-${o}`) : /* @__PURE__ */ a(
|
|
123
132
|
"button",
|
|
124
133
|
{
|
|
125
|
-
className: `${
|
|
126
|
-
onClick: () =>
|
|
127
|
-
disabled:
|
|
134
|
+
className: `${p} ${d} ${c} ${t === e ? Y : ""}`,
|
|
135
|
+
onClick: () => r(e),
|
|
136
|
+
disabled: l,
|
|
137
|
+
"data-testid": i(`page-${e}`),
|
|
138
|
+
"aria-current": t === e ? "page" : void 0,
|
|
128
139
|
children: e
|
|
129
140
|
},
|
|
130
141
|
e
|
|
131
142
|
)),
|
|
132
|
-
/* @__PURE__ */
|
|
143
|
+
/* @__PURE__ */ a(
|
|
133
144
|
"button",
|
|
134
145
|
{
|
|
135
|
-
className: `${
|
|
136
|
-
onClick: () =>
|
|
137
|
-
disabled:
|
|
138
|
-
|
|
146
|
+
className: `${p} ${d} ${c}`,
|
|
147
|
+
onClick: () => r(t + 1),
|
|
148
|
+
disabled: l || t === n,
|
|
149
|
+
"aria-label": m.next ?? "Next",
|
|
150
|
+
"data-testid": i("next"),
|
|
139
151
|
children: "›"
|
|
140
152
|
}
|
|
141
153
|
),
|
|
142
|
-
/* @__PURE__ */
|
|
154
|
+
/* @__PURE__ */ a(
|
|
143
155
|
"button",
|
|
144
156
|
{
|
|
145
|
-
className: `${
|
|
146
|
-
onClick: () =>
|
|
147
|
-
disabled:
|
|
148
|
-
|
|
157
|
+
className: `${p} ${d} ${c}`,
|
|
158
|
+
onClick: () => r(n),
|
|
159
|
+
disabled: l || t === n,
|
|
160
|
+
"aria-label": "Last page",
|
|
161
|
+
"data-testid": i("last"),
|
|
149
162
|
children: "»"
|
|
150
163
|
}
|
|
151
164
|
)
|
|
152
165
|
] }),
|
|
153
|
-
|
|
154
|
-
/* @__PURE__ */
|
|
155
|
-
/* @__PURE__ */
|
|
166
|
+
z && /* @__PURE__ */ u("div", { className: "flex items-center gap-2", children: [
|
|
167
|
+
/* @__PURE__ */ a("span", { className: "text-sm", children: E }),
|
|
168
|
+
/* @__PURE__ */ a(
|
|
156
169
|
"input",
|
|
157
170
|
{
|
|
158
171
|
type: "number",
|
|
159
|
-
className: `${
|
|
172
|
+
className: `${le} w-16 ${c}`,
|
|
160
173
|
min: 1,
|
|
161
174
|
max: n,
|
|
162
|
-
value:
|
|
163
|
-
onChange: (e) =>
|
|
164
|
-
onKeyDown:
|
|
165
|
-
disabled:
|
|
166
|
-
placeholder: String(t)
|
|
175
|
+
value: k,
|
|
176
|
+
onChange: (e) => j(e.target.value),
|
|
177
|
+
onKeyDown: O,
|
|
178
|
+
disabled: l,
|
|
179
|
+
placeholder: String(t),
|
|
180
|
+
"data-testid": i("jumper")
|
|
167
181
|
}
|
|
168
182
|
)
|
|
169
183
|
] })
|
|
170
184
|
] });
|
|
171
|
-
};
|
|
185
|
+
});
|
|
172
186
|
export {
|
|
173
|
-
|
|
187
|
+
me as Pagination
|
|
174
188
|
};
|
|
175
189
|
//# sourceMappingURL=Pagination.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pagination.js","sources":["../../src/components/Pagination.tsx"],"sourcesContent":["import React from 'react'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dBtn = 'btn'\nconst dBtnGhost = 'btn-ghost'\nconst dBtnActive = 'btn-active'\nconst dBtnDisabled = 'btn-disabled'\nconst dBtnXs = 'btn-xs'\nconst dBtnSm = 'btn-sm'\nconst dBtnLg = 'btn-lg'\nconst dBtnXl = 'btn-xl'\nconst dSelect = 'select'\nconst dSelectBordered = 'select-bordered'\nconst dJoin = 'join'\nconst dJoinItem = 'join-item'\nconst dInput = 'input'\n\nexport interface PaginationProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n current?: number\n defaultCurrent?: number\n total: number\n pageSize?: number\n defaultPageSize?: number\n pageSizeOptions?: number[]\n onChange?: (page: number, pageSize: number) => void\n onShowSizeChange?: (current: number, size: number) => void\n showSizeChanger?: boolean\n showQuickJumper?: boolean\n showTotal?: boolean | ((total: number, range: [number, number]) => React.ReactNode)\n simple?: boolean\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n disabled?: boolean\n}\n\nexport const Pagination: React.FC<PaginationProps> = ({\n current: controlledCurrent,\n defaultCurrent = 1,\n total,\n pageSize: controlledPageSize,\n defaultPageSize = 10,\n pageSizeOptions = [10, 20, 50, 100],\n onChange,\n onShowSizeChange,\n showSizeChanger = false,\n showQuickJumper = false,\n showTotal = false,\n simple = false,\n size,\n disabled = false,\n className = '',\n ...rest\n}) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n const [internalCurrent, setInternalCurrent] = React.useState(defaultCurrent)\n const [internalPageSize, setInternalPageSize] = React.useState(defaultPageSize)\n const [jumpPage, setJumpPage] = React.useState('')\n\n const current = controlledCurrent !== undefined ? controlledCurrent : internalCurrent\n const pageSize = controlledPageSize !== undefined ? controlledPageSize : internalPageSize\n const totalPages = Math.ceil(total / pageSize)\n\n const handlePageChange = (page: number) => {\n if (page < 1 || page > totalPages || disabled) return\n\n if (controlledCurrent === undefined) {\n setInternalCurrent(page)\n }\n onChange?.(page, pageSize)\n }\n\n const handlePageSizeChange = (newSize: number) => {\n const newTotalPages = Math.ceil(total / newSize)\n const newCurrent = current > newTotalPages ? newTotalPages : current\n\n if (controlledPageSize === undefined) {\n setInternalPageSize(newSize)\n }\n if (controlledCurrent === undefined && newCurrent !== current) {\n setInternalCurrent(newCurrent)\n }\n\n onShowSizeChange?.(newCurrent, newSize)\n onChange?.(newCurrent, newSize)\n }\n\n const handleJumpPage = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n const page = parseInt(jumpPage)\n if (!isNaN(page) && page >= 1 && page <= totalPages) {\n handlePageChange(page)\n setJumpPage('')\n }\n }\n }\n\n const getPageNumbers = (): (number | 'ellipsis')[] => {\n const pages: (number | 'ellipsis')[] = []\n const showPages = 7\n\n if (totalPages <= showPages) {\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n if (current <= 3) {\n for (let i = 1; i <= 5; i++) {\n pages.push(i)\n }\n pages.push('ellipsis')\n pages.push(totalPages)\n } else if (current >= totalPages - 2) {\n pages.push(1)\n pages.push('ellipsis')\n for (let i = totalPages - 4; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n pages.push(1)\n pages.push('ellipsis')\n for (let i = current - 1; i <= current + 1; i++) {\n pages.push(i)\n }\n pages.push('ellipsis')\n pages.push(totalPages)\n }\n }\n\n return pages\n }\n\n const sizeClass = {\n xs: dBtnXs,\n sm: dBtnSm,\n md: '',\n lg: dBtnLg,\n xl: dBtnXl,\n }[effectiveSize]\n\n const range: [number, number] = [\n (current - 1) * pageSize + 1,\n Math.min(current * pageSize, total),\n ]\n\n if (simple) {\n return (\n <div className={`flex items-center gap-2 ${className}`} {...rest}>\n <button\n className={`${dBtn} ${dBtnGhost} ${sizeClass}`}\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n >\n ‹\n </button>\n <span className=\"text-sm\">\n {current} / {totalPages}\n </span>\n <button\n className={`${dBtn} ${dBtnGhost} ${sizeClass}`}\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n >\n ›\n </button>\n </div>\n )\n }\n\n return (\n <div className={`flex flex-wrap items-center gap-4 ${className}`} {...rest}>\n {/* Total */}\n {showTotal && (\n <div className=\"text-sm text-base-content/70\">\n {typeof showTotal === 'function'\n ? showTotal(total, range)\n : `Total ${total} items`}\n </div>\n )}\n\n {/* Page Size Changer */}\n {showSizeChanger && (\n <select\n className={`${dSelect} ${dSelectBordered} ${sizeClass}`}\n value={pageSize}\n onChange={(e) => handlePageSizeChange(Number(e.target.value))}\n disabled={disabled}\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size} / page\n </option>\n ))}\n </select>\n )}\n\n {/* Pagination Controls */}\n <div className={dJoin}>\n {/* First */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(1)}\n disabled={disabled || current === 1}\n title=\"First page\"\n >\n «\n </button>\n\n {/* Previous */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n title=\"Previous page\"\n >\n ‹\n </button>\n\n {/* Page Numbers */}\n {getPageNumbers().map((page, index) => {\n if (page === 'ellipsis') {\n return (\n <button key={`ellipsis-${index}`} className={`${dJoinItem} ${dBtn} ${dBtnDisabled} ${sizeClass}`}>\n ...\n </button>\n )\n }\n\n return (\n <button\n key={page}\n className={`${dJoinItem} ${dBtn} ${sizeClass} ${current === page ? dBtnActive : ''}`}\n onClick={() => handlePageChange(page)}\n disabled={disabled}\n >\n {page}\n </button>\n )\n })}\n\n {/* Next */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n title=\"Next page\"\n >\n ›\n </button>\n\n {/* Last */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(totalPages)}\n disabled={disabled || current === totalPages}\n title=\"Last page\"\n >\n »\n </button>\n </div>\n\n {/* Quick Jumper */}\n {showQuickJumper && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">Go to</span>\n <input\n type=\"number\"\n className={`${dInput} w-16 ${sizeClass}`}\n min={1}\n max={totalPages}\n value={jumpPage}\n onChange={(e) => setJumpPage(e.target.value)}\n onKeyDown={handleJumpPage}\n disabled={disabled}\n placeholder={String(current)}\n />\n </div>\n )}\n </div>\n )\n}\n"],"names":["dBtn","dBtnGhost","dBtnActive","dBtnDisabled","dBtnXs","dBtnSm","dBtnLg","dBtnXl","dSelect","dSelectBordered","dJoin","dJoinItem","dInput","Pagination","controlledCurrent","defaultCurrent","total","controlledPageSize","defaultPageSize","pageSizeOptions","onChange","onShowSizeChange","showSizeChanger","showQuickJumper","showTotal","simple","size","disabled","className","rest","componentSize","useConfig","effectiveSize","internalCurrent","setInternalCurrent","React","internalPageSize","setInternalPageSize","jumpPage","setJumpPage","current","pageSize","totalPages","handlePageChange","page","handlePageSizeChange","newSize","newTotalPages","newCurrent","handleJumpPage","getPageNumbers","pages","i","sizeClass","range","jsx","jsxs","index"],"mappings":";;;AAIA,MAAMA,IAAO,OACPC,IAAY,aACZC,IAAa,cACbC,IAAe,gBACfC,IAAS,UACTC,IAAS,UACTC,IAAS,UACTC,IAAS,UACTC,IAAU,UACVC,IAAkB,mBAClBC,IAAQ,QACRC,IAAY,aACZC,IAAS,SAmBFC,KAAwC,CAAC;AAAA,EACpD,SAASC;AAAA,EACT,gBAAAC,IAAiB;AAAA,EACjB,OAAAC;AAAA,EACA,UAAUC;AAAA,EACV,iBAAAC,IAAkB;AAAA,EAClB,iBAAAC,IAAkB,CAAC,IAAI,IAAI,IAAI,GAAG;AAAA,EAClC,UAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,iBAAAC,IAAkB;AAAA,EAClB,iBAAAC,IAAkB;AAAA,EAClB,WAAAC,IAAY;AAAA,EACZ,QAAAC,IAAS;AAAA,EACT,MAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,MAAM;AACJ,QAAM,EAAE,eAAAC,EAAA,IAAkBC,EAAA,GACpBC,IAAgBN,KAAQI,KAAiB,MACzC,CAACG,GAAiBC,CAAkB,IAAIC,EAAM,SAASpB,CAAc,GACrE,CAACqB,GAAkBC,CAAmB,IAAIF,EAAM,SAASjB,CAAe,GACxE,CAACoB,GAAUC,CAAW,IAAIJ,EAAM,SAAS,EAAE,GAE3CK,IAAU1B,MAAsB,SAAYA,IAAoBmB,GAChEQ,IAAWxB,MAAuB,SAAYA,IAAqBmB,GACnEM,IAAa,KAAK,KAAK1B,IAAQyB,CAAQ,GAEvCE,IAAmB,CAACC,MAAiB;AACzC,IAAIA,IAAO,KAAKA,IAAOF,KAAcf,MAEjCb,MAAsB,UACxBoB,EAAmBU,CAAI,GAEzBxB,IAAWwB,GAAMH,CAAQ;AAAA,EAC3B,GAEMI,IAAuB,CAACC,MAAoB;AAChD,UAAMC,IAAgB,KAAK,KAAK/B,IAAQ8B,CAAO,GACzCE,IAAaR,IAAUO,IAAgBA,IAAgBP;AAE7D,IAAIvB,MAAuB,UACzBoB,EAAoBS,CAAO,GAEzBhC,MAAsB,UAAakC,MAAeR,KACpDN,EAAmBc,CAAU,GAG/B3B,IAAmB2B,GAAYF,CAAO,GACtC1B,IAAW4B,GAAYF,CAAO;AAAA,EAChC,GAEMG,IAAiB,CAAC,MAA6C;AACnE,QAAI,EAAE,QAAQ,SAAS;AACrB,YAAML,IAAO,SAASN,CAAQ;AAC9B,MAAI,CAAC,MAAMM,CAAI,KAAKA,KAAQ,KAAKA,KAAQF,MACvCC,EAAiBC,CAAI,GACrBL,EAAY,EAAE;AAAA,IAElB;AAAA,EACF,GAEMW,IAAiB,MAA+B;AACpD,UAAMC,IAAiC,CAAA;AAGvC,QAAIT,KAAc;AAChB,eAASU,IAAI,GAAGA,KAAKV,GAAYU;AAC/B,QAAAD,EAAM,KAAKC,CAAC;AAAA,aAGVZ,KAAW,GAAG;AAChB,eAASY,IAAI,GAAGA,KAAK,GAAGA;AACtB,QAAAD,EAAM,KAAKC,CAAC;AAEd,MAAAD,EAAM,KAAK,UAAU,GACrBA,EAAM,KAAKT,CAAU;AAAA,IACvB,WAAWF,KAAWE,IAAa,GAAG;AACpC,MAAAS,EAAM,KAAK,CAAC,GACZA,EAAM,KAAK,UAAU;AACrB,eAASC,IAAIV,IAAa,GAAGU,KAAKV,GAAYU;AAC5C,QAAAD,EAAM,KAAKC,CAAC;AAAA,IAEhB,OAAO;AACL,MAAAD,EAAM,KAAK,CAAC,GACZA,EAAM,KAAK,UAAU;AACrB,eAASC,IAAIZ,IAAU,GAAGY,KAAKZ,IAAU,GAAGY;AAC1C,QAAAD,EAAM,KAAKC,CAAC;AAEd,MAAAD,EAAM,KAAK,UAAU,GACrBA,EAAM,KAAKT,CAAU;AAAA,IACvB;AAGF,WAAOS;AAAA,EACT,GAEME,IAAY;AAAA,IAChB,IAAIjD;AAAA,IACJ,IAAIC;AAAA,IACJ,IAAI;AAAA,IACJ,IAAIC;AAAA,IACJ,IAAIC;AAAA,EAAA,EACJyB,CAAa,GAETsB,IAA0B;AAAA,KAC7Bd,IAAU,KAAKC,IAAW;AAAA,IAC3B,KAAK,IAAID,IAAUC,GAAUzB,CAAK;AAAA,EAAA;AAGpC,SAAIS,sBAEC,OAAA,EAAI,WAAW,2BAA2BG,CAAS,IAAK,GAAGC,GAC1D,UAAA;AAAA,IAAA,gBAAA0B;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,GAAGvD,CAAI,IAAIC,CAAS,IAAIoD,CAAS;AAAA,QAC5C,SAAS,MAAMV,EAAiBH,IAAU,CAAC;AAAA,QAC3C,UAAUb,KAAYa,MAAY;AAAA,QACnC,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGD,gBAAAgB,EAAC,QAAA,EAAK,WAAU,WACb,UAAA;AAAA,MAAAhB;AAAA,MAAQ;AAAA,MAAIE;AAAA,IAAA,GACf;AAAA,IACA,gBAAAa;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,GAAGvD,CAAI,IAAIC,CAAS,IAAIoD,CAAS;AAAA,QAC5C,SAAS,MAAMV,EAAiBH,IAAU,CAAC;AAAA,QAC3C,UAAUb,KAAYa,MAAYE;AAAA,QACnC,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAED,GACF,sBAKD,OAAA,EAAI,WAAW,qCAAqCd,CAAS,IAAK,GAAGC,GAEnE,UAAA;AAAA,IAAAL,KACC,gBAAA+B,EAAC,OAAA,EAAI,WAAU,gCACZ,UAAA,OAAO/B,KAAc,aAClBA,EAAUR,GAAOsC,CAAK,IACtB,SAAStC,CAAK,UACpB;AAAA,IAIDM,KACC,gBAAAiC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,GAAG/C,CAAO,IAAIC,CAAe,IAAI4C,CAAS;AAAA,QACrD,OAAOZ;AAAA,QACP,UAAU,CAAC,MAAMI,EAAqB,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA,QAC5D,UAAAlB;AAAA,QAEC,YAAgB,IAAI,CAACD,MACpB,gBAAA8B,EAAC,UAAA,EAAkB,OAAO9B,GACvB,UAAA;AAAA,UAAAA;AAAAA,UAAK;AAAA,QAAA,EAAA,GADKA,CAEb,CACD;AAAA,MAAA;AAAA,IAAA;AAAA,IAKL,gBAAA8B,EAAC,OAAA,EAAI,WAAW9C,GAEd,UAAA;AAAA,MAAA,gBAAA6C;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW,GAAG5C,CAAS,IAAIX,CAAI,IAAIqD,CAAS;AAAA,UAC5C,SAAS,MAAMV,EAAiB,CAAC;AAAA,UACjC,UAAUhB,KAAYa,MAAY;AAAA,UAClC,OAAM;AAAA,UACP,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAKD,gBAAAe;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW,GAAG5C,CAAS,IAAIX,CAAI,IAAIqD,CAAS;AAAA,UAC5C,SAAS,MAAMV,EAAiBH,IAAU,CAAC;AAAA,UAC3C,UAAUb,KAAYa,MAAY;AAAA,UAClC,OAAM;AAAA,UACP,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAKAU,IAAiB,IAAI,CAACN,GAAMa,MACvBb,MAAS,aAET,gBAAAW,EAAC,UAAA,EAAiC,WAAW,GAAG5C,CAAS,IAAIX,CAAI,IAAIG,CAAY,IAAIkD,CAAS,IAAI,UAAA,MAAA,GAArF,YAAYI,CAAK,EAE9B,IAKF,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAW,GAAG5C,CAAS,IAAIX,CAAI,IAAIqD,CAAS,IAAIb,MAAYI,IAAO1C,IAAa,EAAE;AAAA,UAClF,SAAS,MAAMyC,EAAiBC,CAAI;AAAA,UACpC,UAAAjB;AAAA,UAEC,UAAAiB;AAAA,QAAA;AAAA,QALIA;AAAA,MAAA,CAQV;AAAA,MAGD,gBAAAW;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW,GAAG5C,CAAS,IAAIX,CAAI,IAAIqD,CAAS;AAAA,UAC5C,SAAS,MAAMV,EAAiBH,IAAU,CAAC;AAAA,UAC3C,UAAUb,KAAYa,MAAYE;AAAA,UAClC,OAAM;AAAA,UACP,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAKD,gBAAAa;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW,GAAG5C,CAAS,IAAIX,CAAI,IAAIqD,CAAS;AAAA,UAC5C,SAAS,MAAMV,EAAiBD,CAAU;AAAA,UAC1C,UAAUf,KAAYa,MAAYE;AAAA,UAClC,OAAM;AAAA,UACP,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAED,GACF;AAAA,IAGCnB,KACC,gBAAAiC,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,MAAA,gBAAAD,EAAC,QAAA,EAAK,WAAU,WAAU,UAAA,SAAK;AAAA,MAC/B,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAW,GAAG3C,CAAM,SAASyC,CAAS;AAAA,UACtC,KAAK;AAAA,UACL,KAAKX;AAAA,UACL,OAAOJ;AAAA,UACP,UAAU,CAAC,MAAMC,EAAY,EAAE,OAAO,KAAK;AAAA,UAC3C,WAAWU;AAAA,UACX,UAAAtB;AAAA,UACA,aAAa,OAAOa,CAAO;AAAA,QAAA;AAAA,MAAA;AAAA,IAC7B,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"Pagination.js","sources":["../../src/components/Pagination.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dBtn = 'btn'\nconst dBtnGhost = 'btn-ghost'\nconst dBtnActive = 'btn-active'\nconst dBtnDisabled = 'btn-disabled'\nconst dBtnXs = 'btn-xs'\nconst dBtnSm = 'btn-sm'\nconst dBtnLg = 'btn-lg'\nconst dBtnXl = 'btn-xl'\nconst dSelect = 'select'\nconst dSelectBordered = 'select-bordered'\nconst dJoin = 'join'\nconst dJoinItem = 'join-item'\nconst dInput = 'input'\n\nexport interface PaginationProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n current?: number\n defaultCurrent?: number\n total: number\n pageSize?: number\n defaultPageSize?: number\n pageSizeOptions?: number[]\n onChange?: (page: number, pageSize: number) => void\n onShowSizeChange?: (current: number, size: number) => void\n showSizeChanger?: boolean\n showQuickJumper?: boolean\n showTotal?: boolean | ((total: number, range: [number, number]) => React.ReactNode)\n simple?: boolean\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n disabled?: boolean\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport const Pagination = forwardRef<HTMLDivElement, PaginationProps>(function Pagination(\n {\n current: controlledCurrent,\n defaultCurrent = 1,\n total,\n pageSize: controlledPageSize,\n defaultPageSize = 10,\n pageSizeOptions = [10, 20, 50, 100],\n onChange,\n onShowSizeChange,\n showSizeChanger = false,\n showQuickJumper = false,\n showTotal = false,\n simple = false,\n size,\n disabled = false,\n 'data-testid': testId,\n className = '',\n ...rest\n },\n ref\n) {\n const { componentSize, locale } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n // Locale strings with fallbacks\n const l = locale.Pagination ?? {}\n const itemsPerPageText = l.itemsPerPage ?? '/ page'\n const goToText = l.goTo ?? 'Go to'\n const [internalCurrent, setInternalCurrent] = React.useState(defaultCurrent)\n const [internalPageSize, setInternalPageSize] = React.useState(defaultPageSize)\n const [jumpPage, setJumpPage] = React.useState('')\n\n const current = controlledCurrent !== undefined ? controlledCurrent : internalCurrent\n const pageSize = controlledPageSize !== undefined ? controlledPageSize : internalPageSize\n const totalPages = Math.ceil(total / pageSize)\n\n const handlePageChange = (page: number) => {\n if (page < 1 || page > totalPages || disabled) return\n\n if (controlledCurrent === undefined) {\n setInternalCurrent(page)\n }\n onChange?.(page, pageSize)\n }\n\n const handlePageSizeChange = (newSize: number) => {\n const newTotalPages = Math.ceil(total / newSize)\n const newCurrent = current > newTotalPages ? newTotalPages : current\n\n if (controlledPageSize === undefined) {\n setInternalPageSize(newSize)\n }\n if (controlledCurrent === undefined && newCurrent !== current) {\n setInternalCurrent(newCurrent)\n }\n\n onShowSizeChange?.(newCurrent, newSize)\n onChange?.(newCurrent, newSize)\n }\n\n const handleJumpPage = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n const page = parseInt(jumpPage)\n if (!isNaN(page) && page >= 1 && page <= totalPages) {\n handlePageChange(page)\n setJumpPage('')\n }\n }\n }\n\n const getPageNumbers = (): (number | 'ellipsis')[] => {\n const pages: (number | 'ellipsis')[] = []\n const showPages = 7\n\n if (totalPages <= showPages) {\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n if (current <= 3) {\n for (let i = 1; i <= 5; i++) {\n pages.push(i)\n }\n pages.push('ellipsis')\n pages.push(totalPages)\n } else if (current >= totalPages - 2) {\n pages.push(1)\n pages.push('ellipsis')\n for (let i = totalPages - 4; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n pages.push(1)\n pages.push('ellipsis')\n for (let i = current - 1; i <= current + 1; i++) {\n pages.push(i)\n }\n pages.push('ellipsis')\n pages.push(totalPages)\n }\n }\n\n return pages\n }\n\n const sizeClass = {\n xs: dBtnXs,\n sm: dBtnSm,\n md: '',\n lg: dBtnLg,\n xl: dBtnXl,\n }[effectiveSize]\n\n const range: [number, number] = [\n (current - 1) * pageSize + 1,\n Math.min(current * pageSize, total),\n ]\n\n if (simple) {\n return (\n <div ref={ref} className={`flex items-center gap-2 ${className}`} data-testid={testId} {...rest}>\n <button\n className={`${dBtn} ${dBtnGhost} ${sizeClass}`}\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n data-testid={getTestId('prev')}\n aria-label={l.prev ?? 'Previous'}\n >\n ‹\n </button>\n <span className=\"text-sm\">\n {current} / {totalPages}\n </span>\n <button\n className={`${dBtn} ${dBtnGhost} ${sizeClass}`}\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n data-testid={getTestId('next')}\n aria-label={l.next ?? 'Next'}\n >\n ›\n </button>\n </div>\n )\n }\n\n return (\n <div ref={ref} className={`flex flex-wrap items-center gap-4 ${className}`} data-testid={testId} {...rest}>\n {/* Total */}\n {showTotal && (\n <div className=\"text-sm text-base-content/70\" data-testid={getTestId('total')}>\n {typeof showTotal === 'function'\n ? showTotal(total, range)\n : `Total ${total} ${l.items ?? 'items'}`}\n </div>\n )}\n\n {/* Page Size Changer */}\n {showSizeChanger && (\n <select\n className={`${dSelect} ${dSelectBordered} ${sizeClass}`}\n value={pageSize}\n onChange={(e) => handlePageSizeChange(Number(e.target.value))}\n disabled={disabled}\n data-testid={getTestId('size-changer')}\n >\n {pageSizeOptions.map((sz) => (\n <option key={sz} value={sz}>\n {sz} {itemsPerPageText}\n </option>\n ))}\n </select>\n )}\n\n {/* Pagination Controls */}\n <div className={dJoin} data-testid={getTestId('controls')}>\n {/* First */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(1)}\n disabled={disabled || current === 1}\n aria-label=\"First page\"\n data-testid={getTestId('first')}\n >\n «\n </button>\n\n {/* Previous */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n aria-label={l.prev ?? 'Previous'}\n data-testid={getTestId('prev')}\n >\n ‹\n </button>\n\n {/* Page Numbers */}\n {getPageNumbers().map((page, index) => {\n if (page === 'ellipsis') {\n return (\n <button key={`ellipsis-${index}`} className={`${dJoinItem} ${dBtn} ${dBtnDisabled} ${sizeClass}`}>\n ...\n </button>\n )\n }\n\n return (\n <button\n key={page}\n className={`${dJoinItem} ${dBtn} ${sizeClass} ${current === page ? dBtnActive : ''}`}\n onClick={() => handlePageChange(page)}\n disabled={disabled}\n data-testid={getTestId(`page-${page}`)}\n aria-current={current === page ? 'page' : undefined}\n >\n {page}\n </button>\n )\n })}\n\n {/* Next */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n aria-label={l.next ?? 'Next'}\n data-testid={getTestId('next')}\n >\n ›\n </button>\n\n {/* Last */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(totalPages)}\n disabled={disabled || current === totalPages}\n aria-label=\"Last page\"\n data-testid={getTestId('last')}\n >\n »\n </button>\n </div>\n\n {/* Quick Jumper */}\n {showQuickJumper && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">{goToText}</span>\n <input\n type=\"number\"\n className={`${dInput} w-16 ${sizeClass}`}\n min={1}\n max={totalPages}\n value={jumpPage}\n onChange={(e) => setJumpPage(e.target.value)}\n onKeyDown={handleJumpPage}\n disabled={disabled}\n placeholder={String(current)}\n data-testid={getTestId('jumper')}\n />\n </div>\n )}\n </div>\n )\n})\n"],"names":["dBtn","dBtnGhost","dBtnActive","dBtnDisabled","dBtnXs","dBtnSm","dBtnLg","dBtnXl","dSelect","dSelectBordered","dJoin","dJoinItem","dInput","Pagination","forwardRef","controlledCurrent","defaultCurrent","total","controlledPageSize","defaultPageSize","pageSizeOptions","onChange","onShowSizeChange","showSizeChanger","showQuickJumper","showTotal","simple","size","disabled","testId","className","rest","ref","componentSize","locale","useConfig","effectiveSize","getTestId","suffix","l","itemsPerPageText","goToText","internalCurrent","setInternalCurrent","React","internalPageSize","setInternalPageSize","jumpPage","setJumpPage","current","pageSize","totalPages","handlePageChange","page","handlePageSizeChange","newSize","newTotalPages","newCurrent","handleJumpPage","getPageNumbers","pages","i","sizeClass","range","jsxs","jsx","sz","index"],"mappings":"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"}
|
|
@@ -13,5 +13,7 @@ export interface PopconfirmProps extends Omit<React.HTMLAttributes<HTMLDivElemen
|
|
|
13
13
|
disabled?: boolean;
|
|
14
14
|
icon?: React.ReactNode;
|
|
15
15
|
showCancel?: boolean;
|
|
16
|
+
/** Test ID prefix for child elements */
|
|
17
|
+
'data-testid'?: string;
|
|
16
18
|
}
|
|
17
|
-
export declare const Popconfirm: React.
|
|
19
|
+
export declare const Popconfirm: React.ForwardRefExoticComponent<PopconfirmProps & React.RefAttributes<HTMLDivElement>>;
|