Đi tới nội dung tài liệu
Underverse UI Logo
ComponentPicker & Select

CalendarTimeline

Mới

CalendarTimeline thuộc nhóm Picker & Select. Xem demo trực tiếp, cách tích hợp và các lưu ý triển khai.

Bắt đầu nhanh

Import CalendarTimeline từ entry công khai. Các ví dụ bên dưới thể hiện những kiểu tương tác và cấu hình được hỗ trợ.

component.tsxtsx
import { CalendarTimeline } from '@underverse-ui/underverse';

Ví dụ tương tác

Dùng thử CalendarTimeline thật, xem mã ví dụ và tra cứu các prop đã được mô tả.

Đang tải ví dụ tương tác…
Tham chiếu

Tham chiếu API

Tra cứu các thuộc tính, kiểu dữ liệu được chấp nhận, giá trị mặc định và lưu ý về hành vi.

Dữ liệu được sinh từ API TypeScript công khai của thư viện. Kiểu dữ liệu, thuộc tính bắt buộc và giá trị mặc định luôn đồng bộ với mã nguồn.

CalendarTimeline

Component
Thuộc tínhMô tảKiểuMặc định
resourcesBắt buộcDanh sách resource (các hàng).CalendarTimelineResource<TResourceMeta>[]Bắt buộc
eventsBắt buộcDanh sách event (end là exclusive).CalendarTimelineEvent<TEventMeta>[]Bắt buộc
sizePreset kích thước hiển thị (sm/md/xl).CalendarTimelineSize"md"
enableEventSheetEnable the built-in right-side event details sheet on click. If `renderEventSheet` is provided, this defaults to enabled.boolean
eventSheetSizeKích thước sheet hiển thị chi tiết event.CalendarTimelineSheetSize"md"
eventSheetOverlayOpacityMã nguồn chưa cung cấp mô tả bổ sung.number
renderEventSheetHàm custom render nội dung sheet chi tiết event.(args: { event: CalendarTimelineEvent<TEventMeta>; resource?: CalendarTimelineResource<TResourceMeta>; close: () => void; locale: string; timeZone: string; view: CalendarTimelineView; }) => React.ReactNode
selectedEventIdControlled id event đang chọn cho sheet.string | null
defaultSelectedEventIdId event được chọn ban đầu khi uncontrolled.string | null
onSelectedEventIdChangeGọi khi selected event id thay đổi.(eventId: string | null) => void
eventSheetOpenControlled trạng thái mở/đóng sheet.boolean
defaultEventSheetOpenTrạng thái mở sheet ban đầu khi uncontrolled.boolean
onEventSheetOpenChangeGọi khi trạng thái mở/đóng sheet thay đổi.(open: boolean) => void
onlyViewLock the timeline to a single view and hide the view switcher. When set, `view`/`defaultView` are ignored.CalendarTimelineView
viewActive view (controlled) or allowed views list. - string: controls the current view - array: restricts which views are shown; the active view falls back to `defaultView` (if included) or the first entry.CalendarTimelineView | CalendarTimelineView[]
defaultViewChế độ xem ban đầu khi uncontrolled.CalendarTimelineView"month"
onViewChangeGọi khi view thay đổi.(view: CalendarTimelineView) => void
dueDateSprintSprint view only: provide custom sprint titles (and ranges) so the header columns can display dynamic labels. If not provided, sprint headers fall back to "S01", "S02", ...CalendarTimelineDueDateSprint
dateNgày neo cho view hiện tại (controlled).Date
defaultDateNgày ban đầu khi uncontrolled.Date
onDateChangeGọi khi date thay đổi.(date: Date) => void
weekStartsOnNgày bắt đầu tuần (0-6).0 | 1 | 2 | 3 | 4 | 5 | 61
localeLocale BCP47 dùng để format header.string
timeZoneMúi giờ IANA dùng để render và tính toán.string
labelsNhãn i18n cho UI text.CalendarTimelineLabels
formattersFormatter tuỳ biến cho header/time/aria.CalendarTimelineFormatters
groupsNhóm resources (tuỳ chọn).CalendarTimelineGroup[]
groupCollapsedMap điều khiển trạng thái thu gọn group.Record<string, boolean>
defaultGroupCollapsedMap thu gọn group mặc định khi uncontrolled.Record<string, boolean>
onGroupCollapsedChangeGọi khi trạng thái thu gọn group thay đổi.(next: Record<string, boolean>) => void
hideResourceColumnHide the left resource column (resource/group labels). The grid rows still render (one per resource), but the left labels, group toggles, and UI row-resize handles are not shown.boolean
resourceColumnWidthControlled width of the left resource column (px or CSS width string).number | string
defaultResourceColumnWidthDefault width of the left resource column when uncontrolled (px).number
onResourceColumnWidthChangeCalled when user resizes the left resource column.(width: number) => void
minResourceColumnWidthMin width for the left resource column (px).number
maxResourceColumnWidthMax width for the left resource column (px).number
rowHeightControlled height of each resource row (px).number
defaultRowHeightDefault row height when uncontrolled (px).number
onRowHeightChangeCalled when user resizes row height.(height: number) => void
minRowHeightMin row height (px).number
maxRowHeightMax row height (px).number
rowHeightsControlled per-resource row heights (px) keyed by resourceId.Record<string, number>
defaultRowHeightsDefault per-resource row heights (px) keyed by resourceId.Record<string, number>
onRowHeightsChangeCalled when per-resource row heights change.(next: Record<string, number>) => void
autoRowHeightAuto-expand each resource row height to fit overlapping events (lanes) without collapsing into "+more". When enabled, `maxLanesPerRow` is ignored unless overridden via `autoRowHeight.maxLanesPerRow`.boolean | { maxRowHeight?: number; maxLanesPerRow?: number }
enableLayoutResizeAllow resizing layout with mouse: - column: drag the divider in the header - row: drag the bottom edge of a resource rowboolean | { column?: boolean; row?: boolean }
slotMinWidthĐộ rộng tối thiểu mỗi slot (px).number
adaptiveSlotWidthsMonth/day only: make slots (columns) without any events smaller to free space for slots that have events. Week view is unaffected.CalendarTimelineAdaptiveSlotWidths
dayEventStyleDay view: visual style for events that span many time slots. - "span": event blocks span the full duration on the timeline (default) - "compact": event blocks keep a capped visual width (still positioned at correct start)"span" | "compact""span"
dayEventMaxWidthDay view only (when `dayEventStyle="compact"`): max visual width (px).number
monthEventStyleMonth view: visual style for events that span many days. - "span": event blocks span the full duration on the timeline (default) - "compact": event blocks keep a capped visual width (still positioned at correct start)"span" | "compact""span"
monthEventMaxWidthMonth view only (when `monthEventStyle="compact"`): max visual width (px).number
overflowHiddenClip overflow at the outer surface. Disable when child hover shadows or focus rings should escape the timeline card. Default: true.booleantrue
dayTimeStepMinutesKích thước slot ở day view (phút).number60
enableEventTooltipsRender tooltips on events (can be expensive for large datasets). Default: true.booleantrue
dayHeaderModeDay view: header rendering mode. - "full": show every time slot label (default; matches legacy behavior) - "smart": show start/…/end markers to reduce clutter on dense timelines"full" | "smart""full"
daySlotCompressionDay view: optionally compress empty time columns when `dayHeaderMode="smart"`. Default: false (keeps legacy column widths).booleanfalse
columnVirtualizationDay view only: virtualize columns in the header/overlay when there are many time slots (e.g. 5–15min step). Keeps scroll behavior the same but reduces DOM work.CalendarTimelineColumnVirtualization
dayRangeModeDay view horizontal range: - "full": show 24h (default) - "work": show working hours (default 08:00–17:00)CalendarTimelineDayRangeMode
workHoursUsed when `dayRangeMode="work"`. Default: `{ startHour: 8, endHour: 17 }`.{ startHour: number; endHour: number }
maxLanesPerRowSố lane event tối đa trước khi gộp vào +more.number3
nowOverride thời điểm hiện tại (dùng highlight today).Date
renderResourceRender tuỳ biến ô resource (cột trái).(resource: CalendarTimelineResource<TResourceMeta>) => React.ReactNode
renderGroupRender tuỳ biến hàng group.(group: CalendarTimelineGroup, args: { collapsed: boolean; toggle: () => void }) => React.ReactNode
renderEventRender tuỳ biến block event.( event: CalendarTimelineEvent<TEventMeta>, layout: { left: number; width: number; lane: number; height: number; timeText: string }, ) => React.ReactNode
interactionsBật create/drag/resize/delete.CalendarTimelineInteractions
onRangeChangeGọi khi range hiển thị thay đổi.(range: { start: Date; end: Date }) => void
onEventClickGọi khi click event.(event: CalendarTimelineEvent<TEventMeta>) => void
onEventDoubleClickGọi khi double click event.(event: CalendarTimelineEvent<TEventMeta>) => void
onCreateEventClickCustom create flow: when `interactions.creatable` + `interactions.createMode="click"`, clicking an empty cell calls this handler with the inferred range for that cell.(args: { resourceId: string; start: Date; end: Date; slotIdx: number; view: CalendarTimelineView; locale: string; timeZone: string; }) => void
onCreateEventGọi khi tạo event bằng cách kéo ở ô trống.(draft: { resourceId: string; start: Date; end: Date }) => void
onEventMoveGọi khi kéo di chuyển event.(args: { eventId: string; resourceId: string; start: Date; end: Date }) => void
onEventResizeGọi khi resize event.(args: { eventId: string; start: Date; end: Date }) => void
onEventDeleteGọi khi xoá event (chuột phải confirm).(args: { eventId: string }) => void
onMoreClickGọi khi click nút +more.(args: { resourceId: string; hiddenEvents: CalendarTimelineEvent<TEventMeta>[] }) => void
virtualizationBật virtualization cho danh sách resource.CalendarTimelineVirtualization

Hướng dẫn sử dụng

Dùng CalendarTimeline khi lựa chọn có giới hạn nhanh và an toàn hơn nhập tự do. Cần cấu hình rõ locale, giới hạn, giá trị bị vô hiệu hóa và trạng thái xóa.

Trợ năng

Khi dùng CalendarTimeline, hãy giữ trạng thái focus dễ nhận biết, cung cấp tên truy cập khi cần và kiểm tra bàn phím cùng trình đọc màn hình trong ngữ cảnh thực tế.