{"version":3,"file":"bootkit-ng1-components-pagination.mjs","sources":["../../../projects/ng1/components/pagination/pagination.component.ts","../../../projects/ng1/components/pagination/pagination.component.html","../../../projects/ng1/components/pagination/pagination.module.ts","../../../projects/ng1/components/pagination/bootkit-ng1-components-pagination.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { Component, ChangeDetectionStrategy, input, computed, Output, EventEmitter, booleanAttribute, numberAttribute } from '@angular/core';\nimport { TranslatePipe } from '@bootkit/ng1/localization';\n\n/**\n * Pagination component for displaying page numbers and navigation controls.\n * It calculates the total number of pages based on the total records and page size,\n * and determines which page numbers to display based on the selected page and maximum visible pages.\n */\n@Component({\n  selector: 'ng1-pagination',\n  exportAs: 'ng1Pagination',\n  templateUrl: './pagination.component.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  standalone: true,\n  imports: [\n    CommonModule,\n    TranslatePipe\n  ]\n})\nexport class PaginationComponent {\n  /**\n   * Total number of records.\n   */\n  public readonly totalRecords = input.required({ transform: numberAttribute });\n\n  /**\n   * Page size. Number of items in each page.\n   * @default 10\n   */\n  public readonly pageSize = input(10, { transform: numberAttribute });\n\n  /** \n   * Zero-based index of the selected page.\n   * @default 0\n   */\n  public readonly selectedPage = input(0, { transform: numberAttribute });\n\n  /**\n   * Maximum number of visible pages.\n   * @default 10\n   */\n  public readonly maxVisiblePages = input(10, { transform: numberAttribute });\n\n  /**\n   * Show first and last buttons.\n   * @default true\n   */\n  public readonly showNextPreviousButtons = input(true, { transform: booleanAttribute });\n\n  /**\n   * Show first and last buttons.\n   * @default true\n   */\n  public readonly showFirstLastButtons = input(true, { transform: booleanAttribute });\n\n  /**\n   * Total number of pages.\n   * This is a computed property based on totalRecords and pageSize.\n   * It is not an input property.\n   */\n  public get totalPagesCount() { return this._totalPagesCount; }\n\n  /** \n   * Emits the selected page index when a page is clicked.\n   * The index starts from 1.\n   */\n  @Output() public readonly itemClick = new EventEmitter<number>();\n\n  protected _totalPagesCount!: number;\n\n  protected _visiblePages = computed(() => {\n    let selectedPage = this.selectedPage();\n    let totalRecords = this.totalRecords();\n    let pageSize = this.pageSize();\n\n    if (!Number.isInteger(totalRecords) || totalRecords < 0) {\n      throw new Error('Total items must be a posotive integer.');\n    }\n\n    if (!Number.isInteger(pageSize) || pageSize <= 0) {\n      throw new Error('Page size must be a posotive integer.');\n    }\n\n    this._totalPagesCount = Math.ceil(totalRecords / pageSize);\n\n    if (selectedPage < 0 || selectedPage > this._totalPagesCount) {\n      throw new Error(`Selected page index must be between 0 and ${this._totalPagesCount - 1}.`);\n    }\n\n    let indices = [];\n    let firstVisiblePage = selectedPage;\n    let lastVisiblePage = firstVisiblePage;\n    let maxVisiblePages = this.maxVisiblePages();\n    indices.push(firstVisiblePage);\n\n    for (let i = 0; i < maxVisiblePages; i++) {\n      if (lastVisiblePage < this._totalPagesCount - 1) {\n        lastVisiblePage++;\n        indices.push(lastVisiblePage);\n      }\n\n      if (indices.length >= maxVisiblePages) {\n        break;\n      }\n\n      if (firstVisiblePage > 0) {\n        firstVisiblePage--;\n        indices.unshift(firstVisiblePage);\n      }\n    }\n\n    return indices;\n  });\n}\n","@let _selectedPage = selectedPage();\n\n<nav>\n  <ul class=\"pagination\">\n    @if(showFirstLastButtons() || showFirstLastButtons() == undefined) {\n    <li class=\"page-item\" [class.disabled]=\"_selectedPage == undefined || _selectedPage <= 1\">\n      <button class=\"page-link\" (click)=\"itemClick.emit(1)\">\n        <ng-content select=\"first\">\n          {{'first' | ng1Translate}}\n        </ng-content>\n      </button>\n    </li>\n    }\n\n    @if(showNextPreviousButtons() || showNextPreviousButtons() == undefined) {\n    <li class=\"page-item\" [class.disabled]=\"_selectedPage == undefined || _selectedPage <= 1\">\n      <button class=\"page-link\" (click)=\"itemClick.emit(_selectedPage! - 1)\">\n        <ng-content select=\"previous\">\n          {{'previous' | ng1Translate}}\n        </ng-content>\n      </button>\n    </li>\n    }\n\n    @for (page of _visiblePages(); track page) {\n    <li class=\"page-item\" [class.active]=\"_selectedPage === page\">\n      <button class=\"page-link\" (click)=\"itemClick.emit(page)\">\n        {{page + 1}}\n      </button>\n    </li>\n    }\n\n    @if(showNextPreviousButtons() || showNextPreviousButtons() == undefined) {\n    <li class=\"page-item\" [class.disabled]=\"_selectedPage == undefined || _selectedPage >= _totalPagesCount - 1\">\n      <button class=\"page-link\" (click)=\"itemClick.emit(_selectedPage! + 1)\">\n        <ng-content select=\"next\">\n          {{'next' | ng1Translate}}\n        </ng-content>\n      </button>\n    </li>\n    }\n\n    @if(showFirstLastButtons() || showFirstLastButtons() == undefined) {\n    <li class=\"page-item\" [class.disabled]=\"_selectedPage == undefined || _selectedPage >= _totalPagesCount - 1\">\n      <button class=\"page-link\" (click)=\"itemClick.emit(_totalPagesCount)\">\n        <ng-content select=\"last\">\n          {{'last' | ng1Translate}}\n        </ng-content>\n      </button>\n    </li>\n    }\n  </ul>\n</nav>\n\n<style>\n  .pagination {\n    margin: 0;\n  }\n</style>","import { NgModule } from '@angular/core';\nimport { PaginationComponent } from './pagination.component';\n\n@NgModule({\n    imports: [\n        PaginationComponent\n    ],\n    exports: [\n        PaginationComponent\n    ]\n})\nexport class PaginationModule {\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}