{"version":3,"file":"angular-paginator.mjs","names":[],"sources":["../../../projects/angular-paginator/src/lib/services/angular-paginator.service.ts","../../../projects/angular-paginator/src/lib/pipes/angular-paginator.pipe.ts","../../../projects/angular-paginator/src/lib/directives/angular-paginator.directive.ts","../../../projects/angular-paginator/src/lib/angular-paginator.module.ts"],"sourcesContent":["import { Injectable, EventEmitter } from '@angular/core';\n\nimport { AngularPaginatorInstance } from '../others/angular-paginator.interface';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class AngularPaginatorService {\n  /** id is used to identify pagination instances */\n  static id = 'ANGULAR_PAGINATOR_DEFAULT';\n\n  /** instances is the collection of pagination componetns */\n  instances: Record<string, AngularPaginatorInstance> = {};\n\n  /** emits an event with instance id whenever the page number changes */\n  change: EventEmitter<string> = new EventEmitter<string>();\n\n  /**\n   * creates an instance for every pipe differentiated with id\n   *\n   * @param instance each instance refers to a unique pagination component\n   */\n  registerInstance(instance: AngularPaginatorInstance): void {\n    if (!this.instances[instance.id]) {\n      this.instances[instance.id] = instance;\n      this.change.emit(instance.id);\n    } else {\n      const changed = this.updateInstance(instance);\n      if (changed) {\n        this.change.emit(instance.id);\n      }\n    }\n  }\n\n  /**\n   * updates existing pagination instances available\n   * and returns true if value has changed\n   *\n   * @param instance an unique pagination component\n   */\n  private updateInstance(instance: AngularPaginatorInstance): boolean {\n    let updated = false;\n    const currentInstance = this.instances[instance.id];\n\n    for (const [k, v] of Object.entries(instance)) {\n      const key = k as keyof AngularPaginatorInstance;\n\n      if (key !== 'id' && currentInstance[k as keyof AngularPaginatorInstance] !== v && !updated) {\n        this.instances[instance.id] = {\n          ...instance,\n          id: instance.id,\n        };\n        updated = true;\n      }\n    }\n\n    return updated;\n  }\n\n  /**\n   * return instance with given id\n   *\n   * @param id unique id of the pagination component\n   */\n  getInstance(id: string): AngularPaginatorInstance {\n    return this.instances[id];\n  }\n\n  /**\n   * return currentPage for given id\n   *\n   * @param id unique id of the pagination component\n   */\n  getCurrentPage(id: string): number {\n    return this.instances[id].currentPage;\n  }\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\n\nimport { AngularPaginatorService } from '../services/angular-paginator.service';\nimport { AngularPaginatorInstance, PaginatorPipeArgs } from '../others/angular-paginator.interface';\n\n/**\n * Pagination Pipe which paginates the array for the provided arguments such as `itemsPerPage` and `currentPage`\n */\n@Pipe({\n  name: 'angularPaginator',\n  standalone: true,\n})\nexport class AngularPaginatorPipe implements PipeTransform {\n  private angularPaginatorService = inject(AngularPaginatorService);\n\n  /**\n   * this pipes paginates the array for the provided arguments such as `itemsPerPage` and `currentPage`\n   *\n   * @param array input array for which the manipulation happens\n   * @param args input arguments for the paginator pipe\n   */\n  transform<T>(array: T[] | null | undefined, args?: PaginatorPipeArgs): T[] {\n    const items = array ?? [];\n    const instance: AngularPaginatorInstance = this.createInstance(items, args);\n\n    // create pagination information\n    this.angularPaginatorService.registerInstance(instance);\n\n    // slice a valid page, the paginator directive emits the corrected page number\n    const totalPages = Math.max(Math.ceil(instance.totalItems / instance.itemsPerPage), 1);\n    const page = Math.min(Math.max(instance.currentPage, 1), totalPages);\n\n    // set the slicing range\n    const start = (page - 1) * instance.itemsPerPage;\n    const end = page * instance.itemsPerPage;\n\n    return items.slice(start, end);\n  }\n\n  /**\n   * create an instance for each pipe\n   *\n   * @param array input array for which the manipulation happens\n   * @param args input arguments for the paginator pipe\n   */\n  private createInstance(array: unknown[], args?: PaginatorPipeArgs): AngularPaginatorInstance {\n    return {\n      id: args?.id ? args.id : AngularPaginatorService.id,\n      currentPage: args?.currentPage ? args.currentPage : 1,\n      itemsPerPage: args?.itemsPerPage ? args.itemsPerPage : 10,\n      totalItems: array.length,\n    };\n  }\n}\n","import { Directive, OnInit, OnDestroy, Input, Output, EventEmitter, afterNextRender, inject, signal } from '@angular/core';\nimport { AngularPaginatorService } from '../services/angular-paginator.service';\nimport { AngularPaginatorInstance, Page } from '../others/angular-paginator.interface';\nimport { Subscription } from 'rxjs';\n\n/**\n * This is the directive where the actual pagination takes place, it provides a sync between the\n * pipes and the pagination component\n */\n@Directive({\n  selector: 'angularPaginator, [angularPaginator]',\n  exportAs: 'angularPaginator',\n  standalone: true,\n})\nexport class AngularPaginatorDirective implements OnInit, OnDestroy {\n  private angularPaginatorService = inject(AngularPaginatorService);\n\n  /**\n   * Use unique id when multiple paginations are being used on the same page.\n   * By Default Paginator uses id `ANGULAR_PAGINATOR_DEFAULT`\n   */\n  @Input() id: string = AngularPaginatorService.id;\n\n  /**\n   * Limit number for pagination size, i.e., the maximum page numbers to be displayed\n   */\n  @Input() maxSize?: number;\n\n  /**\n   * Whether to keep current page in the middle of the visible ones\n   */\n  @Input() rotate = false;\n\n  /**\n   * Whether to always display the first and last page numbers.\n   * If max-size is smaller than the number of pages, then the first and last page numbers are still shown with ellipses\n   * in-between as necessary. NOTE: max-size refers to the center of the range.\n   * This option may add up to 2 more numbers on each side of the displayed range for the end value and\n   * what would be an ellipsis but is replaced by a number because it is sequential\n   */\n  @Input() boundaryLinkNumbers = false;\n\n  /**\n   * Also displays ellipses when rotate is true and maxSize is smaller than the number of pages forceEllipses\n   */\n  @Input() forceEllipses = false;\n\n  firstPage = 1;\n\n  /**\n   * State is kept in signals so that templates reading it are refreshed when the pipe registers\n   * or updates its instance later in the same change detection pass, including OnPush views\n   */\n  private readonly currentPageState = signal<number | undefined>(undefined);\n  private readonly lastPageState = signal(0);\n  private readonly pagesState = signal<Page[]>([]);\n\n  /** last instance for which an out of range page correction was emitted */\n  private correctedInstance?: AngularPaginatorInstance;\n\n  get currentPage(): number {\n    return this.currentPageState() ?? this.firstPage;\n  }\n\n  get lastPage(): number {\n    return this.lastPageState();\n  }\n\n  get pages(): Page[] {\n    return this.pagesState();\n  }\n\n  private subscription: Subscription;\n\n  /**\n   * Emits an event whenever the current page is changed, It emits the current page number\n   */\n  @Output() pageChange: EventEmitter<number> = new EventEmitter<number>(true);\n\n  /**\n   *\n   * @param angularPaginatorService serivce for angular paginator\n   */\n  constructor() {\n    // subscribe to changes\n    this.subscription = this.angularPaginatorService.change.subscribe((id: string) => {\n      if (id === this.id) {\n        this.updatePages();\n      }\n    });\n\n    // validate once rendering is complete, the pipe may be rendered after the paginator\n    afterNextRender(() => this.isValidId());\n  }\n\n  /**\n   * Navigate to prevoius page\n   */\n  toPreviousPage(): void {\n    if (this.currentPage > this.firstPage) {\n      this.setPage(this.currentPage - 1);\n    }\n  }\n\n  /**\n   * Navigate to next page\n   */\n  toNextPage(): void {\n    if (this.currentPage < this.lastPage) {\n      this.setPage(this.currentPage + 1);\n    }\n  }\n\n  /**\n   * Navigate to first page\n   */\n  toFirstPage(): void {\n    this.setPage(this.firstPage);\n  }\n\n  /**\n   * Navigate to last page\n   */\n  toLastPage(): void {\n    this.setPage(this.lastPage);\n  }\n\n  /**\n   * Sets current page\n   *\n   * @param page page number to set as currentPage\n   */\n  setCurrentPage(page: number): void {\n    this.setPage(page);\n  }\n\n  /**\n   *\n   * @param page  page number to set\n   */\n  private setPage(page: number): void {\n    if (page && this.currentPage !== page) {\n      this.currentPageState.set(page);\n      this.pageChange.emit(page);\n    }\n  }\n\n  /**\n   * create page object used for template\n   *\n   * @param pageNumber page number\n   * @param text page number, text to be displayed\n   * @param isActive whether the page is active or not, true for currentPage\n   */\n  private makePage(pageNumber: number, text: string, isActive: boolean): Page {\n    return {\n      number: pageNumber,\n      text,\n      active: isActive,\n    };\n  }\n\n  /**\n   *  computes the page limit\n   *\n   * @param currentPage current page number\n   * @param itemsPerPage total items per page\n   * @param totalItems no of items for pagination, usually array length\n   */\n  private computePageLimits(currentPage: number, totalItems: number, itemsPerPage: number) {\n    const totalPages = Math.ceil(totalItems / itemsPerPage);\n\n    // Default page limits\n    let startPage = 1;\n    let endPage = totalPages;\n\n    const isMaxSized = this.maxSize ? this.maxSize < totalPages : false;\n\n    // recompute if maxSize\n    if (isMaxSized && this.maxSize) {\n      if (this.rotate) {\n        // current page is displayed in the middle of the visible ones\n        startPage = Math.max(currentPage - Math.floor(this.maxSize / 2), 1);\n        endPage = startPage + this.maxSize - 1;\n\n        // Adjust if limit is exceeded\n        if (endPage > totalPages) {\n          endPage = totalPages;\n          startPage = endPage - this.maxSize + 1;\n        }\n      } else {\n        // Visible pages are paginated with maxSize\n        startPage = (Math.ceil(currentPage / this.maxSize) - 1) * this.maxSize + 1;\n\n        // adjust last page if limit is exceeded\n        endPage = Math.min(startPage + this.maxSize - 1, totalPages);\n      }\n    }\n\n    return {\n      startPage,\n      endPage,\n      totalPages,\n      isMaxSized,\n    };\n  }\n\n  /**\n   *  create page array\n   *\n   * @param currentPage current page number\n   * @param itemsPerPage total items per page\n   * @param totalItems no of items for pagination, usually array length\n   */\n  private getPages(currentPage: number, itemsPerPage: number, totalItems: number): Page[] {\n    const pages: Page[] = [];\n\n    const pageLimits = this.computePageLimits(currentPage, totalItems, itemsPerPage);\n    const { startPage, endPage, totalPages, isMaxSized } = pageLimits;\n\n    this.lastPageState.set(totalPages);\n\n    // add page number links\n    for (let pageNumber = startPage; pageNumber <= endPage; pageNumber += 1) {\n      const page = this.makePage(pageNumber, pageNumber.toString(), pageNumber === currentPage);\n      pages.push(page);\n    }\n\n    // add links to move between page sets\n    if (\n      isMaxSized &&\n      this.maxSize &&\n      this.maxSize > 0 &&\n      (!this.rotate || this.forceEllipses || this.boundaryLinkNumbers)\n    ) {\n      if (startPage > 1) {\n        // need ellipsis for all options unless range is too close to beginning\n        if (!this.boundaryLinkNumbers || startPage > 3) {\n          const previousPageSet = this.makePage(startPage - 1, '...', false);\n          pages.unshift(previousPageSet);\n        }\n\n        if (this.boundaryLinkNumbers) {\n          if (startPage === 3) {\n            // need to replace ellipsis when the buttons would be sequential\n            const secondPageLink = this.makePage(2, '2', false);\n            pages.unshift(secondPageLink);\n          }\n\n          // add the first page\n          const firstPageLink = this.makePage(1, '1', false);\n          pages.unshift(firstPageLink);\n        }\n      }\n\n      if (endPage < totalPages) {\n        // need ellipsis for all options unless range is too close to end\n        if (!this.boundaryLinkNumbers || endPage < totalPages - 2) {\n          const nextPageSet = this.makePage(endPage + 1, '...', false);\n          pages.push(nextPageSet);\n        }\n\n        if (this.boundaryLinkNumbers) {\n          // need to replace ellipsis when the buttons would be sequential\n          if (endPage === totalPages - 2) {\n            const secondToLastPageLink = this.makePage(totalPages - 1, (totalPages - 1).toString(), false);\n            pages.push(secondToLastPageLink);\n          }\n\n          // add the last page\n          const lastPageLink = this.makePage(totalPages, totalPages.toString(), false);\n          pages.push(lastPageLink);\n        }\n      }\n    }\n    return pages;\n  }\n\n  /**\n   * Updates the pagination component\n   */\n  private updatePages(): void {\n    const instance: AngularPaginatorInstance = this.angularPaginatorService.getInstance(this.id);\n\n    const correctedCurrentPage = this.outOfBoundCorrection(instance);\n    const previousPage = this.currentPageState();\n\n    this.currentPageState.set(correctedCurrentPage);\n    this.pagesState.set(this.getPages(correctedCurrentPage, instance.itemsPerPage, instance.totalItems));\n\n    // emit when the page had to be corrected or was changed by the pipe,\n    // but not when syncing with the pipe for the first time.\n    // instances are replaced on update, so each instance is corrected only once\n    const isCorrected = correctedCurrentPage !== instance.currentPage && instance !== this.correctedInstance;\n    const isChanged = previousPage !== undefined && previousPage !== correctedCurrentPage;\n\n    if (isCorrected) {\n      this.correctedInstance = instance;\n    }\n\n    if (isCorrected || isChanged) {\n      this.pageChange.emit(correctedCurrentPage);\n    }\n  }\n\n  /**\n   * Check if currentPage is out of bound with totalPages\n   *\n   * @param instance instance for which the range is to be corrected\n   */\n  private outOfBoundCorrection(instance: AngularPaginatorInstance): number {\n    const totalPages = Math.ceil(instance.totalItems / instance.itemsPerPage);\n\n    if (totalPages < instance.currentPage && totalPages > 0) {\n      return totalPages;\n    } else if (instance.currentPage < 1) {\n      return 1;\n    }\n\n    return instance.currentPage;\n  }\n\n  /**\n   * check if there is any instance registered with the id\n   */\n  isValidId(): void {\n    if (!this.angularPaginatorService.getInstance(this.id)) {\n      throw new Error(`There is no instance registered with id \\`${this.id}\\``);\n    }\n  }\n\n  ngOnInit(): void {\n    // the pipe may not have registered yet when the paginator is placed before it in the template,\n    // in which case the pages are updated once it registers\n    if (this.angularPaginatorService.getInstance(this.id)) {\n      this.updatePages();\n    }\n  }\n\n\n  ngOnDestroy(): void {\n    /** destroy the subscription when the directive is destroyed */\n    this.subscription.unsubscribe();\n  }\n}\n","import { NgModule } from '@angular/core';\n\nimport { AngularPaginatorPipe } from './pipes/angular-paginator.pipe';\nimport { AngularPaginatorDirective } from './directives/angular-paginator.directive';\n\n@NgModule({\n  imports: [AngularPaginatorDirective, AngularPaginatorPipe],\n  exports: [AngularPaginatorDirective, AngularPaginatorPipe],\n})\nexport class AngularPaginatorModule {}\n"],"mappings":"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"}