tailjng 0.0.45 → 0.0.46
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/header-generator.js +1 -1
- package/fesm2022/tailjng.mjs +3 -1
- package/fesm2022/tailjng.mjs.map +1 -1
- package/lib/interfaces/crud/crud.interface.d.ts +1 -0
- package/lib/services/static/icons.service.d.ts +2 -0
- package/package.json +1 -1
- package/src/lib/components/table/table-crud-complete/complete-crud-table.component.html +12 -0
package/fesm2022/tailjng.mjs
CHANGED
|
@@ -6,7 +6,7 @@ import { es } from 'date-fns/locale';
|
|
|
6
6
|
import { map, isObservable, firstValueFrom, forkJoin } from 'rxjs';
|
|
7
7
|
import * as i1$1 from '@angular/common/http';
|
|
8
8
|
import { HttpParams } from '@angular/common/http';
|
|
9
|
-
import { Clipboard, CircleAlert, Clock, Calendar, EllipsisVertical, Trash, Edit, Pencil, PencilLine, ListRestart, FileUp, Download, MonitorUp, FileSpreadsheet, Cpu, Trash2, Eraser, ArrowDownWideNarrow, Filter, ArrowBigRight, ChevronsRight, ChevronRight, ChevronLeft, ChevronsLeft, Loader2, Moon, Sun, Save, Copy, Search, SquareDashedMousePointer, ChevronsUpDown, ChevronDown, ChevronUp, Eye, Upload, ImageOff, Images, Image, Minimize2, Scan, RefreshCcw, RotateCcw, RotateCw, ZoomOut, ZoomIn, Check, X, CircleHelp, TriangleAlert, CircleX, CircleCheck, Info } from 'lucide-angular';
|
|
9
|
+
import { Link2Off, Link, Clipboard, CircleAlert, Clock, Calendar, EllipsisVertical, Trash, Edit, Pencil, PencilLine, ListRestart, FileUp, Download, MonitorUp, FileSpreadsheet, Cpu, Trash2, Eraser, ArrowDownWideNarrow, Filter, ArrowBigRight, ChevronsRight, ChevronRight, ChevronLeft, ChevronsLeft, Loader2, Moon, Sun, Save, Copy, Search, SquareDashedMousePointer, ChevronsUpDown, ChevronDown, ChevronUp, Eye, Upload, ImageOff, Images, Image, Minimize2, Scan, RefreshCcw, RotateCcw, RotateCw, ZoomOut, ZoomIn, Check, X, CircleHelp, TriangleAlert, CircleX, CircleCheck, Info } from 'lucide-angular';
|
|
10
10
|
import * as FileSaver from 'file-saver';
|
|
11
11
|
import * as ExcelJS from 'exceljs';
|
|
12
12
|
import * as XLSX from 'xlsx';
|
|
@@ -1183,6 +1183,8 @@ class JIconsService {
|
|
|
1183
1183
|
clock: Clock,
|
|
1184
1184
|
circleAlert: CircleAlert,
|
|
1185
1185
|
clipboard: Clipboard,
|
|
1186
|
+
link: Link,
|
|
1187
|
+
linkOff: Link2Off,
|
|
1186
1188
|
};
|
|
1187
1189
|
constructor() { }
|
|
1188
1190
|
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/interfaces/crud/crud.interface.ts","../../../projects/tailjng/src/lib/services/alert/toast-alert.service.ts","../../../projects/tailjng/src/lib/shared/form.shared.ts","../../../projects/tailjng/src/lib/shared/dialog.shared.ts","../../../projects/tailjng/src/lib/services/transformer/calendar.service.ts","../../../projects/tailjng/src/lib/services/transformer/transform.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/report/excel.service.ts","../../../projects/tailjng/src/lib/services/report/excel.filter.service.ts","../../../projects/tailjng/src/lib/services/report/upload.filter.service.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// ]","\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 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","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}","import { Injectable } from '@angular/core';\r\nimport { AbstractControl } from '@angular/forms';\r\nimport { JAlertToastService } from '../services/alert/toast-alert.service';\r\nimport { FormType } from '../interfaces/crud/form.interface';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class JFormShared {\r\n\r\n onResetCallback: (() => void) | null = null;\r\n\r\n isLoading: boolean = false;\r\n openForm: boolean = false;\r\n typeForm: FormType = 'create';\r\n justSubmitted: boolean = false;\r\n\r\n formControls: { [key: string]: AbstractControl | null } = {};\r\n messages: { title: string, description: string } | null = null;\r\n\r\n isVisiblePassword: boolean = false;\r\n\r\n constructor(\r\n private readonly alertToastService: JAlertToastService,\r\n ) { }\r\n\r\n\r\n /**\r\n * Open form\r\n */\r\n onOpen() {\r\n this.openForm = true;\r\n if (this.onResetCallback) {\r\n this.onResetCallback();\r\n }\r\n }\r\n\r\n\r\n\r\n /**\r\n * Close form\r\n */\r\n onClose() {\r\n this.openForm = false;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Validate the change form\r\n * @param validation\r\n * @returns\r\n */\r\n onValidateChange(validation: boolean): boolean {\r\n if (validation) {\r\n this.alertToastService.AlertToast({\r\n type: \"info\",\r\n title: \"Sin cambios...\",\r\n description: \"No se han realizado cambios en el formulario\"\r\n })\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Handle form submit\r\n */\r\n onTableDataLoaded() {\r\n this.isLoading = false;\r\n\r\n if (this.justSubmitted) {\r\n this.openForm = false;\r\n\r\n if (this.messages) {\r\n this.alertToastService.AlertToast({\r\n type: \"success\",\r\n ...this.messages\r\n });\r\n }\r\n\r\n // Reset messages and justSubmitted flag\r\n this.messages = null;\r\n this.justSubmitted = false;\r\n }\r\n }\r\n\r\n\r\n\r\n /**\r\n * Toggle password visibility\r\n * @param event\r\n */\r\n togglePasswordVisibility(event: Event) {\r\n const checkbox = event.target as HTMLInputElement;\r\n\r\n if (checkbox.checked) {\r\n this.isVisiblePassword = true;\r\n } else {\r\n this.isVisiblePassword = false;\r\n }\r\n }\r\n\r\n\r\n\r\n /**\r\n * Converter a formato ISO local\r\n * @param date\r\n * @returns\r\n */\r\n toLocalISO(date?: string | Date): string {\r\n const d = date ? new Date(date) : new Date();\r\n const offset = d.getTimezoneOffset();\r\n const localDate = new Date(d.getTime() - offset * 60000);\r\n return localDate.toISOString().slice(0, 16);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Converter a formato de entrada de fecha\r\n * @param date\r\n * @returns\r\n */\r\n toDateInputValue(date?: string | Date): string {\r\n\r\n if (!date) return '';\r\n const d = new Date(date);\r\n\r\n const utcOffset = d.getUTCDay();\r\n const adjustedDate = new Date(d.getTime() + d.getTimezoneOffset() * 60000);\r\n\r\n return adjustedDate.toISOString().split('T')[0];\r\n }\r\n\r\n\r\n\r\n /**\r\n * Get invalid controls in the form group\r\n * @returns\r\n */\r\n getInvalidControls(formGroup: any): string[] {\r\n const invalidControls: string[] = [];\r\n\r\n Object.keys(formGroup.controls).forEach((controlName) => {\r\n const control = formGroup.get(controlName);\r\n if (control && control.invalid && control.touched) {\r\n invalidControls.push(controlName);\r\n console.error(`${controlName} es inválido. Errores:`, control.errors);\r\n }\r\n });\r\n\r\n return invalidControls;\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 JDialogShared {\r\n\r\n private dialogStates: Record<string, boolean> = {};\r\n\r\n /**\r\n * Open dialog\r\n * @param id \r\n */\r\n onOpen(id: string) {\r\n this.dialogStates[id] = true;\r\n }\r\n\r\n\r\n /**\r\n * Close dialog\r\n * @param id \r\n */\r\n onClose(id: string) {\r\n this.dialogStates[id] = false;\r\n }\r\n\r\n\r\n /**\r\n * Check if dialog is open\r\n * @param id \r\n * @returns \r\n */\r\n isOpen(id: string): boolean {\r\n return this.dialogStates[id] ?? false;\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() + 1;\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 { JCalendarService } from './calendar.service';\r\nimport { CurrencyPipe } from '@angular/common';\r\nimport { TableColumn } from '../../interfaces/crud/crud.interface';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class JTransformService {\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 * Verify if the value is a valid JSON string.\r\n * @param value \r\n * @returns \r\n */\r\n isJson(value: any): boolean {\r\n try {\r\n JSON.parse(value);\r\n return true;\r\n } catch (e) {\r\n return false;\r\n }\r\n }\r\n\r\n\r\n\r\n /**\r\n * Parse a JSON string and return the array.\r\n * @param value The JSON string to parse.\r\n * @returns The parsed array.\r\n */\r\n parseJson(value: string): any[] {\r\n return JSON.parse(value);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Capitalize the first letter of each word and lowercase the rest.\r\n * @param name The input string to capitalize.\r\n * @returns The capitalized string.\r\n */\r\n capitalizeText(name: string): string {\r\n return name\r\n .trim()\r\n .toLowerCase()\r\n .split(' ')\r\n .filter(Boolean)\r\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\r\n .join(' ');\r\n }\r\n\r\n\r\n\r\n /**\r\n * Format a number as currency.\r\n * @param value \r\n * @param currency \r\n * @returns \r\n */\r\n formatCurrency(value: any, currency: string): string | null {\r\n const transformedValue = this.currencyPipe.transform(value, currency, 'symbol', '1.2-2');\r\n return transformedValue ? transformedValue.replace('US', '') : null;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Format a date to DMY format.\r\n * @param value \r\n * @returns \r\n */\r\n formatDate(value: any): string {\r\n return this.calendarService.formatDateStringToDMY(`${value}`);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Format a date to long format.\r\n * @param value \r\n * @returns \r\n */\r\n formatDateText(value: any): string {\r\n return this.calendarService.formatDateStringToLong(`${value}`);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Format a date-time to locale string.\r\n * @param value \r\n * @returns \r\n */\r\n formatDateTime(value: any): string {\r\n return new Date(value).toLocaleString();\r\n }\r\n\r\n\r\n\r\n /**\r\n * Format a date-time to string.\r\n * @param value \r\n * @returns \r\n */\r\n formatDateTimeText(value: any): string {\r\n return new Date(value).toString();\r\n }\r\n\r\n\r\n\r\n /**\r\n * Format a value to relative time.\r\n * @param value \r\n * @returns \r\n */\r\n formatRelativeTime(value: any): string {\r\n return this.calendarService.formatRelativeDate(value);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Format to get the first word of a string.\r\n * @param value \r\n * @returns \r\n */\r\n formatFirstWord(value: string): string {\r\n return value.split(' ')[0];\r\n }\r\n\r\n\r\n\r\n /**\r\n * Format a phone number to Ecuadorian format.\r\n * @param value \r\n * @returns \r\n */\r\n formatPhoneEcuadorian(value: string): string {\r\n if (value.startsWith('+593')) {\r\n const restOfNumber = value.slice(4);\r\n return `+593 ${restOfNumber}`;\r\n }\r\n if (value.startsWith('0')) {\r\n return `+593 ${value.replace(/^0/, '')}`;\r\n }\r\n if (value.startsWith('9')) {\r\n return `+593 ${value}`;\r\n }\r\n return value;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Clean value based on the column type.\r\n * @param value \r\n * @param column \r\n * @returns \r\n */\r\n cleanValue(value: any, column: TableColumn<any>): any {\r\n let cleaned = value;\r\n\r\n if (typeof cleaned === 'string') {\r\n cleaned = cleaned.trim();\r\n }\r\n\r\n return cleaned;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Parse a currency string to number.\r\n * @param value \r\n * @returns \r\n */\r\n parseCurrency(value: string): number | null {\r\n return value ? parseFloat(value.replace(/[^\\d,.-]/g, '').replace(',', '.')) : null;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Parse a date text to ISO format.\r\n * @param value \r\n * @returns \r\n */\r\n parseDateText(value: string): any {\r\n const parsedDate = this.calendarService.parseDateString(value);\r\n return parsedDate ?? value;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Parse a date to ISO format.\r\n * @param value \r\n * @returns \r\n */\r\n parseDate(value: string): any {\r\n const date = new Date(value);\r\n return isNaN(date.getTime()) ? value : date.toISOString().substring(0, 10);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Parse a date-time to ISO format.\r\n * @param value \r\n * @returns \r\n */\r\n parseDateTime(value: string): any {\r\n const date = new Date(value);\r\n return isNaN(date.getTime()) ? value : date.toISOString();\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { TableColumn } from '../../interfaces/crud/crud.interface';\r\nimport { JTransformService } from '../transformer/transform.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class JConverterCrudService {\r\n\r\n constructor(\r\n private readonly transformService: JTransformService,\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 if (column.isdollar && value !== null) {\r\n return this.transformService.formatCurrency(value, 'USD');\r\n }\r\n\r\n if (column.isCurrency && value !== null) {\r\n return this.transformService.formatCurrency(value, 'USD');\r\n }\r\n\r\n if (column.isDate && value !== null) {\r\n return this.transformService.formatDate(value);\r\n }\r\n\r\n if (column.isDateText && value !== null) {\r\n return this.transformService.formatDateText(value);\r\n }\r\n\r\n if (column.isDateTime && value !== null) {\r\n return this.transformService.formatDateTime(value);\r\n }\r\n\r\n if (column.isDateTimeText && value !== null) {\r\n return this.transformService.formatDateTimeText(value);\r\n }\r\n\r\n if (column.isRelativeTime && value !== null) {\r\n return this.transformService.formatRelativeTime(value);\r\n }\r\n\r\n if (column.isFirstWord && value !== null) {\r\n return this.transformService.formatFirstWord(value);\r\n }\r\n\r\n if (column.isPhoneEcuadorian && value !== null) {\r\n return this.transformService.formatPhoneEcuadorian(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 = this.transformService.cleanValue(value, column);\r\n\r\n if (column.isdollar || column.isCurrency) {\r\n return this.transformService.parseCurrency(cleaned);\r\n }\r\n\r\n if (column.isDateText) {\r\n return this.transformService.parseDateText(cleaned);\r\n }\r\n\r\n if (column.isDate) {\r\n return this.transformService.parseDate(cleaned);\r\n }\r\n\r\n if (column.isDateTime || column.isDateTimeText) {\r\n return this.transformService.parseDateTime(cleaned);\r\n }\r\n\r\n if (column.isRelativeTime || 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/params.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 urlBase Base URL for the request.\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>({ urlBase, endpoint, params }: { urlBase?: string, endpoint: string, params?: Params }): Observable<ApiResponse<T>> {\r\n const url = urlBase ? `${urlBase}/${endpoint}` : `${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 urlBase Base URL for the request.\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>({ urlBase, endpoint, id }: { urlBase?: string, endpoint: string, id: number }): Observable<T> {\r\n const url = urlBase ? `${urlBase}/${endpoint}` : `${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 urlBase Base URL for the request.\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>({ urlBase, endpoint, data }: { urlBase?: string, endpoint: string, data: T }): Observable<ApiResponse<T>> {\r\n const url = urlBase ? `${urlBase}/${endpoint}` : `${this.config.urlBase}/${endpoint}`;\r\n return this.http.post<ApiResponse<T>>(url, data);\r\n }\r\n\r\n\r\n /**\r\n * Method to update a record in an endpoint.\r\n * @param urlBase Base URL for the request.\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>({ urlBase, endpoint, id, data }: { urlBase?: string, endpoint: string, id: number, data: T }): Observable<ApiResponse<T>> {\r\n const url = urlBase ? `${urlBase}/${endpoint}` : `${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 * Method to delete a record from an endpoint.\r\n * @param urlBase Base URL for the request.\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>({ urlBase, endpoint, id }: { urlBase?: string, endpoint: string, id: number }): Observable<ApiResponse<T>> {\r\n const url = urlBase ? `${urlBase}/${endpoint}` : `${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 urlBase Base URL for the request.\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>({ urlBase, endpoint, id, data }: { urlBase?: string, endpoint: string, id: number, data: EnableBoolean<T> }): Observable<ApiResponse<T>> {\r\n const url = urlBase ? `${urlBase}/${endpoint}` : `${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 * Method to create multiple records in an endpoint.\r\n * @param urlBase Base URL for the request.\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>({ urlBase, endpoint, data }: { urlBase?: string, endpoint: string, data: T[] }): Observable<ApiResponse<T[]>> {\r\n const url = urlBase ? `${urlBase}/${endpoint}/bulk` : `${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 { ArrowBigRight, ArrowDownWideNarrow, Calendar, Check, ChevronDown, ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight, ChevronsUpDown, ChevronUp, CircleAlert, CircleCheck, CircleHelp, CircleX, Clipboard, Clock, Copy, Cpu, Download, Edit, EllipsisVertical, Eraser, Eye, FileSpreadsheet, FileUp, Filter, Image, ImageOff, Images, Info, ListRestart, Loader2, Minimize2, MonitorUp, Moon, Pencil, PencilLine, RefreshCcw, RotateCcw, RotateCw, Save, Scan, Search, SquareDashedMousePointer, Sun, Trash, Trash2, 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 img: Image,\r\n imgs: Images,\r\n imageOff: ImageOff,\r\n upload: Upload,\r\n view: Eye,\r\n chevronUp: ChevronUp,\r\n chevronDown: ChevronDown,\r\n chevronsUpDown: ChevronsUpDown,\r\n squareDashedMousePointer: SquareDashedMousePointer,\r\n search: Search,\r\n copy: Copy,\r\n save: Save,\r\n sun: Sun,\r\n moon: Moon,\r\n loading: Loader2,\r\n\r\n firstPage: ChevronsLeft,\r\n prevPage: ChevronLeft,\r\n nextPage: ChevronRight,\r\n lastPage: ChevronsRight,\r\n\r\n arrowBigRight: ArrowBigRight,\r\n\r\n filter: Filter,\r\n filterList: ArrowDownWideNarrow,\r\n eraser: Eraser,\r\n transh: Trash2,\r\n default: Cpu,\r\n fileSpreadsheet: FileSpreadsheet,\r\n monitorUp: MonitorUp,\r\n download: Download,\r\n fileUp: FileUp,\r\n listRestart: ListRestart,\r\n editRowLine: PencilLine,\r\n editRow: Pencil,\r\n\r\n edit: Edit,\r\n delete: Trash,\r\n ellipsisVertical: EllipsisVertical,\r\n calendar: Calendar,\r\n clock: Clock,\r\n circleAlert: CircleAlert,\r\n clipboard: Clipboard,\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 } from \"@angular/core\"\r\nimport * as FileSaver from \"file-saver\"\r\nimport * as ExcelJS from \"exceljs\"\r\nimport { HttpClient } from \"@angular/common/http\"\r\nimport { JConverterCrudService } from \"../crud/converter-crud.service\"\r\nimport { TableColumn } from \"../../interfaces/crud/crud.interface\"\r\n\r\ninterface ExportFileExcel {\r\n data: any[]\r\n headersColumns: any\r\n nameReport: string,\r\n excelFileName: string,\r\n nameSheet: string,\r\n catalogs?: Record<string, string[]>\r\n}\r\n\r\n@Injectable({\r\n providedIn: \"root\",\r\n})\r\nexport class JExcelService {\r\n \r\n // Init data\r\n initData = 2;\r\n\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly converterService: JConverterCrudService,\r\n ) { }\r\n\r\n // Download file\r\n async exportAsExcelFile({ data, headersColumns, nameReport, excelFileName, nameSheet, catalogs }: ExportFileExcel): Promise<void> {\r\n\r\n const workbook = new ExcelJS.Workbook();\r\n const worksheet = workbook.addWorksheet(nameSheet);\r\n\r\n const headers = this.createHeaders(headersColumns);\r\n\r\n // Header title\r\n const titleRow = worksheet.getRow(this.initData - 1);\r\n const totalColumns = headers.length;\r\n const startCol = 1;\r\n const endCol = totalColumns;\r\n\r\n worksheet.mergeCells(this.initData - 1, startCol, this.initData - 1, endCol);\r\n titleRow.getCell(1).value = nameReport;\r\n titleRow.getCell(1).alignment = { vertical: \"middle\", horizontal: \"center\", wrapText: true };\r\n titleRow.getCell(1).font = { bold: true, size: 14, color: { argb: \"ffffff\" } };\r\n titleRow.getCell(1).fill = { type: \"pattern\", pattern: \"solid\", fgColor: { argb: \"2d3f5e\" } };\r\n titleRow.eachCell((cell: any) => {\r\n cell.border = this.borderStyles;\r\n });\r\n\r\n\r\n // Header table\r\n worksheet.columns = headers.map((col) => ({\r\n key: col.key,\r\n width: col.width,\r\n }));\r\n\r\n\r\n // Position header\r\n const headerRow = worksheet.getRow(this.initData);\r\n headers.forEach((col, index) => {\r\n const headerText = col.header.toUpperCase();\r\n headerRow.getCell(index + 1).value = headerText;\r\n headerRow.getCell(index + 1).font = { bold: true, color: { argb: \"ffffff\" } };\r\n headerRow.getCell(index + 1).alignment = { horizontal: \"center\", vertical: \"middle\", wrapText: true };\r\n headerRow.getCell(index + 1).fill = { type: \"pattern\", pattern: \"solid\", fgColor: { argb: \"405883\" } };\r\n headerRow.eachCell((cell: any) => {\r\n cell.border = this.borderStyles;\r\n });\r\n });\r\n\r\n\r\n // Add data\r\n data.forEach((item, index) => {\r\n const row = worksheet.getRow(index + (this.initData + 1));\r\n headers.forEach((col) => {\r\n let value;\r\n\r\n if (col.key === \"index\") {\r\n value = index + 1;\r\n } else if (col.key === \"ID\") {\r\n\r\n const cell = row.getCell(headers.indexOf(col) + 1);\r\n cell.value = item[col.key];\r\n\r\n const columnIndex = headers.indexOf(col) + 1;\r\n if (worksheet.getColumn(columnIndex)) {\r\n worksheet.getColumn(columnIndex).hidden = true;\r\n }\r\n\r\n } else {\r\n value = this.getValue(item, col);\r\n }\r\n\r\n const cell = row.getCell(headers.indexOf(col) + 1);\r\n cell.value = value;\r\n\r\n if (col.align) {\r\n cell.alignment = { horizontal: col.align };\r\n }\r\n });\r\n });\r\n\r\n\r\n if (catalogs && Object.keys(catalogs).length > 0) {\r\n const helpSheet = workbook.addWorksheet(\"Catálogos\");\r\n\r\n helpSheet.columns = [\r\n { header: \"Campo\", key: \"campo\", width: 30 },\r\n { header: \"Valores válidos\", key: \"valores\", width: 50 },\r\n ];\r\n\r\n // Create header files\r\n const headerRow = helpSheet.getRow(1);\r\n headerRow.getCell(1).value = \"CAMPO\";\r\n headerRow.getCell(2).value = \"VALORES VÁLIDOS\";\r\n\r\n [1, 2].forEach((colIndex) => {\r\n const cell: any = headerRow.getCell(colIndex);\r\n cell.font = { bold: true, color: { argb: \"FFFFFF\" } };\r\n cell.fill = { type: \"pattern\", pattern: \"solid\", fgColor: { argb: \"941c81\" } };\r\n cell.alignment = { horizontal: \"center\", vertical: \"middle\", wrapText: true };\r\n cell.border = this.borderStyles;\r\n });\r\n\r\n // Config height\r\n headerRow.height = 20;\r\n\r\n // Add data down heaeder\r\n let rowIndex = 2;\r\n Object.entries(catalogs).forEach(([field, values]) => {\r\n const row = helpSheet.getRow(rowIndex);\r\n row.getCell(1).value = field;\r\n row.getCell(2).value = values.join(\", \");\r\n\r\n [1, 2].forEach((colIndex) => {\r\n const cell: any = row.getCell(colIndex);\r\n cell.alignment = { vertical: \"middle\", horizontal: \"center\", wrapText: true };\r\n cell.border = this.borderStyles;\r\n });\r\n\r\n rowIndex++;\r\n });\r\n\r\n helpSheet.autoFilter = {\r\n from: { row: 1, column: 1 },\r\n to: { row: 1, column: 2 },\r\n };\r\n }\r\n\r\n this.applyAutoFilter(worksheet, headersColumns);\r\n\r\n const buffer = await workbook.xlsx.writeBuffer();\r\n const blob = new Blob([buffer], {\r\n type: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8\",\r\n });\r\n\r\n FileSaver.saveAs(blob, `${excelFileName}.xlsx`);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Create headers for the Excel sheet\r\n * @param columnConfig\r\n * @returns\r\n */\r\n createHeaders(columnConfig: any): any[] {\r\n const headers = Object.keys(columnConfig).map((key) => {\r\n const config = columnConfig[key];\r\n\r\n return {\r\n ...config,\r\n header: config.label,\r\n key: config.key,\r\n width: parseInt(config.styles?.['minWidth'] ?? '100', 10) * 0.15,\r\n align: config.styles?.['text-align'] ?? 'left',\r\n };\r\n });\r\n\r\n // Add column \"N°\"\r\n headers.unshift({\r\n header: 'N°',\r\n key: 'index',\r\n width: 8,\r\n align: 'center',\r\n });\r\n\r\n return headers;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Get values\r\n * @param item\r\n * @param column\r\n * @returns\r\n */\r\n getValue(item: any, column: TableColumn<any>): any {\r\n let value: any;\r\n\r\n if (typeof column.valueGetter === 'function') {\r\n value = column.valueGetter(item);\r\n } else {\r\n const keys = column.key.split('.');\r\n value = item;\r\n\r\n for (const key of keys) {\r\n if (value != null) {\r\n value = value[key];\r\n } else {\r\n value = null;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (value === null || value === undefined) {\r\n return 'S/N';\r\n }\r\n\r\n const formatted = this.converterService.formatData(value, column);\r\n\r\n return formatted ?? value;\r\n }\r\n\r\n\r\n \r\n /**\r\n * Apply styles to the worksheet\r\n * @param worksheet\r\n * @param columnsConfig\r\n */\r\n applyStyles(worksheet: ExcelJS.Worksheet, columnsConfig: any) {\r\n worksheet.columns.forEach((column: any) => {\r\n if (column.key) {\r\n const config = columnsConfig[column.key]\r\n if (config && config.align) {\r\n column.alignment = { horizontal: config.align }\r\n }\r\n }\r\n })\r\n }\r\n\r\n\r\n\r\n /**\r\n * Apply auto filter to the worksheet\r\n * @param worksheet\r\n * @param columnsConfig\r\n */\r\n applyAutoFilter(worksheet: ExcelJS.Worksheet, columnsConfig: any) {\r\n if (Object.keys(columnsConfig).length > 0) {\r\n worksheet.autoFilter = {\r\n from: {\r\n row: this.initData,\r\n column: 1,\r\n },\r\n to: {\r\n row: this.initData,\r\n column: Object.keys(columnsConfig).length,\r\n },\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n /**\r\n * Load image from URL\r\n * @param workbook\r\n * @param worksheet\r\n * @param url\r\n * @param width\r\n * @param height\r\n * @param top\r\n * @param left\r\n * @returns\r\n */\r\n async loadAndAddImage(\r\n workbook: ExcelJS.Workbook,\r\n worksheet: ExcelJS.Worksheet,\r\n url: string,\r\n width: number,\r\n height: number,\r\n top: number,\r\n left: number,\r\n ): Promise<void> {\r\n const response: any = await this.http.get(url, { responseType: \"blob\" }).toPromise()\r\n return new Promise<void>((resolve, reject) => {\r\n const reader = new FileReader()\r\n reader.onloadend = () => {\r\n const base64Image = reader.result as string\r\n const imageId = workbook.addImage({\r\n base64: base64Image,\r\n extension: \"png\",\r\n })\r\n worksheet.addImage(imageId, {\r\n tl: { col: left, row: top },\r\n ext: { width: width, height: height },\r\n })\r\n resolve()\r\n }\r\n reader.onerror = reject\r\n reader.readAsDataURL(response)\r\n })\r\n }\r\n\r\n borderStyles = {\r\n top: { style: \"thin\" },\r\n left: { style: \"thin\" },\r\n bottom: { style: \"thin\" },\r\n right: { style: \"thin\" },\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ExcelFileNameResult } from '../../interfaces/crud/filter.interface';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class JExcelFilterService {\r\n\r\n /**\r\n * Generate name file\r\n * @param columns \r\n * @param filtersSelect \r\n * @param mainEndpoint \r\n * @param params \r\n * @param data \r\n * @param reportName \r\n * @returns \r\n */\r\n generateExcelFileName(columns: any, filtersSelect: any, mainEndpoint: string, params: any, data: any, reportName?: string): ExcelFileNameResult {\r\n\r\n // Verify if there are custom filters (not default ones)\r\n const filtersObj = params?.filter ?? {};\r\n const hasCustomFilters = Object.keys(filtersObj).length > 0;\r\n\r\n // Verify if there is a search term\r\n const searchTerm = params?.search?.trim();\r\n const hasSearch = searchTerm && searchTerm.length > 0;\r\n\r\n // Determine the base report name\r\n const baseReportName = reportName ? `${reportName}` : 'Reporte';\r\n\r\n // If there are no custom filters AND no search, use generic name\r\n if (!hasCustomFilters && !hasSearch) {\r\n const fileName = this.sanitizeFileName(`${baseReportName} - ${this.formatDateForFileName()}`);\r\n\r\n return {\r\n fileName,\r\n nameReport: baseReportName\r\n };\r\n }\r\n\r\n // Array with all descriptions (filters + search)\r\n const allDescriptions: string[] = [];\r\n\r\n // Process custom filters if they exist\r\n if (hasCustomFilters) {\r\n\r\n for (const filterKey in filtersObj) {\r\n if (filtersObj.hasOwnProperty(filterKey)) {\r\n\r\n // Search for filter configuration in filtersSelect\r\n const filterConfig: any = filtersSelect.find((filter: any) => filter.optionValue === filterKey);\r\n\r\n if (filterConfig) {\r\n\r\n // Construct column key, remove 'id_' from filterKey\r\n const prefix = filterKey.replace('id_', '');\r\n const columnKey = `${prefix}.${filterConfig.optionLabel}`;\r\n\r\n // Search for the corresponding column\r\n const column = columns.find((col: any) => col.key === columnKey);\r\n\r\n if (column) {\r\n // Get the descriptive value from the data\r\n const filterValue = filtersObj[filterKey];\r\n let descriptiveValue = filterValue;\r\n\r\n // Search for the descriptive value in the data\r\n if (data && Array.isArray(data) && data.length > 0) {\r\n // Search in the first element that has the filter applied\r\n const matchingItem = data.find((item: any) => item[filterKey] === filterValue);\r\n\r\n if (matchingItem) {\r\n // Extract the descriptive value using the relationship structure\r\n // For example: for id_status, search in item.status.name_status\r\n const relationKey = prefix; // 'status' para 'id_status'\r\n\r\n if (matchingItem[relationKey] && matchingItem[relationKey][filterConfig.optionLabel]) {\r\n descriptiveValue = matchingItem[relationKey][filterConfig.optionLabel];\r\n }\r\n }\r\n }\r\n\r\n // Create description for each filter using the descriptive value\r\n const description = `${column.label} (${descriptiveValue})`;\r\n allDescriptions.push(description);\r\n\r\n } else {\r\n\r\n // Fallback: use the filter's placeholder or the filterKey\r\n const fallbackLabel = filterConfig.placeholder ?? filterKey;\r\n const description = `${fallbackLabel} ${filtersObj[filterKey]}`;\r\n allDescriptions.push(description);\r\n\r\n }\r\n } else {\r\n\r\n // Check if it is the default sortBy (id_ + mainEndpoint)\r\n const defaultSortKey = `id_${mainEndpoint}`;\r\n\r\n if (filterKey !== defaultSortKey) {\r\n\r\n // If it is not the default sort, add it as a generic filter\r\n const description = `${filterKey} ${filtersObj[filterKey]}`;\r\n allDescriptions.push(description);\r\n\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Process search if it exists\r\n if (hasSearch) {\r\n // Add the search description without problematic quotes\r\n const searchDescription = `Search ${searchTerm}`;\r\n allDescriptions.push(searchDescription);\r\n }\r\n\r\n // Generate file name with filters and/or search\r\n const descriptionsString = allDescriptions.length > 0 ? ` - ${allDescriptions.join(' - ')}` : '';\r\n const fileName = this.sanitizeFileName(`${baseReportName}${descriptionsString} - ${this.formatDateForFileName()}`);\r\n\r\n return {\r\n fileName,\r\n nameReport: baseReportName\r\n };\r\n }\r\n\r\n\r\n\r\n /**\r\n * Sanitize file name\r\n * @param fileName\r\n * @returns\r\n */\r\n sanitizeFileName(fileName: string): string {\r\n return fileName\r\n .replace(/[<>:\"/\\\\|?*]/g, '') // Remove completely problematic characters\r\n .replace(/\\s+/g, ' ') // Replace multiple spaces with a single space\r\n .trim() // Remove spaces at the beginning and end\r\n .substring(0, 200); // Limit length to avoid problems\r\n }\r\n\r\n\r\n /**\r\n * Function to format date for file names\r\n * @returns\r\n */\r\n formatDateForFileName(): string {\r\n const now = new Date();\r\n const day = now.getDate().toString().padStart(2, '0');\r\n const month = (now.getMonth() + 1).toString().padStart(2, '0');\r\n const year = now.getFullYear();\r\n\r\n return `${day}-${month}-${year}`;\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { Injectable } from '@angular/core';\r\nimport * as XLSX from 'xlsx';\r\nimport { forkJoin, map, Observable } from 'rxjs';\r\nimport { TableColumn } from \"../../interfaces/crud/crud.interface\";\r\nimport { JConverterCrudService } from '../crud/converter-crud.service';\r\nimport { JGenericCrudService } from '../crud/generic-crud.service';\r\nimport { JAlertToastService } from '../alert/toast-alert.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class JUploadFilterService {\r\n\r\n constructor(\r\n private readonly converterService: JConverterCrudService,\r\n private readonly genericService: JGenericCrudService,\r\n private readonly alertToastService: JAlertToastService,\r\n ) { }\r\n\r\n\r\n /**\r\n * Validates the headers of the uploaded file.\r\n * @param headersFromFile Headers from the Excel file.\r\n * @param columns Expected columns in the table.\r\n * @param ignoreKeys Keys to ignore in the validation.\r\n * @param setLoadingFn Function to set the loading state.\r\n * @returns True if the headers are valid, false otherwise.\r\n */\r\n validateHeaders(\r\n headersFromFile: string[],\r\n columns: TableColumn<any>[],\r\n ignoreKeys: string[],\r\n setLoadingFn: (value: boolean) => void\r\n ): boolean {\r\n const expectedHeaders = columns\r\n .filter(col => col.visible && !ignoreKeys.includes(col.key))\r\n .map(col => col.label?.trim().toUpperCase())\r\n .filter(Boolean);\r\n\r\n const fileHeaders = headersFromFile.map(h => h?.trim().toUpperCase());\r\n\r\n const missing = expectedHeaders.filter(h => !fileHeaders.includes(h));\r\n\r\n if (missing.length > 0) {\r\n this.alertToastService.AlertToast({\r\n type: 'error',\r\n title: 'Columnas faltantes',\r\n description: `El archivo Excel no contiene todas las columnas requeridas.\\nFaltan: ${missing.join(', ')}`\r\n });\r\n setLoadingFn(false);\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Gets the header map to keys.\r\n * @param columns Table columns.\r\n * @param ignoreKeys Keys to ignore in the map.\r\n * @returns An object where the keys are the headers and the values are the column keys.\r\n */\r\n getHeaderKeyMap(\r\n columns: TableColumn<any>[],\r\n ignoreKeys: string[] = []\r\n ): Record<string, string> {\r\n const map: Record<string, string> = {};\r\n\r\n columns\r\n .filter(col => col.visible && !ignoreKeys.includes(col.key))\r\n .forEach(col => {\r\n const header = col.label?.trim().toUpperCase();\r\n if (header) {\r\n map[header] = col.key;\r\n }\r\n });\r\n\r\n return map;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Gets the header map to keys.\r\n * @param columns Table columns.\r\n * @param ignoreKeys Keys to ignore in the map.\r\n * @returns An object where the keys are the headers and the values are the column keys.\r\n */\r\n getIdsSelectedData(\r\n button: any\r\n ): Array<Observable<{ key: string, data: any[], mappingInfo: any }>> {\r\n const observables = Object.keys(button.searchListUpload).map((key) => {\r\n const obj = button.searchListUpload[key];\r\n const defaultFilters = obj.defaultFilters ?? {};\r\n\r\n const params = this.genericService.params({\r\n limit: 1000000,\r\n filters: { ...defaultFilters }\r\n });\r\n\r\n return this.genericService.getAll<any>({ endpoint: key, params }).pipe(\r\n map((response) => ({\r\n key,\r\n data: response.data[key] ?? [],\r\n mappingInfo: obj\r\n }))\r\n );\r\n });\r\n\r\n return observables;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Processes the upload of an Excel file.\r\n * @param file Excel file to process.\r\n * @param columns Table columns to validate and map the data.\r\n * @param button Button that contains the search and upload configuration.\r\n * @param afterProcessing Function to execute after processing the file, receives the resulting JSON.\r\n * @param setLoadingFn Function to set the loading state.\r\n * @param clearFileInputFn Function to clear the file input.\r\n */\r\n processExcelUpload(\r\n file: File,\r\n columns: TableColumn<any>[],\r\n button: any,\r\n afterProcessing: (\r\n json: any[],\r\n filteredColumns: TableColumn<any>[],\r\n equivalences: Record<string, Record<string | number, string>>\r\n ) => void,\r\n setLoadingFn: (value: boolean) => void,\r\n clearFileInputFn: () => void\r\n ): void {\r\n setLoadingFn(true);\r\n\r\n const reader = new FileReader();\r\n\r\n reader.onload = (e: any) => {\r\n const data = new Uint8Array(e.target.result);\r\n const workbook = XLSX.read(data, { type: 'array' });\r\n const sheet = workbook.Sheets[workbook.SheetNames[0]];\r\n const jsonRaw = XLSX.utils.sheet_to_json(sheet, { header: 1, defval: 'S/N' });\r\n\r\n const headers = jsonRaw[1] as string[];\r\n const rows = jsonRaw.slice(2);\r\n\r\n // Validate headers\r\n if (!this.validateHeaders(headers, columns, button.ignoreKeyUpload ?? [], setLoadingFn)) {\r\n clearFileInputFn();\r\n return;\r\n }\r\n\r\n // Get the header key map\r\n const mapHeader = this.getHeaderKeyMap(columns, button.ignoreKeyUpload ?? []);\r\n\r\n const json = rows.map(row => {\r\n const obj: any = {};\r\n headers.forEach((header: string, i: number) => {\r\n const key = mapHeader[header.trim().toUpperCase()];\r\n if (key) {\r\n const columnConfig = columns.find(col => col.key === key);\r\n let value = (row as any[])[i];\r\n\r\n if (columnConfig) {\r\n value = this.converterService.parseData(value, columnConfig);\r\n }\r\n\r\n // Force to string if it's an identification field\r\n if (key?.toLowerCase().includes('identification_')) {\r\n if (typeof value === 'number') {\r\n value = value.toString();\r\n }\r\n }\r\n\r\n obj[key] = value;\r\n }\r\n });\r\n return obj;\r\n });\r\n\r\n // Process selected IDs\r\n forkJoin(this.getIdsSelectedData(button)).subscribe({\r\n next: (results) => {\r\n let hasMissing = false;\r\n const missingMessages: string[] = [];\r\n\r\n results.forEach((result) => {\r\n const { key, data, mappingInfo } = result;\r\n\r\n const keyReturn = mappingInfo.keyReturn;\r\n const keyAlternate = mappingInfo.keyAlternate;\r\n const keyColumnSearch = mappingInfo.keyColumnSearch;\r\n const isOptional = mappingInfo.optional ?? false;\r\n\r\n\r\n if (!keyReturn || !keyColumnSearch) return;\r\n\r\n // Get the column label to display in errors\r\n const columnLabel =\r\n columns.find(col => col.key === keyColumnSearch)?.label\r\n ?? keyColumnSearch;\r\n\r\n const missingValues: any[] = [];\r\n\r\n // Iterate over each row of the JSON loaded from Excel\r\n json.forEach(item => {\r\n const currentValue = item[keyColumnSearch];\r\n\r\n if (currentValue !== undefined && currentValue !== null) {\r\n\r\n // For example, from keyColumnSearch = 'status.name_status'\r\n // you get fieldName = 'name_status'\r\n const fieldName = keyColumnSearch.split('.').pop()!;\r\n\r\n // Search for the value in the catalog obtained from the API\r\n const found = data.find((apiItem: any) => {\r\n return apiItem[fieldName] === currentValue;\r\n });\r\n\r\n if (found) {\r\n // If it finds the value in the catalog:\r\n // - delete the textual column (e.g. 'status.name_status')\r\n // - and leave the id (e.g. id_status) in the object\r\n // delete item[keyColumnSearch];\r\n\r\n // If mappingInfo brings keyAlternate, use that field, if not, use keyReturn\r\n const valueToAssign = found[keyAlternate ?? keyReturn];\r\n item[keyReturn] = valueToAssign;\r\n } else {\r\n if (isOptional) {\r\n // If it is optional and does not exist, simply delete the field\r\n delete item[keyColumnSearch];\r\n item[keyReturn] = null;\r\n } else {\r\n // If it is not optional and the value was not found, accumulate it to show an error\r\n missingValues.push(currentValue);\r\n }\r\n }\r\n } else {\r\n // If the value comes empty and is optional, delete the field and leave it as null\r\n if (isOptional) {\r\n delete item[keyColumnSearch];\r\n item[keyReturn] = null;\r\n }\r\n }\r\n });\r\n\r\n // If there were values that were not found in the catalog list\r\n if (missingValues.length > 0) {\r\n hasMissing = true;\r\n const uniqueMissing = Array.from(new Set(missingValues));\r\n missingMessages.push(\r\n `No se encontraron coincidencias en la columna [${columnLabel}] para los valores: ${uniqueMissing.join(', ')}`\r\n );\r\n }\r\n });\r\n\r\n // If there were matching errors, show a warning message\r\n if (hasMissing) {\r\n this.alertToastService.AlertToast({\r\n type: 'warning',\r\n title: 'Error al procesar datos',\r\n description: missingMessages.join('\\n'),\r\n autoClose: false\r\n });\r\n clearFileInputFn();\r\n setLoadingFn(false);\r\n return;\r\n }\r\n\r\n console.log('JSON final con IDs:', json);\r\n\r\n // Determine columns present in the Excel file\r\n const fileHeadersUpper = (headers ?? []).map((h: any) => h?.trim().toUpperCase());\r\n\r\n // Generate the mapping of header -> key\r\n this.getHeaderKeyMap(columns, button.ignoreKeyUpload ?? []);\r\n\r\n // Filter columns that are in the Excel file\r\n const filteredColumns = columns.filter(col => {\r\n const header = col.label?.trim().toUpperCase();\r\n return (\r\n col.visible &&\r\n header &&\r\n fileHeadersUpper.includes(header) &&\r\n !button.ignoreKeyUpload.includes(col.key)\r\n );\r\n });\r\n\r\n // Object to store the equivalences\r\n // keyReturn -> { keyColumnSearch: value }\r\n // For example: { id_status: { name_status: 'Activo' } }\r\n const equivalences: Record<string, Record<string | number, string>> = {};\r\n\r\n results.forEach((result) => {\r\n const { data, mappingInfo } = result;\r\n const keyReturn = mappingInfo.keyReturn;\r\n const keyColumnSearch = mappingInfo.keyColumnSearch;\r\n\r\n if (!keyReturn || !keyColumnSearch) return;\r\n\r\n equivalences[keyReturn] = {};\r\n\r\n data.forEach((item: any) => {\r\n const idKey = mappingInfo.keyAlternate ?? keyReturn;\r\n equivalences[keyReturn][item[idKey]] = item[keyColumnSearch.split('.').pop()!];\r\n });\r\n });\r\n\r\n // Execute the callback passing the json and the filtered columns\r\n afterProcessing(json, filteredColumns, equivalences);\r\n\r\n clearFileInputFn();\r\n },\r\n complete: () => {\r\n setLoadingFn(false);\r\n }\r\n });\r\n };\r\n\r\n reader.readAsArrayBuffer(file);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Generates catalogs of valid values for select-type fields.\r\n * @param results Results of the list searches.\r\n * @param columns Table columns.\r\n * @returns A dictionary with fields and their valid values.\r\n */\r\n generateCatalogs(\r\n results: { key: string, data: any[], mappingInfo: any }[],\r\n columns: TableColumn<any>[]\r\n ): Record<string, string[]> {\r\n const catalogs: Record<string, string[]> = {};\r\n\r\n results.forEach(result => {\r\n const { data, mappingInfo } = result;\r\n const keyColumnSearch = mappingInfo.keyColumnSearch;\r\n\r\n if (!keyColumnSearch) return;\r\n\r\n // Get the final field (e.g. name_status)\r\n const fieldName = keyColumnSearch.split('.').pop()!;\r\n\r\n // Find the column to get its label\r\n const colLabel =\r\n columns.find(c => c.key === keyColumnSearch)?.label ?? keyColumnSearch;\r\n\r\n // Map unique values\r\n const values = Array.from(\r\n new Set(\r\n data\r\n .map((item: any) => item[fieldName])\r\n .filter((v: any) => v !== null && v !== undefined)\r\n )\r\n );\r\n\r\n if (values.length > 0) {\r\n catalogs[colLabel.toUpperCase()] = values;\r\n }\r\n });\r\n\r\n return catalogs;\r\n }\r\n\r\n}\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// Interface\r\n// ========================================\r\n\r\nexport * from './lib/interfaces/crud/crud.interface';\r\nexport * from './lib/interfaces/crud/params.interface';\r\nexport * from './lib/interfaces/crud/filter.interface';\r\nexport * from './lib/interfaces/crud/form.interface';\r\nexport * from './lib/interfaces/theme/theme-generator.interface';\r\n\r\n\r\n// ========================================\r\n// Shared\r\n// ========================================\r\n\r\nexport * from './lib/shared/form.shared';\r\nexport * from './lib/shared/dialog.shared';\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\nexport * from './lib/services/transformer/transform.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// Report\r\nexport * from './lib/services/report/excel.service';\r\nexport * from './lib/services/report/excel.filter.service';\r\nexport * from './lib/services/report/upload.filter.service';\r\n\r\n\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":["i1.JAlertToastService","i2.JCalendarService","i1.JTransformService","i1","i2.JParamsHttpService","i3.JConverterCrudService","i2.JConverterCrudService","i1.JConverterCrudService","i2.JGenericCrudService","i3.JAlertToastService"],"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/interfaces/crud/crud.interface.ts","../../../projects/tailjng/src/lib/services/alert/toast-alert.service.ts","../../../projects/tailjng/src/lib/shared/form.shared.ts","../../../projects/tailjng/src/lib/shared/dialog.shared.ts","../../../projects/tailjng/src/lib/services/transformer/calendar.service.ts","../../../projects/tailjng/src/lib/services/transformer/transform.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/report/excel.service.ts","../../../projects/tailjng/src/lib/services/report/excel.filter.service.ts","../../../projects/tailjng/src/lib/services/report/upload.filter.service.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// ]","\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 isLinkImage?: 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 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","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}","import { Injectable } from '@angular/core';\r\nimport { AbstractControl } from '@angular/forms';\r\nimport { JAlertToastService } from '../services/alert/toast-alert.service';\r\nimport { FormType } from '../interfaces/crud/form.interface';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class JFormShared {\r\n\r\n onResetCallback: (() => void) | null = null;\r\n\r\n isLoading: boolean = false;\r\n openForm: boolean = false;\r\n typeForm: FormType = 'create';\r\n justSubmitted: boolean = false;\r\n\r\n formControls: { [key: string]: AbstractControl | null } = {};\r\n messages: { title: string, description: string } | null = null;\r\n\r\n isVisiblePassword: boolean = false;\r\n\r\n constructor(\r\n private readonly alertToastService: JAlertToastService,\r\n ) { }\r\n\r\n\r\n /**\r\n * Open form\r\n */\r\n onOpen() {\r\n this.openForm = true;\r\n if (this.onResetCallback) {\r\n this.onResetCallback();\r\n }\r\n }\r\n\r\n\r\n\r\n /**\r\n * Close form\r\n */\r\n onClose() {\r\n this.openForm = false;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Validate the change form\r\n * @param validation\r\n * @returns\r\n */\r\n onValidateChange(validation: boolean): boolean {\r\n if (validation) {\r\n this.alertToastService.AlertToast({\r\n type: \"info\",\r\n title: \"Sin cambios...\",\r\n description: \"No se han realizado cambios en el formulario\"\r\n })\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Handle form submit\r\n */\r\n onTableDataLoaded() {\r\n this.isLoading = false;\r\n\r\n if (this.justSubmitted) {\r\n this.openForm = false;\r\n\r\n if (this.messages) {\r\n this.alertToastService.AlertToast({\r\n type: \"success\",\r\n ...this.messages\r\n });\r\n }\r\n\r\n // Reset messages and justSubmitted flag\r\n this.messages = null;\r\n this.justSubmitted = false;\r\n }\r\n }\r\n\r\n\r\n\r\n /**\r\n * Toggle password visibility\r\n * @param event\r\n */\r\n togglePasswordVisibility(event: Event) {\r\n const checkbox = event.target as HTMLInputElement;\r\n\r\n if (checkbox.checked) {\r\n this.isVisiblePassword = true;\r\n } else {\r\n this.isVisiblePassword = false;\r\n }\r\n }\r\n\r\n\r\n\r\n /**\r\n * Converter a formato ISO local\r\n * @param date\r\n * @returns\r\n */\r\n toLocalISO(date?: string | Date): string {\r\n const d = date ? new Date(date) : new Date();\r\n const offset = d.getTimezoneOffset();\r\n const localDate = new Date(d.getTime() - offset * 60000);\r\n return localDate.toISOString().slice(0, 16);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Converter a formato de entrada de fecha\r\n * @param date\r\n * @returns\r\n */\r\n toDateInputValue(date?: string | Date): string {\r\n\r\n if (!date) return '';\r\n const d = new Date(date);\r\n\r\n const utcOffset = d.getUTCDay();\r\n const adjustedDate = new Date(d.getTime() + d.getTimezoneOffset() * 60000);\r\n\r\n return adjustedDate.toISOString().split('T')[0];\r\n }\r\n\r\n\r\n\r\n /**\r\n * Get invalid controls in the form group\r\n * @returns\r\n */\r\n getInvalidControls(formGroup: any): string[] {\r\n const invalidControls: string[] = [];\r\n\r\n Object.keys(formGroup.controls).forEach((controlName) => {\r\n const control = formGroup.get(controlName);\r\n if (control && control.invalid && control.touched) {\r\n invalidControls.push(controlName);\r\n console.error(`${controlName} es inválido. Errores:`, control.errors);\r\n }\r\n });\r\n\r\n return invalidControls;\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 JDialogShared {\r\n\r\n private dialogStates: Record<string, boolean> = {};\r\n\r\n /**\r\n * Open dialog\r\n * @param id \r\n */\r\n onOpen(id: string) {\r\n this.dialogStates[id] = true;\r\n }\r\n\r\n\r\n /**\r\n * Close dialog\r\n * @param id \r\n */\r\n onClose(id: string) {\r\n this.dialogStates[id] = false;\r\n }\r\n\r\n\r\n /**\r\n * Check if dialog is open\r\n * @param id \r\n * @returns \r\n */\r\n isOpen(id: string): boolean {\r\n return this.dialogStates[id] ?? false;\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() + 1;\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 { JCalendarService } from './calendar.service';\r\nimport { CurrencyPipe } from '@angular/common';\r\nimport { TableColumn } from '../../interfaces/crud/crud.interface';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class JTransformService {\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 * Verify if the value is a valid JSON string.\r\n * @param value \r\n * @returns \r\n */\r\n isJson(value: any): boolean {\r\n try {\r\n JSON.parse(value);\r\n return true;\r\n } catch (e) {\r\n return false;\r\n }\r\n }\r\n\r\n\r\n\r\n /**\r\n * Parse a JSON string and return the array.\r\n * @param value The JSON string to parse.\r\n * @returns The parsed array.\r\n */\r\n parseJson(value: string): any[] {\r\n return JSON.parse(value);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Capitalize the first letter of each word and lowercase the rest.\r\n * @param name The input string to capitalize.\r\n * @returns The capitalized string.\r\n */\r\n capitalizeText(name: string): string {\r\n return name\r\n .trim()\r\n .toLowerCase()\r\n .split(' ')\r\n .filter(Boolean)\r\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\r\n .join(' ');\r\n }\r\n\r\n\r\n\r\n /**\r\n * Format a number as currency.\r\n * @param value \r\n * @param currency \r\n * @returns \r\n */\r\n formatCurrency(value: any, currency: string): string | null {\r\n const transformedValue = this.currencyPipe.transform(value, currency, 'symbol', '1.2-2');\r\n return transformedValue ? transformedValue.replace('US', '') : null;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Format a date to DMY format.\r\n * @param value \r\n * @returns \r\n */\r\n formatDate(value: any): string {\r\n return this.calendarService.formatDateStringToDMY(`${value}`);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Format a date to long format.\r\n * @param value \r\n * @returns \r\n */\r\n formatDateText(value: any): string {\r\n return this.calendarService.formatDateStringToLong(`${value}`);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Format a date-time to locale string.\r\n * @param value \r\n * @returns \r\n */\r\n formatDateTime(value: any): string {\r\n return new Date(value).toLocaleString();\r\n }\r\n\r\n\r\n\r\n /**\r\n * Format a date-time to string.\r\n * @param value \r\n * @returns \r\n */\r\n formatDateTimeText(value: any): string {\r\n return new Date(value).toString();\r\n }\r\n\r\n\r\n\r\n /**\r\n * Format a value to relative time.\r\n * @param value \r\n * @returns \r\n */\r\n formatRelativeTime(value: any): string {\r\n return this.calendarService.formatRelativeDate(value);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Format to get the first word of a string.\r\n * @param value \r\n * @returns \r\n */\r\n formatFirstWord(value: string): string {\r\n return value.split(' ')[0];\r\n }\r\n\r\n\r\n\r\n /**\r\n * Format a phone number to Ecuadorian format.\r\n * @param value \r\n * @returns \r\n */\r\n formatPhoneEcuadorian(value: string): string {\r\n if (value.startsWith('+593')) {\r\n const restOfNumber = value.slice(4);\r\n return `+593 ${restOfNumber}`;\r\n }\r\n if (value.startsWith('0')) {\r\n return `+593 ${value.replace(/^0/, '')}`;\r\n }\r\n if (value.startsWith('9')) {\r\n return `+593 ${value}`;\r\n }\r\n return value;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Clean value based on the column type.\r\n * @param value \r\n * @param column \r\n * @returns \r\n */\r\n cleanValue(value: any, column: TableColumn<any>): any {\r\n let cleaned = value;\r\n\r\n if (typeof cleaned === 'string') {\r\n cleaned = cleaned.trim();\r\n }\r\n\r\n return cleaned;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Parse a currency string to number.\r\n * @param value \r\n * @returns \r\n */\r\n parseCurrency(value: string): number | null {\r\n return value ? parseFloat(value.replace(/[^\\d,.-]/g, '').replace(',', '.')) : null;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Parse a date text to ISO format.\r\n * @param value \r\n * @returns \r\n */\r\n parseDateText(value: string): any {\r\n const parsedDate = this.calendarService.parseDateString(value);\r\n return parsedDate ?? value;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Parse a date to ISO format.\r\n * @param value \r\n * @returns \r\n */\r\n parseDate(value: string): any {\r\n const date = new Date(value);\r\n return isNaN(date.getTime()) ? value : date.toISOString().substring(0, 10);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Parse a date-time to ISO format.\r\n * @param value \r\n * @returns \r\n */\r\n parseDateTime(value: string): any {\r\n const date = new Date(value);\r\n return isNaN(date.getTime()) ? value : date.toISOString();\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { TableColumn } from '../../interfaces/crud/crud.interface';\r\nimport { JTransformService } from '../transformer/transform.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class JConverterCrudService {\r\n\r\n constructor(\r\n private readonly transformService: JTransformService,\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 if (column.isdollar && value !== null) {\r\n return this.transformService.formatCurrency(value, 'USD');\r\n }\r\n\r\n if (column.isCurrency && value !== null) {\r\n return this.transformService.formatCurrency(value, 'USD');\r\n }\r\n\r\n if (column.isDate && value !== null) {\r\n return this.transformService.formatDate(value);\r\n }\r\n\r\n if (column.isDateText && value !== null) {\r\n return this.transformService.formatDateText(value);\r\n }\r\n\r\n if (column.isDateTime && value !== null) {\r\n return this.transformService.formatDateTime(value);\r\n }\r\n\r\n if (column.isDateTimeText && value !== null) {\r\n return this.transformService.formatDateTimeText(value);\r\n }\r\n\r\n if (column.isRelativeTime && value !== null) {\r\n return this.transformService.formatRelativeTime(value);\r\n }\r\n\r\n if (column.isFirstWord && value !== null) {\r\n return this.transformService.formatFirstWord(value);\r\n }\r\n\r\n if (column.isPhoneEcuadorian && value !== null) {\r\n return this.transformService.formatPhoneEcuadorian(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 = this.transformService.cleanValue(value, column);\r\n\r\n if (column.isdollar || column.isCurrency) {\r\n return this.transformService.parseCurrency(cleaned);\r\n }\r\n\r\n if (column.isDateText) {\r\n return this.transformService.parseDateText(cleaned);\r\n }\r\n\r\n if (column.isDate) {\r\n return this.transformService.parseDate(cleaned);\r\n }\r\n\r\n if (column.isDateTime || column.isDateTimeText) {\r\n return this.transformService.parseDateTime(cleaned);\r\n }\r\n\r\n if (column.isRelativeTime || 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/params.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 urlBase Base URL for the request.\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>({ urlBase, endpoint, params }: { urlBase?: string, endpoint: string, params?: Params }): Observable<ApiResponse<T>> {\r\n const url = urlBase ? `${urlBase}/${endpoint}` : `${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 urlBase Base URL for the request.\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>({ urlBase, endpoint, id }: { urlBase?: string, endpoint: string, id: number }): Observable<T> {\r\n const url = urlBase ? `${urlBase}/${endpoint}` : `${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 urlBase Base URL for the request.\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>({ urlBase, endpoint, data }: { urlBase?: string, endpoint: string, data: T }): Observable<ApiResponse<T>> {\r\n const url = urlBase ? `${urlBase}/${endpoint}` : `${this.config.urlBase}/${endpoint}`;\r\n return this.http.post<ApiResponse<T>>(url, data);\r\n }\r\n\r\n\r\n /**\r\n * Method to update a record in an endpoint.\r\n * @param urlBase Base URL for the request.\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>({ urlBase, endpoint, id, data }: { urlBase?: string, endpoint: string, id: number, data: T }): Observable<ApiResponse<T>> {\r\n const url = urlBase ? `${urlBase}/${endpoint}` : `${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 * Method to delete a record from an endpoint.\r\n * @param urlBase Base URL for the request.\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>({ urlBase, endpoint, id }: { urlBase?: string, endpoint: string, id: number }): Observable<ApiResponse<T>> {\r\n const url = urlBase ? `${urlBase}/${endpoint}` : `${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 urlBase Base URL for the request.\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>({ urlBase, endpoint, id, data }: { urlBase?: string, endpoint: string, id: number, data: EnableBoolean<T> }): Observable<ApiResponse<T>> {\r\n const url = urlBase ? `${urlBase}/${endpoint}` : `${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 * Method to create multiple records in an endpoint.\r\n * @param urlBase Base URL for the request.\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>({ urlBase, endpoint, data }: { urlBase?: string, endpoint: string, data: T[] }): Observable<ApiResponse<T[]>> {\r\n const url = urlBase ? `${urlBase}/${endpoint}/bulk` : `${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 { ArrowBigRight, ArrowDownWideNarrow, Calendar, Check, ChevronDown, ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight, ChevronsUpDown, ChevronUp, CircleAlert, CircleCheck, CircleHelp, CircleX, Clipboard, Clock, Copy, Cpu, Download, Edit, EllipsisVertical, Eraser, Eye, FileSpreadsheet, FileUp, Filter, Image, ImageOff, Images, Info, Link, Link2Off, ListRestart, Loader2, Minimize2, MonitorUp, Moon, Pencil, PencilLine, RefreshCcw, RotateCcw, RotateCw, Save, Scan, Search, SquareDashedMousePointer, Sun, Trash, Trash2, 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 img: Image,\r\n imgs: Images,\r\n imageOff: ImageOff,\r\n upload: Upload,\r\n view: Eye,\r\n chevronUp: ChevronUp,\r\n chevronDown: ChevronDown,\r\n chevronsUpDown: ChevronsUpDown,\r\n squareDashedMousePointer: SquareDashedMousePointer,\r\n search: Search,\r\n copy: Copy,\r\n save: Save,\r\n sun: Sun,\r\n moon: Moon,\r\n loading: Loader2,\r\n\r\n firstPage: ChevronsLeft,\r\n prevPage: ChevronLeft,\r\n nextPage: ChevronRight,\r\n lastPage: ChevronsRight,\r\n\r\n arrowBigRight: ArrowBigRight,\r\n\r\n filter: Filter,\r\n filterList: ArrowDownWideNarrow,\r\n eraser: Eraser,\r\n transh: Trash2,\r\n default: Cpu,\r\n fileSpreadsheet: FileSpreadsheet,\r\n monitorUp: MonitorUp,\r\n download: Download,\r\n fileUp: FileUp,\r\n listRestart: ListRestart,\r\n editRowLine: PencilLine,\r\n editRow: Pencil,\r\n\r\n edit: Edit,\r\n delete: Trash,\r\n ellipsisVertical: EllipsisVertical,\r\n calendar: Calendar,\r\n clock: Clock,\r\n circleAlert: CircleAlert,\r\n clipboard: Clipboard,\r\n link: Link,\r\n linkOff: Link2Off,\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 } from \"@angular/core\"\r\nimport * as FileSaver from \"file-saver\"\r\nimport * as ExcelJS from \"exceljs\"\r\nimport { HttpClient } from \"@angular/common/http\"\r\nimport { JConverterCrudService } from \"../crud/converter-crud.service\"\r\nimport { TableColumn } from \"../../interfaces/crud/crud.interface\"\r\n\r\ninterface ExportFileExcel {\r\n data: any[]\r\n headersColumns: any\r\n nameReport: string,\r\n excelFileName: string,\r\n nameSheet: string,\r\n catalogs?: Record<string, string[]>\r\n}\r\n\r\n@Injectable({\r\n providedIn: \"root\",\r\n})\r\nexport class JExcelService {\r\n \r\n // Init data\r\n initData = 2;\r\n\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly converterService: JConverterCrudService,\r\n ) { }\r\n\r\n // Download file\r\n async exportAsExcelFile({ data, headersColumns, nameReport, excelFileName, nameSheet, catalogs }: ExportFileExcel): Promise<void> {\r\n\r\n const workbook = new ExcelJS.Workbook();\r\n const worksheet = workbook.addWorksheet(nameSheet);\r\n\r\n const headers = this.createHeaders(headersColumns);\r\n\r\n // Header title\r\n const titleRow = worksheet.getRow(this.initData - 1);\r\n const totalColumns = headers.length;\r\n const startCol = 1;\r\n const endCol = totalColumns;\r\n\r\n worksheet.mergeCells(this.initData - 1, startCol, this.initData - 1, endCol);\r\n titleRow.getCell(1).value = nameReport;\r\n titleRow.getCell(1).alignment = { vertical: \"middle\", horizontal: \"center\", wrapText: true };\r\n titleRow.getCell(1).font = { bold: true, size: 14, color: { argb: \"ffffff\" } };\r\n titleRow.getCell(1).fill = { type: \"pattern\", pattern: \"solid\", fgColor: { argb: \"2d3f5e\" } };\r\n titleRow.eachCell((cell: any) => {\r\n cell.border = this.borderStyles;\r\n });\r\n\r\n\r\n // Header table\r\n worksheet.columns = headers.map((col) => ({\r\n key: col.key,\r\n width: col.width,\r\n }));\r\n\r\n\r\n // Position header\r\n const headerRow = worksheet.getRow(this.initData);\r\n headers.forEach((col, index) => {\r\n const headerText = col.header.toUpperCase();\r\n headerRow.getCell(index + 1).value = headerText;\r\n headerRow.getCell(index + 1).font = { bold: true, color: { argb: \"ffffff\" } };\r\n headerRow.getCell(index + 1).alignment = { horizontal: \"center\", vertical: \"middle\", wrapText: true };\r\n headerRow.getCell(index + 1).fill = { type: \"pattern\", pattern: \"solid\", fgColor: { argb: \"405883\" } };\r\n headerRow.eachCell((cell: any) => {\r\n cell.border = this.borderStyles;\r\n });\r\n });\r\n\r\n\r\n // Add data\r\n data.forEach((item, index) => {\r\n const row = worksheet.getRow(index + (this.initData + 1));\r\n headers.forEach((col) => {\r\n let value;\r\n\r\n if (col.key === \"index\") {\r\n value = index + 1;\r\n } else if (col.key === \"ID\") {\r\n\r\n const cell = row.getCell(headers.indexOf(col) + 1);\r\n cell.value = item[col.key];\r\n\r\n const columnIndex = headers.indexOf(col) + 1;\r\n if (worksheet.getColumn(columnIndex)) {\r\n worksheet.getColumn(columnIndex).hidden = true;\r\n }\r\n\r\n } else {\r\n value = this.getValue(item, col);\r\n }\r\n\r\n const cell = row.getCell(headers.indexOf(col) + 1);\r\n cell.value = value;\r\n\r\n if (col.align) {\r\n cell.alignment = { horizontal: col.align };\r\n }\r\n });\r\n });\r\n\r\n\r\n if (catalogs && Object.keys(catalogs).length > 0) {\r\n const helpSheet = workbook.addWorksheet(\"Catálogos\");\r\n\r\n helpSheet.columns = [\r\n { header: \"Campo\", key: \"campo\", width: 30 },\r\n { header: \"Valores válidos\", key: \"valores\", width: 50 },\r\n ];\r\n\r\n // Create header files\r\n const headerRow = helpSheet.getRow(1);\r\n headerRow.getCell(1).value = \"CAMPO\";\r\n headerRow.getCell(2).value = \"VALORES VÁLIDOS\";\r\n\r\n [1, 2].forEach((colIndex) => {\r\n const cell: any = headerRow.getCell(colIndex);\r\n cell.font = { bold: true, color: { argb: \"FFFFFF\" } };\r\n cell.fill = { type: \"pattern\", pattern: \"solid\", fgColor: { argb: \"941c81\" } };\r\n cell.alignment = { horizontal: \"center\", vertical: \"middle\", wrapText: true };\r\n cell.border = this.borderStyles;\r\n });\r\n\r\n // Config height\r\n headerRow.height = 20;\r\n\r\n // Add data down heaeder\r\n let rowIndex = 2;\r\n Object.entries(catalogs).forEach(([field, values]) => {\r\n const row = helpSheet.getRow(rowIndex);\r\n row.getCell(1).value = field;\r\n row.getCell(2).value = values.join(\", \");\r\n\r\n [1, 2].forEach((colIndex) => {\r\n const cell: any = row.getCell(colIndex);\r\n cell.alignment = { vertical: \"middle\", horizontal: \"center\", wrapText: true };\r\n cell.border = this.borderStyles;\r\n });\r\n\r\n rowIndex++;\r\n });\r\n\r\n helpSheet.autoFilter = {\r\n from: { row: 1, column: 1 },\r\n to: { row: 1, column: 2 },\r\n };\r\n }\r\n\r\n this.applyAutoFilter(worksheet, headersColumns);\r\n\r\n const buffer = await workbook.xlsx.writeBuffer();\r\n const blob = new Blob([buffer], {\r\n type: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8\",\r\n });\r\n\r\n FileSaver.saveAs(blob, `${excelFileName}.xlsx`);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Create headers for the Excel sheet\r\n * @param columnConfig\r\n * @returns\r\n */\r\n createHeaders(columnConfig: any): any[] {\r\n const headers = Object.keys(columnConfig).map((key) => {\r\n const config = columnConfig[key];\r\n\r\n return {\r\n ...config,\r\n header: config.label,\r\n key: config.key,\r\n width: parseInt(config.styles?.['minWidth'] ?? '100', 10) * 0.15,\r\n align: config.styles?.['text-align'] ?? 'left',\r\n };\r\n });\r\n\r\n // Add column \"N°\"\r\n headers.unshift({\r\n header: 'N°',\r\n key: 'index',\r\n width: 8,\r\n align: 'center',\r\n });\r\n\r\n return headers;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Get values\r\n * @param item\r\n * @param column\r\n * @returns\r\n */\r\n getValue(item: any, column: TableColumn<any>): any {\r\n let value: any;\r\n\r\n if (typeof column.valueGetter === 'function') {\r\n value = column.valueGetter(item);\r\n } else {\r\n const keys = column.key.split('.');\r\n value = item;\r\n\r\n for (const key of keys) {\r\n if (value != null) {\r\n value = value[key];\r\n } else {\r\n value = null;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (value === null || value === undefined) {\r\n return 'S/N';\r\n }\r\n\r\n const formatted = this.converterService.formatData(value, column);\r\n\r\n return formatted ?? value;\r\n }\r\n\r\n\r\n \r\n /**\r\n * Apply styles to the worksheet\r\n * @param worksheet\r\n * @param columnsConfig\r\n */\r\n applyStyles(worksheet: ExcelJS.Worksheet, columnsConfig: any) {\r\n worksheet.columns.forEach((column: any) => {\r\n if (column.key) {\r\n const config = columnsConfig[column.key]\r\n if (config && config.align) {\r\n column.alignment = { horizontal: config.align }\r\n }\r\n }\r\n })\r\n }\r\n\r\n\r\n\r\n /**\r\n * Apply auto filter to the worksheet\r\n * @param worksheet\r\n * @param columnsConfig\r\n */\r\n applyAutoFilter(worksheet: ExcelJS.Worksheet, columnsConfig: any) {\r\n if (Object.keys(columnsConfig).length > 0) {\r\n worksheet.autoFilter = {\r\n from: {\r\n row: this.initData,\r\n column: 1,\r\n },\r\n to: {\r\n row: this.initData,\r\n column: Object.keys(columnsConfig).length,\r\n },\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n /**\r\n * Load image from URL\r\n * @param workbook\r\n * @param worksheet\r\n * @param url\r\n * @param width\r\n * @param height\r\n * @param top\r\n * @param left\r\n * @returns\r\n */\r\n async loadAndAddImage(\r\n workbook: ExcelJS.Workbook,\r\n worksheet: ExcelJS.Worksheet,\r\n url: string,\r\n width: number,\r\n height: number,\r\n top: number,\r\n left: number,\r\n ): Promise<void> {\r\n const response: any = await this.http.get(url, { responseType: \"blob\" }).toPromise()\r\n return new Promise<void>((resolve, reject) => {\r\n const reader = new FileReader()\r\n reader.onloadend = () => {\r\n const base64Image = reader.result as string\r\n const imageId = workbook.addImage({\r\n base64: base64Image,\r\n extension: \"png\",\r\n })\r\n worksheet.addImage(imageId, {\r\n tl: { col: left, row: top },\r\n ext: { width: width, height: height },\r\n })\r\n resolve()\r\n }\r\n reader.onerror = reject\r\n reader.readAsDataURL(response)\r\n })\r\n }\r\n\r\n borderStyles = {\r\n top: { style: \"thin\" },\r\n left: { style: \"thin\" },\r\n bottom: { style: \"thin\" },\r\n right: { style: \"thin\" },\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ExcelFileNameResult } from '../../interfaces/crud/filter.interface';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class JExcelFilterService {\r\n\r\n /**\r\n * Generate name file\r\n * @param columns \r\n * @param filtersSelect \r\n * @param mainEndpoint \r\n * @param params \r\n * @param data \r\n * @param reportName \r\n * @returns \r\n */\r\n generateExcelFileName(columns: any, filtersSelect: any, mainEndpoint: string, params: any, data: any, reportName?: string): ExcelFileNameResult {\r\n\r\n // Verify if there are custom filters (not default ones)\r\n const filtersObj = params?.filter ?? {};\r\n const hasCustomFilters = Object.keys(filtersObj).length > 0;\r\n\r\n // Verify if there is a search term\r\n const searchTerm = params?.search?.trim();\r\n const hasSearch = searchTerm && searchTerm.length > 0;\r\n\r\n // Determine the base report name\r\n const baseReportName = reportName ? `${reportName}` : 'Reporte';\r\n\r\n // If there are no custom filters AND no search, use generic name\r\n if (!hasCustomFilters && !hasSearch) {\r\n const fileName = this.sanitizeFileName(`${baseReportName} - ${this.formatDateForFileName()}`);\r\n\r\n return {\r\n fileName,\r\n nameReport: baseReportName\r\n };\r\n }\r\n\r\n // Array with all descriptions (filters + search)\r\n const allDescriptions: string[] = [];\r\n\r\n // Process custom filters if they exist\r\n if (hasCustomFilters) {\r\n\r\n for (const filterKey in filtersObj) {\r\n if (filtersObj.hasOwnProperty(filterKey)) {\r\n\r\n // Search for filter configuration in filtersSelect\r\n const filterConfig: any = filtersSelect.find((filter: any) => filter.optionValue === filterKey);\r\n\r\n if (filterConfig) {\r\n\r\n // Construct column key, remove 'id_' from filterKey\r\n const prefix = filterKey.replace('id_', '');\r\n const columnKey = `${prefix}.${filterConfig.optionLabel}`;\r\n\r\n // Search for the corresponding column\r\n const column = columns.find((col: any) => col.key === columnKey);\r\n\r\n if (column) {\r\n // Get the descriptive value from the data\r\n const filterValue = filtersObj[filterKey];\r\n let descriptiveValue = filterValue;\r\n\r\n // Search for the descriptive value in the data\r\n if (data && Array.isArray(data) && data.length > 0) {\r\n // Search in the first element that has the filter applied\r\n const matchingItem = data.find((item: any) => item[filterKey] === filterValue);\r\n\r\n if (matchingItem) {\r\n // Extract the descriptive value using the relationship structure\r\n // For example: for id_status, search in item.status.name_status\r\n const relationKey = prefix; // 'status' para 'id_status'\r\n\r\n if (matchingItem[relationKey] && matchingItem[relationKey][filterConfig.optionLabel]) {\r\n descriptiveValue = matchingItem[relationKey][filterConfig.optionLabel];\r\n }\r\n }\r\n }\r\n\r\n // Create description for each filter using the descriptive value\r\n const description = `${column.label} (${descriptiveValue})`;\r\n allDescriptions.push(description);\r\n\r\n } else {\r\n\r\n // Fallback: use the filter's placeholder or the filterKey\r\n const fallbackLabel = filterConfig.placeholder ?? filterKey;\r\n const description = `${fallbackLabel} ${filtersObj[filterKey]}`;\r\n allDescriptions.push(description);\r\n\r\n }\r\n } else {\r\n\r\n // Check if it is the default sortBy (id_ + mainEndpoint)\r\n const defaultSortKey = `id_${mainEndpoint}`;\r\n\r\n if (filterKey !== defaultSortKey) {\r\n\r\n // If it is not the default sort, add it as a generic filter\r\n const description = `${filterKey} ${filtersObj[filterKey]}`;\r\n allDescriptions.push(description);\r\n\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Process search if it exists\r\n if (hasSearch) {\r\n // Add the search description without problematic quotes\r\n const searchDescription = `Search ${searchTerm}`;\r\n allDescriptions.push(searchDescription);\r\n }\r\n\r\n // Generate file name with filters and/or search\r\n const descriptionsString = allDescriptions.length > 0 ? ` - ${allDescriptions.join(' - ')}` : '';\r\n const fileName = this.sanitizeFileName(`${baseReportName}${descriptionsString} - ${this.formatDateForFileName()}`);\r\n\r\n return {\r\n fileName,\r\n nameReport: baseReportName\r\n };\r\n }\r\n\r\n\r\n\r\n /**\r\n * Sanitize file name\r\n * @param fileName\r\n * @returns\r\n */\r\n sanitizeFileName(fileName: string): string {\r\n return fileName\r\n .replace(/[<>:\"/\\\\|?*]/g, '') // Remove completely problematic characters\r\n .replace(/\\s+/g, ' ') // Replace multiple spaces with a single space\r\n .trim() // Remove spaces at the beginning and end\r\n .substring(0, 200); // Limit length to avoid problems\r\n }\r\n\r\n\r\n /**\r\n * Function to format date for file names\r\n * @returns\r\n */\r\n formatDateForFileName(): string {\r\n const now = new Date();\r\n const day = now.getDate().toString().padStart(2, '0');\r\n const month = (now.getMonth() + 1).toString().padStart(2, '0');\r\n const year = now.getFullYear();\r\n\r\n return `${day}-${month}-${year}`;\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { Injectable } from '@angular/core';\r\nimport * as XLSX from 'xlsx';\r\nimport { forkJoin, map, Observable } from 'rxjs';\r\nimport { TableColumn } from \"../../interfaces/crud/crud.interface\";\r\nimport { JConverterCrudService } from '../crud/converter-crud.service';\r\nimport { JGenericCrudService } from '../crud/generic-crud.service';\r\nimport { JAlertToastService } from '../alert/toast-alert.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class JUploadFilterService {\r\n\r\n constructor(\r\n private readonly converterService: JConverterCrudService,\r\n private readonly genericService: JGenericCrudService,\r\n private readonly alertToastService: JAlertToastService,\r\n ) { }\r\n\r\n\r\n /**\r\n * Validates the headers of the uploaded file.\r\n * @param headersFromFile Headers from the Excel file.\r\n * @param columns Expected columns in the table.\r\n * @param ignoreKeys Keys to ignore in the validation.\r\n * @param setLoadingFn Function to set the loading state.\r\n * @returns True if the headers are valid, false otherwise.\r\n */\r\n validateHeaders(\r\n headersFromFile: string[],\r\n columns: TableColumn<any>[],\r\n ignoreKeys: string[],\r\n setLoadingFn: (value: boolean) => void\r\n ): boolean {\r\n const expectedHeaders = columns\r\n .filter(col => col.visible && !ignoreKeys.includes(col.key))\r\n .map(col => col.label?.trim().toUpperCase())\r\n .filter(Boolean);\r\n\r\n const fileHeaders = headersFromFile.map(h => h?.trim().toUpperCase());\r\n\r\n const missing = expectedHeaders.filter(h => !fileHeaders.includes(h));\r\n\r\n if (missing.length > 0) {\r\n this.alertToastService.AlertToast({\r\n type: 'error',\r\n title: 'Columnas faltantes',\r\n description: `El archivo Excel no contiene todas las columnas requeridas.\\nFaltan: ${missing.join(', ')}`\r\n });\r\n setLoadingFn(false);\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Gets the header map to keys.\r\n * @param columns Table columns.\r\n * @param ignoreKeys Keys to ignore in the map.\r\n * @returns An object where the keys are the headers and the values are the column keys.\r\n */\r\n getHeaderKeyMap(\r\n columns: TableColumn<any>[],\r\n ignoreKeys: string[] = []\r\n ): Record<string, string> {\r\n const map: Record<string, string> = {};\r\n\r\n columns\r\n .filter(col => col.visible && !ignoreKeys.includes(col.key))\r\n .forEach(col => {\r\n const header = col.label?.trim().toUpperCase();\r\n if (header) {\r\n map[header] = col.key;\r\n }\r\n });\r\n\r\n return map;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Gets the header map to keys.\r\n * @param columns Table columns.\r\n * @param ignoreKeys Keys to ignore in the map.\r\n * @returns An object where the keys are the headers and the values are the column keys.\r\n */\r\n getIdsSelectedData(\r\n button: any\r\n ): Array<Observable<{ key: string, data: any[], mappingInfo: any }>> {\r\n const observables = Object.keys(button.searchListUpload).map((key) => {\r\n const obj = button.searchListUpload[key];\r\n const defaultFilters = obj.defaultFilters ?? {};\r\n\r\n const params = this.genericService.params({\r\n limit: 1000000,\r\n filters: { ...defaultFilters }\r\n });\r\n\r\n return this.genericService.getAll<any>({ endpoint: key, params }).pipe(\r\n map((response) => ({\r\n key,\r\n data: response.data[key] ?? [],\r\n mappingInfo: obj\r\n }))\r\n );\r\n });\r\n\r\n return observables;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Processes the upload of an Excel file.\r\n * @param file Excel file to process.\r\n * @param columns Table columns to validate and map the data.\r\n * @param button Button that contains the search and upload configuration.\r\n * @param afterProcessing Function to execute after processing the file, receives the resulting JSON.\r\n * @param setLoadingFn Function to set the loading state.\r\n * @param clearFileInputFn Function to clear the file input.\r\n */\r\n processExcelUpload(\r\n file: File,\r\n columns: TableColumn<any>[],\r\n button: any,\r\n afterProcessing: (\r\n json: any[],\r\n filteredColumns: TableColumn<any>[],\r\n equivalences: Record<string, Record<string | number, string>>\r\n ) => void,\r\n setLoadingFn: (value: boolean) => void,\r\n clearFileInputFn: () => void\r\n ): void {\r\n setLoadingFn(true);\r\n\r\n const reader = new FileReader();\r\n\r\n reader.onload = (e: any) => {\r\n const data = new Uint8Array(e.target.result);\r\n const workbook = XLSX.read(data, { type: 'array' });\r\n const sheet = workbook.Sheets[workbook.SheetNames[0]];\r\n const jsonRaw = XLSX.utils.sheet_to_json(sheet, { header: 1, defval: 'S/N' });\r\n\r\n const headers = jsonRaw[1] as string[];\r\n const rows = jsonRaw.slice(2);\r\n\r\n // Validate headers\r\n if (!this.validateHeaders(headers, columns, button.ignoreKeyUpload ?? [], setLoadingFn)) {\r\n clearFileInputFn();\r\n return;\r\n }\r\n\r\n // Get the header key map\r\n const mapHeader = this.getHeaderKeyMap(columns, button.ignoreKeyUpload ?? []);\r\n\r\n const json = rows.map(row => {\r\n const obj: any = {};\r\n headers.forEach((header: string, i: number) => {\r\n const key = mapHeader[header.trim().toUpperCase()];\r\n if (key) {\r\n const columnConfig = columns.find(col => col.key === key);\r\n let value = (row as any[])[i];\r\n\r\n if (columnConfig) {\r\n value = this.converterService.parseData(value, columnConfig);\r\n }\r\n\r\n // Force to string if it's an identification field\r\n if (key?.toLowerCase().includes('identification_')) {\r\n if (typeof value === 'number') {\r\n value = value.toString();\r\n }\r\n }\r\n\r\n obj[key] = value;\r\n }\r\n });\r\n return obj;\r\n });\r\n\r\n // Process selected IDs\r\n forkJoin(this.getIdsSelectedData(button)).subscribe({\r\n next: (results) => {\r\n let hasMissing = false;\r\n const missingMessages: string[] = [];\r\n\r\n results.forEach((result) => {\r\n const { key, data, mappingInfo } = result;\r\n\r\n const keyReturn = mappingInfo.keyReturn;\r\n const keyAlternate = mappingInfo.keyAlternate;\r\n const keyColumnSearch = mappingInfo.keyColumnSearch;\r\n const isOptional = mappingInfo.optional ?? false;\r\n\r\n\r\n if (!keyReturn || !keyColumnSearch) return;\r\n\r\n // Get the column label to display in errors\r\n const columnLabel =\r\n columns.find(col => col.key === keyColumnSearch)?.label\r\n ?? keyColumnSearch;\r\n\r\n const missingValues: any[] = [];\r\n\r\n // Iterate over each row of the JSON loaded from Excel\r\n json.forEach(item => {\r\n const currentValue = item[keyColumnSearch];\r\n\r\n if (currentValue !== undefined && currentValue !== null) {\r\n\r\n // For example, from keyColumnSearch = 'status.name_status'\r\n // you get fieldName = 'name_status'\r\n const fieldName = keyColumnSearch.split('.').pop()!;\r\n\r\n // Search for the value in the catalog obtained from the API\r\n const found = data.find((apiItem: any) => {\r\n return apiItem[fieldName] === currentValue;\r\n });\r\n\r\n if (found) {\r\n // If it finds the value in the catalog:\r\n // - delete the textual column (e.g. 'status.name_status')\r\n // - and leave the id (e.g. id_status) in the object\r\n // delete item[keyColumnSearch];\r\n\r\n // If mappingInfo brings keyAlternate, use that field, if not, use keyReturn\r\n const valueToAssign = found[keyAlternate ?? keyReturn];\r\n item[keyReturn] = valueToAssign;\r\n } else {\r\n if (isOptional) {\r\n // If it is optional and does not exist, simply delete the field\r\n delete item[keyColumnSearch];\r\n item[keyReturn] = null;\r\n } else {\r\n // If it is not optional and the value was not found, accumulate it to show an error\r\n missingValues.push(currentValue);\r\n }\r\n }\r\n } else {\r\n // If the value comes empty and is optional, delete the field and leave it as null\r\n if (isOptional) {\r\n delete item[keyColumnSearch];\r\n item[keyReturn] = null;\r\n }\r\n }\r\n });\r\n\r\n // If there were values that were not found in the catalog list\r\n if (missingValues.length > 0) {\r\n hasMissing = true;\r\n const uniqueMissing = Array.from(new Set(missingValues));\r\n missingMessages.push(\r\n `No se encontraron coincidencias en la columna [${columnLabel}] para los valores: ${uniqueMissing.join(', ')}`\r\n );\r\n }\r\n });\r\n\r\n // If there were matching errors, show a warning message\r\n if (hasMissing) {\r\n this.alertToastService.AlertToast({\r\n type: 'warning',\r\n title: 'Error al procesar datos',\r\n description: missingMessages.join('\\n'),\r\n autoClose: false\r\n });\r\n clearFileInputFn();\r\n setLoadingFn(false);\r\n return;\r\n }\r\n\r\n console.log('JSON final con IDs:', json);\r\n\r\n // Determine columns present in the Excel file\r\n const fileHeadersUpper = (headers ?? []).map((h: any) => h?.trim().toUpperCase());\r\n\r\n // Generate the mapping of header -> key\r\n this.getHeaderKeyMap(columns, button.ignoreKeyUpload ?? []);\r\n\r\n // Filter columns that are in the Excel file\r\n const filteredColumns = columns.filter(col => {\r\n const header = col.label?.trim().toUpperCase();\r\n return (\r\n col.visible &&\r\n header &&\r\n fileHeadersUpper.includes(header) &&\r\n !button.ignoreKeyUpload.includes(col.key)\r\n );\r\n });\r\n\r\n // Object to store the equivalences\r\n // keyReturn -> { keyColumnSearch: value }\r\n // For example: { id_status: { name_status: 'Activo' } }\r\n const equivalences: Record<string, Record<string | number, string>> = {};\r\n\r\n results.forEach((result) => {\r\n const { data, mappingInfo } = result;\r\n const keyReturn = mappingInfo.keyReturn;\r\n const keyColumnSearch = mappingInfo.keyColumnSearch;\r\n\r\n if (!keyReturn || !keyColumnSearch) return;\r\n\r\n equivalences[keyReturn] = {};\r\n\r\n data.forEach((item: any) => {\r\n const idKey = mappingInfo.keyAlternate ?? keyReturn;\r\n equivalences[keyReturn][item[idKey]] = item[keyColumnSearch.split('.').pop()!];\r\n });\r\n });\r\n\r\n // Execute the callback passing the json and the filtered columns\r\n afterProcessing(json, filteredColumns, equivalences);\r\n\r\n clearFileInputFn();\r\n },\r\n complete: () => {\r\n setLoadingFn(false);\r\n }\r\n });\r\n };\r\n\r\n reader.readAsArrayBuffer(file);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Generates catalogs of valid values for select-type fields.\r\n * @param results Results of the list searches.\r\n * @param columns Table columns.\r\n * @returns A dictionary with fields and their valid values.\r\n */\r\n generateCatalogs(\r\n results: { key: string, data: any[], mappingInfo: any }[],\r\n columns: TableColumn<any>[]\r\n ): Record<string, string[]> {\r\n const catalogs: Record<string, string[]> = {};\r\n\r\n results.forEach(result => {\r\n const { data, mappingInfo } = result;\r\n const keyColumnSearch = mappingInfo.keyColumnSearch;\r\n\r\n if (!keyColumnSearch) return;\r\n\r\n // Get the final field (e.g. name_status)\r\n const fieldName = keyColumnSearch.split('.').pop()!;\r\n\r\n // Find the column to get its label\r\n const colLabel =\r\n columns.find(c => c.key === keyColumnSearch)?.label ?? keyColumnSearch;\r\n\r\n // Map unique values\r\n const values = Array.from(\r\n new Set(\r\n data\r\n .map((item: any) => item[fieldName])\r\n .filter((v: any) => v !== null && v !== undefined)\r\n )\r\n );\r\n\r\n if (values.length > 0) {\r\n catalogs[colLabel.toUpperCase()] = values;\r\n }\r\n });\r\n\r\n return catalogs;\r\n }\r\n\r\n}\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// Interface\r\n// ========================================\r\n\r\nexport * from './lib/interfaces/crud/crud.interface';\r\nexport * from './lib/interfaces/crud/params.interface';\r\nexport * from './lib/interfaces/crud/filter.interface';\r\nexport * from './lib/interfaces/crud/form.interface';\r\nexport * from './lib/interfaces/theme/theme-generator.interface';\r\n\r\n\r\n// ========================================\r\n// Shared\r\n// ========================================\r\n\r\nexport * from './lib/shared/form.shared';\r\nexport * from './lib/shared/dialog.shared';\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\nexport * from './lib/services/transformer/transform.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// Report\r\nexport * from './lib/services/report/excel.service';\r\nexport * from './lib/services/report/excel.filter.service';\r\nexport * from './lib/services/report/upload.filter.service';\r\n\r\n\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":["i1.JAlertToastService","i2.JCalendarService","i1.JTransformService","i1","i2.JParamsHttpService","i3.JConverterCrudService","i2.JConverterCrudService","i1.JConverterCrudService","i2.JGenericCrudService","i3.JAlertToastService"],"mappings":"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"}
|
|
@@ -54,6 +54,8 @@ export declare class JIconsService {
|
|
|
54
54
|
clock: import("lucide-angular").LucideIconData;
|
|
55
55
|
circleAlert: import("lucide-angular").LucideIconData;
|
|
56
56
|
clipboard: import("lucide-angular").LucideIconData;
|
|
57
|
+
link: import("lucide-angular").LucideIconData;
|
|
58
|
+
linkOff: import("lucide-angular").LucideIconData;
|
|
57
59
|
};
|
|
58
60
|
constructor();
|
|
59
61
|
static ɵfac: i0.ɵɵFactoryDeclaration<JIconsService, never>;
|
package/package.json
CHANGED
|
@@ -214,6 +214,18 @@
|
|
|
214
214
|
}
|
|
215
215
|
|
|
216
216
|
@else if (column.isLink && (getValue(item, column))) {
|
|
217
|
+
<div class="flex flex-wrap items-center justify-center gap-1 w-full">
|
|
218
|
+
@if (getValue(item, column) === 'S/N' || getValue(item, column) === '' || getValue(item, column) === null || getValue(item, column) === undefined) {
|
|
219
|
+
<lucide-icon [name]="iconsService.icons.Link2Off" size="25" class="text-gray-500 dark:text-gray-400"></lucide-icon>
|
|
220
|
+
} @else {
|
|
221
|
+
<a href="{{ getValue(item, column) }}" class="flex gap-2 text-dark-primary hover:text-primary dark:text-primary dark:hover:text-dark-primary underline block" target="_blank" rel="noopener noreferrer">
|
|
222
|
+
<lucide-icon [name]="iconsService.icons.link" size="25" class="text-gray-500 dark:text-gray-400"></lucide-icon>
|
|
223
|
+
</a>
|
|
224
|
+
}
|
|
225
|
+
</div>
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
@else if (column.isLinkImage && (getValue(item, column))) {
|
|
217
229
|
<div class="flex flex-wrap items-center justify-center gap-1" (click)="$event.stopPropagation()">
|
|
218
230
|
<JButton
|
|
219
231
|
[icon]="column.colorDecorator?.(item) ? iconsService.icons.img : iconsService.icons.imageOff"
|