Đ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ủa gói Free. 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—
getPortalContainerResolve the document element that should receive timeline dropdown portals.() => HTMLElement | null—
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ế.