UNPKG

@jcbautistam/custom-table

Version:

Librería de tabla reutilizable con acciones, filtros, exportación y más.

93 lines 16.3 kB
import { Injectable } from '@angular/core'; import { formatInTimeZone, toDate } from 'date-fns-tz'; import { formatDate } from '@angular/common'; import * as i0 from "@angular/core"; export class DateTimeService { constructor() { // Obtener la zona horaria del dispositivo del usuario this.userTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone; } toTimeZone(date = new Date()) { // Formatear la fecha en la zona horaria del usuario y en formato ISO 8601 const isoString = formatInTimeZone(date, this.userTimeZone, "yyyy-MM-dd'T'HH:mm:ssXXX"); return isoString; } toUTCDate(dateInput = new Date()) { const date = new Date(dateInput); // Obtener los componentes de la fecha const dayName = date.toLocaleString('en-US', { weekday: 'short' }); const monthName = date.toLocaleString('en-US', { month: 'short' }); const day = date.getDate(); const year = date.getFullYear(); const hours = date.getHours().toString().padStart(2, '0'); const minutes = date.getMinutes().toString().padStart(2, '0'); const seconds = date.getSeconds().toString().padStart(2, '0'); // Obtener el offset de la zona horaria en horas y minutos const timezoneOffset = -date.getTimezoneOffset(); const timezoneHours = Math.floor(timezoneOffset / 60) .toString() .padStart(2, '0'); const timezoneMinutes = (timezoneOffset % 60).toString().padStart(2, '0'); const timezoneSign = timezoneOffset >= 0 ? '+' : '-'; return new Date(`${dayName} ${monthName} ${day} ${year} ${hours}:${minutes}:${seconds} GMT${timezoneSign}${timezoneHours}${timezoneMinutes}`); } toTime(date = new Date()) { if (!date) { date = new Date(); } // Formatear la fecha en la zona horaria del usuario y en formato ISO 8601 const isoString = formatInTimeZone(date, this.userTimeZone, 'HH:mm:ssXXX'); return isoString; } stringToDate(fechaString) { const convertToDate = toDate(fechaString, { timeZone: this.userTimeZone }); return convertToDate; } getDateTimeNow() { let date = new Date(); const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); // Los meses son de 0 a 11 const day = String(date.getDate()).padStart(2, '0'); const hours = String(date.getHours()).padStart(2, '0'); const minutes = String(date.getMinutes()).padStart(2, '0'); const seconds = String(date.getSeconds()).padStart(2, '0'); return new Date(`${year}-${month}-${day}T${hours}:${minutes}:${seconds}`); } getformatDate(date = new Date(), format = 'dd/MM/yyyy') { return formatDate(date, format, 'en-US'); } getTextDateLiq(fecha) { const opciones = { day: 'numeric', month: 'long', year: 'numeric', // Año }; const formateador = new Intl.DateTimeFormat('es-ES', opciones); return formateador.format(new Date(fecha)).replace(',', '').toUpperCase(); } combinarFechaYHora(fecha, hora) { // Crea un objeto de fecha a partir de la fecha ingresada const fechaObj = new Date(fecha); const [horas, minutos] = hora.split(':').map(Number); // Ajusta la hora y los minutos fechaObj.setHours(horas, minutos, 0); // Construye la cadena en formato 'YYYY-MM-DDTHH:mm:ss' const año = fechaObj.getFullYear(); const mes = String(fechaObj.getMonth() + 1).padStart(2, '0'); // Los meses van de 0 a 11 const día = String(fechaObj.getDate()).padStart(2, '0'); const horasLocal = String(fechaObj.getHours()).padStart(2, '0'); const minutosLocal = String(fechaObj.getMinutes()).padStart(2, '0'); const segundosLocal = String(fechaObj.getSeconds()).padStart(2, '0'); // Devuelve la fecha combinada return `${año}-${mes}-${día}T${horasLocal}:${minutosLocal}:${segundosLocal}`; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: DateTimeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: DateTimeService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: DateTimeService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return []; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0ZVRpbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2N1c3RvbS10YWJsZS9zcmMvbGliL1NlcnZpY2VzL0RhdGVUaW1lLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFJN0MsTUFBTSxPQUFPLGVBQWU7SUFJMUI7UUFIQSxzREFBc0Q7UUFDdEQsaUJBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDO0lBRWpELENBQUM7SUFFaEIsVUFBVSxDQUFDLE9BQWEsSUFBSSxJQUFJLEVBQUU7UUFDaEMsMEVBQTBFO1FBQzFFLE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUNoQyxJQUFJLEVBQ0osSUFBSSxDQUFDLFlBQVksRUFDakIsMEJBQTBCLENBQzNCLENBQUM7UUFDRixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsU0FBUyxDQUFDLFlBQWtCLElBQUksSUFBSSxFQUFFO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pDLHNDQUFzQztRQUN0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDbkUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxD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Q25DLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLDBCQUEwQjtRQUN4RixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4RCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNoRSxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwRSxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUVyRSw4QkFBOEI7UUFDOUIsT0FBTyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLFVBQVUsSUFBSSxZQUFZLElBQUksYUFBYSxFQUFFLENBQUM7SUFDL0UsQ0FBQzs4R0FuR1UsZUFBZTtrSEFBZixlQUFlLGNBRmQsTUFBTTs7MkZBRVAsZUFBZTtrQkFIM0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGZvcm1hdEluVGltZVpvbmUsIHRvRGF0ZSB9IGZyb20gJ2RhdGUtZm5zLXR6JztcclxuaW1wb3J0IHsgZm9ybWF0RGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXRlVGltZVNlcnZpY2Uge1xyXG4gIC8vIE9idGVuZXIgbGEgem9uYSBob3JhcmlhIGRlbCBkaXNwb3NpdGl2byBkZWwgdXN1YXJpb1xyXG4gIHVzZXJUaW1lWm9uZSA9IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7fVxyXG5cclxuICB0b1RpbWVab25lKGRhdGU6IERhdGUgPSBuZXcgRGF0ZSgpKTogc3RyaW5nIHtcclxuICAgIC8vIEZvcm1hdGVhciBsYSBmZWNoYSBlbiBsYSB6b25hIGhvcmFyaWEgZGVsIHVzdWFyaW8geSBlbiBmb3JtYXRvIElTTyA4NjAxXHJcbiAgICBjb25zdCBpc29TdHJpbmcgPSBmb3JtYXRJblRpbWVab25lKFxyXG4gICAgICBkYXRlLFxyXG4gICAgICB0aGlzLnVzZXJUaW1lWm9uZSxcclxuICAgICAgXCJ5eXl5LU1NLWRkJ1QnSEg6bW06c3NYWFhcIlxyXG4gICAgKTtcclxuICAgIHJldHVybiBpc29TdHJpbmc7XHJcbiAgfVxyXG5cclxuICB0b1VUQ0RhdGUoZGF0ZUlucHV0OiBEYXRlID0gbmV3IERhdGUoKSkge1xyXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGRhdGVJbnB1dCk7XHJcbiAgICAvLyBPYnRlbmVyIGxvcyBjb21wb25lbnRlcyBkZSBsYSBmZWNoYVxyXG4gICAgY29uc3QgZGF5TmFtZSA9IGRhdGUudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywgeyB3ZWVrZGF5OiAnc2hvcnQnIH0pO1xyXG4gICAgY29uc3QgbW9udGhOYW1lID0gZGF0ZS50b0xvY2FsZVN0cmluZygnZW4tVVMnLCB7IG1vbnRoOiAnc2hvcnQnIH0pO1xyXG4gICAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXRlKCk7XHJcbiAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgY29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgY29uc3QgbWludXRlcyA9IGRhdGUuZ2V0TWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IHNlY29uZHMgPSBkYXRlLmdldFNlY29uZHMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XHJcblxyXG4gICAgLy8gT2J0ZW5lciBlbCBvZmZzZXQgZGUgbGEgem9uYSBob3JhcmlhIGVuIGhvcmFzIHkgbWludXRvc1xyXG4gICAgY29uc3QgdGltZXpvbmVPZmZzZXQgPSAtZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xyXG4gICAgY29uc3QgdGltZXpvbmVIb3VycyA9IE1hdGguZmxvb3IodGltZXpvbmVPZmZzZXQgLyA2MClcclxuICAgICAgLnRvU3RyaW5nKClcclxuICAgICAgLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICBjb25zdCB0aW1lem9uZU1pbnV0ZXMgPSAodGltZXpvbmVPZmZzZXQgJSA2MCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgY29uc3QgdGltZXpvbmVTaWduID0gdGltZXpvbmVPZmZzZXQgPj0gMCA/ICcrJyA6ICctJztcclxuXHJcbiAgICByZXR1cm4gbmV3IERhdGUoXHJcbiAgICAgIGAke2RheU5hbWV9ICR7bW9udGhOYW1lfSAke2RheX0gJHt5ZWFyfSAke2hvdXJzfToke21pbnV0ZXN9OiR7c2Vjb25kc30gR01UJHt0aW1lem9uZVNpZ259JHt0aW1lem9uZUhvdXJzfSR7dGltZXpvbmVNaW51dGVzfWBcclxuICAgICk7XHJcbiAgfVxyXG4gIHRvVGltZShkYXRlOiBEYXRlIHwgbnVsbCA9IG5ldyBEYXRlKCkpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFkYXRlKSB7XHJcbiAgICAgIGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgfVxyXG4gICAgLy8gRm9ybWF0ZWFyIGxhIGZlY2hhIGVuIGxhIHpvbmEgaG9yYXJpYSBkZWwgdXN1YXJpbyB5IGVuIGZvcm1hdG8gSVNPIDg2MDFcclxuICAgIGNvbnN0IGlzb1N0cmluZyA9IGZvcm1hdEluVGltZVpvbmUoZGF0ZSwgdGhpcy51c2VyVGltZVpvbmUsICdISDptbTpzc1hYWCcpO1xyXG4gICAgcmV0dXJuIGlzb1N0cmluZztcclxuICB9XHJcblxyXG4gIHN0cmluZ1RvRGF0ZShmZWNoYVN0cmluZzogc3RyaW5nKTogRGF0ZSB7XHJcbiAgICBjb25zdCBjb252ZXJ0VG9EYXRlID0gdG9EYXRlKGZlY2hhU3RyaW5nLCB7IHRpbWVab25lOiB0aGlzLnVzZXJUaW1lWm9uZSB9KTtcclxuICAgIHJldHVybiBjb252ZXJ0VG9EYXRlO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGF0ZVRpbWVOb3coKSB7XHJcbiAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgY29uc3QgbW9udGggPSBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTsgLy8gTG9zIG1lc2VzIHNvbiBkZSAwIGEgMTFcclxuICAgIGNvbnN0IGRheSA9IFN0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IGhvdXJzID0gU3RyaW5nKGRhdGUuZ2V0SG91cnMoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IG1pbnV0ZXMgPSBTdHJpbmcoZGF0ZS5nZXRNaW51dGVzKCkpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICBjb25zdCBzZWNvbmRzID0gU3RyaW5nKGRhdGUuZ2V0U2Vjb25kcygpKS5wYWRTdGFydCgyLCAnMCcpO1xyXG5cclxuICAgIHJldHVybiBuZXcgRGF0ZShgJHt5ZWFyfS0ke21vbnRofS0ke2RheX1UJHtob3Vyc306JHttaW51dGVzfToke3NlY29uZHN9YCk7XHJcbiAgfVxyXG5cclxuICBnZXRmb3JtYXREYXRlKGRhdGU6IERhdGUgPSBuZXcgRGF0ZSgpLCBmb3JtYXQ6c3RyaW5nID0gJ2RkL01NL3l5eXknKTogc3RyaW5ne1xyXG5cclxuICAgIHJldHVybiBmb3JtYXREYXRlKGRhdGUgLCBmb3JtYXQsJ2VuLVVTJylcclxuICB9XHJcblxyXG4gIGdldFRleHREYXRlTGlxKGZlY2hhOiBEYXRlKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG9wY2lvbmVzOiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyA9IHtcclxuICAgICAgZGF5OiAnbnVtZXJpYycsIC8vIETDrWEgZGVsIG1lc1xyXG4gICAgICBtb250aDogJ2xvbmcnLCAvLyBOb21icmUgY29tcGxldG8gZGVsIG1lc1xyXG4gICAgICB5ZWFyOiAnbnVtZXJpYycsIC8vIEHDsW9cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZm9ybWF0ZWFkb3IgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgnZXMtRVMnLCBvcGNpb25lcyk7XHJcbiAgICByZXR1cm4gZm9ybWF0ZWFkb3IuZm9ybWF0KG5ldyBEYXRlKGZlY2hhKSkucmVwbGFjZSgnLCcsICcnKS50b1VwcGVyQ2FzZSgpO1xyXG4gIH1cclxuXHJcbiAgY29tYmluYXJGZWNoYVlIb3JhKGZlY2hhOiBzdHJpbmcsIGhvcmE6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAvLyBDcmVhIHVuIG9iamV0byBkZSBmZWNoYSBhIHBhcnRpciBkZSBsYSBmZWNoYSBpbmdyZXNhZGFcclxuICAgIGNvbnN0IGZlY2hhT2JqID0gbmV3IERhdGUoZmVjaGEpO1xyXG4gICAgY29uc3QgW2hvcmFzLCBtaW51dG9zXSA9IGhvcmEuc3BsaXQoJzonKS5tYXAoTnVtYmVyKTtcclxuXHJcbiAgICAvLyBBanVzdGEgbGEgaG9yYSB5IGxvcyBtaW51dG9zXHJcbiAgICBmZWNoYU9iai5zZXRIb3Vycyhob3JhcywgbWludXRvcywgMCk7XHJcblxyXG4gICAgLy8gQ29uc3RydXllIGxhIGNhZGVuYSBlbiBmb3JtYXRvICdZWVlZLU1NLUREVEhIOm1tOnNzJ1xyXG4gICAgY29uc3QgYcOxbyA9IGZlY2hhT2JqLmdldEZ1bGxZZWFyKCk7XHJcbiAgICBjb25zdCBtZXMgPSBTdHJpbmcoZmVjaGFPYmouZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7IC8vIExvcyBtZXNlcyB2YW4gZGUgMCBhIDExXHJcbiAgICBjb25zdCBkw61hID0gU3RyaW5nKGZlY2hhT2JqLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IGhvcmFzTG9jYWwgPSBTdHJpbmcoZmVjaGFPYmouZ2V0SG91cnMoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IG1pbnV0b3NMb2NhbCA9IFN0cmluZyhmZWNoYU9iai5nZXRNaW51dGVzKCkpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICBjb25zdCBzZWd1bmRvc0xvY2FsID0gU3RyaW5nKGZlY2hhT2JqLmdldFNlY29uZHMoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuXHJcbiAgICAvLyBEZXZ1ZWx2ZSBsYSBmZWNoYSBjb21iaW5hZGFcclxuICAgIHJldHVybiBgJHthw7FvfS0ke21lc30tJHtkw61hfVQke2hvcmFzTG9jYWx9OiR7bWludXRvc0xvY2FsfToke3NlZ3VuZG9zTG9jYWx9YDtcclxuICB9XHJcbn1cclxuIl19