@memberjunction/ng-timeline 5.38.0 → 5.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -59,6 +59,8 @@ export declare class TimelineComponent<T = any> implements OnInit, OnDestroy, Af
|
|
|
59
59
|
get groups(): TimelineGroup<T>[];
|
|
60
60
|
set groups(value: TimelineGroup<T>[]);
|
|
61
61
|
private _groups;
|
|
62
|
+
/** True once ngAfterViewInit has run — the view is ready to render refreshed events. */
|
|
63
|
+
private _viewReady;
|
|
62
64
|
/**
|
|
63
65
|
* Check if timeline groups have meaningfully changed
|
|
64
66
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeline.component.d.ts","sourceRoot":"","sources":["../../../src/lib/component/timeline.component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAIL,YAAY,EACZ,MAAM,EACN,SAAS,EACT,aAAa,EACb,UAAU,EAGV,WAAW,EACX,iBAAiB,EAGjB,MAAM,EACP,MAAM,eAAe,CAAC;AAKvB,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAElB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,cAAc,EACd,oBAAoB,EAIrB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,aAAa,EAAiB,MAAM,mBAAmB,CAAC;AAEjE,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,EACtB,yBAAyB,EACzB,wBAAwB,EACxB,cAAc,EACd,aAAa,EACd,MAAM,WAAW,CAAC;;AA+BnB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,qBAQa,iBAAiB,CAAC,CAAC,GAAG,GAAG,CAAE,YAAW,MAAM,EAAE,SAAS,EAAE,aAAa;
|
|
1
|
+
{"version":3,"file":"timeline.component.d.ts","sourceRoot":"","sources":["../../../src/lib/component/timeline.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -648,7 +648,13 @@ export class TimelineComponent {
|
|
|
648
648
|
const hasGroups = this._groups.length > 0;
|
|
649
649
|
// Check if groups actually changed (different date field, label, or data)
|
|
650
650
|
const groupsChanged = this.didGroupsChange(prevGroups, this._groups);
|
|
651
|
-
|
|
651
|
+
// Defer the FIRST load until the view is ready (ngAfterViewInit). When this component is
|
|
652
|
+
// dynamic-mounted, the host sets `groups` via setInput BEFORE the view initializes; running the
|
|
653
|
+
// first refresh here would render nothing (ViewChildren/DOM not ready) yet still set `_hasLoaded`,
|
|
654
|
+
// so ngAfterViewInit's real refresh would be skipped and the timeline would show "No events"
|
|
655
|
+
// until something forced a re-refresh (e.g. changing the date field). Only refresh from the setter
|
|
656
|
+
// once the view is ready.
|
|
657
|
+
if (this.allowLoad && hasGroups && this._viewReady) {
|
|
652
658
|
if (!this._hasLoaded) {
|
|
653
659
|
// First load
|
|
654
660
|
this.refresh();
|
|
@@ -660,6 +666,8 @@ export class TimelineComponent {
|
|
|
660
666
|
}
|
|
661
667
|
}
|
|
662
668
|
_groups = [];
|
|
669
|
+
/** True once ngAfterViewInit has run — the view is ready to render refreshed events. */
|
|
670
|
+
_viewReady = false;
|
|
663
671
|
/**
|
|
664
672
|
* Check if timeline groups have meaningfully changed
|
|
665
673
|
*/
|
|
@@ -942,7 +950,10 @@ export class TimelineComponent {
|
|
|
942
950
|
.subscribe(() => this.onScrollCheck());
|
|
943
951
|
}
|
|
944
952
|
ngAfterViewInit() {
|
|
945
|
-
|
|
953
|
+
// The view is now ready — first loads triggered by the `groups`/`allowLoad` setters were deferred
|
|
954
|
+
// to here so refreshed events actually render (see the `groups` setter).
|
|
955
|
+
this._viewReady = true;
|
|
956
|
+
if (this.allowLoad && !this._hasLoaded && this._groups.length > 0) {
|
|
946
957
|
this.refresh();
|
|
947
958
|
}
|
|
948
959
|
// Set up intersection observer for virtual scroll trigger
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeline.component.js","sourceRoot":"","sources":["../../../src/lib/component/timeline.component.ts","../../../src/lib/component/timeline.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview MJ Timeline Component - A flexible, responsive timeline for Angular.\n *\n * This component displays chronological data in a timeline format with support for:\n * - Multiple data sources (MemberJunction entities or plain objects)\n * - Virtual scrolling for large datasets\n * - Collapsible time segments\n * - Rich event system with BeforeX/AfterX pattern\n * - Full keyboard navigation and accessibility\n * - Responsive design for all screen sizes\n *\n * @module @memberjunction/ng-timeline\n */\n\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n AfterViewInit,\n ElementRef,\n ViewChild,\n ContentChild,\n TemplateRef,\n ChangeDetectorRef,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n NgZone\n} from '@angular/core';\n\nimport { Subject } from 'rxjs';\nimport { takeUntil, debounceTime } from 'rxjs/operators';\n\nimport {\n TimelineOrientation,\n TimelineLayout,\n TimelineSortOrder,\n TimeSegmentGrouping,\n TimelineCardConfig,\n TimelineEventConfig,\n VirtualScrollConfig,\n VirtualScrollState,\n MJTimelineEvent,\n TimelineSegment,\n TimelineAction,\n TimelineDisplayField,\n DEFAULT_CARD_CONFIG,\n DEFAULT_VIRTUAL_SCROLL_CONFIG,\n DEFAULT_VIRTUAL_SCROLL_STATE\n} from '../types';\n\nimport { TimelineGroup, getFieldValue } from '../timeline-group';\n\nimport {\n BeforeEventClickArgs,\n AfterEventClickArgs,\n BeforeEventExpandArgs,\n AfterEventExpandArgs,\n BeforeEventCollapseArgs,\n AfterEventCollapseArgs,\n BeforeEventHoverArgs,\n AfterEventHoverArgs,\n BeforeActionClickArgs,\n AfterActionClickArgs,\n BeforeSegmentExpandArgs,\n AfterSegmentExpandArgs,\n BeforeSegmentCollapseArgs,\n AfterSegmentCollapseArgs,\n BeforeLoadArgs,\n AfterLoadArgs\n} from '../events';\n\n// ============================================================================\n// AUTO-ASSIGNED COLORS FOR GROUPS\n// ============================================================================\n\nconst AUTO_COLORS = [\n '#1976d2', // Blue\n '#388e3c', // Green\n '#f57c00', // Orange\n '#7b1fa2', // Purple\n '#c2185b', // Pink\n '#00796b', // Teal\n '#5d4037', // Brown\n '#455a64', // Blue Grey\n '#d32f2f', // Red\n '#0097a7' // Cyan\n];\n\nconst DEFAULT_ICONS = [\n 'fa-solid fa-circle',\n 'fa-solid fa-square',\n 'fa-solid fa-diamond',\n 'fa-solid fa-star',\n 'fa-solid fa-heart'\n];\n\n// ============================================================================\n// TIMELINE COMPONENT\n// ============================================================================\n\n/**\n * MJ Timeline Component - Displays chronological data in a rich, interactive timeline.\n *\n * The timeline component supports multiple data groups, virtual scrolling for large\n * datasets, collapsible time segments, and a comprehensive event system that allows\n * container components to intercept and modify behavior.\n *\n * @example Basic usage\n * ```html\n * <mj-timeline [groups]=\"myGroups\"></mj-timeline>\n * ```\n *\n * @example Full configuration\n * ```html\n * <mj-timeline\n * [groups]=\"groups\"\n * orientation=\"vertical\"\n * layout=\"alternating\"\n * sortOrder=\"desc\"\n * segmentGrouping=\"month\"\n * [segmentsCollapsible]=\"true\"\n * [virtualScroll]=\"{ enabled: true, batchSize: 25 }\"\n * (beforeEventClick)=\"onBeforeClick($event)\"\n * (afterActionClick)=\"onAction($event)\">\n *\n * <ng-template #emptyTemplate>\n * <div class=\"custom-empty\">No events found</div>\n * </ng-template>\n *\n * </mj-timeline>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-timeline',\n templateUrl: './timeline.component.html',\n styleUrls: ['./timeline.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class TimelineComponent<T = any> implements OnInit, OnDestroy, AfterViewInit {\n // ============================================================================\n // INPUTS - DATA\n // ============================================================================\n\n /**\n * Array of timeline groups to display.\n * Each group defines a data source and display configuration.\n */\n @Input()\n get groups(): TimelineGroup<T>[] {\n return this._groups;\n }\n set groups(value: TimelineGroup<T>[]) {\n const prevGroups = this._groups;\n this._groups = value || [];\n const hasGroups = this._groups.length > 0;\n\n // Check if groups actually changed (different date field, label, or data)\n const groupsChanged = this.didGroupsChange(prevGroups, this._groups);\n\n if (this.allowLoad && hasGroups) {\n if (!this._hasLoaded) {\n // First load\n this.refresh();\n } else if (groupsChanged) {\n // Groups changed after initial load - force refresh\n this.refresh(true);\n }\n }\n }\n private _groups: TimelineGroup<T>[] = [];\n\n /**\n * Check if timeline groups have meaningfully changed\n */\n private didGroupsChange(prev: TimelineGroup<T>[], next: TimelineGroup<T>[]): boolean {\n if (prev.length !== next.length) return true;\n for (let i = 0; i < prev.length; i++) {\n const p = prev[i];\n const n = next[i];\n if (p.DateFieldName !== n.DateFieldName ||\n p.GroupLabel !== n.GroupLabel ||\n p.EntityObjects !== n.EntityObjects) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Controls whether data loading is allowed.\n * Set to false to defer loading until ready.\n * @default true\n */\n @Input()\n get allowLoad(): boolean {\n return this._allowLoad;\n }\n set allowLoad(value: boolean) {\n const wasDisabled = !this._allowLoad;\n this._allowLoad = value;\n // When allowLoad becomes true and we have groups, trigger refresh\n if (value && wasDisabled && this._groups.length > 0) {\n this.refresh(this._hasLoaded);\n }\n }\n private _allowLoad = true;\n\n // ============================================================================\n // INPUTS - LAYOUT (using setters for reactive updates)\n // ============================================================================\n\n /**\n * Timeline orientation.\n * - `vertical`: Events displayed top-to-bottom\n * - `horizontal`: Events displayed left-to-right\n * @default 'vertical'\n */\n @Input()\n get orientation(): TimelineOrientation {\n return this._orientation;\n }\n set orientation(value: TimelineOrientation) {\n if (this._orientation !== value) {\n this._orientation = value;\n this.cdr.markForCheck();\n }\n }\n private _orientation: TimelineOrientation = 'vertical';\n\n /**\n * Layout mode for vertical timeline.\n * - `single`: All cards on one side\n * - `alternating`: Cards alternate sides\n * @default 'single'\n */\n @Input()\n get layout(): TimelineLayout {\n return this._layout;\n }\n set layout(value: TimelineLayout) {\n if (this._layout !== value) {\n this._layout = value;\n this.cdr.markForCheck();\n }\n }\n private _layout: TimelineLayout = 'single';\n\n /**\n * Sort order for events.\n * - `desc`: Newest first\n * - `asc`: Oldest first\n * @default 'desc'\n */\n @Input()\n get sortOrder(): TimelineSortOrder {\n return this._sortOrder;\n }\n set sortOrder(value: TimelineSortOrder) {\n if (this._sortOrder !== value) {\n this._sortOrder = value;\n // Re-process events when sort order changes - force refresh since data already loaded\n if (this._initialized) {\n this.refresh(true);\n }\n this.cdr.markForCheck();\n }\n }\n private _sortOrder: TimelineSortOrder = 'desc';\n\n /**\n * How to group events into time segments.\n * @default 'month'\n */\n @Input()\n get segmentGrouping(): TimeSegmentGrouping {\n return this._segmentGrouping;\n }\n set segmentGrouping(value: TimeSegmentGrouping) {\n if (this._segmentGrouping !== value) {\n this._segmentGrouping = value;\n // Re-segment events when grouping changes - force refresh since data already loaded\n if (this._initialized) {\n this.refresh(true);\n }\n this.cdr.markForCheck();\n }\n }\n private _segmentGrouping: TimeSegmentGrouping = 'month';\n\n // ============================================================================\n // INPUTS - CARD DEFAULTS\n // ============================================================================\n\n /**\n * Default card configuration applied to all groups.\n * Individual groups can override these settings.\n */\n @Input() defaultCardConfig: TimelineCardConfig = { ...DEFAULT_CARD_CONFIG };\n\n // ============================================================================\n // INPUTS - VIRTUAL SCROLLING\n // ============================================================================\n\n /**\n * Virtual scrolling configuration.\n */\n @Input() virtualScroll: VirtualScrollConfig = { ...DEFAULT_VIRTUAL_SCROLL_CONFIG };\n\n // ============================================================================\n // INPUTS - SEGMENTS\n // ============================================================================\n\n /**\n * Whether time segments can be collapsed.\n * @default true\n */\n @Input() segmentsCollapsible = true;\n\n /**\n * Whether segments start expanded.\n * @default true\n */\n @Input() segmentsDefaultExpanded = true;\n\n // ============================================================================\n // INPUTS - EMPTY & LOADING STATES\n // ============================================================================\n\n /**\n * Message shown when no events exist.\n * @default 'No events to display'\n */\n @Input() emptyMessage = 'No events to display';\n\n /**\n * Icon shown with empty message.\n * @default 'fa-regular fa-calendar-xmark'\n */\n @Input() emptyIcon = 'fa-regular fa-calendar-xmark';\n\n /**\n * Message shown while loading.\n * @default 'Loading timeline...'\n */\n @Input() loadingMessage = 'Loading timeline...';\n\n // ============================================================================\n // INPUTS - ACCESSIBILITY\n // ============================================================================\n\n /**\n * ARIA label for the timeline container.\n * @default 'Timeline'\n */\n @Input() ariaLabel = 'Timeline';\n\n /**\n * Enable keyboard navigation.\n * @default true\n */\n @Input() enableKeyboardNavigation = true;\n\n /**\n * ID of the currently selected event.\n * When set, the corresponding event will be highlighted with the focused style.\n */\n @Input()\n get selectedEventId(): string | null {\n return this._selectedEventId;\n }\n set selectedEventId(value: string | null) {\n const changed = this._selectedEventId !== value;\n this._selectedEventId = value;\n if (changed) {\n this.cdr.markForCheck();\n }\n }\n private _selectedEventId: string | null = null;\n\n // ============================================================================\n // OUTPUTS - BEFORE EVENTS (with cancel support)\n // ============================================================================\n\n /** Emitted before an event card is clicked. Set `cancel = true` to prevent. */\n @Output() beforeEventClick = new EventEmitter<BeforeEventClickArgs<T>>();\n\n /** Emitted before an event card expands. Set `cancel = true` to prevent. */\n @Output() beforeEventExpand = new EventEmitter<BeforeEventExpandArgs<T>>();\n\n /** Emitted before an event card collapses. Set `cancel = true` to prevent. */\n @Output() beforeEventCollapse = new EventEmitter<BeforeEventCollapseArgs<T>>();\n\n /** Emitted before hover state changes. Set `cancel = true` to prevent. */\n @Output() beforeEventHover = new EventEmitter<BeforeEventHoverArgs<T>>();\n\n /** Emitted before an action button is clicked. Set `cancel = true` to prevent. */\n @Output() beforeActionClick = new EventEmitter<BeforeActionClickArgs<T>>();\n\n /** Emitted before a time segment expands. Set `cancel = true` to prevent. */\n @Output() beforeSegmentExpand = new EventEmitter<BeforeSegmentExpandArgs>();\n\n /** Emitted before a time segment collapses. Set `cancel = true` to prevent. */\n @Output() beforeSegmentCollapse = new EventEmitter<BeforeSegmentCollapseArgs>();\n\n /** Emitted before data loading begins. Set `cancel = true` to prevent. */\n @Output() beforeLoad = new EventEmitter<BeforeLoadArgs>();\n\n // ============================================================================\n // OUTPUTS - AFTER EVENTS\n // ============================================================================\n\n /** Emitted after an event card is clicked. */\n @Output() afterEventClick = new EventEmitter<AfterEventClickArgs<T>>();\n\n /** Emitted after an event card expands. */\n @Output() afterEventExpand = new EventEmitter<AfterEventExpandArgs<T>>();\n\n /** Emitted after an event card collapses. */\n @Output() afterEventCollapse = new EventEmitter<AfterEventCollapseArgs<T>>();\n\n /** Emitted after hover state changes. */\n @Output() afterEventHover = new EventEmitter<AfterEventHoverArgs<T>>();\n\n /** Emitted after an action button is clicked. */\n @Output() afterActionClick = new EventEmitter<AfterActionClickArgs<T>>();\n\n /** Emitted after a time segment expands. */\n @Output() afterSegmentExpand = new EventEmitter<AfterSegmentExpandArgs>();\n\n /** Emitted after a time segment collapses. */\n @Output() afterSegmentCollapse = new EventEmitter<AfterSegmentCollapseArgs>();\n\n /** Emitted after data loading completes. */\n @Output() afterLoad = new EventEmitter<AfterLoadArgs>();\n\n // ============================================================================\n // CONTENT CHILDREN - OPTIONAL TEMPLATES\n // ============================================================================\n\n /** Custom template for entire card. Context: { event, group } */\n @ContentChild('cardTemplate') cardTemplate?: TemplateRef<{ event: MJTimelineEvent<T>; group: TimelineGroup<T> }>;\n\n /** Custom template for card header. Context: { event } */\n @ContentChild('headerTemplate') headerTemplate?: TemplateRef<{ event: MJTimelineEvent<T> }>;\n\n /** Custom template for card body. Context: { event } */\n @ContentChild('bodyTemplate') bodyTemplate?: TemplateRef<{ event: MJTimelineEvent<T> }>;\n\n /** Custom template for card actions. Context: { event, actions } */\n @ContentChild('actionsTemplate') actionsTemplate?: TemplateRef<{ event: MJTimelineEvent<T>; actions: TimelineAction[] }>;\n\n /** Custom template for segment header. Context: { segment } */\n @ContentChild('segmentHeaderTemplate') segmentHeaderTemplate?: TemplateRef<{ segment: TimelineSegment }>;\n\n /** Custom template for empty state. */\n @ContentChild('emptyTemplate') emptyTemplate?: TemplateRef<void>;\n\n /** Custom template for loading state. */\n @ContentChild('loadingTemplate') loadingTemplate?: TemplateRef<void>;\n\n // ============================================================================\n // VIEW CHILDREN\n // ============================================================================\n\n @ViewChild('scrollContainer') scrollContainer?: ElementRef<HTMLElement>;\n\n // ============================================================================\n // PUBLIC PROPERTIES\n // ============================================================================\n\n /** Current time segments with events. */\n segments: TimelineSegment[] = [];\n\n /** All flattened events (for non-segmented display). */\n allEvents: MJTimelineEvent<T>[] = [];\n\n /** Virtual scroll state. */\n scrollState: VirtualScrollState = { ...DEFAULT_VIRTUAL_SCROLL_STATE };\n\n /** Whether initial load is complete. */\n isInitialized = false;\n\n /** Whether currently loading data. */\n isLoading = false;\n\n /** Index of currently focused event (for keyboard navigation). */\n focusedEventIndex = -1;\n\n // ============================================================================\n // PRIVATE PROPERTIES\n // ============================================================================\n\n private _initialized = false;\n private _hasLoaded = false;\n private _destroy$ = new Subject<void>();\n private _scroll$ = new Subject<Event>();\n private _intersectionObserver?: IntersectionObserver;\n\n // ============================================================================\n // CONSTRUCTOR\n // ============================================================================\n\n constructor(\n private cdr: ChangeDetectorRef,\n private elementRef: ElementRef,\n private ngZone: NgZone\n ) {}\n\n // ============================================================================\n // LIFECYCLE HOOKS\n // ============================================================================\n\n ngOnInit(): void {\n this._initialized = true;\n\n // Set up scroll listener for virtual scrolling\n this._scroll$\n .pipe(\n debounceTime(100),\n takeUntil(this._destroy$)\n )\n .subscribe(() => this.onScrollCheck());\n }\n\n ngAfterViewInit(): void {\n if (this.allowLoad && !this._hasLoaded) {\n this.refresh();\n }\n\n // Set up intersection observer for virtual scroll trigger\n this.setupIntersectionObserver();\n }\n\n ngOnDestroy(): void {\n this._destroy$.next();\n this._destroy$.complete();\n\n if (this._intersectionObserver) {\n this._intersectionObserver.disconnect();\n }\n }\n\n // ============================================================================\n // PUBLIC METHODS\n // ============================================================================\n\n /**\n * Refreshes all data from the configured groups.\n * Clears existing data and reloads from sources.\n */\n async refresh(force: boolean = false): Promise<void> {\n // Prevent concurrent refresh calls - if already refreshing, exit immediately\n if (this.isLoading || (this._hasLoaded && !force)) {\n return;\n }\n\n const startTime = Date.now();\n\n // Emit before event\n const beforeArgs: BeforeLoadArgs = {\n cancel: false,\n groups: this._groups,\n isIncremental: false\n };\n this.beforeLoad.emit(beforeArgs);\n\n if (beforeArgs.cancel) {\n return;\n }\n\n this.isLoading = true;\n this.cdr.markForCheck();\n\n try {\n // Clear existing data\n this.allEvents = [];\n this.segments = [];\n this.scrollState = { ...DEFAULT_VIRTUAL_SCROLL_STATE };\n\n // Load data from all groups\n await this.loadAllGroups();\n\n // Group into segments\n this.buildSegments();\n\n this._hasLoaded = true;\n this.isInitialized = true;\n\n // Emit after event\n const afterArgs: AfterLoadArgs = {\n success: true,\n eventsLoaded: this.allEvents.length,\n totalEvents: this.allEvents.length,\n loadTimeMs: Date.now() - startTime,\n hasMore: this.scrollState.hasMore\n };\n this.afterLoad.emit(afterArgs);\n } catch (error) {\n console.error('Timeline: Error loading data', error);\n\n const afterArgs: AfterLoadArgs = {\n success: false,\n errorMessage: error instanceof Error ? error.message : 'Unknown error',\n eventsLoaded: 0,\n totalEvents: 0,\n loadTimeMs: Date.now() - startTime,\n hasMore: false\n };\n this.afterLoad.emit(afterArgs);\n } finally {\n this.isLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Loads more events (for virtual scrolling).\n */\n async loadMore(): Promise<void> {\n if (!this.virtualScroll.enabled || this.scrollState.isLoading || !this.scrollState.hasMore) {\n return;\n }\n\n const startTime = Date.now();\n\n // Emit before event\n const beforeArgs: BeforeLoadArgs = {\n cancel: false,\n groups: this._groups,\n isIncremental: true,\n offset: this.scrollState.loadedCount,\n batchSize: this.virtualScroll.batchSize\n };\n this.beforeLoad.emit(beforeArgs);\n\n if (beforeArgs.cancel) {\n return;\n }\n\n this.scrollState.isLoading = true;\n this.cdr.markForCheck();\n\n try {\n const previousCount = this.allEvents.length;\n\n // Load next batch from all groups\n await this.loadNextBatch();\n\n // Rebuild segments with new data\n this.buildSegments();\n\n const newCount = this.allEvents.length - previousCount;\n\n // Emit after event\n const afterArgs: AfterLoadArgs = {\n success: true,\n eventsLoaded: newCount,\n totalEvents: this.allEvents.length,\n loadTimeMs: Date.now() - startTime,\n hasMore: this.scrollState.hasMore\n };\n this.afterLoad.emit(afterArgs);\n } catch (error) {\n console.error('Timeline: Error loading more data', error);\n } finally {\n this.scrollState.isLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Expands all event cards.\n */\n expandAllEvents(): void {\n for (const event of this.allEvents) {\n if (!event.isExpanded) {\n this.setEventExpanded(event, true);\n }\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Collapses all event cards.\n */\n collapseAllEvents(): void {\n for (const event of this.allEvents) {\n if (event.isExpanded) {\n this.setEventExpanded(event, false);\n }\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Expands all time segments.\n */\n expandAllSegments(): void {\n for (const segment of this.segments) {\n if (!segment.isExpanded) {\n this.setSegmentExpanded(segment, true);\n }\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Collapses all time segments.\n */\n collapseAllSegments(): void {\n for (const segment of this.segments) {\n if (segment.isExpanded) {\n this.setSegmentExpanded(segment, false);\n }\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Expands a specific event by ID.\n */\n expandEvent(eventId: string): void {\n const event = this.getEvent(eventId);\n if (event && !event.isExpanded) {\n this.setEventExpanded(event, true);\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Collapses a specific event by ID.\n */\n collapseEvent(eventId: string): void {\n const event = this.getEvent(eventId);\n if (event && event.isExpanded) {\n this.setEventExpanded(event, false);\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Scrolls to a specific event.\n */\n scrollToEvent(eventId: string, behavior: ScrollBehavior = 'smooth'): void {\n const element = this.elementRef.nativeElement.querySelector(`[data-event-id=\"${eventId}\"]`);\n if (element) {\n element.scrollIntoView({ behavior, block: 'center' });\n }\n }\n\n /**\n * Scrolls to a specific date.\n */\n scrollToDate(date: Date, behavior: ScrollBehavior = 'smooth'): void {\n // Find the segment containing this date\n const segment = this.segments.find(s =>\n date >= s.startDate && date < s.endDate\n );\n\n if (segment) {\n const element = this.elementRef.nativeElement.querySelector(\n `[data-segment-label=\"${segment.label}\"]`\n );\n if (element) {\n element.scrollIntoView({ behavior, block: 'start' });\n }\n }\n }\n\n /**\n * Gets an event by ID.\n */\n getEvent(eventId: string): MJTimelineEvent<T> | undefined {\n return this.allEvents.find(e => e.id === eventId);\n }\n\n /**\n * Gets all events (flattened).\n */\n getAllEvents(): MJTimelineEvent<T>[] {\n return [...this.allEvents];\n }\n\n // ============================================================================\n // EVENT HANDLERS (Template bindings)\n // ============================================================================\n\n /**\n * Handles click on an event card.\n */\n onEventClick(event: MJTimelineEvent<T>, index: number, domEvent: Event): void {\n const group = this._groups[event.groupIndex];\n\n // Emit before event\n const beforeArgs: BeforeEventClickArgs<T> = {\n cancel: false,\n event,\n group,\n index,\n domEvent\n };\n this.beforeEventClick.emit(beforeArgs);\n\n if (beforeArgs.cancel) {\n return;\n }\n\n // Default behavior: toggle expand/collapse if collapsible\n const cardConfig = this.getEffectiveCardConfig(event);\n if (cardConfig.collapsible) {\n this.toggleEventExpanded(event, index, domEvent);\n }\n\n // Emit after event\n const afterArgs: AfterEventClickArgs<T> = {\n success: true,\n event,\n group,\n index,\n domEvent\n };\n this.afterEventClick.emit(afterArgs);\n }\n\n /**\n * Handles expand/collapse toggle on an event.\n */\n onToggleExpand(event: MJTimelineEvent<T>, index: number, domEvent: Event): void {\n domEvent.stopPropagation();\n this.toggleEventExpanded(event, index, domEvent);\n }\n\n /**\n * Handles mouse enter on an event card.\n */\n onEventMouseEnter(event: MJTimelineEvent<T>, index: number, domEvent: Event): void {\n const group = this._groups[event.groupIndex];\n\n const beforeArgs: BeforeEventHoverArgs<T> = {\n cancel: false,\n event,\n group,\n index,\n domEvent,\n hoverState: 'enter'\n };\n this.beforeEventHover.emit(beforeArgs);\n\n if (!beforeArgs.cancel) {\n const afterArgs: AfterEventHoverArgs<T> = {\n success: true,\n event,\n group,\n index,\n domEvent,\n hoverState: 'enter'\n };\n this.afterEventHover.emit(afterArgs);\n }\n }\n\n /**\n * Handles mouse leave on an event card.\n */\n onEventMouseLeave(event: MJTimelineEvent<T>, index: number, domEvent: Event): void {\n const group = this._groups[event.groupIndex];\n\n const beforeArgs: BeforeEventHoverArgs<T> = {\n cancel: false,\n event,\n group,\n index,\n domEvent,\n hoverState: 'leave'\n };\n this.beforeEventHover.emit(beforeArgs);\n\n if (!beforeArgs.cancel) {\n const afterArgs: AfterEventHoverArgs<T> = {\n success: true,\n event,\n group,\n index,\n domEvent,\n hoverState: 'leave'\n };\n this.afterEventHover.emit(afterArgs);\n }\n }\n\n /**\n * Handles action button click.\n */\n onActionClick(event: MJTimelineEvent<T>, action: TimelineAction, index: number, domEvent: Event): void {\n domEvent.stopPropagation();\n\n if (action.disabled) {\n return;\n }\n\n const group = this._groups[event.groupIndex];\n\n const beforeArgs: BeforeActionClickArgs<T> = {\n cancel: false,\n event,\n group,\n index,\n domEvent,\n action\n };\n this.beforeActionClick.emit(beforeArgs);\n\n if (!beforeArgs.cancel) {\n const afterArgs: AfterActionClickArgs<T> = {\n success: true,\n event,\n group,\n index,\n domEvent,\n action\n };\n this.afterActionClick.emit(afterArgs);\n }\n }\n\n /**\n * Handles segment header click.\n */\n onSegmentClick(segment: TimelineSegment): void {\n if (!this.segmentsCollapsible) {\n return;\n }\n\n if (segment.isExpanded) {\n this.collapseSegment(segment);\n } else {\n this.expandSegment(segment);\n }\n }\n\n /**\n * Handles scroll events for virtual scrolling.\n */\n onScroll(event: Event): void {\n this._scroll$.next(event);\n }\n\n /**\n * Handles keyboard navigation.\n */\n onKeyDown(event: KeyboardEvent): void {\n if (!this.enableKeyboardNavigation) {\n return;\n }\n\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowRight':\n event.preventDefault();\n this.focusNextEvent();\n break;\n\n case 'ArrowUp':\n case 'ArrowLeft':\n event.preventDefault();\n this.focusPreviousEvent();\n break;\n\n case 'Enter':\n case ' ':\n event.preventDefault();\n this.activateFocusedEvent();\n break;\n\n case 'Escape':\n event.preventDefault();\n this.collapseFocusedEvent();\n break;\n\n case 'Home':\n event.preventDefault();\n this.focusFirstEvent();\n break;\n\n case 'End':\n event.preventDefault();\n this.focusLastEvent();\n break;\n }\n }\n\n // ============================================================================\n // TEMPLATE HELPERS\n // ============================================================================\n\n /**\n * Gets the effective card config for an event.\n */\n getEffectiveCardConfig(event: MJTimelineEvent<T>): TimelineCardConfig {\n const group = this._groups[event.groupIndex];\n return {\n ...this.defaultCardConfig,\n ...group?.CardConfig,\n ...this.mapEventConfigToCardConfig(event.config)\n };\n }\n\n /**\n * Gets the color for a group/event.\n */\n getColor(event: MJTimelineEvent<T>): string {\n if (event.config?.color) {\n return event.config.color;\n }\n\n const group = this._groups[event.groupIndex];\n if (group?.DisplayColorMode === 'manual' && group.DisplayColor) {\n return group.DisplayColor;\n }\n\n return AUTO_COLORS[event.groupIndex % AUTO_COLORS.length];\n }\n\n /**\n * Gets the icon for a group/event.\n */\n getIcon(event: MJTimelineEvent<T>): string {\n if (event.config?.icon) {\n return event.config.icon;\n }\n\n const group = this._groups[event.groupIndex];\n if (group?.DisplayIconMode === 'custom' && group.DisplayIcon) {\n return group.DisplayIcon;\n }\n\n return DEFAULT_ICONS[event.groupIndex % DEFAULT_ICONS.length];\n }\n\n /**\n * Gets the actions for an event.\n */\n getActions(event: MJTimelineEvent<T>): TimelineAction[] {\n if (event.config?.actions) {\n return event.config.actions;\n }\n\n const cardConfig = this.getEffectiveCardConfig(event);\n return cardConfig.actions || [];\n }\n\n /**\n * Formats a date for display.\n */\n formatDate(date: Date, format?: string): string {\n const fmt = format || this.defaultCardConfig.dateFormat || 'MMM d, yyyy';\n return this.formatDateInternal(date, fmt);\n }\n\n /**\n * Gets the value of a display field from an event.\n */\n getFieldValue(event: MJTimelineEvent<T>, field: TimelineDisplayField): string {\n const value = getFieldValue(event.entity, field.fieldName);\n\n if (field.formatter) {\n return field.formatter(value);\n }\n\n if (value == null) {\n return '';\n }\n\n if (field.format && value instanceof Date) {\n return this.formatDateInternal(value, field.format);\n }\n\n return String(value);\n }\n\n /**\n * Track by function for ngFor.\n */\n trackByEventId(_index: number, event: MJTimelineEvent<T>): string {\n return event.id;\n }\n\n /**\n * Track by function for segments.\n */\n trackBySegmentLabel(_index: number, segment: TimelineSegment): string {\n return segment.label;\n }\n\n /**\n * Gets the global index of an event in the allEvents array.\n */\n getGlobalIndex(event: MJTimelineEvent<T>): number {\n return this.allEvents.indexOf(event);\n }\n\n /**\n * Checks if an event is currently selected/focused.\n * An event is selected if either:\n * - Its ID matches the selectedEventId input\n * - Its global index matches the focusedEventIndex (keyboard navigation)\n */\n isEventSelected(event: MJTimelineEvent<T>, globalIndex: number): boolean {\n // Check selectedEventId from parent first (takes priority)\n if (this.selectedEventId && event.id === this.selectedEventId) {\n return true;\n }\n // Fall back to keyboard navigation focus\n return this.focusedEventIndex === globalIndex;\n }\n\n // ============================================================================\n // PRIVATE METHODS - DATA LOADING\n // ============================================================================\n\n /**\n * Loads data from all groups.\n */\n private async loadAllGroups(): Promise<void> {\n for (let groupIndex = 0; groupIndex < this._groups.length; groupIndex++) {\n const group = this._groups[groupIndex];\n await this.loadGroup(group, groupIndex);\n }\n\n // Sort all events by date\n this.sortEvents();\n\n // Update scroll state\n this.scrollState.loadedCount = this.allEvents.length;\n this.scrollState.hasMore = false; // TODO: Implement proper pagination detection\n }\n\n /**\n * Loads data from a single group.\n */\n private async loadGroup(group: TimelineGroup<T>, groupIndex: number): Promise<void> {\n let records: T[] = [];\n\n if (group.DataSourceType === 'array') {\n records = group.EntityObjects || [];\n } else if (group.DataSourceType === 'entity' && group.EntityName) {\n records = await this.loadFromEntity(group);\n }\n\n // Convert records to timeline events\n for (const record of records) {\n const event = this.createTimelineEvent(record, group, groupIndex);\n this.allEvents.push(event);\n }\n }\n\n /**\n * Loads data from MemberJunction entity.\n */\n private async loadFromEntity(group: TimelineGroup<T>): Promise<T[]> {\n try {\n const { RunView } = await import('@memberjunction/core');\n const rv = new RunView();\n\n const result = await rv.RunView({\n EntityName: group.EntityName,\n ExtraFilter: group.Filter,\n OrderBy: group.OrderBy,\n MaxRows: group.MaxRecords,\n ResultType: 'entity_object'\n });\n\n if (result?.Success) {\n return result.Results as T[];\n }\n } catch (error) {\n console.warn('Timeline: Could not load from entity. Is @memberjunction/core available?', error);\n }\n\n return [];\n }\n\n /**\n * Loads the next batch for virtual scrolling.\n */\n private async loadNextBatch(): Promise<void> {\n // TODO: Implement proper batch loading with offset/limit\n // For now, this is a placeholder\n }\n\n /**\n * Creates a timeline event from a source record.\n */\n private createTimelineEvent(record: T, group: TimelineGroup<T>, groupIndex: number): MJTimelineEvent<T> {\n const cardConfig = group.getEffectiveCardConfig();\n\n return {\n id: group.getId(record),\n entity: record,\n title: group.getTitle(record),\n date: group.getDate(record),\n subtitle: group.getSubtitle(record),\n description: group.getDescription(record),\n imageUrl: group.getImageUrl(record),\n config: group.getEventConfig(record),\n groupIndex,\n isExpanded: cardConfig.defaultExpanded ?? false\n };\n }\n\n /**\n * Sorts events by date according to sortOrder.\n */\n private sortEvents(): void {\n this.allEvents.sort((a, b) => {\n const diff = a.date.getTime() - b.date.getTime();\n return this.sortOrder === 'asc' ? diff : -diff;\n });\n }\n\n // ============================================================================\n // PRIVATE METHODS - SEGMENTATION\n // ============================================================================\n\n /**\n * Builds time segments from events.\n */\n private buildSegments(): void {\n if (this.segmentGrouping === 'none') {\n this.segments = [];\n return;\n }\n\n const segmentMap = new Map<string, TimelineSegment>();\n\n for (const event of this.allEvents) {\n const { label, startDate, endDate } = this.getSegmentInfo(event.date);\n\n if (!segmentMap.has(label)) {\n segmentMap.set(label, {\n label,\n startDate,\n endDate,\n events: [],\n isExpanded: this.segmentsDefaultExpanded,\n eventCount: 0\n });\n }\n\n const segment = segmentMap.get(label)!;\n segment.events.push(event);\n segment.eventCount++;\n }\n\n // Convert to array and sort\n this.segments = Array.from(segmentMap.values());\n this.segments.sort((a, b) => {\n const diff = a.startDate.getTime() - b.startDate.getTime();\n return this.sortOrder === 'asc' ? diff : -diff;\n });\n }\n\n /**\n * Gets segment information for a date.\n */\n private getSegmentInfo(date: Date): { label: string; startDate: Date; endDate: Date } {\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n\n switch (this.segmentGrouping) {\n case 'day':\n return {\n label: this.formatDateInternal(date, 'MMMM d, yyyy'),\n startDate: new Date(year, month, day),\n endDate: new Date(year, month, day + 1)\n };\n\n case 'week':\n const weekStart = new Date(date);\n weekStart.setDate(day - date.getDay());\n const weekEnd = new Date(weekStart);\n weekEnd.setDate(weekStart.getDate() + 7);\n return {\n label: `Week of ${this.formatDateInternal(weekStart, 'MMM d, yyyy')}`,\n startDate: weekStart,\n endDate: weekEnd\n };\n\n case 'month':\n return {\n label: this.formatDateInternal(new Date(year, month, 1), 'MMMM yyyy'),\n startDate: new Date(year, month, 1),\n endDate: new Date(year, month + 1, 1)\n };\n\n case 'quarter':\n const quarter = Math.floor(month / 3);\n return {\n label: `Q${quarter + 1} ${year}`,\n startDate: new Date(year, quarter * 3, 1),\n endDate: new Date(year, (quarter + 1) * 3, 1)\n };\n\n case 'year':\n return {\n label: String(year),\n startDate: new Date(year, 0, 1),\n endDate: new Date(year + 1, 0, 1)\n };\n\n default:\n return {\n label: this.formatDateInternal(date, 'MMMM yyyy'),\n startDate: new Date(year, month, 1),\n endDate: new Date(year, month + 1, 1)\n };\n }\n }\n\n // ============================================================================\n // PRIVATE METHODS - EXPAND/COLLAPSE\n // ============================================================================\n\n /**\n * Toggles event expanded state.\n */\n private toggleEventExpanded(event: MJTimelineEvent<T>, index: number, domEvent?: Event): void {\n if (event.isExpanded) {\n this.collapseEventInternal(event, index, domEvent);\n } else {\n this.expandEventInternal(event, index, domEvent);\n }\n }\n\n /**\n * Sets event expanded state.\n */\n private setEventExpanded(event: MJTimelineEvent<T>, expanded: boolean): void {\n event.isExpanded = expanded;\n }\n\n /**\n * Expands an event with events.\n */\n private expandEventInternal(event: MJTimelineEvent<T>, index: number, domEvent?: Event): void {\n const group = this._groups[event.groupIndex];\n\n const beforeArgs: BeforeEventExpandArgs<T> = {\n cancel: false,\n event,\n group,\n index,\n domEvent\n };\n this.beforeEventExpand.emit(beforeArgs);\n\n if (beforeArgs.cancel) {\n return;\n }\n\n event.isExpanded = true;\n this.cdr.markForCheck();\n\n const afterArgs: AfterEventExpandArgs<T> = {\n success: true,\n event,\n group,\n index,\n domEvent\n };\n this.afterEventExpand.emit(afterArgs);\n }\n\n /**\n * Collapses an event with events.\n */\n private collapseEventInternal(event: MJTimelineEvent<T>, index: number, domEvent?: Event): void {\n const group = this._groups[event.groupIndex];\n\n const beforeArgs: BeforeEventCollapseArgs<T> = {\n cancel: false,\n event,\n group,\n index,\n domEvent\n };\n this.beforeEventCollapse.emit(beforeArgs);\n\n if (beforeArgs.cancel) {\n return;\n }\n\n event.isExpanded = false;\n this.cdr.markForCheck();\n\n const afterArgs: AfterEventCollapseArgs<T> = {\n success: true,\n event,\n group,\n index,\n domEvent\n };\n this.afterEventCollapse.emit(afterArgs);\n }\n\n /**\n * Expands a segment.\n */\n private expandSegment(segment: TimelineSegment): void {\n const beforeArgs: BeforeSegmentExpandArgs = {\n cancel: false,\n segment,\n label: segment.label,\n startDate: segment.startDate,\n endDate: segment.endDate,\n eventCount: segment.eventCount\n };\n this.beforeSegmentExpand.emit(beforeArgs);\n\n if (beforeArgs.cancel) {\n return;\n }\n\n segment.isExpanded = true;\n this.cdr.markForCheck();\n\n const afterArgs: AfterSegmentExpandArgs = {\n success: true,\n segment,\n label: segment.label,\n startDate: segment.startDate,\n endDate: segment.endDate,\n eventCount: segment.eventCount\n };\n this.afterSegmentExpand.emit(afterArgs);\n }\n\n /**\n * Collapses a segment.\n */\n private collapseSegment(segment: TimelineSegment): void {\n const beforeArgs: BeforeSegmentCollapseArgs = {\n cancel: false,\n segment,\n label: segment.label,\n startDate: segment.startDate,\n endDate: segment.endDate,\n eventCount: segment.eventCount\n };\n this.beforeSegmentCollapse.emit(beforeArgs);\n\n if (beforeArgs.cancel) {\n return;\n }\n\n segment.isExpanded = false;\n this.cdr.markForCheck();\n\n const afterArgs: AfterSegmentCollapseArgs = {\n success: true,\n segment,\n label: segment.label,\n startDate: segment.startDate,\n endDate: segment.endDate,\n eventCount: segment.eventCount\n };\n this.afterSegmentCollapse.emit(afterArgs);\n }\n\n /**\n * Sets segment expanded state without events.\n */\n private setSegmentExpanded(segment: TimelineSegment, expanded: boolean): void {\n segment.isExpanded = expanded;\n }\n\n // ============================================================================\n // PRIVATE METHODS - KEYBOARD NAVIGATION\n // ============================================================================\n\n private focusNextEvent(): void {\n if (this.allEvents.length === 0) return;\n\n this.focusedEventIndex = Math.min(\n this.focusedEventIndex + 1,\n this.allEvents.length - 1\n );\n this.scrollToFocusedEvent();\n }\n\n private focusPreviousEvent(): void {\n if (this.allEvents.length === 0) return;\n\n this.focusedEventIndex = Math.max(this.focusedEventIndex - 1, 0);\n this.scrollToFocusedEvent();\n }\n\n private focusFirstEvent(): void {\n if (this.allEvents.length === 0) return;\n\n this.focusedEventIndex = 0;\n this.scrollToFocusedEvent();\n }\n\n private focusLastEvent(): void {\n if (this.allEvents.length === 0) return;\n\n this.focusedEventIndex = this.allEvents.length - 1;\n this.scrollToFocusedEvent();\n }\n\n private activateFocusedEvent(): void {\n if (this.focusedEventIndex >= 0 && this.focusedEventIndex < this.allEvents.length) {\n const event = this.allEvents[this.focusedEventIndex];\n this.toggleEventExpanded(event, this.focusedEventIndex);\n }\n }\n\n private collapseFocusedEvent(): void {\n if (this.focusedEventIndex >= 0 && this.focusedEventIndex < this.allEvents.length) {\n const event = this.allEvents[this.focusedEventIndex];\n if (event.isExpanded) {\n this.collapseEventInternal(event, this.focusedEventIndex);\n }\n }\n }\n\n private scrollToFocusedEvent(): void {\n if (this.focusedEventIndex >= 0 && this.focusedEventIndex < this.allEvents.length) {\n const event = this.allEvents[this.focusedEventIndex];\n this.scrollToEvent(event.id, 'smooth');\n }\n this.cdr.markForCheck();\n }\n\n // ============================================================================\n // PRIVATE METHODS - VIRTUAL SCROLLING\n // ============================================================================\n\n private setupIntersectionObserver(): void {\n if (!this.virtualScroll.enabled) return;\n\n // Use requestAnimationFrame to ensure DOM is ready\n requestAnimationFrame(() => {\n const sentinel = this.elementRef.nativeElement.querySelector('.mj-timeline-scroll-sentinel');\n if (!sentinel) return;\n\n this._intersectionObserver = new IntersectionObserver(\n (entries) => {\n const entry = entries[0];\n if (entry?.isIntersecting && !this.scrollState.isLoading && this.scrollState.hasMore) {\n this.ngZone.run(() => this.loadMore());\n }\n },\n {\n root: this.scrollContainer?.nativeElement,\n threshold: 0,\n rootMargin: `${this.virtualScroll.loadThreshold}px`\n }\n );\n\n this._intersectionObserver.observe(sentinel);\n });\n }\n\n private onScrollCheck(): void {\n if (!this.scrollContainer?.nativeElement || !this.virtualScroll.enabled) {\n return;\n }\n\n const el = this.scrollContainer.nativeElement;\n this.scrollState.scrollOffset = el.scrollTop;\n\n const distanceFromBottom = el.scrollHeight - el.scrollTop - el.clientHeight;\n if (distanceFromBottom < this.virtualScroll.loadThreshold && this.scrollState.hasMore) {\n this.loadMore();\n }\n }\n\n // ============================================================================\n // PRIVATE METHODS - UTILITIES\n // ============================================================================\n\n /**\n * Maps event config to card config properties.\n */\n private mapEventConfigToCardConfig(config: TimelineEventConfig = {}): Partial<TimelineCardConfig> {\n return {\n collapsible: config.collapsible,\n defaultExpanded: config.defaultExpanded,\n actions: config.actions\n };\n }\n\n /**\n * Simple date formatter (replaces Angular DatePipe for standalone use).\n * Uses placeholder tokens to avoid replacement conflicts.\n */\n private formatDateInternal(date: Date, format: string): string {\n const months = ['January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'];\n const monthsShort = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n const hours = date.getHours();\n const minutes = date.getMinutes();\n\n // Use placeholder tokens to avoid conflicts (e.g., 'May' containing 'M')\n // Replace longer patterns first with placeholders, then substitute values\n let result = format;\n\n // Replace patterns with unique placeholders first\n result = result.replace(/yyyy/g, '{{YEAR}}');\n result = result.replace(/MMMM/g, '{{MONTH_FULL}}');\n result = result.replace(/MMM/g, '{{MONTH_SHORT}}');\n result = result.replace(/MM/g, '{{MONTH_PAD}}');\n result = result.replace(/dd/g, '{{DAY_PAD}}');\n result = result.replace(/d/g, '{{DAY}}');\n result = result.replace(/HH/g, '{{HOUR_24}}');\n result = result.replace(/hh/g, '{{HOUR_12_PAD}}');\n result = result.replace(/h/g, '{{HOUR_12}}');\n result = result.replace(/mm/g, '{{MIN}}');\n result = result.replace(/a/g, '{{AMPM}}');\n\n // Now substitute the actual values\n result = result.replace(/\\{\\{YEAR\\}\\}/g, String(year));\n result = result.replace(/\\{\\{MONTH_FULL\\}\\}/g, months[month]);\n result = result.replace(/\\{\\{MONTH_SHORT\\}\\}/g, monthsShort[month]);\n result = result.replace(/\\{\\{MONTH_PAD\\}\\}/g, String(month + 1).padStart(2, '0'));\n result = result.replace(/\\{\\{DAY_PAD\\}\\}/g, String(day).padStart(2, '0'));\n result = result.replace(/\\{\\{DAY\\}\\}/g, String(day));\n result = result.replace(/\\{\\{HOUR_24\\}\\}/g, String(hours).padStart(2, '0'));\n result = result.replace(/\\{\\{HOUR_12_PAD\\}\\}/g, String(hours % 12 || 12).padStart(2, '0'));\n result = result.replace(/\\{\\{HOUR_12\\}\\}/g, String(hours % 12 || 12));\n result = result.replace(/\\{\\{MIN\\}\\}/g, String(minutes).padStart(2, '0'));\n result = result.replace(/\\{\\{AMPM\\}\\}/g, hours >= 12 ? 'PM' : 'AM');\n\n return result;\n }\n}\n","<!--\nMJ Timeline Component Template\n\nStructure:\n- Loading state\n- Empty state\n- Timeline container (vertical/horizontal)\n- Time segments (collapsible)\n- Segment header\n- Event cards within segment\n- Or flat list of events (when segmentGrouping='none')\n- Virtual scroll sentinel\n-->\n\n<div\n class=\"mj-timeline\"\n [class.mj-timeline--vertical]=\"orientation === 'vertical'\"\n [class.mj-timeline--horizontal]=\"orientation === 'horizontal'\"\n [class.mj-timeline--single]=\"layout === 'single'\"\n [class.mj-timeline--alternating]=\"layout === 'alternating'\"\n [attr.aria-label]=\"ariaLabel\"\n role=\"list\"\n tabindex=\"0\"\n (keydown)=\"onKeyDown($event)\"\n #scrollContainer\n (scroll)=\"onScroll($event)\">\n\n <!-- Loading State -->\n @if (isLoading && !isInitialized) {\n @if (loadingTemplate) {\n <ng-container *ngTemplateOutlet=\"loadingTemplate\"></ng-container>\n } @else {\n <div class=\"mj-timeline__loading\">\n <div class=\"mj-timeline__loading-spinner\"></div>\n <span class=\"mj-timeline__loading-text\">{{ loadingMessage }}</span>\n </div>\n }\n }\n\n <!-- Empty State -->\n @if (isInitialized && allEvents.length === 0 && !isLoading) {\n @if (emptyTemplate) {\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\n } @else {\n <div class=\"mj-timeline__empty\">\n <i [class]=\"emptyIcon\" class=\"mj-timeline__empty-icon\"></i>\n <span class=\"mj-timeline__empty-text\">{{ emptyMessage }}</span>\n </div>\n }\n }\n\n <!-- Timeline Content -->\n @if (isInitialized && allEvents.length > 0) {\n <!-- Segmented View -->\n @if (segmentGrouping !== 'none') {\n @for (segment of segments; track trackBySegmentLabel(segmentIndex, segment); let segmentIndex = $index) {\n <div\n class=\"mj-timeline__segment\"\n [class.mj-timeline__segment--collapsed]=\"!segment.isExpanded\"\n [attr.data-segment-label]=\"segment.label\">\n <!-- Segment Header -->\n <div\n class=\"mj-timeline__segment-header\"\n [class.mj-timeline__segment-header--clickable]=\"segmentsCollapsible\"\n (click)=\"onSegmentClick(segment)\"\n role=\"button\"\n [attr.aria-expanded]=\"segment.isExpanded\"\n [attr.aria-controls]=\"'segment-content-' + segmentIndex\">\n @if (segmentHeaderTemplate) {\n <ng-container *ngTemplateOutlet=\"segmentHeaderTemplate; context: { segment: segment }\"></ng-container>\n } @else {\n @if (segmentsCollapsible) {\n <span class=\"mj-timeline__segment-toggle\">\n <i [class]=\"segment.isExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n </span>\n }\n <span class=\"mj-timeline__segment-label\">{{ segment.label }}</span>\n <span class=\"mj-timeline__segment-count\">({{ segment.eventCount }} {{ segment.eventCount === 1 ? 'event' : 'events' }})</span>\n <span class=\"mj-timeline__segment-line\"></span>\n }\n </div>\n <!-- Segment Content -->\n <div\n class=\"mj-timeline__segment-content\"\n [id]=\"'segment-content-' + segmentIndex\"\n [class.mj-timeline__segment-content--hidden]=\"!segment.isExpanded\">\n <div class=\"mj-timeline__axis\">\n <!-- Events in Segment -->\n @for (event of segment.events; track trackByEventId(eventIndex, event); let eventIndex = $index; let isOdd = $odd) {\n <ng-container *ngTemplateOutlet=\"eventCard; context: {\n event: event,\n index: eventIndex,\n isOdd: isOdd,\n globalIndex: getGlobalIndex(event)\n }\"></ng-container>\n }\n </div>\n </div>\n </div>\n }\n }\n <!-- Flat View (no segments) -->\n @if (segmentGrouping === 'none') {\n <div class=\"mj-timeline__axis\">\n @for (event of allEvents; track trackByEventId(eventIndex, event); let eventIndex = $index; let isOdd = $odd) {\n <ng-container *ngTemplateOutlet=\"eventCard; context: {\n event: event,\n index: eventIndex,\n isOdd: isOdd,\n globalIndex: eventIndex\n }\"></ng-container>\n }\n </div>\n }\n }\n\n <!-- Virtual Scroll Sentinel -->\n @if (virtualScroll.enabled && scrollState.hasMore) {\n <div\n class=\"mj-timeline-scroll-sentinel\"\n >\n </div>\n }\n\n <!-- Loading More Indicator -->\n @if (scrollState.isLoading && virtualScroll.showLoadingIndicator) {\n <div\n class=\"mj-timeline__loading-more\"\n >\n <div class=\"mj-timeline__loading-spinner mj-timeline__loading-spinner--small\"></div>\n <span>{{ virtualScroll.loadingMessage }}</span>\n </div>\n }\n\n</div>\n\n<!-- Event Card Template -->\n<ng-template #eventCard let-event=\"event\" let-index=\"index\" let-isOdd=\"isOdd\" let-globalIndex=\"globalIndex\">\n <div\n class=\"mj-timeline__event\"\n [class.mj-timeline__event--odd]=\"isOdd && layout === 'alternating'\"\n [class.mj-timeline__event--even]=\"!isOdd && layout === 'alternating'\"\n [class.mj-timeline__event--expanded]=\"event.isExpanded\"\n [class.mj-timeline__event--focused]=\"isEventSelected(event, globalIndex)\"\n [attr.data-event-id]=\"event.id\"\n role=\"listitem\"\n [attr.aria-expanded]=\"event.isExpanded\">\n\n <!-- Timeline Marker -->\n <div class=\"mj-timeline__marker\" [style.background-color]=\"getColor(event)\">\n <i [class]=\"getIcon(event)\" class=\"mj-timeline__marker-icon\"></i>\n </div>\n\n <!-- Connector Line -->\n <div class=\"mj-timeline__connector\" [style.background-color]=\"getColor(event)\"></div>\n\n <!-- Date Label (for alternating layout) -->\n @if (layout === 'alternating') {\n <div class=\"mj-timeline__date-label\">\n {{ formatDate(event.date) }}\n </div>\n }\n\n <!-- Event Card -->\n <div\n class=\"mj-timeline__card\"\n [ngClass]=\"getEffectiveCardConfig(event).cssClass\"\n [style.max-width]=\"getEffectiveCardConfig(event).maxWidth\"\n [style.min-width]=\"getEffectiveCardConfig(event).minWidth\"\n [style.border-left-color]=\"getColor(event)\"\n (click)=\"onEventClick(event, globalIndex, $event)\"\n (mouseenter)=\"onEventMouseEnter(event, globalIndex, $event)\"\n (mouseleave)=\"onEventMouseLeave(event, globalIndex, $event)\">\n\n <!-- Custom Card Template -->\n @if (cardTemplate) {\n <ng-container *ngTemplateOutlet=\"cardTemplate; context: {\n event: event,\n group: groups[event.groupIndex]\n }\"></ng-container>\n } @else {\n <!-- Card Header -->\n <div class=\"mj-timeline__card-header\">\n <!-- Image (left position) -->\n @if (event.imageUrl && getEffectiveCardConfig(event).imagePosition === 'left') {\n <div\n class=\"mj-timeline__card-image mj-timeline__card-image--left\"\n [class.mj-timeline__card-image--small]=\"getEffectiveCardConfig(event).imageSize === 'small'\"\n [class.mj-timeline__card-image--medium]=\"getEffectiveCardConfig(event).imageSize === 'medium'\"\n [class.mj-timeline__card-image--large]=\"getEffectiveCardConfig(event).imageSize === 'large'\">\n <img [src]=\"event.imageUrl\" [alt]=\"event.title\" />\n </div>\n }\n <div class=\"mj-timeline__card-header-content\">\n <!-- Custom Header Template -->\n @if (headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: { event: event }\"></ng-container>\n } @else {\n <!-- Icon -->\n @if (getEffectiveCardConfig(event).showIcon) {\n <span\n class=\"mj-timeline__card-icon\"\n [style.color]=\"getColor(event)\">\n <i [class]=\"getIcon(event)\"></i>\n </span>\n }\n <!-- Title & Subtitle -->\n <div class=\"mj-timeline__card-titles\">\n <h4 class=\"mj-timeline__card-title\">{{ event.title }}</h4>\n @if (event.subtitle && getEffectiveCardConfig(event).showSubtitle) {\n <span\n class=\"mj-timeline__card-subtitle\"\n >\n {{ event.subtitle }}\n </span>\n }\n @if (getEffectiveCardConfig(event).showDate && layout !== 'alternating') {\n <span\n class=\"mj-timeline__card-date\"\n >\n {{ formatDate(event.date, getEffectiveCardConfig(event).dateFormat) }}\n </span>\n }\n </div>\n <!-- Expand/Collapse Toggle -->\n @if (getEffectiveCardConfig(event).collapsible) {\n <button\n class=\"mj-timeline__card-toggle\"\n (click)=\"onToggleExpand(event, globalIndex, $event)\"\n [attr.aria-label]=\"event.isExpanded ? 'Collapse' : 'Expand'\"\n type=\"button\">\n <i [class]=\"event.isExpanded ? 'fa-solid fa-chevron-up' : 'fa-solid fa-chevron-down'\"></i>\n </button>\n }\n }\n </div>\n </div>\n <!-- Image (top position) -->\n @if (event.imageUrl && getEffectiveCardConfig(event).imagePosition === 'top') {\n <div\n class=\"mj-timeline__card-image mj-timeline__card-image--top\"\n >\n <img [src]=\"event.imageUrl\" [alt]=\"event.title\" />\n </div>\n }\n <!-- Card Body -->\n <div\n class=\"mj-timeline__card-body\"\n [class.mj-timeline__card-body--collapsed]=\"!event.isExpanded && getEffectiveCardConfig(event).collapsible\">\n <!-- Custom Body Template -->\n @if (bodyTemplate) {\n <ng-container *ngTemplateOutlet=\"bodyTemplate; context: { event: event }\"></ng-container>\n } @else {\n <!-- Summary Fields (always visible) -->\n @if (getEffectiveCardConfig(event).summaryFields?.length) {\n <div\n class=\"mj-timeline__card-fields mj-timeline__card-fields--summary\"\n >\n @for (field of getEffectiveCardConfig(event).summaryFields; track field) {\n <div class=\"mj-timeline__card-field\" [ngClass]=\"field.cssClass\">\n @if (field.icon) {\n <i [ngClass]=\"field.icon\" class=\"mj-timeline__card-field-icon\"></i>\n }\n @if (!field.hideLabel && field.label) {\n <span class=\"mj-timeline__card-field-label\">{{ field.label }}:</span>\n }\n <span class=\"mj-timeline__card-field-value\">{{ getFieldValue(event, field) }}</span>\n </div>\n }\n </div>\n }\n <!-- Description (expanded view) -->\n @if (event.description && event.isExpanded) {\n <div\n class=\"mj-timeline__card-description\"\n [class.mj-timeline__card-description--clamped]=\"(getEffectiveCardConfig(event).descriptionMaxLines ?? 0) > 0\"\n [style.-webkit-line-clamp]=\"getEffectiveCardConfig(event).descriptionMaxLines || null\">\n @if (getEffectiveCardConfig(event).allowHtmlDescription) {\n <div [innerHTML]=\"event.description\"></div>\n } @else {\n {{ event.description }}\n }\n </div>\n }\n <!-- Expanded Fields -->\n @if (event.isExpanded && getEffectiveCardConfig(event).expandedFields?.length) {\n <div\n class=\"mj-timeline__card-fields mj-timeline__card-fields--expanded\"\n >\n @for (field of getEffectiveCardConfig(event).expandedFields; track field) {\n <div class=\"mj-timeline__card-field\" [ngClass]=\"field.cssClass\">\n @if (field.icon) {\n <i [ngClass]=\"field.icon\" class=\"mj-timeline__card-field-icon\"></i>\n }\n @if (!field.hideLabel) {\n <span class=\"mj-timeline__card-field-label\">{{ field.label || field.fieldName }}:</span>\n }\n <span class=\"mj-timeline__card-field-value\">{{ getFieldValue(event, field) }}</span>\n </div>\n }\n </div>\n }\n }\n </div>\n <!-- Card Actions -->\n @if (getActions(event).length > 0) {\n <div\n class=\"mj-timeline__card-actions\"\n [class.mj-timeline__card-actions--hover-only]=\"getEffectiveCardConfig(event).actionsOnHover\"\n >\n <!-- Custom Actions Template -->\n @if (actionsTemplate) {\n <ng-container *ngTemplateOutlet=\"actionsTemplate; context: {\n event: event,\n actions: getActions(event)\n }\"></ng-container>\n } @else {\n @for (action of getActions(event); track action) {\n <button\n class=\"mj-timeline__action\"\n [class.mj-timeline__action--primary]=\"action.variant === 'primary'\"\n [class.mj-timeline__action--secondary]=\"action.variant === 'secondary' || !action.variant\"\n [class.mj-timeline__action--danger]=\"action.variant === 'danger'\"\n [class.mj-timeline__action--link]=\"action.variant === 'link'\"\n [ngClass]=\"action.cssClass\"\n [disabled]=\"action.disabled\"\n [title]=\"action.tooltip || ''\"\n (click)=\"onActionClick(event, action, globalIndex, $event)\"\n type=\"button\">\n @if (action.icon) {\n <i [ngClass]=\"action.icon\"></i>\n }\n <span>{{ action.label }}</span>\n </button>\n }\n }\n </div>\n }\n }\n\n <!-- Default Card Template -->\n </div>\n </div>\n</ng-template>\n"]}
|
|
1
|
+
{"version":3,"file":"timeline.component.js","sourceRoot":"","sources":["../../../src/lib/component/timeline.component.ts","../../../src/lib/component/timeline.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview MJ Timeline Component - A flexible, responsive timeline for Angular.\n *\n * This component displays chronological data in a timeline format with support for:\n * - Multiple data sources (MemberJunction entities or plain objects)\n * - Virtual scrolling for large datasets\n * - Collapsible time segments\n * - Rich event system with BeforeX/AfterX pattern\n * - Full keyboard navigation and accessibility\n * - Responsive design for all screen sizes\n *\n * @module @memberjunction/ng-timeline\n */\n\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n AfterViewInit,\n ElementRef,\n ViewChild,\n ContentChild,\n TemplateRef,\n ChangeDetectorRef,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n NgZone\n} from '@angular/core';\n\nimport { Subject } from 'rxjs';\nimport { takeUntil, debounceTime } from 'rxjs/operators';\n\nimport {\n TimelineOrientation,\n TimelineLayout,\n TimelineSortOrder,\n TimeSegmentGrouping,\n TimelineCardConfig,\n TimelineEventConfig,\n VirtualScrollConfig,\n VirtualScrollState,\n MJTimelineEvent,\n TimelineSegment,\n TimelineAction,\n TimelineDisplayField,\n DEFAULT_CARD_CONFIG,\n DEFAULT_VIRTUAL_SCROLL_CONFIG,\n DEFAULT_VIRTUAL_SCROLL_STATE\n} from '../types';\n\nimport { TimelineGroup, getFieldValue } from '../timeline-group';\n\nimport {\n BeforeEventClickArgs,\n AfterEventClickArgs,\n BeforeEventExpandArgs,\n AfterEventExpandArgs,\n BeforeEventCollapseArgs,\n AfterEventCollapseArgs,\n BeforeEventHoverArgs,\n AfterEventHoverArgs,\n BeforeActionClickArgs,\n AfterActionClickArgs,\n BeforeSegmentExpandArgs,\n AfterSegmentExpandArgs,\n BeforeSegmentCollapseArgs,\n AfterSegmentCollapseArgs,\n BeforeLoadArgs,\n AfterLoadArgs\n} from '../events';\n\n// ============================================================================\n// AUTO-ASSIGNED COLORS FOR GROUPS\n// ============================================================================\n\nconst AUTO_COLORS = [\n '#1976d2', // Blue\n '#388e3c', // Green\n '#f57c00', // Orange\n '#7b1fa2', // Purple\n '#c2185b', // Pink\n '#00796b', // Teal\n '#5d4037', // Brown\n '#455a64', // Blue Grey\n '#d32f2f', // Red\n '#0097a7' // Cyan\n];\n\nconst DEFAULT_ICONS = [\n 'fa-solid fa-circle',\n 'fa-solid fa-square',\n 'fa-solid fa-diamond',\n 'fa-solid fa-star',\n 'fa-solid fa-heart'\n];\n\n// ============================================================================\n// TIMELINE COMPONENT\n// ============================================================================\n\n/**\n * MJ Timeline Component - Displays chronological data in a rich, interactive timeline.\n *\n * The timeline component supports multiple data groups, virtual scrolling for large\n * datasets, collapsible time segments, and a comprehensive event system that allows\n * container components to intercept and modify behavior.\n *\n * @example Basic usage\n * ```html\n * <mj-timeline [groups]=\"myGroups\"></mj-timeline>\n * ```\n *\n * @example Full configuration\n * ```html\n * <mj-timeline\n * [groups]=\"groups\"\n * orientation=\"vertical\"\n * layout=\"alternating\"\n * sortOrder=\"desc\"\n * segmentGrouping=\"month\"\n * [segmentsCollapsible]=\"true\"\n * [virtualScroll]=\"{ enabled: true, batchSize: 25 }\"\n * (beforeEventClick)=\"onBeforeClick($event)\"\n * (afterActionClick)=\"onAction($event)\">\n *\n * <ng-template #emptyTemplate>\n * <div class=\"custom-empty\">No events found</div>\n * </ng-template>\n *\n * </mj-timeline>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-timeline',\n templateUrl: './timeline.component.html',\n styleUrls: ['./timeline.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class TimelineComponent<T = any> implements OnInit, OnDestroy, AfterViewInit {\n // ============================================================================\n // INPUTS - DATA\n // ============================================================================\n\n /**\n * Array of timeline groups to display.\n * Each group defines a data source and display configuration.\n */\n @Input()\n get groups(): TimelineGroup<T>[] {\n return this._groups;\n }\n set groups(value: TimelineGroup<T>[]) {\n const prevGroups = this._groups;\n this._groups = value || [];\n const hasGroups = this._groups.length > 0;\n\n // Check if groups actually changed (different date field, label, or data)\n const groupsChanged = this.didGroupsChange(prevGroups, this._groups);\n\n // Defer the FIRST load until the view is ready (ngAfterViewInit). When this component is\n // dynamic-mounted, the host sets `groups` via setInput BEFORE the view initializes; running the\n // first refresh here would render nothing (ViewChildren/DOM not ready) yet still set `_hasLoaded`,\n // so ngAfterViewInit's real refresh would be skipped and the timeline would show \"No events\"\n // until something forced a re-refresh (e.g. changing the date field). Only refresh from the setter\n // once the view is ready.\n if (this.allowLoad && hasGroups && this._viewReady) {\n if (!this._hasLoaded) {\n // First load\n this.refresh();\n } else if (groupsChanged) {\n // Groups changed after initial load - force refresh\n this.refresh(true);\n }\n }\n }\n private _groups: TimelineGroup<T>[] = [];\n /** True once ngAfterViewInit has run — the view is ready to render refreshed events. */\n private _viewReady = false;\n\n /**\n * Check if timeline groups have meaningfully changed\n */\n private didGroupsChange(prev: TimelineGroup<T>[], next: TimelineGroup<T>[]): boolean {\n if (prev.length !== next.length) return true;\n for (let i = 0; i < prev.length; i++) {\n const p = prev[i];\n const n = next[i];\n if (p.DateFieldName !== n.DateFieldName ||\n p.GroupLabel !== n.GroupLabel ||\n p.EntityObjects !== n.EntityObjects) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Controls whether data loading is allowed.\n * Set to false to defer loading until ready.\n * @default true\n */\n @Input()\n get allowLoad(): boolean {\n return this._allowLoad;\n }\n set allowLoad(value: boolean) {\n const wasDisabled = !this._allowLoad;\n this._allowLoad = value;\n // When allowLoad becomes true and we have groups, trigger refresh\n if (value && wasDisabled && this._groups.length > 0) {\n this.refresh(this._hasLoaded);\n }\n }\n private _allowLoad = true;\n\n // ============================================================================\n // INPUTS - LAYOUT (using setters for reactive updates)\n // ============================================================================\n\n /**\n * Timeline orientation.\n * - `vertical`: Events displayed top-to-bottom\n * - `horizontal`: Events displayed left-to-right\n * @default 'vertical'\n */\n @Input()\n get orientation(): TimelineOrientation {\n return this._orientation;\n }\n set orientation(value: TimelineOrientation) {\n if (this._orientation !== value) {\n this._orientation = value;\n this.cdr.markForCheck();\n }\n }\n private _orientation: TimelineOrientation = 'vertical';\n\n /**\n * Layout mode for vertical timeline.\n * - `single`: All cards on one side\n * - `alternating`: Cards alternate sides\n * @default 'single'\n */\n @Input()\n get layout(): TimelineLayout {\n return this._layout;\n }\n set layout(value: TimelineLayout) {\n if (this._layout !== value) {\n this._layout = value;\n this.cdr.markForCheck();\n }\n }\n private _layout: TimelineLayout = 'single';\n\n /**\n * Sort order for events.\n * - `desc`: Newest first\n * - `asc`: Oldest first\n * @default 'desc'\n */\n @Input()\n get sortOrder(): TimelineSortOrder {\n return this._sortOrder;\n }\n set sortOrder(value: TimelineSortOrder) {\n if (this._sortOrder !== value) {\n this._sortOrder = value;\n // Re-process events when sort order changes - force refresh since data already loaded\n if (this._initialized) {\n this.refresh(true);\n }\n this.cdr.markForCheck();\n }\n }\n private _sortOrder: TimelineSortOrder = 'desc';\n\n /**\n * How to group events into time segments.\n * @default 'month'\n */\n @Input()\n get segmentGrouping(): TimeSegmentGrouping {\n return this._segmentGrouping;\n }\n set segmentGrouping(value: TimeSegmentGrouping) {\n if (this._segmentGrouping !== value) {\n this._segmentGrouping = value;\n // Re-segment events when grouping changes - force refresh since data already loaded\n if (this._initialized) {\n this.refresh(true);\n }\n this.cdr.markForCheck();\n }\n }\n private _segmentGrouping: TimeSegmentGrouping = 'month';\n\n // ============================================================================\n // INPUTS - CARD DEFAULTS\n // ============================================================================\n\n /**\n * Default card configuration applied to all groups.\n * Individual groups can override these settings.\n */\n @Input() defaultCardConfig: TimelineCardConfig = { ...DEFAULT_CARD_CONFIG };\n\n // ============================================================================\n // INPUTS - VIRTUAL SCROLLING\n // ============================================================================\n\n /**\n * Virtual scrolling configuration.\n */\n @Input() virtualScroll: VirtualScrollConfig = { ...DEFAULT_VIRTUAL_SCROLL_CONFIG };\n\n // ============================================================================\n // INPUTS - SEGMENTS\n // ============================================================================\n\n /**\n * Whether time segments can be collapsed.\n * @default true\n */\n @Input() segmentsCollapsible = true;\n\n /**\n * Whether segments start expanded.\n * @default true\n */\n @Input() segmentsDefaultExpanded = true;\n\n // ============================================================================\n // INPUTS - EMPTY & LOADING STATES\n // ============================================================================\n\n /**\n * Message shown when no events exist.\n * @default 'No events to display'\n */\n @Input() emptyMessage = 'No events to display';\n\n /**\n * Icon shown with empty message.\n * @default 'fa-regular fa-calendar-xmark'\n */\n @Input() emptyIcon = 'fa-regular fa-calendar-xmark';\n\n /**\n * Message shown while loading.\n * @default 'Loading timeline...'\n */\n @Input() loadingMessage = 'Loading timeline...';\n\n // ============================================================================\n // INPUTS - ACCESSIBILITY\n // ============================================================================\n\n /**\n * ARIA label for the timeline container.\n * @default 'Timeline'\n */\n @Input() ariaLabel = 'Timeline';\n\n /**\n * Enable keyboard navigation.\n * @default true\n */\n @Input() enableKeyboardNavigation = true;\n\n /**\n * ID of the currently selected event.\n * When set, the corresponding event will be highlighted with the focused style.\n */\n @Input()\n get selectedEventId(): string | null {\n return this._selectedEventId;\n }\n set selectedEventId(value: string | null) {\n const changed = this._selectedEventId !== value;\n this._selectedEventId = value;\n if (changed) {\n this.cdr.markForCheck();\n }\n }\n private _selectedEventId: string | null = null;\n\n // ============================================================================\n // OUTPUTS - BEFORE EVENTS (with cancel support)\n // ============================================================================\n\n /** Emitted before an event card is clicked. Set `cancel = true` to prevent. */\n @Output() beforeEventClick = new EventEmitter<BeforeEventClickArgs<T>>();\n\n /** Emitted before an event card expands. Set `cancel = true` to prevent. */\n @Output() beforeEventExpand = new EventEmitter<BeforeEventExpandArgs<T>>();\n\n /** Emitted before an event card collapses. Set `cancel = true` to prevent. */\n @Output() beforeEventCollapse = new EventEmitter<BeforeEventCollapseArgs<T>>();\n\n /** Emitted before hover state changes. Set `cancel = true` to prevent. */\n @Output() beforeEventHover = new EventEmitter<BeforeEventHoverArgs<T>>();\n\n /** Emitted before an action button is clicked. Set `cancel = true` to prevent. */\n @Output() beforeActionClick = new EventEmitter<BeforeActionClickArgs<T>>();\n\n /** Emitted before a time segment expands. Set `cancel = true` to prevent. */\n @Output() beforeSegmentExpand = new EventEmitter<BeforeSegmentExpandArgs>();\n\n /** Emitted before a time segment collapses. Set `cancel = true` to prevent. */\n @Output() beforeSegmentCollapse = new EventEmitter<BeforeSegmentCollapseArgs>();\n\n /** Emitted before data loading begins. Set `cancel = true` to prevent. */\n @Output() beforeLoad = new EventEmitter<BeforeLoadArgs>();\n\n // ============================================================================\n // OUTPUTS - AFTER EVENTS\n // ============================================================================\n\n /** Emitted after an event card is clicked. */\n @Output() afterEventClick = new EventEmitter<AfterEventClickArgs<T>>();\n\n /** Emitted after an event card expands. */\n @Output() afterEventExpand = new EventEmitter<AfterEventExpandArgs<T>>();\n\n /** Emitted after an event card collapses. */\n @Output() afterEventCollapse = new EventEmitter<AfterEventCollapseArgs<T>>();\n\n /** Emitted after hover state changes. */\n @Output() afterEventHover = new EventEmitter<AfterEventHoverArgs<T>>();\n\n /** Emitted after an action button is clicked. */\n @Output() afterActionClick = new EventEmitter<AfterActionClickArgs<T>>();\n\n /** Emitted after a time segment expands. */\n @Output() afterSegmentExpand = new EventEmitter<AfterSegmentExpandArgs>();\n\n /** Emitted after a time segment collapses. */\n @Output() afterSegmentCollapse = new EventEmitter<AfterSegmentCollapseArgs>();\n\n /** Emitted after data loading completes. */\n @Output() afterLoad = new EventEmitter<AfterLoadArgs>();\n\n // ============================================================================\n // CONTENT CHILDREN - OPTIONAL TEMPLATES\n // ============================================================================\n\n /** Custom template for entire card. Context: { event, group } */\n @ContentChild('cardTemplate') cardTemplate?: TemplateRef<{ event: MJTimelineEvent<T>; group: TimelineGroup<T> }>;\n\n /** Custom template for card header. Context: { event } */\n @ContentChild('headerTemplate') headerTemplate?: TemplateRef<{ event: MJTimelineEvent<T> }>;\n\n /** Custom template for card body. Context: { event } */\n @ContentChild('bodyTemplate') bodyTemplate?: TemplateRef<{ event: MJTimelineEvent<T> }>;\n\n /** Custom template for card actions. Context: { event, actions } */\n @ContentChild('actionsTemplate') actionsTemplate?: TemplateRef<{ event: MJTimelineEvent<T>; actions: TimelineAction[] }>;\n\n /** Custom template for segment header. Context: { segment } */\n @ContentChild('segmentHeaderTemplate') segmentHeaderTemplate?: TemplateRef<{ segment: TimelineSegment }>;\n\n /** Custom template for empty state. */\n @ContentChild('emptyTemplate') emptyTemplate?: TemplateRef<void>;\n\n /** Custom template for loading state. */\n @ContentChild('loadingTemplate') loadingTemplate?: TemplateRef<void>;\n\n // ============================================================================\n // VIEW CHILDREN\n // ============================================================================\n\n @ViewChild('scrollContainer') scrollContainer?: ElementRef<HTMLElement>;\n\n // ============================================================================\n // PUBLIC PROPERTIES\n // ============================================================================\n\n /** Current time segments with events. */\n segments: TimelineSegment[] = [];\n\n /** All flattened events (for non-segmented display). */\n allEvents: MJTimelineEvent<T>[] = [];\n\n /** Virtual scroll state. */\n scrollState: VirtualScrollState = { ...DEFAULT_VIRTUAL_SCROLL_STATE };\n\n /** Whether initial load is complete. */\n isInitialized = false;\n\n /** Whether currently loading data. */\n isLoading = false;\n\n /** Index of currently focused event (for keyboard navigation). */\n focusedEventIndex = -1;\n\n // ============================================================================\n // PRIVATE PROPERTIES\n // ============================================================================\n\n private _initialized = false;\n private _hasLoaded = false;\n private _destroy$ = new Subject<void>();\n private _scroll$ = new Subject<Event>();\n private _intersectionObserver?: IntersectionObserver;\n\n // ============================================================================\n // CONSTRUCTOR\n // ============================================================================\n\n constructor(\n private cdr: ChangeDetectorRef,\n private elementRef: ElementRef,\n private ngZone: NgZone\n ) {}\n\n // ============================================================================\n // LIFECYCLE HOOKS\n // ============================================================================\n\n ngOnInit(): void {\n this._initialized = true;\n\n // Set up scroll listener for virtual scrolling\n this._scroll$\n .pipe(\n debounceTime(100),\n takeUntil(this._destroy$)\n )\n .subscribe(() => this.onScrollCheck());\n }\n\n ngAfterViewInit(): void {\n // The view is now ready — first loads triggered by the `groups`/`allowLoad` setters were deferred\n // to here so refreshed events actually render (see the `groups` setter).\n this._viewReady = true;\n if (this.allowLoad && !this._hasLoaded && this._groups.length > 0) {\n this.refresh();\n }\n\n // Set up intersection observer for virtual scroll trigger\n this.setupIntersectionObserver();\n }\n\n ngOnDestroy(): void {\n this._destroy$.next();\n this._destroy$.complete();\n\n if (this._intersectionObserver) {\n this._intersectionObserver.disconnect();\n }\n }\n\n // ============================================================================\n // PUBLIC METHODS\n // ============================================================================\n\n /**\n * Refreshes all data from the configured groups.\n * Clears existing data and reloads from sources.\n */\n async refresh(force: boolean = false): Promise<void> {\n // Prevent concurrent refresh calls - if already refreshing, exit immediately\n if (this.isLoading || (this._hasLoaded && !force)) {\n return;\n }\n\n const startTime = Date.now();\n\n // Emit before event\n const beforeArgs: BeforeLoadArgs = {\n cancel: false,\n groups: this._groups,\n isIncremental: false\n };\n this.beforeLoad.emit(beforeArgs);\n\n if (beforeArgs.cancel) {\n return;\n }\n\n this.isLoading = true;\n this.cdr.markForCheck();\n\n try {\n // Clear existing data\n this.allEvents = [];\n this.segments = [];\n this.scrollState = { ...DEFAULT_VIRTUAL_SCROLL_STATE };\n\n // Load data from all groups\n await this.loadAllGroups();\n\n // Group into segments\n this.buildSegments();\n\n this._hasLoaded = true;\n this.isInitialized = true;\n\n // Emit after event\n const afterArgs: AfterLoadArgs = {\n success: true,\n eventsLoaded: this.allEvents.length,\n totalEvents: this.allEvents.length,\n loadTimeMs: Date.now() - startTime,\n hasMore: this.scrollState.hasMore\n };\n this.afterLoad.emit(afterArgs);\n } catch (error) {\n console.error('Timeline: Error loading data', error);\n\n const afterArgs: AfterLoadArgs = {\n success: false,\n errorMessage: error instanceof Error ? error.message : 'Unknown error',\n eventsLoaded: 0,\n totalEvents: 0,\n loadTimeMs: Date.now() - startTime,\n hasMore: false\n };\n this.afterLoad.emit(afterArgs);\n } finally {\n this.isLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Loads more events (for virtual scrolling).\n */\n async loadMore(): Promise<void> {\n if (!this.virtualScroll.enabled || this.scrollState.isLoading || !this.scrollState.hasMore) {\n return;\n }\n\n const startTime = Date.now();\n\n // Emit before event\n const beforeArgs: BeforeLoadArgs = {\n cancel: false,\n groups: this._groups,\n isIncremental: true,\n offset: this.scrollState.loadedCount,\n batchSize: this.virtualScroll.batchSize\n };\n this.beforeLoad.emit(beforeArgs);\n\n if (beforeArgs.cancel) {\n return;\n }\n\n this.scrollState.isLoading = true;\n this.cdr.markForCheck();\n\n try {\n const previousCount = this.allEvents.length;\n\n // Load next batch from all groups\n await this.loadNextBatch();\n\n // Rebuild segments with new data\n this.buildSegments();\n\n const newCount = this.allEvents.length - previousCount;\n\n // Emit after event\n const afterArgs: AfterLoadArgs = {\n success: true,\n eventsLoaded: newCount,\n totalEvents: this.allEvents.length,\n loadTimeMs: Date.now() - startTime,\n hasMore: this.scrollState.hasMore\n };\n this.afterLoad.emit(afterArgs);\n } catch (error) {\n console.error('Timeline: Error loading more data', error);\n } finally {\n this.scrollState.isLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Expands all event cards.\n */\n expandAllEvents(): void {\n for (const event of this.allEvents) {\n if (!event.isExpanded) {\n this.setEventExpanded(event, true);\n }\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Collapses all event cards.\n */\n collapseAllEvents(): void {\n for (const event of this.allEvents) {\n if (event.isExpanded) {\n this.setEventExpanded(event, false);\n }\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Expands all time segments.\n */\n expandAllSegments(): void {\n for (const segment of this.segments) {\n if (!segment.isExpanded) {\n this.setSegmentExpanded(segment, true);\n }\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Collapses all time segments.\n */\n collapseAllSegments(): void {\n for (const segment of this.segments) {\n if (segment.isExpanded) {\n this.setSegmentExpanded(segment, false);\n }\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Expands a specific event by ID.\n */\n expandEvent(eventId: string): void {\n const event = this.getEvent(eventId);\n if (event && !event.isExpanded) {\n this.setEventExpanded(event, true);\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Collapses a specific event by ID.\n */\n collapseEvent(eventId: string): void {\n const event = this.getEvent(eventId);\n if (event && event.isExpanded) {\n this.setEventExpanded(event, false);\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Scrolls to a specific event.\n */\n scrollToEvent(eventId: string, behavior: ScrollBehavior = 'smooth'): void {\n const element = this.elementRef.nativeElement.querySelector(`[data-event-id=\"${eventId}\"]`);\n if (element) {\n element.scrollIntoView({ behavior, block: 'center' });\n }\n }\n\n /**\n * Scrolls to a specific date.\n */\n scrollToDate(date: Date, behavior: ScrollBehavior = 'smooth'): void {\n // Find the segment containing this date\n const segment = this.segments.find(s =>\n date >= s.startDate && date < s.endDate\n );\n\n if (segment) {\n const element = this.elementRef.nativeElement.querySelector(\n `[data-segment-label=\"${segment.label}\"]`\n );\n if (element) {\n element.scrollIntoView({ behavior, block: 'start' });\n }\n }\n }\n\n /**\n * Gets an event by ID.\n */\n getEvent(eventId: string): MJTimelineEvent<T> | undefined {\n return this.allEvents.find(e => e.id === eventId);\n }\n\n /**\n * Gets all events (flattened).\n */\n getAllEvents(): MJTimelineEvent<T>[] {\n return [...this.allEvents];\n }\n\n // ============================================================================\n // EVENT HANDLERS (Template bindings)\n // ============================================================================\n\n /**\n * Handles click on an event card.\n */\n onEventClick(event: MJTimelineEvent<T>, index: number, domEvent: Event): void {\n const group = this._groups[event.groupIndex];\n\n // Emit before event\n const beforeArgs: BeforeEventClickArgs<T> = {\n cancel: false,\n event,\n group,\n index,\n domEvent\n };\n this.beforeEventClick.emit(beforeArgs);\n\n if (beforeArgs.cancel) {\n return;\n }\n\n // Default behavior: toggle expand/collapse if collapsible\n const cardConfig = this.getEffectiveCardConfig(event);\n if (cardConfig.collapsible) {\n this.toggleEventExpanded(event, index, domEvent);\n }\n\n // Emit after event\n const afterArgs: AfterEventClickArgs<T> = {\n success: true,\n event,\n group,\n index,\n domEvent\n };\n this.afterEventClick.emit(afterArgs);\n }\n\n /**\n * Handles expand/collapse toggle on an event.\n */\n onToggleExpand(event: MJTimelineEvent<T>, index: number, domEvent: Event): void {\n domEvent.stopPropagation();\n this.toggleEventExpanded(event, index, domEvent);\n }\n\n /**\n * Handles mouse enter on an event card.\n */\n onEventMouseEnter(event: MJTimelineEvent<T>, index: number, domEvent: Event): void {\n const group = this._groups[event.groupIndex];\n\n const beforeArgs: BeforeEventHoverArgs<T> = {\n cancel: false,\n event,\n group,\n index,\n domEvent,\n hoverState: 'enter'\n };\n this.beforeEventHover.emit(beforeArgs);\n\n if (!beforeArgs.cancel) {\n const afterArgs: AfterEventHoverArgs<T> = {\n success: true,\n event,\n group,\n index,\n domEvent,\n hoverState: 'enter'\n };\n this.afterEventHover.emit(afterArgs);\n }\n }\n\n /**\n * Handles mouse leave on an event card.\n */\n onEventMouseLeave(event: MJTimelineEvent<T>, index: number, domEvent: Event): void {\n const group = this._groups[event.groupIndex];\n\n const beforeArgs: BeforeEventHoverArgs<T> = {\n cancel: false,\n event,\n group,\n index,\n domEvent,\n hoverState: 'leave'\n };\n this.beforeEventHover.emit(beforeArgs);\n\n if (!beforeArgs.cancel) {\n const afterArgs: AfterEventHoverArgs<T> = {\n success: true,\n event,\n group,\n index,\n domEvent,\n hoverState: 'leave'\n };\n this.afterEventHover.emit(afterArgs);\n }\n }\n\n /**\n * Handles action button click.\n */\n onActionClick(event: MJTimelineEvent<T>, action: TimelineAction, index: number, domEvent: Event): void {\n domEvent.stopPropagation();\n\n if (action.disabled) {\n return;\n }\n\n const group = this._groups[event.groupIndex];\n\n const beforeArgs: BeforeActionClickArgs<T> = {\n cancel: false,\n event,\n group,\n index,\n domEvent,\n action\n };\n this.beforeActionClick.emit(beforeArgs);\n\n if (!beforeArgs.cancel) {\n const afterArgs: AfterActionClickArgs<T> = {\n success: true,\n event,\n group,\n index,\n domEvent,\n action\n };\n this.afterActionClick.emit(afterArgs);\n }\n }\n\n /**\n * Handles segment header click.\n */\n onSegmentClick(segment: TimelineSegment): void {\n if (!this.segmentsCollapsible) {\n return;\n }\n\n if (segment.isExpanded) {\n this.collapseSegment(segment);\n } else {\n this.expandSegment(segment);\n }\n }\n\n /**\n * Handles scroll events for virtual scrolling.\n */\n onScroll(event: Event): void {\n this._scroll$.next(event);\n }\n\n /**\n * Handles keyboard navigation.\n */\n onKeyDown(event: KeyboardEvent): void {\n if (!this.enableKeyboardNavigation) {\n return;\n }\n\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowRight':\n event.preventDefault();\n this.focusNextEvent();\n break;\n\n case 'ArrowUp':\n case 'ArrowLeft':\n event.preventDefault();\n this.focusPreviousEvent();\n break;\n\n case 'Enter':\n case ' ':\n event.preventDefault();\n this.activateFocusedEvent();\n break;\n\n case 'Escape':\n event.preventDefault();\n this.collapseFocusedEvent();\n break;\n\n case 'Home':\n event.preventDefault();\n this.focusFirstEvent();\n break;\n\n case 'End':\n event.preventDefault();\n this.focusLastEvent();\n break;\n }\n }\n\n // ============================================================================\n // TEMPLATE HELPERS\n // ============================================================================\n\n /**\n * Gets the effective card config for an event.\n */\n getEffectiveCardConfig(event: MJTimelineEvent<T>): TimelineCardConfig {\n const group = this._groups[event.groupIndex];\n return {\n ...this.defaultCardConfig,\n ...group?.CardConfig,\n ...this.mapEventConfigToCardConfig(event.config)\n };\n }\n\n /**\n * Gets the color for a group/event.\n */\n getColor(event: MJTimelineEvent<T>): string {\n if (event.config?.color) {\n return event.config.color;\n }\n\n const group = this._groups[event.groupIndex];\n if (group?.DisplayColorMode === 'manual' && group.DisplayColor) {\n return group.DisplayColor;\n }\n\n return AUTO_COLORS[event.groupIndex % AUTO_COLORS.length];\n }\n\n /**\n * Gets the icon for a group/event.\n */\n getIcon(event: MJTimelineEvent<T>): string {\n if (event.config?.icon) {\n return event.config.icon;\n }\n\n const group = this._groups[event.groupIndex];\n if (group?.DisplayIconMode === 'custom' && group.DisplayIcon) {\n return group.DisplayIcon;\n }\n\n return DEFAULT_ICONS[event.groupIndex % DEFAULT_ICONS.length];\n }\n\n /**\n * Gets the actions for an event.\n */\n getActions(event: MJTimelineEvent<T>): TimelineAction[] {\n if (event.config?.actions) {\n return event.config.actions;\n }\n\n const cardConfig = this.getEffectiveCardConfig(event);\n return cardConfig.actions || [];\n }\n\n /**\n * Formats a date for display.\n */\n formatDate(date: Date, format?: string): string {\n const fmt = format || this.defaultCardConfig.dateFormat || 'MMM d, yyyy';\n return this.formatDateInternal(date, fmt);\n }\n\n /**\n * Gets the value of a display field from an event.\n */\n getFieldValue(event: MJTimelineEvent<T>, field: TimelineDisplayField): string {\n const value = getFieldValue(event.entity, field.fieldName);\n\n if (field.formatter) {\n return field.formatter(value);\n }\n\n if (value == null) {\n return '';\n }\n\n if (field.format && value instanceof Date) {\n return this.formatDateInternal(value, field.format);\n }\n\n return String(value);\n }\n\n /**\n * Track by function for ngFor.\n */\n trackByEventId(_index: number, event: MJTimelineEvent<T>): string {\n return event.id;\n }\n\n /**\n * Track by function for segments.\n */\n trackBySegmentLabel(_index: number, segment: TimelineSegment): string {\n return segment.label;\n }\n\n /**\n * Gets the global index of an event in the allEvents array.\n */\n getGlobalIndex(event: MJTimelineEvent<T>): number {\n return this.allEvents.indexOf(event);\n }\n\n /**\n * Checks if an event is currently selected/focused.\n * An event is selected if either:\n * - Its ID matches the selectedEventId input\n * - Its global index matches the focusedEventIndex (keyboard navigation)\n */\n isEventSelected(event: MJTimelineEvent<T>, globalIndex: number): boolean {\n // Check selectedEventId from parent first (takes priority)\n if (this.selectedEventId && event.id === this.selectedEventId) {\n return true;\n }\n // Fall back to keyboard navigation focus\n return this.focusedEventIndex === globalIndex;\n }\n\n // ============================================================================\n // PRIVATE METHODS - DATA LOADING\n // ============================================================================\n\n /**\n * Loads data from all groups.\n */\n private async loadAllGroups(): Promise<void> {\n for (let groupIndex = 0; groupIndex < this._groups.length; groupIndex++) {\n const group = this._groups[groupIndex];\n await this.loadGroup(group, groupIndex);\n }\n\n // Sort all events by date\n this.sortEvents();\n\n // Update scroll state\n this.scrollState.loadedCount = this.allEvents.length;\n this.scrollState.hasMore = false; // TODO: Implement proper pagination detection\n }\n\n /**\n * Loads data from a single group.\n */\n private async loadGroup(group: TimelineGroup<T>, groupIndex: number): Promise<void> {\n let records: T[] = [];\n\n if (group.DataSourceType === 'array') {\n records = group.EntityObjects || [];\n } else if (group.DataSourceType === 'entity' && group.EntityName) {\n records = await this.loadFromEntity(group);\n }\n\n // Convert records to timeline events\n for (const record of records) {\n const event = this.createTimelineEvent(record, group, groupIndex);\n this.allEvents.push(event);\n }\n }\n\n /**\n * Loads data from MemberJunction entity.\n */\n private async loadFromEntity(group: TimelineGroup<T>): Promise<T[]> {\n try {\n const { RunView } = await import('@memberjunction/core');\n const rv = new RunView();\n\n const result = await rv.RunView({\n EntityName: group.EntityName,\n ExtraFilter: group.Filter,\n OrderBy: group.OrderBy,\n MaxRows: group.MaxRecords,\n ResultType: 'entity_object'\n });\n\n if (result?.Success) {\n return result.Results as T[];\n }\n } catch (error) {\n console.warn('Timeline: Could not load from entity. Is @memberjunction/core available?', error);\n }\n\n return [];\n }\n\n /**\n * Loads the next batch for virtual scrolling.\n */\n private async loadNextBatch(): Promise<void> {\n // TODO: Implement proper batch loading with offset/limit\n // For now, this is a placeholder\n }\n\n /**\n * Creates a timeline event from a source record.\n */\n private createTimelineEvent(record: T, group: TimelineGroup<T>, groupIndex: number): MJTimelineEvent<T> {\n const cardConfig = group.getEffectiveCardConfig();\n\n return {\n id: group.getId(record),\n entity: record,\n title: group.getTitle(record),\n date: group.getDate(record),\n subtitle: group.getSubtitle(record),\n description: group.getDescription(record),\n imageUrl: group.getImageUrl(record),\n config: group.getEventConfig(record),\n groupIndex,\n isExpanded: cardConfig.defaultExpanded ?? false\n };\n }\n\n /**\n * Sorts events by date according to sortOrder.\n */\n private sortEvents(): void {\n this.allEvents.sort((a, b) => {\n const diff = a.date.getTime() - b.date.getTime();\n return this.sortOrder === 'asc' ? diff : -diff;\n });\n }\n\n // ============================================================================\n // PRIVATE METHODS - SEGMENTATION\n // ============================================================================\n\n /**\n * Builds time segments from events.\n */\n private buildSegments(): void {\n if (this.segmentGrouping === 'none') {\n this.segments = [];\n return;\n }\n\n const segmentMap = new Map<string, TimelineSegment>();\n\n for (const event of this.allEvents) {\n const { label, startDate, endDate } = this.getSegmentInfo(event.date);\n\n if (!segmentMap.has(label)) {\n segmentMap.set(label, {\n label,\n startDate,\n endDate,\n events: [],\n isExpanded: this.segmentsDefaultExpanded,\n eventCount: 0\n });\n }\n\n const segment = segmentMap.get(label)!;\n segment.events.push(event);\n segment.eventCount++;\n }\n\n // Convert to array and sort\n this.segments = Array.from(segmentMap.values());\n this.segments.sort((a, b) => {\n const diff = a.startDate.getTime() - b.startDate.getTime();\n return this.sortOrder === 'asc' ? diff : -diff;\n });\n }\n\n /**\n * Gets segment information for a date.\n */\n private getSegmentInfo(date: Date): { label: string; startDate: Date; endDate: Date } {\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n\n switch (this.segmentGrouping) {\n case 'day':\n return {\n label: this.formatDateInternal(date, 'MMMM d, yyyy'),\n startDate: new Date(year, month, day),\n endDate: new Date(year, month, day + 1)\n };\n\n case 'week':\n const weekStart = new Date(date);\n weekStart.setDate(day - date.getDay());\n const weekEnd = new Date(weekStart);\n weekEnd.setDate(weekStart.getDate() + 7);\n return {\n label: `Week of ${this.formatDateInternal(weekStart, 'MMM d, yyyy')}`,\n startDate: weekStart,\n endDate: weekEnd\n };\n\n case 'month':\n return {\n label: this.formatDateInternal(new Date(year, month, 1), 'MMMM yyyy'),\n startDate: new Date(year, month, 1),\n endDate: new Date(year, month + 1, 1)\n };\n\n case 'quarter':\n const quarter = Math.floor(month / 3);\n return {\n label: `Q${quarter + 1} ${year}`,\n startDate: new Date(year, quarter * 3, 1),\n endDate: new Date(year, (quarter + 1) * 3, 1)\n };\n\n case 'year':\n return {\n label: String(year),\n startDate: new Date(year, 0, 1),\n endDate: new Date(year + 1, 0, 1)\n };\n\n default:\n return {\n label: this.formatDateInternal(date, 'MMMM yyyy'),\n startDate: new Date(year, month, 1),\n endDate: new Date(year, month + 1, 1)\n };\n }\n }\n\n // ============================================================================\n // PRIVATE METHODS - EXPAND/COLLAPSE\n // ============================================================================\n\n /**\n * Toggles event expanded state.\n */\n private toggleEventExpanded(event: MJTimelineEvent<T>, index: number, domEvent?: Event): void {\n if (event.isExpanded) {\n this.collapseEventInternal(event, index, domEvent);\n } else {\n this.expandEventInternal(event, index, domEvent);\n }\n }\n\n /**\n * Sets event expanded state.\n */\n private setEventExpanded(event: MJTimelineEvent<T>, expanded: boolean): void {\n event.isExpanded = expanded;\n }\n\n /**\n * Expands an event with events.\n */\n private expandEventInternal(event: MJTimelineEvent<T>, index: number, domEvent?: Event): void {\n const group = this._groups[event.groupIndex];\n\n const beforeArgs: BeforeEventExpandArgs<T> = {\n cancel: false,\n event,\n group,\n index,\n domEvent\n };\n this.beforeEventExpand.emit(beforeArgs);\n\n if (beforeArgs.cancel) {\n return;\n }\n\n event.isExpanded = true;\n this.cdr.markForCheck();\n\n const afterArgs: AfterEventExpandArgs<T> = {\n success: true,\n event,\n group,\n index,\n domEvent\n };\n this.afterEventExpand.emit(afterArgs);\n }\n\n /**\n * Collapses an event with events.\n */\n private collapseEventInternal(event: MJTimelineEvent<T>, index: number, domEvent?: Event): void {\n const group = this._groups[event.groupIndex];\n\n const beforeArgs: BeforeEventCollapseArgs<T> = {\n cancel: false,\n event,\n group,\n index,\n domEvent\n };\n this.beforeEventCollapse.emit(beforeArgs);\n\n if (beforeArgs.cancel) {\n return;\n }\n\n event.isExpanded = false;\n this.cdr.markForCheck();\n\n const afterArgs: AfterEventCollapseArgs<T> = {\n success: true,\n event,\n group,\n index,\n domEvent\n };\n this.afterEventCollapse.emit(afterArgs);\n }\n\n /**\n * Expands a segment.\n */\n private expandSegment(segment: TimelineSegment): void {\n const beforeArgs: BeforeSegmentExpandArgs = {\n cancel: false,\n segment,\n label: segment.label,\n startDate: segment.startDate,\n endDate: segment.endDate,\n eventCount: segment.eventCount\n };\n this.beforeSegmentExpand.emit(beforeArgs);\n\n if (beforeArgs.cancel) {\n return;\n }\n\n segment.isExpanded = true;\n this.cdr.markForCheck();\n\n const afterArgs: AfterSegmentExpandArgs = {\n success: true,\n segment,\n label: segment.label,\n startDate: segment.startDate,\n endDate: segment.endDate,\n eventCount: segment.eventCount\n };\n this.afterSegmentExpand.emit(afterArgs);\n }\n\n /**\n * Collapses a segment.\n */\n private collapseSegment(segment: TimelineSegment): void {\n const beforeArgs: BeforeSegmentCollapseArgs = {\n cancel: false,\n segment,\n label: segment.label,\n startDate: segment.startDate,\n endDate: segment.endDate,\n eventCount: segment.eventCount\n };\n this.beforeSegmentCollapse.emit(beforeArgs);\n\n if (beforeArgs.cancel) {\n return;\n }\n\n segment.isExpanded = false;\n this.cdr.markForCheck();\n\n const afterArgs: AfterSegmentCollapseArgs = {\n success: true,\n segment,\n label: segment.label,\n startDate: segment.startDate,\n endDate: segment.endDate,\n eventCount: segment.eventCount\n };\n this.afterSegmentCollapse.emit(afterArgs);\n }\n\n /**\n * Sets segment expanded state without events.\n */\n private setSegmentExpanded(segment: TimelineSegment, expanded: boolean): void {\n segment.isExpanded = expanded;\n }\n\n // ============================================================================\n // PRIVATE METHODS - KEYBOARD NAVIGATION\n // ============================================================================\n\n private focusNextEvent(): void {\n if (this.allEvents.length === 0) return;\n\n this.focusedEventIndex = Math.min(\n this.focusedEventIndex + 1,\n this.allEvents.length - 1\n );\n this.scrollToFocusedEvent();\n }\n\n private focusPreviousEvent(): void {\n if (this.allEvents.length === 0) return;\n\n this.focusedEventIndex = Math.max(this.focusedEventIndex - 1, 0);\n this.scrollToFocusedEvent();\n }\n\n private focusFirstEvent(): void {\n if (this.allEvents.length === 0) return;\n\n this.focusedEventIndex = 0;\n this.scrollToFocusedEvent();\n }\n\n private focusLastEvent(): void {\n if (this.allEvents.length === 0) return;\n\n this.focusedEventIndex = this.allEvents.length - 1;\n this.scrollToFocusedEvent();\n }\n\n private activateFocusedEvent(): void {\n if (this.focusedEventIndex >= 0 && this.focusedEventIndex < this.allEvents.length) {\n const event = this.allEvents[this.focusedEventIndex];\n this.toggleEventExpanded(event, this.focusedEventIndex);\n }\n }\n\n private collapseFocusedEvent(): void {\n if (this.focusedEventIndex >= 0 && this.focusedEventIndex < this.allEvents.length) {\n const event = this.allEvents[this.focusedEventIndex];\n if (event.isExpanded) {\n this.collapseEventInternal(event, this.focusedEventIndex);\n }\n }\n }\n\n private scrollToFocusedEvent(): void {\n if (this.focusedEventIndex >= 0 && this.focusedEventIndex < this.allEvents.length) {\n const event = this.allEvents[this.focusedEventIndex];\n this.scrollToEvent(event.id, 'smooth');\n }\n this.cdr.markForCheck();\n }\n\n // ============================================================================\n // PRIVATE METHODS - VIRTUAL SCROLLING\n // ============================================================================\n\n private setupIntersectionObserver(): void {\n if (!this.virtualScroll.enabled) return;\n\n // Use requestAnimationFrame to ensure DOM is ready\n requestAnimationFrame(() => {\n const sentinel = this.elementRef.nativeElement.querySelector('.mj-timeline-scroll-sentinel');\n if (!sentinel) return;\n\n this._intersectionObserver = new IntersectionObserver(\n (entries) => {\n const entry = entries[0];\n if (entry?.isIntersecting && !this.scrollState.isLoading && this.scrollState.hasMore) {\n this.ngZone.run(() => this.loadMore());\n }\n },\n {\n root: this.scrollContainer?.nativeElement,\n threshold: 0,\n rootMargin: `${this.virtualScroll.loadThreshold}px`\n }\n );\n\n this._intersectionObserver.observe(sentinel);\n });\n }\n\n private onScrollCheck(): void {\n if (!this.scrollContainer?.nativeElement || !this.virtualScroll.enabled) {\n return;\n }\n\n const el = this.scrollContainer.nativeElement;\n this.scrollState.scrollOffset = el.scrollTop;\n\n const distanceFromBottom = el.scrollHeight - el.scrollTop - el.clientHeight;\n if (distanceFromBottom < this.virtualScroll.loadThreshold && this.scrollState.hasMore) {\n this.loadMore();\n }\n }\n\n // ============================================================================\n // PRIVATE METHODS - UTILITIES\n // ============================================================================\n\n /**\n * Maps event config to card config properties.\n */\n private mapEventConfigToCardConfig(config: TimelineEventConfig = {}): Partial<TimelineCardConfig> {\n return {\n collapsible: config.collapsible,\n defaultExpanded: config.defaultExpanded,\n actions: config.actions\n };\n }\n\n /**\n * Simple date formatter (replaces Angular DatePipe for standalone use).\n * Uses placeholder tokens to avoid replacement conflicts.\n */\n private formatDateInternal(date: Date, format: string): string {\n const months = ['January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'];\n const monthsShort = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n const hours = date.getHours();\n const minutes = date.getMinutes();\n\n // Use placeholder tokens to avoid conflicts (e.g., 'May' containing 'M')\n // Replace longer patterns first with placeholders, then substitute values\n let result = format;\n\n // Replace patterns with unique placeholders first\n result = result.replace(/yyyy/g, '{{YEAR}}');\n result = result.replace(/MMMM/g, '{{MONTH_FULL}}');\n result = result.replace(/MMM/g, '{{MONTH_SHORT}}');\n result = result.replace(/MM/g, '{{MONTH_PAD}}');\n result = result.replace(/dd/g, '{{DAY_PAD}}');\n result = result.replace(/d/g, '{{DAY}}');\n result = result.replace(/HH/g, '{{HOUR_24}}');\n result = result.replace(/hh/g, '{{HOUR_12_PAD}}');\n result = result.replace(/h/g, '{{HOUR_12}}');\n result = result.replace(/mm/g, '{{MIN}}');\n result = result.replace(/a/g, '{{AMPM}}');\n\n // Now substitute the actual values\n result = result.replace(/\\{\\{YEAR\\}\\}/g, String(year));\n result = result.replace(/\\{\\{MONTH_FULL\\}\\}/g, months[month]);\n result = result.replace(/\\{\\{MONTH_SHORT\\}\\}/g, monthsShort[month]);\n result = result.replace(/\\{\\{MONTH_PAD\\}\\}/g, String(month + 1).padStart(2, '0'));\n result = result.replace(/\\{\\{DAY_PAD\\}\\}/g, String(day).padStart(2, '0'));\n result = result.replace(/\\{\\{DAY\\}\\}/g, String(day));\n result = result.replace(/\\{\\{HOUR_24\\}\\}/g, String(hours).padStart(2, '0'));\n result = result.replace(/\\{\\{HOUR_12_PAD\\}\\}/g, String(hours % 12 || 12).padStart(2, '0'));\n result = result.replace(/\\{\\{HOUR_12\\}\\}/g, String(hours % 12 || 12));\n result = result.replace(/\\{\\{MIN\\}\\}/g, String(minutes).padStart(2, '0'));\n result = result.replace(/\\{\\{AMPM\\}\\}/g, hours >= 12 ? 'PM' : 'AM');\n\n return result;\n }\n}\n","<!--\nMJ Timeline Component Template\n\nStructure:\n- Loading state\n- Empty state\n- Timeline container (vertical/horizontal)\n- Time segments (collapsible)\n- Segment header\n- Event cards within segment\n- Or flat list of events (when segmentGrouping='none')\n- Virtual scroll sentinel\n-->\n\n<div\n class=\"mj-timeline\"\n [class.mj-timeline--vertical]=\"orientation === 'vertical'\"\n [class.mj-timeline--horizontal]=\"orientation === 'horizontal'\"\n [class.mj-timeline--single]=\"layout === 'single'\"\n [class.mj-timeline--alternating]=\"layout === 'alternating'\"\n [attr.aria-label]=\"ariaLabel\"\n role=\"list\"\n tabindex=\"0\"\n (keydown)=\"onKeyDown($event)\"\n #scrollContainer\n (scroll)=\"onScroll($event)\">\n\n <!-- Loading State -->\n @if (isLoading && !isInitialized) {\n @if (loadingTemplate) {\n <ng-container *ngTemplateOutlet=\"loadingTemplate\"></ng-container>\n } @else {\n <div class=\"mj-timeline__loading\">\n <div class=\"mj-timeline__loading-spinner\"></div>\n <span class=\"mj-timeline__loading-text\">{{ loadingMessage }}</span>\n </div>\n }\n }\n\n <!-- Empty State -->\n @if (isInitialized && allEvents.length === 0 && !isLoading) {\n @if (emptyTemplate) {\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\n } @else {\n <div class=\"mj-timeline__empty\">\n <i [class]=\"emptyIcon\" class=\"mj-timeline__empty-icon\"></i>\n <span class=\"mj-timeline__empty-text\">{{ emptyMessage }}</span>\n </div>\n }\n }\n\n <!-- Timeline Content -->\n @if (isInitialized && allEvents.length > 0) {\n <!-- Segmented View -->\n @if (segmentGrouping !== 'none') {\n @for (segment of segments; track trackBySegmentLabel(segmentIndex, segment); let segmentIndex = $index) {\n <div\n class=\"mj-timeline__segment\"\n [class.mj-timeline__segment--collapsed]=\"!segment.isExpanded\"\n [attr.data-segment-label]=\"segment.label\">\n <!-- Segment Header -->\n <div\n class=\"mj-timeline__segment-header\"\n [class.mj-timeline__segment-header--clickable]=\"segmentsCollapsible\"\n (click)=\"onSegmentClick(segment)\"\n role=\"button\"\n [attr.aria-expanded]=\"segment.isExpanded\"\n [attr.aria-controls]=\"'segment-content-' + segmentIndex\">\n @if (segmentHeaderTemplate) {\n <ng-container *ngTemplateOutlet=\"segmentHeaderTemplate; context: { segment: segment }\"></ng-container>\n } @else {\n @if (segmentsCollapsible) {\n <span class=\"mj-timeline__segment-toggle\">\n <i [class]=\"segment.isExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n </span>\n }\n <span class=\"mj-timeline__segment-label\">{{ segment.label }}</span>\n <span class=\"mj-timeline__segment-count\">({{ segment.eventCount }} {{ segment.eventCount === 1 ? 'event' : 'events' }})</span>\n <span class=\"mj-timeline__segment-line\"></span>\n }\n </div>\n <!-- Segment Content -->\n <div\n class=\"mj-timeline__segment-content\"\n [id]=\"'segment-content-' + segmentIndex\"\n [class.mj-timeline__segment-content--hidden]=\"!segment.isExpanded\">\n <div class=\"mj-timeline__axis\">\n <!-- Events in Segment -->\n @for (event of segment.events; track trackByEventId(eventIndex, event); let eventIndex = $index; let isOdd = $odd) {\n <ng-container *ngTemplateOutlet=\"eventCard; context: {\n event: event,\n index: eventIndex,\n isOdd: isOdd,\n globalIndex: getGlobalIndex(event)\n }\"></ng-container>\n }\n </div>\n </div>\n </div>\n }\n }\n <!-- Flat View (no segments) -->\n @if (segmentGrouping === 'none') {\n <div class=\"mj-timeline__axis\">\n @for (event of allEvents; track trackByEventId(eventIndex, event); let eventIndex = $index; let isOdd = $odd) {\n <ng-container *ngTemplateOutlet=\"eventCard; context: {\n event: event,\n index: eventIndex,\n isOdd: isOdd,\n globalIndex: eventIndex\n }\"></ng-container>\n }\n </div>\n }\n }\n\n <!-- Virtual Scroll Sentinel -->\n @if (virtualScroll.enabled && scrollState.hasMore) {\n <div\n class=\"mj-timeline-scroll-sentinel\"\n >\n </div>\n }\n\n <!-- Loading More Indicator -->\n @if (scrollState.isLoading && virtualScroll.showLoadingIndicator) {\n <div\n class=\"mj-timeline__loading-more\"\n >\n <div class=\"mj-timeline__loading-spinner mj-timeline__loading-spinner--small\"></div>\n <span>{{ virtualScroll.loadingMessage }}</span>\n </div>\n }\n\n</div>\n\n<!-- Event Card Template -->\n<ng-template #eventCard let-event=\"event\" let-index=\"index\" let-isOdd=\"isOdd\" let-globalIndex=\"globalIndex\">\n <div\n class=\"mj-timeline__event\"\n [class.mj-timeline__event--odd]=\"isOdd && layout === 'alternating'\"\n [class.mj-timeline__event--even]=\"!isOdd && layout === 'alternating'\"\n [class.mj-timeline__event--expanded]=\"event.isExpanded\"\n [class.mj-timeline__event--focused]=\"isEventSelected(event, globalIndex)\"\n [attr.data-event-id]=\"event.id\"\n role=\"listitem\"\n [attr.aria-expanded]=\"event.isExpanded\">\n\n <!-- Timeline Marker -->\n <div class=\"mj-timeline__marker\" [style.background-color]=\"getColor(event)\">\n <i [class]=\"getIcon(event)\" class=\"mj-timeline__marker-icon\"></i>\n </div>\n\n <!-- Connector Line -->\n <div class=\"mj-timeline__connector\" [style.background-color]=\"getColor(event)\"></div>\n\n <!-- Date Label (for alternating layout) -->\n @if (layout === 'alternating') {\n <div class=\"mj-timeline__date-label\">\n {{ formatDate(event.date) }}\n </div>\n }\n\n <!-- Event Card -->\n <div\n class=\"mj-timeline__card\"\n [ngClass]=\"getEffectiveCardConfig(event).cssClass\"\n [style.max-width]=\"getEffectiveCardConfig(event).maxWidth\"\n [style.min-width]=\"getEffectiveCardConfig(event).minWidth\"\n [style.border-left-color]=\"getColor(event)\"\n (click)=\"onEventClick(event, globalIndex, $event)\"\n (mouseenter)=\"onEventMouseEnter(event, globalIndex, $event)\"\n (mouseleave)=\"onEventMouseLeave(event, globalIndex, $event)\">\n\n <!-- Custom Card Template -->\n @if (cardTemplate) {\n <ng-container *ngTemplateOutlet=\"cardTemplate; context: {\n event: event,\n group: groups[event.groupIndex]\n }\"></ng-container>\n } @else {\n <!-- Card Header -->\n <div class=\"mj-timeline__card-header\">\n <!-- Image (left position) -->\n @if (event.imageUrl && getEffectiveCardConfig(event).imagePosition === 'left') {\n <div\n class=\"mj-timeline__card-image mj-timeline__card-image--left\"\n [class.mj-timeline__card-image--small]=\"getEffectiveCardConfig(event).imageSize === 'small'\"\n [class.mj-timeline__card-image--medium]=\"getEffectiveCardConfig(event).imageSize === 'medium'\"\n [class.mj-timeline__card-image--large]=\"getEffectiveCardConfig(event).imageSize === 'large'\">\n <img [src]=\"event.imageUrl\" [alt]=\"event.title\" />\n </div>\n }\n <div class=\"mj-timeline__card-header-content\">\n <!-- Custom Header Template -->\n @if (headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: { event: event }\"></ng-container>\n } @else {\n <!-- Icon -->\n @if (getEffectiveCardConfig(event).showIcon) {\n <span\n class=\"mj-timeline__card-icon\"\n [style.color]=\"getColor(event)\">\n <i [class]=\"getIcon(event)\"></i>\n </span>\n }\n <!-- Title & Subtitle -->\n <div class=\"mj-timeline__card-titles\">\n <h4 class=\"mj-timeline__card-title\">{{ event.title }}</h4>\n @if (event.subtitle && getEffectiveCardConfig(event).showSubtitle) {\n <span\n class=\"mj-timeline__card-subtitle\"\n >\n {{ event.subtitle }}\n </span>\n }\n @if (getEffectiveCardConfig(event).showDate && layout !== 'alternating') {\n <span\n class=\"mj-timeline__card-date\"\n >\n {{ formatDate(event.date, getEffectiveCardConfig(event).dateFormat) }}\n </span>\n }\n </div>\n <!-- Expand/Collapse Toggle -->\n @if (getEffectiveCardConfig(event).collapsible) {\n <button\n class=\"mj-timeline__card-toggle\"\n (click)=\"onToggleExpand(event, globalIndex, $event)\"\n [attr.aria-label]=\"event.isExpanded ? 'Collapse' : 'Expand'\"\n type=\"button\">\n <i [class]=\"event.isExpanded ? 'fa-solid fa-chevron-up' : 'fa-solid fa-chevron-down'\"></i>\n </button>\n }\n }\n </div>\n </div>\n <!-- Image (top position) -->\n @if (event.imageUrl && getEffectiveCardConfig(event).imagePosition === 'top') {\n <div\n class=\"mj-timeline__card-image mj-timeline__card-image--top\"\n >\n <img [src]=\"event.imageUrl\" [alt]=\"event.title\" />\n </div>\n }\n <!-- Card Body -->\n <div\n class=\"mj-timeline__card-body\"\n [class.mj-timeline__card-body--collapsed]=\"!event.isExpanded && getEffectiveCardConfig(event).collapsible\">\n <!-- Custom Body Template -->\n @if (bodyTemplate) {\n <ng-container *ngTemplateOutlet=\"bodyTemplate; context: { event: event }\"></ng-container>\n } @else {\n <!-- Summary Fields (always visible) -->\n @if (getEffectiveCardConfig(event).summaryFields?.length) {\n <div\n class=\"mj-timeline__card-fields mj-timeline__card-fields--summary\"\n >\n @for (field of getEffectiveCardConfig(event).summaryFields; track field) {\n <div class=\"mj-timeline__card-field\" [ngClass]=\"field.cssClass\">\n @if (field.icon) {\n <i [ngClass]=\"field.icon\" class=\"mj-timeline__card-field-icon\"></i>\n }\n @if (!field.hideLabel && field.label) {\n <span class=\"mj-timeline__card-field-label\">{{ field.label }}:</span>\n }\n <span class=\"mj-timeline__card-field-value\">{{ getFieldValue(event, field) }}</span>\n </div>\n }\n </div>\n }\n <!-- Description (expanded view) -->\n @if (event.description && event.isExpanded) {\n <div\n class=\"mj-timeline__card-description\"\n [class.mj-timeline__card-description--clamped]=\"(getEffectiveCardConfig(event).descriptionMaxLines ?? 0) > 0\"\n [style.-webkit-line-clamp]=\"getEffectiveCardConfig(event).descriptionMaxLines || null\">\n @if (getEffectiveCardConfig(event).allowHtmlDescription) {\n <div [innerHTML]=\"event.description\"></div>\n } @else {\n {{ event.description }}\n }\n </div>\n }\n <!-- Expanded Fields -->\n @if (event.isExpanded && getEffectiveCardConfig(event).expandedFields?.length) {\n <div\n class=\"mj-timeline__card-fields mj-timeline__card-fields--expanded\"\n >\n @for (field of getEffectiveCardConfig(event).expandedFields; track field) {\n <div class=\"mj-timeline__card-field\" [ngClass]=\"field.cssClass\">\n @if (field.icon) {\n <i [ngClass]=\"field.icon\" class=\"mj-timeline__card-field-icon\"></i>\n }\n @if (!field.hideLabel) {\n <span class=\"mj-timeline__card-field-label\">{{ field.label || field.fieldName }}:</span>\n }\n <span class=\"mj-timeline__card-field-value\">{{ getFieldValue(event, field) }}</span>\n </div>\n }\n </div>\n }\n }\n </div>\n <!-- Card Actions -->\n @if (getActions(event).length > 0) {\n <div\n class=\"mj-timeline__card-actions\"\n [class.mj-timeline__card-actions--hover-only]=\"getEffectiveCardConfig(event).actionsOnHover\"\n >\n <!-- Custom Actions Template -->\n @if (actionsTemplate) {\n <ng-container *ngTemplateOutlet=\"actionsTemplate; context: {\n event: event,\n actions: getActions(event)\n }\"></ng-container>\n } @else {\n @for (action of getActions(event); track action) {\n <button\n class=\"mj-timeline__action\"\n [class.mj-timeline__action--primary]=\"action.variant === 'primary'\"\n [class.mj-timeline__action--secondary]=\"action.variant === 'secondary' || !action.variant\"\n [class.mj-timeline__action--danger]=\"action.variant === 'danger'\"\n [class.mj-timeline__action--link]=\"action.variant === 'link'\"\n [ngClass]=\"action.cssClass\"\n [disabled]=\"action.disabled\"\n [title]=\"action.tooltip || ''\"\n (click)=\"onActionClick(event, action, globalIndex, $event)\"\n type=\"button\">\n @if (action.icon) {\n <i [ngClass]=\"action.icon\"></i>\n }\n <span>{{ action.label }}</span>\n </button>\n }\n }\n </div>\n }\n }\n\n <!-- Default Card Template -->\n </div>\n </div>\n</ng-template>\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-timeline",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.40.0",
|
|
4
4
|
"description": "MemberJunction: Responsive timeline component for Angular. Works with MemberJunction entities or plain JavaScript objects. No external dependencies.",
|
|
5
5
|
"main": "./dist/public-api.js",
|
|
6
6
|
"typings": "./dist/public-api.d.ts",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
}
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@memberjunction/core": "5.
|
|
40
|
+
"@memberjunction/core": "5.40.0",
|
|
41
41
|
"rxjs": "~7.8.2",
|
|
42
42
|
"tslib": "^2.8.1"
|
|
43
43
|
},
|