Skip to content

Фоновые задачи

Фоновая задача описывает интервал, который рисуется как контекст под рабочими задачами: окно работ, смена, SLA, недоступный период, плановый простой или другой визуальный диапазон времени.

Фоновые задачи используют тот же пользовательский тип, что и обычные задачи: он должен расширять TimelineTaskInput. При передаче через поле backgrounds runtime нормализует такие элементы как type: 'background'. Явно указать type: 'background' тоже можно, это делает намерение в данных очевидным.

ts
import type { TimelineTaskInput } from '@engine2d/timeline-chart'

interface Task extends TimelineTaskInput {
  title: string
  tone?: 'maintenance' | 'sla' | 'blocked'
}

const background: Task = {
  id: 'bg-maintenance',
  type: 'background',
  groupId: 'group-1',
  title: 'Окно работ',
  tone: 'maintenance',
  startTime: Date.parse('2026-05-20T09:00:00+03:00'),
  endTime: Date.parse('2026-05-20T11:00:00+03:00'),
}

Стандартные поля

ПолеТипОбязательноеОписание
idstringдаСтабильный идентификатор фонового интервала. Используется в update и remove.
type'background'нетПри передаче через backgrounds выставляется runtime автоматически, но явное значение делает данные понятнее.
groupIdstring | nullдаId группы, на фоне которой рисуется интервал. null отправляет фон в ungrouped context.
startTimenumberдаНачало фонового интервала в timestamp milliseconds.
endTimenumberдаКонец фонового интервала в timestamp milliseconds.
visiblebooleanнетФлаг видимости для фильтрации и частичных updates.
customunknownнетПроизвольные данные для templates, tooltip или обработчиков.

Пользовательские поля

Дополнительные поля нужны, когда фоновые интервалы отличаются типом, цветом, источником или бизнес-статусом. Например, tone можно использовать в task profile, чтобы отрисовать SLA и maintenance разными стилями.

Исполняемый пример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()
}

Snapshot и updates

ts
import type { TimelineChartRef, TimelineGroupInput, TimelineRootData, TimelineTaskInput } from '@engine2d/timeline-chart'

interface Group extends TimelineGroupInput {
  title: string
}

interface Task extends TimelineTaskInput {
  title: string
}

const start = new Date('2026-05-20T09:00:00+03:00').getTime()
const end = start + 2 * 60 * 60 * 1000

const data: TimelineRootData<Group, Task> = {
  groups: [{ id: 'group-1', title: 'Группа 1' }],
  tasks: [],
  backgrounds: [{
    id: 'bg-maintenance',
    type: 'background',
    groupId: 'group-1',
    title: 'Окно работ',
    startTime: start,
    endTime: end,
  }],
}

function addBackground(timeline: TimelineChartRef<Group, Task>): void {
  timeline.add({
    backgrounds: [{
      id: 'bg-sla',
      type: 'background',
      groupId: 'group-1',
      title: 'SLA interval',
      startTime: start,
      endTime: end,
    }],
  })
}

function updateBackground(timeline: TimelineChartRef<Group, Task>): void {
  timeline.update({
    backgrounds: [{ id: 'bg-sla', title: 'Обновленный SLA interval' }],
  })
}

function removeBackground(timeline: TimelineChartRef<Group, Task>): void {
  timeline.remove({
    backgrounds: ['bg-sla'],
  })
}

Рекомендация

Не смешивайте рабочие задачи и фоновые интервалы в одном массиве, если их lifecycle отличается. Для bulk updates используйте отдельное поле backgrounds.