switching from serverside processing to client side processing fails
switching from serverside processing to client side processing fails
Link to test case:
Debugger code (debug.datatables.net):
Error messages shown:
Description of problem:
I have a problem switching back to client side processing for proper sorting and searching.
setting serverSide: true, --> works as expected, but datatable cannot be sorted or searched
setting serverSide: false, --> the data does not get displayed at all with error:
Showing 0 to 0 of 0 entries (filtered from 126 total entries)
So somehow, it knows 126 entries are returned
q1, how can I see the result of the ajax call in a console.log?
q2, in client side: should the json returned exactly match the columns instead of returning all data (also used elsewhere) as now?
HTML
<table id="samples_table" class="table table-striped table-bordered table-sm" style="width:100%" >
                <thead>
                    <tr>
                        <th>patient</th>
                        <th>name</th>
                        <th data-data="visit.visit_date" data-name="visit.visit_date">date collected</th>
                        <th>tissuetype</th>
                        <th>notes</th>
                        <th>sample_id</th>
                    </tr>
                </thead>
            </table>
javascript
function getSamples(){
        var url = "{% url 'api:sample-find' %}";
        data = $("#findSampleForm").serialize();
        data = data + '&format=datatables';
        console.log(data);
        url = url+ "?" + data;
        console.log(url);
        $.fn.dataTable.ext.errMode = 'none';
        var samples_table = $('#samples_table').DataTable();
        samples_table.destroy();
        sample_table = $('#samples_table')
            .on( 'error.dt', function ( e, settings, techNote, message ) {
                message = `<div id="errorbox" class="alert alert-warning alert-dismissible fade show" role="alert">
                    <p>Query did not return qualified samples</p>
                <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                  <span aria-hidden="true">×</span>
                </button>
                </div>`;
                $('#errorbox').remove();
                $('#samples_table').prepend(message);
                console.log(this);
                             
            })
            .DataTable( {
                ajax:url,
                dataSrc: 'data',
                processing: true,
                serverSide: true,
                stateSave: true,
                scrollY: '200px',
                scrollCollapse: true,
                paging: false,
                searching:true,
                columnDefs:[
                    { target: 5,
                      visible:false
                    }
                ],    
                columns: [ 
                    {data:'patient'},    
                    {data:'name'},
                    {data:'visit.visit_date'},
                    {data:'tissue_type.name'},
                    {data:'notes.body'},
                    {data:'sample_id'},
                ],
                
                select: {
                    items :'row'
                },
            
            }).column( 5 ).visible( false );;
           
    };
ajax response (only need a subset of this response, any sensitive info xxxed out):
{
  "data": [
    {
      "sample_id": xxxx,
      "derivation": null,
      "visit": {
        "visit_id": xxxx,
        "patient": {
          "patient_id": xxxx,
          "gender": null,
          "birth": null,
          "death": null,
          "symptom_onset": null,
          "multiply_infected": null,
          "vv_uid": xxxx,
          "date_added": "xxxx",
          "location": null
        },
        "visit_date": "xxxx",
        "visit_number": "1",
        "vv_uid": xxxx,
        "date_entered": "xxxx",
        "external_visit_id": null,
        "is_deleted": false
      },
      "patient": "xxxx",
      "tissue_type": {
        "tissue_type_id": xxxx,
        "name": "xxxx"
      },
      "notes": {
        "body": null,
        "time_created": null,
        "sample": null,
        "scientist": null
      },
      "received_date": null,
      "name": "xxxx",
      "vv_uid": xxxx,
      "date_added": "xxxx",
      "is_deleted": false,
      "date_collected": null,
      "sample_type": null,
      "additive": null
    },
   ............... //deleted other rows
  ],
  "recordsFiltered": 126,
  "recordsTotal": 126,
  "draw": 1
}
                
Answers
Looks like everything should be working. I suspect the problem is with
stateSavebeing enabled and the last search term is being restored resulting in 0 rows showing. Do you have something in the global search input? If so clear it. You could ignore the search term withstateLoadParams. See the example in the docs.Kevin
@kthorngren it works if I switch off searching.
After some searching on the 'searching' problem I found that if I add these two lines after the samples_table initiation, it works as expected:
Ok. But why not use this as it works with
stateSave?This removes the saved filter and will probably make more sense when you are debugging the page at a later time.
Kevin