194 lines
6.6 KiB
JavaScript
194 lines
6.6 KiB
JavaScript
import { booleanStatusCatalog, statusIntBadgeBgCatalogCss, statusIntBadgeBgCatalog } from './globalConfig';
|
|
import {routes} from '../../../../../laravel-vuexy-admin/resources/assets/js/bootstrap-table/globalConfig.js';
|
|
|
|
export const userActionFormatter = (value, row, index) => {
|
|
if (!row.id) return '';
|
|
|
|
const showUrl = routes['admin.user.show'].replace(':id', row.id);
|
|
const editUrl = routes['admin.user.edit'].replace(':id', row.id);
|
|
const deleteUrl = routes['admin.user.delete'].replace(':id', row.id);
|
|
|
|
return `
|
|
<div class="flex space-x-2">
|
|
<a href="${editUrl}" title="Editar" class="icon-button hover:text-slate-700">
|
|
<i class="ti ti-edit"></i>
|
|
</a>
|
|
<a href="${deleteUrl}" title="Eliminar" class="icon-button hover:text-slate-700">
|
|
<i class="ti ti-trash"></i>
|
|
</a>
|
|
<a href="${showUrl}" title="Ver" class="icon-button hover:text-slate-700">
|
|
<i class="ti ti-eye"></i>
|
|
</a>
|
|
</div>
|
|
`.trim();
|
|
};
|
|
|
|
export const dynamicBooleanFormatter = (value, row, index, options = {}) => {
|
|
const { tag = 'default', customOptions = {} } = options;
|
|
const catalogConfig = booleanStatusCatalog[tag] || {};
|
|
|
|
const finalOptions = {
|
|
...catalogConfig,
|
|
...customOptions, // Permite sobreescribir la configuración predeterminada
|
|
...options // Permite pasar opciones rápidas
|
|
};
|
|
|
|
const {
|
|
trueIcon = '',
|
|
falseIcon = '',
|
|
trueText = 'Sí',
|
|
falseText = 'No',
|
|
trueClass = 'badge bg-label-success',
|
|
falseClass = 'badge bg-label-danger',
|
|
iconClass = 'text-green-800'
|
|
} = finalOptions;
|
|
|
|
const trueElement = !trueIcon && !trueText ? '' : `<span class="${trueClass}">${trueIcon ? `<i class="${trueIcon} ${iconClass}"></i> ` : ''}${trueText}</span>`;
|
|
const falseElement = !falseIcon && !falseText ? '' : `<span class="${falseClass}">${falseIcon ? `<i class="${falseIcon}"></i> ` : ''}${falseText}</span>`;
|
|
|
|
return value? trueElement : falseElement;
|
|
};
|
|
|
|
export const dynamicBadgeFormatter = (value, row, index, options = {}) => {
|
|
const {
|
|
color = 'primary', // Valor por defecto
|
|
textColor = '', // Permite agregar color de texto si es necesario
|
|
additionalClass = '' // Permite añadir clases adicionales
|
|
} = options;
|
|
|
|
return `<span class="badge bg-${color} ${textColor} ${additionalClass}">${value}</span>`;
|
|
};
|
|
|
|
export const statusIntBadgeBgFormatter = (value, row, index) => {
|
|
return value
|
|
? `<span class="badge bg-label-${statusIntBadgeBgCatalogCss[value]}">${statusIntBadgeBgCatalog[value]}</span>`
|
|
: '';
|
|
}
|
|
|
|
export const textNowrapFormatter = (value, row, index) => {
|
|
if (!value) return '';
|
|
return `<span class="text-nowrap">${value}</span>`;
|
|
}
|
|
|
|
|
|
export const toCurrencyFormatter = (value, row, index) => {
|
|
return isNaN(value) ? '' : Number(value).toCurrency();
|
|
}
|
|
|
|
export const numberFormatter = (value, row, index) => {
|
|
return isNaN(value) ? '' : Number(value);
|
|
}
|
|
|
|
export const monthFormatter = (value, row, index) => {
|
|
switch (parseInt(value)) {
|
|
case 1:
|
|
return 'Enero';
|
|
case 2:
|
|
return 'Febrero';
|
|
case 3:
|
|
return 'Marzo';
|
|
case 4:
|
|
return 'Abril';
|
|
case 5:
|
|
return 'Mayo';
|
|
case 6:
|
|
return 'Junio';
|
|
case 7:
|
|
return 'Julio';
|
|
case 8:
|
|
return 'Agosto';
|
|
case 9:
|
|
return 'Septiembre';
|
|
case 10:
|
|
return 'Octubre';
|
|
case 11:
|
|
return 'Noviembre';
|
|
case 12:
|
|
return 'Diciembre';
|
|
}
|
|
}
|
|
|
|
export const humaneTimeFormatter = (value, row, index) => {
|
|
return isNaN(value) ? '' : Number(value).humaneTime();
|
|
}
|
|
|
|
/**
|
|
* Genera la URL del avatar basado en iniciales o devuelve la foto de perfil si está disponible.
|
|
* @param {string} fullName - Nombre completo del usuario.
|
|
* @param {string|null} profilePhoto - Ruta de la foto de perfil.
|
|
* @returns {string} - URL del avatar.
|
|
*/
|
|
function getAvatarUrl(fullName, profilePhoto) {
|
|
const baseUrl = window.baseUrl || '';
|
|
|
|
if (profilePhoto) {
|
|
return `${baseUrl}storage/profile-photos/${profilePhoto}`;
|
|
}
|
|
|
|
return `${baseUrl}admin/usuario/avatar/?name=${fullName}`;
|
|
}
|
|
|
|
/**
|
|
* Formatea la columna del perfil de usuario con avatar, nombre y correo.
|
|
*/
|
|
export const userProfileFormatter = (value, row, index) => {
|
|
if (!row.id) return '';
|
|
|
|
const profileUrl = routes['admin.user.show'].replace(':id', row.id);
|
|
const avatar = getAvatarUrl(row.full_name, row.profile_photo_path);
|
|
const email = row.email ? row.email : 'Sin correo';
|
|
|
|
return `
|
|
<div class="flex items-center space-x-3" style="min-width: 240px">
|
|
<a href="${profileUrl}" class="flex-shrink-0">
|
|
<img src="${avatar}" alt="Avatar" class="w-10 h-10 rounded-full border border-gray-300 shadow-sm hover:scale-105 transition-transform">
|
|
</a>
|
|
<div class="truncate">
|
|
<a href="${profileUrl}" class="font-medium text-slate-700 hover:underline block text-wrap">${row.full_name}</a>
|
|
<small class="text-muted block truncate">${email}</small>
|
|
</div>
|
|
</div>
|
|
`;
|
|
};
|
|
|
|
/**
|
|
* Formatea la columna del perfil de contacto con avatar, nombre y correo.
|
|
*/
|
|
export const contactProfileFormatter = (value, row, index) => {
|
|
if (!row.id) return '';
|
|
|
|
const profileUrl = routes['admin.contact.show'].replace(':id', row.id);
|
|
const avatar = getAvatarUrl(row.full_name, row.profile_photo_path);
|
|
const email = row.email ? row.email : 'Sin correo';
|
|
|
|
return `
|
|
<div class="flex items-center space-x-3" style="min-width: 240px">
|
|
<a href="${profileUrl}" class="flex-shrink-0">
|
|
<img src="${avatar}" alt="Avatar" class="w-10 h-10 rounded-full border border-gray-300 shadow-sm hover:scale-105 transition-transform">
|
|
</a>
|
|
<div class="truncate">
|
|
<a href="${profileUrl}" class="font-medium text-slate-700 hover:underline block text-wrap">${row.full_name}</a>
|
|
<small class="text-muted block truncate">${email}</small>
|
|
</div>
|
|
</div>
|
|
`;
|
|
};
|
|
|
|
|
|
|
|
export const creatorFormatter = (value, row, index) => {
|
|
if (!row.creator) return '';
|
|
|
|
const email = row.creator_email || 'Sin correo';
|
|
const showUrl = routes['admin.user.show'].replace(':id', row.id);
|
|
|
|
|
|
return `
|
|
<div class="flex flex-col">
|
|
<a href="${showUrl}" class="font-medium text-slate-600 hover:underline block text-wrap">${row.creator}</a>
|
|
<small class="text-muted">${email}</small>
|
|
</div>
|
|
`;
|
|
};
|
|
|