Version

Pager

Displays a pager.

Pager

Example
<div id="pager"></div>
import React, {Component, createElement} from 'react';
import {render} from 'react-dom';
import Pager from '@jetbrains/ring-ui/components/pager/pager';

class Example extends Component {
  state = {
    total: 750,
    currentPage: 1
  }

  render() {
    const {total, currentPage} = this.state;
    return (
      <Pager
        total={total}
        currentPage={currentPage}
        disablePageSizeSelector
        onPageChange={currentPage => this.setState({currentPage})}
      />
    );
  }
}

render(createElement(Example, {}), document.getElementById('pager'));

Pager with a custom frame size

Example
<div id="pager"></div>
import React, {Component, createElement} from 'react';
import {render} from 'react-dom';
import Pager from '@jetbrains/ring-ui/components/pager/pager';

class Example extends Component {
  state = {
    total: 750,
    currentPage: 1
  }

  render() {
    const {total, currentPage} = this.state;
    return (
      <Pager
        total={total}
        currentPage={currentPage}
        visiblePagesLimit={3}
        disablePageSizeSelector
        onPageChange={currentPage => this.setState({currentPage})}
      />
    );
  }
}

render(createElement(Example, {}), document.getElementById('pager'));

Pager with a custom frame size #2

Example
<div id="pager"></div>
import React, {Component, createElement} from 'react';
import {render} from 'react-dom';
import Pager from '@jetbrains/ring-ui/components/pager/pager';

class Example extends Component {
  state = {
    total: 250,
    currentPage: 1
  }

  render() {
    const {total, currentPage} = this.state;
    return (
      <Pager
        total={total}
        currentPage={currentPage}
        visiblePagesLimit={5}
        disablePageSizeSelector
        onPageChange={currentPage => this.setState({currentPage})}
      />
    );
  }
}

render(createElement(Example, {}), document.getElementById('pager'));

Pager with a custom frame size #3

Example
<div id="pager"></div>
import React, {Component, createElement} from 'react';
import {render} from 'react-dom';
import Pager from '@jetbrains/ring-ui/components/pager/pager';

class Example extends Component {
  state = {
    total: 400,
    currentPage: 1
  }

  render() {
    const {total, currentPage} = this.state;
    return (
      <Pager
        total={total}
        currentPage={currentPage}
        visiblePagesLimit={5}
        disablePageSizeSelector
        onPageChange={currentPage => this.setState({currentPage})}
      />
    );
  }
}

render(createElement(Example, {}), document.getElementById('pager'));

Pager with a page size selector

Example
<div id="pager"></div>
import React, {Component, createElement} from 'react';
import {render} from 'react-dom';
import Pager from '@jetbrains/ring-ui/components/pager/pager';

class Example extends Component {
  state = {
    total: 300,
    currentPage: 1,
    pageSize: 50
  }

  render() {
    const {total, currentPage, pageSize} = this.state;
    return (
      <Pager
        total={total}
        currentPage={currentPage}
        pageSize={pageSize}
        onPageChange={currentPage => this.setState({currentPage})}
        onPageSizeChange={pageSize => this.setState({pageSize})}
      />
    );
  }
}

render(createElement(Example, {}), document.getElementById('pager'));

Pager with open total

Example
<div id="pager"></div>
import React, {Component, createElement} from 'react';
import {render} from 'react-dom';
import Pager from '@jetbrains/ring-ui/components/pager/pager';

class Example extends Component {
  state = {
    total: 10,
    currentPage: 1,
    pageSize: 10
  }

  render() {
    const {total, currentPage, pageSize} = this.state;
    return (
    <Pager
      total={total}
      currentPage={currentPage}
      pageSize={pageSize}
      openTotal={total < 100}
      onPageChange={cp => this.setState({currentPage: cp})}
      onLoadPage={cp => this.setState({currentPage: cp, total: this.state.total + 10})}
      visiblePagesLimit={5}
      disablePageSizeSelector
    />
    );
  }
}

render(createElement(Example, {}), document.getElementById('pager'));

Pager with open total and history support

Example
<div id="pager"></div>
import React, {Component, createElement} from 'react';
import {render} from 'react-dom';
import Pager from '@jetbrains/ring-ui/components/pager/pager';

const getDataFromUrl = (name, defaultValue) => {
  const params = new URLSearchParams(location.search);
  const value = params.get(name);
  return value != undefined ? parseInt(value) : defaultValue;
}

const hrefGenerator = (linkPageNumber, pageSize) => {
  const params = new URLSearchParams(location.search);
  params.set('page', linkPageNumber)
  if (pageSize != undefined){
     params.set('pageSize', pageSize)
  }
  return `${location.pathname}?${params}`;
}

const handleHistory = (page, pageSize) => {
  window.history.pushState({page: page, pageSize: pageSize}, '', hrefGenerator(page, pageSize));
};

class Example extends Component {
  state = {
      total: 999,
      currentPage: getDataFromUrl("page", 1),
      pageSize: getDataFromUrl("pageSize", 20)
  }

  handlePageChange(update) {
      this.setState(update, () => history.pushState(this.state, '',
                      hrefGenerator(this.state.currentPage, this.state.pageSize)))
  }

  componentDidMount() {
    history.replaceState(this.state, '', hrefGenerator(this.state.currentPage, this.state.pageSize))
    window.addEventListener('popstate', event => {
      if (window.history.state && window.history.state.currentPage && window.history.state.pageSize){
          this.setState({pageSize: window.history.state.pageSize, currentPage: window.history.state.currentPage});
      }
    }, false);
  }

  componentWillUnmount() {
    window.removeEventListener('popstate');
  }


  render() {
    const {total, currentPage, pageSize} = this.state;
    return (
      <Pager
        total={total}
        currentPage={currentPage}
        pageSize={pageSize}
        hrefFunc={hrefGenerator}
        visiblePagesLimit={5}
        openTotal={total < 2000}
        onPageChange={currentPage => this.handlePageChange({currentPage})}
        onPageSizeChange={pageSize => this.handlePageChange({currentPage: 1, pageSize})}
        onLoadPage={currentPage => this.handlePageChange(prevState => ({currentPage, total: prevState.total + 500}))}
      />
    );
  }
}
render(createElement(Example, {}), document.getElementById('pager'));

Pager with reload on current page change

Example
<div id="pager"></div>
import React, {Component, createElement} from 'react';
import {render} from 'react-dom';
import Pager from '@jetbrains/ring-ui/components/pager/pager';

const getDataFromUrl = (name, defaultValue) => {
  const params = new URLSearchParams(location.search);
  const value = params.get(name);
  return value != undefined ? parseInt(value) : defaultValue;
}

const hrefGenerator = (linkPageNumber, pageSize) => {
  const params = new URLSearchParams(location.search);
  params.set('page', linkPageNumber)
  if (pageSize != undefined){
    params.set('pageSize', pageSize)
  }
  return `${location.pathname}?${params}`;
}

class Example extends Component {
  state = {
  total: 120,
  currentPage: getDataFromUrl("page", 1),
  pageSize: getDataFromUrl("pageSize", 20)
}

render() {
  const {total, currentPage, pageSize} = this.state;
  return (
    <Pager
      total={total}
      currentPage={currentPage}
      pageSize={pageSize}
      hrefFunc={hrefGenerator}
      visiblePagesLimit={5}
    />
    );
  }
}
render(createElement(Example, {}), document.getElementById('pager'));