Datatable Yajra Filter и ajax тот же контроллер Выбор диапазона дат - PullRequest
0 голосов
/ 13 февраля 2020

Я использовал фильтры в некоторых столбцах таблицы данных. Затем по запросу пользователя пришел запрос на фильтрацию записей между двумя датами. Я получаю данные, которые идут с помощью средства выбора диапазона дат, и в ответ поступает правильная информация, но она не активна в том же представлении с данными. Я надеюсь, что мог бы объяснить это просто. Отображение в точности записей в диапазоне дат, который я выбрал с помощью средства выбора диапазона дат.

Мой файл контроллера выглядит следующим образом.

function lists_data(Request $request)
    {   
        try {
            $list = List::with('staff', 'customer', 'user','updated_user','ms');
            if (!empty($request->id)) {
                $list->where('id' , 'LIKE' , '%'.$request->id.'%');
            }
            if (!empty($request->date)) {
                $list->whereDate('created_at', Carbon::createFromFormat('d.m.Y' , $request->date));
            }
            if (!empty($request->user)) {
                $list->whereCreateduserId($request->user);
            }
            if (!empty($request->staff)) {
                $list->where0staffId($request->staff);
            }
            if (!empty($request->customer)) {
                $list->where2customerId($request->customer);
            }

            // Start to comes value form Date Range Picker
            $start_date = $request->start;
            $end_date = $request->end;
            if (!empty($request->start) && !empty($request->end)) {
                $list->whereBetween('created_at', array($start_date, $end_date));
            }

            return DataTables::eloquent($list)->toJson();

            /*
            if (!empty($request->start)) {
                return DataTables::eloquent($list)
                ->filter(function ($query) use ($start_date, $end_date){
                     $query->whereBetween('created_at', array($start_date, $end_date));
                }, true)
                ->toJson();
            } else {
                return DataTables::eloquent($list)->toJson();
            }
            */


        } catch (Exception $exception) {

            return response([
                'error' => true,
                'message' => $exception->getMessage()
            ]);

        }

    }

Выбор диапазона дат и другой код поля фильтра ниже в файле представления

<form name="filter">
    <div class="d-flex align-items-end flex-column bd-highlight mb-3">
        <div class="p-2 bd-highlight">
            <label class="control-label mb-10 text-left">Date Range Picker</label>
            <div id="reportrange" class="pull-right" style="background: #fff; cursor: pointer; padding: 5px 10px; border: 1px solid #ccc; width: 100%">
            <i class="glyphicon glyphicon-calendar fa fa-calendar"></i>
            </div>
        </div>
    </div>

    <div layout="row" class="filter">
        <div flex class="form-group">
            <input name="date" type="text" class="form-control datetime" placeholder="Date">
        </div>
        <div flex class="form-group">
            <select name="user" id="user" class="selectpicker form-control" data-live-search="true" title="Kullanıcı Seçiniz">
                <option value="" style="background-color:#CCC; color:#333">Reset</option>
                @foreach(\App\Models\User::all() as $user)
                    <option value="{{ $user->id }}">{{ $user->name }}</option>
                @endforeach
            </select>
        </div>
        <div flex class="form-group">
                <select name="staff" id="staff" class="selectpicker form-control" data-live-search="true" title="staff Seçiniz">
                    <option value="" style="background-color:#CCC; color:#333">Reset</option>
                @foreach(\App\Models\Staff::all() as $staff)
                    <option value="{{ $staff->id }}">{{ $staff->ad }}</option>
                @endforeach
            </select>
        </div>
        <div flex class="form-group">
            <select name="customer" id="customer" class="selectpicker form-control" data-live-search="true" title="customer Seçiniz">
                <option value="" style="background-color:#CCC; color:#333">Reset</option>
                @foreach(\App\Models\Customer::all() as $customer)
                    <option value="{{ $customer->id }}">{{ $customer->ad }}</option>
                @endforeach
            </select>
        </div>
    </div>
</form>

Поле данных в том же файле просмотра страницы

<table id="example-table" class="table table-striped table-bordered dataTable">

<thead>
<tr>

    <th>Date</th>
    <th>Hours</th>
    <th>User</th>
    <th>Staff</th>
    <th>Customer</th>

    <th class="icon">#</th>
</tr>
</thead>


</table>

Javascript Код ниже. Это место было немного сложным. Мне нужно объединить данные из полей выбора диапазона даты и фильтра. Я должен показать записи между датами, выбранными пользователем с помощью средства выбора диапазона дат в файле представления, и он также должен работать в фильтрах между входящими записями. Я не знаю точно, что здесь делать.

list.min. js

app.controller('ListController', ["$scope", "$mdToast", "$mdDialog", function ListController($scope, $mdToast, $mdDialog) {
    $(document).ready(function () {
        setDataTable([0, 1, 2, 3, 4], 6);
        var start = moment().subtract(29, 'days');
        var end = moment();
        var table = $('#example-table').DataTable({
            ajax: {
                url: '/list/data',
                method: 'POST',
                data: function (d) {
                    let formData = new FormData(document.querySelector("form[name=filter]"));
                    formData.forEach((value, key) => {
                        d[key] = value
                    });
                }
            },
            columns: [
                {
                    data: 'created_at', render: (data) => {
                        return moment(data, "YYYY-MM-DD HH:mm").format("DD.MM.YYYY");
                    }
                },
                {
                    data: 'created_at', render: (data) => {
                        return moment(data, "YYYY-MM-DD HH:mm").format("HH:mm");
                    }
                },
                {data: 'user.name'},
                {
                    data: 'updated_user', render: (updated_user) => {
                        if(updated_user != null){
                            return updated_user.name;
                        }
                        return '';
                    }
                },
                {data: 'staff.name'},
                {
                    data: 'customer', name: 'customer.name', render: (customer) => {
                        return `${customer.name} ${customer.lastname}`;
                    }
                },
            ],
            columnDefs: [{
                "targets": -1,
                "data": null,
                "defaultContent": '\
                    <div class="dropdown">\
                        <a>\
                            <i class="material-icons">more_vert</i>\
                        </a>\
                        <div class="dropdown-menu">\
                            <a class="dropdown-item" id="Detail">Detail</a>\
                            <a class="dropdown-item" id="Update">Update</a>\
                            <a class="dropdown-item" id="Print">Print</a>\
                            <a class="dropdown-item" id="Delete">Delete</a>\
                        </div>\
                    </div>'
            }],
        });

        function cb(start, end) {
            $('#reportrange span').html(start.format('DD.MM.YYYY') + ' - ' + end.format('DD.MM.YYYY'));
            $.ajaxSetup({
                headers: {
                    'X-XSRF-Token': $('meta[name="_token"]').attr('content')
                }
            });
                $.ajax({
                dataType: "json",
                type: 'POST',
                url: '/list/data',
                data: {
                    start : start.format('YYYY-MM-DD HH:mm:ss'),
                    end : end.format('YYYY-MM-DD HH:mm:ss')
                },

                /*
                success: function(response, result, xhr){
                    if(result == 'success' && response) {
                        $('#example-table').DataTable().clear().rows.add(response.data).draw();
                    }else{
                        $('#example-table').DataTable().clear().draw();
                    }

                },
                error: function(){
                    $('#example-table').DataTable().clear().draw();
                }
                */
            });


        }
        $('#reportrange').daterangepicker({
            startDate: start,
            endDate: end,
            ranges: {
               'today': [moment(), moment()],
               'yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
               '7 days': [moment().subtract(6, 'days'), moment()],
               '30 days': [moment().subtract(29, 'days'), moment()],
               'This Mounth': [moment().startOf('month'), moment().endOf('month')],
               'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]
            }
        },cb);

        $(".dataTables_filter input").unbind().on('keyup', _.debounce(function () {
            table.search(this.value).draw();
        }, 700, {
            'leading': false
        }));

        $(".filter input").on('keyup', _.debounce(function () {
            table.draw();
        }, 700, {
            'leading': false
        }));

        $('.filter select , input.datetime').change(() => {
            table.draw();
        });

        $('a.refresh').on('click', () => {
            table.draw();
        });
    });

}]);
...