Skip to content

Angular ​

@moobitech/meridiana-angular — standalone components with signals and OnPush, for Angular 22. The context menus use @angular/cdk/menu.

ts
import { provideMeridiana } from '@moobitech/meridiana-angular';

bootstrapApplication(App, {
  providers: [provideMeridiana({ locale: 'en-GB', weekStartsOn: 1, licenseKey: '…', theme: {} })],
});
ts
import {
  MeridianaAgendaComponent,
  MeridianaMonthGridComponent,
  MeridianaTimeGridComponent,
} from '@moobitech/meridiana-angular';

@Component({
  imports: [MeridianaTimeGridComponent, MeridianaMonthGridComponent, MeridianaAgendaComponent],
  // …
})

Pass functions (isEventDisabled, eventMenu, …) as class fields with arrow functions, so that this is your component and the inputs do not change on every change detection.

<mer-time-grid> — Day, 3 days, Week ​

html
<mer-time-grid
  [events]="events()"
  [viewDate]="viewDate()"
  [days]="7"
  [responsive]="true"
  [dayStart]="{ hour: 8, minute: 0 }"
  [dayEnd]="{ hour: 20, minute: 0 }"
  [segmentsPerHour]="2"
  [draggable]="true"
  [resizable]="true"
  [validateChange]="sameDay"
  [eventMenu]="eventMenu"
  [slotMenu]="slotMenu"
  [showEventMenuButton]="true"
  [eventTemplate]="card"
  (eventClick)="open($event)"
  (slotClick)="create($event)"
  (eventChange)="save($event)"
  (visibleDaysChange)="visibleDays.set($event)"
/>

<ng-template #card let-event="event" let-timeLabel="timeLabel" let-compact="compact" let-narrow="narrow">
  <p class="font-medium">{{ event.title }}</p>
  @if (!compact && !narrow) {
    <p class="text-xs opacity-70">{{ timeLabel }}</p>
  }
</ng-template>

Inputs ​

InputDefaultNotes
events[]CalendarEvent<T>[]
viewDaterequired
days71, 3 or 7 (the week of viewDate)
weekStartsOnprovider
excludeDays[]weekdays to skip
fillExcludedDaysfalseweek: keep seven columns by borrowing the next days
startsWithTodayfalseweek: start from viewDate
dayStart, dayEnd00:00, 24:00{ hour, minute }
segmentsPerHour21, 2, 3, 4, 6 or 12
segmentHeight40pixels per segment
eventGap4pixels between touching events
overlap'cascade'or 'columns'
localeprovider
responsivefalsefewer days on narrow screens
maxHeight—CSS max-height of the scrolling grid, e.g. 70vh
showSlotTimefalsewrite the time in every slot
themeproviderslots that replace the provider theme
isSlotDisabled, isEventDisablednever
eventMenu, slotMenuno menufunctions returning CalendarMenuItem[]
showEventMenuButtonfalsethe "⋯" button on events with a menu
eventMenuButtonLabel'Actions'accessible name of the button
eventTemplate—TemplateRef<TimeGridEventContext<T>>
menuItemTemplate—TemplateRef<MenuItemContext> ($implicit: the item)
draggable, resizablefalse
snapMinutesone segment
validateChangealways valid(change) => boolean

TimeGridEventContext: $implicit (the placed event), event, timeLabel, compact (shorter than two lines), roomy (room for the description), narrow (title only), disabled.

Outputs ​

eventClick, slotClick, dayHeaderClick, eventChange (EventChange<T>), visibleDaysChange (days actually shown, also at startup).

<mer-month-grid> — Month ​

html
<mer-month-grid
  [events]="events()"
  [viewDate]="viewDate()"
  [maxEventsPerDay]="3"
  [moreLabel]="moreLabel"
  [dayMenu]="dayMenu"
  [eventMenu]="eventMenu"
  (eventClick)="open($event)"
  (dayClick)="openDay($event)"
/>
InputDefaultNotes
events, viewDate, weekStartsOn, excludeDays, locale, themeas above
fixedWeeksfalsealways six weeks
maxEventsPerDay3rows before "+N"
responsivetruecolored dots under 640px
isEventDisabled, eventMenu, dayMenu
eventTemplate—TemplateRef<MonthEventContext<T>>: $implicit (the event), timeLabel, disabled
menuItemTemplate—
moreLabeln => `+${n} more`

Outputs: eventClick, dayClick.

<mer-agenda> — Agenda ​

html
<mer-agenda
  [events]="events()"
  [viewDate]="viewDate()"
  [days]="7"
  emptyLabel="Nothing planned"
  allDayLabel="All day"
  [eventTemplate]="row"
  (eventClick)="open($event)"
  (dayClick)="openDay($event)"
/>
InputDefaultNotes
events, viewDate, excludeDays, locale, themeas above
days7days from viewDate
showEmptyDaysfalsekeep the days without events
isEventDisabled, eventMenu, menuItemTemplate
eventTemplate—the row content after time and dot: $implicit (the event), item, timeLabel, disabled
emptyLabel, allDayLabel'No events', 'All day'

Outputs: eventClick, dayClick.

Helpers ​

  • eventColorStyle(event): the CSS variables of an event's color, for your own templates.
  • MeridianaContextMenuComponent: the menu used by the views, if you open one yourself with cdkContextMenuTriggerFor.

Commercial software, free for the web with the Community plan. License agreement