MJ Timeline Component - Displays chronological data in a rich, interactive timeline.

The timeline component supports multiple data groups, virtual scrolling for large datasets, collapsible time segments, and a comprehensive event system that allows container components to intercept and modify behavior.

Example: Basic usage

<mj-timeline [groups]="myGroups"></mj-timeline>

Example: Full configuration

<mj-timeline
[groups]="groups"
orientation="vertical"
layout="alternating"
sortOrder="desc"
segmentGrouping="month"
[segmentsCollapsible]="true"
[virtualScroll]="{ enabled: true, batchSize: 25 }"
(beforeEventClick)="onBeforeClick($event)"
(afterActionClick)="onAction($event)">

<ng-template #emptyTemplate>
<div class="custom-empty">No events found</div>
</ng-template>

</mj-timeline>

Type Parameters

  • T = any

Implements

  • OnInit
  • OnDestroy
  • AfterViewInit

Constructors

Properties

Accessors

Methods

Constructors

Properties

_allowLoad: boolean = true
_destroy$: Subject<void> = ...
_groups: TimelineGroup<T>[] = []
_hasLoaded: boolean = false
_initialized: boolean = false
_intersectionObserver?: IntersectionObserver
_layout: TimelineLayout = 'single'
_orientation: TimelineOrientation = 'vertical'
_scroll$: Subject<Event> = ...
_segmentGrouping: TimeSegmentGrouping = 'month'
_selectedEventId: null | string = null
_sortOrder: TimelineSortOrder = 'desc'
actionsTemplate?: TemplateRef<{
    actions: TimelineAction[];
    event: MJTimelineEvent<T>;
}>

Custom template for card actions. Context: { event, actions }

Type declaration

afterActionClick: EventEmitter<AfterActionClickArgs<T>> = ...

Emitted after an action button is clicked.

afterEventClick: EventEmitter<AfterEventClickArgs<T>> = ...

Emitted after an event card is clicked.

afterEventCollapse: EventEmitter<AfterEventCollapseArgs<T>> = ...

Emitted after an event card collapses.

afterEventExpand: EventEmitter<AfterEventExpandArgs<T>> = ...

Emitted after an event card expands.

afterEventHover: EventEmitter<AfterEventHoverArgs<T>> = ...

Emitted after hover state changes.

afterLoad: EventEmitter<AfterLoadArgs> = ...

Emitted after data loading completes.

afterSegmentCollapse: EventEmitter<AfterSegmentCollapseArgs> = ...

Emitted after a time segment collapses.

afterSegmentExpand: EventEmitter<AfterSegmentExpandArgs> = ...

Emitted after a time segment expands.

allEvents: MJTimelineEvent<T>[] = []

All flattened events (for non-segmented display).

ariaLabel: string = 'Timeline'

ARIA label for the timeline container.

Default

'Timeline'
beforeActionClick: EventEmitter<BeforeActionClickArgs<T>> = ...

Emitted before an action button is clicked. Set cancel = true to prevent.

beforeEventClick: EventEmitter<BeforeEventClickArgs<T>> = ...

Emitted before an event card is clicked. Set cancel = true to prevent.

beforeEventCollapse: EventEmitter<BeforeEventCollapseArgs<T>> = ...

Emitted before an event card collapses. Set cancel = true to prevent.

beforeEventExpand: EventEmitter<BeforeEventExpandArgs<T>> = ...

Emitted before an event card expands. Set cancel = true to prevent.

beforeEventHover: EventEmitter<BeforeEventHoverArgs<T>> = ...

Emitted before hover state changes. Set cancel = true to prevent.

beforeLoad: EventEmitter<BeforeLoadArgs> = ...

Emitted before data loading begins. Set cancel = true to prevent.

beforeSegmentCollapse: EventEmitter<BeforeSegmentCollapseArgs> = ...

Emitted before a time segment collapses. Set cancel = true to prevent.

beforeSegmentExpand: EventEmitter<BeforeSegmentExpandArgs> = ...

Emitted before a time segment expands. Set cancel = true to prevent.

bodyTemplate?: TemplateRef<{
    event: MJTimelineEvent<T>;
}>

Custom template for card body. Context: { event }

Type declaration

cardTemplate?: TemplateRef<{
    event: MJTimelineEvent<T>;
    group: TimelineGroup<T>;
}>

Custom template for entire card. Context: { event, group }

Type declaration

cdr: ChangeDetectorRef
defaultCardConfig: TimelineCardConfig = ...

Default card configuration applied to all groups. Individual groups can override these settings.

elementRef: ElementRef<any>
emptyIcon: string = 'fa-regular fa-calendar-xmark'

Icon shown with empty message.

Default

'fa-regular fa-calendar-xmark'
emptyMessage: string = 'No events to display'

Message shown when no events exist.

Default

'No events to display'
emptyTemplate?: TemplateRef<void>

Custom template for empty state.

enableKeyboardNavigation: boolean = true

Enable keyboard navigation.

Default

true
focusedEventIndex: number = -1

Index of currently focused event (for keyboard navigation).

headerTemplate?: TemplateRef<{
    event: MJTimelineEvent<T>;
}>

Custom template for card header. Context: { event }

Type declaration

isInitialized: boolean = false

Whether initial load is complete.

isLoading: boolean = false

Whether currently loading data.

loadingMessage: string = 'Loading timeline...'

Message shown while loading.

Default

'Loading timeline...'
loadingTemplate?: TemplateRef<void>

Custom template for loading state.

ngZone: NgZone
scrollContainer?: ElementRef<HTMLElement>
scrollState: VirtualScrollState = ...

Virtual scroll state.

segmentHeaderTemplate?: TemplateRef<{
    segment: TimelineSegment;
}>

Custom template for segment header. Context: { segment }

Type declaration

segments: TimelineSegment[] = []

Current time segments with events.

segmentsCollapsible: boolean = true

Whether time segments can be collapsed.

Default

true
segmentsDefaultExpanded: boolean = true

Whether segments start expanded.

Default

true
virtualScroll: VirtualScrollConfig = ...

Virtual scrolling configuration.

Accessors

Methods

  • Simple date formatter (replaces Angular DatePipe for standalone use). Uses placeholder tokens to avoid replacement conflicts.

    Parameters

    • date: Date
    • format: string

    Returns string

  • Gets segment information for a date.

    Parameters

    • date: Date

    Returns {
        endDate: Date;
        label: string;
        startDate: Date;
    }

    • endDate: Date
    • label: string
    • startDate: Date
  • Checks if an event is currently selected/focused. An event is selected if either:

    • Its ID matches the selectedEventId input
    • Its global index matches the focusedEventIndex (keyboard navigation)

    Parameters

    Returns boolean

  • Refreshes all data from the configured groups. Clears existing data and reloads from sources.

    Parameters

    • force: boolean = false

    Returns Promise<void>