Перейти к основному содержимому

Использование свойств DHTMLX Gantt в VueGantt

Эта страница документирует публичную поверхность обертки Vue для @dhtmlx/trial-vue-gantt и @dhx/vue-gantt.

Используйте её как справочник после разделов Обзор или Быстрый старт.

Доступные пропсы​

СвойствоТипОписание
tasksTask[]Коллекция задач, отображаемая в диаграмме/гриду.
linksLink[]Коллекция зависимостей.
resourcesany[] | nullНабор данных ресурсов для раскладки ресурсов и API-методов, связанных с ресурсами.
resourceAssignmentsany[] | nullНабор данных назначений ресурсов.
baselinesany[] | nullНабор данных базовых линий.
markersMarker[] | nullМаркеры вертикальной временной шкалы.
calendars(WrapperCalendar | CalendarConfig)[] | nullОпределения рабочих календарей (в формате WrapperCalendar или нативной конфигурации Gantt).
dataVueGanttDataConfig | nullCallbacks передачи данных: load, save, batchSave.
configPartial<GanttConfigOptions>Объединено в gantt.config.
pluginsGanttPluginsРасширения Gantt для активации (например auto_scheduling).
templatesPartial<GanttTemplates>Объединено в gantt.templates.
localestring | Record<string, any>Имя локали или объект локали.
themestringНазвание скина.
filter((task: Task) => boolean) | nullПредикат фильтрации задач.
resourceFilter((resource: any) => boolean) | nullПредикат фильтрации ресурсов.
modalsGanttModals | nullПереопределяет встроенные диалоги подтверждения удаления.
groupTasksanyКонфигурация группировки, передаваемая в gantt.groupBy.
inlineEditorsRecord<string, Component>Сопоставление имен типов встроенных редакторов к компонентам Vue.
customLightboxComponent | nullПользовательский Vue-компонент редактора задачи.
eventsVueGanttEventsКарта имен событий на обработчики.
htmlTemplatePolicyHtmlTemplatePolicyКонтролирует, как строки, возвращаемые функциями-шаблона, рендерятся. "basic-sanitize" (значение по умолчанию) осуществляет белый санитайзинг возвращаемого HTML: безопасное форматирование, классы, ограниченные встроенные стили, data-* атрибуты и img сохраняются, тогда как скрипты, обработчики событий и опасные URL-адреса удаляются. "escape" рендерит строку как текст; "unsafe-html" рендерит сырую строку (поведение до версии v10); настраиваемый объект санитайзера (mode: "sanitize" с функцией sanitize(html)) позволяет подключать библиотеки, например DOMPurify. Для локального контроля по каждому шаблону оборачивайте отдельные функции-шаблоны экспортируемым помощником allowRawHTML().Migration notes.

Данные: коллекции и синхронизация​

Используйте эти пропсы, когда состояние Vue является единственным источником правды:

  • tasks, links
  • дополнительно сложные наборы данных: resources, resourceAssignments, baselines
<VueGantt
:tasks="tasks"
:links="links"
:resources="resources"
:resourceAssignments="resourceAssignments"
:baselines="baselines"
/>

Сводка поведения синхронизации:

  • обновления задач/ссылок обычно основаны на различиях (diff-based)
  • обертка может перейти к сбросу/перепарсингу для крупных изменений
  • сложные наборы данных перепарсятся через их хранилища данных

Для выбора модели и стратегии колбэков смотрите Основы привязки данных и управления состоянием.

Конфигурация, Шаблоны, Плагины, Theme, Locale​

Используйте эти пропсы для повседневной настройки графика без императивных вызовов API.

<script setup lang="ts">
const config = {
scales: [
{ unit: "year", step: 1, format: "%Y" },
{ unit: "month", step: 1, format: "%F" }
],
columns: [
{ name: "text", tree: true, width: "*" },
{ name: "start_date", align: "center" },
{ name: "duration", align: "center" },
{ name: "add", width: 44 }
]
};

const templates = {
task_text: (_start, _end, task) => `#${task.id}: ${task.text}`
};
</script>

<template>
<VueGantt
:config="config"
:templates="templates"
:plugins="{ auto_scheduling: true }"
theme="terrace"
locale="en"
/>
</template>

События, жизненный цикл и доступ к экземпляру​

events​

Используйте одну карту events вместо пропсов, специфичных для обертки, для каждого события Gantt:

const events = {
onTaskCreated: task => {
console.log(task);
return true;
},
onBeforeLightbox: id => {
console.log(id);
return true;
}
};

Карта типизирована как VueGanttEvents. Обёртка объявляет следующие известные события с полными сигнатурами типов; любое другое имя события Gantt также принимается (пользовательские события типизированы как обработчики с строковым ключом).

СобытиеПодписьПримечания
onBeforeLightbox(taskId: string | number) => boolean | voidВернуть false, чтобы подавить встроенную световую панель (например, чтобы перенаправить к внешнему редактору).
onTaskCreated(task: Task) => boolean | voidВернуть false, чтобы отменить создание задачи.
onAfterTaskAdd(id: string | number, task: Task) => voidВызываетcя после добавления задачи.
onAfterTaskUpdate(id: string | number, task: Task) => voidВызываетcя после обновления задачи.
onAfterTaskDelete(id: string | number, task: Task) => voidВызываетcя после удаления задачи.
onAfterLinkAdd(id: string | number, link: Link) => voidВызываетcя после добавления ссылки зависимости.
onAfterLinkUpdate(id: string | number, link: Link) => voidВызываетcя после обновления ссылки зависимости.
onAfterLinkDelete(id: string | number, link: Link) => voidВызываетcя после удаления ссылки зависимости.

Для полного списка событий Gantt (включая события, не перечисленные выше), см. обзор событий Gantt: Gantt events overview. Используйте defineGanttEvents(...) для создания карты с автодополнением по известным событиям.

@ready​

ready(instance) срабатывает один раз после инициализации и первого синха:

<VueGantt :events="events" @ready="onReady" />

instance через ссылку на компонент​

import { ref } from "vue";
import type { VueGanttRef } from "@dhtmlx/trial-vue-gantt";

const ganttRef = ref<VueGanttRef | null>(null);

function showToday() {
ganttRef.value?.instance?.showDate(new Date());
}

Используйте это для продвинутых операций, которые нецелесообразно выполнять через пропсы.

Передача данных: load, save, batchSave​

Форма пропса data:

interface VueGanttDataConfig {
load?: string | ((gantt: GanttStatic) => DataSet | Promise<DataSet>)));
save?: string | RouterFunction;
batchSave?: (changes: BatchChanges) => void;
}

load​

  • URL-строка -> gantt.load(url)
  • Функция -> возвращает синхронный или асинхронный набор данных

save​

Колбэк на каждое изменение или маршрутизатор через dataProcessor.

batchSave​

Группированный колбэк для больших объёмов обновлений:

  • tasks
  • links
  • resources
  • resourceAssignments
const data = {
batchSave: changes => {
if (changes.tasks?.length) {
console.log("task changes", changes.tasks);
}
}
};

Используйте batchSave, когда одно действие графика может вызвать множество обновлений (например, авторасписывание или массовые редактирования).

Хуки настройки​

customLightbox​

Заменить встроенную форму задачи на компонент Vue.

inlineEditors​

Сопоставление имен типов встроенных редакторов Gantt с компонентами Vue.

modals​

Переопределять подтверждения удаления и вызывать callback() для подтверждения удаления.

const modals = {
onBeforeTaskDelete: ({ task, callback }) => {
if (window.confirm(`Delete task ${task.text}?`)) callback();
}
};

Для практических примеров смотрите Паттерны настройки.

Группировка, Фильтрация, Ресурсы, Календари, Маркеры​

Эти пропсы часто используются вместе в продвинутых представлениях временной шкалы:

<VueGantt
:groupTasks="groupConfig"
:filter="taskFilter"
:resourceFilter="resourceFilter"
:calendars="calendars"
:markers="markers"
:resources="resources"
:resourceAssignments="resourceAssignments"
/>

Обычное применение:

  • groupTasks для представлений с группировкой
  • filter и resourceFilter для сфокусированных срезов
  • calendars и markers для правил расписания и подсветки временной шкалы

Экспортируемые помощники и композируемые функции​

Пакет экспортирует как дефолтный экспорт компонента VueGantt, так и именованные экспорты.

Из @dhtmlx/trial-vue-gantt или @dhx/vue-gantt:

Типы экспорта​

Импортируйте каждый тип прямо из самого пакета-обертки (@dhx/vue-gantt или @dhtmlx/trial-vue-gantt). Обёртка инкапсулирует движок Gantt и повторно экспортирует его типы наряду с Vue-специфичными типами — отдельного пакета вроде @dhx/gantt устанавливать или импортировать не нужно.

Типы, принадлежащие обёртке

ЭкспортОписание
SerializedTaskФорма задачи на стороне пользователя с датами типа `Date
SerializedLinkФорма ссылки на стороне пользователя. Используется вместе с SerializedTask в состоянии хранения и определениях данных.
VueGanttRefТип значения, возвращаемого через ref — { instance: GanttStatic | null }.
VueGanttDataConfigФорма пропса data (load, save, batchSave).
BatchChangesАргумент, переданный в data.batchSave — сгруппированные изменения tasks/links/resources/resourceAssignments.
DataCallbackChangeОтдельная запись изменения внутри контейнера BatchChanges — { entity, action, data, id }.
MarkerФорма элементов в пропе markers.
WrapperCalendarПодходящая обёртке форма календаря, принимаемая пропом calendars (наряду с исходной CalendarConfig).
GanttModalsФорма пропса modals — сигнатуры колбэков onBeforeTaskDelete и onBeforeLinkDelete.
CustomLightboxPropsСвойства, получаемые вашим компонентом customLightbox (data, onSave, onCancel, onDelete, ganttInstance).
InlineEditorComponentPropsСвойства, получаемые вашими компонентами встроенных редакторов (initialValue, task, save, cancel, ganttInstance).
VueGanttEventsТип пропса events — известные события плюс события с произвольными строковыми ключами.

Часто используемые типы из движка Gantt

Обёртка повторно экспортирует все типы из движка Gantt. Ниже перечислены те, которые чаще всего встречаются в коде обёртки — каждая строка сопоставляет базовый тип с тем местом, где он встречается в Vue API.

ЭкспортГде встречается в коде обёртки
Task, LinkВремя-исполняемые формы задач/ссылок (включая свойства с префиксом $). Используются внутри обработчиков событий, колбэках шаблонов и функциях фильтрации.
GanttStaticТип ganttRef.value?.instance и аргумента @ready.
GanttConfigOptionsФорма объекта, передаваемого в проп config.
GanttTemplatesФорма объекта, передаваемого в проп templates.
GanttPluginsФорма объекта, передаваемого в проп plugins.
CalendarConfigИсходная форма календаря Gantt — альтернатива WrapperCalendar в пропе calendars.

Каждый другой тип из движка Gantt также экспортируется из обёртки — если можно импортировать имя из @dhx/gantt в автономной библиотеке, можно импортировать его и здесь из @dhx/vue-gantt.

Используйте SerializedTask и SerializedLink для данных, которые вы держите сами (состояние Pinia, ref<>, ответы API, исходные литералы). Используйте Task и Link для данных, которыми управляет gantt (внутри обработчиков событий, колбэков шаблонов, функций фильтрации), где объекты задач во время выполнения содержат внутренние свойства с префиксом $.

Фабрики помощников​

  • defineGanttConfig(config) для типизированного написания конфигурации
  • defineGanttTemplates(templates) для типизированных карт шаблонов
  • defineGanttEvents(events) для типизированной авторской карты событий
  • defineInlineEditors(inlineEditors) для типизированных карт встроенных редакторов

Это лишь идентичности на TypeScript — на этапе выполнения defineGanttTemplates(x) возвращает x без изменений. Их можно пропускать вовсе без изменения поведения. Их ценность — сохранение типа на литералах объектов: вы получаете автодополнение для templates.task_text, config.scales[0].unit, events.onAfterTaskAdd и т. д., без явной аннотации переменной.

Если пропусκть их в TypeScript, либо аннотируйте переменную сами, либо передайте литерал прямо в проп:

// Вариант 1: явная аннотация типа
const templates: Partial<GanttTemplates> = {
task_text: (_s, _e, task) => task.text
};

// Вариант 2: помощник для автодополнения на литерале
const templates = defineGanttTemplates({
task_text: (_s, _e, task) => task.text
});

// Вариант 3: inline-литерал - вывод делается через тип пропа
<VueGantt :templates="{ task_text: (_s, _e, task) => task.text }" />

Композаблы​

Обёртка предоставляет пять композаблов, которые оборачивают общие вызовы со стороны экземпляра в форме с учетом рефов и безопасного жизненного цикла. Каждый требует Ref<VueGanttRef | null>, чтобы можно было дождаться доступности экземпляра.

useGanttActions(ganttRef)​

Возвращает действия в безопасном императивном стиле:

МетодПодписьПримечания
undo()() => voidТребуется plugins: { undo: true }.
redo()() => voidТребуется plugins: { undo: true }.
render()() => voidПринуждает перерисовку — сочетайте с instance.eachTask(...) для пакетных мутаций.
exportToPDF()() => voidТребуется plugins: { export_api: true }.
exportToPNG()() => voidТребуется plugins: { export_api: true }.
exportToExcel(config?)(config?: object) => voidТребует plugins: { export_api: true }. Передайте опции экспорта через config.
exportToMSProject()() => voidТребуется plugins: { export_api: true }.
import { ref } from "vue";
import { useGanttActions, type VueGanttRef } from "@dhtmlx/trial-vue-gantt";

const ganttRef = ref<VueGanttRef | null>(null);
const actions = useGanttActions(ganttRef);

const exportPdf = () => actions.exportToPDF();
const exportExcel = () => actions.exportToExcel({ visual: "base-colors" });

useWorkTime(ganttRef)​

Возвращает вычисляемый обёрточный доступ к API работы Gantt. Полезно в шаблонах и при вычислениях ограничений.

МетодПодпись
isWorkTime({ date, task?, unit? })(args) => boolean
calculateEndDate({ start, duration, unit?, task? })(args) => Date
calculateDuration({ start, end, task? })(args) => number
getClosestWorkTime({ date, task?, unit, dir? })(args) => Date
import { useWorkTime, type VueGanttRef } from "@dhtmlx/trial-vue-gantt";

const ganttRef = ref<VueGanttRef | null>(null);
const workTime = useWorkTime(ganttRef);

const templates = {
scale_cell_class: (date: Date) =>
workTime.value.isWorkTime({ date }) ? "" : "weekend"
};

useGanttDatastore<T>(ganttRef, storeName)​

Возвращает вычисляемый читатель для любого хранилища данных Gantt (например, "task", "link", "resource").

МетодПодпись
getItem(id)(id: string | number) => T | null
getItems()() => T[]
hasChild(id)(id: string | number) => boolean
getChildren(id)(id: string | number) => (string | number)[]
import type { Task } from "@dhtmlx/trial-vue-gantt";
import { useGanttDatastore } from "@dhtmlx/trial-vue-gantt";

const taskStore = useGanttDatastore<Task>(ganttRef, "task");

const rootTasks = computed(() => taskStore.value.getChildren(0));

useResourceAssignments(ganttRef)​

Возвращает вычисляемый читатель данных назначений ресурсов/задач.

МетодПодпись
getResourceAssignments(resourceId, taskId?)(resourceId: string | number, taskId?: string | number) => any[]
getTaskResources(taskId)(taskId: string | number) => any[]
import { useResourceAssignments } from "@dhtmlx/trial-vue-gantt";

const assignments = useResourceAssignments(ganttRef);

const showAssignments = (resourceId: string | number) => {
console.log(assignments.value.getResourceAssignments(resourceId));
};

useGanttEvent(ganttRef, eventName, handler)​

Прикрепляет одно событие Gantt с корректным временем жизни. Обработчик автоматически отсоединяется при размонтировании компонента и повторно присоединяется, если изменяются ganttRef, eventName или handler. Возвращает { detach } для ручного управления.

import { useGanttEvent } from "@dhtmlx/trial-vue-gantt";

const { detach } = useGanttEvent(ganttRef, "onTaskDblClick", id => {
console.log("dbl-click", id);
});

// Опционально: отсоединить раньше
// detach();

Используйте это, когда одноразовые слушатели не помещаются в карту events (например, слушатели, которые нужно обновлять или отписываться на основе локального состояния).

Что читать дальше​

Need help?
Got a question about the documentation? Reach out to our technical support team for help and guidance. For custom component solutions, visit the Services page.