2 Commits 2491a6b3c8 ... f9988a24e2

Auteur SHA1 Message Date
  ttreasure f9988a24e2 Fixed issue where report was blank if a dropdown filter was removed. Also cleaned up code. il y a 4 mois
  ttreasure 448099ca1f Basics of dropdown filters working il y a 4 mois

+ 28 - 3
app/Http/Controllers/DataTablesController.php

@@ -2,6 +2,7 @@
 
 namespace App\Http\Controllers;
 
+use Illuminate\Database\Eloquent\Collection;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Http\Request;
 use Yajra\DataTables\Facades\DataTables;
@@ -60,13 +61,32 @@ class DataTablesController extends Controller
             }
         }
 
-        //Apply search filters
 
 
-        $searchTerms = $request->input('searchTerms', []                   );
+
+
+
+
         $columnHeaders = json_decode($datatableConfig->column_headers, true);
         $columnConfig = json_decode($datatableConfig->columns_config, true);
 
+        //Get Data for Dropdown header columns
+        $dropdownData = new Collection();
+        foreach ($columnHeaders as $index => $columnHeader) {
+            if($columnHeader['searchtype'] === 'dropdown')
+            {
+                $ddColumnConfig = $columnConfig[$index];
+                $columnSnapshot = (clone $query)
+                    ->select($ddColumnConfig['name'])
+                    ->distinct()->orderBy($ddColumnConfig['name'])
+                    ->pluck($ddColumnConfig['name']);
+
+                $dropdownData[$index] = $columnSnapshot;
+
+            }
+        }
+        //Apply search filters
+        $searchTerms = $request->input('searchTerms', []);
         foreach ($searchTerms as $index => $value) {
             $columnHeader = $columnHeaders[$index];
             $config = $columnConfig[$index];
@@ -87,6 +107,11 @@ class DataTablesController extends Controller
                     case 'number':
                         $query->where($columnName, '=', (int) $value[$index]);
                         break;
+                        case 'dropdown':
+                            if($value[$index] != '') {
+                                $query->where($columnName, '=', $value[$index]);
+                            }
+                            break;
                 }
             }
         }
@@ -98,6 +123,6 @@ class DataTablesController extends Controller
         $query->orderBy($sorting['name'], $sorting['dir']);
 
         // Pass query to DataTables
-        return DataTables::of($query)->make(true);
+        return DataTables::of($query)->with(['dropdowndata' => $dropdownData, 'searchterms' => $searchTerms])->make(true);
     }
 }

+ 37 - 3
resources/js/datatables.js

@@ -23,6 +23,7 @@ var searchTerms ={};
 function initializeDataTable() {
     var dataTableName = document.getElementById('datatable-config').dataset.datatableName;
     var dataTableColumnsConfig = JSON.parse(document.getElementById('datatable-config').dataset.datatableColumnsConfig);
+    var dataTableHeadersConfig = JSON.parse(document.getElementById('datatable-config').dataset.datatableHeadersConfig);
     if ($.fn.DataTable.isDataTable(`#${dataTableName}-table`)) {
         dataTableInstance.destroy();
         $(`#${dataTableName}-table tbody`).empty(); // Clear rows to prevent residue
@@ -40,8 +41,39 @@ function initializeDataTable() {
             url: '/api/report-data/' + dataTableName,
             type: 'POST',
             dataSrc: function (json) {
-                console.log('Returned rows:', json.data);
-                return json.data;
+                //console.log('Returned data:', json);
+                //populate any dropdown headers
+                //console.log(dataTableHeadersConfig);
+                dataTableHeadersConfig.forEach(function(headerConfig, index){
+
+                    if(headerConfig.searchtype == "dropdown")
+                    {
+                        //console.log('Tyson here');
+                        var dropdown = $('#'+headerConfig.header.replace(' ', '-')+'FilterDropdown');
+                        //console.log(dropdown);
+                        dropdown.empty().append($('<option>',{
+                            value: '',
+                            text: '-- Select --'
+                        }));
+                        json.dropdowndata[index].forEach(function (option) {
+                            var selected = false;
+                            if(json.searchterms && json.searchterms[index]){
+                                    Object.keys(searchTerms[index]).forEach(function (key){
+                                        var searchValue = searchTerms[index][key]
+                                        console.log('value: '+searchValue)
+                                        if(option === searchValue)
+                                        {
+                                            selected = true;
+                                        }})}
+
+                                        dropdown.append($('<option>',{
+                                            value: option,
+                                            text: option
+                                        }).prop('selected', selected))});
+                              }});
+
+
+                            return json.data;
             },
             data: function (d) {
                 d.searchTerms = searchTerms || {};
@@ -90,12 +122,14 @@ function getFilterInput(searchTerm, index, searchType, extra){
             }
             if (extra === "start") {
                 inner[index].start = searchTerm;
-                console.log("start date: ");
             }
             else if (extra ===  "end") {
                 inner[index].end = searchTerm;
             }
             break;
+        case "dropdown":
+            inner[index] = searchTerm;
+            break;
     }
     searchTerms[index] =  inner;
     console.log(searchTerms[index]);

+ 10 - 4
resources/views/livewire/show-reports.blade.php

@@ -2,7 +2,8 @@
 <div>
     <div id="datatable-config"
          data-datatable-name="{{ $datatableName }}"
-         data-datatable-columns-config='@json($datatableColumnsConfig)'>
+         data-datatable-columns-config='@json($datatableColumnsConfig)'
+         data-datatable-headers-config='@json($datatableHeadersConfig)'>
     </div>
 
     <table id="{{$datatableName}}-table" class="bg-white border border-gray-300">
@@ -20,12 +21,17 @@
 
                     @switch($headerConfig['searchtype'])
                         @case("text")
-                            <input type="text" id="{{$headerConfig['header']}}Filter"  oninput="getFilterInput(this.value, {{$index}},'text', null)" placeholder="{{$headerConfig['header']}} Search" />
+                            <input type="text" id="{{str_replace(" ", "-", $headerConfig['header'])}}Filter"  oninput="getFilterInput(this.value, {{$index}},'text', null)" placeholder="{{$headerConfig['header']}} Search" />
                             @break
                         @case("date")
-                            <input type="date" id="{{$headerConfig['header']}}FilterStartDate" onchange="getFilterInput(this.value, {{$index}},'date', 'start')" placeholder="{{$headerConfig['header']}} Start Date" />
+                            <input type="date" id="{{str_replace(" ", "-", $headerConfig['header'])}}FilterStartDate" onchange="getFilterInput(this.value, {{$index}},'date', 'start')" placeholder="{{$headerConfig['header']}} Start Date" />
                             -
-                            <input type="date" id="{{$headerConfig['header']}}FilterEndDate" onchange="getFilterInput(this.value, {{$index}},'date', 'end')" placeholder="{{$headerConfig['header']}} End Date" />
+                            <input type="date" id="{{str_replace(" ", "-", $headerConfig['header'])}}FilterEndDate" onchange="getFilterInput(this.value, {{$index}},'date', 'end')" placeholder="{{$headerConfig['header']}} End Date" />
+                            @break
+                        @case("dropdown")
+                            <select id="{{str_replace(" ", "-", $headerConfig['header'])}}FilterDropdown" onchange="getFilterInput(this.value, {{$index}},'dropdown', null)">
+
+                            </select>
                             @break
                     @endswitch