Laravel 10 Full Calendar Ajax Tutorial

FullCalendar is a popular JavaScript library that allows you to create interactive calendars on your web applications. By integrating FullCalendar with Ajax and Laravel, you can enhance the user experience by dynamically loading calendar events without refreshing the page. Here's a step-by-step guide on how to use FullCalendar with Ajax in Laravel:

Step 1: Install Laravel 10

composer create-project laravel/laravel example-app

Step 2: Create Migration and Model

php artisan make:migration create_events_table

Now, oprn "database/migrations" and you have to put bellow code in your migration file for create events table.

<?php
  
    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Support\Facades\Schema;
      
    return new class extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up(): void
        {
            Schema::create('events', function (Blueprint $table) {
                $table->id();
                $table->string('title');
                $table->date('start');
                $table->date('end');
                $table->timestamps();
            });
        }
      
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down(): void
        {
            Schema::dropIfExists('events');
        }
    };

Run migration:

php artisan migrate

Add Model

app/Models/Event.php

<?php
  
    namespace App\Models;
      
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
      
    class Event extends Model
    {
        use HasFactory;
      
        /**
         * The attributes that are mass assignable.
         *
         * @var array
    
         */
        protected $fillable = [
            'title', 'start', 'end'
        ];
    }
    

Step 3: Create Controller File

Now,create Controller  FullCalenderController for index and ajax method so, run below command

php artisan make:controller FullCalenderController

app/Http/Controllers/FullCalenderController.php

<?php
  
    namespace App\Http\Controllers;
      
    use Illuminate\Http\Request;
    use App\Models\Event;
    use Illuminate\Http\JsonResponse;
      
    class FullCalenderController extends Controller
    {
        /**
         * Write code on Method
         *
         * @return response()
         */
        public function index(Request $request)
        {
      
            if($request->ajax()) {
           
                 $data = Event::whereDate('start', '>=', $request->start)
                           ->whereDate('end',   '<=', $request->end)
                           ->get(['id', 'title', 'start', 'end']);
      
                 return response()->json($data);
            }
      
            return view('fullcalender');
        }
     
        /**
         * Write code on Method
         *
         * @return response()
         */
        public function ajax(Request $request): JsonResponse
        {
     
            switch ($request->type) {
               case 'add':
                  $event = Event::create([
                      'title' => $request->title,
                      'start' => $request->start,
                      'end' => $request->end,
                  ]);
     
                  return response()->json($event);
                 break;
      
               case 'update':
                  $event = Event::find($request->id)->update([
                      'title' => $request->title,
                      'start' => $request->start,
                      'end' => $request->end,
                  ]);
     
                  return response()->json($event);
                 break;
      
               case 'delete':
                  $event = Event::find($request->id)->delete();
      
                  return response()->json($event);
                 break;
                 
               default:
                 # code...
                 break;
            }
        }
    }

Step 4: Create Routes

routes/web.php 

<?php
  
    use Illuminate\Support\Facades\Route;
      
    use App\Http\Controllers\FullCalenderController;
      
    /*
    |--------------------------------------------------------------------------
    | Web Routes
    |--------------------------------------------------------------------------
    |
    | Here is where you can register web routes for your application. These
    | routes are loaded by the RouteServiceProvider within a group which
    | contains the "web" middleware group. Now create something great!
    |
    */
      
    Route::controller(FullCalenderController::class)->group(function(){
        Route::get('fullcalender', 'index');
        Route::post('fullcalenderAjax', 'ajax');
    });

Step 5: Create Blade File

resources/views/fullcalender.blade.php 

<!DOCTYPE html>
    <html>
    <head>
        <title>Laravel Fullcalender Tutorial Tutorial - webthestuff.com</title>
        <meta name="csrf-token" content="{{ csrf_token() }}">
        
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet">
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.9.0/fullcalendar.css" />
        <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.9.0/fullcalendar.js"></script>
        
        <script src="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.js"></script>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.css" />
    </head>
    <body>
        
    <div class="container">
        <h1>Laravel 10 FullCalender Tutorial Example - webthestuff.com</h1>
        <div id='calendar'></div>
    </div>
      
    <script type="text/javascript">
      
    $(document).ready(function () {
          
        /*------------------------------------------
        --------------------------------------------
        Get Site URL
        --------------------------------------------
        --------------------------------------------*/
        var SITEURL = "{{ url('/') }}";
        
        /*------------------------------------------
        --------------------------------------------
        CSRF Token Setup
        --------------------------------------------
        --------------------------------------------*/
        $.ajaxSetup({
            headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        });
          
        /*------------------------------------------
        --------------------------------------------
        FullCalender JS Code
        --------------------------------------------
        --------------------------------------------*/
        var calendar = $('#calendar').fullCalendar({
                        editable: true,
                        events: SITEURL + "/fullcalender",
                        displayEventTime: false,
                        editable: true,
                        eventRender: function (event, element, view) {
                            if (event.allDay === 'true') {
                                    event.allDay = true;
                            } else {
                                    event.allDay = false;
                            }
                        },
                        selectable: true,
                        selectHelper: true,
                        select: function (start, end, allDay) {
                            var title = prompt('Event Title:');
                            if (title) {
                                var start = $.fullCalendar.formatDate(start, "Y-MM-DD");
                                var end = $.fullCalendar.formatDate(end, "Y-MM-DD");
                                $.ajax({
                                    url: SITEURL + "/fullcalenderAjax",
                                    data: {
                                        title: title,
                                        start: start,
                                        end: end,
                                        type: 'add'
                                    },
                                    type: "POST",
                                    success: function (data) {
                                        displayMessage("Event Created Successfully");
      
                                        calendar.fullCalendar('renderEvent',
                                            {
                                                id: data.id,
                                                title: title,
                                                start: start,
                                                end: end,
                                                allDay: allDay
                                            },true);
      
                                        calendar.fullCalendar('unselect');
                                    }
                                });
                            }
                        },
                        eventDrop: function (event, delta) {
                            var start = $.fullCalendar.formatDate(event.start, "Y-MM-DD");
                            var end = $.fullCalendar.formatDate(event.end, "Y-MM-DD");
      
                            $.ajax({
                                url: SITEURL + '/fullcalenderAjax',
                                data: {
                                    title: event.title,
                                    start: start,
                                    end: end,
                                    id: event.id,
                                    type: 'update'
                                },
                                type: "POST",
                                success: function (response) {
                                    displayMessage("Event Updated Successfully");
                                }
                            });
                        },
                        eventClick: function (event) {
                            var deleteMsg = confirm("Do you really want to delete?");
                            if (deleteMsg) {
                                $.ajax({
                                    type: "POST",
                                    url: SITEURL + '/fullcalenderAjax',
                                    data: {
                                            id: event.id,
                                            type: 'delete'
                                    },
                                    success: function (response) {
                                        calendar.fullCalendar('removeEvents', event.id);
                                        displayMessage("Event Deleted Successfully");
                                    }
                                });
                            }
                        }
     
                    });
     
        });
          
        /*------------------------------------------
        --------------------------------------------
        Toastr Success Code
        --------------------------------------------
        --------------------------------------------*/
        function displayMessage(message) {
            toastr.success(message, 'Event');
        } 
        
    </script>
      
    </body>
    </html>
   

Run Laravel App:

php artisan serve

Now, Go to web browser, type the given URL and see the output:

http://localhost:8000/fullcalender