Files
Plataforma-de-desarrolladores/SIG.Web/Scripts/sig-grid-agrupado.js
Jorge Luis caudillo esparza 1daf15d92f --
2026-09-28 08:26:04 -07:00

191 lines
5.4 KiB
JavaScript

(function (window, $) {
'use strict';
if (!$) {
return;
}
function estadoGrupo($fila) {
var estado = $fila.attr('data-sig-expanded');
if (estado === 'true' || estado === 'false') {
return estado === 'true';
}
return $fila.attr('data-sig-expanded-default') !== 'false';
}
function actualizarIcono($fila, abierto) {
var $iconos = $fila.find('.sig-grid-icono-agrupacion');
/*
* Compatibilidad con agrupaciones existentes que todavía
* tienen el icono dentro del elemento alternador pero aún no
* usan la clase explícita sig-grid-icono-agrupacion.
*/
if ($iconos.length === 0) {
$iconos = $fila.find('.sig-grid-alternar-grupo i.fa');
}
$iconos
.removeClass('fa-chevron-up fa-chevron-down')
.addClass(abierto ? 'fa-chevron-up' : 'fa-chevron-down');
}
function inicializar() {
$('.sig-grid-agrupado:not(.rendered)').each(function () {
var $grid = $(this);
$grid.find('tr[data-sig-group-row="1"]').each(function () {
var $fila = $(this);
var abierto = estadoGrupo($fila);
$fila.attr(
'data-sig-expanded',
abierto ? 'true' : 'false'
);
$fila.find('.sig-grid-alternar-grupo, .sig-grid-alternar-grupo-accion')
.attr(
'aria-expanded',
abierto ? 'true' : 'false'
);
});
refrescar($grid);
/*
* Se marca hasta que terminó correctamente la inicialización.
* En cada load se revisan todos los grids, pero sólo se
* procesan los que todavía no tienen la clase rendered.
*/
$grid.addClass('rendered');
});
}
function refrescar($grid) {
var estados = {};
$grid.find('tr[data-sig-group-row="1"]').each(function () {
var $fila = $(this);
estados[$fila.attr('data-sig-group-id')] = estadoGrupo($fila);
});
$grid.find('tr[data-sig-level]').each(function () {
var $fila = $(this);
var padre = $fila.attr('data-sig-parent-group');
var visible = true;
var visitados = {};
while (padre) {
if (visitados[padre]) {
break;
}
visitados[padre] = true;
if (estados[padre] === false) {
visible = false;
break;
}
var $padre = $grid
.find(
'tr[data-sig-group-id="' +
escaparSelector(padre) +
'"]'
)
.first();
padre = $padre.attr('data-sig-parent-group');
}
$fila.toggle(visible);
});
$grid.find('tr[data-sig-group-row="1"]').each(function () {
var $fila = $(this);
var abierto = estadoGrupo($fila);
$fila.find('.sig-grid-alternar-grupo, .sig-grid-alternar-grupo-accion')
.attr(
'aria-expanded',
abierto ? 'true' : 'false'
);
actualizarIcono($fila, abierto);
});
}
function escaparSelector(valor) {
return String(valor || '')
.replace(
/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g,
'\\$1'
);
}
/*
* Compatibilidad:
* - sig-grid-alternar-grupo conserva el comportamiento existente.
* - sig-grid-alternar-grupo-accion permite agregar un alternador
* compacto sin heredar los estilos visuales del alternador de fila.
* El icono visual se identifica con sig-grid-icono-agrupacion.
*/
if (window.SIG_GRID_AGRUPADO_EVENTOS !== true) {
window.SIG_GRID_AGRUPADO_EVENTOS = true;
$(document).on(
'click.sigGridAgrupado',
'.sig-grid-agrupado .sig-grid-alternar-grupo, ' +
'.sig-grid-agrupado .sig-grid-alternar-grupo-accion',
function (evento) {
evento.preventDefault();
var $fila = $(this)
.closest('tr[data-sig-group-row="1"]');
if ($fila.length === 0) {
return;
}
var $grid = $fila.closest('.sig-grid-agrupado');
$fila.attr(
'data-sig-expanded',
estadoGrupo($fila) ? 'false' : 'true'
);
refrescar($grid);
}
);
}
window.SIGGridAgrupado = {
inicializar: inicializar,
refrescar: refrescar
};
/*
* Sys.Application.load se ejecuta en la carga inicial y después
* de cada postback parcial. No se inspecciona qué UpdatePanel
* cambió: se revisan todos los grids no renderizados.
*/
if (
window.Sys &&
Sys.Application &&
window.SIG_GRID_AGRUPADO_LOAD !== true
) {
window.SIG_GRID_AGRUPADO_LOAD = true;
Sys.Application.add_load(function () {
inicializar();
});
} else if (!(window.Sys && Sys.Application)) {
$(function () {
inicializar();
});
}
})(window, window.jQuery);