{"id":32806668,"url":"https://github.com/GuavaCZ/calendar","last_synced_at":"2025-11-06T15:01:23.335Z","repository":{"id":248489749,"uuid":"804851197","full_name":"GuavaCZ/calendar","owner":"GuavaCZ","description":null,"archived":false,"fork":false,"pushed_at":"2025-10-24T10:07:22.000Z","size":5612,"stargazers_count":269,"open_issues_count":18,"forks_count":35,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-10-25T21:03:42.604Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GuavaCZ.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":".github/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"GuavaCZ"}},"created_at":"2024-05-23T11:53:58.000Z","updated_at":"2025-10-24T10:07:27.000Z","dependencies_parsed_at":"2024-11-04T18:28:22.759Z","dependency_job_id":"abac4902-687e-4db8-b4bd-6bb3786aaf2d","html_url":"https://github.com/GuavaCZ/calendar","commit_stats":null,"previous_names":["guavacz/calendar"],"tags_count":31,"template":false,"template_full_name":null,"purl":"pkg:github/GuavaCZ/calendar","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GuavaCZ%2Fcalendar","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GuavaCZ%2Fcalendar/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GuavaCZ%2Fcalendar/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GuavaCZ%2Fcalendar/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GuavaCZ","download_url":"https://codeload.github.com/GuavaCZ/calendar/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GuavaCZ%2Fcalendar/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":283027924,"owners_count":26767085,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-11-06T02:00:06.180Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-11-06T15:00:33.912Z","updated_at":"2025-11-06T15:01:23.313Z","avatar_url":"https://github.com/GuavaCZ.png","language":"PHP","funding_links":["https://github.com/sponsors/GuavaCZ"],"categories":["Calendar"],"sub_categories":[],"readme":"![calendar Banner](https://github.com/GuavaCZ/calendar/raw/main/docs/images/banner.jpg)\n\n\n# Adds support for vkurko/calendar to Filament PHP.\n\n[![Latest Version on Packagist](https://img.shields.io/packagist/v/guava/calendar.svg?style=flat-square)](https://packagist.org/packages/guava/calendar)\n[![GitHub Tests Action Status](https://img.shields.io/github/actions/workflow/status/guava/calendar/run-tests.yml?branch=main\u0026label=tests\u0026style=flat-square)](https://github.com/GuavaCZ/calendar/actions?query=workflow%3Arun-tests+branch%3Amain)\n[![GitHub Code Style Action Status](https://img.shields.io/github/actions/workflow/status/guava/calendar/fix-php-code-style-issues.yml?branch=main\u0026label=code%20style\u0026style=flat-square)](https://github.com/GuavaCZ/calendar/actions?query=workflow%3A\"Fix+PHP+code+style+issues\"+branch%3Amain)\n[![Total Downloads](https://img.shields.io/packagist/dt/guava/calendar.svg?style=flat-square)](https://packagist.org/packages/guava/calendar)\n\n\u003e [!NOTE]  \n\u003e You are viewing the documentation for guava/calendar v2, which supports only filament v4.\n\u003e For filament v3, please check guava/calendar v1 here.\n\nThis package adds support for [vkurko/calendar](https://github.com/vkurko/calendar) (free, open-source alternative to FullCalendar) to your FilamentPHP panels.\n\nIt allows you to create a widget with a calendar with support for **multiple** models and even resources you can group your events into. For example, you could have lessons (events) that are held in different rooms (resources).\n\n## Showcase\n![Showcase 01](https://github.com/GuavaCZ/calendar/raw/main/docs/images/showcase_01.png)\n![Showcase 02](https://github.com/GuavaCZ/calendar/raw/main/docs/images/showcase_02.png)\n\n\n\nhttps://github.com/user-attachments/assets/fc7828ab-ccd2-4252-942a-9679af1e7687\n\n\u003cvideo width=\"320\" height=\"240\" controls\u003e\n  \u003csource src=\"https://github.com/user-attachments/assets/fc7828ab-ccd2-4252-942a-9679af1e7687\" type=\"video/mp4\"\u003e\n\u003c/video\u003e\n\n\n\u003cvideo width=\"320\" height=\"240\" controls\u003e\n  \u003csource src=\"https://github.com/GuavaCZ/calendar/raw/main/docs/images/demo_preview.mp4\" type=\"video/mp4\"\u003e\n\u003c/video\u003e\n\nhttps://github.com/user-attachments/assets/a4460084-e8a8-4b1b-9ccd-4d887895155b\n\n\n![Resources Screenshot 01](https://github.com/GuavaCZ/calendar/raw/main/docs/images/resources_screenshot_01.png)\n\n\u003cvideo width=\"320\" height=\"240\" controls\u003e\n  \u003csource src=\"https://github.com/GuavaCZ/calendar/raw/main/docs/images/context_menu_preview.mp4\" type=\"video/mp4\"\u003e\n\u003c/video\u003e\n\nhttps://github.com/user-attachments/assets/a2641b40-9cbd-4c40-b360-7621caa86c40\n\n\u003cvideo width=\"320\" height=\"240\" controls\u003e\n  \u003csource src=\"https://github.com/GuavaCZ/calendar/raw/main/docs/images/context_menu_preview_2.mp4\" type=\"video/mp4\"\u003e\n\u003c/video\u003e\n\n\nhttps://github.com/user-attachments/assets/4996cc6a-7cee-4c7d-976a-60d3a4368f76\n\n\n\u003cvideo width=\"320\" height=\"240\" controls\u003e\n  \u003csource src=\"https://github.com/GuavaCZ/calendar/raw/main/docs/images/no_events_context_menu.mp4\" type=\"video/mp4\"\u003e\n\u003c/video\u003e\n\nhttps://github.com/user-attachments/assets/7c2537d5-8acf-459f-a9a8-be02d4018448\n\n\n## Support us\n\nYour support is key to the continual advancement of our plugin. We appreciate every user who has contributed to our journey so far.\n\nWhile our plugin is available for all to use, if you are utilizing it for commercial purposes and believe it adds significant value to your business, we kindly ask you to consider supporting us through GitHub Sponsors. This sponsorship will assist us in continuous development and maintenance to keep our plugin robust and up-to-date. Any amount you contribute will greatly help towards reaching our goals. Join us in making this plugin even better and driving further innovation.\n\n## Installation\n\nYou can install the package via composer:\n\n```bash\ncomposer require guava/calendar\n```\n\nMake sure to publish the package assets using:\n\n```bash\nphp artisan filament:assets\n```\n\nFinally, make sure you have a **custom filament theme** (read [here](https://filamentphp.com/docs/4.x/styling/overview#creating-a-custom-theme) how to create one) and add the following to your **theme.css** file:\n\nThis ensures that the CSS is properly built:\n```css\n@source '../../../../vendor/guava/calendar/resources/**/*';\n```\n\nThis is optional but highly recommended as it will apply styles to better fit with the (default) filament theme:\n```css\n@import '../../../../vendor/guava/calendar/resources/css/theme.css';\n```\n\nThe paths might be a little bit different if your theme.css is located in a non-standard path. Adjust accordingly.\n\n## Usage\n\n# Creating the calendar Widget\nFirst you need to create a custom widget and extend the `CalendarWidget` class. Make sure to remove the `view` property from the generated widget class!\n\nEither use the artisan command or simply create an empty class and extend `CalendarWidget`:\n```bash\nphp artisan make:filament-widget\n```\n\nThe widget class should look like this:\n```php\nuse \\Guava\\Calendar\\Filament\\CalendarWidget;\n\nclass MyCalendarWidget extends CalendarWidget\n{\n}\n```\n\nAdd the widget like a regular widget to any filament page you like, such as your `Dashboard`.\n\nCongrats! You now have a working calendar in filament!\n\n## Customizing the calendar view\nBy default, we show the `DayGridMonth` view. You can customize the view by overriding the `calendarView` property on the widget class:\n\n```php\nuse Guava\\Calendar\\Enums\\CalendarViewType;\n\nprotected CalendarViewType $calendarView = CalendarViewType::ResourceTimeGridWeek;\n```\n\nThe `CalendarViewType` enum contains all available views that you can use.\n\n## Adding events\nYou have probably noticed that your calendar is still empty.\n\nTo add events, override the `getEvents` method, described in more detail below.\n\n```php\nprotected function getEvents(FetchInfo $info): Collection | array | Builder {}\n```\n\nFetchInfo is a ValueObject we provide which type hints all parameters that are made available to you. This helps you scope the query to only retrieve models which are visible in the view.\n\nTo learn more about FetchInfo and other Value Objects, please refer to the Value Object documentation.\n\nThere are two distinct ways on how to provide Events to the calendar. Which way you use depends on your personal preference and the source of your events.\n\n### 1. From Eloquent\n\u003e [!IMPORTANT]\n\u003e Make sure that the Model class implements `Eventable`. Without it we are not able to map your model into a calendar event.\n\u003e \n\u003e For more information, please refer to the [Calendar Events section](#calendar-events).\n\nIn the majority of cases, you will most likely want to display your eloquent models as events inside the calendar.\n\nThe easiest way to do that is to just return your Eloquent Query, and we will handle the rest.\n\n```php\nuse Illuminate\\Database\\Eloquent\\Builder;\nuse Illuminate\\Support\\Collection;\nuse Guava\\Calendar\\ValueObjects\\FetchInfo;\n\nprotected function getEvents(FetchInfo $info): Collection | array | Builder\n{\n    // The simplest way:\n    return Foo::query();\n    \n    // You probably want to query only visible events:\n    return Foo::query()\n        -\u003ewhereDate('ends_at', '\u003e=', $info-\u003estart)\n        -\u003ewhereDate('starts_at', '\u003c=', $info-\u003eend);\n        \n   // If you need to display multiple types of models,\n   // you will need to combine the results of each\n   // query builder manually:\n   return collect()\n       -\u003epush(...Foo::query()-\u003eget())\n       -\u003epush(...Bar::query()-\u003eget())\n   ;   \n}\n```\n\n### 2. From Array/Collection\n\nSometimes, however, you might want to display events from an API or an array.\n\nTo do that, you can return an array or collection of `CalendarEvent` objects directly.\n\n```php\nuse Illuminate\\Database\\Eloquent\\Builder;\nuse Illuminate\\Support\\Collection;\nuse Guava\\Calendar\\ValueObjects\\CalendarEvent;\nuse Guava\\Calendar\\ValueObjects\\FetchInfo;\n\nprotected function getEvents(FetchInfo $info): Collection | array | Builder\n{\n    return [\n        CalendarEvent::make()\n            -\u003etitle('My first calendar')\n            -\u003estart(now())\n            -\u003eend(now()-\u003eaddHours(2)),\n    ];\n}\n```\n\n## Calendar events\nAs seen above, the calendar expects `CalendarEvent` objects, which are configurable ValueObjects that help you build the required calendar object.\n\nFor this purpose, we have an `Eventable` interface which you can add to **any class** that you want to be able to display as an event in your calendars.\n\nIn most cases, you will add this interface to your **eloquent models**, but you are not limited to it. Feel free to add it to any class you want.\n\nHere is an example:\n\n```php\nuse Guava\\Calendar\\Contracts\\Eventable;\nuse Guava\\Calendar\\ValueObjects\\CalendarEvent;\n\nclass Foo extends Model implements Eventable\n{\n    // ...\n    \n    // This is where you map your model into a calendar object\n    public function toCalendarEvent(): CalendarEvent\n    {\n        // For eloquent models, make sure to pass the model to the constructor\n        return CalendarEvent::make($this)\n            -\u003etitle($this-\u003ename)\n            -\u003estart($this-\u003estarts_at)\n            -\u003eend($this-\u003eends_at);\n    }\n}\n```\n\nNotice that the model instance is passed to the `Event` constructor in the `make` method. This sets the `key` and `model` properties to the calendar object, so it can be used to trigger actions.\n\nThis is a crucial step, if you forget to add this, we will not be able to identify the model when the event is interacted with (for example, when clicked).\n\n### Configuration\nThe `CalendarEvent` takes all available options like the underlying calendar package, for more info [read here](https://github.com/vkurko/calendar?tab=readme-ov-file#event-object).\n\nBelow is a list of available methods on the calendar object:\n\n#### Setting the title\nSets the title of the event that is rendered in the calendar.\n```php\nCalendarEvent::make()-\u003etitle('My event');\n```\n\n#### Customizing the start/end date\nSets the start or end date (and time) of the calendar in the calendar.\n```php\nCalendarEvent::make()\n    -\u003estart(today())\n    -\u003eend(today()-\u003eaddDays(3));\n```\n\n#### Making the calendar all-day\nSets whether the calendar is an all-day calendar or not.\n```php\nCalendarEvent::make()-\u003eallDay();\n```\n\n#### Customizing the background / text color\nSets the background color of the calendar (by default, it is the primary color of your filament panel).\n```php\nCalendarEvent::make()\n-\u003ebackgroundColor('#ff0000')\n-\u003etextColor('#ffffff');\n```\n\n#### Customizing Event Styles\n\nYou can add custom styles to your calendar elements by using the styles method. This method accepts an array where each entry can be a CSS style declaration. The styles will be directly applied to the calendar element in the view. You can define styles in three ways:\n\n- As a key-value pair where the key is the CSS property and value is the condition under which the style should apply.\n- As a key-value pair where the key is the CSS property and the value is directly the CSS value.\n- As a single string for static styles that always apply.\n\nHere's how you can use it:\n\n```php\nCalendarEvent::make()-\u003estyles([\n    'color: red' =\u003e true,            // Applies the style if the condition (true) is met\n    'background-color' =\u003e '#ffff00', // Directly applies the background color\n    'font-size: 12px'                // Always applies this font size\n]);\n```\n\n##### Usage Notes:\n\n- The first format ('color: red' =\u003e true) is useful for conditional styling based on dynamic conditions. For instance, changing the text color based on an calendar's type or status.\n\n- The second format ('background-color' =\u003e '#ffff00') is straightforward for applying styles where the values do not depend on conditions.\n- The third format ('font-size: 12px') is used when the style does not require any condition and is always applied to the calendar.\nThis flexibility allows you to easily customize the appearance of events based on dynamic conditions or predefined settings.\n\n#### Customizing Event Classes\n\nFollowing the same pattern as with the styles property, it is possible to inject custom classes into the Event element using the `classNames` or `classes` property.\n\nHere's how you can use it:\n\n```php\nCalendarEvent::make()-\u003eclassNames([\n    'class-1',            \n    'class-2' =\u003e true  // Applies the class if the condition (true) is met\n]);\n```\n\n##### Usage Notes:\n\n- The second format ('class-2' =\u003e true) is useful for conditional classes based on dynamic conditions.\n\n#### Customizing the display\nBy default, events are rendered as `blocks`. This is when the display is set to `auto`, which it is by default. You can also change the calendar to be rendered as a background calendar, which then fills the whole date cell. To do so, you can set `display` to `background` on the calendar:\n\nThis doesn't always work though, it only works on all day events and in specific views. If the `background` calendar is unsupported, the calendar will not be rendered at all.\n\n```php\nCalendarEvent::make()\n-\u003edisplay('background') // or 'auto'\n-\u003edisplayAuto() // short-hand for -\u003edisplay('auto')\n-\u003edisplayBackground(); // short-hand for -\u003edisplay('background')\n```\n\n#### Setting the action on click\nThis sets the action that should be mounted when the calendar is clicked. It can be any name of a filament action you defined in your widget, such as `edit` or `view`.\n\nBy default, all `CalendarWidget` classes already include a `view` and `edit` action.\n\n```php\nCalendarEvent::make()-\u003eaction('edit');\n```\n\n#### Set the model and record key\nTo mount the action with the correct record, we need to pass the model type and primary key of the record.\n\nThe model is also required if you want to display multiple types of events and have each be rendered differently (see customizing calendar content).\n\n```php\n$record = MyModel::find(1);\n// 1. variant\nCalendarEvent::make($record);\n\n// 2. variant\nCalendarEvent::make()\n    -\u003emodel($record::class)\n    -\u003ekey($record-\u003egetKey());\n```\n\n#### Linking to resources\nIf you use resources in your calendar, you need to tell your events which resource(s) they belong to.\n\nTo do this, pass an array of resource IDs to the event:\n```php\nuse Guava\\Calendar\\ValueObjects\\CalendarEvent;\nCalendarEvent::make()\n    -\u003eresourceId('foo') // Pass a single resource ID, you can repeat this call multiple times\n    -\u003eresourceIds(['bar', 'baz']); // Pass multiple resource IDs at once\n```\n\n#### Passing custom data\nYou can pass any custom data to the event that you wish:\n```php\nCalendarEvent::make()\n-\u003eextendedProp('foo', 'bar')\n// or\n-\u003eextendedProps(['baz' =\u003e 'qux', 'quux' =\u003e 'corge']);\n```\n\n## Adding Resources\nIf you configure your calendar to use a `resource` view, you will need to also define which resources to display in the calendar.\n\nSimilarly to events, There are two distinct ways on how to provide Resources to the calendar.\n\n### 1. From Eloquent\n\n\u003e [!IMPORTANT]\n\u003e Make sure that the Model class implements `Resourceable`. Without it, we are not able to map your model into a calendar resource.\n\u003e\n\u003e For more information, please refer to the [Calendar Resources section](#calendar-resources).\n\nIn the majority of cases, you will most likely want to display your eloquent models as resources inside the calendar.\n\nThe easiest way to do that is to just return your Eloquent Query, and we will handle the rest.\n\n```php\nuse Illuminate\\Database\\Eloquent\\Builder;\nuse Illuminate\\Support\\Collection;\n\npublic function getResources(): Collection | array| Builder\n{\n    return [\n        Bar::query()\n    ];\n}\n```\n\n### 2. From Array/Collection\n\nSometimes, however, you might want to display resources from an API or an array.\n\nTo do that, you can return an array or collection of `CalendarResource` objects directly.\n\n```php\nuse Illuminate\\Database\\Eloquent\\Builder;\nuse Illuminate\\Support\\Collection;\nuse Guava\\Calendar\\ValueObjects\\CalendarResource;\nuse Guava\\Calendar\\ValueObjects\\FetchInfo;\n\nprotected function getResources(): Collection | array | Builder\n{\n    return [\n        CalendarResource::make('baz') // This has to be unique ID\n            -\u003etitle('My resource'),\n    ];\n}\n```\n\n### Link events to resources\nNow we successfully display resources in the calendar, but we still need to add the events to their corresponding resource.\n\nTo do this, update your `CalendarEvent` objects (either directly in the `getEvents` method or in your classes implementing `Eventable`, depending on which approach you chose) and include the resource IDs it belongs to.\n\nPlease refer to the [Calendar Event: linking to resources section](#linking-to-resources) to learn how to do it.\n\n## Calendar Resources\n\nAs seen above, the calendar expects `CalendarResource` objects, which are configurable ValueObjects that help you build the required calendar object.\n\nFor this purpose, we have a `Resourceable` interface which you can add to **any class** that you want to be able to display as a resource in your calendars.\n\nIn most cases, you will add this interface to your **eloquent models**, but you are not limited to it. Feel free to add it to any class you want.\n\nHere is an example:\n\n```php\nuse Guava\\Calendar\\Contracts\\Resourceable;\nuse Guava\\Calendar\\ValueObjects\\CalendarResource;\n\nclass Bar extends Model implements Resourceable\n{\n    // ...\n    \n    // This is where you map your model into a calendar resource object\n    public function toCalendarResource(): CalendarResource\n    {\n        return CalendarResource::make('my-unique-id')\n            -\u003etitle($this-\u003ename);\n    }\n}\n```\n\n### Configuration\nThe `CalendarResource` takes all available options like the underlying calendar package, for more info [read here](https://github.com/vkurko/calendar?tab=readme-ov-file#resource-object).\n\nBelow is a list of available methods on the calendar object:\n\n#### Setting the title\nSets the title of the resource that is rendered in the calendar.\n```php\nCalendarResource::make()-\u003etitle('My resource');\n```\n\n#### Setting the event background color\nSets the default background color of the resource's events\n```php\nCalendarResource::make()-\u003eeventBackgroundColor('#FF0000');\n```\n\n#### Setting the event text color\nSets the default text color of the resource's events\n```php\nCalendarResource::make()-\u003eeventTextColor('#FFFFFF');\n```\n\n#### Passing custom data\nYou can pass any custom data to the resource that you wish:\n```php\nCalendarResource::make()\n    -\u003eextendedProp('foo', 'bar')\n    // or\n    -\u003eextendedProps(['baz' =\u003e 'qux', 'quux' =\u003e 'corge']);\n```\n\n## Available Methods\nThe calendar widget class itself contains a few useful methods.\n\n### Refresh events\nIf you need to trigger a refresh of the events in the calendar, you can call `refreshRecords()` on the widget.\n\n```php\n$this-\u003erefreshRecords();\n```\n\n### Refresh resources\nIf you need to trigger a refresh of the resources in the calendar, you can call `refreshResources()` on the widget.\n\n```php\n$this-\u003erefreshResources();\n```\n\n### Set Option\nTo change any calendar option during runtime, you can use the `setOption()` method on the widget.\n\nFor example, to programmatically change the date, you can use:\n```php\n$this-\u003esetOption('date', today()-\u003eaddDay()-\u003etoIso8601String());\n```\n\n## Customization\nNow that we know how to create a working calendar widget, we can learn how to customize the calendar to our liking.\n\nThe calendar widget contains a bunch of properties and methods that you can override in order to customize the widget.\n\nIn this section we will go through each of these options.\n\n### Calendar view\nThe calendar comes with a variety of views. You can the calendar view per widget by overriding the `calendarView` property:\n\n```php\nuse Guava\\Calendar\\Enums\\CalendarViewType;\n\nprotected CalendarViewType $calendarView = CalendarViewType::ListWeek;\n```\n\nCheck the `CalendarViewType` enum for a list of available views.\n\n### Locale\nBy default, the calendar will use your app's locale.\n\nThe underlying calendar package doesn't support locales as a combination of language and region/country code, so locales such as `fr_CA` or `en_US` become invalid.\n\nWe attempt to resolve this by only using the first language part of the locale. If you still run into any issues with the localization, you can override the calendar's locale manually using the `locale` property:\n\n```php\nprotected ?string $locale = 'en';\n```\n\n### First Day\nBy default, the calendar will use `Monday` as the first day.\n\nYou can customize this by overriding the `firstDay` property:\n```php\nuse Carbon\\WeekDay;\n\nprotected WeekDay $firstDay = WeekDay::Sunday;\n```\n\n### Day Max Events\nDetermines the maximum number of stacked event levels for a given day in the dayGrid view.\n\nIf there are too many events, a link like +2 more is displayed.\n\nCurrently, only a boolean value is supported. When set to true, it limits the number of events to the height of the day cell. When set to false (default) there is no limit.\n     \n```php\nprotected bool $dayMaxEvents = true;\n```\n\n### Use Filament Timezone\n\n\u003e [!CAUTION]\n\u003e While we still recommend setting this property to true, it **does** come with some potential side effects that you need to keep in mind. Keep reading to learn more.\n\nThe underlying Event Calendar does **not support** working with timezones. Thus, everything the user sees in their calendar is rendered in their **local browser time**.\n\nThis can cause confusion when adding interactivity to your calendar (such as editing events or creating events using filament modals), because filament will display the time **not** in the user's local browser time, but in the **app's timezone** (as configured in config/app.php).\n\nHowever, as of Filament v4, a `FilamentTimezone` can be configured which will make Filament automatically convert between the Apps timezone setting and your filament timezone.  This allows you to store users preferred timezone and convert it back and forth when displaying it to the user, for example via a DatePicker.\n\nTo learn more about the `FilamentTimezone` setting, please refer to the [Filament documentation](https://filamentphp.com/docs/4.x/forms/date-time-picker#timezones). \n\nIf you want your calendar to use the same timezone as configured via `FilamentTimezone`, you can use the `useFilamentTimezone` property to do so:\n\n```php\nprotected bool $useFilamentTimezone = true;\n```\n\nTo achieve this, we intercept dates sent from / to the calendar and override the timezone with the filament's timezone.\n\nHowever, please keep in mind that this currently comes with a few side effects, as we are not able to override all dates / times used internally by the calendar.\n\nFor example, if you enable the `now indicator`, it will still use the user's local browser time. We are trying to find a solution to fix this.\n\n### Heading\nBy default, the Heading displays the content of the `translations.heading` key (by default, it just says `Calendar`).\n\nYou can customize the heading of your calendar widget by overriding the `$heading` property or `getHeading` method:\n\n```php\n// Setting to null will disable the heading completely\nprotected string | HtmlString | bool | null $heading = null;\n\n// Or to render HTML, you can override the method directly and return a HtmlString\npublic function getHeading(): string|HtmlString\n{\n    return  new HtmlString('\u003cdiv\u003esome html\u003c/div\u003e');\n}\n```\n\n## Interactivity\n\nBy now you should have a perfectly fine and working calendar. However, it is still very static - you can view your events, but there is no way to interact with them.\n\nThe calendar supports many ways to interact with, which will be described below individually.\n\n### Actions\n\u003e [!CAUTION]\n\u003e Actions have no default authorization. This means, anyone can use any action.\n\u003e \n\u003e Please check the [Authorization section](#authorization) to learn how to authorize actions.\n\nBefore you read about the different ways to add interactions to your calendar, you need to understand how actions in the calendar work.\n\nActions used within the Calendar context need the `CalendarAction` trait to work properly.\n\nWe provide a few drop-in replacements of the regular Filament actions that already implement everything necessary:\n\n- CreateAction\n- ViewAction\n- EditAction\n- DeleteAction\n\nWhenever you want to use one of these actions, **make sure** you use the actions from our package. All they do is extend the regular filament action and add a few important setUp calls.\n\nSo, instead of using `Filament\\Actions\\CreateAction` you would use `Guava\\Calendar\\Filament\\Actions\\CreateAction`.\n\n#### Defining actions\nEvery action you use in the calendar should be defined as a public method in the widget class, just as usual when adding an [Action to a Livewire component](https://filamentphp.com/docs/4.x/components/action#adding-the-action) in filament.\n\n`View`, `Edit` and `Delete` actions are already present for you. You do not need to add them anymore.\n\nFor create actions, you still need to create them, since for each model a different create action needs to be added. There is a helper method available for you to help with this.\n\nFor example, to add a `createFooAction` (where `Foo` is a model in your app), you would add this method:\n\n```php\nuse Guava\\Calendar\\Filament\\Actions\\CreateAction;\n\npublic function createFooAction(): CreateAction\n{\n    // You can use our helper method\n    return $this-\u003ecreateAction(Foo::class);\n    \n    // Or you can add it manually, both variants are equivalent:\n    return CreateAction::make('createFoo')\n        -\u003emodel(Foo::class);\n}\n```\n\nBoth variants are equal, and it's just up to your personal preference which one you want to use.\n\n#### Mounting actions\nwhenever you want to mount an action programmatically within a calendar context, such as in the `onDateClick` method (more on this later), you can use the `mountAction` method. \n\n```php\npublic function onDateClick(DateClickInfo $info) {\n    $this-\u003emountAction('createFoo');\n}\n```\n\nIn the background, we pass a few more arguments to the mount method.\nThanks to that, you can type hint the contextual info in your actions:\n\n```php\nuse Guava\\Calendar\\Enums\\Context;\nuse Guava\\Calendar\\Contracts\\ContextualInfo;\nuse Guava\\Calendar\\ValueObjects\\DateClickInfo;\nuse Guava\\Calendar\\ValueObjects\\DateSelectInfo;\n\npublic function createFooAction(): CreateAction\n{\n    return $this-\u003ecreateAction(Foo::class)\n        -\u003emountUsing(function (?ContextualInfo $info) {\n            // You can now access contextual info from the calendar using the $info argument \n            if ($info instanceof DateClickInfo) {\n                // do something on date click\n            }\n            \n            // Both comparison checks are equal, but instanceof is better for IDE help\n            if ($info-\u003egetContext() === Context::DateSelect) {\n                // do something on date select\n            }\n        })\n        // You could also type hint each contextual info directly:\n        -\u003emountUsing(fn(?DateClickInfo $dateClick, ?DateSelectInfo $dateSelect))\n    ;\n}\n```\n\n#### Accessing context information\nAs seen above, we provide various contextual information for you when using calendar actions:\n\n| Parameter         | Description                                                                            |\n|-------------------|----------------------------------------------------------------------------------------|\n| Context           | The current context enum or null if not in calendar context                            |\n| DateClickInfo     | If in the DateClick context, it will contain the DateClickInfo, otherwise null         |\n| DateSelectInfo    | If in the DateSelect context, it will contain the DateSelectInfo, otherwise null       |\n| EventClickInfo    | If in the EventClick context, it will contain the EventClickInfo, otherwise null       |\n| NoEventsClickInfo | If in the NoEventsClick context, it will contain the NoEventsClickInfo, otherwise null |\n\nYou simply need to type hint the parameter correctly and it will be injected for you if available.\n\nThese are not only limited to `mountUsing`, almost all action methods will have access to these.\n\nFor example, to conditionally hide an action in the DateClick context:\n```php\nuse Guava\\Calendar\\Enums\\Context;\n\n$this-\u003ecreateAction(Foo::class)\n    -\u003ehidden(function (?ContextualInfo $info) {\n        return $info-\u003egetContext() === Context::DateClick;\n    });\n```\n\n### Schemas\n\nThe `create`, `view` and `edit` actions should work out of the box and use the correct schemas.\n\nWe attempt to guess your Resource and reuse the appropriate schema: `Create` and `Edit` actions will use your **Form Schema**, while `View` actions will reuse your **Infolist Schema** or fall-back to the **Form Schema** if no Infolist is present.\n\nBut sometimes, you might want to customize the Schema that will be used in your Calendar Modals.\n\nYou have a few options available:\n- Stick to auto discovery, in which case you are ready to go :-),\n- if your calendar works with a single model only or you reuse the same schema for multiple models, you can implement the `schema` or `defaultSchema` method,\n- or you can implement a schema per model\n\n#### Implementing a default schema\n\nIf you only work with a single model, or you want to share the same schema across multiple models, you can implement the `schema` or `defaultSchema` method (both are equivalent) in your calendar widget:\n\n```php\npublic function defaultSchema(Schema $schema): Schema\n{\n    return $schema-\u003ecomponents([\n        // ...\n    ]);\n}\n```\n\n#### Implementing a schema for a specific model\n\nIf you need to set a specific schema for a model, you have two options:\n- Define a method with any name you want and add the `#[CalendarSchema()]` attribute,\n- or define a method in the format `camelCaseModelNameSchema`, such as `fooBarSchema`\n\n```php\n// Variant 1\npublic function fooBarSchema(Schema $schema): Schema\n{\n    return $schema-\u003ecomponents([\n        // ...\n    ]);\n}\n\n// Variant 2\nuse Guava\\Calendar\\Attributes\\CalendarSchema;\n\n#[CalendarSchema(FooBar::class)]\npublic function baz(Schema $schema): Schema\n{\n    return $schema-\u003ecomponents([\n        // ...\n    ]);\n}\n```\n\n### Date Click\n\nA date click event is triggered when a date cell is clicked in the calendar.\n\nTo handle date clicks, first enable them by overriding the `dateClickEnabled` property:\n\n```php\nprotected bool $dateClickEnabled = true;\n```\n\nNow date clicks are enabled and a request will be sent to livewire each time a date cell is clicked.\n\nBut by default, nothing happens, and each date click will be silently ignored.\n\nYou can now choose to either:\n- implement your own logic\n- or use our context menu feature\n\n#### Implementing your own logic\n\nIf you want to take full control over what happens when a date cell is clicked, override the `onDateClick` method and implement your own custom logic:\n\n```php\nuse Guava\\Calendar\\ValueObjects\\DateClickInfo;\n\nprotected function onDateClick(DateClickInfo $info): void\n{\n    // Validate the data and handle the event\n    // For example, you might want to mount a create action\n    $this-\u003emountAction('createFoo');\n}\n```\n\n#### Using the context menu feature\nAnother option is to use our context menu feature. When enabled, a context menu will be rendered at your mouse cursor when you click a date cell, which you can populate with actions.\n\nTo use the context menu feature, all you need to do is implement the `getDateClickContextMenuActions` method:\n\n```php\nprotected function getDateClickContextMenuActions(): array\n{\n    return [\n        $this-\u003ecreateFooAction(),\n        $this-\u003ecreateBarAction(),\n        // Any other action you want\n    ];\n}\n```\n\nThe context menu has a higher priority, so if it returns a non-empty array, it will always take precedence over your custom handler.\n\n### Date Select\n\nSimilarly, a date select event is triggered when a date cell is dragged to create a selection in the calendar.\n\nTo handle date selects, first enable them by overriding the `dateSelectEnabled` property:\n\n```php\nprotected bool $dateSelectEnabled = true;\n```\n\nNow date selects are enabled and a request will be sent to livewire each time a date selection is made.\n\nBut by default, nothing happens, and each date select will be silently ignored.\n\nYou can now choose to either:\n- implement your own logic\n- or use our context menu feature\n\n#### Implementing your own logic\n\nIf you want to take full control over what happens when a date selection is made, override the `onDateSelect` method and implement your own custom logic:\n\n```php\nuse Guava\\Calendar\\ValueObjects\\DateSelectInfo;\n\nprotected function onDateSelect(DateSelectInfo $info): void\n{\n    // Validate the data and handle the event\n    // For example, you might want to mount a create action\n    $this-\u003emountAction('createFoo');\n}\n```\n\n#### Using the context menu feature\nAnother option is to use our context menu feature. When enabled, a context menu will be rendered at your mouse cursor when you complete your date selection, which you can populate with actions.\n\nTo use the context menu feature, all you need to do is implement the `getDateSelectContextMenuActions` method:\n\n```php\nprotected function getDateSelectContextMenuActions(): array\n{\n    return [\n        $this-\u003ecreateFooAction(),\n        $this-\u003ecreateBarAction(),\n        // Any other action you want\n    ];\n}\n```\n\nThe context menu has a higher priority, so if it returns a non-empty array, it will always take precedence over your custom handler.\n\n### Event Click\n\nAn event click event is triggered when an event is clicked in the calendar.\n\nTo handle event clicks, first enable them by overriding the `eventClickEnabled` property:\n\n```php\nprotected bool $eventClickEnabled = true;\n```\n\nNow event clicks are enabled and a request will be sent to livewire each time an event is clicked.\n\nBy default, a view action will be mounted with prefilled information about the event.\n\nYou can set the default click action by overriding the `defaultEventClickAction` property of the widget. This simply needs to be the name of an action that you can freely define in your widget, like regular Filament actions:\n\n```php\nprotected ?string $defaultEventClickAction = 'edit'; // view and edit actions are provided by us, but you can choose any action you want, even your own custom ones\n```\n\nYou can now choose to either:\n- keep the default behavior,\n- implement your own logic\n- or use our context menu feature\n\n#### Implementing your own logic\n\nIf you want to take full control over what happens when an event is clicked, override the `onEventClick` method and implement your own custom logic:\n\n```php\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Guava\\Calendar\\ValueObjects\\EventClickInfo;\n\nprotected function onEventClick(EventClickInfo $info, Model $event, ?string $action = null): void\n{\n    // Validate the data and handle the event click\n    // $event contains the clicked event record\n    // you can also access it via $info-\u003erecord\n}\n```\n\n#### Using the context menu feature\nAnother option is to use our context menu feature. When enabled, a context menu will be rendered at your mouse cursor when you click an event, which you can populate with actions.\n\nTo use the context menu feature, all you need to do is implement the `getEventClickContextMenuActions` method:\n\n```php\nprotected function getEventClickContextMenuActions(): array\n{\n    return [\n        $this-\u003eviewAction(),\n        $this-\u003eeditAction(),\n        $this-\u003edeleteAction(),\n    ];\n}\n```\n\nThe context menu has a higher priority, so if it returns a non-empty array, it will always take precedence over your custom handler.\n\n### No Events Click\n\u003e [!NOTE]  \n\u003e This has affect only in list views.\n\nA no events click event is triggered when a list view has no events to display and the calendar content was clicked.\n\nTo handle no events clicks, first enable them by overriding the `noEventsClickEnabled` property:\n\n```php\nprotected bool $noEventsClickEnabled = true;\n```\n\nNow no events clicks are enabled and a request will be sent to livewire each time a click is made.\n\nBut by default, nothing happens, and each click will be silently ignored.\n\nYou can now choose to either:\n- implement your own logic\n- or use our context menu feature\n\n#### Implementing your own logic\n\nIf you want to take full control over what happens when a click is made, override the `onNoEventsClick` method and implement your own custom logic:\n\n```php\nuse Guava\\Calendar\\ValueObjects\\NoEventsClickInfo;\n\nprotected function onNoEventsClick(NoEventsClickInfo $info): void\n{\n    // Validate the data and handle the event\n    // For example, you might want to mount a create action\n    $this-\u003emountAction('createFoo');\n}\n```\n\n#### Using the context menu feature\nAnother option is to use our context menu feature. When enabled, a context menu will be rendered at your mouse cursor when you click, which you can populate with actions.\n\nTo use the context menu feature, all you need to do is implement the `getNoEventsClickContextMenuActions` method:\n\n```php\nprotected function getNoEventsClickContextMenuActions(): array\n{\n    return [\n        $this-\u003ecreateFooAction(),\n        $this-\u003ecreateBarAction(),\n        // Any other action you want\n    ];\n}\n```\n\nThe context menu has a higher priority, so if it returns a non-empty array, it will always take precedence over your custom handler.\n\n### Event Resize\n\nCallback function that is triggered when you finish resizing an event in your calendar.\n\nTo handle the callback, first enable it by overriding the `eventResizeEnabled` property:\n\n```php\nprotected bool $eventResizeEnabled = true;\n```\n\nNow it is enabled and a request will be sent to livewire after you complete the resize of an event.\n\n#### Implementing your own logic\n\n\u003e [!IMPORTANT]  \n\u003e Notice that unlike the other callbacks, this callback returns a boolean value.\n\u003e \n\u003e This is used to control whether the event resize should be reverted visually on the frontend or not.\n\nTo handle the callback, override the `onEventResize` method and implement your own custom logic:\n\n```php\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Guava\\Calendar\\ValueObjects\\EventResizeInfo;\n\nprotected function onEventResize(EventResizeInfo $info, Model $event): void\n{\n    // Validate the data and handle the event\n    // Most likely you will want to update the event with the new start /end dates to persist the resize in the database\n}\n```\n\n### Event Drag \u0026 Drop\n\nCallback function that is triggered when you finish dragging and drop an event to a date cell in your calendar.\n\nTo handle the callback, first enable it by overriding the `eventDragEnabled` property:\n\n```php\nprotected bool $eventDragEnabled = true;\n```\n\nNow it is enabled and a request will be sent to livewire after you drop the event to a date cell in the calendar.\n\n#### Implementing your own logic\n\n\u003e [!IMPORTANT]  \n\u003e Notice that unlike the other callbacks, this callback returns a boolean value.\n\u003e\n\u003e This is used to control whether the event should be reverted visually to it's original position on the frontend or not.\n\nTo handle the callback, override the `onEventDrop` method and implement your own custom logic:\n\n```php\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Guava\\Calendar\\ValueObjects\\EventDropInfo;\n\nprotected function onEventDrop(EventDropInfo $info, Model $event): bool\n{\n     // Access the updated dates using getter methods\n    $newStart = $info-\u003eevent-\u003egetStart();\n    $newEnd = $info-\u003eevent-\u003egetEnd();\n      // Update the event with the new start/end dates to persist the drag \u0026 drop\n    $event-\u003eupdate([\n        'start_time' =\u003e $newStart,\n        'end_time' =\u003e $newEnd,\n    ]);\n     // Return true to accept the drop and keep the event in the new position\n    return true;\n    \n}\n```\n\n### Dates Set\n\nWhen the date range of the calendar was originally set or changed by clicking the previous/next buttons, changing the view, manipulating the current date via the API, etc. a Dates Set event is triggered.\n\nTo handle the Dates Set callback, first enable it by overriding the `datesSetEnabled` property:\n\n```php\nprotected bool $datesSetEnabled = true;\n```\n\nNow it is enabled and a request will be sent to livewire each time the calendar date range is changed (or initially set).\n\n#### Implementing your own logic\n\nTo handle the callback, override the `onDatesSet` method and implement your own custom logic:\n\n```php\nuse Guava\\Calendar\\ValueObjects\\DatesSetInfo;\n\nprotected function onDatesSet(DatesSetInfo $info): void\n{\n    // Validate the data and handle the event\n    // For example, you might want to store the date range in a cookie or session\n    // to remember the date range across page refreshes\n}\n```\n\n### View Did Mount\n\nCallback function that is triggered right after the view has been added to the DOM.\n\nTo handle the callback, first enable it by overriding the `viewDidMountEnabled` property:\n\n```php\nprotected bool $viewDidMountEnabled = true;\n```\n\nNow it is enabled and a request will be sent to livewire right after the calendar view has been added to the DOM.\n\n#### Implementing your own logic\n\nTo handle the callback, override the `onViewDidMount` method and implement your own custom logic:\n\n```php\nuse Guava\\Calendar\\ValueObjects\\ViewDidMountInfo;\n\nprotected function onViewDidMount(ViewDidMountInfo $info): void\n{\n    // Validate the data and handle the event\n    // For example, you might want to store the date range in a cookie or session\n    // to remember the date range across page refreshes\n}\n```\n\n## Custom Event Content\nBy default, we use the default view from the calendar package. However, you are able to use your own content.\n\nTo keep things performant, the blade view is rendered **once** on the server and then re-used for every event. Thus, you **cannot** access the calendar event data from the server side via Blade or Laravel, or do any server-side operations.\n\nHowever, each event is wrapped in an alpine component, which exposes the event data that you can freely use using [AlpineJS](https://alpinejs.dev/).\n\nIf you only have one type of events or events that render the same way, you can simply return a view or a HtmlString from the `defaultEventContent` or `eventContent` method:\n\n```php\nuse Illuminate\\Support\\HtmlString;\n\nprotected function eventContent(): HtmlString|string\n{\n    // return a blade view\n    return view('calendar.event');\n    \n    // return a HtmlString\n    return new HtmlString('\u003cdiv\u003eMy event\u003c/div\u003e');\n}\n```\n\nExample of the `calendar.event` view blade file: \n```bladehtml\n\u003cdiv class=\"flex flex-col items-start\"\u003e\n    \u003cspan x-text=\"event.title\"\u003e\u003c/span\u003e\n    \u003ctemplate x-for=\"user in event.extendedProps.users\"\u003e\n        \u003cspan x-text=\"user.name\"\u003e\u003c/span\u003e\n    \u003c/template\u003e\n\u003c/div\u003e\n```\n\nIf you want to render events differently based on their model type, you can implement an Event Content method for each model, by using the `CalendarEventContent` attribute or by using a specific naming convention for the method - `camelCaseModelNameEventContent` such as `fooEventContent` (where Foo is your model):\n```php\nuse Illuminate\\Support\\HtmlString;\nuse Guava\\Calendar\\Attributes\\CalendarEventContent;\n\n// Variant 1.\n#[CalendarEventContent(Foo::class)]\nprotected function eventContentForFoo(): HtmlString|string\n{\n    return view('calendar.foo-model-event');\n}\n\n// Variant 2.\nprotected function barEventContent(): HtmlString|string\n{\n    return view('calendar.bar-model-event');\n}\n```\n\nBoth variants are equal, it's up to your personal preference which one you want to use.\n\n## Custom Resource Label Content\nBy default, we use the default view from the calendar package. However, you are able to use your own content.\n\nTo keep things performant, the blade view is rendered **once** on the server and then re-used for every resource. Thus, you **cannot** access the calendar resource data from the server side via Blade or Laravel, or do any server-side operations.\n\nHowever, each resource is wrapped in an alpine component, which exposes the resource data that you can freely use using [AlpineJS](https://alpinejs.dev/).\n\nIf you only have one type of resources or resources that render the same way, you can simply return a view or a HtmlString from the `defaultResourceLabelContent` or `resourceLabelContent` method:\n\n```php\nuse Illuminate\\Support\\HtmlString;\n\nprotected function resourceLabelContent(): HtmlString|string\n{\n    // return a blade view\n    return view('calendar.resource');\n    \n    // return a HtmlString\n    return new HtmlString('\u003cdiv\u003eMy resource\u003c/div\u003e');\n}\n```\n\nExample of the `calendar.resource` view blade file:\n```bladehtml\n\u003cdiv class=\"flex flex-col items-start\"\u003e\n    \u003cspan x-text=\"resource.title\"\u003e\u003c/span\u003e\n\u003c/div\u003e\n```\n\nIf you want to render resources differently based on their model type, you can implement a Resource Label Content method for each model, by using the `CalendarResourceLabelContent` attribute or by using a specific naming convention for the method - `camelCaseModelNameResourceLabelContent` such as `fooResourceLabelContent` (where Foo is your model):\n```php\nuse Illuminate\\Support\\HtmlString;\nuse Guava\\Calendar\\Attributes\\CalendarResourceLabelContent;\n\n// Variant 1.\n#[CalendarResourceLabel(Foo::class)]\nprotected function resourceLabelContentForFoo(): HtmlString|string\n{\n    return view('calendar.foo-model-resource');\n}\n\n// Variant 2.\nprotected function barResourceLabelContent(): HtmlString|string\n{\n    return view('calendar.bar-model-resource');\n}\n```\n\nBoth variants are equal, it's up to your personal preference which one you want to use.\n\n## Authorization\n\nBy default, everyone can use all actions! The package does not handle authorization, this is your responsibility.\n\nSince we use regular filament actions, adding authorizations is a breeze. \n\nFor example to add authorization to the createTaskAction:\n\n```php\nuse Guava\\Calendar\\Filament\\Actions\\CreateAction;\n\npublic function createFooAction(): CreateAction\n{\n    return $this-\u003ecreateAction(Foo::class)\n        -\u003eauthorize('create', Foo::class)\n        // At this point, it will authorize against the FooPolicy\n        //\n        // However, you might want to give the user some feedback:\n        -\u003eauthorizationNotification()\n        // Now it will send a notification with the response message from your policy\n        //\n        // For context menu actions, you can instead use:\n        -\u003eauthorizationTooltip()\n        // which will disable the action and show a tooltip with the response message\n    ;\n}\n```\n\nFor detailed information, please follow the default filament documentation on how to add [authorization to actions](https://filamentphp.com/docs/4.x/actions/overview#authorization).\n\n## Utility Classes\nWe provide various helper and utility classes to provide you with type hints for various arguments that are being passed from the calendar to your widget.\n\n### CalendarViewType\nThis enum contains all available calendar views that you can use in your calendar widget.\n\n### FetchInfo\nWhen the calendar retrieves events, it provides you with a `FetchInfo` object which contains information about the current calendar view.\n\nUse this to query only models that are visible in the current view.\n\n| Property | Description                                                                                                     |\n|--------|-----------------------------------------------------------------------------------------------------------------|\n| start  | Start date of the range the calendar needs events for. Events before this date are not visible in the calendar. |\n| end    | End date of the range the calendar needs events for. Events after this date are not visible in the calendar.    |\n\n## Troubleshooting\n### Context menu actions don't work\nIf you encounter issues with the context menu, make sure that the name of the action is unique across the whole widget. If there is another action with the same name, it might be mounted instead of the one you want.\n\n### Record vs Event record\nWhen working with resource widgets, `$record` is the record of the currently opened resource record, whereas `$eventRecord` is the record of the calendar event (during calendar actions, context menus, etc.).\n\n## Security measures\nKeep in mind that a lot of the data in this package comes from the client side JavaScript and could be tampered with. Always validate the data on the server side and never trust the data from the client side.\n\n## Testing\n\n```bash\ncomposer test\n```\n\n## Changelog\n\nPlease see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.\n\n## Contributing\n\nPlease see [CONTRIBUTING](CONTRIBUTING.md) for details.\n\n## Security Vulnerabilities\n\nPlease review [our security policy](../../security/policy) on how to report security vulnerabilities.\n\n## Credits\n- [Lukas Frey](https://github.com/GuavaCZ)\n- [All Contributors](../../contributors)\n- Spatie - Our package skeleton is a modified version of [Spatie's Package Skeleton](https://github.com/spatie/package-skeleton-laravel)\n- [vkurko/calendar](https://github.com/vkurko/calendar) - free, open-source alternative to FullCalendar\n- [saade/filament-fullcalendar](https://github.com/saade/filament-fullcalendar) - heavy inspiration for this package\n\n## License\n\nThe MIT License (MIT). Please see [License File](LICENSE.md) for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FGuavaCZ%2Fcalendar","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FGuavaCZ%2Fcalendar","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FGuavaCZ%2Fcalendar/lists"}