or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

event-rendering.mdindex.mdplugin-definition.mdview-components.md
tile.json

event-rendering.mddocs/

Event Rendering

Event display and placement system supporting multiple display modes, overflow handling, and complex event positioning algorithms. Manages event rendering, visibility calculations, and user interactions within grid layouts.

Capabilities

Event Placement Computation

Core algorithm for computing event placement with support for event limits and overflow handling.

/**
 * Computes placement information for foreground event segments
 * Handles event limits, overflow, and positioning within grid cells
 * @param segs - Array of event segments to place
 * @param dayMaxEvents - Maximum events per day (boolean/number)
 * @param dayMaxEventRows - Maximum event rows per day (boolean/number)  
 * @param strictOrder - Whether to maintain strict event ordering
 * @param segHeights - Height information for each segment
 * @param maxContentHeight - Maximum available content height
 * @param cells - Day table cell information
 * @returns Placement information for rendering
 */
function computeFgSegPlacement(
  segs: TableSeg[],
  dayMaxEvents: boolean | number,
  dayMaxEventRows: boolean | number,
  strictOrder: boolean,
  segHeights: { [segUid: string]: number },
  maxContentHeight: number | null,
  cells: DayTableCell[]
): {
  singleColPlacements: TableSegPlacement[][];
  multiColPlacements: TableSegPlacement[][];
  moreCnts: number[];
  moreMarginTops: number[];
};

/**
 * Information about how an event segment should be positioned and displayed
 */
interface TableSegPlacement {
  seg: TableSeg;
  isVisible: boolean;
  isAbsolute: boolean;
  absoluteTop: number;
  marginTop: number;
}

Event Segment Management

Functions for generating unique identifiers and managing event segments.

/**
 * Generates unique key for event segment based on instance and column
 * @param seg - Table segment to generate key for
 * @returns Unique string key for the segment
 */
function generateSegKey(seg: TableSeg): string;

/**
 * Generates unique identifier for event segment including column span
 * @param seg - Table segment to generate UID for  
 * @returns Unique string identifier for the segment
 */
function generateSegUid(seg: TableSeg): string;

Event Display Detection

Utility for determining event display mode based on segment characteristics.

/**
 * Default time format for table events
 * Contains format options: { hour: 'numeric', minute: '2-digit', omitZeroMinute: true, meridiem: 'narrow' }
 */
const DEFAULT_TABLE_EVENT_TIME_FORMAT: DateFormatter;

/**
 * Determines if event segment should display as list item
 * @param seg - Table segment to check
 * @returns True if segment should use list item display
 */
function hasListItemDisplay(seg: TableSeg): boolean;

Table Segment Utilities

Functions for organizing and manipulating table segments.

/**
 * Splits event segments into arrays organized by row
 * @param segs - Array of table segments to split
 * @param rowCnt - Number of rows in the table
 * @returns Array of segment arrays, one per row
 */
function splitSegsByRow(segs: TableSeg[], rowCnt: number): TableSeg[][];

/**
 * Splits event segments into arrays organized by first column
 * @param segs - Array of table segments to split
 * @param colCnt - Number of columns in the table
 * @returns Array of segment arrays, one per column
 */
function splitSegsByFirstCol(segs: TableSeg[], colCnt: number): TableSeg[][];

/**
 * Splits interaction state into arrays organized by row
 * @param ui - Event interaction state to split
 * @param rowCnt - Number of rows in the table
 * @returns Array of interaction states, one per row
 */
function splitInteractionByRow(
  ui: EventSegUiInteractionState | null,
  rowCnt: number
): EventSegUiInteractionState[];

Event Rendering Components

React/Preact components for rendering different types of events.

/**
 * Component for rendering block-style events in table cells
 * Used for multi-day events and standard event blocks
 */
class TableBlockEvent extends Component<TableBlockEventProps> {
  render(): VNode;
}

interface TableBlockEventProps extends MinimalEventProps {
  defaultDisplayEventEnd: boolean;
}

/**
 * Component for rendering list-item-style events
 * Used for timed events in compact display mode
 */
class TableListItemEvent extends Component<TableListItemEventProps> {
  render(): VNode;
}

interface TableListItemEventProps {
  seg: TableSeg;
  isDragging: boolean;
  isSelected: boolean;
  isPast: boolean;
  isFuture: boolean;
  isToday: boolean;
  defaultDisplayEventEnd: boolean;
}

/**
 * Component for rendering "more events" links when events overflow
 * Handles click interactions to show additional events
 */
class TableCellMoreLink extends Component<TableCellMoreLinkProps> {
  render(): VNode;
}

interface TableCellMoreLinkProps {
  allDayDate: DateMarker;
  singlePlacements: TableSegPlacement[];
  moreCnt: number;
  alignmentElRef?: RefObject<HTMLElement>;
  alignGridTop: boolean;
  extraDateSpan?: Dictionary;
  dateProfile: DateProfile;
  todayRange: DateRange;
  eventSelection: string;
  eventDrag: EventSegUiInteractionState | null;
  eventResize: EventSegUiInteractionState | null;
}

Advanced Event Hierarchy

Specialized segment hierarchy for day grid event placement with hidden event handling.

/**
 * Specialized segment hierarchy for day grid layouts
 * Extends base SegHierarchy with day grid specific behavior for handling overlapping events
 */
class DayGridSegHierarchy extends SegHierarchy {
  hiddenConsumes: boolean;
  forceHidden: { [entryId: string]: true };
  
  /**
   * Adds segments to hierarchy and returns hidden segments
   * @param segInputs - Array of segment entries to add
   * @returns Array of segments that were hidden due to conflicts
   */
  addSegs(segInputs: SegEntry[]): SegEntry[];
  
  /**
   * Handles invalid insertion attempts by hiding conflicting segments
   * @param insertion - The attempted insertion
   * @param entry - The segment entry being inserted
   * @param hiddenEntries - Array to collect hidden entries
   */
  handleInvalidInsertion(
    insertion: SegInsertion,
    entry: SegEntry,
    hiddenEntries: SegEntry[]
  ): void;
}

Event Slicing

Specialized slicer for converting date ranges into table segments.

/**
 * Slicer implementation for day table segments
 * Converts date ranges into table-specific segment format
 */
class DayTableSlicer extends Slicer<TableSeg, [DayTableModel]> {
  forceDayIfListItem: boolean;
  
  /**
   * Slices date range into table segments using day table model
   * @param dateRange - Date range to slice
   * @param dayTableModel - Day table model for slicing context
   * @returns Array of table segments
   */
  sliceRange(dateRange: DateRange, dayTableModel: DayTableModel): TableSeg[];
}

Usage Examples:

import { 
  computeFgSegPlacement,
  generateSegKey,
  splitSegsByRow,
  hasListItemDisplay
} from '@fullcalendar/daygrid/internal';

// Computing event placement
const placement = computeFgSegPlacement(
  eventSegments,
  3, // max events per day
  false, // no max rows
  true, // strict ordering
  segmentHeights,
  null, // no max height
  dayCells
);

// Organizing segments by row
const segsByRow = splitSegsByRow(allSegments, 6); // 6 rows for month view

// Checking display mode
const useListDisplay = hasListItemDisplay(eventSegment);

// Generating segment identifiers
const segKey = generateSegKey(eventSegment);
const segUid = generateSegUid(eventSegment);

Event Display Modes

The system supports multiple event display modes:

  1. Block Display: Standard rectangular event blocks for multi-day events
  2. List Item Display: Compact list format for timed events in single cells
  3. More Link Display: "N more" links when events exceed display limits

Event display mode is automatically determined based on:

  • Event duration (single vs multi-day)
  • Available space in cell
  • Display preferences set in event UI configuration
  • Time vs all-day event classification