Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

lilo's avatar
Level 2

How to validate that end date is greater than start date

Hi,

I want to validate if the end date is ggreater than start date. I add a script in my page's blade but it doesn't work. What is the problem and also where should I put this script?

Here is my blade:

@extends('layouts.admin')

@section('content')

{{ trans('global.create') }} {{ trans('cruds.excuse.title_singular') }}
<div class="card-body">
    <form method="POST" action="{{ route("admin.excuses.store") }}" enctype="multipart/form-data">
        @csrf
        <div class="form-group">
            <label for="user_id">{{ trans('cruds.excuse.fields.user') }}</label>
            <select class="form-control select2 {{ $errors->has('user') ? 'is-invalid' : '' }}" name="user_id" id="user_id">
                @foreach($users as $id => $user)
                    <option value="{{ $id }}" {{ old('user_id') == $id ? 'selected' : '' }}>{{ $user }}</option>
                @endforeach
            </select>
            @if($errors->has('user'))
                <div class="invalid-feedback">
                    {{ $errors->first('user') }}
                </div>
            @endif
            <span class="help-block">{{ trans('cruds.excuse.fields.user_helper') }}</span>
        </div>
        <div class="form-group">
            <label for="start_date">{{ trans('cruds.excuse.fields.start_date') }}</label>
            <input class="form-control date {{ $errors->has('start_date') ? 'is-invalid' : '' }}" type="text" name="start_date" id="start_date" value="{{ old('start_date') }}">
            @if($errors->has('start_date'))
                <div class="invalid-feedback">
                    {{ $errors->first('start_date') }}
                </div>
            @endif
            <span class="help-block">{{ trans('cruds.excuse.fields.start_date_helper') }}</span>
        </div>
        <div class="form-group">
            <label for="end_date">{{ trans('cruds.excuse.fields.end_date') }}</label>
            <input class="form-control date {{ $errors->has('end_date') ? 'is-invalid' : '' }}" type="text" name="end_date" id="end_date" value="{{ old('end_date') }}">
            @if($errors->has('end_date'))
                <div class="invalid-feedback">
                    {{ $errors->first('end_date') }}
                </div>
            @endif
            <span class="help-block">{{ trans('cruds.excuse.fields.end_date_helper') }}</span>
        </div>
        <div class="form-group">
            <button class="btn btn-danger" type="submit">
                {{ trans('global.save') }}
            </button>
        </div>
    </form>
</div>
@endsection

And here is my script at the end of my blade:

<script>
$(function(){
    $("#start_date").datepicker({
        numberOfMonths: 1,
        onSelect: function(selected) {
            $("#end_date").datepicker("option","minDate", selected)
        }
    });
    $("#end_date").datepicker({
        numberOfMonths: 1,
        onSelect: function(selected) {
            $("#start_date").datepicker("option","maxDate", selected)
        }
    });
});
0 likes
11 replies
vandan's avatar

@lilo

$(document).ready(function () {

    $("#dt1").datepicker({
        dateFormat: "dd-M-yy",
        minDate: 0,
        onSelect: function (date) {
            var dt2 = $('#dt2');
            var startDate = $(this).datepicker('getDate');
            var minDate = $(this).datepicker('getDate');
            dt2.datepicker('setDate', minDate);
            startDate.setDate(startDate.getDate() + 30);
            //sets dt2 maxDate to the last day of 30 days window
            dt2.datepicker('option', 'maxDate', startDate);
            dt2.datepicker('option', 'minDate', minDate);
            $(this).datepicker('option', 'minDate', minDate);
        }
    });
    $('#dt2').datepicker({
        dateFormat: "dd-M-yy"
    });
});
lilo's avatar
Level 2

Where should I put it? In my blade right?

lilo's avatar
Level 2

It's working with validation but I want disable the dates before the start date...

lilo's avatar
Level 2

Here is my blade:

@extends('layouts.admin')

@section('content')

{{ trans('global.create') }} {{ trans('cruds.excuse.title_singular') }}
<div class="card-body">
    <form method="POST" action="{{ route("admin.excuses.store") }}" enctype="multipart/form-data">
        @csrf
        <div class="form-group">
            <label for="user_id">{{ trans('cruds.excuse.fields.user') }}</label>
            <select class="form-control select2 {{ $errors->has('user') ? 'is-invalid' : '' }}" name="user_id" id="user_id">
                @foreach($users as $id => $user)
                    <option value="{{ $id }}" {{ old('user_id') == $id ? 'selected' : '' }}>{{ $user }}</option>
                @endforeach
            </select>
            @if($errors->has('user'))
                <div class="invalid-feedback">
                    {{ $errors->first('user') }}
                </div>
            @endif
            <span class="help-block">{{ trans('cruds.excuse.fields.user_helper') }}</span>
        </div>
        <div class="form-group">
            <label for="start_date">{{ trans('cruds.excuse.fields.start_date') }}</label>
            <input class="form-control date {{ $errors->has('start_date') ? 'is-invalid' : '' }}" type="text" name="start_date" id="start_date" value="{{ old('start_date') }}">
            @if($errors->has('start_date'))
                <div class="invalid-feedback">
                    {{ $errors->first('start_date') }}
                </div>
            @endif
            <span class="help-block">{{ trans('cruds.excuse.fields.start_date_helper') }}</span>
        </div>
        <div class="form-group">
            <label for="end_date">{{ trans('cruds.excuse.fields.end_date') }}</label>
            <input class="form-control date {{ $errors->has('end_date') ? 'is-invalid' : '' }}" type="text" name="end_date" id="end_date" value="{{ old('end_date') }}">
            @if($errors->has('end_date'))
                <div class="invalid-feedback">
                    {{ $errors->first('end_date') }}
                </div>
            @endif
            <span class="help-block">{{ trans('cruds.excuse.fields.end_date_helper') }}</span>
        </div>
        <div class="form-group">
            <button class="btn btn-danger" type="submit">
                {{ trans('global.save') }}
            </button>
        </div>
    </form>
</div>

My script at the end of the blade:

<script>
$(document).ready(function() {
    $("#start_date").datepicker({
        numberOfMonths: 1,
        onSelect: function(selected) {
            $("#end_date").datepicker("option", "minDate", selected)
        }
    });
    $("#end_date").datepicker({
        numberOfMonths: 1,
        onSelect: function(selected) {
            $("#start_date").datepicker("option", "maxDate", selected)
        }
    });
});

@endsection

And my controller:

class ExcuseController extends Controller { public function index(Request $request) { abort_if(Gate::denies('excuse_access'), Response::HTTP_FORBIDDEN, '403 Forbidden');

    if ($request->ajax()) {
        $query = Excuse::with(['user', 'created_by'])->select(sprintf('%s.*', (new Excuse)->table));
        $table = Datatables::of($query);

        $table->addColumn('placeholder', '&nbsp;');
        $table->addColumn('actions', '&nbsp;');

        $table->editColumn('actions', function ($row) {
            $viewGate      = 'excuse_show';
            $editGate      = 'excuse_edit';
            $deleteGate    = 'excuse_delete';
            $crudRoutePart = 'excuses';

            return view('partials.datatablesActions', compact(
                'viewGate',
                'editGate',
                'deleteGate',
                'crudRoutePart',
                'row'
            ));
        });

        $table->editColumn('id', function ($row) {
            return $row->id ? $row->id : "";
        });
        $table->addColumn('user_name', function ($row) {
            return $row->user ? $row->user->name : '';
        });

        $table->rawColumns(['actions', 'placeholder', 'user']);

        return $table->make(true);
    }

    $users = User::get();
    $users = User::get();

    return view('admin.excuses.index', compact('users', 'users'));
}

public function create()
{
    abort_if(Gate::denies('excuse_create'), Response::HTTP_FORBIDDEN, '403 Forbidden');

    $users = User::all()->pluck('name', 'id')->prepend(trans('global.pleaseSelect'), '');

    return view('admin.excuses.create', compact('users'));
}

public function store(StoreExcuseRequest $request)
{
    $excuse = Excuse::create($request->all());

    $request->validate([
        'end_date' => 'after:start_date'
    ]);

    $excuses = Excuse::with('user')->get();
    $users = User::whereIn('id', $excuses->pluck('user_id'))->get();
    $grouped = $excuses->groupBy('user_id');
    $sums = $grouped->map->sum(function($excuse) {
        $start = $excuse->start_date;
        $end =$excuse->end_date;
        return Carbon::parse($start)->diffInDays($end,false);
    });

    foreach ($users as $user) {
        $user->remaining_permit = $user->excuse_count - $sums[$user->id];
        $user->save();
    }

    return redirect()->route('admin.excuses.index');
}

public function edit(Excuse $excus)
{
    abort_if(Gate::denies('excuse_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden');

    $users = User::all()->pluck('name', 'id')->prepend(trans('global.pleaseSelect'), '');

    $excus->load('user', 'created_by');

    return view('admin.excuses.edit', compact('users', 'excus'));
}

public function update(UpdateExcuseRequest $request, Excuse $excus)
{
    $excus->update($request->all());

    $excuses = Excuse::with('user')->get();
    $users = User::whereIn('id', $excuses->pluck('user_id'))->get();
    $grouped = $excuses->groupBy('user_id');
    $sums = $grouped->map->sum(function($excuse) {
        $start = $excuse->start_date;
        $end =$excuse->end_date;
        return Carbon::parse($start)->diffInDays($end,false);
    });

    foreach ($users as $user) {
        $user->remaining_permit = $user->excuse_count - $sums[$user->id];
        $user->save();
    }

    return redirect()->route('admin.excuses.index');
}

public function show(Excuse $excus)
{
    abort_if(Gate::denies('excuse_show'), Response::HTTP_FORBIDDEN, '403 Forbidden');

    $excus->load('user', 'created_by');

    return view('admin.excuses.show', compact('excus'));
}

public function destroy(Excuse $excus)
{
    abort_if(Gate::denies('excuse_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden');

    $excus->delete();

    $excuses = Excuse::with('user')->get();
    $users = User::whereIn('id', $excuses->pluck('user_id'))->get();
    $grouped = $excuses->groupBy('user_id');
    $sums = $grouped->map->sum(function($excuse) {
        $start = $excuse->start_date;
        $end =$excuse->end_date;
        return Carbon::parse($start)->diffInDays($end,false);
    });

    foreach ($users as $user) {
        $user->remaining_permit = $user->excuse_count - $sums[$user->id];
        $user->save();
    }

    return back();
}

public function massDestroy(MassDestroyExcuseRequest $request)
{
    Excuse::whereIn('id', request('ids'))->delete();

    return response(null, Response::HTTP_NO_CONTENT);
}

}

Snapey's avatar

Please learn to format your code blocks

put ``` on its own line before and after

gcwilliams's avatar

What date picker library are you using? Most have ways to disable dates. Pikaday and flatpickr are two popular ones. I know with flatpickr you can disable dates, I’m sure Pikaday does too. But would need to know what you’re using.

lilo's avatar
Level 2

Hi, I'm using bootstrap's datepicker.

Please or to participate in this conversation.