Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/magiclen/paginator

This crate is used for generating pagination bar.
https://github.com/magiclen/paginator

pagination paginator rust

Last synced: 28 days ago
JSON representation

This crate is used for generating pagination bar.

Awesome Lists containing this project

README

        

Paginator
====================

[![CI](https://github.com/magiclen/paginator/actions/workflows/ci.yml/badge.svg)](https://github.com/magiclen/paginator/actions/workflows/ci.yml)

This crate is used for generating pagination bar on webpages or other UIs.

## Examples

#### Creating a Pagination Bar Which Has 5 Pages and Is on Page 1

```rust
use paginator::{Paginator, PageItem};

use core::fmt::Write;

let paginator = Paginator::builder(5).current_page(1).build_paginator().unwrap();

let mut html = String::new();

for page_item in paginator.paginate() {
match page_item {
PageItem::Prev(page) => {
// `PageItem::Prev` variant is used when the `has_prev` option is not set to `YesNoDepends::No`.

html.write_fmt(format_args!("

  • «
  • ", page = page)).unwrap();
    }
    PageItem::Page(page) => {
    html.write_fmt(format_args!("
  • {page}
  • ", page = page)).unwrap();
    }
    PageItem::CurrentPage(page) => {
    html.write_fmt(format_args!("
  • {page}
  • ", page = page)).unwrap();
    }
    PageItem::Ignore => {
    html.push_str("
  • ...
  • ");
    }
    PageItem::Next(page) => {
    // `PageItem::Next` variant is used when the `has_next` option is not set to `YesNoDepends::No`.

    html.write_fmt(format_args!("

  • »
  • ", page = page)).unwrap();
    }
    _ => {
    // `PageItem::ReservedPrev` or `PageItem::ReservedNext` variant is used only when the `has_prev` option or the `has_next` option is set to `YesNoDepends::Yes`.
    }
    }
    }
    ```

    #### Creating Pagination Bars Which Has 2 Pages for Different Current Pages

    ```rust
    use paginator::{Paginator, PageItem};

    let mut paginator_iter = Paginator::builder(2).build_paginator_iter().unwrap();

    for page_item in paginator_iter.next().unwrap().paginate() {
    // current_page == 1
    }

    for page_item in paginator_iter.next().unwrap().paginate() {
    // current_page == 2
    }
    ```

    ## Pagination Rules

    Before building up a `Paginator`, there is an important option, `max_item_count`, can be set via `PaginatorBuilder`. This option can limit the count of items on the pagination bar. This crate **ignores** page items far away from the current page item to stick to the count limit of items. The first/last n items can be additionally reserved.

    Look at the following code for more details.

    ```rust
    use paginator::{Paginator, page_items_to_string};

    let mut p = Paginator::builder(8).max_item_count(9).start_size(1).end_size(1).build_paginator_iter().unwrap();

    assert_eq!("1* 2 3 4 5 6 7 8 >", page_items_to_string(p.next().unwrap().paginate().as_slice()));
    assert_eq!("< 1 2* 3 4 5 ... 8 >", page_items_to_string(p.next().unwrap().paginate().as_slice()));
    assert_eq!("< 1 2 3* 4 5 ... 8 >", page_items_to_string(p.next().unwrap().paginate().as_slice()));
    assert_eq!("< 1 2 3 4* 5 ... 8 >", page_items_to_string(p.next().unwrap().paginate().as_slice()));
    assert_eq!("< 1 ... 4 5* 6 7 8 >", page_items_to_string(p.next().unwrap().paginate().as_slice()));
    assert_eq!("< 1 ... 4 5 6* 7 8 >", page_items_to_string(p.next().unwrap().paginate().as_slice()));
    assert_eq!("< 1 ... 4 5 6 7* 8 >", page_items_to_string(p.next().unwrap().paginate().as_slice()));
    assert_eq!("< 1 2 3 4 5 6 7 8*", page_items_to_string(p.next().unwrap().paginate().as_slice()));
    ```

    ## No Std

    Disable the default features to compile this crate without std.

    ```toml
    [dependencies.paginator]
    version = "*"
    default-features = false
    ```

    ## Crates.io

    https://crates.io/crates/paginator

    ## Documentation

    https://docs.rs/paginator

    ## License

    [MIT](LICENSE)