Skip to content

Опции

options содержит доменные настройки timeline. Их можно передать через prop options или обновить через ref API. Иерархия ниже показана через dot-path: groups.columns[].data означает поле data внутри элемента массива groups.columns.

Исполняемый примерTimeline: optionsИзменение layout и visual options.
import { Nova, NovaNode, type NovaSchema } from '@endge/nova'

// Документационный сценарий: timeline-chart-options
class ExampleNode extends NovaNode<Record<string, Event>> {
  render(): void {
    const schema: NovaSchema = [
      {
        type: 'rect',
        x: 24,
        y: 24,
        width: this.width - 48,
        height: this.height - 48,
        styles: { background: '#0d2745' },
      },
      {
        type: 'text',
        x: 44,
        y: 44,
        width: this.width - 88,
        height: 32,
        text: 'Timeline: options',
        styles: { color: '#e8f5ff' },
      },
    ]

    this.renderer.schema(schema)
    this.setRenderBoundsFromSchema(schema)
  }
}

export function mountExample(canvas: HTMLCanvasElement) {
  const app = Nova.createApp({
    target: canvas,
    size: { width: canvas.clientWidth, height: canvas.clientHeight, maxDpr: 2 },
    scheduler: { loop: false },
  })
  const surface = app.surface({ id: 'resizable-workspace' })
  surface.createNode(ExampleNode)

  return () => app.destroy()
}

TimelineOptions

ОпцияТипПо умолчаниюЗначенияОписание
localestringru-RUBCP 47 locale: ru-RU, en-USЛокаль форматирования подписей временной шкалы.
timezonestringUTCIANA timezone или offset: Europe/Moscow, UTC, +03:00Временная зона для отображения дат. Offset нормализуется во внутреннюю timezone.
timeRangeTimelineTimeRangeOptionsnow - 8h до now + 8hobjectОбщий доступный диапазон времени и видимое окно.
timeRange.minnumbernow - 8htimestamp msЛевая граница доступного диапазона.
timeRange.maxnumbernow + 8htimestamp msПравая граница доступного диапазона.
timeRange.startnumbernow - 8htimestamp msНачало видимого окна.
timeRange.endnumbernow + 8htimestamp msКонец видимого окна.
timeScaleTimelineTimeScaleOptionsobjectobjectВерхняя временная шкала, ticks и форматирование подписей.
timeScale.enabledbooleantruetrue, falseПоказывает или скрывает временную шкалу.
timeScale.heightnumber40pxВысота области шкалы.
timeScale.formatArray<TimeScaleFormat>default formatsarrayПравила minor и major labels для разных интервалов.
timeScale.format[].intervalnumberзависит от правилаmsМинимальный интервал, к которому применяется формат.
timeScale.format[].formatIntl.DateTimeFormatOptionsзависит от правилаobjectФормат minor label.
timeScale.format[].majorFormatIntl.DateTimeFormatOptionsзависит от правилаobjectФормат major label.
timeScale.minTickWidthPxnumber50pxМинимальная ширина tick перед укрупнением шага.
timeScale.maxTicksInViewnumber15numberВерхний лимит количества ticks в текущем viewport.
groupsTimelineGroupsOptions<G>objectobjectЛевая панель групп и ее колонки.
groups.visiblebooleantruetrue, falseПоказывает или скрывает левую панель групп.
groups.columnsArray<GroupColumnInput<G>>[]arrayОписывает таблицу групп.
groups.columns[].idstringrequiredstringСтабильный id колонки.
groups.columns[].titlestringrequiredstringЗаголовок колонки.
groups.columns[].data(group: G) => stringrequiredfunctionВозвращает текст ячейки.
groups.columns[].widthnumberrequiredpxШирина колонки.
groups.ordernull или functionnull(a, b) => numberСортирует группы перед layout.
groups.filternull или functionnull(group) => booleanОставляет только группы, для которых функция вернула true.
groups.paddingYnumber3pxВертикальный padding внутри строк групп.
groups.treeTimelineGroupsTreeOptionsobjectobjectНастройки вложенных групп через parentId.
groups.tree.enabledbooleanfalsetrue, falseЯвно включает tree mode. Также включается автоматически, если у группы есть parentId.
groups.tree.defaultExpandedbooleantruetrue, falseНачальное раскрытие групп без собственного expanded.
groups.tree.indentnumber18pxГоризонтальный отступ одного уровня вложенности.
groups.tree.disclosureColumnIdstring | nullпервая колонкаid колонкиКолонка, где отображается и обрабатывается marker раскрытия.
tasksTimelineTasksOptions<T>objectobjectФильтр, высота строк и базовая отрисовка задач.
tasks.filternull или functionnull(task) => booleanОставляет только задачи, для которых функция вернула true.
tasks.heightnumber30pxБазовая высота task body.
tasks.rowGapnumber5pxВертикальный зазор между строками задач.
tasks.graphicsEnabledbooleantruetrue, falseВключает или отключает графическую отрисовку задач. Полезно для диагностики.
profilesTimelineProfilesOptions{}objectЕдиный выбор id visual profile для задач, backgrounds, points и links.
profiles.tasks.bystring или functionnonefield name или (task) => stringВыбирает task profile из DSL/taskProfiles.
profiles.tasks.defaultstringnoneprofile idFallback id для обычных задач.
profiles.backgrounds.bystring или functionnonefield name или (task) => stringВыбирает background profile для задач с type: 'background'.
profiles.backgrounds.defaultstringnoneprofile idFallback id для background-интервалов.
profiles.points.bystring или functionnonefield name или (point) => stringВыбирает point profile из DSL/visualProfiles.
profiles.points.defaultstringnoneprofile idFallback id для points.
profiles.links.bystring или functionnonefield name или (link) => stringВыбирает link profile из DSL/visualProfiles.
profiles.links.defaultstringnoneprofile idFallback id для links.
ungroupedPanelTimelineUngroupedPanelOptionsobjectobjectНижняя панель для задач с groupId: null.
ungroupedPanel.enabledbooleantruetrue, falseПоказывает нижнюю панель задач без группы.
ungroupedPanel.heightnumber200pxВысота панели.
ungroupedPanel.titlestringНеназначенные задачиstringЗаголовок панели.
viewportTimelineViewportOptionsobjectobjectScroll offsets и ограничения zoom.
viewport.mainScrollYnumber0pxВертикальный scroll основной области.
viewport.ungroupedScrollYnumber0pxВертикальный scroll ungrouped panel.
viewport.minDurationMsnumber60000msМинимальная длительность видимого окна при zoom in.
viewport.maxDurationMsnumber2678400000msМаксимальная длительность видимого окна при zoom out.
scrollTimelineScrollOptionsobjectobjectВключает или скрывает scrollbars timeline.
scroll.horizontalBarEnabledbooleantruetrue, falseПоказывает горизонтальный scrollbar времени.
scroll.mainVerticalBarEnabledbooleantruetrue, falseПоказывает вертикальный scrollbar основной области.
scroll.ungroupedVerticalBarEnabledbooleantruetrue, falseПоказывает вертикальный scrollbar ungrouped panel.
selectionArray<SelectionConfig>single click select-onlyarrayПравила пользовательского выделения. Multi-select включается явным rule с toggle.
selection[].enabledbooleanrequiredtrue, falseВключает правило selection.
selection[].modeArray<KeyMod>requiredsingle, Ctrl, Meta, Shift, Alt, FnКакие модификаторы должны быть активны.
selection[].triggerArray<InputEventKind>requiredclick, context, dblclick, mousedown, mouseupКакие input-события запускают правило.
selection[].targetArray<SelectionTarget>requiredchart, task, point, linkГде должен произойти input.
selection[].handlerArray<SelectOp>requirednone, toggle, select, deselect, select-only, clear-all, select-all, select-others, select-outside-onlyОперация над текущим набором выделения.
selectionScopeexclusive | mixedexclusiveexclusive, mixedСовмещать ли task selection с point/link selection.
annotationsTimelineAnnotationOptionsenabledobjectНастройки points, links, ports и routing.
annotations.ports.tasksTimelinePortInputtop/right/bottom/leftobject/array/falseПорты задач для links.
annotations.ports.pointsTimelinePortInputtop/right/bottom/leftobject/array/falseПорты points для links.
annotations.ports.invalidstringhide-linkhide-link, fallback-nearest, warnПолитика некорректных портов.
annotations.points.selectableboolean | objecttrueboolean/objectБазовая selectable policy для points.
annotations.points.editableboolean | objectfalseboolean/objectБазовая editable policy для points.
annotations.links.selectableboolean | objecttrueboolean/objectБазовая selectable policy для links.
annotations.links.editableboolean | objectfalseboolean/objectБазовая editable policy для links.
gridGridConfigplainplain, stripedСетка chart area.
grid.typestringplainplain, stripedРежим сетки.
grid.horizontal.colorstring#c5c5c5CSS colorЦвет горизонтальных линий.
grid.horizontal.widthnumber0.5pxТолщина горизонтальных линий.
grid.horizontal.accentstringnoneCSS colorТолько для striped: цвет горизонтального accent.
grid.vertical.major.colorstring#c5c5c5CSS colorЦвет major vertical lines.
grid.vertical.major.widthnumber0.5pxТолщина major vertical lines.
grid.vertical.minor.colorstring#c5c5c5CSS colorЦвет minor vertical lines.
grid.vertical.minor.widthnumber0.5pxТолщина minor vertical lines.
grid.vertical.accentstringnoneCSS colorТолько для striped: цвет вертикального accent.
snapTimelineSnapnullnull или objectПривязка времени при drag/edit.
snap.scalestringnonemillisecond, second, minute, hour, day, month, yearЕдиница округления.
snap.stepnumbernonepositive numberШаг округления в выбранной единице.
tooltipDelaynumber300msКороткое поле задержки tooltip; синхронизируется с tooltip.delay.
tooltipTimelineTooltipOptions<G, T>objectobjectRuntime tooltip над задачами.
tooltip.enabledbooleantruetrue, falseВключает tooltip.
tooltip.delaynumber300msЗадержка появления.
tooltip.hideDelaynumber80msЗадержка скрытия.
tooltip.triggerTooltipTrigger{ pointer: 'hover' }objectКакие pointer-события открывают tooltip.
tooltip.placementstringcursorcursor, top, right, bottom, leftБазовое размещение tooltip.
tooltip.positionstring или functioncursorcursor, task, functionПолное управление anchor-позицией.
tooltip.position().xnumberrequired for custom anchorpxX координата tooltip anchor.
tooltip.position().ynumberrequired for custom anchorpxY координата tooltip anchor.
tooltip.position().widthnumberoptionalpxШирина anchor, если tooltip позиционируется от прямоугольника.
tooltip.position().heightnumberoptionalpxВысота anchor.
tooltip.position().placementstringoptionalcursor, top, right, bottom, leftPlacement для конкретного anchor.
tooltip.followCursorbooleantruetrue, falseДвигает tooltip за курсором.
tooltip.classNamestring или Array<string>timeline-tooltipCSS class namesКлассы внешнего контейнера tooltip.
tooltip.contentClassNamestring или Array<string>timeline-tooltip__contentCSS class namesКлассы внутреннего content.
tooltip.resolveContentfunctiondefault template(ctx) => NovaSchema или nullВозвращает кастомный Nova schema для tooltip.
interactionTimelineInteractionOptionsobjectobjectГранулярные жесты изменения задач, точек и связей.
interaction.tasks.drag.moveGrouppointer actionleft + none + bodyobjectПеретаскивание задачи между группами.
interaction.tasks.drag.moveTimepointer actionleft + Meta/Ctrl/Alt + bodyobjectПеремещение задачи по времени целиком.
interaction.tasks.drag.resizeStartpointer actionleft + Meta/Ctrl/Alt + start-edgeobjectИзменение начала задачи.
interaction.tasks.drag.resizeEndpointer actionleft + Meta/Ctrl/Alt + end-edgeobjectИзменение окончания задачи.
interaction.points.drag.moveTimepointer actionleft + Meta/Ctrl/Alt + pointobjectПеремещение точки по X/time.
interaction.points.drag.moveGrouppointer actionleft + none + pointobjectПеремещение свободной точки между группами.
interaction.links.drag.reconnectFrompointer actionleft + none + from-handleobjectПереподключение начального endpoint связи.
interaction.links.drag.reconnectTopointer actionleft + none + to-handleobjectПереподключение конечного endpoint связи.
interaction.*.enabledbooleantruetrue, falseВключает конкретное действие.
interaction.*.buttonsArray<'left' | 'middle' | 'right'>['left']arrayКнопки pointer gesture.
interaction.*.modifiersArray<modifier>variesnone, Meta, Ctrl, Shift, Alt, Fn, combo objectКлавиши, при которых action активен. Несколько значений работают как OR.
interaction.*.areastringvariesbody, start-edge, end-edge, point, segment, handles, anyЧасть сущности, в которую должен попасть пользователь.
interaction.*.edgeSizePxnumber10pxШирина edge-зоны для task resize actions.
clusterThresholdPxnumber0pxМинимальная экранная близость задач для объединения в cluster. 0 отключает кластеризацию.
executor{ delay, maxDelay }objectobjectБуферизация частых updates/options updates.
executor.delaynumber1000msМинимальная задержка перед применением накопленного update.
executor.maxDelaynumber1000msМаксимальная задержка, после которой update должен быть применен.
renderingTimelineRenderingOptionsobjectobjectLOD, text renderer modes и deferred text во время взаимодействия.
rendering.taskTextVisiblebooleantruetrue, falseГлобально включает текст внутри task, task-group и cluster templates.
rendering.taskTextobjectobjectobjectНастройки compiled text recipes.
rendering.taskText.visiblebooleantruetrue, falseВключает compiled text recipes.
rendering.taskText.modestringlodalways, lodПоказывать labels всегда или через LOD.
rendering.taskText.minTaskWidthPxnumber42pxМинимальная ширина задачи для label.
rendering.taskText.minTaskHeightPxnumber14pxМинимальная высота задачи для label.
rendering.taskText.maxVisibleLabelsnumber4000numberВерхний лимит видимых labels.
rendering.taskText.hysteresisPxnumber8pxЗапас против частого мигания labels на границе LOD.
rendering.taskText.zoomBucketsArray<number>0.5..4arrayBuckets для text raster/cache.
rendering.taskText.prewarmAdjacentBucketsbooleantruetrue, falseПодготавливает соседние zoom buckets.
rendering.taskText.rasterBudgetMsnumber3msБюджет rasterization text за проход.
rendering.taskText.interactionstringstablestable, deferПоведение labels во время interaction.
rendering.textModesTimelineTextModeOptionsobjectobjectРежимы Nova text renderer по зонам.
rendering.textModes.timeScaleTimelineTextRenderModeglyph-atlasauto, run-atlas, glyph-atlas, msdfРежим текста временной шкалы.
rendering.textModes.taskLabelsTimelineTextRenderModeglyph-atlasauto, run-atlas, glyph-atlas, msdfРежим labels задач.
rendering.textModes.uiLabelsTimelineTextRenderModeglyph-atlasauto, run-atlas, glyph-atlas, msdfРежим UI labels.
rendering.textDeferredTimelineTextDeferredRenderingOptionsobjectobjectУпрощение text/detail во время активного взаимодействия.
rendering.textDeferred.enabledbooleantruetrue, falseВключает deferred text во время interaction.
rendering.textDeferred.modestringbody-onlytext-off, body-onlyЧто скрывать во время interaction.
rendering.textDeferred.idleMsnumber120msЧерез сколько вернуть полный текст после interaction.
taskGroupingTaskGroupingOptions<T>objectobjectГруппировка нескольких задач в task-group.
taskGrouping.enabledbooleanfalsetrue, falseВключает task groups.
taskGrouping.getGroupKeyfunctiontask.taskGroupKey(task) => string или nullВозвращает ключ группировки.
taskGrouping.minTasksInGroupnumber2numberМинимальное количество задач для создания task group.
taskGrouping.customobject или functionnoneobject или (ctx) => objectДобавляет пользовательские данные в runtime task group.

Диапазон, viewport и scroll

timeRange отвечает за время, которое может показать timeline. min и max задают доступные границы, а start и end - текущее видимое окно. timeScale форматирует верхнюю шкалу и выбирает плотность ticks.

ts
const options = {
  timeRange: {
    min: start - 60 * 60 * 1000,
    max: start + 8 * 60 * 60 * 1000,
    start,
    end: start + 4 * 60 * 60 * 1000,
  },
  timeScale: {
    enabled: true,
    minTickWidthPx: 56,
    maxTicksInView: 14,
  },
}

Profiles

profiles выбирает id уже объявленного DSL/recipe profile. Сами шаблоны остаются в TimelineTaskProfile, TimelineChart.PointProfile, TimelineChart.LinkProfile, TimelineChart.BackgroundProfile или в prop taskProfiles/visualProfiles.

ts
const options = {
  profiles: {
    tasks: { by: 'status', default: 'default' },
    backgrounds: { by: task => task.kind, default: 'default' },
    points: { by: 'kind', default: 'milestone' },
    links: { by: link => link.kind, default: 'dependency' },
  },
}

Для всех сущностей порядок одинаковый: by(entity), затем entity.profile, entity.kind, default.

viewport ограничивает zoom и хранит vertical scroll offsets. scroll управляет видимостью scrollbars. Для экранов с большим количеством групп обычно включают основной vertical scrollbar, а для компактных previews его можно скрыть.

ts
const options = {
  viewport: {
    minDurationMs: 30 * 60 * 1000,
    maxDurationMs: 8 * 60 * 60 * 1000,
    mainScrollY: 0,
  },
  scroll: {
    horizontalBarEnabled: true,
    mainVerticalBarEnabled: true,
    ungroupedVerticalBarEnabled: true,
  },
}

Не входит в TimelineOptions

width, height, renderer, loop, maxDpr, theme, themes, styleSheet, assets, plugins, taskProfiles, visualProfiles, uiTemplates, devtools и sync являются props Vue-компонента TimelineChart. Они не входят в TimelineOptions: taskProfiles и visualProfiles объявляют шаблоны, а options.profiles выбирает их id.

Полный пример

Исполняемый примерTimeline: полный контракт optionsКодовый справочник конфигурации.
import { Nova, NovaNode, type NovaSchema } from '@endge/nova'

// Документационный сценарий: timeline-chart-all-options
class ExampleNode extends NovaNode<Record<string, Event>> {
  render(): void {
    const schema: NovaSchema = [
      {
        type: 'rect',
        x: 24,
        y: 24,
        width: this.width - 48,
        height: this.height - 48,
        styles: { background: '#0d2745' },
      },
      {
        type: 'text',
        x: 44,
        y: 44,
        width: this.width - 88,
        height: 32,
        text: 'Timeline: полный контракт options',
        styles: { color: '#e8f5ff' },
      },
    ]

    this.renderer.schema(schema)
    this.setRenderBoundsFromSchema(schema)
  }
}

export function mountExample(canvas: HTMLCanvasElement) {
  const app = Nova.createApp({
    target: canvas,
    size: { width: canvas.clientWidth, height: canvas.clientHeight, maxDpr: 2 },
    scheduler: { loop: false },
  })
  const surface = app.surface({ id: 'dirty-culling' })
  surface.createNode(ExampleNode)

  return () => app.destroy()
}