KHAN's avatar
Level 4

Refactor Laravel 5 and Ajax Pagination.

Hey,

I have 2 lists of data on my page. Both data are paginated using ajax and both data have the same filters. Can you help me refactor my code.

Controller

class DashboardController extends Controller
{

    public function __construct()
    {
        $this->user = Auth::user();
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {

        if ($request->ajax()) {

            $myEvents       = $this->paginateMyEvents($request);
            $upComingEvents = $this->paginateUpComingEvents($request);

            if ($request->input('reqtype') == 'old') {
                return response()->json(view('dashboard.partials.myevents')
                        ->with('myEvents', $myEvents)
                        ->with('myEventsSort', $request->input('myEventsSort'))
                        ->with('myEventsType', $request->input('myEventsType'))
                        ->render());

            } else if ($request->input('reqtype') == 'new') {
                return response()->json(view('dashboard.partials.upcomingevents')
                        ->with('upComingEvents', $upComingEvents)
                        ->with('newEventsSort', $request->input('newEventsSort'))
                        ->with('newEventsType', $request->input('newEventsType'))
                        ->render());
            }

        }

        $myEvents       = $this->paginateMyEvents($request);
        $upComingEvents = $this->paginateUpComingEvents($request);

        return view('dashboard.index')->with('myEvents', $myEvents)
            ->with('myEventsSort', $request->input('myEventsSort'))
            ->with('myEventsType', $request->input('myEventsType'))

            ->with('upComingEvents', $upComingEvents)
            ->with('newEventsSort', $request->input('newEventsSort'))
            ->with('newEventsType', $request->input('newEventsType'));

    }

    public function paginateMyEvents($request)
    {
        $myEvents = $this->getMyEvents();

        $myEventsSort = $request->input('myEventsSort');
        $myEventsType = $request->input('myEventsType');

        if ($myEventsType && $myEventsType != 'all') {
            $myEvents = $myEvents->where('type', '=', $myEventsType);
        }

        if ($myEventsSort) {
            $myEvents = $myEvents->orderBy($myEventsSort, 'asc');

        } else {

            $myEvents = $myEvents->orderBy('start_date', 'asc');
        }

        return $myEvents = $myEvents->paginate(5, ['*'], 'myeventspage', null);

    }

    public function getMyEvents()
    {
        $myEvents = $this->user->reservations()->pluck('id');
        $myEvents = EventModel::whereIn('id', $myEvents)
            ->where('start_date', '>=', Carbon::today());

        return $myEvents;
    }

    public function getUpComingEvents()
    {
        $ids = Rsvp::where('user_id', $this->user->id)->pluck('event_id');

        $upComingEvents = EventModel::whereNotIn('id', $ids)->where('start_date', '>=', Carbon::today());

        return $upComingEvents;
    }

    public function paginateUpComingEvents($request)
    {
        $upComingEvents = $this->getUpComingEvents();

        $newEventsSort = $request->input('newEventsSort');
        $newEventsType = $request->input('newEventsType');

        if ($newEventsType && $newEventsType != 'all') {
            $upComingEvents = $upComingEvents->where('type', '=', $newEventsType);
        }

        if ($newEventsSort) {
            $upComingEvents = $upComingEvents->orderBy($newEventsSort, 'asc');

        } else {

            $upComingEvents = $upComingEvents->orderBy('start_date', 'asc');
        }

        return $upComingEvents = $upComingEvents->paginate(5, ['*'], 'neweventspage', null);

    }

}

JS

function update() {
    var myEventsSort = $("#sort-myevents").val();
    var myEventsType = $("#filter-myevents").val();
    getRequest(myEventsSort, myEventsType);
}

$(document).ready(function() {
    $(document).on('click', '#dashboard-myevents .pagination a', function(e) {
        getPosts($(this).attr('href').split('myeventspage=')[1]);
        e.preventDefault();
    });
});

function getPosts(page) {
    var myEventsSort = $("#sort-myevents").val();
    var myEventsType = $("#filter-myevents").val();
    $.ajax({
        url: '?myeventspage=' + page + '&myEventsType=' + myEventsType + '&myEventsSort=' + myEventsSort,
        dataType: 'json',
        data: {
            reqtype: 'old'
        },
    }).done(function(data) {
        $('#dashboard-myevents').html(data);
    }).fail(function(err) {
        console.log(err);
    });
}

function getRequest(myEventsSort, myEventsType) {

    location.assign("/dashboard?myEventsType=" + myEventsType + "&myEventsSort=" + myEventsSort);

}

// Second Pagination and Filters

function updateNew() {

    var newEventsSort = $("#sort-newevents").val();
    var newEventsType = $("#filter-newevents").val();
    getNewRequest(newEventsSort, newEventsType);
}

function getNewRequest(newEventsSort, newEventsType) {
    location.assign("/dashboard?newEventsType=" + newEventsType + "&newEventsSort=" + newEventsSort);
}

$(document).ready(function() {
    $(document).on('click', '#dashboard-newevents .pagination a', function(e) {
        getNewPosts($(this).attr('href').split('neweventspage=')[1]);
        e.preventDefault();
    });

});

function getNewPosts(page) {

    var newEventsSort = $("#sort-newevents").val();
    var newEventsType = $("#filter-newevents").val();

    $.ajax({
        url: '?neweventspage=' + page + '&newEventsType=' + newEventsType + '&newEventsSort=' + newEventsSort,
        data: {
            reqtype: 'new'
        },
        dataType: 'json',
    }).done(function(data) {
        $('#dashboard-newevents').html(data);
    }).fail(function(err) {
        console.log(err);
    });

}

0 likes
0 replies

Please or to participate in this conversation.