Bug in filters when reloading ?

Pro version . Grid v.3.0 build 110713.

I can’t to use info from cookies ( restoring column orders, widths and etc ) , because users are migrating in enterprise and storing of cookies isn’t reliable . Also client want to use a module for users rights ( editable or not , visible or not and etc … ). So I did own table and ( MySql ) in which are data - user id, form/grid id, field id, order num, width, visibillity, rights .

  1. I’m formatting settings for grid from own array :
      var grd = new Array();
      grd[  0 ] = [];
      grd[  0 ].push( "uzsak" ); // field/column id
      grd[  0 ].push( "ro" );      // column type
      grd[  0 ].push( "150" );    // width at the first time 
      grd[  0 ].push( "#connector_text_filter" ); // filter type
      grd[  0 ].push( "left" );   // align
      grd[  0 ].push( "str" );    // sorting type
      grd[  0 ].push( "Uzsak.ID" );  // header in lithuanian 
      grd[  0 ].push( "Order.ID" );  // header in english ...
      grd[  1 ] = [];
      grd[  1 ].push( "telkinys"  );
      grd[  1 ].push( "ed" );
      grd[  1 ].push( "80" );
      grd[  1 ].push( "#connector_select_filter" );// push( "#select_filter" );
      grd[  1 ].push( "left" );
      grd[  1 ].push( "str" );
      grd[  1 ].push( "Telkinys" );
      grd[  1 ].push( "Pool" );
      ...  
      grd[  8 ] = [];
      grd[  8 ].push( "uzs_data" );
      grd[  8 ].push( "dhxCalendar" );
      grd[  8 ].push( "100" );
      grd[  8 ].push( "#connector_select_filter" );// push( "#select_filter" );
      grd[  8 ].push( "center" );
      grd[  8 ].push( "date" );
      grd[  8 ].push( "Uzs.data" );
      grd[  8 ].push( "Ord.date" );

      grd[  9 ] = [];
      grd[  9 ].push( "uzs_sav" );
      grd[  9 ].push( "ro" );
      grd[  9 ].push( "75" );
      grd[  9 ].push( "#connector_select_filter" );// push( "#select_filter" );
      grd[  9 ].push( "center" );
      grd[  9 ].push( "str" );
      grd[  9 ].push( "Uzs.sav." );
      grd[  9 ].push( "Ord.week" );
  1. Needfuls vars for grid init …
      var hdr      = ""; // headers
      var flt      = "";   // filters
      var lyg      = "";  // aligns
      var plc      = "";  // widths
      var ctp      = ""; // column types
      var srt      = "";  // sortings ...
      var vsb      = ""; // visbillity
      var kbl      = ""; 
      var klb      = ( $app_lng == "lt" ? 6 : 7 ); // which label - lithuanian or english .. 
      
      var slc_fld  = ""; // columns identifiers and column order ...
      var dgr      = new Array();

      grid_rst( false );  // false for the first time , true for - reload grid ...

      var mygrid = tabbar.cells( tabbar.getActiveTab() ).attachGrid();
      mygrid.setImagePath( "codebase/imgs/" );
      mygrid.setSkin( "dhx_skyblue" );

      mygrid.setColumnIds( [b]slc_fld[/b] )
      mygrid.setHeader( hdr );
      mygrid.attachHeader( flt );    
      mygrid.setColTypes( ctp );
      mygrid.setInitWidths( plc )
      mygrid.setColAlign( lyg )
      mygrid.setColSorting( srt );
      mygrid.setDateFormat( "%Y.%m.%d" );
      mygrid.setColumnsVisibility( vsb );

      mygrid.enableSmartRendering( true, 200 );
      mygrid.init();
      mygrid.load( "uzs1.php?lauku_eile=" + [b]slc_fld[/b] );

      myDp = new dataProcessor( "uzs1.php?lauku_eile=" + [b]slc_fld [/b]);
      myDp.init( mygrid );
      ...
  1. function grid_rst( perkr )
      function grid_rst( perkr )
      {
         dgr.length   = 0;
         hdr     = "";
         flt     = "";
         lyg     = "";
         plc     = "";
         ctp     = "";
         srt     = "";
         vsb     = "";
         kbl     = "";
         [b]slc_fld[/b] = "";
         var wd  = 0;
         var rd  = 0;
         var clt = "";

         if ( perkr == true ) // if reload grid - save grid state and return new state
            dgr = grid_save( mygrid, 'uzsakym' );

         if ( perkr == false ) // sets for the first time ...
            dgr = grid_array( "uzsakym" );
         
          /* dgr - array with infor of user sets :
              column id, column order, width, visibillity, editable or not;
          */

            if ( dgr.length == 0 ) // use default sets form grd array ...
            {
               l = grd.length;
               for ( u = 0; u < l; u ++ )
               {
                  kbl      = ( u < l - 1 ? "," : "" );
                  [b]slc_fld[/b] += grd[ u ][ 0 ] + kbl;
                  ctp     += grd[ u ][ 1 ] + kbl;
                  plc     += grd[ u ][ 2 ] + kbl;
                  flt     += grd[ u ][ 3 ] + kbl;
                  lyg     += grd[ u ][ 4 ] + kbl;
                  srt     += grd[ u ][ 5 ] + kbl;
                  hdr     += grd[ u ][ klb ] + kbl;
                  vsb     += "false" + kbl;
               }
            }
            else
            {
               l  = dgr.length;
               l2 = grd.length;

               for ( u = 0; u < l; u ++ )
               {
                  kbl = ( u < l - 1 ? "," : "" );
                  for ( z = 0; z < l2; z ++ )
                  {
                     if ( dgr[ u ][ 0 ] == grd[ z ][ 0 ] )
                     {
                        wd      = dgr[ u ][ 2 ]; // widths from user set
                        rd       = dgr[ u ][ 4 ]; // ro or ed from user set

                        [b]slc_fld[/b] += grd[ z ][ 0 ] + kbl;
                        if ( rd == 0 && clt.indexOf( "ro" ) == 0 )
                           ctp += "ro" + kbl;
                        else
                           ctp += clt + kbl;

                        plc     += wd.toString() + kbl;
                        flt     += grd[ z ][ 3 ] + kbl;
                        lyg     += grd[ z ][ 4 ] + kbl;
                        srt     += grd[ z ][ 5 ] + kbl;
                        hdr     += grd[ z ][ klb ] + kbl;
                        vsb     += ( dgr[ u ][ 3 ] == 0 ? "false" : "true" ) + kbl;
                     }
                  }
               }
            }

            if ( perkr == true ) // reloading grid
            {
               mygrid.clearAll( true );
               mygrid.setColumnIds( [b]slc_fld[/b] )
               mygrid.setHeader( hdr );
               mygrid.attachHeader( flt );
               mygrid.setColTypes( ctp );
               mygrid.setInitWidths( plc )
               mygrid.setColAlign( lyg )
               mygrid.setColSorting( srt );
               mygrid.setDateFormat( "%Y.%m.%d" );
               mygrid.setColumnsVisibility( vsb );
               mygrid.enableSmartRendering( true, 200 );
               mygrid.init();
               // one variant with filterByAll()
               mygrid.load( "uzs1.php?lauku_eile=" + [b]slc_fld[/b], function()
               {
                  mygrid.filterByAll();
               });                
               /* other variant without filterByAll()
                  mygrid.load( "uzs1.php?lauku_eile=" + slc_fld );
               */
            }  
         }
      }
  1. At first time - grid_rst( false ) . All vars for grid init returns , all is working OK . Filters are working OK . In ChromePhp console I’m seeing , that MySqli conector ( db_mysqli.php ), formats filters for “#connector_select_filter” as “DISTINCT” queries and render table .

  2. Now I’m moving column ( let say “Ord.week” - 9 order , above “Ord.date” , ord. 8 ) . After moving I’m saving this new state , formating array with new sets ( order ) and formatting new slc_fld for table rendering . That is grid_rst( true ) - with grid reloading condition .

    At first time ( grid_rst( false ) ) slc_fld was - “uzsak,preke,telkinys,uzs_kiekis,specai,svarbus,mazi,uzs_spalv,uzs_data,uzs_sav” . Now , for reloading , I’m clear seeing new field order “uzsak,preke,telkinys,uzs_kiekis,specai,svarbus,mazi,uzs_spalv,uzs_sav,uzs_data” . “uzs_sav” and “uzs_data” changed order .

    ClearAll( true ) grid , init’ed , loaded - all is working OK , except filters … . In “Ord.date” leaves filter data of “Ord.week” and in “Ord.week” filters are “Ord.date” values .

    ChromePhp from db_mysqli.php didn’t show “DISTINCT” queries for filters .

    I’m thinking that here is a bug . If I’m fully reloading grid with new column order , then and filters must be renewed .

    I tried variuos variants - and with clearAndLoad() . But it seems that with full clearAll( true ), is the best way . Only leave problem with filters …

    How to solve that problem ?

    With best regards !

There are two possible problems, one with columns moving - data loading in grid is based on column indexes, so if you just reinit order of columns on server side and will try to load from the same server side data feed - it will map values to column incorrectly. ( it will set values in order as it was provided in render command of connector - without relation to your order )

Second problem is related to the filters collections, which in fact loaded only once, and will not reload self after reinitialization. But you force it by using code like

mygrid._con_f_used = []; mygrid.load(...);

Yes , that is . I didn’t noticed the problem of column indexes and after your words detected that . I tried to modify data - data in that colums are not in own columns . Though they are visually true … Maybe exist solution to reorder columns ?

Not worked . The same situation . Sorry … :frowning: . But maybe that related to column index ?

Any sugestion ?

Mine reasonings - to create grid object it’s enough thus parameters :

      var mygrid = tabbar.cells( tabbar.getActiveTab() ).attachGrid();
      mygrid.setImagePath( "codebase/imgs/" );
      mygrid.setSkin( "dhx_skyblue" );

      mygrid.setColumnIds( slc_fld )
      mygrid.setHeader( hdr );
      mygrid.attachHeader( flt );
      mygrid.setColTypes( ctp );
      mygrid.setInitWidths( plc )
      mygrid.setColAlign( lyg )
      mygrid.setColSorting( srt );
      mygrid.setColumnsVisibility( vsb );
      mygrid.setDateFormat( "%Y.%m.%d" );

      mygrid.enableSmartRendering( true, 200 );
      mygrid.init();
      mygrid.load( "uzs1.php?lauku_eile=" + slc_fld );       //mygrid.startFastOperations();

      myDp = new dataProcessor( "uzs1.php?lauku_eile=" + slc_fld );
      myDp.init( mygrid );

      mygrid.enableMultiselect( true );
      mygrid.enableHeaderMenu();
      mygrid.enableColumnMove( true );
      mygrid.enableUndoRedo();
Why isn't enough to recreate grid object after column moving ? As I described , slc_fld var ( and others too )  is new with new column order . What needfuls to do what I want ? This imposible ?