328 lines
14 KiB
JavaScript
328 lines
14 KiB
JavaScript
(function (ventana, documento, $) {
|
|
'use strict';
|
|
|
|
if (ventana.SIGLotesEtapa) {
|
|
return;
|
|
}
|
|
|
|
var instancias = Object.create(null);
|
|
var resguardando = false;
|
|
|
|
function buscarPropietario(selector, clave) {
|
|
return $(selector).filter(function () {
|
|
return $(this).attr('data-lotes-propietario') === clave;
|
|
}).first();
|
|
}
|
|
|
|
function redimensionar(estado) {
|
|
if (estado.mapa && ventana.SIGVisorGis) {
|
|
ventana.SIGVisorGis.redimensionar(estado.mapa);
|
|
}
|
|
}
|
|
|
|
function devolverMapa(estado) {
|
|
if (estado.mapa && estado.origen.length) {
|
|
estado.mapa.detach().appendTo(estado.origen);
|
|
estado.origen.removeClass('sig-lotes-mapa-reservado').css('height', '');
|
|
redimensionar(estado);
|
|
}
|
|
}
|
|
|
|
function moverAlPanel(estado) {
|
|
if (!estado.mapa || !estado.mapa.length) {
|
|
return;
|
|
}
|
|
if (!estado.origen.hasClass('sig-lotes-mapa-reservado')) {
|
|
estado.altoOrigen = estado.origen.outerHeight();
|
|
}
|
|
estado.origen.height(estado.altoOrigen).addClass('sig-lotes-mapa-reservado');
|
|
estado.mapa.detach().appendTo(estado.panel.find('[data-lotes-mapa-panel]'));
|
|
redimensionar(estado);
|
|
}
|
|
|
|
function actualizarSeleccion(estado) {
|
|
var raiz = buscarPropietario('.sig-lotes-etapa', estado.clave);
|
|
raiz.find('[data-lotes-fila]').each(function () {
|
|
var seleccionada = String($(this).attr('data-lotes-fila')) === String(estado.lote || '');
|
|
$(this).toggleClass('sig-lotes-fila-seleccionada', seleccionada)
|
|
.attr('aria-selected', seleccionada ? 'true' : 'false');
|
|
});
|
|
var fila = raiz.find('[data-lotes-fila]').filter(function () {
|
|
return String($(this).attr('data-lotes-fila')) === String(estado.lote || '');
|
|
}).first();
|
|
var contenedor = estado.panel.find('[data-lotes-menu-panel]').empty();
|
|
var acciones = fila.find('.sig-menu-acciones').clone(false);
|
|
// Los enlaces conservan el destino de postback del grid y sus permisos de servidor.
|
|
acciones.find('[id]').removeAttr('id');
|
|
acciones.find('.sig-menu-acciones-boton').attr('aria-expanded', 'false');
|
|
acciones.find('.sig-lotes-ver-mapa').closest('li').remove();
|
|
acciones.appendTo(contenedor);
|
|
}
|
|
|
|
function consultarDetalle(estado) {
|
|
if (!estado.panel.hasClass('sig_panel_open') || !estado.pendiente) {
|
|
return;
|
|
}
|
|
var gestor = ventana.Sys && Sys.WebForms && Sys.WebForms.PageRequestManager.getInstance();
|
|
if (gestor && gestor.get_isInAsyncPostBack()) {
|
|
return;
|
|
}
|
|
var boton = documento.getElementById(estado.panel.attr('data-lotes-consultar'));
|
|
var campo = documento.getElementById(estado.panel.attr('data-lotes-campo'));
|
|
if (!boton || !campo) {
|
|
return;
|
|
}
|
|
campo.value = estado.pendiente;
|
|
estado.pendiente = null;
|
|
boton.click();
|
|
}
|
|
|
|
function abrirDetalle(estado, lote) {
|
|
estado.panel[0].click();
|
|
estado.lote = lote.CveFraccionamientoLote;
|
|
estado.vinculo = lote.GISPoligonoClave;
|
|
estado.panel.find('[data-lotes-titulo]').text(lote.Nombre || ('Lote ' + estado.lote));
|
|
estado.panel.find('[data-lotes-estado]').text('Consultando información del lote...');
|
|
estado.panel.find('[data-lotes-detalle]').hide();
|
|
estado.panel.find('[data-lotes-desvincular]').toggle(!!estado.vinculo);
|
|
actualizarSeleccion(estado);
|
|
ventana.SIGPanelLateral.abrir(estado.panel);
|
|
moverAlPanel(estado);
|
|
estado.pendiente = estado.lote;
|
|
consultarDetalle(estado);
|
|
}
|
|
|
|
function conectarMapa(estado) {
|
|
if (!estado.mapa || estado.mapa.is('[data-sig-lotes-mapa-inicializado]')) {
|
|
return;
|
|
}
|
|
estado.mapa.on('sig:loteSeleccionado', function (evento, lote) {
|
|
abrirDetalle(estado, lote);
|
|
});
|
|
estado.mapa.attr('data-sig-lotes-mapa-inicializado', '1');
|
|
}
|
|
|
|
function conectarPanel(estado) {
|
|
var panel = estado.panel;
|
|
if (panel.is('[data-sig-lotes-panel-inicializado]')) {
|
|
return;
|
|
}
|
|
estado.anclaPanel = $('<span class="sig-lotes-ancla-panel" hidden></span>').insertBefore(panel);
|
|
// El origen del panel también queda fuera de los UpdatePanel.
|
|
panel.detach().appendTo($('form').first());
|
|
panel.on('cerrado.sig.panel', function () {
|
|
estado.pendiente = null;
|
|
if (!resguardando) {
|
|
devolverMapa(estado);
|
|
}
|
|
});
|
|
panel.on('click.sigLotes', '[data-lotes-desvincular]', function () {
|
|
var boton = $(this);
|
|
if (!estado.vinculo || boton.prop('disabled')) {
|
|
return;
|
|
}
|
|
boton.prop('disabled', true);
|
|
var lote = estado.lote;
|
|
var clave = estado.vinculo;
|
|
panel.find('[data-lotes-estado]').text('Desvinculando lote...');
|
|
$.ajax({
|
|
url: estado.mapa.attr('data-gis-url'),
|
|
type: 'POST',
|
|
dataType: 'json',
|
|
timeout: 30000,
|
|
data: {
|
|
metodo: 'DesvincularLote',
|
|
CveFraccionamientoEtapa: estado.etapa,
|
|
CveFraccionamientoLote: lote,
|
|
ClavePoligono: clave
|
|
}
|
|
}).done(function (respuesta) {
|
|
if (!respuesta.success) {
|
|
panel.find('[data-lotes-estado]').text(respuesta.message || 'No fue posible desvincular.');
|
|
return;
|
|
}
|
|
if (estado.lote === lote && estado.vinculo === clave) {
|
|
estado.vinculo = '';
|
|
boton.hide();
|
|
panel.find('[data-lotes-estado]').text('Lote desvinculado. Puede seleccionar el polígono para vincular otro lote.');
|
|
estado.lote = null;
|
|
actualizarSeleccion(estado);
|
|
}
|
|
ventana.SIGVisorGis.limpiarSeleccion(estado.mapa, lote);
|
|
}).fail(function (respuesta) {
|
|
panel.find('[data-lotes-estado]').text(
|
|
respuesta.responseJSON && respuesta.responseJSON.message ||
|
|
'No se pudo confirmar la desvinculación. Seleccione nuevamente el polígono.');
|
|
}).always(function () {
|
|
boton.prop('disabled', false);
|
|
});
|
|
});
|
|
panel.attr('data-sig-lotes-panel-inicializado', '1');
|
|
}
|
|
|
|
function restaurarMapas() {
|
|
if (resguardando) {
|
|
return;
|
|
}
|
|
$('.sig-lotes-mapa-origen').each(function () {
|
|
var origen = $(this);
|
|
var clave = origen.attr('data-lotes-propietario');
|
|
var etapa = origen.attr('data-lotes-etapa');
|
|
var estado = instancias[clave];
|
|
var paneles = $('.sig-lotes-panel').filter(function () {
|
|
return $(this).attr('data-lotes-propietario') === clave;
|
|
});
|
|
if (!estado) {
|
|
estado = instancias[clave] = { clave: clave, etapa: etapa, panel: paneles.first(), origen: origen };
|
|
}
|
|
var nuevoPanel = paneles.filter(function () {
|
|
return this !== estado.panel[0];
|
|
}).first();
|
|
if (nuevoPanel.length) {
|
|
ventana.SIGPanelLateral.cerrar(estado.panel);
|
|
estado.panel.remove();
|
|
estado.panel = nuevoPanel;
|
|
}
|
|
var reemplazoOrigen = estado.origen[0] !== origen[0];
|
|
estado.origen = origen;
|
|
var nuevoMapa = origen.find('.sig-visor-gis').first();
|
|
if (estado.etapa !== etapa || (reemplazoOrigen && !nuevoMapa.length)) {
|
|
ventana.SIGPanelLateral.cerrar(estado.panel);
|
|
if (estado.mapa) {
|
|
estado.mapa.remove();
|
|
}
|
|
estado.mapa = null;
|
|
estado.lote = null;
|
|
estado.pendiente = null;
|
|
estado.reabrirPanel = false;
|
|
estado.etapa = etapa;
|
|
origen.removeClass('sig-lotes-mapa-reservado').css('height', '');
|
|
}
|
|
if (estado.mapa && nuevoMapa.length && nuevoMapa[0] !== estado.mapa[0]) {
|
|
nuevoMapa.remove();
|
|
}
|
|
if (!estado.mapa || !estado.mapa.length) {
|
|
estado.mapa = nuevoMapa;
|
|
}
|
|
conectarPanel(estado);
|
|
conectarMapa(estado);
|
|
if (estado.reabrirPanel) {
|
|
estado.reabrirPanel = false;
|
|
ventana.SIGPanelLateral.abrir(estado.panel);
|
|
}
|
|
if (estado.mapa) {
|
|
estado.mapa.removeClass('sig-lotes-mapa-resguardado');
|
|
}
|
|
if (estado.panel.hasClass('sig_panel_open')) {
|
|
moverAlPanel(estado);
|
|
} else {
|
|
devolverMapa(estado);
|
|
}
|
|
actualizarSeleccion(estado);
|
|
});
|
|
$.each(instancias, function (clave, estado) {
|
|
if (buscarPropietario('.sig-lotes-mapa-origen', clave).length) {
|
|
return;
|
|
}
|
|
ventana.SIGPanelLateral.cerrar(estado.panel);
|
|
if (estado.mapa) {
|
|
estado.mapa.remove();
|
|
}
|
|
estado.panel.remove();
|
|
delete instancias[clave];
|
|
});
|
|
}
|
|
|
|
function resguardarMapas(emisor, argumentos) {
|
|
// pageLoading ocurre después de recibir la respuesta y antes de reemplazar el DOM.
|
|
resguardando = true;
|
|
$.each(instancias, function (clave, estado) {
|
|
if (!estado.mapa || !estado.mapa.length) {
|
|
return;
|
|
}
|
|
estado.altoOrigen = estado.origen.hasClass('sig-lotes-mapa-reservado') ?
|
|
estado.altoOrigen : estado.origen.outerHeight();
|
|
estado.origen.height(estado.altoOrigen).addClass('sig-lotes-mapa-reservado');
|
|
estado.mapa.detach().appendTo($('form').first()).addClass('sig-lotes-mapa-resguardado');
|
|
});
|
|
var reemplazos = argumentos && argumentos.get_panelsUpdating ? argumentos.get_panelsUpdating() : [];
|
|
var eliminados = argumentos && argumentos.get_panelsDeleting ? argumentos.get_panelsDeleting() : [];
|
|
$.each(instancias, function (clave, estado) {
|
|
var ancla = estado.anclaPanel && estado.anclaPanel[0];
|
|
var reemplazaPanel = $.grep([].concat(reemplazos, eliminados), function (panel) {
|
|
return ancla && (panel === ancla || $.contains(panel, ancla));
|
|
}).length > 0;
|
|
if (reemplazaPanel) {
|
|
// El mapa ya está a salvo. WebForms debe disponer las pestañas y controles
|
|
// del panel que el servidor va a reemplazar para no duplicar componentes AJAX.
|
|
estado.reabrirPanel = estado.panel.hasClass('sig_panel_open');
|
|
ventana.SIGPanelLateral.cerrar(estado.panel);
|
|
estado.panel.detach().insertAfter(estado.anclaPanel);
|
|
}
|
|
});
|
|
resguardando = false;
|
|
}
|
|
|
|
function inicializar() {
|
|
restaurarMapas();
|
|
$.each(instancias, function (clave, estado) {
|
|
if (estado.mapa) {
|
|
estado.mapa.removeClass('sig-lotes-mapa-resguardado');
|
|
}
|
|
var contenido = estado.panel.find('[data-lotes-detalle]');
|
|
var coincide = !estado.pendiente &&
|
|
String(contenido.attr('data-lotes-detalle')) === String(estado.lote);
|
|
contenido.toggle(coincide);
|
|
if (coincide) {
|
|
estado.panel.find('[data-lotes-estado]').text('');
|
|
} else if (estado.lote && !estado.pendiente && estado.panel.hasClass('sig_panel_open')) {
|
|
estado.panel.find('[data-lotes-estado]').text('No fue posible mostrar el lote. Selecciónelo nuevamente.');
|
|
}
|
|
ventana.setTimeout(function () { consultarDetalle(estado); }, 0);
|
|
});
|
|
$('.sig-lotes-etapa .select2me:not([data-sig-lotes-select-inicializado])').each(function () {
|
|
var elemento = $(this);
|
|
if (typeof elemento.select2 !== 'function') {
|
|
return;
|
|
}
|
|
if (!elemento.data('select2') && !elemento.hasClass('select2-hidden-accessible')) {
|
|
elemento.select2({ width: '100%' });
|
|
}
|
|
elemento.attr('data-sig-lotes-select-inicializado', '1');
|
|
});
|
|
}
|
|
|
|
$(documento).on('click.sigLotes', '.sig-lotes-ver-mapa', function (evento) {
|
|
evento.preventDefault();
|
|
var boton = $(this);
|
|
var lote = boton.attr('data-lote');
|
|
// El menú puede estar temporalmente en el formulario, fuera del grid.
|
|
var estado;
|
|
$.each(instancias, function (clave, candidata) {
|
|
if (buscarPropietario('.sig-lotes-etapa', clave)
|
|
.find('[data-lotes-fila="' + lote + '"]').length) {
|
|
estado = candidata;
|
|
return false;
|
|
}
|
|
});
|
|
if (!estado || !estado.mapa || !estado.mapa.length) {
|
|
if (ventana.SIGAlerts) {
|
|
ventana.SIGAlerts.enqueue({ type: 4, message: 'La etapa no tiene un mapa disponible.' });
|
|
}
|
|
return;
|
|
}
|
|
ventana.SIGVisorGis.verLote(estado.mapa, lote);
|
|
});
|
|
|
|
ventana.SIGLotesEtapa = {
|
|
inicializar: inicializar,
|
|
restaurarMapas: restaurarMapas
|
|
};
|
|
$(inicializar);
|
|
if (ventana.Sys && Sys.WebForms && Sys.WebForms.PageRequestManager) {
|
|
var gestor = Sys.WebForms.PageRequestManager.getInstance();
|
|
gestor.add_pageLoading(resguardarMapas);
|
|
gestor.add_endRequest(inicializar);
|
|
}
|
|
}(window, document, jQuery));
|