diff --git a/.cursorrules b/.cursorrules
index 0b0c009c..5015ab7e 100644
--- a/.cursorrules
+++ b/.cursorrules
@@ -27,3 +27,11 @@
- Follow TypeScript strict mode conventions
- Use async/await instead of promises when possible
- Prefer named exports over default exports for utilities and services
+
+## Comments
+
+- Keep comments concise and purposeful; avoid verbose explanations.
+- Focus on the "why" or non-obvious context, not restating the code.
+- Prefer self-explanatory naming and structure over excessive comments.
+- Do not comment every line or obvious behavior; remove stale comments.
+- Use docblocks only where they add value (public APIs, complex logic).
diff --git a/src/renderer/src/pages/catalogue/pagination.tsx b/src/renderer/src/pages/catalogue/pagination.tsx
index 9febc8f8..ecc2afe3 100644
--- a/src/renderer/src/pages/catalogue/pagination.tsx
+++ b/src/renderer/src/pages/catalogue/pagination.tsx
@@ -29,9 +29,11 @@ function JumpControl({
return isOpen ? (
) {
const { formatNumber } = useFormat();
const [isJumpOpen, setIsJumpOpen] = useState(false);
@@ -87,13 +89,15 @@ export function Pagination({
}
const onJumpChange = (e: ChangeEvent) => {
- const val = e.target.value;
- if (val === "") {
+ const raw = e.target.value;
+ const digitsOnly = raw.replaceAll(/\D+/g, "");
+ if (digitsOnly === "") {
setJumpValue("");
return;
}
- const num = Number(val);
+ const num = Number.parseInt(digitsOnly, 10);
if (Number.isNaN(num)) {
+ setJumpValue("");
return;
}
if (num < 1) {
@@ -104,19 +108,36 @@ export function Pagination({
setJumpValue(String(totalPages));
return;
}
- setJumpValue(val);
+ setJumpValue(String(num));
};
const onJumpKeyDown = (e: KeyboardEvent) => {
+ const controlKeys = [
+ "Backspace",
+ "Delete",
+ "Tab",
+ "ArrowLeft",
+ "ArrowRight",
+ "Home",
+ "End",
+ ];
+
+ if (controlKeys.includes(e.key) || e.ctrlKey || e.metaKey) {
+ return;
+ }
+
if (e.key === "Enter") {
- if (jumpValue.trim() === "") return;
- const parsed = Number(jumpValue);
+ const sanitized = jumpValue.replaceAll(/\D+/g, "");
+ if (sanitized.trim() === "") return;
+ const parsed = Number.parseInt(sanitized, 10);
if (Number.isNaN(parsed)) return;
const target = Math.max(1, Math.min(totalPages, parsed));
onPageChange(target);
setIsJumpOpen(false);
} else if (e.key === "Escape") {
setIsJumpOpen(false);
+ } else if (!/^\d$/.test(e.key)) {
+ e.preventDefault();
}
};