import * as React from 'react'; import { debounce } from 'lodash'; const PAGE = { FIRST: 'FIRST', PREVIOUS: 'PREVIOUS', NEXT: 'NEXT', LAST: 'LAST', }; const allowedKeys = [ '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'Backspace', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', ]; const allowedKeyCodes = [ 8, // Backspace 37, // ArrowLeft 38, // ArrowUp 39, // ArrowRight 40, // ArrowDown ]; const keyCodeIsAllowed = (keyCode) => { return !!( (keyCode >= 48 && keyCode <= 57) || allowedKeyCodes.includes(keyCode) ); }; export interface MmuiPaginationInputProps { pageNumber: string; staticUrl: string; totalPages: number; updateCurrentPage: (pageNumber: number) => void; } export class MmuiPaginationInputComponent extends React.Component { protected pageNumberInput: HTMLInputElement; componentDidUpdate(prevProps) { if (prevProps.pageNumber != this.props.pageNumber) { this.pageNumberInput?.select(); } } updateCurrentPageDebounced = debounce((value) => { this.props.updateCurrentPage(value); }, 500); handleKeyDown = (e) => { if (!(allowedKeys.includes(e.key) || keyCodeIsAllowed(e.which))) { // e.which is for older browser support e.preventDefault(); } }; handleKeyUp = (e) => { let value = parseInt(e.target.value); if (value < 1) { value = 1; } else if (value > this.props.totalPages) { value = this.props.totalPages; } else if (!value) { return; } this.updateCurrentPageDebounced(value); }; onCurrentPageUpdate = (e, context) => { e.preventDefault(); switch (context) { case PAGE.FIRST: this.props.updateCurrentPage(1); break; case PAGE.PREVIOUS: this.props.updateCurrentPage( parseInt(this.props.pageNumber) - 1 ); break; case PAGE.NEXT: this.props.updateCurrentPage( parseInt(this.props.pageNumber) + 1 ); break; case PAGE.LAST: this.props.updateCurrentPage(this.props.totalPages); break; } }; handleBlur = () => { const boolValue = !!this.pageNumberInput.value; if (boolValue) return; // Reset the input value only if the input is empty this.pageNumberInput.value = this.props.pageNumber; }; render() { return ( ); } }