"""Calendar plugin — appointments, tasks, kanban, resources, ICS feed/import, recurrence.""" from __future__ import annotations from app.plugins.base import BasePlugin from app.plugins.manifest import PluginManifest, PluginRouteDef, FrontendMenuItem, FrontendPageRoute, FrontendDetailTab class CalendarPlugin(BasePlugin): """Calendar plugin for appointment/task management with recurrence, ICS, and resource booking.""" manifest = PluginManifest( name="calendar", version="1.0.0", display_name="Calendar", description="Calendar with appointments, tasks, kanban board, recurrence, ICS export/import, resource booking, sharing.", dependencies=[], routes=[ PluginRouteDef( path="/api/v1/calendars", module="app.plugins.builtins.calendar.routes", router_attr="calendar_router", ), PluginRouteDef( path="/api/v1/resources", module="app.plugins.builtins.calendar.routes", router_attr="resource_router", ), PluginRouteDef( path="/api/v1", module="app.plugins.builtins.calendar.routes", router_attr="router", ), ], events=[], migrations=["0001_initial.sql", "0002_add_deleted_at.sql"], permissions=[ "calendar:read", "calendar:write", "calendar:delete", "calendar:share", "calendar:admin", ], menu_items=[ FrontendMenuItem(label_key='nav.calendar', label='Calendar', path='/calendar', icon='Calendar', order=20), FrontendMenuItem(label_key='nav.calendarKanban', label='Calendar Kanban', path='/calendar/kanban', icon='KanbanSquare', group='nav.calendar', order=21), ], page_routes=[ FrontendPageRoute(path='/calendar', component='@/pages/Calendar', protected=True), FrontendPageRoute(path='/calendar/kanban', component='@/pages/CalendarKanban', protected=True), ], detail_tabs=[ FrontendDetailTab(entity_type='contact', label_key='tabs.calendar', label='Calendar', component='@/components/contact/ContactCalendarTab', icon='Calendar', order=30, permission='calendar:read'), ], )