{"version":3,"file":"ngx-gilmapi-paginator.mjs","sources":["../../../projects/ui-angular-components/paginator/src/components/paginator/paginator.component.ts","../../../projects/ui-angular-components/paginator/src/components/paginator/paginator.component.html","../../../projects/ui-angular-components/paginator/src/components/paginator/paginator.module.ts","../../../projects/ui-angular-components/paginator/src/interfaces/IPaginator.ts","../../../projects/ui-angular-components/paginator/ngx-gilmapi-paginator.ts"],"sourcesContent":["import {\n  CommonModule,\n  Location,\n} from '@angular/common';\nimport {\n  Component,\n  computed,\n  effect,\n  inject,\n  input,\n  Input,\n  linkedSignal,\n  model,\n  OnDestroy,\n  OnInit,\n  signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { ButtonModule } from 'primeng/button';\n\nimport { IPaginator } from '../../interfaces/IPaginator';\n\n@Component({\n  selector: 'ngx-gmp-paginator',\n  templateUrl: './paginator.component.html',\n  styleUrls: ['./paginator.component.scss'],\n  standalone: true,\n  imports: [CommonModule, FormsModule, ButtonModule],\n})\nexport class GmpPaginatorComponent implements OnInit, OnDestroy {\n  private location = inject(Location);\n  private resizeListener: (() => void) | null = null;\n  @Input() mobileWidth = 768;\n  @Input() setUrl!: boolean;\n\n  // Page size options\n  @Input() pageSizeOptions: { label: string; value: number }[] = [\n    { label: '10', value: 10 },\n    { label: '20', value: 20 },\n    { label: '50', value: 50 },\n  ];\n\n  $paginator = model<IPaginator>({\n    page: 1,\n    forPage: 10,\n  });\n\n  $totalItems = input<number>(0);\n  $nextPageLabel = input('Siguiente página');\n  $previousPageLabel = input('Página anterior');\n  $pageSizeLabel = input('Resultados por página:');\n  $fromItemLabel = input('de');\n  $showMobile = input<boolean>(false);\n\n  // Mobile detection signal\n  $isMobile = linkedSignal(() => this.$showMobile());\n\n  $currentPage = computed(() => this.$paginator().page);\n  $pageSize = computed(() => this.$paginator().forPage);\n  $selectedPageSize = signal<number>(this.$paginator().forPage);\n  $totalPages = computed(() => Math.ceil(this.$totalItems() / this.$paginator().forPage));\n\n  $startItem = computed(() => {\n    const page = this.$currentPage();\n    const size = this.$paginator().forPage;\n    return page > 0 ? (page - 1) * size + 1 : 0;\n  });\n\n  $endItem = computed(() => {\n    const page = this.$currentPage();\n    const size = this.$paginator().forPage;\n    const total = this.$totalItems();\n    const end = page * size;\n    return Math.min(end, total);\n  });\n\n  constructor() {\n    this.$selectedPageSize.set(this.$paginator().forPage);\n\n    effect(() => {\n      const currentForPage = this.$paginator().forPage;\n      if (this.$selectedPageSize() !== currentForPage) {\n        this.$selectedPageSize.set(currentForPage);\n      }\n    });\n\n    effect(() => {\n      if (this.setUrl) {\n        const paginator = this.$paginator();\n        this.setUrlParameter('page', paginator.page.toString());\n        this.setUrlParameter('size', paginator.forPage.toString());\n      }\n    });\n  }\n\n  ngOnInit(): void {\n    this.checkMobileView();\n    this.setupResizeListener();\n  }\n\n  ngOnDestroy(): void {\n    if (this.resizeListener) {\n      window.removeEventListener('resize', this.resizeListener);\n    }\n  }\n\n  private checkMobileView(): void {\n    if (!this.$showMobile()) {\n      const isMobile = window.innerWidth <= this.mobileWidth; // Breakpoint para móvil\n      this.$isMobile.set(isMobile);\n    }\n  }\n\n  private setupResizeListener(): void {\n    this.resizeListener = () => {\n      this.checkMobileView();\n    };\n    window.addEventListener('resize', this.resizeListener);\n  }\n\n  onPageChange(page: number | string) {\n    const pageNumber = typeof page === 'string' ? parseInt(page, 10) : page;\n    if (pageNumber !== this.$currentPage() && pageNumber >= 1 && pageNumber <= this.$totalPages()) {\n      const newPaginator = {\n        ...this.$paginator(),\n        page: pageNumber,\n      };\n      this.$paginator.set(newPaginator);\n    }\n  }\n\n  onPreviousPage() {\n    if (this.$currentPage() > 1) {\n      this.onPageChange(this.$currentPage() - 1);\n    }\n  }\n\n  onNextPage() {\n    if (this.$currentPage() < this.$totalPages()) {\n      this.onPageChange(this.$currentPage() + 1);\n    }\n  }\n\n  onPageSizeChange() {\n    const newPageSize = this.$selectedPageSize();\n    const newPaginator = {\n      ...this.$paginator(),\n      forPage: newPageSize,\n      page: 1,\n    };\n    this.$paginator.set(newPaginator);\n  }\n\n  /**\n   * Establece un parámetro en la URL. Si el valor es una cadena vacía, elimina el parámetro de la URL.\n   * @param key - La clave del parámetro\n   * @param value - El valor del parámetro. Si es '', se elimina el parámetro\n   */\n  setUrlParameter(key: string, value: string): void {\n    if (!this.setUrl) return;\n\n    const currentUrl = this.location.path();\n    const url = new URL(currentUrl, window.location.origin);\n\n    if (value === '') {\n      // Si el valor es vacío, eliminar el parámetro\n      url.searchParams.delete(key);\n    } else {\n      // Si el valor no es vacío, establecer el parámetro\n      url.searchParams.set(key, value);\n    }\n\n    this.location.replaceState(url.pathname + url.search);\n  }\n}\n","<div class=\"paginator-container\">\n  @if (!$isMobile()) {\n  <!-- Desktop: Resultados por página -->\n  <div class=\"paginator-left-section\">\n    <span class=\"paginator-label\">{{ $pageSizeLabel() }}</span>\n    <div class=\"paginator-select-container\">\n      <select [(ngModel)]=\"$selectedPageSize\" (change)=\"onPageSizeChange()\" class=\"paginator-select\">\n        @for (option of pageSizeOptions; track option.value) {\n        <option [value]=\"option.value\" class=\"paginator-option\">\n          {{ option.label }}\n        </option>\n        }\n      </select>\n      <div class=\"paginator-select-arrow\">\n        <svg class=\"paginator-arrow-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n          <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\"></path>\n        </svg>\n      </div>\n    </div>\n  </div>\n  } @else {\n  <!-- Mobile: Solo información de página -->\n  <div class=\"paginator-mobile-info\">\n    <span class=\"paginator-label\">{{ $startItem() }}-{{ $endItem() }} de {{ $totalItems() }}</span>\n  </div>\n  } @if (!$isMobile()) {\n  <!-- Desktop: Botones de texto -->\n  <div class=\"paginator-right-section\">\n    <button\n      type=\"button\"\n      class=\"paginator-text-button\"\n      [class.paginator-button-disabled]=\"$currentPage() <= 1\"\n      [disabled]=\"$currentPage() <= 1\"\n      (click)=\"onPreviousPage()\"\n    >\n      {{ $previousPageLabel() }}\n    </button>\n    <span class=\"paginator-page-info\"> {{ $startItem() }}-{{ $endItem() }} {{ $fromItemLabel() }} {{ $totalItems() }} </span>\n    <button\n      type=\"button\"\n      class=\"paginator-text-button\"\n      [class.paginator-button-disabled]=\"$currentPage() >= $totalPages()\"\n      [disabled]=\"$currentPage() >= $totalPages()\"\n      (click)=\"onNextPage()\"\n    >\n      {{ $nextPageLabel() }}\n    </button>\n  </div>\n  } @else {\n  <!-- Mobile: Botones con flechas -->\n  <div class=\"paginator-mobile-buttons\">\n    <button\n      type=\"button\"\n      class=\"paginator-arrow-button\"\n      [class.paginator-button-disabled]=\"$currentPage() <= 1\"\n      [disabled]=\"$currentPage() <= 1\"\n      (click)=\"onPreviousPage()\"\n    >\n      <svg class=\"paginator-arrow-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\"></path>\n      </svg>\n    </button>\n    <button\n      type=\"button\"\n      class=\"paginator-arrow-button\"\n      [class.paginator-button-disabled]=\"$currentPage() >= $totalPages()\"\n      [disabled]=\"$currentPage() >= $totalPages()\"\n      (click)=\"onNextPage()\"\n    >\n      <svg class=\"paginator-arrow-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\"></path>\n      </svg>\n    </button>\n  </div>\n  }\n</div>\n","import { NgModule } from '@angular/core';\n\nimport { GmpPaginatorComponent } from './paginator.component';\n\n@NgModule({\n  imports: [GmpPaginatorComponent],\n  exports: [GmpPaginatorComponent],\n})\nexport class GmpPaginatorModule {}\n","export interface IPaginator {\n  page: number;\n  forPage: number;\n  count?: number;\n}\n\nexport const DefaultPaginator: IPaginator = {\n  count: 0,\n  page: 1,\n  forPage: 10,\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}