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,628 @@
1
+ import * as i0 from '@angular/core';
2
+ import { EventEmitter, Directive, Output, HostBinding, HostListener, 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/material/list';
6
+ import { MatListModule } from '@angular/material/list';
7
+ import * as i4 from '@angular/material/button';
8
+ import { MatButtonModule } from '@angular/material/button';
9
+ import * as i5 from '@angular/material/core';
10
+ import { MatRippleModule } from '@angular/material/core';
11
+ import { MatIconModule } from '@angular/material/icon';
12
+
13
+ /**
14
+ * Clase para procesar archivo csv según las necesidades.
15
+ * Produce datos con la estructura necesaria para el grid de datos o un arreglo de objetos.
16
+ */
17
+ class ProcesoArchivoCsv {
18
+ /**
19
+ *
20
+ * @param archivo El archivo csv a procesar
21
+ * @param datosParaDataGrid Especifica si los datos a generar son para el grid de datos
22
+ * @returns Una promesa con los datos en el formato especificado por el parámetro `datosParaGrid`
23
+ * @example
24
+ * Si la propiedad ´datosParaDataGrid = true´ devuelve ´{cols:[],rows:[]}´
25
+ * Si la propiedad ´datosParaDataGrid = false´ devuelve ´[{propiedad1:'valor',propiedad2:'valor2'}]´
26
+ */
27
+ procesar(archivo, datosParaDataGrid) {
28
+ return new Promise((resolve, reject) => {
29
+ const reader = new FileReader();
30
+ const item = archivo.item(0);
31
+ if (item) {
32
+ reader.readAsText(item, 'UTF-8');
33
+ }
34
+ reader.onload = () => {
35
+ const resultado = reader.result;
36
+ if ((resultado ?? '').toString().length === 0) {
37
+ reject({
38
+ mensaje: 'El archivo se encuentra vacío.'
39
+ });
40
+ }
41
+ if (!reader.result?.toString().includes('�')) {
42
+ const [informacion, columnas] = (this.generarInformacionColumnas(resultado, datosParaDataGrid));
43
+ if (datosParaDataGrid) {
44
+ resolve({ cols: columnas, rows: informacion });
45
+ }
46
+ else {
47
+ resolve(informacion);
48
+ }
49
+ }
50
+ else {
51
+ reject({
52
+ mensaje: 'El contenido del archivo no es válido.'
53
+ });
54
+ }
55
+ };
56
+ });
57
+ }
58
+ /**
59
+ * Método que genera la información y columnas contenidas en el archivo ´csv´ seleccionado.
60
+ * @param datos El texto contenido en el archivo ´csv´.
61
+ * @param datosParaDataGrid Especifica si los datos a generar son para el grid de datos
62
+ * @returns Retorna una lista con la información y las columnas contenidas en el archivo ´csv´.
63
+ */
64
+ generarInformacionColumnas(datos, datosParaDataGrid) {
65
+ let informacion = [];
66
+ let columnas = [];
67
+ const lineasTextTotales = datos.split(/\n/);
68
+ columnas = lineasTextTotales[0].toString().split(',')
69
+ .map((str) => { return str.replace(/ /g, '-').trim(); }).filter((stringArchivos) => stringArchivos.length > 0);
70
+ const datosSeparados = lineasTextTotales.filter((valor, indice) => indice > 0 && valor.length > 0)
71
+ .map((dato) => {
72
+ if (dato.includes('"')) {
73
+ return this.generaColumnas(dato.trim());
74
+ }
75
+ else {
76
+ return dato.split(',');
77
+ }
78
+ });
79
+ if (datosParaDataGrid) {
80
+ columnas = columnas.map(columna => {
81
+ return { value: columna };
82
+ });
83
+ informacion = datosSeparados.map(dato => {
84
+ return dato.map(o => {
85
+ return { value: o.replace(/\r/, '') };
86
+ });
87
+ });
88
+ }
89
+ else if (lineasTextTotales.length === 1) {
90
+ const objeto = {};
91
+ columnas.forEach(columna => objeto[`${columna}`] = '');
92
+ informacion.push(objeto);
93
+ }
94
+ else {
95
+ datosSeparados.forEach(dato => {
96
+ const objeto = {};
97
+ columnas.forEach((col, i) => {
98
+ objeto[col] = dato[i].replace(/\r/, '');
99
+ });
100
+ informacion.push(objeto);
101
+ });
102
+ }
103
+ return [informacion, columnas];
104
+ }
105
+ /**
106
+ * Método para separa las filar del csv en columnas.
107
+ * @param fila La cadena a separar para generar las columnas
108
+ * @returns Arreglo con las columnas
109
+ */
110
+ generaColumnas(fila) {
111
+ const values = [];
112
+ const separadorTemporal = 'ꜛ';
113
+ let estaEnComillas = false;
114
+ let val = '';
115
+ fila = fila.replaceAll('""', separadorTemporal);
116
+ [...fila].forEach((letra, indice) => {
117
+ switch (letra) {
118
+ case ',':
119
+ if (estaEnComillas) {
120
+ val += letra;
121
+ }
122
+ else {
123
+ values.push(val);
124
+ val = '';
125
+ }
126
+ break;
127
+ case '"':
128
+ if (estaEnComillas && indice + 1 < fila.length && fila[indice + 1] === '"') {
129
+ val += '"';
130
+ }
131
+ else {
132
+ estaEnComillas = !estaEnComillas;
133
+ }
134
+ break;
135
+ default:
136
+ val += fila[indice];
137
+ break;
138
+ }
139
+ });
140
+ values.push(val);
141
+ return values.map(columnas => columnas.replaceAll(separadorTemporal, '"'));
142
+ }
143
+ }
144
+
145
+ class DragDropDirective {
146
+ constructor() {
147
+ this.formato = 'dashed 2px #838383';
148
+ /**
149
+ * Evento que se emite una vez que se ha soltado el o los archivos en el componente.
150
+ */
151
+ this.fileDropped = new EventEmitter();
152
+ /**
153
+ * Evento que se emite una vez que se hace click al componente.
154
+ */
155
+ this.clicked = new EventEmitter();
156
+ /**
157
+ * Obtiene o establece el estilo del borde del componente.
158
+ */
159
+ this.border = this.formato;
160
+ /**
161
+ * Obtiene o establece el estilo del fondo del componente.
162
+ */
163
+ this.background = '';
164
+ }
165
+ /**
166
+ * El evento que cambia el borde y fondo del componente al arrastrar el archivo sobre el.
167
+ * @param event Evento
168
+ */
169
+ dragOver(event) {
170
+ this.border = 'dashed 2px #be1704';
171
+ this.background = '#be170421';
172
+ event.preventDefault();
173
+ event.stopPropagation();
174
+ }
175
+ /**
176
+ * El evento que restablece el borde y fondo del componente una vez que el archivo sale del área.
177
+ * @param event Evento
178
+ */
179
+ dragLeave(event) {
180
+ this.border = this.formato;
181
+ this.background = '';
182
+ event.preventDefault();
183
+ event.stopPropagation();
184
+ }
185
+ /**
186
+ * Evento que se ejecuta una vez que el archivo se suelta en el componente.
187
+ * @param event Evento
188
+ */
189
+ drop(event) {
190
+ this.border = this.formato;
191
+ this.background = '';
192
+ const files = event.dataTransfer?.files;
193
+ this.fileDropped.emit(files);
194
+ event.preventDefault();
195
+ event.stopPropagation();
196
+ }
197
+ /**
198
+ * Se emite el evento click en una vez se suelta el click (izquierdo)
199
+ * @param $event Evento
200
+ */
201
+ onClick(event) {
202
+ if (event.button === 0) {
203
+ this.clicked.emit();
204
+ }
205
+ }
206
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: DragDropDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
207
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.4", type: DragDropDirective, selector: "[dragDrop]", outputs: { fileDropped: "fileDropped", clicked: "clicked" }, host: { listeners: { "dragover": "dragOver($event)", "dragleave": "dragLeave($event)", "drop": "drop($event)", "mouseup": "onClick($event)" }, properties: { "style.border": "this.border", "style.background": "this.background" } }, ngImport: i0 }); }
208
+ }
209
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: DragDropDirective, decorators: [{
210
+ type: Directive,
211
+ args: [{
212
+ selector: '[dragDrop]'
213
+ }]
214
+ }], propDecorators: { fileDropped: [{
215
+ type: Output
216
+ }], clicked: [{
217
+ type: Output
218
+ }], border: [{
219
+ type: HostBinding,
220
+ args: ['style.border']
221
+ }], background: [{
222
+ type: HostBinding,
223
+ args: ['style.background']
224
+ }], dragOver: [{
225
+ type: HostListener,
226
+ args: ['dragover', ['$event']]
227
+ }], dragLeave: [{
228
+ type: HostListener,
229
+ args: ['dragleave', ['$event']]
230
+ }], drop: [{
231
+ type: HostListener,
232
+ args: ['drop', ['$event']]
233
+ }], onClick: [{
234
+ type: HostListener,
235
+ args: ['mouseup', ['$event']]
236
+ }] } });
237
+
238
+ class RediDragDropComponent {
239
+ /**
240
+ * Verifica si existe archivo cargado en el componente.
241
+ */
242
+ get existeArchivo() {
243
+ if (this.archivo) {
244
+ return this.archivo.length > 0;
245
+ }
246
+ return false;
247
+ }
248
+ /**
249
+ * Obtiene una lista con los archivos cargados.
250
+ */
251
+ get archivos() {
252
+ if (this.archivo) {
253
+ return this.generarListaNombreArchivos(this.archivo);
254
+ }
255
+ else {
256
+ return [];
257
+ }
258
+ }
259
+ /**
260
+ * Obtiene el nombre del primer archivo de la lista.
261
+ */
262
+ get nombreArchivo() { return this.archivo?.item(0)?.name; }
263
+ /**
264
+ * Establece si la carga de archivos es múltiple.
265
+ */
266
+ set archivosMultiples(value) {
267
+ if (this.procesoCsv) {
268
+ this.multiple = false;
269
+ }
270
+ else {
271
+ this.multiple = value;
272
+ }
273
+ }
274
+ /**
275
+ * Obtiene si la carga de los archivos es múltiple.
276
+ */
277
+ get archivosMultiples() { return this.multiple; }
278
+ /**
279
+ * Establece si la selección de archivos se realizará desde distintos directorios.
280
+ */
281
+ set cargaDiferida(value) {
282
+ this.multiple = true;
283
+ this.seleccionDiferida = value;
284
+ }
285
+ /**
286
+ * Obtiene si la selección de archivos se realizará desde distintos directorios.
287
+ */
288
+ get cargaDiferida() { return this.seleccionDiferida; }
289
+ /**
290
+ * Especifica que el archivo a cargar en el componente es un `csv`. Y establece en `true` la propiedad `procesoCsv`.
291
+ */
292
+ set procesarCsvTabla(value) {
293
+ this.procesoCsv = value;
294
+ if (value) {
295
+ this.archivosMultiples = false;
296
+ this.extensionesAceptadas = '.csv';
297
+ }
298
+ }
299
+ constructor(procesoArchivoCsv) {
300
+ this.procesoArchivoCsv = procesoArchivoCsv;
301
+ /**
302
+ * Obtiene o establece si el titulo se muestra.
303
+ * @default 'true'
304
+ */
305
+ this.muestraTitulo = true;
306
+ /**
307
+ * Obtiene o establece si los datos procesados en la carga de un archivo `csv` son para el grid.
308
+ * @default true
309
+ */
310
+ this.datosParaDataGrid = true;
311
+ /**
312
+ * Obtiene o establece si la carga de archivos es múltiple.
313
+ */
314
+ this.multiple = false;
315
+ /**
316
+ * Obtiene o establece si la selección de archivos,se realizará desde distintos directorios.
317
+ */
318
+ this.seleccionDiferida = false;
319
+ /**
320
+ * Obtiene o establece aquellos archivos que ya se encuentran cargados en el componente.
321
+ */
322
+ this.repetidos = [];
323
+ /**
324
+ * Obtiene o establece que se realizará un proceso de lectura al archivo csv cargado en el componente.
325
+ */
326
+ this.procesoCsv = false;
327
+ /**
328
+ * Evento que se emite una vez que el archivo `csv` es procesado.
329
+ * @example
330
+ * Si la propiedad ´datosParaDataGrid = true´ devuelve ´{cols:[],rows:[]}´
331
+ * Si la propiedad ´datosParaDataGrid = false´ devuelve ´[{propiedad1:'valor',propiedad2:'valor2'}]´
332
+ *
333
+ */
334
+ this.csvDatosProcesados = new EventEmitter();
335
+ /**
336
+ * Obtiene o establece si existe un error.
337
+ */
338
+ this.error = false;
339
+ this.cambioArchivo = new EventEmitter();
340
+ }
341
+ /**
342
+ * Método que establece el proceso a realizar con el o los archivos seleccionados.
343
+ * @param fileList Los archivos seleccionados
344
+ */
345
+ establecerProceso(fileList) {
346
+ if (this.cargaDiferida) {
347
+ this.procesarArchivosPorSeparado(fileList);
348
+ }
349
+ else {
350
+ this.procesarArchivo(fileList);
351
+ }
352
+ }
353
+ /**
354
+ * Método encargado para el proceso de archivo individual.
355
+ * @param archivo El archivo csv seleccionado.
356
+ */
357
+ async procesarArchivo(archivo) {
358
+ if (!this.validoTamanioArchivos(archivo)) {
359
+ return;
360
+ }
361
+ this.archivo = (archivo.length === 0) ? null : archivo;
362
+ if (this.manejoErrorExtensionesValidas(this.archivos.map(stringArchivos => stringArchivos?.split(/[.]/).pop() ?? ''))) {
363
+ if (this.procesoCsv) {
364
+ await this.procesoArchivoCsv.procesar(archivo, this.datosParaDataGrid)
365
+ .then(datos => {
366
+ this.csvDatosProcesados.emit(datos);
367
+ }).catch((error) => {
368
+ this.estableceMensajeError(error.mensaje);
369
+ this.archivo = null;
370
+ this.csvDatosProcesados.emit(null);
371
+ });
372
+ }
373
+ else {
374
+ this.cambioArchivo.emit(this.archivo);
375
+ }
376
+ }
377
+ }
378
+ /**
379
+ * Método encargado para el proceso de múltiples archivos.
380
+ * @param archivo Los archivos seleccionados.
381
+ * @returns Void
382
+ */
383
+ procesarArchivosPorSeparado(archivo) {
384
+ this.repetidos = [];
385
+ if (!this.validoTamanioArchivos(archivo)) {
386
+ return;
387
+ }
388
+ const archivosNuevos = this.generarListaNombreArchivos(archivo);
389
+ if (this.manejoErrorExtensionesValidas(archivosNuevos.map(stringArchivos => stringArchivos?.split(/[.]/).pop() ?? ''))) {
390
+ if (this.archivo) {
391
+ this.cargarArchivos(archivo, archivosNuevos);
392
+ }
393
+ else {
394
+ this.archivo = archivo;
395
+ (this.inputArchivo?.nativeElement || {}).files = this.archivo;
396
+ this.cambioArchivo.emit(this.archivo);
397
+ }
398
+ }
399
+ }
400
+ /**
401
+ * Método que carga los archivos nuevos a la lista de archivos seleccionados anteriormente.
402
+ * @param archivo Los archivos seleccionados
403
+ * @param archivosNuevos Arreglo con la lista de los archivos seleccionados.
404
+ */
405
+ cargarArchivos(archivo, archivosNuevos) {
406
+ const dataTransfer = new DataTransfer();
407
+ const repetidos = this.generarListaNombreArchivos(this.archivo ?? new FileList()).map(nombreArchivo => {
408
+ return archivosNuevos.find(elm => elm === nombreArchivo);
409
+ }).filter(o => !!o);
410
+ if (repetidos.length === 0) {
411
+ for (let index = 0; index < (this.archivo ?? new FileList()).length; index++) {
412
+ dataTransfer.items.add((this.archivo ?? new FileList())[index]);
413
+ }
414
+ for (let index = 0; index < archivo.length; index++) {
415
+ dataTransfer.items.add(archivo[index]);
416
+ }
417
+ this.archivo = dataTransfer.files;
418
+ (this.inputArchivo?.nativeElement || {}).files = this.archivo;
419
+ this.cambioArchivo.emit(this.archivo);
420
+ }
421
+ else {
422
+ this.repetidos.push(...repetidos);
423
+ (this.inputArchivo?.nativeElement || {}).files = this.archivo;
424
+ }
425
+ }
426
+ /**
427
+ * Método que elimina los archivos seleccionados de lista.
428
+ * @param selectionModel La lista de opciones seleccionadas
429
+ */
430
+ eliminarArchivo(selectionModel) {
431
+ const dataTransfer = new DataTransfer();
432
+ const archivosCargados = this.archivo;
433
+ const archivosToEliminar = selectionModel.selected.map((matListOption) => matListOption.value.toString());
434
+ for (let index = 0; index < archivosCargados.length; index++) {
435
+ if (!archivosToEliminar.some(stringArchivos => stringArchivos === archivosCargados.item(index)?.name)) {
436
+ dataTransfer.items.add(archivosCargados[index]);
437
+ }
438
+ }
439
+ if (dataTransfer.files.length > 0) {
440
+ this.archivo = dataTransfer.files;
441
+ (this.inputArchivo?.nativeElement || {}).files = dataTransfer.files;
442
+ this.cambioArchivo.emit(this.archivo);
443
+ }
444
+ else {
445
+ this.eliminarTodosArchivos();
446
+ }
447
+ }
448
+ eliminarTodosArchivos() {
449
+ this.archivo = null;
450
+ (this.inputArchivo?.nativeElement || {}).files = null;
451
+ (this.inputArchivo?.nativeElement || {}).value = '';
452
+ this.cambioArchivo.emit(this.archivo);
453
+ }
454
+ /**
455
+ * Método que genera y retorna un arreglo con los nombres de los archivos cargados.
456
+ * @param fileList Objeto que contiene los archivos seleccionados
457
+ * @returns Retorna arreglo de cadenas.
458
+ * `['archivo.pdf','archivo2.avi']`
459
+ */
460
+ generarListaNombreArchivos(fileList) {
461
+ const archivos = [];
462
+ for (let index = 0; index < fileList.length; index++) {
463
+ archivos.push(fileList.item(index)?.name ?? '');
464
+ }
465
+ return archivos.sort();
466
+ }
467
+ /**
468
+ * Método que genera y retorna un arreglo numérico con los tamaños de cada uno de los archivos seleccionados.
469
+ * @param fileList Objeto que contiene los archivos seleccionados
470
+ * @returns Retorna arreglo numérico con el tamaño de cada archivo en bytes.
471
+ * `[124661,123132]`
472
+ */
473
+ generarListaTamanioArchivos(fileList) {
474
+ const archivos = [];
475
+ for (let index = 0; index < fileList.length; index++) {
476
+ archivos.push(fileList.item(index)?.size ?? 0);
477
+ }
478
+ return archivos;
479
+ }
480
+ /**
481
+ * Método que verifica si las extensiones son válidas.
482
+ * @param extensionesArchivosSeleccionados Arreglo con las extensiones de cada uno de los archivos seleccionados.
483
+ * @returns Boolean
484
+ */
485
+ manejoErrorExtensionesValidas(extensionesArchivosSeleccionados) {
486
+ if (this.extensionesAceptadas) {
487
+ return this.verificaExtensiones(extensionesArchivosSeleccionados);
488
+ }
489
+ else {
490
+ if (!this.cargaDiferida) {
491
+ (this.inputArchivo?.nativeElement || {}).files = this.archivo;
492
+ }
493
+ return true;
494
+ }
495
+ }
496
+ /**
497
+ * Método que verifica si las extensiones de los archivos seleccionados son válidas, y asigna los archivos
498
+ * a la propiedad `inputArchivo` en caso de que sean válidos.
499
+ * @param extensionesArchivosSeleccionados Arreglo con las extensiones de cada uno de los archivos seleccionados.
500
+ * @returns Boolean
501
+ */
502
+ verificaExtensiones(extensionesArchivosSeleccionados) {
503
+ const extensiones = this.extensionesAceptadas?.split(/,/).map(extension => extension.replace(/./, ''));
504
+ if (!this.extensionesValidas(extensiones ?? [], extensionesArchivosSeleccionados)) {
505
+ this.estableceMensajeError(this.archivosMultiples ? 'Existe archivo no válido en su selección. Intente nuevamente.' : 'El archivo no es válido');
506
+ if (!this.cargaDiferida) {
507
+ (this.inputArchivo?.nativeElement || {}).files = null;
508
+ this.archivo = null;
509
+ }
510
+ return false;
511
+ }
512
+ else {
513
+ if (!this.cargaDiferida) {
514
+ (this.inputArchivo?.nativeElement || {}).files = this.archivo;
515
+ }
516
+ return true;
517
+ }
518
+ }
519
+ /**
520
+ * Método para establecer el mensaje de error en el componente, el mensaje dura 3 segundos después de eso desaparece.
521
+ * @param mensaje El mensaje de error a mostrar en el componente
522
+ */
523
+ estableceMensajeError(mensaje) {
524
+ const tiempo = 3000;
525
+ this.mensajeError = mensaje;
526
+ this.error = true;
527
+ setTimeout(() => {
528
+ this.error = false;
529
+ }, tiempo);
530
+ }
531
+ /**
532
+ * Método que valida si las extensiones de los archivos son válidos con respectos a los especificados en la propiedad `extensionesAceptadas`.
533
+ * @param extensiones Arreglo que contiene las extensiones aceptadas por el componente.
534
+ * @param extensionesArchivosSeleccionados Arreglo que contiene la extensiones de los archivos seleccionados.
535
+ * @returns Boolean
536
+ */
537
+ extensionesValidas(extensiones, extensionesArchivosSeleccionados) {
538
+ return extensionesArchivosSeleccionados.every(valor => extensiones.includes(valor));
539
+ }
540
+ /**
541
+ * 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
542
+ * se permite cualquier tamaño de archivo.
543
+ * @param archivo El o los archivos seleccionados.
544
+ * @returns Boolean
545
+ */
546
+ validoTamanioArchivos(archivo) {
547
+ if (this.tamanoMaximoArchivo) {
548
+ if (this.tamanoMaximoArchivo <= 0) {
549
+ return false;
550
+ }
551
+ const no = 1024;
552
+ const size = this.tamanoMaximoArchivo * no * no;
553
+ if (this.generarListaTamanioArchivos(archivo).some(tamanoAarchivo => tamanoAarchivo > size)) {
554
+ this.estableceMensajeError(`El tamaño máximo por archivo es de: ${this.tamanoMaximoArchivo} MB`);
555
+ (this.inputArchivo?.nativeElement || {}).files = this.existeArchivo ? this.archivo : null;
556
+ return false;
557
+ }
558
+ else {
559
+ return true;
560
+ }
561
+ }
562
+ return true;
563
+ }
564
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RediDragDropComponent, deps: [{ token: ProcesoArchivoCsv }], target: i0.ɵɵFactoryTarget.Component }); }
565
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.4", type: RediDragDropComponent, selector: "redi-drag-drop", inputs: { titulo: "titulo", muestraTitulo: "muestraTitulo", extensionesAceptadas: "extensionesAceptadas", tamanoMaximoArchivo: "tamanoMaximoArchivo", datosParaDataGrid: "datosParaDataGrid", archivosMultiples: "archivosMultiples", cargaDiferida: "cargaDiferida", procesarCsvTabla: "procesarCsvTabla" }, outputs: { csvDatosProcesados: "csvDatosProcesados", cambioArchivo: "cambioArchivo" }, providers: [ProcesoArchivoCsv], viewQueries: [{ propertyName: "inputArchivo", first: true, predicate: ["inputArchivo"], descendants: true }, { propertyName: "listArchivos", first: true, predicate: ["listArchivos"], descendants: true }], ngImport: i0, template: "<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\u00ED \u00F3 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>", styles: [":host{display:block;height:100%}:host p{text-align:center;font-size:12px;font-weight:lighter;margin:0}.contenedor{display:flex;align-items:center;justify-content:center;margin-top:10px;padding:10px;cursor:pointer;border-radius:10px;background-color:#f1f2f7;height:90%}.contenedor-input{display:none}.imagen{width:75px;height:75px;margin:0 auto;background-image:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"48\" viewBox=\"0 96 960 960\" width=\"48\"><path d=\"M250 896q-86 0-148-62T40 686q0-78 49.5-137.5T217 477q20-97 94-158.5T482 257q113 0 189.5 81.5T748 534v24q72-2 122 46.5T920 727q0 69-50 119t-119 50H510q-24 0-42-18t-18-42V578l-83 83-43-43 156-156 156 156-43 43-83-83v258h241q45 0 77-32t32-77q0-45-32-77t-77-32h-63v-84q0-89-60.5-153T478 317q-89 0-150 64t-61 153h-19q-62 0-105 43.5T100 685q0 62 43.929 106.5Q187.857 836 250 836h140v60H250Zm230-290Z\" style=\"fill:rgb(131, 131, 131);\"/></svg>');background-repeat:no-repeat;background-position:center;background-size:contain}.archivo{background-image:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"48\" viewBox=\"0 96 960 960\" width=\"48\"><path d=\"M319 806h322v-60H319v60Zm0-170h322v-60H319v60Zm-99 340q-24 0-42-18t-18-42V236q0-24 18-42t42-18h361l219 219v521q0 24-18 42t-42 18H220Zm331-554V236H220v680h520V422H551ZM220 236v186-186 680-680Z\" style=\"fill:rgb(131, 131, 131);\"/></svg>')!important}.archivo-lista{background-image:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"48\" viewBox=\"0 96 960 960\" width=\"48\"><path d=\"m612 506 141-142-28-28-113 113-57-57-28 29 85 85ZM120 896v-60h480v60H120Zm519.894-290Q561 606 505.5 550.394t-55.5-134.5Q450 337 505.606 281.5t134.5-55.5Q719 226 774.5 281.606t55.5 134.5Q830 495 774.394 550.5t-134.5 55.5ZM120 556v-60h262q5.32 16.323 12.16 31.161Q401 542 409 556H120Zm0 170v-60h419q13.8 6.364 29.4 10.682Q584 681 600 683v43H120Z\" style=\"fill:rgb(131, 131, 131);\"/></svg>')!important}.titulo{font-size:medium!important;text-align:left!important;border-bottom:solid #40529d;margin-bottom:5px}.dragdrop{font-size:larger!important;margin-bottom:5px!important}.botones{display:flex;justify-content:space-between;background:#fff;padding:5px;border-radius:0 0 5px 5px}.contenedor-lista{border:solid 1px rgb(131,131,131);margin:5px;border-radius:5px;background-color:#f5f5f5;height:100%}.titulo-lista{text-align:left!important;background:#fff;padding:5px;font-weight:500!important;border-radius:5px 5px 0 0}.lista-archivos{max-height:250px;overflow:auto}.error{position:relative;font-size:small;color:#f5f5f5;padding:5px;font-weight:lighter;background-color:#be1704ab;border-radius:5px;margin:5px;text-align:center}.repetidos{list-style-type:auto}.repetidos li{text-align:left}.cerrar{position:absolute;top:5px;right:5px;border-radius:10px;background-color:#f5f5f5;border:none;height:20px;width:20px;color:#d36357;cursor:pointer}.avatar{opacity:.3;display:block}\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: "component", type: i3.MatSelectionList, selector: "mat-selection-list", inputs: ["color", "compareWith", "multiple", "hideSingleSelectionIndicator", "disabled"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: i3.MatListOption, selector: "mat-list-option", inputs: ["togglePosition", "checkboxPosition", "color", "value", "selected"], outputs: ["selectedChange"], exportAs: ["matListOption"] }, { kind: "directive", type: i3.MatListItemTitle, selector: "[matListItemTitle]" }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: i5.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "directive", type: DragDropDirective, selector: "[dragDrop]", outputs: ["fileDropped", "clicked"] }] }); }
566
+ }
567
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RediDragDropComponent, decorators: [{
568
+ type: Component,
569
+ args: [{ selector: 'redi-drag-drop', providers: [ProcesoArchivoCsv], template: "<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\u00ED \u00F3 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>", styles: [":host{display:block;height:100%}:host p{text-align:center;font-size:12px;font-weight:lighter;margin:0}.contenedor{display:flex;align-items:center;justify-content:center;margin-top:10px;padding:10px;cursor:pointer;border-radius:10px;background-color:#f1f2f7;height:90%}.contenedor-input{display:none}.imagen{width:75px;height:75px;margin:0 auto;background-image:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"48\" viewBox=\"0 96 960 960\" width=\"48\"><path d=\"M250 896q-86 0-148-62T40 686q0-78 49.5-137.5T217 477q20-97 94-158.5T482 257q113 0 189.5 81.5T748 534v24q72-2 122 46.5T920 727q0 69-50 119t-119 50H510q-24 0-42-18t-18-42V578l-83 83-43-43 156-156 156 156-43 43-83-83v258h241q45 0 77-32t32-77q0-45-32-77t-77-32h-63v-84q0-89-60.5-153T478 317q-89 0-150 64t-61 153h-19q-62 0-105 43.5T100 685q0 62 43.929 106.5Q187.857 836 250 836h140v60H250Zm230-290Z\" style=\"fill:rgb(131, 131, 131);\"/></svg>');background-repeat:no-repeat;background-position:center;background-size:contain}.archivo{background-image:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"48\" viewBox=\"0 96 960 960\" width=\"48\"><path d=\"M319 806h322v-60H319v60Zm0-170h322v-60H319v60Zm-99 340q-24 0-42-18t-18-42V236q0-24 18-42t42-18h361l219 219v521q0 24-18 42t-42 18H220Zm331-554V236H220v680h520V422H551ZM220 236v186-186 680-680Z\" style=\"fill:rgb(131, 131, 131);\"/></svg>')!important}.archivo-lista{background-image:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"48\" viewBox=\"0 96 960 960\" width=\"48\"><path d=\"m612 506 141-142-28-28-113 113-57-57-28 29 85 85ZM120 896v-60h480v60H120Zm519.894-290Q561 606 505.5 550.394t-55.5-134.5Q450 337 505.606 281.5t134.5-55.5Q719 226 774.5 281.606t55.5 134.5Q830 495 774.394 550.5t-134.5 55.5ZM120 556v-60h262q5.32 16.323 12.16 31.161Q401 542 409 556H120Zm0 170v-60h419q13.8 6.364 29.4 10.682Q584 681 600 683v43H120Z\" style=\"fill:rgb(131, 131, 131);\"/></svg>')!important}.titulo{font-size:medium!important;text-align:left!important;border-bottom:solid #40529d;margin-bottom:5px}.dragdrop{font-size:larger!important;margin-bottom:5px!important}.botones{display:flex;justify-content:space-between;background:#fff;padding:5px;border-radius:0 0 5px 5px}.contenedor-lista{border:solid 1px rgb(131,131,131);margin:5px;border-radius:5px;background-color:#f5f5f5;height:100%}.titulo-lista{text-align:left!important;background:#fff;padding:5px;font-weight:500!important;border-radius:5px 5px 0 0}.lista-archivos{max-height:250px;overflow:auto}.error{position:relative;font-size:small;color:#f5f5f5;padding:5px;font-weight:lighter;background-color:#be1704ab;border-radius:5px;margin:5px;text-align:center}.repetidos{list-style-type:auto}.repetidos li{text-align:left}.cerrar{position:absolute;top:5px;right:5px;border-radius:10px;background-color:#f5f5f5;border:none;height:20px;width:20px;color:#d36357;cursor:pointer}.avatar{opacity:.3;display:block}\n"] }]
570
+ }], ctorParameters: () => [{ type: ProcesoArchivoCsv }], propDecorators: { titulo: [{
571
+ type: Input
572
+ }], muestraTitulo: [{
573
+ type: Input
574
+ }], extensionesAceptadas: [{
575
+ type: Input
576
+ }], tamanoMaximoArchivo: [{
577
+ type: Input
578
+ }], datosParaDataGrid: [{
579
+ type: Input
580
+ }], inputArchivo: [{
581
+ type: ViewChild,
582
+ args: ['inputArchivo']
583
+ }], listArchivos: [{
584
+ type: ViewChild,
585
+ args: ['listArchivos']
586
+ }], archivosMultiples: [{
587
+ type: Input
588
+ }], cargaDiferida: [{
589
+ type: Input
590
+ }], procesarCsvTabla: [{
591
+ type: Input
592
+ }], csvDatosProcesados: [{
593
+ type: Output
594
+ }], cambioArchivo: [{
595
+ type: Output
596
+ }] } });
597
+
598
+ class RediDragDropModule {
599
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RediDragDropModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
600
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.0.4", ngImport: i0, type: RediDragDropModule, declarations: [RediDragDropComponent,
601
+ DragDropDirective], imports: [CommonModule,
602
+ MatListModule, MatButtonModule, MatIconModule, MatRippleModule], exports: [RediDragDropComponent] }); }
603
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RediDragDropModule, imports: [CommonModule,
604
+ MatListModule, MatButtonModule, MatIconModule, MatRippleModule] }); }
605
+ }
606
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: RediDragDropModule, decorators: [{
607
+ type: NgModule,
608
+ args: [{
609
+ declarations: [
610
+ RediDragDropComponent,
611
+ DragDropDirective
612
+ ],
613
+ imports: [
614
+ CommonModule,
615
+ MatListModule, MatButtonModule, MatIconModule, MatRippleModule
616
+ ],
617
+ exports: [
618
+ RediDragDropComponent
619
+ ]
620
+ }]
621
+ }] });
622
+
623
+ /**
624
+ * Generated bundle index. Do not edit.
625
+ */
626
+
627
+ export { DragDropDirective, ProcesoArchivoCsv, RediDragDropComponent, RediDragDropModule };
628
+ //# sourceMappingURL=ngx-redi-core-RediDragDrop.mjs.map