Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ui: add jump to page number in paginated tables #626

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 38 additions & 3 deletions app/components/Transactions/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import Dropdown from '../Dropdown';
import BidSearchInput from '../BidSearchInput';
import Fuse from '../../vendor/fuse';
import dbClient from "../../utils/dbClient";
import walletClient from "../../utils/walletClient";
import {I18nContext} from "../../utils/i18n";
import { debounce } from '../../utils/throttle';

Expand Down Expand Up @@ -79,6 +78,7 @@ export default class Transactions extends Component {

state = {
currentPageIndex: 0,
isEditingPageIndex: false,
itemsPerPage: 5,
sortBy: 0,
query: '',
Expand Down Expand Up @@ -233,8 +233,26 @@ export default class Transactions extends Component {
)
}

handlePageJump(event, max) {
if (event.key !== 'Enter') return;
const {value} = event.currentTarget;
if (value === '') {
this.setState({isEditingPageIndex: false});
return;
}
let page = parseInt(value);
if (isNaN(page)) return;
page = Math.max(1, page);
page = Math.min(page, max);

this.setState({
currentPageIndex: page - 1,
isEditingPageIndex: false,
});
}

renderPageNumbers(transactions) {
const { currentPageIndex, itemsPerPage } = this.state;
const { currentPageIndex, itemsPerPage, isEditingPageIndex } = this.state;
const totalPages = Math.ceil(transactions.length / itemsPerPage);
const pageIndices = getPageIndices(transactions, itemsPerPage, currentPageIndex);

Expand All @@ -245,6 +263,7 @@ export default class Transactions extends Component {
className="transactions__page-control__start"
onClick={() => this.setState({
currentPageIndex: Math.max(currentPageIndex - 1, 0),
isEditingPageIndex: false,
})}
/>
{pageIndices.map((pageIndex, i) => {
Expand All @@ -254,13 +273,28 @@ export default class Transactions extends Component {
);
}

if (isEditingPageIndex && currentPageIndex === pageIndex) {
return (
<div key={`${pageIndex}-${i}`} className="transactions__page-control__input">
<input
type="number"
autoFocus
placeholder={currentPageIndex+1}
onKeyDown={event => this.handlePageJump(event, totalPages)}
/>
</div>
)
}

return (
<div
key={`${pageIndex}-${i}`}
className={c('transactions__page-control__page', {
'transactions__page-control__page--active': currentPageIndex === pageIndex,
})}
onClick={() => this.setState({ currentPageIndex: pageIndex })}
onClick={() => currentPageIndex === pageIndex ?
this.setState({isEditingPageIndex: true})
: this.setState({ currentPageIndex: pageIndex, isEditingPageIndex: false })}
>
{pageIndex + 1}
</div>
Expand All @@ -270,6 +304,7 @@ export default class Transactions extends Component {
className="transactions__page-control__end"
onClick={() => this.setState({
currentPageIndex: Math.min(currentPageIndex + 1, totalPages - 1),
isEditingPageIndex: false,
})}
/>
</div>
Expand Down
13 changes: 13 additions & 0 deletions app/components/Transactions/index.scss
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,19 @@
align-items: center;
}

&__input {
@extend %box-input;
@extend %row-nowrap;

width: 2rem;
padding: .35rem .5rem;

input {
@extend %h4;
text-align: center;
}
}

&__dropdowns {
@extend %row-nowrap;
align-items: center;
Expand Down
13 changes: 13 additions & 0 deletions app/pages/DomainManager/domain-manager.scss
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,19 @@
align-items: center;
}

&__input {
@extend %box-input;
@extend %row-nowrap;

width: 2rem;
padding: .35rem .5rem;

input {
@extend %h4;
text-align: center;
}
}

&__dropdowns {
@extend %row-nowrap;
align-items: center;
Expand Down
40 changes: 39 additions & 1 deletion app/pages/DomainManager/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ class DomainManager extends Component {
isShowingBulkTransfer: false,
isConfirmingBulkFinalize: false,
currentPageIndex: 0,
isEditingPageIndex: false,
itemsPerPage: 10,
};

Expand All @@ -63,6 +64,7 @@ class DomainManager extends Component {
|| this.state.isShowingBulkTransfer !== nextState.isShowingBulkTransfer
|| this.state.isConfirmingBulkFinalize !== nextState.isConfirmingBulkFinalize
|| this.state.currentPageIndex !== nextState.currentPageIndex
|| this.state.isEditingPageIndex !== nextState.isEditingPageIndex
|| this.state.itemsPerPage !== nextState.itemsPerPage;
}

Expand Down Expand Up @@ -173,10 +175,29 @@ class DomainManager extends Component {
);
}

handlePageJump(event, max) {
if (event.key !== 'Enter') return;
const {value} = event.currentTarget;
if (value === '') {
this.setState({isEditingPageIndex: false});
return;
}
let page = parseInt(value);
if (isNaN(page)) return;
page = Math.max(1, page);
page = Math.min(page, max);

this.setState({
currentPageIndex: page - 1,
isEditingPageIndex: false,
});
}

renderControls(namesList) {
const {
currentPageIndex,
itemsPerPage,
isEditingPageIndex,
} = this.state;

const totalPages = Math.ceil(namesList.length / itemsPerPage);
Expand All @@ -189,6 +210,7 @@ class DomainManager extends Component {
className="domain-manager__page-control__start"
onClick={() => this.setState({
currentPageIndex: Math.max(currentPageIndex - 1, 0),
isEditingPageIndex: false,
})}
/>
{pageIndices.map((pageIndex, i) => {
Expand All @@ -198,13 +220,28 @@ class DomainManager extends Component {
);
}

if (isEditingPageIndex && currentPageIndex === pageIndex) {
return (
<div key={`${pageIndex}-${i}`} className="domain-manager__page-control__input">
<input
type="number"
autoFocus
placeholder={currentPageIndex+1}
onKeyDown={event => this.handlePageJump(event, totalPages)}
/>
</div>
)
}

return (
<div
key={`${pageIndex}-${i}`}
className={c('domain-manager__page-control__page', {
'domain-manager__page-control__page--active': currentPageIndex === pageIndex,
})}
onClick={() => this.setState({currentPageIndex: pageIndex})}
onClick={() => currentPageIndex === pageIndex ?
this.setState({isEditingPageIndex: true})
: this.setState({ currentPageIndex: pageIndex, isEditingPageIndex: false })}
>
{pageIndex + 1}
</div>
Expand All @@ -214,6 +251,7 @@ class DomainManager extends Component {
className="domain-manager__page-control__end"
onClick={() => this.setState({
currentPageIndex: Math.min(currentPageIndex + 1, totalPages - 1),
isEditingPageIndex: false,
})}
/>
</div>
Expand Down
43 changes: 41 additions & 2 deletions app/pages/Exchange/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ class Exchange extends Component {
isLoading: true,
shakedexDeprecatedToggle: false,
currentBidsMap: new Map(),
isEditingPageIndex: false,
};
}

Expand Down Expand Up @@ -484,7 +485,25 @@ class Exchange extends Component {
);
}

handlePageJump(event, max) {
if (event.key !== 'Enter') return;
const {value} = event.currentTarget;
if (value === '') {
this.setState({isEditingPageIndex: false});
return;
}
let page = parseInt(value);
if (isNaN(page)) return;
page = Math.max(1, page);
page = Math.min(page, max);

this.props.setAuctionPage(page)
this.setState({isEditingPageIndex: false});
this.fetchShakedex();
}

renderListingControls = () => {
const {isEditingPageIndex} = this.state;
const {
auctions,
total,
Expand All @@ -507,6 +526,7 @@ class Exchange extends Component {
className="domain-manager__page-control__start"
onClick={async () => {
this.props.setAuctionPage(Math.max(currentPageIndex - 1, 1));
this.setState({isEditingPageIndex: false});
this.fetchShakedex();
}}
/>
Expand All @@ -517,15 +537,33 @@ class Exchange extends Component {
);
}

if (isEditingPageIndex && currentPageIndex === pageIndex + 1) {
return (
<div key={`${pageIndex}-${i}`} className="domain-manager__page-control__input">
<input
type="number"
autoFocus
placeholder={currentPageIndex+1}
onKeyDown={event => this.handlePageJump(event, totalPages)}
/>
</div>
)
}

return (
<div
key={`${pageIndex}-${i}`}
className={classNames('domain-manager__page-control__page', {
'domain-manager__page-control__page--active': currentPageIndex === pageIndex + 1,
})}
onClick={async () => {
this.props.setAuctionPage(pageIndex + 1);
this.fetchShakedex();
if (currentPageIndex === pageIndex + 1) {
this.setState({isEditingPageIndex: true})
} else {
this.props.setAuctionPage(pageIndex + 1);
this.setState({isEditingPageIndex: false});
this.fetchShakedex();
}
}}
>
{pageIndex + 1}
Expand All @@ -536,6 +574,7 @@ class Exchange extends Component {
className="domain-manager__page-control__end"
onClick={async () => {
this.props.setAuctionPage(Math.min(currentPageIndex + 1, totalPages));
this.setState({isEditingPageIndex: false});
this.fetchShakedex();
}}
/>
Expand Down
39 changes: 38 additions & 1 deletion app/pages/Watching/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ class Watching extends Component {
query: '',
showError: false,
currentPageIndex: 0,
isEditingPageIndex: false,
itemsPerPage: 10,
isConfirmingReset: false,
isImporting: false,
Expand Down Expand Up @@ -356,10 +357,29 @@ class Watching extends Component {
)
}

handlePageJump(event, max) {
if (event.key !== 'Enter') return;
const {value} = event.currentTarget;
if (value === '') {
this.setState({isEditingPageIndex: false});
return;
}
let page = parseInt(value);
if (isNaN(page)) return;
page = Math.max(1, page);
page = Math.min(page, max);

this.setState({
currentPageIndex: page - 1,
isEditingPageIndex: false,
});
}

renderControls() {
const {
currentPageIndex,
itemsPerPage,
isEditingPageIndex,
} = this.state;
const {
names,
Expand All @@ -375,6 +395,7 @@ class Watching extends Component {
className="domain-manager__page-control__start"
onClick={() => this.setState({
currentPageIndex: Math.max(currentPageIndex - 1, 0),
isEditingPageIndex: false,
})}
/>
{pageIndices.map((pageIndex, i) => {
Expand All @@ -384,13 +405,28 @@ class Watching extends Component {
);
}

if (isEditingPageIndex && currentPageIndex === pageIndex) {
return (
<div key={`${pageIndex}-${i}`} className="domain-manager__page-control__input">
<input
type="number"
autoFocus
placeholder={currentPageIndex+1}
onKeyDown={event => this.handlePageJump(event, totalPages)}
/>
</div>
)
}

return (
<div
key={`${pageIndex}-${i}`}
className={c('domain-manager__page-control__page', {
'domain-manager__page-control__page--active': currentPageIndex === pageIndex,
})}
onClick={() => this.setState({ currentPageIndex: pageIndex })}
onClick={() => currentPageIndex === pageIndex ?
this.setState({isEditingPageIndex: true})
: this.setState({ currentPageIndex: pageIndex, isEditingPageIndex: false })}
>
{pageIndex + 1}
</div>
Expand All @@ -400,6 +436,7 @@ class Watching extends Component {
className="domain-manager__page-control__end"
onClick={() => this.setState({
currentPageIndex: Math.min(currentPageIndex + 1, totalPages - 1),
isEditingPageIndex: false,
})}
/>
</div>
Expand Down
Loading
Loading