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.
- package/cli/settings/components-list.js +4 -0
- package/cli/settings/header-generator.js +1 -1
- package/fesm2022/tailjng.mjs +58 -19
- package/fesm2022/tailjng.mjs.map +1 -1
- package/lib/interfaces/crud/crud.interface.d.ts +4 -0
- package/lib/services/static/icons.service.d.ts +4 -0
- package/lib/services/transformer/calendar.service.d.ts +15 -3
- package/package.json +1 -1
- package/src/lib/components/paginator/paginator-complete/complete-paginator.component.html +69 -0
- package/src/lib/components/paginator/paginator-complete/complete-paginator.component.scss +0 -0
- package/src/lib/components/paginator/paginator-complete/complete-paginator.component.ts +116 -0
- package/src/lib/components/theme-generator/theme-generator.component.ts +1 -2
package/fesm2022/tailjng.mjs
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
149
|
+
parseDateString(fechaStr) {
|
|
122
150
|
if (!fechaStr)
|
|
123
151
|
return null;
|
|
124
|
-
//
|
|
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
|
|
320
|
+
return this.calendarService.formatDateStringToDMY(`${value}`);
|
|
293
321
|
}
|
|
294
322
|
if (column.isDateText && value !== null) {
|
|
295
|
-
return this.calendarService.
|
|
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
|
-
|
|
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 });
|
package/fesm2022/tailjng.mjs.map
CHANGED
|
@@ -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":"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"}
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
@@ -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>
|
|
File without changes
|
|
@@ -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',
|