{"version":3,"file":"ngx-redi-core-RediGrid.mjs","sources":["../../../projects/ngx-redi-core/RediGrid/src/modules/redi-grid/redi-grid.component.ts","../../../projects/ngx-redi-core/RediGrid/src/modules/redi-grid/redi-grid.component.html","../../../projects/ngx-redi-core/RediGrid/src/modules/redi-grid.module.ts","../../../projects/ngx-redi-core/RediGrid/ngx-redi-core-RediGrid.ts"],"sourcesContent":["import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';\r\nimport { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';\r\nimport { DataGrid } from '../../models/interfaces/data-grid';\r\nimport { CsvService } from 'ngx-redi-core/Helper';\r\nimport { Cell } from '../../models/interfaces/cell';\r\n\r\n\r\n/**\r\n * Componente que representa los datos en un grid\r\n * @decorators `@Component()`\r\n */\r\n@Component({\n    selector: 'redi-grid',\n    templateUrl: './redi-grid.component.html',\n    styleUrls: ['./redi-grid.component.css'],\n    standalone: false\n})\r\nexport class RediGridComponent implements OnInit {\r\n  /**\r\n   * Datos de origen y configuración del grid\r\n   */\r\n  @Input()\r\n  public data: DataGrid;\r\n\r\n  /**\r\n   * Indica si el grid se enumera\r\n   */\r\n  @Input()\r\n  public enumerar: boolean;\r\n\r\n  /**\r\n   * Indica si el grid es editable\r\n   */\r\n  @Input()\r\n  public editable: boolean;\r\n\r\n  @Output()\r\n  public onUpdateValue = new EventEmitter<Array<Cell>>();\r\n\r\n  /**\r\n   * Constructor del grid\r\n   * @param csv - Servicio CSV\r\n   */\r\n  constructor(private csv: CsvService) {\r\n    this.data = {} as DataGrid;\r\n    this.enumerar = false;\r\n    this.editable = false;\r\n  }\r\n\r\n  /**\r\n   * Método de inicialización de visualización\r\n   */\r\n  public ngOnInit(): void {\r\n    if (this.data) {\r\n      this.editable = this.data.editable || false;\r\n      this.enumerar = this.data.enumerable || false;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * ViewPort para el scroll virtual\r\n   */\r\n  @ViewChild(CdkVirtualScrollViewport, { static: false })\r\n  public viewPort!: CdkVirtualScrollViewport;\r\n\r\n  /**\r\n   * Método que invierte la ubicación del objeto renderizado\r\n   * @returns Regresa la ubicación invertida en modo texto\r\n   */\r\n  public get invertirUbicacion(): string {\r\n    if (!this.viewPort || !this.viewPort['_renderedContentOffset']) {\r\n      return '-0px';\r\n    }\r\n    const offset = this.viewPort['_renderedContentOffset'];\r\n    return `-${offset}px`;\r\n  }\r\n\r\n  /**\r\n   * Método que valida si una columna esta bloqueada\r\n   * @param numeroColumna - Numero de columna\r\n   * @returns True si la columna esta bloqueada\r\n   */\r\n  public columnaBloqueada(numeroColumna: number): boolean {\r\n    return this.data.bloquearColumnas !== undefined &&\r\n      this.data.bloquearColumnas.some(c => c === numeroColumna);\r\n  }\r\n\r\n  /**\r\n   * Método que valida si una columna es visible\r\n   * @param numeroColumna - Numero de columna\r\n   * @returns True si es visible\r\n   */\r\n  public columnaVisible(numeroColumna: number): boolean {\r\n    return !(this.data.ocultarColumnas !== undefined &&\r\n      this.data.ocultarColumnas.some(c => c === numeroColumna));\r\n  }\r\n\r\n  /**\r\n   * Método que actualiza los datos editados en el grid\r\n   * @param indiceFila - Contiene el indice de la fila editada\r\n   * @param indiceColumna - Contiene el indice de la columna editada\r\n   * @param valor - Contiene el valor de edición de celda\r\n   */\r\n  public actualizarDatos(indiceFila: number, indiceColumna: number, valor: string): void {\r\n    if (this.data && this.data.filas) {\r\n      const fila = this.data.filas[indiceFila][indiceColumna];\r\n      fila.editado = fila.valor !== valor || fila.editado;\r\n      if (fila.editado) {\r\n        fila.valor = valor;\r\n        this.onUpdateValue.emit(this.data.filas[indiceFila]);\r\n        \r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Cambia el foco de las celdas\r\n   * @param event - KeyboardEvent\r\n   */\r\n  public moverFoco(event: KeyboardEvent) {\r\n    this.moverDeCelda(event.target as HTMLInputElement,\r\n      event.key,\r\n      document.querySelectorAll('input[name=cell]'))\r\n  }\r\n\r\n  /**\r\n   * Realiza el movimiento de celdas por el teclado\r\n   * @param control - Control que desencadena el evento\r\n   * @param key - Tecla que desencadeno el evento\r\n   * @param nodesControls - Controles del grid\r\n   */\r\n  private moverDeCelda(control: HTMLInputElement, key: string, nodesControls: NodeList) {\r\n    const index = Array.prototype.map.call(nodesControls, x => { return x }).indexOf(control);\r\n    let changeFocus = true;\r\n    let newIndex = 0;\r\n    switch (key) {\r\n      case 'Enter':\r\n      case 'ArrowRight':\r\n        changeFocus = key === 'Enter' ||\r\n          control.selectionStart === control.value.length;\r\n        newIndex = index + 1;\r\n        break;\r\n      case 'ArrowLeft':\r\n        changeFocus = control.selectionStart === 0;\r\n        newIndex = index - 1;\r\n        break;\r\n      case 'ArrowUp':\r\n        newIndex = index - this.columnasHabilitadas();\r\n        break;\r\n      case 'ArrowDown':\r\n        newIndex = index + this.columnasHabilitadas();\r\n        break;\r\n      default:\r\n        changeFocus = false;\r\n        break;\r\n    }\r\n    if (changeFocus) {\r\n      this.obtenerControl(nodesControls, newIndex)?.focus();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Regresa el numero de columnas habilitadas dentro del grid\r\n   * @returns Numero de columnas habilitadas\r\n   */\r\n  private columnasHabilitadas(): number {\r\n    return this.data.columnas.length - (this.data.bloquearColumnas?.length ?? 0);\r\n  }\r\n\r\n  /**\r\n   * Obtiene el control de un NodeList por indice\r\n   * @param nodes - Lista de nodos\r\n   * @param index - Indice del control\r\n   * @returns Control del indice especificado\r\n   */\r\n  private obtenerControl(nodes: NodeList, index: number): HTMLElement {\r\n    return nodes.item(index) as HTMLElement;\r\n  }\r\n\r\n  /**\r\n   * Descarga los datos contenidos en el Grid como un CSV\r\n   * @param archivo - Nombre del archivo\r\n   */\r\n  public descargarCsv(archivo: string) {\r\n    const data = this.data.filas.map((f: Array<Cell>) => { return f.filter((c,i) => (c.serializable ?? true) && this.columnaVisible(i)).map((c: Cell) => c.valor); }).filter(d => d.length > 0);\r\n    data.unshift(this.data.columnas.filter((c,i) => (c.serializable ?? true) && this.columnaVisible(i)).map((c: Cell) => c.valor));\r\n    this.csv.descargarCsv(archivo, data);\r\n  }\r\n}\r\n","<div class=\"container\">\r\n  <!-- Contenedor principal del grid -->\r\n  <cdk-virtual-scroll-viewport #scrollViewport itemSize=\"25\">\r\n    <!-- Tabla de datos -->\r\n    <table (keydown)=\"moverFoco($event)\">\r\n      <caption> RediGridComponent </caption>\r\n      <!-- Cabecera de tabla -->\r\n      <thead>\r\n        <!-- Definición de encabezados -->\r\n        <tr>\r\n          <th scope=\"col\" [style.top]=\"invertirUbicacion\" *ngIf=\"enumerar\">\r\n          <th scope=\"col\" [style.top]=\"invertirUbicacion\" *ngFor=\"let col of data.columnas; let colNum=index\"\r\n            [class.oculto]=\"!columnaVisible(colNum)\">\r\n            <mat-icon *ngIf=\"columnaBloqueada(colNum)\" class=\"lockIcon\">lock</mat-icon>{{col.valor}}\r\n          </th>\r\n        </tr>\r\n      </thead>\r\n      <!-- Cuerpo de tabla -->\r\n      <tbody>\r\n        <tr *cdkVirtualFor=\"let row of data.filas;let rowNum = index\">\r\n          <!-- Contador de fila -->\r\n          <td *ngIf=\"enumerar\"> {{ rowNum + 1 }} </td>\r\n          <!-- Celdas de datos -->\r\n          <td *ngFor=\"let cell of row; let colNum=index;\" [class.warn]=\"cell.esValido !== undefined && !cell.esValido\"\r\n            [class.editado]=\"cell.editado\" [class.bloqueado]=\"cell.bloqueado || columnaBloqueada(colNum)\"\r\n            [class.oculto]=\"!columnaVisible(colNum)\">\r\n            <!-- Campo editable -->\r\n            <input *ngIf=\"editable && !cell.bloqueado && !columnaBloqueada(colNum)\" type=\"text\" [value]=\"cell.valor\"\r\n              name=\"cell\" (focusout)=\"actualizarDatos(rowNum,colNum,$any($event.target).value)\"\r\n              [class.editado]=\"cell.editado\"  aria-label/>\r\n            {{ !editable || cell.bloqueado || columnaBloqueada(colNum) ? cell.valor : '' }}\r\n          </td>\r\n        </tr>\r\n      </tbody>\r\n    </table>\r\n  </cdk-virtual-scroll-viewport>\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { RediGridComponent } from './redi-grid/redi-grid.component';\r\nimport { ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\n/**\r\n * Modulo que contiene los componentes de grid\r\n * @decorators ´@NgModule´\r\n */\r\n@NgModule({\r\n  declarations: [RediGridComponent],\r\n  imports: [\r\n    CommonModule,\r\n    ScrollingModule,\r\n    MatIconModule\r\n  ],\r\n  exports: [\r\n    RediGridComponent\r\n  ]\r\n})\r\nexport class RediGridModule { }\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}