tailjng 0.0.18 → 0.0.19

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.
@@ -86,6 +86,10 @@ function getComponentList() {
86
86
  path: "src/lib/components/form/form-container",
87
87
  dependencies: [],
88
88
  },
89
+ 'paginator-complete': {
90
+ path: "src/lib/components/paginator/paginator-complete",
91
+ dependencies: ["button"],
92
+ },
89
93
 
90
94
 
91
95
 
@@ -27,7 +27,7 @@ Authors:
27
27
  License:
28
28
  This project is licensed under the BSD 3-Clause - see the LICENSE file for more details.
29
29
 
30
- Version: 0.0.18
30
+ Version: 0.0.19
31
31
  Creation Date: 2025-01-04
32
32
  ===============================================`
33
33
 
@@ -6,7 +6,7 @@ import { es } from 'date-fns/locale';
6
6
  import { map, isObservable, firstValueFrom } from 'rxjs';
7
7
  import * as i1$1 from '@angular/common/http';
8
8
  import { HttpParams } from '@angular/common/http';
9
- import { Loader2, Moon, Sun, Copy, Search, SquareDashedMousePointer, ChevronDown, Eye, Upload, ImageOff, Minimize2, Scan, RefreshCcw, RotateCcw, RotateCw, ZoomOut, ZoomIn, Check, X, CircleHelp, TriangleAlert, CircleX, CircleCheck, Info } from 'lucide-angular';
9
+ import { ChevronsRight, ChevronRight, ChevronLeft, ChevronsLeft, Loader2, Moon, Sun, Copy, Search, SquareDashedMousePointer, ChevronDown, Eye, Upload, ImageOff, Minimize2, Scan, RefreshCcw, RotateCcw, RotateCw, ZoomOut, ZoomIn, Check, X, CircleHelp, TriangleAlert, CircleX, CircleCheck, Info } from 'lucide-angular';
10
10
 
11
11
  const TAILJNG_CONFIG = new InjectionToken('TAILJNG_CONFIG');
12
12
  // providers: [
@@ -75,13 +75,42 @@ class JCalendarService {
75
75
  }
76
76
  return { years, months, days };
77
77
  }
78
+ /**
79
+ * Format a date string to 'DD/MM/YYYY'.
80
+ * @param date The date string in 'YYYY-MM-DD' format.
81
+ * @returns The formatted date string.
82
+ */
83
+ formatDateStringToDMY(date) {
84
+ const partesFecha = date.split('-');
85
+ const año = partesFecha[0];
86
+ const mes = parseInt(partesFecha[1], 10);
87
+ const día = parseInt(partesFecha[2], 10);
88
+ const díaFormateado = día < 10 ? `0${día}` : día.toString();
89
+ const mesFormateado = mes < 10 ? `0${mes}` : mes.toString();
90
+ return `${díaFormateado}/${mesFormateado}/${año}`;
91
+ }
92
+ /**
93
+ * Format a Date object to 'DD/MM/YYYY'.
94
+ * @param date The Date object to format.
95
+ * @returns The formatted date string.
96
+ */
97
+ formatDateToDMY(date) {
98
+ const utc_date = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()));
99
+ let new_date = utc_date;
100
+ const año = new_date.getUTCFullYear();
101
+ const mes = new_date.getUTCMonth();
102
+ const día = new_date.getUTCDate();
103
+ const díaFormateado = día < 10 ? `0${día}` : día.toString();
104
+ const mesFormateado = mes < 10 ? `0${mes}` : mes.toString();
105
+ return `${díaFormateado}/${mesFormateado}/${año}`;
106
+ }
78
107
  /**
79
108
  * Format a date string to a more readable format.
80
109
  * @param date The date string in 'YYYY-MM-DD' format.
81
110
  * @param month Optional parameter to add to the month name.
82
111
  * @returns A formatted date string in the format 'DD de MMMM del YYYY'.
83
112
  */
84
- formatearFechaString(date, month) {
113
+ formatDateStringToLong(date, month) {
85
114
  const partesFecha = date.split('-');
86
115
  const año = partesFecha[0];
87
116
  const mes = this.nameMonts[parseInt(partesFecha[1], 10) - 1];
@@ -101,13 +130,12 @@ class JCalendarService {
101
130
  * @param month Optional parameter to add to the month name.
102
131
  * @returns A formatted date string.
103
132
  */
104
- formatearFechaDate(date, month) {
133
+ formatDateToLong(date, month) {
105
134
  const utc_date = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()));
106
135
  let new_date = utc_date;
107
136
  if (month !== undefined) {
108
137
  new_date = new Date(new_date.setUTCMonth(new_date.getUTCMonth() + month));
109
138
  }
110
- // Get the values of the new date in UTC to avoid local time zones
111
139
  const año = new_date.getUTCFullYear();
112
140
  const mes = this.nameMonts[new_date.getUTCMonth()];
113
141
  const día = new_date.getUTCDate();
@@ -118,10 +146,10 @@ class JCalendarService {
118
146
  * @param fechaStr The date string to parse.
119
147
  * @returns The parsed date string in "yyyy-MM-dd" format or null if invalid.
120
148
  */
121
- parseFechaString(fechaStr) {
149
+ parseDateString(fechaStr) {
122
150
  if (!fechaStr)
123
151
  return null;
124
- // Map Spanish month names to their numeric equivalents
152
+ // Mapeo de meses en español
125
153
  const meses = {
126
154
  'ENERO': '01',
127
155
  'FEBRERO': '02',
@@ -289,10 +317,10 @@ class JConverterCrudService {
289
317
  return this.currencyPipe.transform(value, 'USD', 'symbol', '1.2-2');
290
318
  }
291
319
  if (column.isDate && value !== null) {
292
- return new Date(value).toLocaleDateString();
320
+ return this.calendarService.formatDateStringToDMY(`${value}`);
293
321
  }
294
322
  if (column.isDateText && value !== null) {
295
- return this.calendarService.formatearFechaString(`${value}`);
323
+ return this.calendarService.formatDateStringToLong(`${value}`);
296
324
  }
297
325
  if (column.isDateTime && value !== null) {
298
326
  return new Date(value).toLocaleString();
@@ -306,6 +334,23 @@ class JConverterCrudService {
306
334
  if (column.isFirstWord && value !== null) {
307
335
  return value.split(' ')[0];
308
336
  }
337
+ if (column.isPhoneEcuadorian && value !== null) {
338
+ // Si el número ya empieza con +593
339
+ if (value.startsWith('+593')) {
340
+ const restOfNumber = value.slice(4);
341
+ return `+593 ${restOfNumber}`;
342
+ }
343
+ // Si el número empieza con 0, reemplazar el 0 por +593
344
+ if (value.startsWith('0')) {
345
+ return `+593 ${value.replace(/^0/, '')}`;
346
+ }
347
+ // Si el número empieza con 9 (y no tiene +593), agregar +593 al principio
348
+ if (value.startsWith('9')) {
349
+ return `+593 ${value}`;
350
+ }
351
+ return value;
352
+ }
353
+ // Si no se aplica ningún formato, retornar el valor original
309
354
  return value;
310
355
  }
311
356
  /**
@@ -320,46 +365,36 @@ class JConverterCrudService {
320
365
  return null;
321
366
  }
322
367
  let cleaned = value;
323
- // If it's text, trim whitespace
324
368
  if (typeof cleaned === 'string') {
325
369
  cleaned = cleaned.trim();
326
370
  }
327
- // isdollar → remove symbol and parse to number
328
371
  if (column.isdollar && typeof cleaned === 'string') {
329
372
  cleaned = cleaned.replace(/[^\d,.-]/g, '').replace(',', '.');
330
373
  return cleaned ? parseFloat(cleaned) : null;
331
374
  }
332
- // isCurrency → remove symbol and parse to number
333
375
  if (column.isCurrency && typeof cleaned === 'string') {
334
376
  cleaned = cleaned.replace(/[^\d,.-]/g, '').replace(',', '.');
335
377
  return cleaned ? parseFloat(cleaned) : null;
336
378
  }
337
- // isDateText → parse text from date to ISO format (yyyy-MM-dd)
338
379
  if (column.isDateText && typeof cleaned === 'string') {
339
- // Use your reverse calendarService if you have one
340
- const fecha = this.calendarService.parseFechaString(cleaned);
380
+ const fecha = this.calendarService.parseDateString(cleaned);
341
381
  return fecha ?? cleaned;
342
382
  }
343
- // isDate → parse text to Date or ISO string
344
383
  if (column.isDate && typeof cleaned === 'string') {
345
384
  const fecha = new Date(cleaned);
346
385
  return isNaN(fecha.getTime()) ? cleaned : fecha.toISOString().substring(0, 10);
347
386
  }
348
- // isDateTime → parse text to DateTime
349
387
  if (column.isDateTime && typeof cleaned === 'string') {
350
388
  const fecha = new Date(cleaned);
351
389
  return isNaN(fecha.getTime()) ? cleaned : fecha.toISOString();
352
390
  }
353
- // isDateTimeText → parse text to DateTime
354
391
  if (column.isDateTimeText && typeof cleaned === 'string') {
355
392
  const fecha = new Date(cleaned);
356
393
  return isNaN(fecha.getTime()) ? cleaned : fecha.toISOString();
357
394
  }
358
- // isRelativeTime → impossible to reverse automatically, return text
359
395
  if (column.isRelativeTime) {
360
396
  return cleaned;
361
397
  }
362
- // isFirstWord → return full text, as it's unclear which part to remove
363
398
  if (column.isFirstWord) {
364
399
  return cleaned;
365
400
  }
@@ -643,6 +678,10 @@ class JIconsService {
643
678
  sun: Sun,
644
679
  moon: Moon,
645
680
  loading: Loader2,
681
+ firstPage: ChevronsLeft,
682
+ prevPage: ChevronLeft,
683
+ nextPage: ChevronRight,
684
+ lastPage: ChevronsRight,
646
685
  };
647
686
  constructor() { }
648
687
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: JIconsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
@@ -1 +1 @@
1
- {"version":3,"file":"tailjng.mjs","sources":["../../../projects/tailjng/src/lib/config/tailjng-config.token.ts","../../../projects/tailjng/src/lib/services/transformer/calendar.service.ts","../../../projects/tailjng/src/lib/services/crud/converter-crud.service.ts","../../../projects/tailjng/src/lib/services/http/params-http.service.ts","../../../projects/tailjng/src/lib/services/crud/generic-crud.service.ts","../../../projects/tailjng/src/lib/services/http/error-handler-http.service.ts","../../../projects/tailjng/src/lib/services/static/icons.service.ts","../../../projects/tailjng/src/lib/services/static/theme.service.ts","../../../projects/tailjng/src/lib/services/alert/dialog-alert.service.ts","../../../projects/tailjng/src/lib/services/alert/toast-alert.service.ts","../../../projects/tailjng/src/lib/interfaces/crud/crud.interface.ts","../../../projects/tailjng/src/public-api.ts","../../../projects/tailjng/src/tailjng.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\nimport { TailjngConfig } from '../interfaces/config.interface';\r\n\r\n\r\nexport const TAILJNG_CONFIG = new InjectionToken<TailjngConfig>('TAILJNG_CONFIG');\r\n\r\n\r\n// providers: [\r\n// provideRouter(routes),\r\n// {\r\n// provide: TAILJNG_CONFIG,\r\n// useValue: {\r\n// urlBase: environment.urlBase,\r\n// socketUrl: environment.socketUrl,\r\n// }\r\n// }\r\n// ]","import { Injectable } from '@angular/core';\r\nimport { formatDistanceToNowStrict } from 'date-fns';\r\nimport { es } from 'date-fns/locale';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class JCalendarService {\r\n\r\n nameDaysAb: string[] = ['Dom', 'Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sáb'];\r\n nameDays: string[] = ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'];\r\n\r\n nameMontsAb: string[] = ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'];\r\n nameMonts: string[] = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'];\r\n\r\n\r\n /**\r\n * Get month from date\r\n * @param date The date to extract the month from, can be a Date object or a string in 'YYYY-MM-DD' format.\r\n * @returns The name of the month in Spanish.\r\n */\r\n getMonthFromDate(date: Date | string): string {\r\n const parsedDate = typeof date === 'string' ? new Date(date) : date;\r\n const monthIndex = parsedDate.getMonth();\r\n return this.nameMonts[monthIndex];\r\n }\r\n\r\n\r\n /**\r\n * Calculate the age of a person based on their birth date.\r\n * @param birth The birth date as a Date object or a string in 'YYYY-MM-DD' format.\r\n * @returns The age in years, or null if the birth date is invalid.\r\n */\r\n calculateAge(birth: Date | string): number | null {\r\n if (!birth) {\r\n return null;\r\n }\r\n const birthDate = typeof birth === 'string' ? new Date(birth) : birth;\r\n const today = new Date();\r\n let age = today.getFullYear() - birthDate.getFullYear();\r\n const m = today.getMonth() - birthDate.getMonth();\r\n if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {\r\n age--;\r\n }\r\n return age;\r\n }\r\n\r\n\r\n /**\r\n * Calculate the complete age of a person based on their birth date.\r\n * @param birth The birth date as a Date object or a string in 'YYYY-MM-DD' format.\r\n * @returns An object containing years, months, and days of age.\r\n */\r\n calculateAgeComplete(birth: Date | string): { years: number, months: number, days: number } {\r\n const birthDate = typeof birth === 'string' ? new Date(birth) : birth;\r\n const today = new Date();\r\n\r\n let years = today.getFullYear() - birthDate.getFullYear();\r\n let months = today.getMonth() - birthDate.getMonth();\r\n let days = today.getDate() - birthDate.getDate();\r\n\r\n if (days < 0) {\r\n months--;\r\n const previousMonth = new Date(today.getFullYear(), today.getMonth(), 0);\r\n days += previousMonth.getDate();\r\n }\r\n\r\n if (months < 0) {\r\n years--;\r\n months += 12;\r\n }\r\n\r\n return { years, months, days };\r\n }\r\n\r\n\r\n /**\r\n * Format a date string to a more readable format.\r\n * @param date The date string in 'YYYY-MM-DD' format.\r\n * @param month Optional parameter to add to the month name.\r\n * @returns A formatted date string in the format 'DD de MMMM del YYYY'.\r\n */\r\n formatearFechaString(date: string, month?: number) {\r\n const partesFecha = date.split('-');\r\n\r\n const año = partesFecha[0];\r\n const mes = this.nameMonts[parseInt(partesFecha[1], 10) - 1];\r\n const día = parseInt(partesFecha[2], 10);\r\n\r\n let mes_fin;\r\n if (month) {\r\n mes_fin = mes + month;\r\n } else {\r\n mes_fin = mes;\r\n }\r\n\r\n return `${día} de ${mes_fin} del ${año}`;\r\n }\r\n\r\n\r\n /**\r\n * Format a Date object to a string in the format 'DD de MMMM del YYYY'.\r\n * @param date The Date object to format.\r\n * @param month Optional parameter to add to the month name.\r\n * @returns A formatted date string.\r\n */\r\n formatearFechaDate(date: Date, month?: number) {\r\n \r\n const utc_date = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()));\r\n let new_date = utc_date;\r\n\r\n if (month !== undefined) {\r\n new_date = new Date(new_date.setUTCMonth(new_date.getUTCMonth() + month));\r\n }\r\n\r\n // Get the values of the new date in UTC to avoid local time zones\r\n const año = new_date.getUTCFullYear();\r\n const mes = this.nameMonts[new_date.getUTCMonth()];\r\n const día = new_date.getUTCDate();\r\n\r\n return `${día} de ${mes} del ${año}`;\r\n }\r\n\r\n\r\n /**\r\n * Parse a date string in the format \"dd de MMMM del yyyy\" to \"yyyy-MM-dd\".\r\n * @param fechaStr The date string to parse.\r\n * @returns The parsed date string in \"yyyy-MM-dd\" format or null if invalid.\r\n */\r\n parseFechaString(fechaStr: string): string | null {\r\n if (!fechaStr) return null;\r\n\r\n // Map Spanish month names to their numeric equivalents\r\n const meses: any = {\r\n 'ENERO': '01',\r\n 'FEBRERO': '02',\r\n 'MARZO': '03',\r\n 'ABRIL': '04',\r\n 'MAYO': '05',\r\n 'JUNIO': '06',\r\n 'JULIO': '07',\r\n 'AGOSTO': '08',\r\n 'SEPTIEMBRE': '09',\r\n 'OCTUBRE': '10',\r\n 'NOVIEMBRE': '11',\r\n 'DICIEMBRE': '12'\r\n };\r\n\r\n const regex = /^(\\d{1,2}) de (\\w+) del (\\d{4})$/i;\r\n const match = fechaStr.trim().match(regex);\r\n\r\n if (match) {\r\n const day = match[1].padStart(2, '0');\r\n const mesStr = match[2].toUpperCase();\r\n const month = meses[mesStr] || '01';\r\n const year = match[3];\r\n return `${year}-${month}-${day}`;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n\r\n /**\r\n * Format a date to \"MMM YY\" format.\r\n * @param date The date to format, can be a Date object.\r\n * @returns The formatted date string.\r\n */\r\n formatMonthYear(date: Date): string {\r\n const months = this.nameMontsAb.map(month => month.toUpperCase());\r\n const month = months[date.getMonth()];\r\n const year = date.getFullYear().toString().slice(-2);\r\n return `${month} ${year}`;\r\n }\r\n\r\n\r\n /**\r\n * Format a date to the Bogotá timezone (UTC-5).\r\n * @param date The date to format, can be a Date object.\r\n * @returns The formatted date string in 'yyyy-MM-ddTHH:mm:ss' format.\r\n */\r\n formatDateToBogota(date: Date): string {\r\n const bogotaOffset = -5 * 60;\r\n const localTime = date.getTime();\r\n const localOffset = date.getTimezoneOffset() * 60000;\r\n const utc = localTime + localOffset;\r\n const bogotaTime = utc + (bogotaOffset * 60000);\r\n const bogotaDate = new Date(bogotaTime);\r\n\r\n // Format the date to 'yyyy-MM-ddTHH:mm:ss'\r\n const year = bogotaDate.getFullYear();\r\n const month = String(bogotaDate.getMonth() + 1).padStart(2, '0');\r\n const day = String(bogotaDate.getDate()).padStart(2, '0');\r\n const hours = String(bogotaDate.getHours()).padStart(2, '0');\r\n const minutes = String(bogotaDate.getMinutes()).padStart(2, '0');\r\n const seconds = String(bogotaDate.getSeconds()).padStart(2, '0');\r\n\r\n return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`;\r\n }\r\n\r\n\r\n /**\r\n * Format a date to a relative time string.\r\n * This method uses date-fns to format the date relative to now.\r\n * @param date The date to format, can be a string in 'YYYY-MM-DD' format.\r\n * @returns A formatted relative time string.\r\n * @example \"hace 2 días\", \"hace 1 hora\", etc\r\n */\r\n formatRelativeDate(date: string): string {\r\n return formatDistanceToNowStrict(new Date(date), {\r\n locale: {\r\n ...es,\r\n formatDistance: (token, count, options) => {\r\n const formatDistanceLocale = {\r\n lessThanXSeconds: 'hace menos de {{count}} segundos',\r\n xSeconds: 'hace {{count}} segundos',\r\n halfAMinute: 'hace medio minuto',\r\n lessThanXMinutes: 'hace menos de {{count}} minutos',\r\n xMinutes: 'hace {{count}} minutos',\r\n aboutXHours: 'hace aproximadamente {{count}} horas',\r\n xHours: 'hace {{count}} horas',\r\n xDays: 'hace {{count}} días',\r\n aboutXWeeks: 'hace aproximadamente {{count}} semanas',\r\n xWeeks: 'hace {{count}} semanas',\r\n aboutXMonths: 'hace aproximadamente {{count}} meses',\r\n xMonths: 'hace {{count}} meses',\r\n aboutXYears: 'hace aproximadamente {{count}} años',\r\n xYears: 'hace {{count}} años',\r\n overXYears: 'hace más de {{count}} años',\r\n almostXYears: 'hace casi {{count}} años'\r\n };\r\n\r\n let result = formatDistanceLocale[token];\r\n\r\n if (typeof count === 'number') {\r\n result = result.replace('{{count}}', count.toString());\r\n\r\n // Singulars and plurals\r\n if (token === 'xHours' && count === 1) {\r\n result = result.replace('horas', 'hora');\r\n }\r\n if (token === 'xDays' && count === 1) {\r\n result = result.replace('días', 'día');\r\n }\r\n if (token === 'xWeeks' && count === 1) {\r\n result = result.replace('semanas', 'semana');\r\n }\r\n if (token === 'xMonths' && count === 1) {\r\n result = result.replace('meses', 'mes');\r\n }\r\n if (token === 'xYears' && count === 1) {\r\n result = result.replace('años', 'año');\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n }\r\n });\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { CurrencyPipe } from '@angular/common';\r\nimport { JCalendarService } from '../transformer/calendar.service';\r\nimport { TableColumn } from '../../interfaces/crud/crud.interface';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class JConverterCrudService {\r\n\r\n constructor(\r\n private readonly currencyPipe: CurrencyPipe,\r\n private readonly calendarService: JCalendarService,\r\n ) { }\r\n\r\n /**\r\n * Get the correct sort key from the sortColumn object or string.\r\n * @param sortColumn The column to sort by, can be a string or an object with a 'col' property.\r\n * @returns The sort key as a string.\r\n */\r\n getSortKey(sortColumn: any): string {\r\n if (typeof sortColumn === 'object' && sortColumn !== null) {\r\n return sortColumn.col;\r\n }\r\n\r\n return sortColumn;\r\n }\r\n\r\n\r\n /**\r\n * Converter object to an array of objects with key and value for form initialization.\r\n * @param formGroup The FormGroup to convert.\r\n * @returns An array of objects with key and value for form initialization.\r\n */\r\n initializeFormControls(formGroup: FormGroup): { [key: string]: AbstractControl | null } {\r\n const formControls: { [key: string]: AbstractControl | null } = {};\r\n\r\n Object.keys(formGroup.controls).forEach(key => {\r\n formControls[`${key}_control`] = formGroup.get(key);\r\n });\r\n\r\n return formControls;\r\n }\r\n\r\n\r\n /**\r\n * Formats data based on the column type.\r\n * @param value The value to format.\r\n * @param column The column definition.\r\n * @return Formatted value based on the column type\r\n */\r\n formatData(value: any, column: TableColumn<any>): any {\r\n\r\n if (column.isdollar && value !== null) {\r\n const transformedValue = this.currencyPipe.transform(value, 'USD', 'symbol', '1.2-2');\r\n return transformedValue ? transformedValue.replace('US', '') : null;\r\n }\r\n\r\n if (column.isCurrency && value !== null) {\r\n return this.currencyPipe.transform(value, 'USD', 'symbol', '1.2-2');\r\n }\r\n\r\n if (column.isDate && value !== null) {\r\n return new Date(value).toLocaleDateString();\r\n }\r\n\r\n if (column.isDateText && value !== null) {\r\n return this.calendarService.formatearFechaString(`${value}`);\r\n }\r\n\r\n if (column.isDateTime && value !== null) {\r\n return new Date(value).toLocaleString();\r\n }\r\n\r\n if (column.isDateTimeText && value !== null) {\r\n return new Date(value).toString();\r\n }\r\n\r\n if (column.isRelativeTime && value !== null) {\r\n return this.calendarService.formatRelativeDate(value);\r\n }\r\n\r\n if (column.isFirstWord && value !== null) {\r\n return value.split(' ')[0];\r\n }\r\n\r\n return value;\r\n }\r\n\r\n\r\n /**\r\n * This method converts values to appropriate types based on the column definition.\r\n * It handles various formats such as currency, date, and text.\r\n * @param value The value to parse.\r\n * @param column The column definition.\r\n * @returns The parsed value or null if invalid.\r\n */\r\n parseData(value: any, column: TableColumn<any>): any {\r\n if (value === null || value === undefined || value === 'S/N') {\r\n return null;\r\n }\r\n\r\n let cleaned = value;\r\n\r\n // If it's text, trim whitespace\r\n if (typeof cleaned === 'string') {\r\n cleaned = cleaned.trim();\r\n }\r\n\r\n // isdollar → remove symbol and parse to number\r\n if (column.isdollar && typeof cleaned === 'string') {\r\n cleaned = cleaned.replace(/[^\\d,.-]/g, '').replace(',', '.');\r\n return cleaned ? parseFloat(cleaned) : null;\r\n }\r\n\r\n // isCurrency → remove symbol and parse to number\r\n if (column.isCurrency && typeof cleaned === 'string') {\r\n cleaned = cleaned.replace(/[^\\d,.-]/g, '').replace(',', '.');\r\n return cleaned ? parseFloat(cleaned) : null;\r\n }\r\n\r\n // isDateText → parse text from date to ISO format (yyyy-MM-dd)\r\n if (column.isDateText && typeof cleaned === 'string') {\r\n // Use your reverse calendarService if you have one\r\n const fecha = this.calendarService.parseFechaString(cleaned);\r\n return fecha ?? cleaned;\r\n }\r\n\r\n // isDate → parse text to Date or ISO string\r\n if (column.isDate && typeof cleaned === 'string') {\r\n const fecha = new Date(cleaned);\r\n return isNaN(fecha.getTime()) ? cleaned : fecha.toISOString().substring(0, 10);\r\n }\r\n\r\n // isDateTime → parse text to DateTime\r\n if (column.isDateTime && typeof cleaned === 'string') {\r\n const fecha = new Date(cleaned);\r\n return isNaN(fecha.getTime()) ? cleaned : fecha.toISOString();\r\n }\r\n\r\n // isDateTimeText → parse text to DateTime\r\n if (column.isDateTimeText && typeof cleaned === 'string') {\r\n const fecha = new Date(cleaned);\r\n return isNaN(fecha.getTime()) ? cleaned : fecha.toISOString();\r\n }\r\n\r\n // isRelativeTime → impossible to reverse automatically, return text\r\n if (column.isRelativeTime) {\r\n return cleaned;\r\n }\r\n\r\n // isFirstWord → return full text, as it's unclear which part to remove\r\n if (column.isFirstWord) {\r\n return cleaned;\r\n }\r\n\r\n return cleaned;\r\n }\r\n}","import { HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Params } from '@angular/router';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class JParamsHttpService {\r\n\r\n /**\r\n * Transform Params to HttpParams\r\n * @param params \r\n * @returns \r\n */\r\n resParams(params: Params): HttpParams {\r\n\r\n // Construct HttpParams\r\n let httpParams = new HttpParams();\r\n\r\n if (params) {\r\n Object.keys(params).forEach(key => {\r\n const value = params[key];\r\n\r\n // If the value is an object (e.g., filter: { id_status: [1, 2] })\r\n if (typeof value === 'object' && value !== null) {\r\n Object.keys(value).forEach(subKey => {\r\n const subValue = value[subKey];\r\n\r\n // If the subValue is an array (e.g., id_status: [1, 2])\r\n if (Array.isArray(subValue)) {\r\n subValue.forEach(v => {\r\n httpParams = httpParams.append(`${key}[${subKey}]`, v);\r\n });\r\n } else {\r\n // If it's a unique value\r\n httpParams = httpParams.append(`${key}[${subKey}]`, subValue);\r\n }\r\n });\r\n } else {\r\n // If it's a flat value (e.g., id_status: 1)\r\n httpParams = httpParams.append(key, value);\r\n }\r\n });\r\n }\r\n return httpParams;\r\n }\r\n\r\n}","import { Inject, Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Params } from '@angular/router';\r\nimport { map, Observable } from 'rxjs';\r\nimport { JConverterCrudService } from './converter-crud.service';\r\nimport { JParamsHttpService } from '../http/params-http.service';\r\nimport { TAILJNG_CONFIG } from '../../config/tailjng-config.token';\r\nimport { TailjngConfig } from '../../interfaces/config.interface';\r\nimport { ApiResponse } from '../../interfaces/crud/api-response';\r\nimport { EnableBoolean, QueryParams } from '../../interfaces/crud/crud.interface';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class JGenericCrudService {\r\n\r\n constructor(\r\n @Inject(TAILJNG_CONFIG) private readonly config: TailjngConfig,\r\n private readonly http: HttpClient,\r\n private readonly paramsHttpService: JParamsHttpService,\r\n private readonly converterCrudService: JConverterCrudService,\r\n ) { }\r\n\r\n /**\r\n * Method to get all records from an endpoint.\r\n * @param endpoint Distinctive of the endpoint ('role', 'status', etc.)\r\n * @param params Parameters of the request.\r\n * @returns Observable with the API response.\r\n */\r\n getAll<T>(endpoint: string, params?: Params): Observable<ApiResponse<T>> {\r\n const url = `${this.config.urlBase}/${endpoint}`;\r\n let httpParams;\r\n if (params) httpParams = this.paramsHttpService.resParams(params);\r\n return this.http.get<ApiResponse<T>>(url, { params: httpParams });\r\n }\r\n\r\n\r\n /**\r\n * Method to get a record from an endpoint.\r\n * @param endpoint Distinctive of the endpoint ('role', 'status', etc.)\r\n * @param id Identifier of the record.\r\n * @returns Observable with the API response.\r\n */\r\n getId<T>(endpoint: string, id: number): Observable<T> {\r\n const url = `${this.config.urlBase}/${endpoint}`;\r\n return this.http.get<ApiResponse<{ [key: string]: T }>>(`${url}/${id}`).pipe(\r\n map(response => response.data[endpoint])\r\n );\r\n }\r\n\r\n\r\n /**\r\n * Method to create a record in an endpoint.\r\n * @param endpoint Distinctive of the endpoint ('role', 'status', etc.)\r\n * @param data Data of the record to add.\r\n * @returns Observable with the API response.\r\n */\r\n create<T>(endpoint: string, data: T): Observable<ApiResponse<T>> {\r\n const url = `${this.config.urlBase}/${endpoint}`;\r\n return this.http.post<ApiResponse<T>>(url, data);\r\n }\r\n\r\n\r\n /**\r\n * MMethod to update a record in an endpoint.\r\n * @param endpoint Distinctive of the endpoint ('role', 'status', etc.)\r\n * @param id Identifier of the record.\r\n * @param data Data of the record to update.\r\n * @returns Observable with the API response.\r\n */\r\n update<T>(endpoint: string, id: number, data: T): Observable<ApiResponse<T>> {\r\n const url = `${this.config.urlBase}/${endpoint}`;\r\n return this.http.put<ApiResponse<T>>(`${url}/${id}`, data);\r\n }\r\n\r\n\r\n /**\r\n * MMethod to delete a record from an endpoint.\r\n * @param endpoint Distinctive of the endpoint ('role', 'status', etc.)\r\n * @param id Identifier of the record.\r\n * @returns Observable with the API response.\r\n */\r\n delete<T>(endpoint: string, id: number): Observable<ApiResponse<T>> {\r\n const url = `${this.config.urlBase}/${endpoint}`;\r\n return this.http.delete<ApiResponse<T>>(`${url}/${id}`);\r\n }\r\n\r\n\r\n /**\r\n * Method to update the status of a record in an endpoint.\r\n * @param endpoint Distinctive of the endpoint ('role', 'status', etc.)\r\n * @param id Identifier of the record.\r\n * @param data Data of a boolean record to update.\r\n * @returns Observable with the API response.\r\n */\r\n enable<T>(endpoint: string, id: number, data: EnableBoolean<T>): Observable<ApiResponse<T>> {\r\n const url = `${this.config.urlBase}/${endpoint}`;\r\n return this.http.put<ApiResponse<T>>(`${url}/enable/${id}`, data);\r\n }\r\n\r\n\r\n /**\r\n * MMethod to create multiple records in an endpoint.\r\n * @param endpoint Distinctive of the endpoint ('role', 'status', etc.)\r\n * @param data Data of multiple records to add.\r\n * @returns Observable with the API response.\r\n */\r\n createMultiple<T>(endpoint: string, data: T[]): Observable<ApiResponse<T[]>> {\r\n const url = `${this.config.urlBase}/${endpoint}/bulk`;\r\n return this.http.post<ApiResponse<T[]>>(url, data);\r\n }\r\n\r\n\r\n /**\r\n * Method to get the query parameters for a table.\r\n * @param page Current page number.\r\n * @param limit NNumber of records per page.\r\n * @param sort Object containing the column and the sorting direction.\r\n * @param filters Filters applied to the query.\r\n * @param defaultFilters Default filters applied to the query.\r\n * @param searchQuery Search string.\r\n * @param columns Columns to search.\r\n * @returns\r\n */\r\n params({ page, limit, sort, filters, defaultFilters, searchQuery, columns }: QueryParams): Params {\r\n\r\n const params: Params = {}\r\n\r\n if (page) params['page'] = page.toString();\r\n if (limit) params['limit'] = limit.toString();\r\n\r\n // Apply default filters if provided\r\n Object.keys(defaultFilters ?? {}).forEach((key) => {\r\n if (!filters.hasOwnProperty(key)) {\r\n params[`filter[${key}]`] = defaultFilters![key];\r\n }\r\n });\r\n\r\n // If sort is provided, get the sort key and direction\r\n if (sort?.column && sort?.direction !== 'none') {\r\n const sortKey = this.converterCrudService.getSortKey(sort?.column);\r\n params['sortBy'] = sortKey;\r\n params['sortOrder'] = sort?.direction?.toUpperCase();\r\n }\r\n\r\n // Apply search if provided\r\n if (searchQuery && searchQuery.trim() !== '') {\r\n params['search'] = searchQuery;\r\n params['searchFields'] = columns?.map(col => col);\r\n }\r\n\r\n // Apply filters if provided\r\n if (Object.keys(filters).length > 0) {\r\n params['filter'] = filters;\r\n }\r\n\r\n return params;\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ErrorHandlerHttpService {\r\n\r\n /**\r\n * Map HTTP status codes to user-friendly messages and alert types.\r\n * This mapping helps in providing consistent error messages across the application.\r\n */\r\n private readonly errorMappings: { [key: number]: { title: string, message: string, type: 'error' | 'info', persistent: boolean } } = {\r\n 400: { type: 'info', title: 'Solicitud incorrecta', message: 'Los datos enviados no son válidos. Verifique e intente de nuevo.', persistent: false },\r\n 401: { type: 'info', title: 'No autorizado', message: 'Debe iniciar sesión para acceder a esta función.', persistent: true },\r\n 403: { type: 'error', title: 'Acceso denegado', message: 'No tiene permisos para realizar esta acción.', persistent: true },\r\n 404: { type: 'info', title: 'No encontrado', message: 'El recurso solicitado no existe o fue eliminado.', persistent: false },\r\n 409: { type: 'info', title: 'Conflicto', message: 'Conflicto en la solicitud. Verifique los datos ingresados.', persistent: false },\r\n 422: { type: 'info', title: 'Datos no procesables', message: 'Los datos son válidos, pero no pueden ser procesados en este momento.', persistent: false },\r\n 429: { type: 'info', title: 'Demasiadas solicitudes', message: 'Ha realizado demasiadas solicitudes. Intente más tarde.', persistent: true },\r\n 500: { type: 'error', title: 'Error del servidor', message: 'Ocurrió un error inesperado. Intente más tarde.', persistent: true },\r\n 503: { type: 'error', title: 'Servicio no disponible', message: 'El servidor está en mantenimiento o sobrecargado.', persistent: true }\r\n };\r\n\r\n\r\n /**\r\n * Handle HTTP errors and return a structured message with alert type.\r\n * @param error The error object returned from the HTTP request.\r\n * @returns A structured error message.\r\n */\r\n handleHttpError(error: any) {\r\n console.error('HTTP Error:', error);\r\n\r\n // If no error is defined, return a generic message\r\n if (!error) {\r\n return {\r\n type: 'error',\r\n title: 'Error desconocido',\r\n message: 'Ocurrió un error inesperado. Intente de nuevo más tarde.',\r\n persistent: true\r\n };\r\n }\r\n\r\n const status = error?.status || 0;\r\n const backendMessage = error?.error?.msg || error?.message;\r\n\r\n const errorInfo = this.errorMappings[status] || {\r\n title: 'Error desconocido',\r\n message: 'Ocurrió un error inesperado. Intente de nuevo más tarde.',\r\n type: 'error',\r\n persistent: true\r\n };\r\n\r\n return {\r\n type: errorInfo.type,\r\n title: errorInfo.title,\r\n message: backendMessage || errorInfo.message,\r\n persistent: errorInfo.persistent\r\n };\r\n }\r\n\r\n}","import { Injectable } from '@angular/core';\r\nimport { Check, ChevronDown, CircleCheck, CircleHelp, CircleX, Copy, Eye, ImageOff, Info, Loader2, Minimize2, Moon, RefreshCcw, RotateCcw, RotateCw, Scan, Search, SquareDashedMousePointer, Sun, TriangleAlert, Upload, X, ZoomIn, ZoomOut } from 'lucide-angular';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class JIconsService {\r\n\r\n public icons = {\r\n info: Info,\r\n success: CircleCheck,\r\n error: CircleX,\r\n warning: TriangleAlert,\r\n question: CircleHelp,\r\n close: X,\r\n check: Check,\r\n zoomIn: ZoomIn,\r\n zoomOut: ZoomOut,\r\n rotateRight: RotateCw,\r\n rotateLeft: RotateCcw,\r\n reset: RefreshCcw,\r\n fullscreen: Scan,\r\n exitFullscreen: Minimize2,\r\n imageOff: ImageOff,\r\n upload: Upload,\r\n view: Eye,\r\n chevronDown: ChevronDown,\r\n squareDashedMousePointer: SquareDashedMousePointer,\r\n search: Search,\r\n copy: Copy,\r\n sun: Sun,\r\n moon: Moon,\r\n loading: Loader2,\r\n }\r\n\r\n constructor() { }\r\n}\r\n","import { Injectable, signal } from '@angular/core';\r\n\r\nexport type ThemeMode = 'light' | 'dark';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class JThemeService {\r\n\r\n private readonly _theme = signal<ThemeMode>('light');\r\n readonly themeSignal = this._theme.asReadonly();\r\n\r\n constructor() {\r\n this.initializeTheme();\r\n this.listenToExternalChanges();\r\n }\r\n\r\n private initializeTheme(): void {\r\n const savedTheme = localStorage.getItem('theme') as ThemeMode;\r\n\r\n if (savedTheme) {\r\n this._theme.set(savedTheme);\r\n } else if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\r\n this._theme.set('dark');\r\n }\r\n\r\n this.applyTheme();\r\n }\r\n\r\n private listenToExternalChanges(): void {\r\n window.addEventListener('storage', (event) => {\r\n if (event.key === 'theme' && event.newValue) {\r\n const newTheme = event.newValue as ThemeMode;\r\n this._theme.set(newTheme);\r\n this.applyTheme();\r\n }\r\n });\r\n }\r\n\r\n private applyTheme(): void {\r\n const current = this._theme();\r\n document.documentElement.classList.toggle('dark', current === 'dark');\r\n }\r\n\r\n toggleTheme(): void {\r\n const newTheme = this._theme() === 'light' ? 'dark' : 'light';\r\n localStorage.setItem('theme', newTheme);\r\n this._theme.set(newTheme);\r\n this.applyTheme();\r\n }\r\n\r\n setTheme(theme: ThemeMode): void {\r\n localStorage.setItem('theme', theme);\r\n this._theme.set(theme);\r\n this.applyTheme();\r\n }\r\n\r\n getThemeMode(): ThemeMode {\r\n return this._theme();\r\n }\r\n}\r\n","import { Injectable, signal, computed, WritableSignal } from \"@angular/core\";\r\nimport { firstValueFrom, isObservable, Observable } from \"rxjs\";\r\nimport { AlertDialogProps, Dialog } from \"../../interfaces/alert/dialog-alert.interface\";\r\n\r\ntype ActionCallback = () => void | Promise<void> | Observable<any>;\r\n\r\n@Injectable({\r\n providedIn: \"root\",\r\n})\r\nexport class JAlertDialogService {\r\n private readonly isOpenSignal: WritableSignal<boolean> = signal(false);\r\n private readonly configSignal: WritableSignal<AlertDialogProps | null> = signal(null);\r\n\r\n // Estados de carga para los botones\r\n private readonly isLoadingConfirm: WritableSignal<boolean> = signal(false);\r\n private readonly isLoadingCancel: WritableSignal<boolean> = signal(false);\r\n private readonly isLoadingRetry: WritableSignal<boolean> = signal(false);\r\n\r\n\r\n // Callbacks\r\n private onConfirmCallback?: ActionCallback;\r\n private onCancelCallback?: ActionCallback;\r\n private onRetryCallback?: ActionCallback;\r\n\r\n isOpen = computed(() => this.isOpenSignal());\r\n config = computed(() => this.configSignal());\r\n\r\n isConfirmLoading = computed(() => this.isLoadingConfirm());\r\n isCancelLoading = computed(() => this.isLoadingCancel());\r\n isRetryLoading = computed(() => this.isLoadingRetry());\r\n\r\n // Add a dialogs computed property that returns an array with a single dialog when open\r\n dialogs = computed<Dialog[]>(() => {\r\n if (!this.isOpenSignal()) return [];\r\n\r\n return [{\r\n config: this.configSignal()!,\r\n isConfirmLoading: this.isLoadingConfirm(),\r\n isCancelLoading: this.isLoadingCancel(),\r\n isRetryLoading: this.isLoadingRetry()\r\n }];\r\n });\r\n\r\n getConfig() {\r\n return this.configSignal();\r\n }\r\n\r\n AlertDialog(config: AlertDialogProps) {\r\n this.onConfirmCallback = \"onConfirm\" in config ? config.onConfirm : undefined;\r\n this.onCancelCallback = \"onCancel\" in config ? config.onCancel : undefined;\r\n this.onRetryCallback = \"onRetry\" in config ? config.onRetry : undefined;\r\n\r\n // Reset loading states\r\n this.isLoadingConfirm.set(false);\r\n this.isLoadingCancel.set(false);\r\n this.isLoadingRetry.set(false);\r\n\r\n this.configSignal.set(config);\r\n this.isOpenSignal.set(true);\r\n }\r\n\r\n closeDialog() {\r\n this.isOpenSignal.set(false);\r\n this.configSignal.set(null);\r\n }\r\n\r\n async executeAction(action: \"confirm\" | \"cancel\" | \"retry\") {\r\n let callback: ActionCallback | undefined;\r\n let loadingSignal: WritableSignal<boolean>;\r\n \r\n switch (action) {\r\n case \"confirm\":\r\n callback = this.onConfirmCallback;\r\n loadingSignal = this.isLoadingConfirm;\r\n break;\r\n case \"cancel\":\r\n callback = this.onCancelCallback;\r\n loadingSignal = this.isLoadingCancel;\r\n break;\r\n case \"retry\":\r\n callback = this.onRetryCallback;\r\n loadingSignal = this.isLoadingRetry;\r\n break;\r\n }\r\n \r\n if (!callback) {\r\n this.closeDialog();\r\n return;\r\n }\r\n \r\n loadingSignal.set(true);\r\n \r\n try {\r\n const result = callback();\r\n \r\n // Soporte para Observable\r\n if (isObservable(result)) {\r\n await firstValueFrom(result);\r\n }\r\n \r\n // Soporte para Promise\r\n if (result instanceof Promise) {\r\n await result;\r\n }\r\n \r\n // Si es void, no hacemos nada extra\r\n } catch (error) {\r\n console.error(`Error en la acción ${action}:`, error);\r\n } finally {\r\n loadingSignal.set(false);\r\n this.closeDialog();\r\n }\r\n }\r\n \r\n}","import { Injectable, signal, computed, WritableSignal } from \"@angular/core\";\r\nimport { AlertToastProps, Toast } from \"../../interfaces/alert/toast-alert.interface\";\r\n\r\n@Injectable({\r\n providedIn: \"root\",\r\n})\r\nexport class JAlertToastService {\r\n private readonly toastsSignal: WritableSignal<Toast[]> = signal([]);\r\n private readonly autoCloseTimers: Map<string, any> = new Map();\r\n\r\n // Default auto-close delay in milliseconds\r\n private readonly DEFAULT_AUTO_CLOSE_DELAY = 5000;\r\n\r\n // Default action button text\r\n private readonly DEFAULT_ACTION_BUTTON_TEXT = \"Action\";\r\n\r\n // For compatibility with existing code\r\n private readonly isOpenSignal: WritableSignal<boolean> = signal(false);\r\n private readonly configSignal: WritableSignal<AlertToastProps | null> = signal(null);\r\n private readonly isLoadingAction: WritableSignal<boolean> = signal(false);\r\n private readonly isLoadingCancel: WritableSignal<boolean> = signal(false);\r\n\r\n // Computed values for all toasts\r\n toasts = computed(() => this.toastsSignal());\r\n\r\n // For backward compatibility with existing code\r\n isOpen = computed(() => this.isOpenSignal());\r\n config = computed(() => this.configSignal());\r\n isActionLoading = computed(() => this.isLoadingAction());\r\n isCancelLoading = computed(() => this.isLoadingCancel());\r\n\r\n getConfig() {\r\n return this.configSignal();\r\n }\r\n\r\n AlertToast(config: AlertToastProps) {\r\n const toastId = crypto.randomUUID();\r\n\r\n // Store callbacks for this toast\r\n const onActionCallback = \"onAction\" in config ? config.onAction : undefined;\r\n const onCancelCallback = \"onCancel\" in config ? config.onCancel : undefined;\r\n\r\n // Get action button text or use default\r\n const actionNameButton = config.actionButtonText ?? this.DEFAULT_ACTION_BUTTON_TEXT;\r\n\r\n const toast: Toast = {\r\n id: toastId,\r\n config,\r\n isActionLoading: false,\r\n isCancelLoading: false,\r\n onActionCallback,\r\n onCancelCallback,\r\n actionNameButton, // Add the button text\r\n createdAt: Date.now()\r\n };\r\n\r\n // Add the toast to our list\r\n this.toastsSignal.update(toasts => [...toasts, toast]);\r\n\r\n // Check if this toast should auto-close\r\n // If autoClose is explicitly set to true OR \r\n // if it's a success toast and autoClose is not explicitly set to false\r\n const shouldAutoClose = config.autoClose === true ||\r\n (config.type === 'success' && config.autoClose !== false);\r\n\r\n if (shouldAutoClose) {\r\n // Use the provided delay or the default\r\n const delay = config.autoCloseDelay ?? this.DEFAULT_AUTO_CLOSE_DELAY;\r\n\r\n const timerId = setTimeout(() => {\r\n this.closeToastById(toastId);\r\n this.autoCloseTimers.delete(toastId);\r\n }, delay);\r\n\r\n this.autoCloseTimers.set(toastId, timerId);\r\n }\r\n\r\n return toastId;\r\n }\r\n\r\n closeToastById(toastId: string) {\r\n // Clear any auto-close timer\r\n if (this.autoCloseTimers.has(toastId)) {\r\n clearTimeout(this.autoCloseTimers.get(toastId));\r\n this.autoCloseTimers.delete(toastId);\r\n }\r\n\r\n this.toastsSignal.update(toasts =>\r\n toasts.filter(toast => toast.id !== toastId)\r\n );\r\n }\r\n\r\n closeAllToasts() {\r\n // Clear all timers\r\n this.autoCloseTimers.forEach(timerId => clearTimeout(timerId));\r\n this.autoCloseTimers.clear();\r\n\r\n this.toastsSignal.set([]);\r\n }\r\n\r\n async executeToastAction(toastId: string, action: \"action\" | \"cancel\") {\r\n const toast = this.toastsSignal().find(t => t.id === toastId);\r\n if (!toast) return;\r\n\r\n let callback: (() => Promise<void> | void) | undefined;\r\n let loadingProperty: 'isActionLoading' | 'isCancelLoading';\r\n\r\n switch (action) {\r\n case \"action\":\r\n callback = toast.onActionCallback;\r\n loadingProperty = 'isActionLoading';\r\n break;\r\n case \"cancel\":\r\n callback = toast.onCancelCallback;\r\n loadingProperty = 'isCancelLoading';\r\n break;\r\n }\r\n\r\n if (callback) {\r\n // Update loading state\r\n this.toastsSignal.update(toasts =>\r\n toasts.map(t => t.id === toastId ? { ...t, [loadingProperty]: true } : t)\r\n );\r\n\r\n try {\r\n await callback();\r\n } catch (error) {\r\n console.error(`Error en la acción ${action}:`, error);\r\n } finally {\r\n // Update loading state back to false (in case the toast hasn't been closed)\r\n this.toastsSignal.update(toasts => {\r\n const updatedToasts = toasts.map(t =>\r\n t.id === toastId ? { ...t, [loadingProperty]: false } : t\r\n );\r\n return updatedToasts;\r\n });\r\n\r\n this.closeToastById(toastId);\r\n }\r\n } else {\r\n this.closeToastById(toastId);\r\n }\r\n }\r\n\r\n // For backward compatibility with existing code\r\n closeToast() {\r\n this.closeAllToasts();\r\n this.isOpenSignal.set(false);\r\n this.configSignal.set(null);\r\n }\r\n\r\n // For backward compatibility with existing code\r\n async executeAction(action: \"action\" | \"cancel\") {\r\n let callback: (() => Promise<void> | void) | undefined;\r\n let loadingSignal: WritableSignal<boolean>;\r\n\r\n switch (action) {\r\n case \"action\":\r\n callback = \"onAction\" in (this.configSignal() || {})\r\n ? (this.configSignal() as any).onAction\r\n : undefined;\r\n loadingSignal = this.isLoadingAction;\r\n break;\r\n case \"cancel\":\r\n callback = \"onCancel\" in (this.configSignal() || {})\r\n ? (this.configSignal() as any).onCancel\r\n : undefined;\r\n loadingSignal = this.isLoadingCancel;\r\n break;\r\n }\r\n\r\n if (callback) {\r\n loadingSignal.set(true);\r\n try {\r\n await callback();\r\n } catch (error) {\r\n console.error(`Error en la acción ${action}:`, error);\r\n } finally {\r\n loadingSignal.set(false);\r\n this.closeToast();\r\n }\r\n } else {\r\n this.closeToast();\r\n }\r\n }\r\n}","\r\n// ======================================================\r\n// Table Column Interface\r\n// This interface defines the structure of a table column in a CRUD application.\r\n// ======================================================\r\n\r\ntype KeyPath<T> = T extends object\r\n ? {\r\n [K in keyof T]: K extends string | number\r\n ? `${K}` | `${K}.${KeyPath<T[K]>}`\r\n : never;\r\n }[keyof T]\r\n : never;\r\n\r\ntype ExtraColumnKeys = 'total' | 'expand' | 'extra';\r\ntype ExtendedKeyPath<T> = KeyPath<T> | ExtraColumnKeys;\r\n\r\nexport interface TableColumn<T> {\r\n key: ExtendedKeyPath<T>;\r\n label: string; \r\n visible?: boolean;\r\n sortable?: boolean;\r\n isSearchable?: boolean;\r\n isDisabled?: boolean;\r\n isDecorator?: boolean;\r\n colorDecorator?: (row: T) => 'primary' | 'success' | 'error' | 'warning' | 'info' | undefined;\r\n isDecoratorArray?: boolean;\r\n isCurrency?: boolean;\r\n isdollar?: boolean;\r\n isDate?: boolean;\r\n isDateText?: boolean;\r\n isDateTime?: boolean;\r\n isRelativeTime?: boolean;\r\n isDecoratorDateTime?: boolean;\r\n isDateTimeText?: boolean;\r\n isFirstWord?: boolean;\r\n isLink?: boolean;\r\n styles?: { [key: string]: string };\r\n valueGetter?: (row: T) => any;\r\n template?: (row: T) => string;\r\n expandTemplate?: (row: T) => string;\r\n extraSearchFields?: (keyof T | string)[];\r\n hidden?: boolean;\r\n}\r\n\r\nexport type SortDirection = 'none' | 'asc' | 'desc';\r\n\r\n\r\nexport type LoadingState = 'idle' | 'loading' | 'success' | 'error';\r\n\r\nexport interface LoadingStates {\r\n initialLoad: LoadingState;\r\n search: LoadingState;\r\n itemsPerPage: LoadingState;\r\n pagination: LoadingState;\r\n sort: LoadingState;\r\n checked: LoadingState;\r\n action: LoadingState;\r\n aditionalButtons: { [buttonType: string]: LoadingState };\r\n}\r\n\r\ntype DefaultTypeOptionTable = 'edit' | 'delete' | 'disabled' | 'custom' | 'editRow';\r\n\r\ntype CommonOptionTableProps = {\r\n type?: `${DefaultTypeOptionTable}` | (string & {});\r\n icon?: ((data?: any) => any) | any;\r\n clicked?: (data: any) => void;\r\n text?: ((data?: any) => string) | string;\r\n tooltip?: ((data?: any) => string) | string;\r\n disabled?: ((data?: any) => boolean) | boolean;\r\n isVisible?: ((data?: any) => boolean) | boolean;\r\n tooltipPosition?: 'top' | 'right' | 'bottom' | 'left';\r\n ngClass?: ((data?: any) => any) | any;\r\n classes?: string;\r\n searchListUpload?: {\r\n [endpoint: string]: {\r\n keyReturn: string,\r\n keyColumnSearch: string,\r\n keyAlternate?: string,\r\n optional?: boolean;\r\n defaultFilters?: { [key: string]: string | number | (string | number)[] | undefined };\r\n };\r\n };\r\n};\r\n\r\n\r\n// ===================================================\r\n\r\ntype OptionTableWithChangeIcon = CommonOptionTableProps & {\r\n isChangeIcon: boolean | (() => boolean);\r\n iconChange: any;\r\n};\r\n\r\ntype OptionTableWithoutChangeIcon = CommonOptionTableProps & {\r\n isChangeIcon?: undefined;\r\n iconChange?: any;\r\n};\r\n\r\nexport type OptionsTable = OptionTableWithChangeIcon | OptionTableWithoutChangeIcon;\r\n\r\n\r\n// ===================================================\r\n\r\nexport interface QueryParams {\r\n page?: number;\r\n limit?: number;\r\n\r\n sort?: { column?: string | null; direction?: string };\r\n\r\n filters?: any;\r\n defaultFilters?: { [key: string]: any };\r\n\r\n searchQuery?: string;\r\n columns?: string[]\r\n}\r\n\r\nexport interface EnableBoolean<T> {\r\n key: keyof T;\r\n value: any;\r\n values: any[];\r\n keyDate?: keyof T;\r\n isDateNullable?: boolean;\r\n}","/*\r\n * Public API Surface of tailjng\r\n */\r\n\r\n// ========================================\r\n// Config\r\n// ========================================\r\nexport * from './lib/config/tailjng-config.token';\r\n\r\n\r\n// ========================================\r\n// Services\r\n// ========================================\r\n\r\n// Crud\r\nexport * from './lib/services/crud/converter-crud.service';\r\nexport * from './lib/services/crud/generic-crud.service';\r\n\r\n// Http\r\nexport * from './lib/services/http/params-http.service';\r\nexport * from './lib/services/http/error-handler-http.service';\r\n\r\n// Transformer\r\nexport * from './lib/services/transformer/calendar.service';\r\n\r\n// Static\r\nexport * from './lib/services/static/icons.service';\r\nexport * from './lib/services/static/theme.service';\r\n\r\n// Alert\r\nexport * from './lib/services/alert/dialog-alert.service';\r\nexport * from './lib/services/alert/toast-alert.service';\r\n\r\n\r\n// Interface\r\nexport * from './lib/interfaces/crud/crud.interface';\r\nexport * from './lib/interfaces/theme/theme-generator.interface';\r\n\r\n// npm version patch\r\n// npm run build\r\n\r\n\r\n// cd dist/tailjng\r\n// npm publish --access public\r\n\r\n// npx tailjng add [component]","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2.JCalendarService","i1","i2.JParamsHttpService","i3.JConverterCrudService"],"mappings":"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"}
1
+ {"version":3,"file":"tailjng.mjs","sources":["../../../projects/tailjng/src/lib/config/tailjng-config.token.ts","../../../projects/tailjng/src/lib/services/transformer/calendar.service.ts","../../../projects/tailjng/src/lib/services/crud/converter-crud.service.ts","../../../projects/tailjng/src/lib/services/http/params-http.service.ts","../../../projects/tailjng/src/lib/services/crud/generic-crud.service.ts","../../../projects/tailjng/src/lib/services/http/error-handler-http.service.ts","../../../projects/tailjng/src/lib/services/static/icons.service.ts","../../../projects/tailjng/src/lib/services/static/theme.service.ts","../../../projects/tailjng/src/lib/services/alert/dialog-alert.service.ts","../../../projects/tailjng/src/lib/services/alert/toast-alert.service.ts","../../../projects/tailjng/src/lib/interfaces/crud/crud.interface.ts","../../../projects/tailjng/src/public-api.ts","../../../projects/tailjng/src/tailjng.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\nimport { TailjngConfig } from '../interfaces/config.interface';\r\n\r\n\r\nexport const TAILJNG_CONFIG = new InjectionToken<TailjngConfig>('TAILJNG_CONFIG');\r\n\r\n\r\n// providers: [\r\n// provideRouter(routes),\r\n// {\r\n// provide: TAILJNG_CONFIG,\r\n// useValue: {\r\n// urlBase: environment.urlBase,\r\n// socketUrl: environment.socketUrl,\r\n// }\r\n// }\r\n// ]","import { Injectable } from '@angular/core';\r\nimport { formatDistanceToNowStrict } from 'date-fns';\r\nimport { es } from 'date-fns/locale';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class JCalendarService {\r\n\r\n nameDaysAb: string[] = ['Dom', 'Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sáb'];\r\n nameDays: string[] = ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'];\r\n\r\n nameMontsAb: string[] = ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'];\r\n nameMonts: string[] = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'];\r\n\r\n\r\n /**\r\n * Get month from date\r\n * @param date The date to extract the month from, can be a Date object or a string in 'YYYY-MM-DD' format.\r\n * @returns The name of the month in Spanish.\r\n */\r\n getMonthFromDate(date: Date | string): string {\r\n const parsedDate = typeof date === 'string' ? new Date(date) : date;\r\n const monthIndex = parsedDate.getMonth();\r\n return this.nameMonts[monthIndex];\r\n }\r\n\r\n\r\n\r\n /**\r\n * Calculate the age of a person based on their birth date.\r\n * @param birth The birth date as a Date object or a string in 'YYYY-MM-DD' format.\r\n * @returns The age in years, or null if the birth date is invalid.\r\n */\r\n calculateAge(birth: Date | string): number | null {\r\n if (!birth) {\r\n return null;\r\n }\r\n const birthDate = typeof birth === 'string' ? new Date(birth) : birth;\r\n const today = new Date();\r\n let age = today.getFullYear() - birthDate.getFullYear();\r\n const m = today.getMonth() - birthDate.getMonth();\r\n if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {\r\n age--;\r\n }\r\n return age;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Calculate the complete age of a person based on their birth date.\r\n * @param birth The birth date as a Date object or a string in 'YYYY-MM-DD' format.\r\n * @returns An object containing years, months, and days of age.\r\n */\r\n calculateAgeComplete(birth: Date | string): { years: number, months: number, days: number } {\r\n const birthDate = typeof birth === 'string' ? new Date(birth) : birth;\r\n const today = new Date();\r\n\r\n let years = today.getFullYear() - birthDate.getFullYear();\r\n let months = today.getMonth() - birthDate.getMonth();\r\n let days = today.getDate() - birthDate.getDate();\r\n\r\n if (days < 0) {\r\n months--;\r\n const previousMonth = new Date(today.getFullYear(), today.getMonth(), 0);\r\n days += previousMonth.getDate();\r\n }\r\n\r\n if (months < 0) {\r\n years--;\r\n months += 12;\r\n }\r\n\r\n return { years, months, days };\r\n }\r\n\r\n\r\n\r\n /**\r\n * Format a date string to 'DD/MM/YYYY'.\r\n * @param date The date string in 'YYYY-MM-DD' format.\r\n * @returns The formatted date string.\r\n */\r\n formatDateStringToDMY(date: string): string {\r\n const partesFecha = date.split('-');\r\n\r\n const año = partesFecha[0];\r\n const mes = parseInt(partesFecha[1], 10);\r\n const día = parseInt(partesFecha[2], 10);\r\n\r\n const díaFormateado = día < 10 ? `0${día}` : día.toString();\r\n const mesFormateado = mes < 10 ? `0${mes}` : mes.toString();\r\n\r\n return `${díaFormateado}/${mesFormateado}/${año}`;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Format a Date object to 'DD/MM/YYYY'.\r\n * @param date The Date object to format.\r\n * @returns The formatted date string.\r\n */\r\n formatDateToDMY(date: Date) {\r\n const utc_date = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()));\r\n\r\n let new_date = utc_date;\r\n\r\n const año = new_date.getUTCFullYear();\r\n const mes = new_date.getUTCMonth();\r\n const día = new_date.getUTCDate();\r\n\r\n const díaFormateado = día < 10 ? `0${día}` : día.toString();\r\n const mesFormateado = mes < 10 ? `0${mes}` : mes.toString();\r\n\r\n return `${díaFormateado}/${mesFormateado}/${año}`;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Format a date string to a more readable format.\r\n * @param date The date string in 'YYYY-MM-DD' format.\r\n * @param month Optional parameter to add to the month name.\r\n * @returns A formatted date string in the format 'DD de MMMM del YYYY'.\r\n */\r\n formatDateStringToLong(date: string, month?: number) {\r\n const partesFecha = date.split('-');\r\n\r\n const año = partesFecha[0];\r\n const mes = this.nameMonts[parseInt(partesFecha[1], 10) - 1];\r\n const día = parseInt(partesFecha[2], 10);\r\n\r\n let mes_fin;\r\n if (month) {\r\n mes_fin = mes + month;\r\n } else {\r\n mes_fin = mes;\r\n }\r\n\r\n return `${día} de ${mes_fin} del ${año}`;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Format a Date object to a string in the format 'DD de MMMM del YYYY'.\r\n * @param date The Date object to format.\r\n * @param month Optional parameter to add to the month name.\r\n * @returns A formatted date string.\r\n */\r\n formatDateToLong(date: Date, month?: number) {\r\n const utc_date = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()));\r\n\r\n let new_date = utc_date;\r\n\r\n if (month !== undefined) {\r\n new_date = new Date(new_date.setUTCMonth(new_date.getUTCMonth() + month));\r\n }\r\n\r\n const año = new_date.getUTCFullYear();\r\n const mes = this.nameMonts[new_date.getUTCMonth()];\r\n const día = new_date.getUTCDate();\r\n\r\n return `${día} de ${mes} del ${año}`;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Parse a date string in the format \"dd de MMMM del yyyy\" to \"yyyy-MM-dd\".\r\n * @param fechaStr The date string to parse.\r\n * @returns The parsed date string in \"yyyy-MM-dd\" format or null if invalid.\r\n */\r\n parseDateString(fechaStr: string): string | null {\r\n if (!fechaStr) return null;\r\n\r\n // Mapeo de meses en español\r\n const meses: any = {\r\n 'ENERO': '01',\r\n 'FEBRERO': '02',\r\n 'MARZO': '03',\r\n 'ABRIL': '04',\r\n 'MAYO': '05',\r\n 'JUNIO': '06',\r\n 'JULIO': '07',\r\n 'AGOSTO': '08',\r\n 'SEPTIEMBRE': '09',\r\n 'OCTUBRE': '10',\r\n 'NOVIEMBRE': '11',\r\n 'DICIEMBRE': '12'\r\n };\r\n\r\n const regex = /^(\\d{1,2}) de (\\w+) del (\\d{4})$/i;\r\n const match = fechaStr.trim().match(regex);\r\n\r\n if (match) {\r\n const day = match[1].padStart(2, '0');\r\n const mesStr = match[2].toUpperCase();\r\n const month = meses[mesStr] || '01';\r\n const year = match[3];\r\n return `${year}-${month}-${day}`;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n\r\n \r\n /**\r\n * Format a date to \"MMM YY\" format.\r\n * @param date The date to format, can be a Date object.\r\n * @returns The formatted date string.\r\n */\r\n formatMonthYear(date: Date): string {\r\n const months = this.nameMontsAb.map(month => month.toUpperCase());\r\n const month = months[date.getMonth()];\r\n const year = date.getFullYear().toString().slice(-2);\r\n return `${month} ${year}`;\r\n }\r\n\r\n\r\n /**\r\n * Format a date to the Bogotá timezone (UTC-5).\r\n * @param date The date to format, can be a Date object.\r\n * @returns The formatted date string in 'yyyy-MM-ddTHH:mm:ss' format.\r\n */\r\n formatDateToBogota(date: Date): string {\r\n const bogotaOffset = -5 * 60;\r\n const localTime = date.getTime();\r\n const localOffset = date.getTimezoneOffset() * 60000;\r\n const utc = localTime + localOffset;\r\n const bogotaTime = utc + (bogotaOffset * 60000);\r\n const bogotaDate = new Date(bogotaTime);\r\n\r\n // Format the date to 'yyyy-MM-ddTHH:mm:ss'\r\n const year = bogotaDate.getFullYear();\r\n const month = String(bogotaDate.getMonth() + 1).padStart(2, '0');\r\n const day = String(bogotaDate.getDate()).padStart(2, '0');\r\n const hours = String(bogotaDate.getHours()).padStart(2, '0');\r\n const minutes = String(bogotaDate.getMinutes()).padStart(2, '0');\r\n const seconds = String(bogotaDate.getSeconds()).padStart(2, '0');\r\n\r\n return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`;\r\n }\r\n\r\n\r\n /**\r\n * Format a date to a relative time string.\r\n * This method uses date-fns to format the date relative to now.\r\n * @param date The date to format, can be a string in 'YYYY-MM-DD' format.\r\n * @returns A formatted relative time string.\r\n * @example \"hace 2 días\", \"hace 1 hora\", etc\r\n */\r\n formatRelativeDate(date: string): string {\r\n return formatDistanceToNowStrict(new Date(date), {\r\n locale: {\r\n ...es,\r\n formatDistance: (token, count, options) => {\r\n const formatDistanceLocale = {\r\n lessThanXSeconds: 'hace menos de {{count}} segundos',\r\n xSeconds: 'hace {{count}} segundos',\r\n halfAMinute: 'hace medio minuto',\r\n lessThanXMinutes: 'hace menos de {{count}} minutos',\r\n xMinutes: 'hace {{count}} minutos',\r\n aboutXHours: 'hace aproximadamente {{count}} horas',\r\n xHours: 'hace {{count}} horas',\r\n xDays: 'hace {{count}} días',\r\n aboutXWeeks: 'hace aproximadamente {{count}} semanas',\r\n xWeeks: 'hace {{count}} semanas',\r\n aboutXMonths: 'hace aproximadamente {{count}} meses',\r\n xMonths: 'hace {{count}} meses',\r\n aboutXYears: 'hace aproximadamente {{count}} años',\r\n xYears: 'hace {{count}} años',\r\n overXYears: 'hace más de {{count}} años',\r\n almostXYears: 'hace casi {{count}} años'\r\n };\r\n\r\n let result = formatDistanceLocale[token];\r\n\r\n if (typeof count === 'number') {\r\n result = result.replace('{{count}}', count.toString());\r\n\r\n // Singulars and plurals\r\n if (token === 'xHours' && count === 1) {\r\n result = result.replace('horas', 'hora');\r\n }\r\n if (token === 'xDays' && count === 1) {\r\n result = result.replace('días', 'día');\r\n }\r\n if (token === 'xWeeks' && count === 1) {\r\n result = result.replace('semanas', 'semana');\r\n }\r\n if (token === 'xMonths' && count === 1) {\r\n result = result.replace('meses', 'mes');\r\n }\r\n if (token === 'xYears' && count === 1) {\r\n result = result.replace('años', 'año');\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n }\r\n });\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { CurrencyPipe } from '@angular/common';\r\nimport { JCalendarService } from '../transformer/calendar.service';\r\nimport { TableColumn } from '../../interfaces/crud/crud.interface';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class JConverterCrudService {\r\n\r\n constructor(\r\n private readonly currencyPipe: CurrencyPipe,\r\n private readonly calendarService: JCalendarService,\r\n ) { }\r\n\r\n /**\r\n * Get the correct sort key from the sortColumn object or string.\r\n * @param sortColumn The column to sort by, can be a string or an object with a 'col' property.\r\n * @returns The sort key as a string.\r\n */\r\n getSortKey(sortColumn: any): string {\r\n if (typeof sortColumn === 'object' && sortColumn !== null) {\r\n return sortColumn.col;\r\n }\r\n\r\n return sortColumn;\r\n }\r\n\r\n\r\n /**\r\n * Converter object to an array of objects with key and value for form initialization.\r\n * @param formGroup The FormGroup to convert.\r\n * @returns An array of objects with key and value for form initialization.\r\n */\r\n initializeFormControls(formGroup: FormGroup): { [key: string]: AbstractControl | null } {\r\n const formControls: { [key: string]: AbstractControl | null } = {};\r\n\r\n Object.keys(formGroup.controls).forEach(key => {\r\n formControls[`${key}_control`] = formGroup.get(key);\r\n });\r\n\r\n return formControls;\r\n }\r\n\r\n\r\n /**\r\n * Formats data based on the column type.\r\n * @param value The value to format.\r\n * @param column The column definition.\r\n * @return Formatted value based on the column type\r\n */\r\n formatData(value: any, column: TableColumn<any>): any {\r\n\r\n if (column.isdollar && value !== null) {\r\n const transformedValue = this.currencyPipe.transform(value, 'USD', 'symbol', '1.2-2');\r\n return transformedValue ? transformedValue.replace('US', '') : null;\r\n }\r\n\r\n if (column.isCurrency && value !== null) {\r\n return this.currencyPipe.transform(value, 'USD', 'symbol', '1.2-2');\r\n }\r\n\r\n if (column.isDate && value !== null) {\r\n return this.calendarService.formatDateStringToDMY(`${value}`);\r\n }\r\n\r\n if (column.isDateText && value !== null) {\r\n return this.calendarService.formatDateStringToLong(`${value}`);\r\n }\r\n\r\n if (column.isDateTime && value !== null) {\r\n return new Date(value).toLocaleString();\r\n }\r\n\r\n if (column.isDateTimeText && value !== null) {\r\n return new Date(value).toString();\r\n }\r\n\r\n if (column.isRelativeTime && value !== null) {\r\n return this.calendarService.formatRelativeDate(value);\r\n }\r\n\r\n if (column.isFirstWord && value !== null) {\r\n return value.split(' ')[0];\r\n }\r\n\r\n if (column.isPhoneEcuadorian && value !== null) {\r\n // Si el número ya empieza con +593\r\n if (value.startsWith('+593')) {\r\n const restOfNumber = value.slice(4);\r\n return `+593 ${restOfNumber}`;\r\n }\r\n // Si el número empieza con 0, reemplazar el 0 por +593\r\n if (value.startsWith('0')) {\r\n return `+593 ${value.replace(/^0/, '')}`;\r\n }\r\n // Si el número empieza con 9 (y no tiene +593), agregar +593 al principio\r\n if (value.startsWith('9')) {\r\n return `+593 ${value}`;\r\n }\r\n return value;\r\n }\r\n\r\n // Si no se aplica ningún formato, retornar el valor original\r\n return value;\r\n }\r\n\r\n\r\n /**\r\n * This method converts values to appropriate types based on the column definition.\r\n * It handles various formats such as currency, date, and text.\r\n * @param value The value to parse.\r\n * @param column The column definition.\r\n * @returns The parsed value or null if invalid.\r\n */\r\n parseData(value: any, column: TableColumn<any>): any {\r\n if (value === null || value === undefined || value === 'S/N') {\r\n return null;\r\n }\r\n\r\n let cleaned = value;\r\n\r\n if (typeof cleaned === 'string') {\r\n cleaned = cleaned.trim();\r\n }\r\n\r\n if (column.isdollar && typeof cleaned === 'string') {\r\n cleaned = cleaned.replace(/[^\\d,.-]/g, '').replace(',', '.');\r\n return cleaned ? parseFloat(cleaned) : null;\r\n }\r\n\r\n if (column.isCurrency && typeof cleaned === 'string') {\r\n cleaned = cleaned.replace(/[^\\d,.-]/g, '').replace(',', '.');\r\n return cleaned ? parseFloat(cleaned) : null;\r\n }\r\n\r\n if (column.isDateText && typeof cleaned === 'string') {\r\n const fecha = this.calendarService.parseDateString(cleaned);\r\n return fecha ?? cleaned;\r\n }\r\n\r\n if (column.isDate && typeof cleaned === 'string') {\r\n const fecha = new Date(cleaned);\r\n return isNaN(fecha.getTime()) ? cleaned : fecha.toISOString().substring(0, 10);\r\n }\r\n\r\n if (column.isDateTime && typeof cleaned === 'string') {\r\n const fecha = new Date(cleaned);\r\n return isNaN(fecha.getTime()) ? cleaned : fecha.toISOString();\r\n }\r\n\r\n if (column.isDateTimeText && typeof cleaned === 'string') {\r\n const fecha = new Date(cleaned);\r\n return isNaN(fecha.getTime()) ? cleaned : fecha.toISOString();\r\n }\r\n\r\n if (column.isRelativeTime) {\r\n return cleaned;\r\n }\r\n\r\n if (column.isFirstWord) {\r\n return cleaned;\r\n }\r\n\r\n return cleaned;\r\n }\r\n}","import { HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Params } from '@angular/router';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class JParamsHttpService {\r\n\r\n /**\r\n * Transform Params to HttpParams\r\n * @param params \r\n * @returns \r\n */\r\n resParams(params: Params): HttpParams {\r\n\r\n // Construct HttpParams\r\n let httpParams = new HttpParams();\r\n\r\n if (params) {\r\n Object.keys(params).forEach(key => {\r\n const value = params[key];\r\n\r\n // If the value is an object (e.g., filter: { id_status: [1, 2] })\r\n if (typeof value === 'object' && value !== null) {\r\n Object.keys(value).forEach(subKey => {\r\n const subValue = value[subKey];\r\n\r\n // If the subValue is an array (e.g., id_status: [1, 2])\r\n if (Array.isArray(subValue)) {\r\n subValue.forEach(v => {\r\n httpParams = httpParams.append(`${key}[${subKey}]`, v);\r\n });\r\n } else {\r\n // If it's a unique value\r\n httpParams = httpParams.append(`${key}[${subKey}]`, subValue);\r\n }\r\n });\r\n } else {\r\n // If it's a flat value (e.g., id_status: 1)\r\n httpParams = httpParams.append(key, value);\r\n }\r\n });\r\n }\r\n return httpParams;\r\n }\r\n\r\n}","import { Inject, Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Params } from '@angular/router';\r\nimport { map, Observable } from 'rxjs';\r\nimport { JConverterCrudService } from './converter-crud.service';\r\nimport { JParamsHttpService } from '../http/params-http.service';\r\nimport { TAILJNG_CONFIG } from '../../config/tailjng-config.token';\r\nimport { TailjngConfig } from '../../interfaces/config.interface';\r\nimport { ApiResponse } from '../../interfaces/crud/api-response';\r\nimport { EnableBoolean, QueryParams } from '../../interfaces/crud/crud.interface';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class JGenericCrudService {\r\n\r\n constructor(\r\n @Inject(TAILJNG_CONFIG) private readonly config: TailjngConfig,\r\n private readonly http: HttpClient,\r\n private readonly paramsHttpService: JParamsHttpService,\r\n private readonly converterCrudService: JConverterCrudService,\r\n ) { }\r\n\r\n /**\r\n * Method to get all records from an endpoint.\r\n * @param endpoint Distinctive of the endpoint ('role', 'status', etc.)\r\n * @param params Parameters of the request.\r\n * @returns Observable with the API response.\r\n */\r\n getAll<T>(endpoint: string, params?: Params): Observable<ApiResponse<T>> {\r\n const url = `${this.config.urlBase}/${endpoint}`;\r\n let httpParams;\r\n if (params) httpParams = this.paramsHttpService.resParams(params);\r\n return this.http.get<ApiResponse<T>>(url, { params: httpParams });\r\n }\r\n\r\n\r\n /**\r\n * Method to get a record from an endpoint.\r\n * @param endpoint Distinctive of the endpoint ('role', 'status', etc.)\r\n * @param id Identifier of the record.\r\n * @returns Observable with the API response.\r\n */\r\n getId<T>(endpoint: string, id: number): Observable<T> {\r\n const url = `${this.config.urlBase}/${endpoint}`;\r\n return this.http.get<ApiResponse<{ [key: string]: T }>>(`${url}/${id}`).pipe(\r\n map(response => response.data[endpoint])\r\n );\r\n }\r\n\r\n\r\n /**\r\n * Method to create a record in an endpoint.\r\n * @param endpoint Distinctive of the endpoint ('role', 'status', etc.)\r\n * @param data Data of the record to add.\r\n * @returns Observable with the API response.\r\n */\r\n create<T>(endpoint: string, data: T): Observable<ApiResponse<T>> {\r\n const url = `${this.config.urlBase}/${endpoint}`;\r\n return this.http.post<ApiResponse<T>>(url, data);\r\n }\r\n\r\n\r\n /**\r\n * MMethod to update a record in an endpoint.\r\n * @param endpoint Distinctive of the endpoint ('role', 'status', etc.)\r\n * @param id Identifier of the record.\r\n * @param data Data of the record to update.\r\n * @returns Observable with the API response.\r\n */\r\n update<T>(endpoint: string, id: number, data: T): Observable<ApiResponse<T>> {\r\n const url = `${this.config.urlBase}/${endpoint}`;\r\n return this.http.put<ApiResponse<T>>(`${url}/${id}`, data);\r\n }\r\n\r\n\r\n /**\r\n * MMethod to delete a record from an endpoint.\r\n * @param endpoint Distinctive of the endpoint ('role', 'status', etc.)\r\n * @param id Identifier of the record.\r\n * @returns Observable with the API response.\r\n */\r\n delete<T>(endpoint: string, id: number): Observable<ApiResponse<T>> {\r\n const url = `${this.config.urlBase}/${endpoint}`;\r\n return this.http.delete<ApiResponse<T>>(`${url}/${id}`);\r\n }\r\n\r\n\r\n /**\r\n * Method to update the status of a record in an endpoint.\r\n * @param endpoint Distinctive of the endpoint ('role', 'status', etc.)\r\n * @param id Identifier of the record.\r\n * @param data Data of a boolean record to update.\r\n * @returns Observable with the API response.\r\n */\r\n enable<T>(endpoint: string, id: number, data: EnableBoolean<T>): Observable<ApiResponse<T>> {\r\n const url = `${this.config.urlBase}/${endpoint}`;\r\n return this.http.put<ApiResponse<T>>(`${url}/enable/${id}`, data);\r\n }\r\n\r\n\r\n /**\r\n * MMethod to create multiple records in an endpoint.\r\n * @param endpoint Distinctive of the endpoint ('role', 'status', etc.)\r\n * @param data Data of multiple records to add.\r\n * @returns Observable with the API response.\r\n */\r\n createMultiple<T>(endpoint: string, data: T[]): Observable<ApiResponse<T[]>> {\r\n const url = `${this.config.urlBase}/${endpoint}/bulk`;\r\n return this.http.post<ApiResponse<T[]>>(url, data);\r\n }\r\n\r\n\r\n /**\r\n * Method to get the query parameters for a table.\r\n * @param page Current page number.\r\n * @param limit NNumber of records per page.\r\n * @param sort Object containing the column and the sorting direction.\r\n * @param filters Filters applied to the query.\r\n * @param defaultFilters Default filters applied to the query.\r\n * @param searchQuery Search string.\r\n * @param columns Columns to search.\r\n * @returns\r\n */\r\n params({ page, limit, sort, filters, defaultFilters, searchQuery, columns }: QueryParams): Params {\r\n\r\n const params: Params = {}\r\n\r\n if (page) params['page'] = page.toString();\r\n if (limit) params['limit'] = limit.toString();\r\n\r\n // Apply default filters if provided\r\n Object.keys(defaultFilters ?? {}).forEach((key) => {\r\n if (!filters.hasOwnProperty(key)) {\r\n params[`filter[${key}]`] = defaultFilters![key];\r\n }\r\n });\r\n\r\n // If sort is provided, get the sort key and direction\r\n if (sort?.column && sort?.direction !== 'none') {\r\n const sortKey = this.converterCrudService.getSortKey(sort?.column);\r\n params['sortBy'] = sortKey;\r\n params['sortOrder'] = sort?.direction?.toUpperCase();\r\n }\r\n\r\n // Apply search if provided\r\n if (searchQuery && searchQuery.trim() !== '') {\r\n params['search'] = searchQuery;\r\n params['searchFields'] = columns?.map(col => col);\r\n }\r\n\r\n // Apply filters if provided\r\n if (Object.keys(filters).length > 0) {\r\n params['filter'] = filters;\r\n }\r\n\r\n return params;\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ErrorHandlerHttpService {\r\n\r\n /**\r\n * Map HTTP status codes to user-friendly messages and alert types.\r\n * This mapping helps in providing consistent error messages across the application.\r\n */\r\n private readonly errorMappings: { [key: number]: { title: string, message: string, type: 'error' | 'info', persistent: boolean } } = {\r\n 400: { type: 'info', title: 'Solicitud incorrecta', message: 'Los datos enviados no son válidos. Verifique e intente de nuevo.', persistent: false },\r\n 401: { type: 'info', title: 'No autorizado', message: 'Debe iniciar sesión para acceder a esta función.', persistent: true },\r\n 403: { type: 'error', title: 'Acceso denegado', message: 'No tiene permisos para realizar esta acción.', persistent: true },\r\n 404: { type: 'info', title: 'No encontrado', message: 'El recurso solicitado no existe o fue eliminado.', persistent: false },\r\n 409: { type: 'info', title: 'Conflicto', message: 'Conflicto en la solicitud. Verifique los datos ingresados.', persistent: false },\r\n 422: { type: 'info', title: 'Datos no procesables', message: 'Los datos son válidos, pero no pueden ser procesados en este momento.', persistent: false },\r\n 429: { type: 'info', title: 'Demasiadas solicitudes', message: 'Ha realizado demasiadas solicitudes. Intente más tarde.', persistent: true },\r\n 500: { type: 'error', title: 'Error del servidor', message: 'Ocurrió un error inesperado. Intente más tarde.', persistent: true },\r\n 503: { type: 'error', title: 'Servicio no disponible', message: 'El servidor está en mantenimiento o sobrecargado.', persistent: true }\r\n };\r\n\r\n\r\n /**\r\n * Handle HTTP errors and return a structured message with alert type.\r\n * @param error The error object returned from the HTTP request.\r\n * @returns A structured error message.\r\n */\r\n handleHttpError(error: any) {\r\n console.error('HTTP Error:', error);\r\n\r\n // If no error is defined, return a generic message\r\n if (!error) {\r\n return {\r\n type: 'error',\r\n title: 'Error desconocido',\r\n message: 'Ocurrió un error inesperado. Intente de nuevo más tarde.',\r\n persistent: true\r\n };\r\n }\r\n\r\n const status = error?.status || 0;\r\n const backendMessage = error?.error?.msg || error?.message;\r\n\r\n const errorInfo = this.errorMappings[status] || {\r\n title: 'Error desconocido',\r\n message: 'Ocurrió un error inesperado. Intente de nuevo más tarde.',\r\n type: 'error',\r\n persistent: true\r\n };\r\n\r\n return {\r\n type: errorInfo.type,\r\n title: errorInfo.title,\r\n message: backendMessage || errorInfo.message,\r\n persistent: errorInfo.persistent\r\n };\r\n }\r\n\r\n}","import { Injectable } from '@angular/core';\r\nimport { Check, ChevronDown, ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight, CircleCheck, CircleHelp, CircleX, Copy, Eye, ImageOff, Info, Loader2, Minimize2, Moon, RefreshCcw, RotateCcw, RotateCw, Scan, Search, SquareDashedMousePointer, Sun, TriangleAlert, Upload, X, ZoomIn, ZoomOut } from 'lucide-angular';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class JIconsService {\r\n\r\n public icons = {\r\n info: Info,\r\n success: CircleCheck,\r\n error: CircleX,\r\n warning: TriangleAlert,\r\n question: CircleHelp,\r\n close: X,\r\n check: Check,\r\n zoomIn: ZoomIn,\r\n zoomOut: ZoomOut,\r\n rotateRight: RotateCw,\r\n rotateLeft: RotateCcw,\r\n reset: RefreshCcw,\r\n fullscreen: Scan,\r\n exitFullscreen: Minimize2,\r\n imageOff: ImageOff,\r\n upload: Upload,\r\n view: Eye,\r\n chevronDown: ChevronDown,\r\n squareDashedMousePointer: SquareDashedMousePointer,\r\n search: Search,\r\n copy: Copy,\r\n sun: Sun,\r\n moon: Moon,\r\n loading: Loader2,\r\n firstPage: ChevronsLeft,\r\n prevPage: ChevronLeft,\r\n nextPage: ChevronRight,\r\n lastPage: ChevronsRight,\r\n }\r\n\r\n constructor() { }\r\n}\r\n","import { Injectable, signal } from '@angular/core';\r\n\r\nexport type ThemeMode = 'light' | 'dark';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class JThemeService {\r\n\r\n private readonly _theme = signal<ThemeMode>('light');\r\n readonly themeSignal = this._theme.asReadonly();\r\n\r\n constructor() {\r\n this.initializeTheme();\r\n this.listenToExternalChanges();\r\n }\r\n\r\n private initializeTheme(): void {\r\n const savedTheme = localStorage.getItem('theme') as ThemeMode;\r\n\r\n if (savedTheme) {\r\n this._theme.set(savedTheme);\r\n } else if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\r\n this._theme.set('dark');\r\n }\r\n\r\n this.applyTheme();\r\n }\r\n\r\n private listenToExternalChanges(): void {\r\n window.addEventListener('storage', (event) => {\r\n if (event.key === 'theme' && event.newValue) {\r\n const newTheme = event.newValue as ThemeMode;\r\n this._theme.set(newTheme);\r\n this.applyTheme();\r\n }\r\n });\r\n }\r\n\r\n private applyTheme(): void {\r\n const current = this._theme();\r\n document.documentElement.classList.toggle('dark', current === 'dark');\r\n }\r\n\r\n toggleTheme(): void {\r\n const newTheme = this._theme() === 'light' ? 'dark' : 'light';\r\n localStorage.setItem('theme', newTheme);\r\n this._theme.set(newTheme);\r\n this.applyTheme();\r\n }\r\n\r\n setTheme(theme: ThemeMode): void {\r\n localStorage.setItem('theme', theme);\r\n this._theme.set(theme);\r\n this.applyTheme();\r\n }\r\n\r\n getThemeMode(): ThemeMode {\r\n return this._theme();\r\n }\r\n}\r\n","import { Injectable, signal, computed, WritableSignal } from \"@angular/core\";\r\nimport { firstValueFrom, isObservable, Observable } from \"rxjs\";\r\nimport { AlertDialogProps, Dialog } from \"../../interfaces/alert/dialog-alert.interface\";\r\n\r\ntype ActionCallback = () => void | Promise<void> | Observable<any>;\r\n\r\n@Injectable({\r\n providedIn: \"root\",\r\n})\r\nexport class JAlertDialogService {\r\n private readonly isOpenSignal: WritableSignal<boolean> = signal(false);\r\n private readonly configSignal: WritableSignal<AlertDialogProps | null> = signal(null);\r\n\r\n // Estados de carga para los botones\r\n private readonly isLoadingConfirm: WritableSignal<boolean> = signal(false);\r\n private readonly isLoadingCancel: WritableSignal<boolean> = signal(false);\r\n private readonly isLoadingRetry: WritableSignal<boolean> = signal(false);\r\n\r\n\r\n // Callbacks\r\n private onConfirmCallback?: ActionCallback;\r\n private onCancelCallback?: ActionCallback;\r\n private onRetryCallback?: ActionCallback;\r\n\r\n isOpen = computed(() => this.isOpenSignal());\r\n config = computed(() => this.configSignal());\r\n\r\n isConfirmLoading = computed(() => this.isLoadingConfirm());\r\n isCancelLoading = computed(() => this.isLoadingCancel());\r\n isRetryLoading = computed(() => this.isLoadingRetry());\r\n\r\n // Add a dialogs computed property that returns an array with a single dialog when open\r\n dialogs = computed<Dialog[]>(() => {\r\n if (!this.isOpenSignal()) return [];\r\n\r\n return [{\r\n config: this.configSignal()!,\r\n isConfirmLoading: this.isLoadingConfirm(),\r\n isCancelLoading: this.isLoadingCancel(),\r\n isRetryLoading: this.isLoadingRetry()\r\n }];\r\n });\r\n\r\n getConfig() {\r\n return this.configSignal();\r\n }\r\n\r\n AlertDialog(config: AlertDialogProps) {\r\n this.onConfirmCallback = \"onConfirm\" in config ? config.onConfirm : undefined;\r\n this.onCancelCallback = \"onCancel\" in config ? config.onCancel : undefined;\r\n this.onRetryCallback = \"onRetry\" in config ? config.onRetry : undefined;\r\n\r\n // Reset loading states\r\n this.isLoadingConfirm.set(false);\r\n this.isLoadingCancel.set(false);\r\n this.isLoadingRetry.set(false);\r\n\r\n this.configSignal.set(config);\r\n this.isOpenSignal.set(true);\r\n }\r\n\r\n closeDialog() {\r\n this.isOpenSignal.set(false);\r\n this.configSignal.set(null);\r\n }\r\n\r\n async executeAction(action: \"confirm\" | \"cancel\" | \"retry\") {\r\n let callback: ActionCallback | undefined;\r\n let loadingSignal: WritableSignal<boolean>;\r\n \r\n switch (action) {\r\n case \"confirm\":\r\n callback = this.onConfirmCallback;\r\n loadingSignal = this.isLoadingConfirm;\r\n break;\r\n case \"cancel\":\r\n callback = this.onCancelCallback;\r\n loadingSignal = this.isLoadingCancel;\r\n break;\r\n case \"retry\":\r\n callback = this.onRetryCallback;\r\n loadingSignal = this.isLoadingRetry;\r\n break;\r\n }\r\n \r\n if (!callback) {\r\n this.closeDialog();\r\n return;\r\n }\r\n \r\n loadingSignal.set(true);\r\n \r\n try {\r\n const result = callback();\r\n \r\n // Soporte para Observable\r\n if (isObservable(result)) {\r\n await firstValueFrom(result);\r\n }\r\n \r\n // Soporte para Promise\r\n if (result instanceof Promise) {\r\n await result;\r\n }\r\n \r\n // Si es void, no hacemos nada extra\r\n } catch (error) {\r\n console.error(`Error en la acción ${action}:`, error);\r\n } finally {\r\n loadingSignal.set(false);\r\n this.closeDialog();\r\n }\r\n }\r\n \r\n}","import { Injectable, signal, computed, WritableSignal } from \"@angular/core\";\r\nimport { AlertToastProps, Toast } from \"../../interfaces/alert/toast-alert.interface\";\r\n\r\n@Injectable({\r\n providedIn: \"root\",\r\n})\r\nexport class JAlertToastService {\r\n private readonly toastsSignal: WritableSignal<Toast[]> = signal([]);\r\n private readonly autoCloseTimers: Map<string, any> = new Map();\r\n\r\n // Default auto-close delay in milliseconds\r\n private readonly DEFAULT_AUTO_CLOSE_DELAY = 5000;\r\n\r\n // Default action button text\r\n private readonly DEFAULT_ACTION_BUTTON_TEXT = \"Action\";\r\n\r\n // For compatibility with existing code\r\n private readonly isOpenSignal: WritableSignal<boolean> = signal(false);\r\n private readonly configSignal: WritableSignal<AlertToastProps | null> = signal(null);\r\n private readonly isLoadingAction: WritableSignal<boolean> = signal(false);\r\n private readonly isLoadingCancel: WritableSignal<boolean> = signal(false);\r\n\r\n // Computed values for all toasts\r\n toasts = computed(() => this.toastsSignal());\r\n\r\n // For backward compatibility with existing code\r\n isOpen = computed(() => this.isOpenSignal());\r\n config = computed(() => this.configSignal());\r\n isActionLoading = computed(() => this.isLoadingAction());\r\n isCancelLoading = computed(() => this.isLoadingCancel());\r\n\r\n getConfig() {\r\n return this.configSignal();\r\n }\r\n\r\n AlertToast(config: AlertToastProps) {\r\n const toastId = crypto.randomUUID();\r\n\r\n // Store callbacks for this toast\r\n const onActionCallback = \"onAction\" in config ? config.onAction : undefined;\r\n const onCancelCallback = \"onCancel\" in config ? config.onCancel : undefined;\r\n\r\n // Get action button text or use default\r\n const actionNameButton = config.actionButtonText ?? this.DEFAULT_ACTION_BUTTON_TEXT;\r\n\r\n const toast: Toast = {\r\n id: toastId,\r\n config,\r\n isActionLoading: false,\r\n isCancelLoading: false,\r\n onActionCallback,\r\n onCancelCallback,\r\n actionNameButton, // Add the button text\r\n createdAt: Date.now()\r\n };\r\n\r\n // Add the toast to our list\r\n this.toastsSignal.update(toasts => [...toasts, toast]);\r\n\r\n // Check if this toast should auto-close\r\n // If autoClose is explicitly set to true OR \r\n // if it's a success toast and autoClose is not explicitly set to false\r\n const shouldAutoClose = config.autoClose === true ||\r\n (config.type === 'success' && config.autoClose !== false);\r\n\r\n if (shouldAutoClose) {\r\n // Use the provided delay or the default\r\n const delay = config.autoCloseDelay ?? this.DEFAULT_AUTO_CLOSE_DELAY;\r\n\r\n const timerId = setTimeout(() => {\r\n this.closeToastById(toastId);\r\n this.autoCloseTimers.delete(toastId);\r\n }, delay);\r\n\r\n this.autoCloseTimers.set(toastId, timerId);\r\n }\r\n\r\n return toastId;\r\n }\r\n\r\n closeToastById(toastId: string) {\r\n // Clear any auto-close timer\r\n if (this.autoCloseTimers.has(toastId)) {\r\n clearTimeout(this.autoCloseTimers.get(toastId));\r\n this.autoCloseTimers.delete(toastId);\r\n }\r\n\r\n this.toastsSignal.update(toasts =>\r\n toasts.filter(toast => toast.id !== toastId)\r\n );\r\n }\r\n\r\n closeAllToasts() {\r\n // Clear all timers\r\n this.autoCloseTimers.forEach(timerId => clearTimeout(timerId));\r\n this.autoCloseTimers.clear();\r\n\r\n this.toastsSignal.set([]);\r\n }\r\n\r\n async executeToastAction(toastId: string, action: \"action\" | \"cancel\") {\r\n const toast = this.toastsSignal().find(t => t.id === toastId);\r\n if (!toast) return;\r\n\r\n let callback: (() => Promise<void> | void) | undefined;\r\n let loadingProperty: 'isActionLoading' | 'isCancelLoading';\r\n\r\n switch (action) {\r\n case \"action\":\r\n callback = toast.onActionCallback;\r\n loadingProperty = 'isActionLoading';\r\n break;\r\n case \"cancel\":\r\n callback = toast.onCancelCallback;\r\n loadingProperty = 'isCancelLoading';\r\n break;\r\n }\r\n\r\n if (callback) {\r\n // Update loading state\r\n this.toastsSignal.update(toasts =>\r\n toasts.map(t => t.id === toastId ? { ...t, [loadingProperty]: true } : t)\r\n );\r\n\r\n try {\r\n await callback();\r\n } catch (error) {\r\n console.error(`Error en la acción ${action}:`, error);\r\n } finally {\r\n // Update loading state back to false (in case the toast hasn't been closed)\r\n this.toastsSignal.update(toasts => {\r\n const updatedToasts = toasts.map(t =>\r\n t.id === toastId ? { ...t, [loadingProperty]: false } : t\r\n );\r\n return updatedToasts;\r\n });\r\n\r\n this.closeToastById(toastId);\r\n }\r\n } else {\r\n this.closeToastById(toastId);\r\n }\r\n }\r\n\r\n // For backward compatibility with existing code\r\n closeToast() {\r\n this.closeAllToasts();\r\n this.isOpenSignal.set(false);\r\n this.configSignal.set(null);\r\n }\r\n\r\n // For backward compatibility with existing code\r\n async executeAction(action: \"action\" | \"cancel\") {\r\n let callback: (() => Promise<void> | void) | undefined;\r\n let loadingSignal: WritableSignal<boolean>;\r\n\r\n switch (action) {\r\n case \"action\":\r\n callback = \"onAction\" in (this.configSignal() || {})\r\n ? (this.configSignal() as any).onAction\r\n : undefined;\r\n loadingSignal = this.isLoadingAction;\r\n break;\r\n case \"cancel\":\r\n callback = \"onCancel\" in (this.configSignal() || {})\r\n ? (this.configSignal() as any).onCancel\r\n : undefined;\r\n loadingSignal = this.isLoadingCancel;\r\n break;\r\n }\r\n\r\n if (callback) {\r\n loadingSignal.set(true);\r\n try {\r\n await callback();\r\n } catch (error) {\r\n console.error(`Error en la acción ${action}:`, error);\r\n } finally {\r\n loadingSignal.set(false);\r\n this.closeToast();\r\n }\r\n } else {\r\n this.closeToast();\r\n }\r\n }\r\n}","\r\n// ======================================================\r\n// Table Column Interface\r\n// This interface defines the structure of a table column in a CRUD application.\r\n// ======================================================\r\n\r\ntype KeyPath<T> = T extends object\r\n ? {\r\n [K in keyof T]: K extends string | number\r\n ? `${K}` | `${K}.${KeyPath<T[K]>}`\r\n : never;\r\n }[keyof T]\r\n : never;\r\n\r\ntype ExtraColumnKeys = 'total' | 'expand' | 'extra';\r\ntype ExtendedKeyPath<T> = KeyPath<T> | ExtraColumnKeys;\r\n\r\nexport interface TableColumn<T> {\r\n key: ExtendedKeyPath<T>;\r\n label: string;\r\n visible?: boolean;\r\n sortable?: boolean;\r\n isSearchable?: boolean;\r\n isDisabled?: boolean;\r\n isDecorator?: boolean;\r\n colorDecorator?: (row: T) => 'primary' | 'success' | 'error' | 'warning' | 'info' | undefined;\r\n isDecoratorArray?: boolean;\r\n isCurrency?: boolean;\r\n isdollar?: boolean;\r\n isDate?: boolean;\r\n isDateText?: boolean;\r\n isDateTime?: boolean;\r\n isRelativeTime?: boolean;\r\n isDecoratorDateTime?: boolean;\r\n isDateTimeText?: boolean;\r\n isFirstWord?: boolean;\r\n isLink?: boolean;\r\n isPhoneEcuadorian?: boolean;\r\n styles?: { [key: string]: string };\r\n valueGetter?: (row: T) => any;\r\n template?: (row: T) => string;\r\n expandTemplate?: (row: T) => string;\r\n extraSearchFields?: (keyof T | string)[];\r\n hidden?: boolean;\r\n rowColorCondition?: { [value: string]: 'primary' | 'success' | 'error' | 'warning' | 'info' }; \r\n}\r\n\r\nexport type SortDirection = 'none' | 'asc' | 'desc';\r\n\r\n\r\nexport type LoadingState = 'idle' | 'loading' | 'success' | 'error';\r\n\r\nexport interface LoadingStates {\r\n initialLoad: LoadingState;\r\n search: LoadingState;\r\n itemsPerPage: LoadingState;\r\n pagination: LoadingState;\r\n sort: LoadingState;\r\n checked: LoadingState;\r\n action: LoadingState;\r\n aditionalButtons: { [buttonType: string]: LoadingState };\r\n}\r\n\r\ntype DefaultTypeOptionTable = 'edit' | 'delete' | 'disabled' | 'custom' | 'editRow';\r\n\r\ntype CommonOptionTableProps = {\r\n type?: `${DefaultTypeOptionTable}` | (string & {});\r\n icon?: ((data?: any) => any) | any;\r\n clicked?: (data: any) => void;\r\n text?: ((data?: any) => string) | string;\r\n tooltip?: ((data?: any) => string) | string;\r\n disabled?: ((data?: any) => boolean) | boolean;\r\n isVisible?: ((data?: any) => boolean) | boolean;\r\n tooltipPosition?: 'top' | 'right' | 'bottom' | 'left';\r\n ngClass?: ((data?: any) => any) | any;\r\n classes?: string;\r\n searchListUpload?: {\r\n [endpoint: string]: {\r\n keyReturn: string,\r\n keyColumnSearch: string,\r\n keyAlternate?: string,\r\n optional?: boolean;\r\n defaultFilters?: { [key: string]: string | number | (string | number)[] | undefined };\r\n };\r\n };\r\n};\r\n\r\n\r\n// ===================================================\r\n\r\ntype OptionTableWithChangeIcon = CommonOptionTableProps & {\r\n isChangeIcon: boolean | (() => boolean);\r\n iconChange: any;\r\n};\r\n\r\ntype OptionTableWithoutChangeIcon = CommonOptionTableProps & {\r\n isChangeIcon?: undefined;\r\n iconChange?: any;\r\n};\r\n\r\nexport type OptionsTable = OptionTableWithChangeIcon | OptionTableWithoutChangeIcon;\r\n\r\n\r\n// ===================================================\r\n\r\nexport interface QueryParams {\r\n page?: number;\r\n limit?: number;\r\n\r\n sort?: { column?: string | null; direction?: string };\r\n\r\n filters?: any;\r\n defaultFilters?: { [key: string]: any };\r\n\r\n searchQuery?: string;\r\n columns?: string[]\r\n}\r\n\r\nexport interface EnableBoolean<T> {\r\n key: keyof T;\r\n value: any;\r\n values: any[];\r\n keyDate?: keyof T;\r\n isDateNullable?: boolean;\r\n}","/*\r\n * Public API Surface of tailjng\r\n */\r\n\r\n// ========================================\r\n// Config\r\n// ========================================\r\nexport * from './lib/config/tailjng-config.token';\r\n\r\n\r\n// ========================================\r\n// Services\r\n// ========================================\r\n\r\n// Crud\r\nexport * from './lib/services/crud/converter-crud.service';\r\nexport * from './lib/services/crud/generic-crud.service';\r\n\r\n// Http\r\nexport * from './lib/services/http/params-http.service';\r\nexport * from './lib/services/http/error-handler-http.service';\r\n\r\n// Transformer\r\nexport * from './lib/services/transformer/calendar.service';\r\n\r\n// Static\r\nexport * from './lib/services/static/icons.service';\r\nexport * from './lib/services/static/theme.service';\r\n\r\n// Alert\r\nexport * from './lib/services/alert/dialog-alert.service';\r\nexport * from './lib/services/alert/toast-alert.service';\r\n\r\n\r\n// Interface\r\nexport * from './lib/interfaces/crud/crud.interface';\r\nexport * from './lib/interfaces/theme/theme-generator.interface';\r\n\r\n// npm version patch\r\n// npm run build\r\n\r\n\r\n// cd dist/tailjng\r\n// npm publish --access public\r\n\r\n// npx tailjng add [component]","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2.JCalendarService","i1","i2.JParamsHttpService","i3.JConverterCrudService"],"mappings":";;;;;;;;;;MAIa,cAAc,GAAG,IAAI,cAAc,CAAgB,gBAAgB;AAGhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;MCTa,gBAAgB,CAAA;AAEzB,IAAA,UAAU,GAAa,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;AACxE,IAAA,QAAQ,GAAa,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC;IAE/F,WAAW,GAAa,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;IAC5G,SAAS,GAAa,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC;AAGnJ;;;;AAIG;AACH,IAAA,gBAAgB,CAAC,IAAmB,EAAA;AAChC,QAAA,MAAM,UAAU,GAAG,OAAO,IAAI,KAAK,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI;AACnE,QAAA,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,EAAE;AACxC,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;;AAKrC;;;;AAIG;AACH,IAAA,YAAY,CAAC,KAAoB,EAAA;QAC7B,IAAI,CAAC,KAAK,EAAE;AACR,YAAA,OAAO,IAAI;;AAEf,QAAA,MAAM,SAAS,GAAG,OAAO,KAAK,KAAK,QAAQ,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK;AACrE,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;QACxB,IAAI,GAAG,GAAG,KAAK,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,WAAW,EAAE;QACvD,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE;QACjD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE;AAC7D,YAAA,GAAG,EAAE;;AAET,QAAA,OAAO,GAAG;;AAKd;;;;AAIG;AACH,IAAA,oBAAoB,CAAC,KAAoB,EAAA;AACrC,QAAA,MAAM,SAAS,GAAG,OAAO,KAAK,KAAK,QAAQ,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK;AACrE,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;QAExB,IAAI,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,WAAW,EAAE;QACzD,IAAI,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE;QACpD,IAAI,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE;AAEhD,QAAA,IAAI,IAAI,GAAG,CAAC,EAAE;AACV,YAAA,MAAM,EAAE;AACR,YAAA,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACxE,YAAA,IAAI,IAAI,aAAa,CAAC,OAAO,EAAE;;AAGnC,QAAA,IAAI,MAAM,GAAG,CAAC,EAAE;AACZ,YAAA,KAAK,EAAE;YACP,MAAM,IAAI,EAAE;;AAGhB,QAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE;;AAKlC;;;;AAIG;AACH,IAAA,qBAAqB,CAAC,IAAY,EAAA;QAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAEnC,QAAA,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC;QAC1B,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAExC,QAAA,MAAM,aAAa,GAAG,GAAG,GAAG,EAAE,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,GAAG,GAAG,CAAC,QAAQ,EAAE;AAC3D,QAAA,MAAM,aAAa,GAAG,GAAG,GAAG,EAAE,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,GAAG,GAAG,CAAC,QAAQ,EAAE;AAE3D,QAAA,OAAO,GAAG,aAAa,CAAA,CAAA,EAAI,aAAa,CAAI,CAAA,EAAA,GAAG,EAAE;;AAKrD;;;;AAIG;AACH,IAAA,eAAe,CAAC,IAAU,EAAA;QACtB,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAEjG,IAAI,QAAQ,GAAG,QAAQ;AAEvB,QAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,cAAc,EAAE;AACrC,QAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,EAAE;AAClC,QAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,EAAE;AAEjC,QAAA,MAAM,aAAa,GAAG,GAAG,GAAG,EAAE,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,GAAG,GAAG,CAAC,QAAQ,EAAE;AAC3D,QAAA,MAAM,aAAa,GAAG,GAAG,GAAG,EAAE,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,GAAG,GAAG,CAAC,QAAQ,EAAE;AAE3D,QAAA,OAAO,GAAG,aAAa,CAAA,CAAA,EAAI,aAAa,CAAI,CAAA,EAAA,GAAG,EAAE;;AAKrD;;;;;AAKG;IACH,sBAAsB,CAAC,IAAY,EAAE,KAAc,EAAA;QAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAEnC,QAAA,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC;AAC1B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAExC,QAAA,IAAI,OAAO;QACX,IAAI,KAAK,EAAE;AACP,YAAA,OAAO,GAAG,GAAG,GAAG,KAAK;;aAClB;YACH,OAAO,GAAG,GAAG;;AAGjB,QAAA,OAAO,GAAG,GAAG,CAAA,IAAA,EAAO,OAAO,CAAQ,KAAA,EAAA,GAAG,EAAE;;AAK5C;;;;;AAKG;IACH,gBAAgB,CAAC,IAAU,EAAE,KAAc,EAAA;QACvC,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAEjG,IAAI,QAAQ,GAAG,QAAQ;AAEvB,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACrB,YAAA,QAAQ,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,CAAC;;AAG7E,QAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,cAAc,EAAE;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;AAClD,QAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,EAAE;AAEjC,QAAA,OAAO,GAAG,GAAG,CAAA,IAAA,EAAO,GAAG,CAAQ,KAAA,EAAA,GAAG,EAAE;;AAKxC;;;;AAIG;AACH,IAAA,eAAe,CAAC,QAAgB,EAAA;AAC5B,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,IAAI;;AAG1B,QAAA,MAAM,KAAK,GAAQ;AACf,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,WAAW,EAAE;SAChB;QAED,MAAM,KAAK,GAAG,mCAAmC;QACjD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;QAE1C,IAAI,KAAK,EAAE;AACP,YAAA,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;YACrC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;YACrC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI;AACnC,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;AACrB,YAAA,OAAO,GAAG,IAAI,CAAA,CAAA,EAAI,KAAK,CAAI,CAAA,EAAA,GAAG,EAAE;;AAGpC,QAAA,OAAO,IAAI;;AAKf;;;;AAIG;AACH,IAAA,eAAe,CAAC,IAAU,EAAA;AACtB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACjE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AACrC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACpD,QAAA,OAAO,CAAG,EAAA,KAAK,CAAI,CAAA,EAAA,IAAI,EAAE;;AAI7B;;;;AAIG;AACH,IAAA,kBAAkB,CAAC,IAAU,EAAA;AACzB,QAAA,MAAM,YAAY,GAAG,CAAC,CAAC,GAAG,EAAE;AAC5B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE;QAChC,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,EAAE,GAAG,KAAK;AACpD,QAAA,MAAM,GAAG,GAAG,SAAS,GAAG,WAAW;QACnC,MAAM,UAAU,GAAG,GAAG,IAAI,YAAY,GAAG,KAAK,CAAC;AAC/C,QAAA,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC;;AAGvC,QAAA,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,EAAE;AACrC,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AAChE,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AACzD,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AAC5D,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AAChE,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AAEhE,QAAA,OAAO,CAAG,EAAA,IAAI,CAAI,CAAA,EAAA,KAAK,CAAI,CAAA,EAAA,GAAG,CAAI,CAAA,EAAA,KAAK,CAAI,CAAA,EAAA,OAAO,CAAI,CAAA,EAAA,OAAO,EAAE;;AAInE;;;;;;AAMG;AACH,IAAA,kBAAkB,CAAC,IAAY,EAAA;AAC3B,QAAA,OAAO,yBAAyB,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE;AAC7C,YAAA,MAAM,EAAE;AACJ,gBAAA,GAAG,EAAE;gBACL,cAAc,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,KAAI;AACtC,oBAAA,MAAM,oBAAoB,GAAG;AACzB,wBAAA,gBAAgB,EAAE,kCAAkC;AACpD,wBAAA,QAAQ,EAAE,yBAAyB;AACnC,wBAAA,WAAW,EAAE,mBAAmB;AAChC,wBAAA,gBAAgB,EAAE,iCAAiC;AACnD,wBAAA,QAAQ,EAAE,wBAAwB;AAClC,wBAAA,WAAW,EAAE,sCAAsC;AACnD,wBAAA,MAAM,EAAE,sBAAsB;AAC9B,wBAAA,KAAK,EAAE,qBAAqB;AAC5B,wBAAA,WAAW,EAAE,wCAAwC;AACrD,wBAAA,MAAM,EAAE,wBAAwB;AAChC,wBAAA,YAAY,EAAE,sCAAsC;AACpD,wBAAA,OAAO,EAAE,sBAAsB;AAC/B,wBAAA,WAAW,EAAE,qCAAqC;AAClD,wBAAA,MAAM,EAAE,qBAAqB;AAC7B,wBAAA,UAAU,EAAE,4BAA4B;AACxC,wBAAA,YAAY,EAAE;qBACjB;AAED,oBAAA,IAAI,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC;AAExC,oBAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC3B,wBAAA,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;;wBAGtD,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,CAAC,EAAE;4BACnC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC;;wBAE5C,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,CAAC,EAAE;4BAClC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC;;wBAE1C,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,CAAC,EAAE;4BACnC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC;;wBAEhD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,CAAC,EAAE;4BACpC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC;;wBAE3C,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,CAAC,EAAE;4BACnC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC;;;AAI9C,oBAAA,OAAO,MAAM;;AAEpB;AACJ,SAAA,CAAC;;wGA1SG,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFb,MAAM,EAAA,CAAA;;4FAET,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE;AACf,iBAAA;;;MCGY,qBAAqB,CAAA;AAGT,IAAA,YAAA;AACA,IAAA,eAAA;IAFrB,WACqB,CAAA,YAA0B,EAC1B,eAAiC,EAAA;QADjC,IAAY,CAAA,YAAA,GAAZ,YAAY;QACZ,IAAe,CAAA,eAAA,GAAf,eAAe;;AAGpC;;;;AAIG;AACH,IAAA,UAAU,CAAC,UAAe,EAAA;QACtB,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,EAAE;YACvD,OAAO,UAAU,CAAC,GAAG;;AAGzB,QAAA,OAAO,UAAU;;AAIrB;;;;AAIG;AACH,IAAA,sBAAsB,CAAC,SAAoB,EAAA;QACvC,MAAM,YAAY,GAA8C,EAAE;AAElE,QAAA,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,GAAG,IAAG;AAC1C,YAAA,YAAY,CAAC,CAAA,EAAG,GAAG,CAAA,QAAA,CAAU,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;AACvD,SAAC,CAAC;AAEF,QAAA,OAAO,YAAY;;AAIvB;;;;;AAKG;IACH,UAAU,CAAC,KAAU,EAAE,MAAwB,EAAA;QAE3C,IAAI,MAAM,CAAC,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;AACnC,YAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC;AACrF,YAAA,OAAO,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI;;QAGvE,IAAI,MAAM,CAAC,UAAU,IAAI,KAAK,KAAK,IAAI,EAAE;AACrC,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC;;QAGvE,IAAI,MAAM,CAAC,MAAM,IAAI,KAAK,KAAK,IAAI,EAAE;YACjC,OAAO,IAAI,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAG,EAAA,KAAK,CAAE,CAAA,CAAC;;QAGjE,IAAI,MAAM,CAAC,UAAU,IAAI,KAAK,KAAK,IAAI,EAAE;YACrC,OAAO,IAAI,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAG,EAAA,KAAK,CAAE,CAAA,CAAC;;QAGlE,IAAI,MAAM,CAAC,UAAU,IAAI,KAAK,KAAK,IAAI,EAAE;YACrC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,EAAE;;QAG3C,IAAI,MAAM,CAAC,cAAc,IAAI,KAAK,KAAK,IAAI,EAAE;YACzC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;;QAGrC,IAAI,MAAM,CAAC,cAAc,IAAI,KAAK,KAAK,IAAI,EAAE;YACzC,OAAO,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,KAAK,CAAC;;QAGzD,IAAI,MAAM,CAAC,WAAW,IAAI,KAAK,KAAK,IAAI,EAAE;YACtC,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;QAG9B,IAAI,MAAM,CAAC,iBAAiB,IAAI,KAAK,KAAK,IAAI,EAAE;;AAE5C,YAAA,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;gBAC1B,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;gBACnC,OAAO,CAAA,KAAA,EAAQ,YAAY,CAAA,CAAE;;;AAGjC,YAAA,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;gBACvB,OAAO,CAAA,KAAA,EAAQ,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA,CAAE;;;AAG5C,YAAA,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;gBACvB,OAAO,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAE;;AAE1B,YAAA,OAAO,KAAK;;;AAIhB,QAAA,OAAO,KAAK;;AAIhB;;;;;;AAMG;IACH,SAAS,CAAC,KAAU,EAAE,MAAwB,EAAA;AAC1C,QAAA,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,KAAK,EAAE;AAC1D,YAAA,OAAO,IAAI;;QAGf,IAAI,OAAO,GAAG,KAAK;AAEnB,QAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAC7B,YAAA,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE;;QAG5B,IAAI,MAAM,CAAC,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAChD,YAAA,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;AAC5D,YAAA,OAAO,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,IAAI;;QAG/C,IAAI,MAAM,CAAC,UAAU,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAClD,YAAA,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;AAC5D,YAAA,OAAO,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,IAAI;;QAG/C,IAAI,MAAM,CAAC,UAAU,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;YAClD,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,OAAO,CAAC;YAC3D,OAAO,KAAK,IAAI,OAAO;;QAG3B,IAAI,MAAM,CAAC,MAAM,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAC9C,YAAA,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC;YAC/B,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;;QAGlF,IAAI,MAAM,CAAC,UAAU,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAClD,YAAA,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC;AAC/B,YAAA,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE;;QAGjE,IAAI,MAAM,CAAC,cAAc,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AACtD,YAAA,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC;AAC/B,YAAA,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE;;AAGjE,QAAA,IAAI,MAAM,CAAC,cAAc,EAAE;AACvB,YAAA,OAAO,OAAO;;AAGlB,QAAA,IAAI,MAAM,CAAC,WAAW,EAAE;AACpB,YAAA,OAAO,OAAO;;AAGlB,QAAA,OAAO,OAAO;;wGA5JT,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAArB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cAFlB,MAAM,EAAA,CAAA;;4FAET,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAHjC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE;AACf,iBAAA;;;MCDY,kBAAkB,CAAA;AAE3B;;;;AAIG;AACH,IAAA,SAAS,CAAC,MAAc,EAAA;;AAGpB,QAAA,IAAI,UAAU,GAAG,IAAI,UAAU,EAAE;QAEjC,IAAI,MAAM,EAAE;YACR,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,IAAG;AAC9B,gBAAA,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC;;gBAGzB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;oBAC7C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,IAAG;AAChC,wBAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;;AAG9B,wBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AACzB,4BAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAG;AACjB,gCAAA,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,CAAG,EAAE,CAAC,CAAC;AAC1D,6BAAC,CAAC;;6BACC;;AAEH,4BAAA,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,CAAG,EAAE,QAAQ,CAAC;;AAErE,qBAAC,CAAC;;qBACC;;oBAEH,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;;AAElD,aAAC,CAAC;;AAEN,QAAA,OAAO,UAAU;;wGArCZ,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAFf,MAAM,EAAA,CAAA;;4FAET,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE;AACf,iBAAA;;;MCQY,mBAAmB,CAAA;AAGiB,IAAA,MAAA;AACxB,IAAA,IAAA;AACA,IAAA,iBAAA;AACA,IAAA,oBAAA;AAJrB,IAAA,WAAA,CAC6C,MAAqB,EAC7C,IAAgB,EAChB,iBAAqC,EACrC,oBAA2C,EAAA;QAHnB,IAAM,CAAA,MAAA,GAAN,MAAM;QAC9B,IAAI,CAAA,IAAA,GAAJ,IAAI;QACJ,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB;QACjB,IAAoB,CAAA,oBAAA,GAApB,oBAAoB;;AAGzC;;;;;AAKG;IACH,MAAM,CAAI,QAAgB,EAAE,MAAe,EAAA;QACvC,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE;AAChD,QAAA,IAAI,UAAU;AACd,QAAA,IAAI,MAAM;YAAE,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,MAAM,CAAC;AACjE,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAiB,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;;AAIrE;;;;;AAKG;IACH,KAAK,CAAI,QAAgB,EAAE,EAAU,EAAA;QACjC,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE;AAChD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAoC,CAAG,EAAA,GAAG,CAAI,CAAA,EAAA,EAAE,CAAE,CAAA,CAAC,CAAC,IAAI,CACxE,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAC3C;;AAIL;;;;;AAKG;IACH,MAAM,CAAI,QAAgB,EAAE,IAAO,EAAA;QAC/B,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE;QAChD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAiB,GAAG,EAAE,IAAI,CAAC;;AAIpD;;;;;;AAMG;AACH,IAAA,MAAM,CAAI,QAAgB,EAAE,EAAU,EAAE,IAAO,EAAA;QAC3C,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE;AAChD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAiB,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE,EAAE,IAAI,CAAC;;AAI9D;;;;;AAKG;IACH,MAAM,CAAI,QAAgB,EAAE,EAAU,EAAA;QAClC,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE;AAChD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAiB,CAAG,EAAA,GAAG,CAAI,CAAA,EAAA,EAAE,CAAE,CAAA,CAAC;;AAI3D;;;;;;AAME;AACF,IAAA,MAAM,CAAI,QAAgB,EAAE,EAAU,EAAE,IAAsB,EAAA;QAC1D,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE;AAChD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAiB,CAAA,EAAG,GAAG,CAAA,QAAA,EAAW,EAAE,CAAA,CAAE,EAAE,IAAI,CAAC;;AAIrE;;;;;AAKG;IACH,cAAc,CAAI,QAAgB,EAAE,IAAS,EAAA;QACzC,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,KAAA,CAAO;QACrD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAmB,GAAG,EAAE,IAAI,CAAC;;AAItD;;;;;;;;;;AAUE;AACF,IAAA,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,OAAO,EAAe,EAAA;QAEpF,MAAM,MAAM,GAAW,EAAE;AAEzB,QAAA,IAAI,IAAI;YAAE,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC1C,QAAA,IAAI,KAAK;YAAE,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE;;AAG7C,QAAA,MAAM,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;YAC9C,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;gBAC9B,MAAM,CAAC,CAAU,OAAA,EAAA,GAAG,CAAG,CAAA,CAAA,CAAC,GAAG,cAAe,CAAC,GAAG,CAAC;;AAEvD,SAAC,CAAC;;QAGF,IAAI,IAAI,EAAE,MAAM,IAAI,IAAI,EAAE,SAAS,KAAK,MAAM,EAAE;AAC5C,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC;AAClE,YAAA,MAAM,CAAC,QAAQ,CAAC,GAAG,OAAO;YAC1B,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE;;;QAIxD,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;AAC1C,YAAA,MAAM,CAAC,QAAQ,CAAC,GAAG,WAAW;AAC9B,YAAA,MAAM,CAAC,cAAc,CAAC,GAAG,OAAO,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;;;QAIrD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AACjC,YAAA,MAAM,CAAC,QAAQ,CAAC,GAAG,OAAO;;AAG9B,QAAA,OAAO,MAAM;;AA9IR,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,kBAGhB,cAAc,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,kBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,qBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAHjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFhB,MAAM,EAAA,CAAA;;4FAET,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE;AACf,iBAAA;;0BAIQ,MAAM;2BAAC,cAAc;;;MCZjB,uBAAuB,CAAA;AAEhC;;;AAGG;AACc,IAAA,aAAa,GAAuG;AACjI,QAAA,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,sBAAsB,EAAE,OAAO,EAAE,kEAAkE,EAAE,UAAU,EAAE,KAAK,EAAE;AACpJ,QAAA,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,kDAAkD,EAAE,UAAU,EAAE,IAAI,EAAE;AAC5H,QAAA,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,8CAA8C,EAAE,UAAU,EAAE,IAAI,EAAE;AAC3H,QAAA,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,kDAAkD,EAAE,UAAU,EAAE,KAAK,EAAE;AAC7H,QAAA,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,4DAA4D,EAAE,UAAU,EAAE,KAAK,EAAE;AACnI,QAAA,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,sBAAsB,EAAE,OAAO,EAAE,uEAAuE,EAAE,UAAU,EAAE,KAAK,EAAE;AACzJ,QAAA,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,wBAAwB,EAAE,OAAO,EAAE,yDAAyD,EAAE,UAAU,EAAE,IAAI,EAAE;AAC5I,QAAA,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,iDAAiD,EAAE,UAAU,EAAE,IAAI,EAAE;AACjI,QAAA,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,wBAAwB,EAAE,OAAO,EAAE,mDAAmD,EAAE,UAAU,EAAE,IAAI;KACxI;AAGD;;;;AAIG;AACH,IAAA,eAAe,CAAC,KAAU,EAAA;AACtB,QAAA,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC;;QAGnC,IAAI,CAAC,KAAK,EAAE;YACR,OAAO;AACH,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,KAAK,EAAE,mBAAmB;AAC1B,gBAAA,OAAO,EAAE,0DAA0D;AACnE,gBAAA,UAAU,EAAE;aACf;;AAGL,QAAA,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,IAAI,CAAC;QACjC,MAAM,cAAc,GAAG,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,KAAK,EAAE,OAAO;QAE1D,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI;AAC5C,YAAA,KAAK,EAAE,mBAAmB;AAC1B,YAAA,OAAO,EAAE,0DAA0D;AACnE,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,UAAU,EAAE;SACf;QAED,OAAO;YACH,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,KAAK,EAAE,SAAS,CAAC,KAAK;AACtB,YAAA,OAAO,EAAE,cAAc,IAAI,SAAS,CAAC,OAAO;YAC5C,UAAU,EAAE,SAAS,CAAC;SACzB;;wGApDI,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cAFpB,MAAM,EAAA,CAAA;;4FAET,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE;AACf,iBAAA;;;MCEY,aAAa,CAAA;AAEjB,IAAA,KAAK,GAAG;AACb,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,OAAO,EAAE,WAAW;AACpB,QAAA,KAAK,EAAE,OAAO;AACd,QAAA,OAAO,EAAE,aAAa;AACtB,QAAA,QAAQ,EAAE,UAAU;AACpB,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,KAAK,EAAE,KAAK;AACZ,QAAA,MAAM,EAAE,MAAM;AACd,QAAA,OAAO,EAAE,OAAO;AAChB,QAAA,WAAW,EAAE,QAAQ;AACrB,QAAA,UAAU,EAAE,SAAS;AACrB,QAAA,KAAK,EAAE,UAAU;AACjB,QAAA,UAAU,EAAE,IAAI;AAChB,QAAA,cAAc,EAAE,SAAS;AACzB,QAAA,QAAQ,EAAE,QAAQ;AAClB,QAAA,MAAM,EAAE,MAAM;AACd,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,WAAW,EAAE,WAAW;AACxB,QAAA,wBAAwB,EAAE,wBAAwB;AAClD,QAAA,MAAM,EAAE,MAAM;AACd,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,GAAG,EAAE,GAAG;AACR,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,OAAO,EAAE,OAAO;AAChB,QAAA,SAAS,EAAE,YAAY;AACvB,QAAA,QAAQ,EAAE,WAAW;AACrB,QAAA,QAAQ,EAAE,YAAY;AACtB,QAAA,QAAQ,EAAE,aAAa;KACxB;AAED,IAAA,WAAA,GAAA;wGAjCW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAb,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cAFZ,MAAM,EAAA,CAAA;;4FAEP,aAAa,EAAA,UAAA,EAAA,CAAA;kBAHzB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCAY,aAAa,CAAA;AAEL,IAAA,MAAM,GAAG,MAAM,CAAY,OAAO,CAAC;AAC3C,IAAA,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;AAE/C,IAAA,WAAA,GAAA;QACI,IAAI,CAAC,eAAe,EAAE;QACtB,IAAI,CAAC,uBAAuB,EAAE;;IAG1B,eAAe,GAAA;QACnB,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAc;QAE7D,IAAI,UAAU,EAAE;AACZ,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;;AACxB,aAAA,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,OAAO,EAAE;AACvF,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;;QAG3B,IAAI,CAAC,UAAU,EAAE;;IAGb,uBAAuB,GAAA;QAC3B,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,KAAI;YACzC,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE;AACzC,gBAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAqB;AAC5C,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBACzB,IAAI,CAAC,UAAU,EAAE;;AAEzB,SAAC,CAAC;;IAGE,UAAU,GAAA;AACd,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE;AAC7B,QAAA,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,CAAC;;IAGzE,WAAW,GAAA;AACP,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,OAAO,GAAG,MAAM,GAAG,OAAO;AAC7D,QAAA,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC;AACvC,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzB,IAAI,CAAC,UAAU,EAAE;;AAGrB,IAAA,QAAQ,CAAC,KAAgB,EAAA;AACrB,QAAA,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC;AACpC,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QACtB,IAAI,CAAC,UAAU,EAAE;;IAGrB,YAAY,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE;;wGAnDf,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAb,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cADA,MAAM,EAAA,CAAA;;4FACnB,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCKrB,mBAAmB,CAAA;AACb,IAAA,YAAY,GAA4B,MAAM,CAAC,KAAK,CAAC;AACrD,IAAA,YAAY,GAA4C,MAAM,CAAC,IAAI,CAAC;;AAGpE,IAAA,gBAAgB,GAA4B,MAAM,CAAC,KAAK,CAAC;AACzD,IAAA,eAAe,GAA4B,MAAM,CAAC,KAAK,CAAC;AACxD,IAAA,cAAc,GAA4B,MAAM,CAAC,KAAK,CAAC;;AAIhE,IAAA,iBAAiB;AACjB,IAAA,gBAAgB;AAChB,IAAA,eAAe;IAEvB,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IAC5C,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IAE5C,gBAAgB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1D,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;IACxD,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;;AAGtD,IAAA,OAAO,GAAG,QAAQ,CAAW,MAAK;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AAAE,YAAA,OAAO,EAAE;AAEnC,QAAA,OAAO,CAAC;AACN,gBAAA,MAAM,EAAE,IAAI,CAAC,YAAY,EAAG;AAC5B,gBAAA,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE;AACzC,gBAAA,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE;AACvC,gBAAA,cAAc,EAAE,IAAI,CAAC,cAAc;AACpC,aAAA,CAAC;AACJ,KAAC,CAAC;IAEF,SAAS,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE;;AAG5B,IAAA,WAAW,CAAC,MAAwB,EAAA;AAClC,QAAA,IAAI,CAAC,iBAAiB,GAAG,WAAW,IAAI,MAAM,GAAG,MAAM,CAAC,SAAS,GAAG,SAAS;AAC7E,QAAA,IAAI,CAAC,gBAAgB,GAAG,UAAU,IAAI,MAAM,GAAG,MAAM,CAAC,QAAQ,GAAG,SAAS;AAC1E,QAAA,IAAI,CAAC,eAAe,GAAG,SAAS,IAAI,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,SAAS;;AAGvE,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;AAChC,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;AAC/B,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AAE9B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC;AAC7B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;;IAG7B,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;;IAG7B,MAAM,aAAa,CAAC,MAAsC,EAAA;AACxD,QAAA,IAAI,QAAoC;AACxC,QAAA,IAAI,aAAsC;QAE1C,QAAQ,MAAM;AACZ,YAAA,KAAK,SAAS;AACZ,gBAAA,QAAQ,GAAG,IAAI,CAAC,iBAAiB;AACjC,gBAAA,aAAa,GAAG,IAAI,CAAC,gBAAgB;gBACrC;AACF,YAAA,KAAK,QAAQ;AACX,gBAAA,QAAQ,GAAG,IAAI,CAAC,gBAAgB;AAChC,gBAAA,aAAa,GAAG,IAAI,CAAC,eAAe;gBACpC;AACF,YAAA,KAAK,OAAO;AACV,gBAAA,QAAQ,GAAG,IAAI,CAAC,eAAe;AAC/B,gBAAA,aAAa,GAAG,IAAI,CAAC,cAAc;gBACnC;;QAGJ,IAAI,CAAC,QAAQ,EAAE;YACb,IAAI,CAAC,WAAW,EAAE;YAClB;;AAGF,QAAA,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAEvB,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,QAAQ,EAAE;;AAGzB,YAAA,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE;AACxB,gBAAA,MAAM,cAAc,CAAC,MAAM,CAAC;;;AAI9B,YAAA,IAAI,MAAM,YAAY,OAAO,EAAE;AAC7B,gBAAA,MAAM,MAAM;;;;QAId,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,CAAA,mBAAA,EAAsB,MAAM,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC;;gBAC7C;AACR,YAAA,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;YACxB,IAAI,CAAC,WAAW,EAAE;;;wGArGX,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFlB,MAAM,EAAA,CAAA;;4FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCFY,kBAAkB,CAAA;AACV,IAAA,YAAY,GAA4B,MAAM,CAAC,EAAE,CAAC;AAClD,IAAA,eAAe,GAAqB,IAAI,GAAG,EAAE;;IAG7C,wBAAwB,GAAG,IAAI;;IAG/B,0BAA0B,GAAG,QAAQ;;AAGrC,IAAA,YAAY,GAA4B,MAAM,CAAC,KAAK,CAAC;AACrD,IAAA,YAAY,GAA2C,MAAM,CAAC,IAAI,CAAC;AACnE,IAAA,eAAe,GAA4B,MAAM,CAAC,KAAK,CAAC;AACxD,IAAA,eAAe,GAA4B,MAAM,CAAC,KAAK,CAAC;;IAGzE,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;;IAG5C,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IAC5C,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IAC5C,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;IACxD,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;IAExD,SAAS,GAAA;AACL,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE;;AAG9B,IAAA,UAAU,CAAC,MAAuB,EAAA;AAC9B,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE;;AAGnC,QAAA,MAAM,gBAAgB,GAAG,UAAU,IAAI,MAAM,GAAG,MAAM,CAAC,QAAQ,GAAG,SAAS;AAC3E,QAAA,MAAM,gBAAgB,GAAG,UAAU,IAAI,MAAM,GAAG,MAAM,CAAC,QAAQ,GAAG,SAAS;;QAG3E,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,IAAI,CAAC,0BAA0B;AAEnF,QAAA,MAAM,KAAK,GAAU;AACjB,YAAA,EAAE,EAAE,OAAO;YACX,MAAM;AACN,YAAA,eAAe,EAAE,KAAK;AACtB,YAAA,eAAe,EAAE,KAAK;YACtB,gBAAgB;YAChB,gBAAgB;AAChB,YAAA,gBAAgB;AAChB,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG;SACtB;;AAGD,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,CAAC;;;;AAKtD,QAAA,MAAM,eAAe,GAAG,MAAM,CAAC,SAAS,KAAK,IAAI;AAC7C,aAAC,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,KAAK,CAAC;QAE7D,IAAI,eAAe,EAAE;;YAEjB,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC,wBAAwB;AAEpE,YAAA,MAAM,OAAO,GAAG,UAAU,CAAC,MAAK;AAC5B,gBAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;AAC5B,gBAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC;aACvC,EAAE,KAAK,CAAC;YAET,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC;;AAG9C,QAAA,OAAO,OAAO;;AAGlB,IAAA,cAAc,CAAC,OAAe,EAAA;;QAE1B,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YACnC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC/C,YAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC;;QAGxC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,IAC3B,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,CAC/C;;IAGL,cAAc,GAAA;;AAEV,QAAA,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;AAC9D,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;AAE5B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;;AAG7B,IAAA,MAAM,kBAAkB,CAAC,OAAe,EAAE,MAA2B,EAAA;AACjE,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC;AAC7D,QAAA,IAAI,CAAC,KAAK;YAAE;AAEZ,QAAA,IAAI,QAAkD;AACtD,QAAA,IAAI,eAAsD;QAE1D,QAAQ,MAAM;AACV,YAAA,KAAK,QAAQ;AACT,gBAAA,QAAQ,GAAG,KAAK,CAAC,gBAAgB;gBACjC,eAAe,GAAG,iBAAiB;gBACnC;AACJ,YAAA,KAAK,QAAQ;AACT,gBAAA,QAAQ,GAAG,KAAK,CAAC,gBAAgB;gBACjC,eAAe,GAAG,iBAAiB;gBACnC;;QAGR,IAAI,QAAQ,EAAE;;AAEV,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,IAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,eAAe,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,CAC5E;AAED,YAAA,IAAI;gBACA,MAAM,QAAQ,EAAE;;YAClB,OAAO,KAAK,EAAE;gBACZ,OAAO,CAAC,KAAK,CAAC,CAAA,mBAAA,EAAsB,MAAM,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC;;oBAC/C;;AAEN,gBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,IAAG;AAC9B,oBAAA,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAC9B,CAAC,CAAC,EAAE,KAAK,OAAO,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,eAAe,GAAG,KAAK,EAAE,GAAG,CAAC,CAC5D;AACD,oBAAA,OAAO,aAAa;AACxB,iBAAC,CAAC;AAEF,gBAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;;;aAE7B;AACH,YAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;;;;IAKpC,UAAU,GAAA;QACN,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;;;IAI/B,MAAM,aAAa,CAAC,MAA2B,EAAA;AAC3C,QAAA,IAAI,QAAkD;AACtD,QAAA,IAAI,aAAsC;QAE1C,QAAQ,MAAM;AACV,YAAA,KAAK,QAAQ;gBACT,QAAQ,GAAG,UAAU,KAAK,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE;AAC/C,sBAAG,IAAI,CAAC,YAAY,EAAU,CAAC;sBAC7B,SAAS;AACf,gBAAA,aAAa,GAAG,IAAI,CAAC,eAAe;gBACpC;AACJ,YAAA,KAAK,QAAQ;gBACT,QAAQ,GAAG,UAAU,KAAK,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE;AAC/C,sBAAG,IAAI,CAAC,YAAY,EAAU,CAAC;sBAC7B,SAAS;AACf,gBAAA,aAAa,GAAG,IAAI,CAAC,eAAe;gBACpC;;QAGR,IAAI,QAAQ,EAAE;AACV,YAAA,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,YAAA,IAAI;gBACA,MAAM,QAAQ,EAAE;;YAClB,OAAO,KAAK,EAAE;gBACZ,OAAO,CAAC,KAAK,CAAC,CAAA,mBAAA,EAAsB,MAAM,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC;;oBAC/C;AACN,gBAAA,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;gBACxB,IAAI,CAAC,UAAU,EAAE;;;aAElB;YACH,IAAI,CAAC,UAAU,EAAE;;;wGAhLhB,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAFf,MAAM,EAAA,CAAA;;4FAET,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE,MAAM;AACrB,iBAAA;;;ACJD;AACA;AACA;AACA;;ACJA;;AAEG;AAEH;AACA;AACA;AAgCA;AACA;AAGA;AACA;AAEA;;AC7CA;;AAEG;;;;"}
@@ -23,6 +23,7 @@ export interface TableColumn<T> {
23
23
  isDateTimeText?: boolean;
24
24
  isFirstWord?: boolean;
25
25
  isLink?: boolean;
26
+ isPhoneEcuadorian?: boolean;
26
27
  styles?: {
27
28
  [key: string]: string;
28
29
  };
@@ -31,6 +32,9 @@ export interface TableColumn<T> {
31
32
  expandTemplate?: (row: T) => string;
32
33
  extraSearchFields?: (keyof T | string)[];
33
34
  hidden?: boolean;
35
+ rowColorCondition?: {
36
+ [value: string]: 'primary' | 'success' | 'error' | 'warning' | 'info';
37
+ };
34
38
  }
35
39
  export type SortDirection = 'none' | 'asc' | 'desc';
36
40
  export type LoadingState = 'idle' | 'loading' | 'success' | 'error';
@@ -25,6 +25,10 @@ export declare class JIconsService {
25
25
  sun: import("lucide-angular").LucideIconData;
26
26
  moon: import("lucide-angular").LucideIconData;
27
27
  loading: import("lucide-angular").LucideIconData;
28
+ firstPage: import("lucide-angular").LucideIconData;
29
+ prevPage: import("lucide-angular").LucideIconData;
30
+ nextPage: import("lucide-angular").LucideIconData;
31
+ lastPage: import("lucide-angular").LucideIconData;
28
32
  };
29
33
  constructor();
30
34
  static ɵfac: i0.ɵɵFactoryDeclaration<JIconsService, never>;
@@ -26,26 +26,38 @@ export declare class JCalendarService {
26
26
  months: number;
27
27
  days: number;
28
28
  };
29
+ /**
30
+ * Format a date string to 'DD/MM/YYYY'.
31
+ * @param date The date string in 'YYYY-MM-DD' format.
32
+ * @returns The formatted date string.
33
+ */
34
+ formatDateStringToDMY(date: string): string;
35
+ /**
36
+ * Format a Date object to 'DD/MM/YYYY'.
37
+ * @param date The Date object to format.
38
+ * @returns The formatted date string.
39
+ */
40
+ formatDateToDMY(date: Date): string;
29
41
  /**
30
42
  * Format a date string to a more readable format.
31
43
  * @param date The date string in 'YYYY-MM-DD' format.
32
44
  * @param month Optional parameter to add to the month name.
33
45
  * @returns A formatted date string in the format 'DD de MMMM del YYYY'.
34
46
  */
35
- formatearFechaString(date: string, month?: number): string;
47
+ formatDateStringToLong(date: string, month?: number): string;
36
48
  /**
37
49
  * Format a Date object to a string in the format 'DD de MMMM del YYYY'.
38
50
  * @param date The Date object to format.
39
51
  * @param month Optional parameter to add to the month name.
40
52
  * @returns A formatted date string.
41
53
  */
42
- formatearFechaDate(date: Date, month?: number): string;
54
+ formatDateToLong(date: Date, month?: number): string;
43
55
  /**
44
56
  * Parse a date string in the format "dd de MMMM del yyyy" to "yyyy-MM-dd".
45
57
  * @param fechaStr The date string to parse.
46
58
  * @returns The parsed date string in "yyyy-MM-dd" format or null if invalid.
47
59
  */
48
- parseFechaString(fechaStr: string): string | null;
60
+ parseDateString(fechaStr: string): string | null;
49
61
  /**
50
62
  * Format a date to "MMM YY" format.
51
63
  * @param date The date to format, can be a Date object.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tailjng",
3
- "version": "0.0.18",
3
+ "version": "0.0.19",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^19.2.0",
6
6
  "@angular/core": "^19.2.0",
@@ -0,0 +1,69 @@
1
+ <div class="flex flex-col sm:flex-row justify-between items-center gap-5">
2
+
3
+ <div class="text-sm text-gray-700 dark:text-gray-300">
4
+ Mostrando {{ totalItems ? startIndex + 1 : 0 }} a {{ Math.min(endIndex + 1, totalItems) }} de {{ totalItems }}
5
+ registros
6
+ </div>
7
+
8
+ <div class="flex space-x-1 justify-center items-center">
9
+
10
+ <!-- First page -->
11
+ <JButton onKeyPress
12
+ [icon]="iconsService.icons.firstPage"
13
+ [iconSize]="16"
14
+ (click)="goToFirstPage()"
15
+ [disabled]="currentPage === 1 || isLoading"
16
+ [isLoading]="isButtonLoading('first')"
17
+ classes="secondary h-[35px]"
18
+ [class.disabled]="currentPage === 1 || isLoading"
19
+ />
20
+
21
+ <!-- Previous page -->
22
+ <JButton onKeyPress
23
+ [icon]="iconsService.icons.prevPage"
24
+ [iconSize]="16"
25
+ (click)="goToPreviousPage()"
26
+ [disabled]="currentPage === 1 || isLoading"
27
+ classes="secondary h-[35px]"
28
+ [isLoading]="isButtonLoading('prev')"
29
+ [class.disabled]="currentPage === 1 || isLoading"
30
+ />
31
+
32
+ <!-- Page numbers -->
33
+ @for (page of pages; track page) {
34
+ <JButton onKeyPress
35
+ [text]="page"
36
+ [iconSize]="10"
37
+ (click)="onPageChange(page)"
38
+ classes="secondary h-[30px]"
39
+ [disabled]="currentPage === page || isLoading"
40
+ [isLoading]="isButtonLoading(page)"
41
+ [ngClasses]="{ 'primary' : currentPage === page }"
42
+ />
43
+ }
44
+
45
+ <!-- Next page -->
46
+ <JButton onKeyPress
47
+ [icon]="iconsService.icons.nextPage"
48
+ [iconSize]="16"
49
+ (click)="goToNextPage()"
50
+ [disabled]="currentPage === totalPages || isLoading"
51
+ classes="secondary h-[35px]"
52
+ [isLoading]="isButtonLoading('next')"
53
+ [class.disabled]="currentPage === totalPages || isLoading"
54
+ />
55
+
56
+ <!-- Last page -->
57
+ <JButton onKeyPress
58
+ [icon]="iconsService.icons.lastPage"
59
+ [iconSize]="16"
60
+ (click)="goToLastPage()"
61
+ [disabled]="currentPage === totalPages || isLoading"
62
+ classes="secondary h-[35px]"
63
+ [isLoading]="isButtonLoading('last')"
64
+ [class.disabled]="currentPage === totalPages || isLoading"
65
+ />
66
+
67
+ </div>
68
+
69
+ </div>
@@ -0,0 +1,116 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import { LucideAngularModule } from 'lucide-angular';
3
+ import { JButtonComponent } from '../../button/button.component';
4
+ import { JIconsService } from 'tailjng';
5
+
6
+ @Component({
7
+ selector: 'JCompletePaginator',
8
+ imports: [LucideAngularModule, JButtonComponent],
9
+ templateUrl: './complete-paginator.component.html',
10
+ styleUrl: './complete-paginator.component.scss'
11
+ })
12
+ export class JCompletePaginatorComponent {
13
+
14
+ Math = Math;
15
+
16
+ loadingButton: 'first' | 'prev' | 'next' | 'last' | number | null = null;
17
+
18
+ @Input() pages: number[] = [];
19
+ @Output() pageChange = new EventEmitter<number>();
20
+
21
+ // Paginator
22
+ @Input() currentPage = 1;
23
+ @Input() itemsPerPageOptions = [10];
24
+ @Input() itemsPerPage = this.itemsPerPageOptions[0];
25
+ @Input() totalItems = 0;
26
+
27
+
28
+ @Input() isLoading = false;
29
+
30
+ get startIndex(): number {
31
+ return (this.currentPage - 1) * this.itemsPerPage;
32
+ }
33
+
34
+ get endIndex(): number {
35
+ return Math.min(this.startIndex + this.itemsPerPage - 1, this.totalItems - 1);
36
+ }
37
+
38
+ get totalPages(): number {
39
+ return Math.ceil(this.totalItems / this.itemsPerPage);
40
+ }
41
+
42
+ constructor(public readonly iconsService: JIconsService) { }
43
+
44
+
45
+ /**
46
+ * Change page with loading state
47
+ * @param page
48
+ */
49
+ onPageChange(page: number) {
50
+ if (page >= 1 && page <= this.totalPages && page !== this.currentPage) {
51
+ this.loadingButton = page;
52
+ this.currentPage = page;
53
+ this.pageChange.emit(this.currentPage);
54
+ }
55
+ }
56
+
57
+
58
+
59
+ /**
60
+ * Go to the first page
61
+ */
62
+ goToFirstPage() {
63
+ if (!this.isLoading && this.currentPage !== 1) {
64
+ this.loadingButton = 'first';
65
+ this.onPageChange(1);
66
+ }
67
+ }
68
+
69
+
70
+
71
+ /**
72
+ * Go to the previous page
73
+ */
74
+ goToPreviousPage() {
75
+ if (!this.isLoading && this.currentPage > 1) {
76
+ this.loadingButton = 'prev';
77
+ this.onPageChange(this.currentPage - 1);
78
+ }
79
+ }
80
+
81
+
82
+
83
+ /**
84
+ * Go to the next page
85
+ */
86
+ goToNextPage() {
87
+ if (!this.isLoading && this.currentPage < this.totalPages) {
88
+ this.loadingButton = 'next';
89
+ this.onPageChange(this.currentPage + 1);
90
+ }
91
+ }
92
+
93
+
94
+
95
+ /**
96
+ * Go to the last page
97
+ */
98
+ goToLastPage() {
99
+ if (!this.isLoading && this.currentPage !== this.totalPages) {
100
+ this.loadingButton = 'last';
101
+ this.onPageChange(this.totalPages);
102
+ }
103
+ }
104
+
105
+
106
+
107
+ /**
108
+ * Check if the button is in a loading state
109
+ * @param button The button to check
110
+ * @returns True if the button is loading, false otherwise
111
+ */
112
+ isButtonLoading(button: 'first' | 'prev' | 'next' | 'last' | number): boolean {
113
+ return this.isLoading && this.loadingButton === button;
114
+ }
115
+
116
+ }
@@ -5,9 +5,8 @@ import { JInputComponent } from '../input/input/input.component';
5
5
  import { JRangeInputComponent } from '../input/input-range/range-input.component';
6
6
  import { JButtonComponent } from '../button/button.component';
7
7
  import { JLabelComponent } from '../label/label.component';
8
- import { JIconsService, JThemeService, ThemeMode } from 'tailjng';
8
+ import { ColorPosition, GeneratedColors, JIconsService, JThemeService, ThemeMode } from 'tailjng';
9
9
  import { JContainerFormComponent } from '../form/form-container/container-form.component';
10
- import { ColorPosition, GeneratedColors } from '../../interfaces/theme/theme-generator.interface';
11
10
 
12
11
  @Component({
13
12
  selector: 'JThemeGenerator',