/* * Codificación UTF-8 * Funciones para trabajar con paneles tabulares * * FUNCIONES: * - deselectAllCheckTable(claseManejadora) * - checkUnique(id, fila, json, claseManejadora, panel) * - checkRow(id, fila, check, panel, type, claseM) * - onRowEvent(e, idButton) * - performSelectAction( options:{claseManejadora , panelOn, accion} ) * - clickedMulticheckerOption( e ) * - updatePositionMulticheckerOption( e ) * - clickedCheckAll( e ) */ if( !gvh.Table || gvh.versionCompare(gvh.Table.VERSION, gvh.VERSION) < 0 ) { gvh.showConsoleMsg( 'log', 'gvh.Table : Inicializando...' ); gvh.Table = function() { // REVIEW : De momento está vacío, pero debería convertirse en un componente. // NOP : No hacer nada } gvh.Table.VERSION = '5.0.0'; /** * FUNCIÓN: deselectCheckTable() */ //$.fn.deselectAllCheckTable = function( options ) gvh.deselectAllCheckTable = function(claseManejadora, panel) { let raizJSON = gvh.getRoot( claseManejadora, 'lis') ; let numReg = gvh.getNumReg( raizJSON ); for( let i=0; i 0 || target.is('[data-gvhfunction=checkRow]') ) { return; } let id = $(this).closest( '[data-gvhtable=DataTable]' ).attr( 'id' ); let panel = $(this).attr( 'data-gvhpanelon' ); let claseM = $(this).attr( 'data-gvhClaseManejadora' ); let tr = $( e.target ).closest( 'tr[data-gvhpaneljson=lis]' ); if( tr ) { let checkbox = tr.find( '[data-gvhfunction=checkRow]'); if( checkbox ) { if( !checkbox.is(':checked') ) { checkbox.click(); } $( '[data-gvhclasemanejadora='+claseM+'] #'+idButton ).click(); } } return false; }//$.fn.onRowEvent /** * FUNCIÓN: performSelectAction() * Des/selecciona las filas de una tabla (y marca/desmarca sus checkbox correspondiente) de acuerdo a la acción pasada como parámetro. */ gvh.Table.performSelectAction = function( params ) { gvh.showConsoleMsg( 'log', 'performSelectAction : ' + params.accion + ' on ' + params.claseManejadora + '[' + params.panelOn + '/' + params.panelJSON + ']'); // Combinamos los parámetros con los valores por defecto. params = $.extend( { claseManejadora: '' , panelOn: '' , panelJSON: '' , accion: '' }, params ); if( !params.panelJSON ) { params.panelJSON = params.panelOn.substring( 0, 3 ); } let raizJSON = gvh.getRoot( params.claseManejadora, params.panelJSON ); let numReg = gvh.getNumReg( raizJSON ); let rowsPag = gvh.getRowsPag( raizJSON ); let pagActive = gvh.getPagActive( raizJSON ); // // Establecemos el bloque de filas a actualizar su estado de seleccionado. // let bloque = []; switch( params.accion ) { case 'selectAll' : case 'unselectAll' : case 'invert' : bloque['ini'] = 0; bloque['fin'] = numReg-1; break; case 'selectPage' : bloque = gvh.blockRegPagina( raizJSON, pagActive ); bloque['fin'] = Math.min( bloque['fin'], numReg-1 ); break; } // // Actualizamos el estado interno de selección de las filas correspondientes. // let checked; let row; for( row=bloque['ini']; row<=bloque['fin']; row++ ) { let checkedInitial = (raizJSON['data'][row]['gvhJS_selected'] == 'selected'); // Realizamos la acción deseada sobre el valor del check. switch( params.accion ) { case 'selectAll' : checked = true; break; case 'unselectAll' : checked = false; break; case 'invert' : checked = ( !checkedInitial ); break; case 'selectPage': let pagActual = Math.floor( row/rowsPag ); if( pagActual == pagActive ) { checked = true; } break; } if( checked != checkedInitial ) { // Des/seleccionamos la fila actual en la matriz de datos JSON. let operacion = ( checked ? 'add' : 'sub' ); gvh.setSelectedReg( raizJSON, row, operacion ); } } // // Actualizamos la interfaz, para mostrar el estado de la selección de todas las filas. // let numChecked = 0; for( row=0; row<=numReg; row++ ) { let pagActual = Math.floor( row/rowsPag ); checked = (raizJSON['data'][row]['gvhJS_selected'] == 'selected'); let stateRow = ( checked ? 'selected' : 'nada' ); if( checked ) { numChecked++; } if( pagActual == pagActive ) { let filaEnPagina = row%rowsPag; // Des/Marcamos como seleccionada la fila actual. let tr = $( 'tr[id='+params.panelOn+'_'+filaEnPagina+'][data-gvhClaseManejadora='+params.claseManejadora+']' ); tr.attr( 'data-gvhStateRow', stateRow ) if( checked ) { tr.addClass( 'rowOn' ); } else { tr.removeClass( 'rowOn' ); } // Des/Marcamos el checkbox de la fila actual. tr.find( 'input:checkbox[data-gvhClaseManejadora='+params.claseManejadora+'][data-gvhFunction=checkRow][data-gvhRow='+filaEnPagina+']' ).prop( 'checked', checked ); } } // // Actualizamos el estado de la casilla 'checkAll' de la tabla, de acuerdo a si están seleccionadas todas las filas o no. // let checkedAll = (numChecked == 0 ? false : (numChecked == numReg) ? true : null); if( checkedAll !== null ) { $( 'input:checkbox[data-gvhFunction=checkAll][data-gvhClaseManejadora='+params.claseManejadora+']' ).prop( 'checked', checkedAll ); } }//gvh.Table.performSelectAction /** * click: multi-checker */ gvh.Table.clickedMulticheckerOption = function( e ) { gvh.Table.performSelectAction( { claseManejadora: $(this).closest('[data-gvhClaseManejadora]').attr( 'data-gvhClaseManejadora' ) , panelOn: $(this).closest('[data-gvhpanelon]').attr( 'data-gvhpanelon' ) , panelJSON: $(this).closest('[data-gvhpaneljson]').attr( 'data-gvhpaneljson' ) , accion: $(this).attr( 'data-gvhMultiChecker' ) } ); // Devolvemos el foco al botón que abre el desplegable. let target = $(this).closest( '[data-target]' ).attr( 'data-target' ); $(target).find( '[data-toggle="dropdown"]' ).focus(); }//gvh.Table.clickedMulticheckerOption $(document).off('click.multi-checker').on( 'click.multi-checker', '[data-gvhMultiChecker]', gvh.Table.clickedMulticheckerOption ); /** * */ gvh.Table.updatePositionMulticheckerOption = function( e ) { if( gvh.checkAllMultiSelectDropdownMenu ) { let dataTarget = $( gvh.checkAllMultiSelectDropdownMenu.attr('data-target') ); if( dataTarget ) { // grab the new offset position var eOffset = $( dataTarget ) .offset(); // make sure to place it where it would normally go (this could be improved) gvh.checkAllMultiSelectDropdownMenu.css( { 'display': 'block' , 'top': eOffset.top + dataTarget.outerHeight() , 'left': eOffset.left } ); } } }//gvh.Table.updatePositionMulticheckerOption /** * Para que el desplegable del checkAll se muestre completamente cuando está en una 'table-responsive' */ $(document).offon( 'show.bs.dropdown hide.bs.dropdown', '.table-responsive .multi-checker', function (e) { // NOTA : SE ha modificado el comportamiento de 'bootstrap.js->Dropdown.prototype.keydown if( e.type == 'show') { // grab the menu if( gvh.checkAllMultiSelectDropdownMenu ) gvh.checkAllMultiSelectDropdownMenu.detach(); gvh.checkAllMultiSelectDropdownMenu = $(e.target).find('.dropdown-menu'); // locate nearest container: gvhModal or gvhPage let container = $(e.target).closest( '.gvhModal , #gvhPage' ); // update zIndex based on nearest container gvh.checkAllMultiSelectDropdownMenu.css('z-index', container.css('z-index') + 1000); // 1000 = $zindex-dropdown de Bootstrap // detach it and append it to the body $( 'body' ).append( gvh.checkAllMultiSelectDropdownMenu.detach() ); gvh.Table.updatePositionMulticheckerOption(); // on resize, update absolute position //$(document).on( 'resizeEnd.checkAllMultiSelectDropdownMenu', gvh.resizeEnd_checkAllMultiSelectDropdownMenu ); gvh.checkAllMultiSelectDropdownMenu.focus(); } else // 'hide' { $(e.target).append( gvh.checkAllMultiSelectDropdownMenu.detach() ); gvh.checkAllMultiSelectDropdownMenu.hide(); // disable on resize event //$(document).off( 'resizeEnd.checkAllMultiSelectDropdownMenu' ); delete gvh.checkAllMultiSelectDropdownMenu; } } ); /** * Para que al redimensionar la ventana se actualice la posición absoluta del desplegable del checkAll activo. */ $(document).off( 'resizeEnd.checkAllMultiSelectDropdownMenu' ).on( 'resizeEnd.checkAllMultiSelectDropdownMenu', function( e ) { gvh.Table.updatePositionMulticheckerOption(); } ); /** * Para que al hacer scroll en una ventana modal se actualice la posición absoluta del desplegable del checkAll activo. */ $(document).on( 'shown.bs.modal', function() { $('.modal-open .modal').off( 'scroll.checkAllMultiSelectDropdownMenu').on( 'scroll.checkAllMultiSelectDropdownMenu', function( e ) { gvh.Table.updatePositionMulticheckerOption(); } ); } ); /** * click: check general */ gvh.Table.clickedCheckAll = function( e ) { let checked = $(this).is( ':checked' ); let accion = (checked ? 'selectAll' : 'unselectAll'); gvh.Table.performSelectAction( { claseManejadora: $(this).closest('[data-gvhClaseManejadora]').attr( 'data-gvhClaseManejadora' ) , panelOn: $(this).closest('[data-gvhpanelon]').attr( 'data-gvhpanelon' ) , panelJSON: $(this).closest('[data-gvhpaneljson]').attr( 'data-gvhpaneljson' ) , accion: accion } ); }//gvh.clickedCheckAll $(document).off('click.checkAll').on( 'click.checkAll', '.multi-checker input:checkbox[data-gvhFunction=checkAll]', gvh.Table.clickedCheckAll ); /* ********************* * EVENTOS DESDE EL DOM *********************** */ /* * mouseover/mouseout: ratón sobre las filas */ $(document).off('click.orderTable').on( 'click.orderTable', 'label[data-gvhFunction="orderTable"]', function( e ) { e.preventDefault(); e.stopImmediatePropagation(); e.stopPropagation(); gvh.orderTable = (gvh.orderTable == 'asc' ? 'desc' : 'asc'); let destino = $(this).attr('data-gvhDestino') + "&IGEPord=" + gvh.orderTable; let formulario = $(this).closest('form'); let claseM = $(this).attr('data-gvhClaseManejadora'); $(this).controllerJS( { id: $(this).attr('id') , panel: $(this).attr('data-gvhPanelOn') , destino: destino , newWindow: 'false' , claseM: claseM } ); //gvh.controllerJS($(this).attr('id'), $(this).attr('data-gvhPanelOn'), destino, claseM, 'false', '', gvh.msgLoad); } ); $(document).off('click.down_up').on( 'click.down_up', 'span[id=down],span[id=up]', function( e ) { let destino = $(this).attr('data-gvhDestino'); let formulario = $(this).closest('form'); let claseM = $(this).attr('data-gvhClaseManejadora'); $(this).controllerJS( { id: $(this).attr('id') , panel: $(this).attr('data-gvhPanelOn') , destino: destino , newWindow: 'false' , claseM: claseM } ); //gvh.controllerJS($(this).attr('id'), $(this).attr('data-gvhPanelOn'), destino, claseM, 'false', '', gvh.msgLoad); } ); /* * click vsCheck_ radiobutton para seleccionar un registro en ventana de selección */ $(document).off('click.vsCheck').on( 'click.vsCheck', 'input[id*=vsCheck_]', function( e ) { gvh.showConsoleMsg('log',' vsCheck - check ventana de selección'); e.stopImmediatePropagation(); let panel = $(this).attr('data-gvhPanelOn'); let claseM = $(this).attr('data-gvhClaseManejadora'); let id = $(this).attr('id'); let row = id.split('_')[2]; gvh.checkUnique($(this).attr('id'), row, claseM, $(this).attr('data-gvhPanelOn'), ''); } ); /* * click sobre una fila de la tabla de un panel LIS */ $(document).off('select.onrowclick').on( 'select.onrowclick', 'tr[data-gvhpaneljson="lis"][data-gvhclasemanejadora] .form-control', function( e ) { gvh.onSelectionActive = true; e.preventDefault(); e.stopImmediatePropagation(); e.stopPropagation(); } ); $(document).off('click.onrowclick').on( 'click.onrowclick', 'tr[data-gvhpaneljson="lis"][data-gvhclasemanejadora]', function( e ) { if( $(this).find('.modify').length ) { return; } e.preventDefault(); if( gvh.onSelectionActive ) { e.stopImmediatePropagation(); gvh.onSelectionActive = false; return; } let idButton = $(this).closest('[data-onrowclick]').attr('data-onrowclick'); if( idButton ) { $(this).onRowEvent( e, idButton ); } } ); /* * Click doble sobre una fila de la tabla de un panel LIS */ $(document).off('dblclick.onrowdoubleclick').offon( 'dblclick.onrowdoubleclick', 'tr[data-gvhpaneljson="lis"][data-gvhclasemanejadora]', function( e ) { if( $(this).find('.modify').length ) { return; } e.preventDefault(); let idButton = $(this).closest('[data-onrowdoubleclick]').attr('data-onrowdoubleclick'); if( idButton ) { $(this).onRowEvent( e, idButton ); } gvh.onSelectionActive = false; } ); /* * Al hacer doble click sobre la cabecera de un panel, alterna el estado de colapso del panel. */ $(document).off('dblclick.gvhcollapsible').on( 'dblclick.gvhcollapsible', '[data-gvhcollapsible] > .panel-heading', function( e ) { gvh.showConsoleMsg('log',' toggle collapse!!!' ); let panel = $(this).closest( '.panel' ); if( !panel ) { return; } gvh.showConsoleMsg('log', panel.find( '.panel-body' ) ); panel.find( '.panel-body' ).toggle(); gvh.showConsoleMsg('log', panel.find( '.gvhBarraInfPanel' ) ); panel.find( '.gvhBarraInfPanel' ).toggle(); } ); } //gvh.Table