# Постраничная навигация

## Общая информация <a href="#general-information" id="general-information"></a>

Блок постраничной навигации состоит из панели пронумерованных страниц.

Для работы стилей постраничной навигации, контейнеру списка необходимо\
задать класс <mark style="color:orange;">`.pagination`</mark> а всем его элементам, класс <mark style="color:orange;">`.pagination-page`</mark>

```html
<ul class="pagination">
    <li class="pagination-page disabled"><a href="#" rel="nofollow"><i class="fa-solid fa-angles-left"></i></a></li>
    <li class="pagination-page disabled"><a href="#" rel="nofollow"><i class="fa-solid fa-angle-left"></i></a></li>
    <li class="pagination-page"><a href="#" rel="nofollow">1</a></li>
    <li class="pagination-page"><a href="#" rel="nofollow">2</a></li>
    <li class="pagination-page page-selector"><a href="#" rel="nofollow">...</a></li>
    <li class="pagination-page"><a href="#" rel="nofollow">39</a></li>
    <li class="pagination-page active"><a href="#" rel="nofollow">40</a></li>
    <li class="pagination-page"><a href="#" rel="nofollow">41</a></li>
    <li class="pagination-page page-selector"><a href="#" rel="nofollow">...</a></li>
    <li class="pagination-page"><a href="#" rel="nofollow">99</a></li>
    <li class="pagination-page"><a href="#" rel="nofollow">100</a></li>
    <li class="pagination-page"><a href="#" rel="nofollow"><i class="fa-solid fa-angle-right"></i></a></li>
    <li class="pagination-page"><a href="#" rel="nofollow"><i class="fa-solid fa-angles-right"></i></a></li>
</ul>

<br><br>

<ul class="pagination">
    <li class="pagination-page"><a href="#">← Назад</a></li>
    <li class="pagination-page"><a href="#">Вперед →</a></li>
</ul>
```

{% embed url="<https://codepen.io/pipui/pen/QWBQxJg>" %}
Пример работы кода выше
{% endembed %}

Класс <mark style="color:orange;">`.disabled`</mark> элемента списка служит для отключения переключателя.

## Javascript

Блок постраничной навигации можно создать при помощи Javascript. В этом случае у вас откроется больше возможность без перезагрузки страницы.

Для этого вам необходимо создать экземпляр класса <mark style="color:orange;">`PipUI.Pagination`</mark> и передать в него необходимые параметры.

Данный класс имеет в себе два параметра

1. HTMLElement - элемент или строковая ссылка на элемент
2. Object - объект с набором опций

### Пример <a href="#example" id="example"></a>

```html
<div id="pagination1"></div>

<script>
    let pagination1 = new PipUI.Pagination('#pagination1', {records: 100});
</script>
```

### Опции <a href="#options" id="options"></a>

Второй параметр объекта PipUI.Pagination поддерживает следующие параметры

```
// Выводить в консоль отладку
debug: false

// Шаблон адреса URL страницы. На место {NUM} будет подставлен номер страницы 
url: '/page-{NUM}'

// Что должно произойти после нажатия на селектор
// Поддерживаемые значения:
// redirect - произойдет переход на страницу, указанную в ссылке селектора
// location - URL страницы изменится, но перехода не произойдет
// none - отсутствие действия
// Во всех случаях визуальная составляющая будет обновлена
method: 'redirect'

// Тип метода генерации шаблона постраничной навигации.
// Поддерживаемые значения по умолчанию от 1 до 4
// Вы можете передать свое значение, но перед этим необходимо создать свой метод, добавив его через опцию types
type: 1

// Кол-во записей
records: 0

// Текущий номер страницы
current: 1

// Максимальное кол-во элементо вна страницу
max: 10

// Функция обратного вызова, которая будет выполнена при изменении страницы
changePageCallback: undefined

// Функция обратного вызова, которая будет выполнена при рендере
updateCallback: undefined

// Типы методов генерации шаблона постраничной навигации
types: {...}
```

### Методы <a href="#methods" id="methods"></a>

```javascript
let pagination = new PipUI.Pagination('#pagination');

pagination.getID() // Вернет уникальный идентификатор

pagination.setOptions(object) // Изменить опции. DOM не будет изменен
// до вызова метода pagination.update()

pagination.getOptions() // Получить опции

pagination.update() // Отрендерить содержимое заново

pagination.getPages() // Вернуть общее кол-во страниц

pagination.getPrev() // Вернуть номер предыдущей страницы

pagination.getNext() // Вернуть номер следующей страницы

pagination.setPage(int) // Установить новую страницы. Содержимое будет обновлено

pagination.getType() // Получить объект типа метода генерации
```

### Новые типы генерации <a href="#custom-generation-types" id="custom-generation-types"></a>

Для создания или изменения текущего типа генерации, необходимо передать в опции параметр types со своими значениями.

{% hint style="info" %}
Объект должен содержать в себе метод render, который принимает параметр\
self - реферальная переменная от текущего экземпляра класса (this).

Данный метод должен возвращать новый список страниц в виде строки HTML
{% endhint %}

#### Пример нового типа <a href="#example-generation-type" id="example-generation-type"></a>

```
let pagination = new PipUI.Pagination('#pagination', {
    records: 100,
    types: {
        5: {
            render: function(self){
                return '<li class="pagination-page"><a data-pagination-page="1" href="#">1</a></li>';
            }
        }
    }
});
```

### События

| Триггер                 | Описание                           | Инициатор   |
| ----------------------- | ---------------------------------- | ----------- |
| change-pagination-pipui | Срабатывает при изменении страницы | .pagination |
| update-pagination-pipui | Срабатывает при обновлении списка  | .pagination |
|                         |                                    |             |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://v2-0-0.pipui.ru/components/pagination.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
