skills/.system/jwebmp-fullcalendar/SKILL.md
Full-featured calendar integration for JWebMP with FullCalendar 6.1.19 and Angular 20. Provides server-driven calendar configuration with drag-and-drop event scheduling, multiple calendar views (day, week, month, list, timeline), timezone support, localization, recurring events, resource management, and Bootstrap 5 theming. Use when working with FullCalendar, creating scheduling interfaces, building event calendars, managing resources, or implementing calendar features in JWebMP applications.
npx skillsauth add guicedee/ai-rules jwebmp-fullcalendarInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Full-featured calendar integration for JWebMP with FullCalendar 6.1.19 and Angular 20.
public class CalendarConfig {
public FullCalendarOptions getCalendarOptions() {
return new FullCalendarOptions()
.setInitialView("dayGridMonth")
.setLocale("en")
.setTimeZone("UTC")
.setEditable(true)
.setHeaderToolbar(new Toolbar()
.setLeft("prev,next today")
.setCenter("title")
.setRight("dayGridMonth,timeGridWeek,timeGridDay,listWeek"))
.setEvents(getEvents());
}
private List<Event> getEvents() {
return List.of(
new Event()
.setTitle("Team Meeting")
.setStart("2025-03-15T10:00:00")
.setEnd("2025-03-15T11:00:00")
.setBackgroundColor("#4285F4")
);
}
}
import { Component, OnInit } from '@angular/core';
import { CalendarOptions } from '@fullcalendar/core';
import dayGridPlugin from '@fullcalendar/daygrid';
import timeGridPlugin from '@fullcalendar/timegrid';
import interactionPlugin from '@fullcalendar/interaction';
@Component({
selector: 'app-calendar',
template: `<full-calendar [options]="calendarOptions"></full-calendar>`
})
export class CalendarComponent implements OnInit {
calendarOptions?: CalendarOptions;
ngOnInit() {
this.calendarOptions = {
plugins: [dayGridPlugin, timeGridPlugin, interactionPlugin],
initialView: 'dayGridMonth',
editable: true,
selectable: true,
dateClick: (arg) => this.handleDateClick(arg),
eventClick: (arg) => this.handleEventClick(arg)
};
}
}
| View Type | Plugin | Description |
|---|---|---|
| dayGridMonth | daygrid | Month view with day cells |
| dayGridWeek | daygrid | Week view with day cells |
| dayGridDay | daygrid | Single day view |
| timeGridWeek | timegrid | Week view with time slots |
| timeGridDay | timegrid | Day view with time slots |
| listWeek | list | List view for week |
| listMonth | list | List view for month |
| listYear | list | List view for year |
options
.setInitialView("dayGridMonth")
.setInitialDate("2025-03-15")
.setWeekends(true)
.setDayMaxEvents(3)
.setNowIndicator(true);
options
.setEditable(true)
.setSelectable(true)
.setSelectMirror(true)
.setEventStartEditable(true)
.setEventDurationEditable(true);
options
.setLocale("en") // en, es, fr, de, etc.
.setTimeZone("America/New_York") // IANA timezone
.setDirection("ltr"); // ltr/rtl
options
.setDefaultAllDay(false)
.setDefaultTimedEventDuration("01:00")
.setSlotDuration("00:30");
options
.setHeaderToolbar(new Toolbar()
.setLeft("prev,next today")
.setCenter("title")
.setRight("dayGridMonth,timeGridWeek,timeGridDay"))
.setFooterToolbar(new Toolbar()
.setLeft("customButton")
.setCenter("")
.setRight(""));
options.setBusinessHours(new BusinessHours()
.setDaysOfWeek([1,2,3,4,5])
.setStartTime("09:00")
.setEndTime("17:00"));
Event event = new Event()
.setId("evt-1")
.setTitle("Team Meeting")
.setStart("2025-03-15T10:00:00")
.setEnd("2025-03-15T11:00:00")
.setAllDay(false)
.setUrl("https://example.com/meeting")
.setBackgroundColor("#4285F4")
.setBorderColor("#1967D2")
.setTextColor("#FFFFFF")
.setClassNames("important", "team-event")
.setEditable(true)
.setExtendedProps(Map.of(
"department", "Engineering",
"room", "Conference A"
));
options.setEvents(List.of(event1, event2, event3));
options.setEventSources(List.of(
new EventSource()
.setUrl("/api/events")
.setMethod("GET"),
new EventSource()
.setUrl("/api/holidays")
.setColor("red")
.setBackgroundColor("#FFEBEE")
));
@Path("/api/calendar")
@Produces(MediaType.APPLICATION_JSON)
public class CalendarResource {
@GET
@Path("/options")
public FullCalendarOptions getOptions() {
return new FullCalendarOptions()
.setInitialView("dayGridMonth")
.setEditable(true)
.setSelectable(true);
}
@GET
@Path("/events")
public List<Event> getEvents() {
return eventService.findAll().stream()
.map(e -> new Event()
.setId(e.getId())
.setTitle(e.getTitle())
.setStart(e.getStartTime())
.setEnd(e.getEndTime()))
.collect(Collectors.toList());
}
@POST
@Path("/events")
public Event createEvent(Event event) {
return eventService.save(event);
}
@PUT
@Path("/events/{id}")
public Event updateEvent(@PathParam("id") String id, Event event) {
return eventService.update(id, event);
}
@DELETE
@Path("/events/{id}")
public Response deleteEvent(@PathParam("id") String id) {
eventService.delete(id);
return Response.noContent().build();
}
}
new FullCalendarOptions()
.setInitialView("timeGridWeek")
.setSlotMinTime("06:00:00")
.setSlotMaxTime("22:00:00")
.setSlotDuration("00:30:00")
.setBusinessHours(new BusinessHours()
.setDaysOfWeek([1,2,3,4,5])
.setStartTime("09:00")
.setEndTime("17:00"));
new FullCalendarOptions()
.setInitialView("dayGridMonth")
.setEditable(true)
.setSelectable(true)
.setEventSources(List.of(
new EventSource().setUrl("/api/events"),
new EventSource().setUrl("/api/holidays").setColor("red")
));
new FullCalendarOptions()
.setInitialView("timeGridWeek")
.setTimeZone(userTimezone)
.setLocale(getUserLocale())
.setNowIndicator(true)
.setSlotLabelFormat(Map.of(
"hour", "2-digit",
"minute", "2-digit",
"meridiem", "short"
));
new FullCalendarOptions()
.setInitialView("resourceTimeGridDay")
.setResources(loadRooms())
.setEvents(loadBookings())
.setEditable(true)
.setResourceAreaHeaderContent("Conference Rooms")
.setSlotMinTime("08:00:00")
.setSlotMaxTime("20:00:00");
{
"dependencies": {
"@fullcalendar/angular": "^6.1.19",
"@fullcalendar/daygrid": "^6.1.19",
"@fullcalendar/timegrid": "^6.1.19",
"@fullcalendar/list": "^6.1.19",
"@fullcalendar/interaction": "^6.1.19",
"@fullcalendar/bootstrap5": "^6.1.19",
"@fullcalendar/moment-timezone": "^6.1.19"
}
}
module com.jwebmp.plugins.fullcalendar {
requires transitive com.jwebmp.core;
requires transitive com.jwebmp.plugins.angular;
requires jakarta.validation;
exports com.jwebmp.plugins.fullcalendar;
exports com.jwebmp.plugins.fullcalendar.options;
}
<dependency>
<groupId>com.jwebmp.plugins</groupId>
<artifactId>full-calendar</artifactId>
</dependency>
FullCalendarOptions — Main calendar configurationEvent — Event data modelEventSource — Event source configurationToolbar — Toolbar configurationBusinessHours — Business hours configurationView — View configurationcom.jwebmp.plugins.fullcalendardevelopment
Install Codex skills into $CODEX_HOME/skills from a curated list or a GitHub repo path. Use when a user asks to list installable skills, install a curated skill, or install a skill from another repo (including private repos).
tools
Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Codex's capabilities with specialized knowledge, workflows, or tool integrations.
development
WebAwesome icon integration for JWebMP — modern, open-source icon library. Provides 1,500+ icons with solid/regular styles, sizing, rotation, animation, and CSS utilities. Drop-in FontAwesome alternative with fresh designs. Use when working with WebAwesome icons, modern icon designs, or as FontAwesome alternative in JWebMP applications.
development
WebAwesome Pro integration for JWebMP with premium icons and features. Extends jwebmp-webawesome with additional styles, premium icons, and advanced features. Use when working with WebAwesome Pro icons or premium WebAwesome features in JWebMP applications.