ngx-redi-core 0.0.0-watch

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/Helper/index.d.ts +5 -0
  2. package/Helper/package.json +3 -0
  3. package/Helper/public-api.d.ts +3 -0
  4. package/Helper/src/helpers/bag-data-subject.service.d.ts +43 -0
  5. package/Helper/src/helpers/csv.service.d.ts +33 -0
  6. package/Helper/src/helpers/data-subject.service.d.ts +32 -0
  7. package/Helper/src/models/interfaces/data-subject.interface.d.ts +6 -0
  8. package/README.md +24 -0
  9. package/RediDragDrop/index.d.ts +5 -0
  10. package/RediDragDrop/package.json +3 -0
  11. package/RediDragDrop/public-api.d.ts +4 -0
  12. package/RediDragDrop/src/models/classes/proceso-archivo-csv.d.ts +29 -0
  13. package/RediDragDrop/src/models/directives/drag-drop.directive.d.ts +43 -0
  14. package/RediDragDrop/src/modules/redi-drag-drop/redi-drag-drop.component.d.ts +188 -0
  15. package/RediDragDrop/src/modules/redi-drag-drop.module.d.ts +13 -0
  16. package/RediGrid/index.d.ts +5 -0
  17. package/RediGrid/package.json +3 -0
  18. package/RediGrid/public-api.d.ts +4 -0
  19. package/RediGrid/src/models/interfaces/cell.d.ts +37 -0
  20. package/RediGrid/src/models/interfaces/data-grid.d.ts +30 -0
  21. package/RediGrid/src/modules/redi-grid/redi-grid.component.d.ts +92 -0
  22. package/RediGrid/src/modules/redi-grid.module.d.ts +14 -0
  23. package/RediTable/index.d.ts +5 -0
  24. package/RediTable/package.json +3 -0
  25. package/RediTable/public-api.d.ts +6 -0
  26. package/RediTable/src/components/filter-data/filter-data.component.d.ts +23 -0
  27. package/RediTable/src/components/redi-table/redi-table.component.d.ts +139 -0
  28. package/RediTable/src/models/interfaces/column-definition.d.ts +18 -0
  29. package/RediTable/src/models/interfaces/data-table.d.ts +24 -0
  30. package/RediTable/src/models/interfaces/filter-item.d.ts +5 -0
  31. package/RediTable/src/models/interfaces/row-action.d.ts +24 -0
  32. package/RediTable/src/models/types/event-table.type.d.ts +5 -0
  33. package/Security/index.d.ts +5 -0
  34. package/Security/package.json +3 -0
  35. package/Security/public-api.d.ts +6 -0
  36. package/Security/src/modules/security-web-intercept/interceptors/redi-secure.interceptor.d.ts +39 -0
  37. package/Security/src/modules/security-web-intercept/models/secure-factory.model.d.ts +10 -0
  38. package/Security/src/modules/security-web-intercept/services/cifrado-basico.service.d.ts +14 -0
  39. package/Security/src/modules/security-web-intercept/services/cifrado.service.d.ts +21 -0
  40. package/Security/src/modules/security-web-intercept/services/reflection.service.d.ts +58 -0
  41. package/Security/src/modules/security.module.d.ts +11 -0
  42. package/esm2022/Helper/ngx-redi-core-Helper.mjs +5 -0
  43. package/esm2022/Helper/public-api.mjs +4 -0
  44. package/esm2022/Helper/src/helpers/bag-data-subject.service.mjs +61 -0
  45. package/esm2022/Helper/src/helpers/csv.service.mjs +69 -0
  46. package/esm2022/Helper/src/helpers/data-subject.service.mjs +34 -0
  47. package/esm2022/Helper/src/models/interfaces/data-subject.interface.mjs +2 -0
  48. package/esm2022/RediDragDrop/ngx-redi-core-RediDragDrop.mjs +5 -0
  49. package/esm2022/RediDragDrop/public-api.mjs +5 -0
  50. package/esm2022/RediDragDrop/src/models/classes/proceso-archivo-csv.mjs +132 -0
  51. package/esm2022/RediDragDrop/src/models/directives/drag-drop.directive.mjs +95 -0
  52. package/esm2022/RediDragDrop/src/modules/redi-drag-drop/redi-drag-drop.component.mjs +369 -0
  53. package/esm2022/RediDragDrop/src/modules/redi-drag-drop.module.mjs +34 -0
  54. package/esm2022/RediGrid/ngx-redi-core-RediGrid.mjs +5 -0
  55. package/esm2022/RediGrid/public-api.mjs +5 -0
  56. package/esm2022/RediGrid/src/models/interfaces/cell.mjs +2 -0
  57. package/esm2022/RediGrid/src/models/interfaces/data-grid.mjs +2 -0
  58. package/esm2022/RediGrid/src/modules/redi-grid/redi-grid.component.mjs +159 -0
  59. package/esm2022/RediGrid/src/modules/redi-grid.module.mjs +34 -0
  60. package/esm2022/RediTable/ngx-redi-core-RediTable.mjs +5 -0
  61. package/esm2022/RediTable/public-api.mjs +9 -0
  62. package/esm2022/RediTable/src/components/filter-data/filter-data.component.mjs +84 -0
  63. package/esm2022/RediTable/src/components/redi-table/redi-table.component.mjs +404 -0
  64. package/esm2022/RediTable/src/models/interfaces/column-definition.mjs +2 -0
  65. package/esm2022/RediTable/src/models/interfaces/data-table.mjs +2 -0
  66. package/esm2022/RediTable/src/models/interfaces/filter-item.mjs +2 -0
  67. package/esm2022/RediTable/src/models/interfaces/row-action.mjs +2 -0
  68. package/esm2022/RediTable/src/models/types/event-table.type.mjs +2 -0
  69. package/esm2022/Security/ngx-redi-core-Security.mjs +5 -0
  70. package/esm2022/Security/public-api.mjs +7 -0
  71. package/esm2022/Security/src/modules/security-web-intercept/interceptors/redi-secure.interceptor.mjs +88 -0
  72. package/esm2022/Security/src/modules/security-web-intercept/models/secure-factory.model.mjs +27 -0
  73. package/esm2022/Security/src/modules/security-web-intercept/services/cifrado-basico.service.mjs +51 -0
  74. package/esm2022/Security/src/modules/security-web-intercept/services/cifrado.service.mjs +33 -0
  75. package/esm2022/Security/src/modules/security-web-intercept/services/reflection.service.mjs +122 -0
  76. package/esm2022/Security/src/modules/security.module.mjs +23 -0
  77. package/esm2022/ngx-redi-core.mjs +5 -0
  78. package/esm2022/public-api.mjs +8 -0
  79. package/fesm2022/ngx-redi-core-Helper.mjs +166 -0
  80. package/fesm2022/ngx-redi-core-Helper.mjs.map +1 -0
  81. package/fesm2022/ngx-redi-core-RediDragDrop.mjs +628 -0
  82. package/fesm2022/ngx-redi-core-RediDragDrop.mjs.map +1 -0
  83. package/fesm2022/ngx-redi-core-RediGrid.mjs +196 -0
  84. package/fesm2022/ngx-redi-core-RediGrid.mjs.map +1 -0
  85. package/fesm2022/ngx-redi-core-RediTable.mjs +496 -0
  86. package/fesm2022/ngx-redi-core-RediTable.mjs.map +1 -0
  87. package/fesm2022/ngx-redi-core-Security.mjs +339 -0
  88. package/fesm2022/ngx-redi-core-Security.mjs.map +1 -0
  89. package/fesm2022/ngx-redi-core.mjs +14 -0
  90. package/fesm2022/ngx-redi-core.mjs.map +1 -0
  91. package/index.d.ts +5 -0
  92. package/package.json +57 -0
  93. package/public-api.d.ts +4 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngx-redi-core-RediDragDrop.mjs","sources":["../../../projects/ngx-redi-core/RediDragDrop/src/models/classes/proceso-archivo-csv.ts","../../../projects/ngx-redi-core/RediDragDrop/src/models/directives/drag-drop.directive.ts","../../../projects/ngx-redi-core/RediDragDrop/src/modules/redi-drag-drop/redi-drag-drop.component.ts","../../../projects/ngx-redi-core/RediDragDrop/src/modules/redi-drag-drop/redi-drag-drop.component.html","../../../projects/ngx-redi-core/RediDragDrop/src/modules/redi-drag-drop.module.ts","../../../projects/ngx-redi-core/RediDragDrop/ngx-redi-core-RediDragDrop.ts"],"sourcesContent":["/**\r\n * Clase para procesar archivo csv según las necesidades.\r\n * Produce datos con la estructura necesaria para el grid de datos o un arreglo de objetos.\r\n */\r\nexport class ProcesoArchivoCsv {\r\n /**\r\n * \r\n * @param archivo El archivo csv a procesar\r\n * @param datosParaDataGrid Especifica si los datos a generar son para el grid de datos\r\n * @returns Una promesa con los datos en el formato especificado por el parámetro `datosParaGrid`\r\n * @example\r\n * Si la propiedad ´datosParaDataGrid = true´ devuelve ´{cols:[],rows:[]}´\r\n * Si la propiedad ´datosParaDataGrid = false´ devuelve ´[{propiedad1:'valor',propiedad2:'valor2'}]´\r\n */\r\n public procesar(archivo: FileList, datosParaDataGrid: boolean) {\r\n return new Promise((resolve, reject) => {\r\n const reader: FileReader = new FileReader();\r\n const item = archivo.item(0);\r\n if (item) {\r\n reader.readAsText(item, 'UTF-8');\r\n }\r\n reader.onload = () => {\r\n const resultado = reader.result;\r\n if ((resultado ?? '').toString().length === 0) {\r\n reject({\r\n mensaje: 'El archivo se encuentra vacío.'\r\n });\r\n }\r\n if (!reader.result?.toString().includes('�')) {\r\n const [informacion, columnas] = (this.generarInformacionColumnas((resultado as string), datosParaDataGrid));\r\n if (datosParaDataGrid) {\r\n resolve({ cols: columnas, rows: informacion });\r\n }\r\n else {\r\n resolve(informacion);\r\n }\r\n } else {\r\n reject({\r\n mensaje: 'El contenido del archivo no es válido.'\r\n });\r\n }\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Método que genera la información y columnas contenidas en el archivo ´csv´ seleccionado.\r\n * @param datos El texto contenido en el archivo ´csv´.\r\n * @param datosParaDataGrid Especifica si los datos a generar son para el grid de datos\r\n * @returns Retorna una lista con la información y las columnas contenidas en el archivo ´csv´.\r\n */\r\n private generarInformacionColumnas(datos: string, datosParaDataGrid: boolean): unknown[][] {\r\n let informacion: unknown[] = [];\r\n let columnas: unknown[] = [];\r\n const lineasTextTotales = datos.split(/\\n/);\r\n\r\n columnas = lineasTextTotales[0].toString().split(',')\r\n .map((str: string) => { return str.replace(/ /g, '-').trim(); }).filter((stringArchivos: string) => stringArchivos.length > 0);\r\n\r\n const datosSeparados = lineasTextTotales.filter((valor: string, indice: number) => indice > 0 && valor.length > 0)\r\n .map((dato: string) => {\r\n if (dato.includes('\"')) {\r\n return this.generaColumnas(dato.trim());\r\n }\r\n else {\r\n return dato.split(',');\r\n }\r\n });\r\n\r\n if (datosParaDataGrid) {\r\n columnas = columnas.map(columna => {\r\n return { value: columna };\r\n });\r\n informacion = datosSeparados.map(dato => {\r\n return dato.map(o => {\r\n return { value: o.replace(/\\r/, '') };\r\n });\r\n });\r\n } else\r\n if (lineasTextTotales.length === 1) {\r\n const objeto: Record<string, string> = {};\r\n columnas.forEach(columna => objeto[`${columna}`] = '');\r\n informacion.push(objeto);\r\n } else {\r\n datosSeparados.forEach(dato => {\r\n const objeto: Record<string, string> = {};\r\n columnas.forEach((col: unknown, i: number) => {\r\n objeto[(col as string)] = dato[i].replace(/\\r/, '');\r\n });\r\n informacion.push(objeto);\r\n });\r\n }\r\n return [informacion, columnas];\r\n }\r\n\r\n /**\r\n * Método para separa las filar del csv en columnas.\r\n * @param fila La cadena a separar para generar las columnas\r\n * @returns Arreglo con las columnas\r\n */\r\n generaColumnas(fila: string) {\r\n const values = [];\r\n const separadorTemporal = 'ꜛ';\r\n let estaEnComillas = false;\r\n let val = '';\r\n fila = fila.replaceAll('\"\"', separadorTemporal);\r\n [...fila].forEach((letra: string, indice: number) => {\r\n switch (letra) {\r\n case ',':\r\n if (estaEnComillas) {\r\n val += letra;\r\n } else {\r\n values.push(val);\r\n val = '';\r\n }\r\n break;\r\n case '\"':\r\n if (estaEnComillas && indice + 1 < fila.length && fila[indice + 1] === '\"') {\r\n val += '\"';\r\n }\r\n else {\r\n estaEnComillas = !estaEnComillas;\r\n }\r\n break;\r\n default:\r\n val += fila[indice];\r\n break;\r\n }\r\n });\r\n values.push(val);\r\n return values.map(columnas => columnas.replaceAll(separadorTemporal, '\"'));\r\n }\r\n}\r\n","import {\r\n Directive,\r\n EventEmitter,\r\n Output,\r\n HostListener,\r\n HostBinding\r\n} from '@angular/core';\r\n@Directive({\r\n selector: '[dragDrop]'\r\n})\r\nexport class DragDropDirective {\r\n readonly formato = 'dashed 2px #838383';\r\n\r\n /**\r\n * Evento que se emite una vez que se ha soltado el o los archivos en el componente.\r\n */\r\n @Output() fileDropped = new EventEmitter<FileList>();\r\n\r\n /**\r\n * Evento que se emite una vez que se hace click al componente.\r\n */\r\n @Output() clicked = new EventEmitter<void>();\r\n\r\n /**\r\n * Obtiene o establece el estilo del borde del componente.\r\n */\r\n @HostBinding('style.border') private border = this.formato;\r\n /**\r\n * Obtiene o establece el estilo del fondo del componente.\r\n */\r\n @HostBinding('style.background') private background = '';\r\n\r\n /**\r\n * El evento que cambia el borde y fondo del componente al arrastrar el archivo sobre el. \r\n * @param event Evento \r\n */\r\n @HostListener('dragover', ['$event']) dragOver(event: DragEvent) {\r\n this.border = 'dashed 2px #be1704';\r\n this.background = '#be170421';\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n\r\n /**\r\n * El evento que restablece el borde y fondo del componente una vez que el archivo sale del área.\r\n * @param event Evento\r\n */\r\n @HostListener('dragleave', ['$event']) public dragLeave(event: DragEvent) {\r\n this.border = this.formato;\r\n this.background = '';\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n\r\n /**\r\n * Evento que se ejecuta una vez que el archivo se suelta en el componente.\r\n * @param event Evento\r\n */\r\n @HostListener('drop', ['$event']) public drop(event: DragEvent) {\r\n this.border = this.formato;\r\n this.background = '';\r\n const files = event.dataTransfer?.files;\r\n this.fileDropped.emit(files);\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n\r\n /**\r\n * Se emite el evento click en una vez se suelta el click (izquierdo) \r\n * @param $event Evento\r\n */\r\n @HostListener('mouseup', ['$event']) onClick(event: MouseEvent) {\r\n if (event.button === 0) {\r\n this.clicked.emit();\r\n }\r\n }\r\n}\r\n","import { SelectionModel } from '@angular/cdk/collections';\r\nimport { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';\r\nimport { MatListOption, MatSelectionList } from '@angular/material/list';\r\nimport { ProcesoArchivoCsv } from '../../models/classes/proceso-archivo-csv';\r\n@Component({\r\n selector: 'redi-drag-drop',\r\n templateUrl: './redi-drag-drop.component.html',\r\n styleUrls: ['./redi-drag-drop.component.scss'],\r\n providers: [ProcesoArchivoCsv]\r\n})\r\nexport class RediDragDropComponent {\r\n /**\r\n * Obtiene o establece el titulo que se mostrara en el componente.\r\n * @default 'Sube tu archivo'\r\n */\r\n @Input() titulo: string | undefined;\r\n\r\n /**\r\n * Obtiene o establece si el titulo se muestra.\r\n * @default 'true'\r\n */\r\n @Input() muestraTitulo = true;\r\n \r\n /**\r\n * Obtiene o establece las extensiones aceptadas por el componente.\r\n * @default Acepta todas las extensiones.\r\n * @example '.pdf,xls,.zip'\r\n */\r\n @Input() extensionesAceptadas: string | undefined;\r\n\r\n /**\r\n * Obtiene o establece el tamaño máximo (MB) permitido para cada archivo que se puede cargar en el componente.\r\n * @default Acepta cualquier tamaño si no es especificado.\r\n */\r\n @Input() tamanoMaximoArchivo: number | undefined;\r\n\r\n /**\r\n * Obtiene o establece si los datos procesados en la carga de un archivo `csv` son para el grid.\r\n * @default true \r\n */\r\n @Input() datosParaDataGrid = true;\r\n\r\n /**\r\n * Obtiene o establece el mensaje de error.\r\n */\r\n protected mensajeError: string | undefined;\r\n\r\n /**\r\n * Obtiene o establece el input para la carga de los archivos.\r\n */\r\n @ViewChild('inputArchivo') inputArchivo: ElementRef | undefined;\r\n\r\n /**\r\n * Obtiene o establece la lista de los archivos cargados en el front.\r\n */\r\n @ViewChild('listArchivos') listArchivos: MatSelectionList | undefined;\r\n\r\n\r\n /** \r\n * Obtiene o establece el archivo cargado.\r\n */\r\n protected archivo: FileList | undefined | null;\r\n /**\r\n * Verifica si existe archivo cargado en el componente.\r\n */\r\n protected get existeArchivo() {\r\n if (this.archivo) {\r\n return this.archivo.length > 0;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Obtiene una lista con los archivos cargados.\r\n */\r\n public get archivos() {\r\n if (this.archivo) {\r\n return this.generarListaNombreArchivos(this.archivo);\r\n } else {\r\n return [];\r\n }\r\n }\r\n\r\n /**\r\n * Obtiene el nombre del primer archivo de la lista.\r\n */\r\n protected get nombreArchivo() { return this.archivo?.item(0)?.name; }\r\n\r\n /**\r\n * Obtiene o establece si la carga de archivos es múltiple.\r\n */\r\n private multiple = false;\r\n\r\n /**\r\n * Establece si la carga de archivos es múltiple.\r\n */\r\n @Input() set archivosMultiples(value: boolean) {\r\n if (this.procesoCsv) {\r\n this.multiple = false;\r\n } else {\r\n this.multiple = value;\r\n }\r\n }\r\n\r\n /**\r\n * Obtiene si la carga de los archivos es múltiple.\r\n */\r\n get archivosMultiples() { return this.multiple; }\r\n\r\n /**\r\n * Obtiene o establece si la selección de archivos,se realizará desde distintos directorios.\r\n */\r\n private seleccionDiferida = false;\r\n\r\n /**\r\n * Establece si la selección de archivos se realizará desde distintos directorios.\r\n */\r\n @Input() set cargaDiferida(value: boolean) {\r\n this.multiple = true;\r\n this.seleccionDiferida = value;\r\n }\r\n /**\r\n * Obtiene si la selección de archivos se realizará desde distintos directorios.\r\n */\r\n get cargaDiferida() { return this.seleccionDiferida; }\r\n\r\n /**\r\n * Obtiene o establece aquellos archivos que ya se encuentran cargados en el componente.\r\n */\r\n protected repetidos: (string | undefined)[] = [];\r\n\r\n /**\r\n * Obtiene o establece que se realizará un proceso de lectura al archivo csv cargado en el componente.\r\n */\r\n private procesoCsv = false;\r\n /**\r\n * Especifica que el archivo a cargar en el componente es un `csv`. Y establece en `true` la propiedad `procesoCsv`.\r\n */\r\n @Input() set procesarCsvTabla(value: boolean) {\r\n this.procesoCsv = value;\r\n if (value) {\r\n this.archivosMultiples = false;\r\n this.extensionesAceptadas = '.csv';\r\n }\r\n }\r\n\r\n /**\r\n * Evento que se emite una vez que el archivo `csv` es procesado.\r\n * @example\r\n * Si la propiedad ´datosParaDataGrid = true´ devuelve ´{cols:[],rows:[]}´\r\n * Si la propiedad ´datosParaDataGrid = false´ devuelve ´[{propiedad1:'valor',propiedad2:'valor2'}]´\r\n * \r\n */\r\n @Output() csvDatosProcesados = new EventEmitter<unknown>();\r\n\r\n /**\r\n * Obtiene o establece si existe un error.\r\n */\r\n protected error = false;\r\n\r\n @Output() cambioArchivo = new EventEmitter<FileList | null>();\r\n\r\n constructor(private readonly procesoArchivoCsv: ProcesoArchivoCsv) {\r\n }\r\n\r\n /**\r\n * Método que establece el proceso a realizar con el o los archivos seleccionados.\r\n * @param fileList Los archivos seleccionados\r\n */\r\n establecerProceso(fileList: FileList) {\r\n if (this.cargaDiferida) {\r\n this.procesarArchivosPorSeparado(fileList);\r\n }\r\n else {\r\n this.procesarArchivo(fileList);\r\n }\r\n }\r\n\r\n /**\r\n * Método encargado para el proceso de archivo individual.\r\n * @param archivo El archivo csv seleccionado.\r\n */\r\n protected async procesarArchivo(archivo: FileList) {\r\n if (!this.validoTamanioArchivos(archivo)) {\r\n return;\r\n }\r\n this.archivo = (archivo.length === 0) ? null : archivo;\r\n if (this.manejoErrorExtensionesValidas(this.archivos.map(stringArchivos => stringArchivos?.split(/[.]/).pop() ?? ''))) {\r\n if (this.procesoCsv) {\r\n await this.procesoArchivoCsv.procesar(archivo, this.datosParaDataGrid)\r\n .then(datos => {\r\n this.csvDatosProcesados.emit(datos);\r\n }).catch((error) => {\r\n this.estableceMensajeError(error.mensaje);\r\n this.archivo = null;\r\n this.csvDatosProcesados.emit(null);\r\n });\r\n\r\n } else {\r\n this.cambioArchivo.emit(this.archivo);\r\n }\r\n }\r\n }\r\n /**\r\n * Método encargado para el proceso de múltiples archivos.\r\n * @param archivo Los archivos seleccionados.\r\n * @returns Void\r\n */\r\n protected procesarArchivosPorSeparado(archivo: FileList): void {\r\n this.repetidos = [];\r\n if (!this.validoTamanioArchivos(archivo)) {\r\n return;\r\n }\r\n const archivosNuevos = this.generarListaNombreArchivos(archivo);\r\n if (this.manejoErrorExtensionesValidas(archivosNuevos.map(stringArchivos => stringArchivos?.split(/[.]/).pop() ?? ''))) {\r\n if (this.archivo) {\r\n this.cargarArchivos(archivo, archivosNuevos);\r\n }\r\n else {\r\n this.archivo = archivo;\r\n (this.inputArchivo?.nativeElement || {}).files = this.archivo;\r\n this.cambioArchivo.emit(this.archivo);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Método que carga los archivos nuevos a la lista de archivos seleccionados anteriormente.\r\n * @param archivo Los archivos seleccionados \r\n * @param archivosNuevos Arreglo con la lista de los archivos seleccionados.\r\n */\r\n private cargarArchivos(archivo: FileList, archivosNuevos: string[]): void {\r\n const dataTransfer = new DataTransfer();\r\n const repetidos = this.generarListaNombreArchivos(this.archivo ?? new FileList()).map(nombreArchivo => {\r\n return archivosNuevos.find(elm => elm === nombreArchivo);\r\n }).filter(o => !!o);\r\n\r\n if (repetidos.length === 0) {\r\n for (let index = 0; index < (this.archivo ?? new FileList()).length; index++) {\r\n dataTransfer.items.add((this.archivo ?? new FileList())[index]);\r\n }\r\n\r\n for (let index = 0; index < archivo.length; index++) {\r\n dataTransfer.items.add(archivo[index]);\r\n }\r\n\r\n this.archivo = dataTransfer.files;\r\n (this.inputArchivo?.nativeElement || {}).files = this.archivo;\r\n this.cambioArchivo.emit(this.archivo);\r\n } else {\r\n this.repetidos.push(...repetidos);\r\n (this.inputArchivo?.nativeElement || {}).files = this.archivo;\r\n }\r\n }\r\n\r\n /**\r\n * Método que elimina los archivos seleccionados de lista.\r\n * @param selectionModel La lista de opciones seleccionadas\r\n */\r\n eliminarArchivo(selectionModel: SelectionModel<MatListOption>): void {\r\n const dataTransfer = new DataTransfer();\r\n const archivosCargados = (this.archivo as FileList);\r\n const archivosToEliminar: string[] = selectionModel.selected.map<string>((matListOption: MatListOption) => matListOption.value.toString());\r\n\r\n for (let index = 0; index < archivosCargados.length; index++) {\r\n if (!archivosToEliminar.some(stringArchivos => stringArchivos === archivosCargados.item(index)?.name)) {\r\n dataTransfer.items.add(archivosCargados[index]);\r\n }\r\n }\r\n if (dataTransfer.files.length > 0) {\r\n this.archivo = dataTransfer.files;\r\n (this.inputArchivo?.nativeElement || {}).files = dataTransfer.files;\r\n this.cambioArchivo.emit(this.archivo);\r\n } else {\r\n this.eliminarTodosArchivos();\r\n }\r\n }\r\n\r\n eliminarTodosArchivos() {\r\n this.archivo = null;\r\n (this.inputArchivo?.nativeElement || {}).files = null;\r\n (this.inputArchivo?.nativeElement || {}).value = '';\r\n\r\n this.cambioArchivo.emit(this.archivo);\r\n }\r\n\r\n /**\r\n * Método que genera y retorna un arreglo con los nombres de los archivos cargados.\r\n * @param fileList Objeto que contiene los archivos seleccionados\r\n * @returns Retorna arreglo de cadenas.\r\n * `['archivo.pdf','archivo2.avi']`\r\n */\r\n private generarListaNombreArchivos(fileList: FileList) {\r\n const archivos = [];\r\n for (let index = 0; index < fileList.length; index++) {\r\n archivos.push(fileList.item(index)?.name ?? '');\r\n }\r\n return archivos.sort();\r\n }\r\n\r\n /**\r\n * Método que genera y retorna un arreglo numérico con los tamaños de cada uno de los archivos seleccionados.\r\n * @param fileList Objeto que contiene los archivos seleccionados\r\n * @returns Retorna arreglo numérico con el tamaño de cada archivo en bytes.\r\n * `[124661,123132]`\r\n */\r\n private generarListaTamanioArchivos(fileList: FileList): number[] {\r\n const archivos: number[] = [];\r\n for (let index = 0; index < fileList.length; index++) {\r\n archivos.push(fileList.item(index)?.size ?? 0);\r\n }\r\n return archivos;\r\n }\r\n\r\n /**\r\n * Método que verifica si las extensiones son válidas.\r\n * @param extensionesArchivosSeleccionados Arreglo con las extensiones de cada uno de los archivos seleccionados.\r\n * @returns Boolean\r\n */\r\n private manejoErrorExtensionesValidas(extensionesArchivosSeleccionados: string[]) {\r\n if (this.extensionesAceptadas) {\r\n return this.verificaExtensiones(extensionesArchivosSeleccionados);\r\n } else {\r\n if (!this.cargaDiferida) {\r\n (this.inputArchivo?.nativeElement || {}).files = this.archivo;\r\n }\r\n return true;\r\n }\r\n }\r\n /**\r\n * Método que verifica si las extensiones de los archivos seleccionados son válidas, y asigna los archivos\r\n * a la propiedad `inputArchivo` en caso de que sean válidos.\r\n * @param extensionesArchivosSeleccionados Arreglo con las extensiones de cada uno de los archivos seleccionados.\r\n * @returns Boolean\r\n */\r\n private verificaExtensiones(extensionesArchivosSeleccionados: string[]): boolean {\r\n const extensiones = this.extensionesAceptadas?.split(/,/).map(extension => extension.replace(/./, ''));\r\n if (!this.extensionesValidas(extensiones ?? [], extensionesArchivosSeleccionados)) {\r\n this.estableceMensajeError(\r\n this.archivosMultiples ? 'Existe archivo no válido en su selección. Intente nuevamente.' : 'El archivo no es válido'\r\n );\r\n if (!this.cargaDiferida) {\r\n (this.inputArchivo?.nativeElement || {}).files = null;\r\n this.archivo = null;\r\n }\r\n return false;\r\n } else {\r\n if (!this.cargaDiferida) {\r\n (this.inputArchivo?.nativeElement || {}).files = this.archivo;\r\n }\r\n return true;\r\n }\r\n }\r\n\r\n /**\r\n * Método para establecer el mensaje de error en el componente, el mensaje dura 3 segundos después de eso desaparece.\r\n * @param mensaje El mensaje de error a mostrar en el componente\r\n */\r\n private estableceMensajeError(mensaje: string) {\r\n const tiempo = 3000;\r\n this.mensajeError = mensaje;\r\n this.error = true;\r\n setTimeout(() => {\r\n this.error = false;\r\n }, tiempo);\r\n }\r\n\r\n /**\r\n * Método que valida si las extensiones de los archivos son válidos con respectos a los especificados en la propiedad `extensionesAceptadas`.\r\n * @param extensiones Arreglo que contiene las extensiones aceptadas por el componente.\r\n * @param extensionesArchivosSeleccionados Arreglo que contiene la extensiones de los archivos seleccionados.\r\n * @returns Boolean\r\n */\r\n private extensionesValidas(extensiones: string[], extensionesArchivosSeleccionados: string[]) {\r\n return extensionesArchivosSeleccionados.every(valor => extensiones.includes(valor));\r\n }\r\n\r\n /**\r\n * Método para validar que el tamaño de los archivos seleccionados sea menor o igual al especificado en la propiedad `tamanoMaximoArchivo`. Si este no es especificado\r\n * se permite cualquier tamaño de archivo.\r\n * @param archivo El o los archivos seleccionados.\r\n * @returns Boolean\r\n */\r\n private validoTamanioArchivos(archivo: FileList) {\r\n if (this.tamanoMaximoArchivo) {\r\n if (this.tamanoMaximoArchivo <= 0) {\r\n return false;\r\n }\r\n const no = 1024;\r\n const size = this.tamanoMaximoArchivo * no * no;\r\n if (this.generarListaTamanioArchivos(archivo).some(tamanoAarchivo => tamanoAarchivo > size)) {\r\n this.estableceMensajeError(`El tamaño máximo por archivo es de: ${this.tamanoMaximoArchivo} MB`);\r\n (this.inputArchivo?.nativeElement || {}).files = this.existeArchivo ? this.archivo : null;\r\n return false;\r\n }\r\n else {\r\n return true;\r\n }\r\n }\r\n return true;\r\n }\r\n}\r\n","<p *ngIf=\"muestraTitulo\" class=\"titulo\">{{titulo? titulo : 'Sube tu archivo'}}</p>\r\n<div class=\"contenedor\" matRipple dragDrop (clicked)=\"inputArchivo.click()\" tabindex=\"0\"\r\n (fileDropped)=\"establecerProceso($event)\">\r\n <div class=\"contenedor-input\">\r\n <label for=\"file\"> File</label>\r\n <input id=\"file\" name=\"file\" type=\"file\" #inputArchivo hidden\r\n (change)=\"establecerProceso($any($event).target.files)\" [multiple]=\"archivosMultiples\"\r\n [accept]=\"extensionesAceptadas\">\r\n </div>\r\n <div *ngIf=\"!existeArchivo\">\r\n <div class=\"imagen\"></div>\r\n <p class=\"dragdrop\"> DRAG & DROP </p>\r\n <p> Arrastre y suelte aquí ó click para buscar </p>\r\n </div>\r\n <div *ngIf=\"existeArchivo && !archivosMultiples\">\r\n <div class=\"imagen archivo\"></div>\r\n <p>{{nombreArchivo}}</p>\r\n </div>\r\n <div *ngIf=\"existeArchivo && archivosMultiples\">\r\n <div class=\"imagen archivo-lista\"></div>\r\n </div>\r\n</div>\r\n<div class=\"error\" *ngIf=\"error\">\r\n <p>{{mensajeError}}</p>\r\n</div>\r\n<div class=\"error\" *ngIf=\"repetidos.length > 0\">\r\n <p> Los siguientes archivos ya se encuentran cargados: </p>\r\n <ul class=\"repetidos\">\r\n <li *ngFor=\"let r of repetidos\">{{r}}</li>\r\n </ul>\r\n <button class=\"cerrar\" (click)=\"repetidos=[]\"> X </button>\r\n</div>\r\n\r\n<div *ngIf=\"existeArchivo && archivosMultiples\" class=\"contenedor-lista\">\r\n <p class=\"titulo-lista\"> Archivos selecionados {{archivos.length}}</p>\r\n <div class=\"lista-archivos\">\r\n <mat-selection-list dense #listArchivos color=\"primary\">\r\n <mat-list-option *ngFor=\"let elm of archivos;index as i\" [value]=\"elm\">\r\n <div matListItemTitle>{{elm}}</div>\r\n </mat-list-option>\r\n </mat-selection-list>\r\n </div>\r\n <div class=\"botones\">\r\n <button mat-button color=\"primary\" [disabled]=\"listArchivos.selectedOptions.selected.length === 0\"\r\n (click)=\"eliminarArchivo(listArchivos.selectedOptions)\">\r\n Eliminar archivos seleccionados ({{listArchivos.selectedOptions.selected.length}})\r\n </button>\r\n <button mat-button color=\"warn\" [disabled]=\"archivos.length === 0\" (click)=\"eliminarTodosArchivos()\">\r\n Eliminar archivos\r\n </button>\r\n </div>\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { RediDragDropComponent } from './redi-drag-drop/redi-drag-drop.component';\r\n\r\n\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatRippleModule } from '@angular/material/core';\r\nimport { DragDropDirective } from '../models/directives/drag-drop.directive';\r\n\r\n@NgModule({\r\n declarations: [\r\n RediDragDropComponent,\r\n DragDropDirective\r\n ],\r\n imports: [\r\n CommonModule,\r\n MatListModule, MatButtonModule, MatIconModule, MatRippleModule\r\n ],\r\n exports: [\r\n RediDragDropComponent\r\n ]\r\n})\r\nexport class RediDragDropModule { }\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ProcesoArchivoCsv","i6.DragDropDirective"],"mappings":"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"}
@@ -0,0 +1,196 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Component, Input, ViewChild, NgModule } from '@angular/core';
3
+ import * as i2 from '@angular/common';
4
+ import { CommonModule } from '@angular/common';
5
+ import * as i3 from '@angular/cdk/scrolling';
6
+ import { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';
7
+ import * as i1 from 'ngx-redi-core/Helper';
8
+ import * as i4 from '@angular/material/icon';
9
+ import { MatIconModule } from '@angular/material/icon';
10
+
11
+ /**
12
+ * Componente que representa los datos en un grid
13
+ * @decorators `@Component()`
14
+ */
15
+ class RediGridComponent {
16
+ /**
17
+ * Constructor del grid
18
+ * @param csv - Servicio CSV
19
+ */
20
+ constructor(csv) {
21
+ this.csv = csv;
22
+ this.data = {};
23
+ this.enumerar = false;
24
+ this.editable = false;
25
+ }
26
+ /**
27
+ * Método de inicialización de visualización
28
+ */
29
+ ngOnInit() {
30
+ if (this.data) {
31
+ this.editable = this.data.editable || false;
32
+ this.enumerar = this.data.enumerable || false;
33
+ }
34
+ }
35
+ /**
36
+ * Método que invierte la ubicación del objeto renderizado
37
+ * @returns Regresa la ubicación invertida en modo texto
38
+ */
39
+ get invertirUbicacion() {
40
+ if (!this.viewPort || !this.viewPort['_renderedContentOffset']) {
41
+ return '-0px';
42
+ }
43
+ const offset = this.viewPort['_renderedContentOffset'];
44
+ return `-${offset}px`;
45
+ }
46
+ /**
47
+ * Método que valida si una columna esta bloqueada
48
+ * @param numeroColumna - Numero de columna
49
+ * @returns True si la columna esta bloqueada
50
+ */
51
+ columnaBloqueada(numeroColumna) {
52
+ return this.data.bloquearColumnas !== undefined &&
53
+ this.data.bloquearColumnas.some(c => c === numeroColumna);
54
+ }
55
+ /**
56
+ * Método que valida si una columna es visible
57
+ * @param numeroColumna - Numero de columna
58
+ * @returns True si es visible
59
+ */
60
+ columnaVisible(numeroColumna) {
61
+ return !(this.data.ocultarColumnas !== undefined &&
62
+ this.data.ocultarColumnas.some(c => c === numeroColumna));
63
+ }
64
+ /**
65
+ * Método que actualiza los datos editados en el grid
66
+ * @param indiceFila - Contiene el indice de la fila editada
67
+ * @param indiceColumna - Contiene el indice de la columna editada
68
+ * @param valor - Contiene el valor de edición de celda
69
+ */
70
+ actualizarDatos(indiceFila, indiceColumna, valor) {
71
+ if (this.data && this.data.filas) {
72
+ const fila = this.data.filas[indiceFila][indiceColumna];
73
+ fila.editado = fila.valor !== valor || fila.editado;
74
+ if (fila.editado) {
75
+ fila.valor = valor;
76
+ }
77
+ }
78
+ }
79
+ /**
80
+ * Cambia el foco de las celdas
81
+ * @param event - KeyboardEvent
82
+ */
83
+ moverFoco(event) {
84
+ this.moverDeCelda(event.target, event.key, document.querySelectorAll('#cell'));
85
+ }
86
+ /**
87
+ * Realiza el movimiento de celdas por el teclado
88
+ * @param control - Control que desencadena el evento
89
+ * @param key - Tecla que desencadeno el evento
90
+ * @param nodesControls - Controles del grid
91
+ */
92
+ moverDeCelda(control, key, nodesControls) {
93
+ const index = Array.prototype.map.call(nodesControls, x => { return x; }).indexOf(control);
94
+ let changeFocus = true;
95
+ let newIndex = 0;
96
+ switch (key) {
97
+ case 'Enter':
98
+ case 'ArrowRight':
99
+ changeFocus = key === 'Enter' ||
100
+ control.selectionStart === control.value.length;
101
+ newIndex = index + 1;
102
+ break;
103
+ case 'ArrowLeft':
104
+ changeFocus = control.selectionStart === 0;
105
+ newIndex = index - 1;
106
+ break;
107
+ case 'ArrowUp':
108
+ newIndex = index - this.columnasHabilitadas();
109
+ break;
110
+ case 'ArrowDown':
111
+ newIndex = index + this.columnasHabilitadas();
112
+ break;
113
+ default:
114
+ changeFocus = false;
115
+ break;
116
+ }
117
+ if (changeFocus) {
118
+ this.obtenerControl(nodesControls, newIndex).focus();
119
+ }
120
+ }
121
+ /**
122
+ * Regresa el numero de columnas habilitadas dentro del grid
123
+ * @returns Numero de columnas habilitadas
124
+ */
125
+ columnasHabilitadas() {
126
+ return this.data.columnas.length - (this.data.bloquearColumnas?.length ?? 0);
127
+ }
128
+ /**
129
+ * Obtiene el control de un NodeList por indice
130
+ * @param nodes - Lista de nodos
131
+ * @param index - Indice del control
132
+ * @returns Control del indice especificado
133
+ */
134
+ obtenerControl(nodes, index) {
135
+ return nodes.item(index);
136
+ }
137
+ /**
138
+ * Descarga los datos contenidos en el Grid como un CSV
139
+ * @param archivo - Nombre del archivo
140
+ */
141
+ descargarCsv(archivo) {
142
+ const data = this.data.filas.map((f) => { return f.filter((c, i) => (c.serializable ?? true) && this.columnaVisible(i)).map((c) => c.valor); }).filter(d => d.length > 0);
143
+ data.unshift(this.data.columnas.filter((c, i) => (c.serializable ?? true) && this.columnaVisible(i)).map((c) => c.valor));
144
+ this.csv.descargarCsv(archivo, data);
145
+ }
146
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RediGridComponent, deps: [{ token: i1.CsvService }], target: i0.ɵɵFactoryTarget.Component }); }
147
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.4", type: RediGridComponent, selector: "redi-grid", inputs: { data: "data", enumerar: "enumerar", editable: "editable" }, viewQueries: [{ propertyName: "viewPort", first: true, predicate: CdkVirtualScrollViewport, descendants: true }], ngImport: i0, template: "<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\u00F3n 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 <label for=\"cell\"> Value </label>\r\n <!-- Campo editable -->\r\n <input *ngIf=\"editable && !cell.bloqueado && !columnaBloqueada(colNum)\" type=\"text\" [value]=\"cell.valor\"\r\n name=\"cell\" id=\"cell\" (focusout)=\"actualizarDatos(rowNum,colNum,$any($event.target).value)\"\r\n [class.editado]=\"cell.editado\" />\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>", styles: [".container{border:1px solid #f4f4f4;overflow:auto;max-height:90vh;padding:0;box-shadow:#0000003d 0 3px 8px}.enumerable{width:10px}thead{text-align:center;color:#f9f9f9;height:1.9em}tbody{text-align:center;cursor:cell;color:#717171}input{text-align:center;color:#717171;border:none;background:transparent;outline:0;width:100%;padding:0}td{padding:3px;height:1.5em;border-right:solid 1px #e1e1e1;min-width:2em}tbody>tr:nth-child(2n){background-color:#f4f4f4}tbody>tr:hover{background-color:#cddce9;border:solid 1px #cddce9}thead>tr>th{position:sticky;top:0;border-right:solid 1px white;font-weight:400;background-color:#a5a5a5}tbody>tr>td:last-child,thead>tr>th:last-child{border-right:solid 0px}tbody>tr:last-child{border-bottom:solid 1px #e1e1e1}table{width:100%;-webkit-user-select:none;-ms-user-select:none;user-select:none;overflow:auto}.cdk-virtual-scrollable{min-height:400px}caption,label{display:none}.warn{border-bottom:solid 2px #F44336;border-top:solid 2px #F44336}tr>.warn:last-child{border-right:solid 2px #F44336}tr>.warn:first-child{border-left:solid 2px #F44336}.editado{color:#282;font-weight:600}.bloqueado{background-color:#f4f4f48d;color:#00000070}.oculto{display:none}.lockIcon{width:15px;height:15px;font-size:.8em;float:right}tbody>tr>td:focus-within{border:solid 1px #468b51bd;background:#9fd0fb6b}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i3.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i3.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
148
+ }
149
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RediGridComponent, decorators: [{
150
+ type: Component,
151
+ args: [{ selector: 'redi-grid', template: "<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\u00F3n 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 <label for=\"cell\"> Value </label>\r\n <!-- Campo editable -->\r\n <input *ngIf=\"editable && !cell.bloqueado && !columnaBloqueada(colNum)\" type=\"text\" [value]=\"cell.valor\"\r\n name=\"cell\" id=\"cell\" (focusout)=\"actualizarDatos(rowNum,colNum,$any($event.target).value)\"\r\n [class.editado]=\"cell.editado\" />\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>", styles: [".container{border:1px solid #f4f4f4;overflow:auto;max-height:90vh;padding:0;box-shadow:#0000003d 0 3px 8px}.enumerable{width:10px}thead{text-align:center;color:#f9f9f9;height:1.9em}tbody{text-align:center;cursor:cell;color:#717171}input{text-align:center;color:#717171;border:none;background:transparent;outline:0;width:100%;padding:0}td{padding:3px;height:1.5em;border-right:solid 1px #e1e1e1;min-width:2em}tbody>tr:nth-child(2n){background-color:#f4f4f4}tbody>tr:hover{background-color:#cddce9;border:solid 1px #cddce9}thead>tr>th{position:sticky;top:0;border-right:solid 1px white;font-weight:400;background-color:#a5a5a5}tbody>tr>td:last-child,thead>tr>th:last-child{border-right:solid 0px}tbody>tr:last-child{border-bottom:solid 1px #e1e1e1}table{width:100%;-webkit-user-select:none;-ms-user-select:none;user-select:none;overflow:auto}.cdk-virtual-scrollable{min-height:400px}caption,label{display:none}.warn{border-bottom:solid 2px #F44336;border-top:solid 2px #F44336}tr>.warn:last-child{border-right:solid 2px #F44336}tr>.warn:first-child{border-left:solid 2px #F44336}.editado{color:#282;font-weight:600}.bloqueado{background-color:#f4f4f48d;color:#00000070}.oculto{display:none}.lockIcon{width:15px;height:15px;font-size:.8em;float:right}tbody>tr>td:focus-within{border:solid 1px #468b51bd;background:#9fd0fb6b}\n"] }]
152
+ }], ctorParameters: () => [{ type: i1.CsvService }], propDecorators: { data: [{
153
+ type: Input
154
+ }], enumerar: [{
155
+ type: Input
156
+ }], editable: [{
157
+ type: Input
158
+ }], viewPort: [{
159
+ type: ViewChild,
160
+ args: [CdkVirtualScrollViewport, { static: false }]
161
+ }] } });
162
+
163
+ /**
164
+ * Modulo que contiene los componentes de grid
165
+ * @decorators ´@NgModule´
166
+ */
167
+ class RediGridModule {
168
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RediGridModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
169
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.0.4", ngImport: i0, type: RediGridModule, declarations: [RediGridComponent], imports: [CommonModule,
170
+ ScrollingModule,
171
+ MatIconModule], exports: [RediGridComponent] }); }
172
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RediGridModule, imports: [CommonModule,
173
+ ScrollingModule,
174
+ MatIconModule] }); }
175
+ }
176
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RediGridModule, decorators: [{
177
+ type: NgModule,
178
+ args: [{
179
+ declarations: [RediGridComponent],
180
+ imports: [
181
+ CommonModule,
182
+ ScrollingModule,
183
+ MatIconModule
184
+ ],
185
+ exports: [
186
+ RediGridComponent
187
+ ]
188
+ }]
189
+ }] });
190
+
191
+ /**
192
+ * Generated bundle index. Do not edit.
193
+ */
194
+
195
+ export { RediGridComponent, RediGridModule };
196
+ //# sourceMappingURL=ngx-redi-core-RediGrid.mjs.map
@@ -0,0 +1 @@
1
+ {"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 { AfterViewInit, Component, Input, OnInit, 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({\r\n selector: 'redi-grid',\r\n templateUrl: './redi-grid.component.html',\r\n styleUrls: ['./redi-grid.component.css']\r\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 /**\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 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 }\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('#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 <label for=\"cell\"> Value </label>\r\n <!-- Campo editable -->\r\n <input *ngIf=\"editable && !cell.bloqueado && !columnaBloqueada(colNum)\" type=\"text\" [value]=\"cell.valor\"\r\n name=\"cell\" id=\"cell\" (focusout)=\"actualizarDatos(rowNum,colNum,$any($event.target).value)\"\r\n [class.editado]=\"cell.editado\" />\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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"}