(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 = $('').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));