1. Go to this page and download the library: Download guava/calendar library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
guava / calendar example snippets
use \Guava\Calendar\Filament\CalendarWidget;
class MyCalendarWidget extends CalendarWidget
{
}
use Guava\Calendar\Enums\CalendarViewType;
protected CalendarViewType $calendarView = CalendarViewType::ResourceTimeGridWeek;
protected function getEvents(FetchInfo $info): Collection | array | Builder {}
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Collection;
use Guava\Calendar\ValueObjects\FetchInfo;
protected function getEvents(FetchInfo $info): Collection | array | Builder
{
// The simplest way:
return Foo::query();
// You probably want to query only visible events:
return Foo::query()
->whereDate('ends_at', '>=', $info->start)
->whereDate('starts_at', '<=', $info->end);
// If you need to display multiple types of models,
// you will need to combine the results of each
// query builder manually:
return collect()
->push(...Foo::query()->get())
->push(...Bar::query()->get())
;
}
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Collection;
use Guava\Calendar\ValueObjects\CalendarEvent;
use Guava\Calendar\ValueObjects\FetchInfo;
protected function getEvents(FetchInfo $info): Collection | array | Builder
{
return [
CalendarEvent::make()
->title('My first calendar')
->start(now())
->end(now()->addHours(2)),
];
}
use Guava\Calendar\Contracts\Eventable;
use Guava\Calendar\ValueObjects\CalendarEvent;
class Foo extends Model implements Eventable
{
// ...
// This is where you map your model into a calendar object
public function toCalendarEvent(): CalendarEvent
{
// For eloquent models, make sure to pass the model to the constructor
return CalendarEvent::make($this)
->title($this->name)
->start($this->starts_at)
->end($this->ends_at);
}
}
CalendarEvent::make()->styles([
'color: red' => true, // Applies the style if the condition (true) is met
'background-color' => '#ffff00', // Directly applies the background color
'font-size: 12px' // Always applies this font size
]);
CalendarEvent::make()->classNames([
'class-1',
'class-2' => true // Applies the class if the condition (true) is met
]);
CalendarEvent::make()
->display('background') // or 'auto'
->displayAuto() // short-hand for ->display('auto')
->displayBackground(); // short-hand for ->display('background')
use Guava\Calendar\ValueObjects\CalendarEvent;
CalendarEvent::make()
->resourceId('foo') // Pass a single resource ID, you can repeat this call multiple times
->resourceIds(['bar', 'baz']); // Pass multiple resource IDs at once
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Collection;
public function getResources(): Collection | array| Builder
{
return [
Bar::query()
];
}
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Collection;
use Guava\Calendar\ValueObjects\CalendarResource;
use Guava\Calendar\ValueObjects\FetchInfo;
protected function getResources(): Collection | array | Builder
{
return [
CalendarResource::make('baz') // This has to be unique ID
->title('My resource'),
];
}
use Guava\Calendar\Contracts\Resourceable;
use Guava\Calendar\ValueObjects\CalendarResource;
class Bar extends Model implements Resourceable
{
// ...
// This is where you map your model into a calendar resource object
public function toCalendarResource(): CalendarResource
{
return CalendarResource::make('my-unique-id')
->title($this->name);
}
}
use Guava\Calendar\Enums\CalendarViewType;
protected CalendarViewType $calendarView = CalendarViewType::ListWeek;
protected ?string $locale = 'en';
use Carbon\WeekDay;
protected WeekDay $firstDay = WeekDay::Sunday;
protected bool $dayMaxEvents = true;
protected bool $useFilamentTimezone = true;
// Setting to null will disable the heading completely
protected string | HtmlString | bool | null $heading = null;
// Or to render HTML, you can override the method directly and return a HtmlString
public function getHeading(): string|HtmlString
{
return new HtmlString('<div>some html</div>');
}
use Guava\Calendar\Filament\Actions\CreateAction;
public function createFooAction(): CreateAction
{
// You can use our helper method
return $this->createAction(Foo::class);
// Or you can add it manually, both variants are equivalent:
return CreateAction::make('createFoo')
->model(Foo::class);
}
public function onDateClick(DateClickInfo $info) {
$this->mountAction('createFoo');
}
use Guava\Calendar\Enums\Context;
use Guava\Calendar\Contracts\ContextualInfo;
use Guava\Calendar\ValueObjects\DateClickInfo;
use Guava\Calendar\ValueObjects\DateSelectInfo;
public function createFooAction(): CreateAction
{
return $this->createAction(Foo::class)
->mountUsing(function (?ContextualInfo $info) {
// You can now access contextual info from the calendar using the $info argument
if ($info instanceof DateClickInfo) {
// do something on date click
}
// Both comparison checks are equal, but instanceof is better for IDE help
if ($info->getContext() === Context::DateSelect) {
// do something on date select
}
})
// You could also type hint each contextual info directly:
->mountUsing(fn(?DateClickInfo $dateClick, ?DateSelectInfo $dateSelect))
;
}
public function defaultSchema(Schema $schema): Schema
{
return $schema->components([
// ...
]);
}
// Variant 1
public function fooBarSchema(Schema $schema): Schema
{
return $schema->components([
// ...
]);
}
// Variant 2
use Guava\Calendar\Attributes\CalendarSchema;
#[CalendarSchema(FooBar::class)]
public function baz(Schema $schema): Schema
{
return $schema->components([
// ...
]);
}
protected bool $dateClickEnabled = true;
use Guava\Calendar\ValueObjects\DateClickInfo;
protected function onDateClick(DateClickInfo $info): void
{
// Validate the data and handle the event
// For example, you might want to mount a create action
$this->mountAction('createFoo');
}
protected function getDateClickContextMenuActions(): array
{
return [
$this->createFooAction(),
$this->createBarAction(),
// Any other action you want
];
}
protected bool $dateSelectEnabled = true;
use Guava\Calendar\ValueObjects\DateSelectInfo;
protected function onDateSelect(DateSelectInfo $info): void
{
// Validate the data and handle the event
// For example, you might want to mount a create action
$this->mountAction('createFoo');
}
protected function getDateSelectContextMenuActions(): array
{
return [
$this->createFooAction(),
$this->createBarAction(),
// Any other action you want
];
}
protected bool $eventClickEnabled = true;
protected ?string $defaultEventClickAction = 'edit'; // view and edit actions are provided by us, but you can choose any action you want, even your own custom ones
use Illuminate\Database\Eloquent\Model;
use Guava\Calendar\ValueObjects\EventClickInfo;
protected function onEventClick(EventClickInfo $info, Model $event, ?string $action = null): void
{
// Validate the data and handle the event click
// $event contains the clicked event record
// you can also access it via $info->record
}
use Guava\Calendar\ValueObjects\NoEventsClickInfo;
protected function onNoEventsClick(NoEventsClickInfo $info): void
{
// Validate the data and handle the event
// For example, you might want to mount a create action
$this->mountAction('createFoo');
}
protected function getNoEventsClickContextMenuActions(): array
{
return [
$this->createFooAction(),
$this->createBarAction(),
// Any other action you want
];
}
protected bool $eventResizeEnabled = true;
use Illuminate\Database\Eloquent\Model;
use Guava\Calendar\ValueObjects\EventResizeInfo;
protected function onEventResize(EventResizeInfo $info, Model $event): void
{
// Validate the data and handle the event
// Most likely you will want to update the event with the new start /end dates to persist the resize in the database
}
protected bool $eventDragEnabled = true;
use Illuminate\Database\Eloquent\Model;
use Guava\Calendar\ValueObjects\EventDropInfo;
protected function onEventDrop(EventDropInfo $info, Model $event): void
{
// Validate the data and handle the event
// Most likely you will want to update the event with the new start /end dates to persist the drag & drop in the database
}
protected bool $datesSetEnabled = true;
use Guava\Calendar\ValueObjects\DatesSetInfo;
protected function onDatesSet(DatesSetInfo $info): void
{
// Validate the data and handle the event
// For example, you might want to store the date range in a cookie or session
// to remember the date range across page refreshes
}
protected bool $viewDidMountEnabled = true;
use Guava\Calendar\ValueObjects\ViewDidMountInfo;
protected function onViewDidMount(ViewDidMountInfo $info): void
{
// Validate the data and handle the event
// For example, you might want to store the date range in a cookie or session
// to remember the date range across page refreshes
}
use Illuminate\Support\HtmlString;
protected function eventContent(): HtmlString|string
{
// return a blade view
return view('calendar.event');
// return a HtmlString
return new HtmlString('<div>My event</div>');
}
use Illuminate\Support\HtmlString;
use Guava\Calendar\Attributes\CalendarEventContent;
// Variant 1.
#[CalendarEventContent(Foo::class)]
protected function eventContentForFoo(): HtmlString|string
{
return view('calendar.foo-model-event');
}
// Variant 2.
protected function barEventContent(): HtmlString|string
{
return view('calendar.bar-model-event');
}
use Illuminate\Support\HtmlString;
protected function resourceLabelContent(): HtmlString|string
{
// return a blade view
return view('calendar.resource');
// return a HtmlString
return new HtmlString('<div>My resource</div>');
}
use Illuminate\Support\HtmlString;
use Guava\Calendar\Attributes\CalendarResourceLabelContent;
// Variant 1.
#[CalendarResourceLabel(Foo::class)]
protected function resourceLabelContentForFoo(): HtmlString|string
{
return view('calendar.foo-model-resource');
}
// Variant 2.
protected function barResourceLabelContent(): HtmlString|string
{
return view('calendar.bar-model-resource');
}
use Guava\Calendar\Filament\Actions\CreateAction;
public function createFooAction(): CreateAction
{
return $this->createAction(Foo::class)
->authorize('create', Foo::class)
// At this point, it will authorize against the FooPolicy
//
// However, you might want to give the user some feedback:
->authorizationNotification()
// Now it will send a notification with the response message from your policy
//
// For context menu actions, you can instead use:
->authorizationTooltip()
// which will disable the action and show a tooltip with the response message
;
}
bash
php artisan filament:assets
bash
php artisan make:filament-widget
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.