Empezar un tema nuevo
Respondido

Filtrar un módulo dependiendo del filtro de una lista

Buenos días,

Estamos haciendo un proyecto en FlexyGo y necesitamos mostrar una grid con una serie de datos filtrados por el usuario y debajo un sumatorio de una serie de datos de las columnas de la grid superior.


Hemos creado para ello dos módulo: uno con la grid con los datos y otro con otra grid con la suma. El problema es que cuando filtramos en la grid superior no se filtra en la inferior.


Nos gustaría saber cuál sería la forma adecuada de hacerlo.


Gracias. Un saludo


Mejor Respuesta


Hola Nuria Forte,


Los módulos deben estar en la misma página y tener de base el mismo objeto. Además los módulos deben ser de tipo object list para que el filtro "where" que monta sea totalmente compatible.


1- Crear una función javascript que capture el evento de filtrado del módulo de lista y aplique el filtro al módulo en cuestión. Este js se debe añadir como plugin, o como función en la propia página (hay que entrar en la edición de la página y en el apartado javascript poner la función que se detalla a continuación, ¡ah! y no te olvides de dejar activo el javascript. También se puede poner en un template de la lista principal, en el apartado header entre el tag <script></script>, pero este caso haría que el sctipt se cargue de la mano del template seleccionado.
Se recomienda quitar el módulo de lista estándar y crear uno personalizado para la página, usando la funcionalidad de clonación.


--Este código captura el evento de filtrado del módulo de la lista de la colección y el filtro lo aplica a otro módulo llamado TotalCC.
--Es fundamental que los módulos se basen en el mismo objeto, para que el filtro sql sea compatible.

--Dejo el debugger para que puedas depurarlo desde el propio navegador.


function Capture_moduleReady(){
  debugger;
  
  let modList=$('flx-module[modulename="NombreDelModuluPrincipalDelListObject"]');
  
  flexygo.events.off(modList,'module','filtered');
  flexygo.events.on(modList,'module','filtered',function(e){ 
    
    debugger;
    
    let listItm=$(e.sender).closest('main').find('flx-module[modulename="TotalCC"] flx-list');
    let filItem=$(e.sender).find('flx-list');
    
    if(filItem.length>0 && listItm.length>0){
       
       filItem=filItem[0];
       listItm=listItm[0];
      
        listItm.activeFilter = filItem.activeFilter;
        listItm.filterValues = filItem.filterValues;
        listItm.refresh();
      
    }
    
  });
}



2- Añadir la llamada a la función js en el módulo de lista principal. En la casilla "JSAfterLoad"



Por poner un ejemplo gráfico, con éste método podemos lograr lo que muestra la siguiente imagen:



Un saludo,

Daniel Ernesto Lutz




Respuesta


Hola Nuria Forte,


Los módulos deben estar en la misma página y tener de base el mismo objeto. Además los módulos deben ser de tipo object list para que el filtro "where" que monta sea totalmente compatible.


1- Crear una función javascript que capture el evento de filtrado del módulo de lista y aplique el filtro al módulo en cuestión. Este js se debe añadir como plugin, o como función en la propia página (hay que entrar en la edición de la página y en el apartado javascript poner la función que se detalla a continuación, ¡ah! y no te olvides de dejar activo el javascript. También se puede poner en un template de la lista principal, en el apartado header entre el tag <script></script>, pero este caso haría que el sctipt se cargue de la mano del template seleccionado.
Se recomienda quitar el módulo de lista estándar y crear uno personalizado para la página, usando la funcionalidad de clonación.


--Este código captura el evento de filtrado del módulo de la lista de la colección y el filtro lo aplica a otro módulo llamado TotalCC.
--Es fundamental que los módulos se basen en el mismo objeto, para que el filtro sql sea compatible.

--Dejo el debugger para que puedas depurarlo desde el propio navegador.


function Capture_moduleReady(){
  debugger;
  
  let modList=$('flx-module[modulename="NombreDelModuluPrincipalDelListObject"]');
  
  flexygo.events.off(modList,'module','filtered');
  flexygo.events.on(modList,'module','filtered',function(e){ 
    
    debugger;
    
    let listItm=$(e.sender).closest('main').find('flx-module[modulename="TotalCC"] flx-list');
    let filItem=$(e.sender).find('flx-list');
    
    if(filItem.length>0 && listItm.length>0){
       
       filItem=filItem[0];
       listItm=listItm[0];
      
        listItm.activeFilter = filItem.activeFilter;
        listItm.filterValues = filItem.filterValues;
        listItm.refresh();
      
    }
    
  });
}



2- Añadir la llamada a la función js en el módulo de lista principal. En la casilla "JSAfterLoad"



Por poner un ejemplo gráfico, con éste método podemos lograr lo que muestra la siguiente imagen:



Un saludo,

Daniel Ernesto Lutz



A continuación os paso una función que hace ésto mismo. La hemos optimizado e incorporado al producto CRM. Se utiliza para refrescar los módulos totalizadores de listas.

Básicamente recibe el nombre del módulo padre y el dependiente, aplica los mismos filtros, vengan de un preset, de propiedades filtradas, o del propio filtro de la colección que abre.


/**
        * injects the filter of an object module list, into a module of the same type. When the user filtering the collection, inject the sql filter and presets filters, then execute refresh action in a depending module.
        * @method moduleListFilterCapture
        * @param {string} dependingModuleName - name of the depending module object list.
        * @param {string} parentModuleName - name of the parent module object list.
        */
        function moduleListFilterCapture(dependingModuleName, parentModuleName) {
            var opToList = $('flx-module[modulename="' + dependingModuleName + '"] flx-list');
            var opList = $('flx-module[modulename="' + parentModuleName + '"] flx-list');
            if (opList[0] && opToList[0]) {
                var opToListItm_1 = opToList[0];
                var opListItm_1 = opList[0];
                opToListItm_1.presets = opListItm_1.presets;
                flexygo.events.off(opList, 'module', 'filtered');
                flexygo.events.on(opList, 'module', 'filtered', function (e) {
                    if (e.sender === opList.closest('flx-module')[0]) {
                        opToListItm_1.activeFilter = opListItm_1.activeFilter;
                        opToListItm_1.filterValues = opListItm_1.filterValues;
                        opToListItm_1.setPreset(opListItm_1.presetId, opListItm_1.presetText, opListItm_1.presetIcon);
                    }
                });
            }
        }


Iniciar sesión o Registrarse para publicar un comentario