191 lines
5.4 KiB
JavaScript
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);
|