Skip to content
Merged
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
40 changes: 19 additions & 21 deletions docs/components-api/paginator.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,33 +2,31 @@

# ExtraPaginator

> ✅ **Реализован**: `ExtraPaginatorComponent` (`@cdek-it/angular-ui-kit`) соответствует спецификации.

Постраничная навигация по данным.

| Свойство | Описание | Типизация |
| -------------------------- | --------------------------------------------------- | ---------- |
| `rows` | количество элементов на странице | `number` |
| `totalRecords` | общее количество записей | `number` |
| `first` | индекс первой записи (0-based) | `number` |
| `rowsPerPageOptions` | варианты количества элементов на странице | `number[]` |
| `showJumpToPage` | поле для перехода к конкретной странице | `boolean` |
| `showJumpToPageReset` | отображать иконку очистки поля выбора страницы | `boolean` |
| `jumpToPagePlaceholder` | плэйсхолдер поля выбора страницы | `string` |
| `showDropdown` | селект для перехода к конкретной странице | `boolean` |
| `showDropdownReset` | отображать иконку очистки дропдауна выбора страницы | `boolean` |
| `dropdownPlaceholder` | плэйсхолдер дропдауна выбора страницы | `string` |
| `showButtons` | отображение "стрелок" перевлючения страницы | `boolean` |
| Свойство | Описание | Типизация |
| ----------------------- | ----------------------------------------- | ---------- |
| `rows` | количество элементов на странице | `number` |
| `totalRecords` | общее количество записей | `number` |
| `first` | индекс первой записи (0-based) | `number` |
| `rowsPerPageOptions` | варианты количества элементов на странице | `number[]` |
| `showJumpToPage` | поле для перехода к конкретной странице | `boolean` |
| `jumpToPagePlaceholder` | плэйсхолдер поля выбора страницы | `string` |
| `showDropdown` | селект для перехода к конкретной странице | `boolean` |

# События

| Событие | Описание | Типизация |
| -------------- | ------------------------------ | -------------------------------------- |
| Событие | Описание | Типизация |
| ------------ | ------------------------------ | -------------------------------------- |
| `pageChange` | срабатывает при смене страницы | `(event: ExtraPaginatorState) => void` |

# ExtraPaginatorState

| Свойство | Описание | Типизация |
| ------------ | -------------------------- | --------- |
| `page` | текущая страница (0-based) | `number` |
| `first` | индекс первой записи | `number` |
| `rows` | элементов на странице | `number` |
| `pageCount` | всего страниц | `number` |
| Свойство | Описание | Типизация |
| ----------- | -------------------------- | --------- |
| `page` | текущая страница (0-based) | `number` |
| `first` | индекс первой записи | `number` |
| `rows` | элементов на странице | `number` |
| `pageCount` | всего страниц | `number` |
40 changes: 33 additions & 7 deletions src/lib/components/paginator/paginator.component.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
import { Paginator } from 'primeng/paginator';
import type { PaginatorState } from 'primeng/types/paginator';
import type { PaginatorPassThrough, PaginatorState } from 'primeng/types/paginator';

export type ExtraPaginatorState = PaginatorState;

@Component({
selector: 'extra-paginator',
standalone: true,
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [Paginator],
template: `
<p-paginator
Expand All @@ -17,11 +18,12 @@ export type ExtraPaginatorState = PaginatorState;
[currentPageReportTemplate]="currentPageReportTemplate"
[showCurrentPageReport]="showCurrentPageReport"
[showFirstLastIcon]="showFirstLastIcon"
[showJumpToPageDropdown]="showJumpToPageDropdown"
[showJumpToPageInput]="showJumpToPageInput"
[showJumpToPageDropdown]="showDropdown"
[showJumpToPageInput]="showJumpToPage"
[showPageLinks]="showPageLinks"
[pageLinkSize]="pageLinkSize"
[alwaysShow]="alwaysShow"
[pt]="pt"
(onPageChange)="onPageChange.emit($event)"
></p-paginator>
`
Expand All @@ -30,14 +32,38 @@ export class ExtraPaginatorComponent {
@Input() first = 0;
@Input() rows = 10;
@Input() totalRecords = 0;
@Input() rowsPerPageOptions: any[] | undefined;
@Input() rowsPerPageOptions: number[] | undefined;
@Input() currentPageReportTemplate = '{currentPage} из {totalPages}';
@Input() showCurrentPageReport = false;
@Input() showFirstLastIcon = true;
@Input() showJumpToPageDropdown = false;
@Input() showJumpToPageInput = false;
/** Селект для перехода к конкретной странице (альтернатива полю ввода `showJumpToPage`). */
@Input() showDropdown = false;
/** Поле ввода номера для перехода к конкретной странице. */
@Input() showJumpToPage = false;
/** Плейсхолдер поля ввода номера страницы — пробрасывается через `pt`, т.к. у PrimeNG
* `p-paginator` нет собственного @Input для этого (см. `paginator.figma.md`). */
@Input() jumpToPagePlaceholder: string | undefined = undefined;
@Input() showPageLinks = true;
@Input() pageLinkSize = 5;
@Input() alwaysShow = true;
@Output() onPageChange = new EventEmitter<ExtraPaginatorState>();

private _ptPlaceholder?: string;
private _pt: PaginatorPassThrough = {};

/** Пересобираем объект только при смене плейсхолдера: новый объект на каждую
* проверку изменений заставлял PrimeNG переприменять pass-through каждый цикл. */
get pt(): PaginatorPassThrough {
if (this._ptPlaceholder !== this.jumpToPagePlaceholder) {
this._ptPlaceholder = this.jumpToPagePlaceholder;
this._pt = {
pcJumpToPageInput: {
pcInputText: {
root: { placeholder: this.jumpToPagePlaceholder }
}
}
};
}
return this._pt;
}
}
31 changes: 25 additions & 6 deletions src/lib/components/paginator/paginator.figma.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ updated: '2026-06-22'

`ExtraPaginatorComponent` — компонент постраничной навигации по большим спискам и таблицам. Разбивает данные на страницы, отображает кнопки prev/next, номера страниц и, опционально, выбор размера страницы, поле прыжка на страницу и текст с текущей позицией. Оборачивает PrimeNG `p-paginator`.

Компонент соответствует Figma-компоненту `<Paginator>` (component set, nodeId `1284:1732`, fileKey `Khh7arsuXss3ncqy1Dz3OZ`, библиотека «UI Kit (DS) v2.0»). Опциональные блоки управляются Figma-свойствами `show-jump` (поле прыжка на страницу), `show-dropdown` (выпадающий выбор размера страницы) и осью `template`.
Компонент соответствует Figma-компоненту `<Paginator>` (component set, nodeId `1284:1732`, fileKey `Khh7arsuXss3ncqy1Dz3OZ`, библиотека «UI Kit (DS) v2.0»). Опциональные блоки управляются Figma-свойствами `show-jump` (поле прыжка на страницу — `<InputNumber>`) и `show-dropdown` (выпадающий список для прыжка на страницу — альтернатива `show-jump`, НЕ связана с выбором размера страницы `rowsPerPageOptions`) и осью `template`.

Компонент событийный: текущая страница не хранится через `ControlValueAccessor`, а сообщается наружу событием `(onPageChange)`. Состояние страницы задаётся входами `first` и `rows`.

Expand All @@ -32,13 +32,17 @@ updated: '2026-06-22'
| `currentPageReportTemplate` | `string` | `'{currentPage} из {totalPages}'` | Шаблон текста текущей позиции (плейсхолдеры `{currentPage}`, `{totalPages}` и др.) |
| `showCurrentPageReport` | `boolean` | `false` | Показывать текст с текущей страницей и общим числом |
| `showFirstLastIcon` | `boolean` | `true` | Показывать кнопки перехода на первую и последнюю страницу |
| `showJumpToPageDropdown` | `boolean` | `false` | Показывать выпадающий список для прыжка на страницу |
| `showJumpToPageInput` | `boolean` | `false` | Показывать поле ввода для прыжка на страницу — соответствует Figma-свойству `show-jump` |
| `showDropdown` | `boolean` | `false` | Показывать выпадающий список для прыжка на страницу — соответствует Figma-свойству `show-dropdown`. Переименован из PrimeNG-имени `showJumpToPageDropdown` под спеку |
| `showJumpToPage` | `boolean` | `false` | Показывать поле ввода для прыжка на страницу — соответствует Figma-свойству `show-jump`. Переименован из PrimeNG-имени `showJumpToPageInput` под спеку |
| `jumpToPagePlaceholder` | `string \| undefined` | `undefined` | Плейсхолдер поля ввода номера страницы (видим только при `showJumpToPage=true`) — пробрасывается через `[pt]="{ pcJumpToPageInput: { pcInputText: { root: { placeholder } } } }"`, т.к. `p-paginator` не прокидывает `placeholder` в компонентный `@Input()` вложенного `p-inputnumber` напрямую |
| `showPageLinks` | `boolean` | `true` | Показывать номера страниц |
| `pageLinkSize` | `number` | `5` | Количество одновременно отображаемых ссылок на страницы |
| `alwaysShow` | `boolean` | `true` | Показывать пагинатор даже при единственной странице |
| `(onPageChange)` | `EventEmitter<ExtraPaginatorState>` | — | Событие смены страницы; содержит `page`, `first`, `rows`, `pageCount` |

`showJumpToPageReset`/`showDropdownReset`/`dropdownPlaceholder`/`showButtons` из черновика спеки не
реализованы — см. пояснение в `docs/components-api/paginator.md`.

## Variants

### Default (базовая навигация)
Expand Down Expand Up @@ -68,9 +72,10 @@ Figma: `<Paginator>`, template=false
></extra-paginator>
```

### С выбором размера страницы (show-dropdown)
### С выбором размера страницы (rowsPerPageOptions)

Figma: `<Paginator>`, show-dropdown=true
Figma: `<Paginator>` (общий компонент; `rowsPerPageOptions` не связан с Figma-свойством
`show-dropdown` — то отвечает за переход к странице, см. вариант ниже)

```html
<extra-paginator
Expand All @@ -89,7 +94,21 @@ Figma: `<Paginator>`, show-jump=true
<extra-paginator
[totalRecords]="120"
[rows]="10"
[showJumpToPageInput]="true"
[showJumpToPage]="true"
jumpToPagePlaceholder="Страница"
(onPageChange)="onPageChange($event)"
></extra-paginator>
```

### С выпадающим списком для прыжка на страницу (show-dropdown)

Figma: `<Paginator>`, show-dropdown=true — альтернатива полю ввода `show-jump`

```html
<extra-paginator
[totalRecords]="120"
[rows]="10"
[showDropdown]="true"
(onPageChange)="onPageChange($event)"
></extra-paginator>
```
Expand Down
1 change: 0 additions & 1 deletion src/lib/components/paginator/public_api.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
export * from './paginator.component';

Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ const template = `
[rows]="rows"
[totalRecords]="120"
[rowsPerPageOptions]="[10, 20, 30]"
[showJumpToPageInput]="true"
[showJumpToPage]="true"
(onPageChange)="onPageChange($event)"
></extra-paginator>
`;
Expand Down Expand Up @@ -55,7 +55,7 @@ import { ExtraPaginatorComponent } from '@cdek-it/angular-ui-kit';
[rows]="rows"
[totalRecords]="120"
[rowsPerPageOptions]="[10, 20, 30]"
[showJumpToPageInput]="true"
[showJumpToPage]="true"
(onPageChange)="onPageChange($event)"
></extra-paginator>
\`,
Expand Down
50 changes: 37 additions & 13 deletions src/stories/components/paginator/paginator.stories.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ type PaginatorArgs = Pick<
| 'showFirstLastIcon'
| 'showPageLinks'
| 'showCurrentPageReport'
| 'showJumpToPageInput'
| 'showJumpToPage'
| 'jumpToPagePlaceholder'
| 'showDropdown'
| 'alwaysShow'
>;

Expand All @@ -36,7 +38,7 @@ const meta: Meta<PaginatorArgs> = {
component: `Отображает навигацию по страницам для больших наборов данных.

\`\`\`typescript
import { ExtraPaginatorComponent } from '@cdek-it/angular-ui-kit';
import { ExtraPaginatorComponent } from '@cdek-it/angular-ui-kit/components/paginator';
\`\`\``
}
},
Expand All @@ -47,7 +49,7 @@ import { ExtraPaginatorComponent } from '@cdek-it/angular-ui-kit';
control: { type: 'number', min: 0 },
description: 'Общее количество записей',
table: {
category: 'Props',
category: 'Свойства',
defaultValue: { summary: '0' },
type: { summary: 'number' }
}
Expand All @@ -56,7 +58,7 @@ import { ExtraPaginatorComponent } from '@cdek-it/angular-ui-kit';
control: { type: 'number', min: 1 },
description: 'Количество строк на странице',
table: {
category: 'Props',
category: 'Свойства',
defaultValue: { summary: '10' },
type: { summary: 'number' }
}
Expand All @@ -65,7 +67,7 @@ import { ExtraPaginatorComponent } from '@cdek-it/angular-ui-kit';
control: { type: 'number', min: 1 },
description: 'Количество отображаемых ссылок на страницы',
table: {
category: 'Props',
category: 'Свойства',
defaultValue: { summary: '5' },
type: { summary: 'number' }
}
Expand All @@ -74,7 +76,7 @@ import { ExtraPaginatorComponent } from '@cdek-it/angular-ui-kit';
control: 'boolean',
description: 'Показывать кнопки перехода на первую и последнюю страницу',
table: {
category: 'Props',
category: 'Свойства',
defaultValue: { summary: 'true' },
type: { summary: 'boolean' }
}
Expand All @@ -83,7 +85,7 @@ import { ExtraPaginatorComponent } from '@cdek-it/angular-ui-kit';
control: 'boolean',
description: 'Показывать номера страниц',
table: {
category: 'Props',
category: 'Свойства',
defaultValue: { summary: 'true' },
type: { summary: 'boolean' }
}
Expand All @@ -92,16 +94,34 @@ import { ExtraPaginatorComponent } from '@cdek-it/angular-ui-kit';
control: 'boolean',
description: 'Показывать текст с текущей страницей и общим количеством',
table: {
category: 'Props',
category: 'Свойства',
defaultValue: { summary: 'false' },
type: { summary: 'boolean' }
}
},
showJumpToPageInput: {
showJumpToPage: {
control: 'boolean',
description: 'Показывать поле ввода для перехода на конкретную страницу',
table: {
category: 'Props',
category: 'Свойства',
defaultValue: { summary: 'false' },
type: { summary: 'boolean' }
}
},
jumpToPagePlaceholder: {
control: 'text',
description: 'Плейсхолдер поля ввода номера страницы (видим только при showJumpToPage=true)',
table: {
category: 'Свойства',
defaultValue: { summary: 'undefined' },
type: { summary: 'string' }
}
},
showDropdown: {
control: 'boolean',
description: 'Показывать селект для перехода на конкретную страницу',
table: {
category: 'Свойства',
defaultValue: { summary: 'false' },
type: { summary: 'boolean' }
}
Expand All @@ -110,7 +130,7 @@ import { ExtraPaginatorComponent } from '@cdek-it/angular-ui-kit';
control: 'boolean',
description: 'Показывать пагинатор даже при единственной странице',
table: {
category: 'Props',
category: 'Свойства',
defaultValue: { summary: 'true' },
type: { summary: 'boolean' }
}
Expand All @@ -123,7 +143,9 @@ import { ExtraPaginatorComponent } from '@cdek-it/angular-ui-kit';
showFirstLastIcon: true,
showPageLinks: true,
showCurrentPageReport: false,
showJumpToPageInput: false,
showJumpToPage: true,
jumpToPagePlaceholder: 'Страница',
showDropdown: false,
alwaysShow: true
}
};
Expand All @@ -145,7 +167,9 @@ export const Default: Story = {
[showFirstLastIcon]="showFirstLastIcon"
[showPageLinks]="showPageLinks"
[showCurrentPageReport]="showCurrentPageReport"
[showJumpToPageInput]="showJumpToPageInput"
[showJumpToPage]="showJumpToPage"
[jumpToPagePlaceholder]="jumpToPagePlaceholder"
[showDropdown]="showDropdown"
[alwaysShow]="alwaysShow"
></extra-paginator>
`
Expand Down
Loading