Базовий редактор - Rete.js

Базовий редактор

Цей гайд містить rete-react-plugin. Ви можете використовувати його в будь-якому додатку, незалежно від фреймворку, який ви використовуєте (React.js, Vue.js, Angular, Svelte тощо).

Слідуйте цьому гайду, щоб використовувати відповідний плагін візуалізації у своєму Angular, Svelte або Vue.js додатку, з посиланням на відповідні гайди для Angular, Svelte, Vue.js тощо.

БазовийСтруктури данихCoreПлагін областіПлагін з'єднань

Щоб виконати цей гайд, ви можете створити додаток на Codesandbox, вибравши будь-який шаблон клієнтського додатку, або створити додаток локально.

Встановити залежності

bash
npm i rete rete-area-plugin rete-connection-plugin rete-react-plugin rete-render-utils styled-components react@18 react-dom@18

Визначення типів та ініціалізація екземпляра редактора

ts
import { NodeEditor, GetSchemes, ClassicPreset } from "rete"; type Schemes = GetSchemes< ClassicPreset.Node, ClassicPreset.Connection<ClassicPreset.Node, ClassicPreset.Node> >; const editor = new NodeEditor<Schemes>();

де Schemes — це тип, який допоможе вам з виведенням типів під час налаштування плагіна. Для більш складних прикладів може знадобитися розширити класи ClassicPreset.Node і ClassicPreset.Connection.

Додайте довільний вузол

Створення вузла, який містить один елемент керування та вихідний порт. Майте на увазі, що addNode є асинхронним методом.

ts
const socket = new ClassicPreset.Socket("socket"); const nodeA = new ClassicPreset.Node("A"); nodeA.addControl("a", new ClassicPreset.InputControl("text", {})); nodeA.addOutput("a", new ClassicPreset.Output(socket)); await editor.addNode(nodeA);

Створіть область для рендерінгу за допомогою React.js

Розмістіть цей код перед викликом addNode:

ts
import { createRoot } from "react-dom/client"; import { AreaPlugin } from "rete-area-plugin"; import { ReactPlugin, Presets, ReactArea2D } from "rete-react-plugin"; type AreaExtra = ReactArea2D<Schemes>; const area = new AreaPlugin<Schemes, AreaExtra>(container); const render = new ReactPlugin<Schemes, AreaExtra>({ createRoot }); render.addPreset(Presets.classic.setup()); editor.use(area); area.use(render);

де

  • container - це HTMLElement, де буде розміщено редактор
  • тип AreaExtra дозволяє включати спеціальні візуальні елементи, оскільки за замовчуванням доступні лише node і connection

Додавання ще одного вузла

ts
const nodeB = new ClassicPreset.Node("B"); nodeB.addControl("b", new ClassicPreset.InputControl("text", {})); nodeB.addInput("b", new ClassicPreset.Input(socket)); await editor.addNode(nodeB);

Давайте встановимо зв'язок між цими вузлами

ts
await editor.addConnection(new ClassicPreset.Connection(nodeA, "a", nodeB, "b"));

Позиціонування вузла

На екрані буде показано два вузли, що перекриваються, але ми можемо змінити позицію другого вузла.

ts
await area.translate(nodeB.id, { x: 270, y: 0 });

Інтерактивні зв'язки

Ця функція дозволяє користувачам взаємодіяти з вузлами.

ts
import { ConnectionPlugin, Presets as ConnectionPresets } from "rete-connection-plugin" const connection = new ConnectionPlugin<Schemes, AreaExtra>(); connection.addPreset(ConnectionPresets.classic.setup()) area.use(connection);

Пристосувати в’юпорт

Використовуйте розширення zoomAt, щоб автоматично пристосувати в’юпорт відповідно до всіх вузлів.

ts
import { AreaExtensions } from "rete-area-plugin"; AreaExtensions.zoomAt(area, editor.getNodes());

За замовчуванням розміри вузла обчислюються за допомогою clientWidth/clientHeight. Якщо цей метод викликається відразу після додавання вузлів, він може не працювати належним чином, доки елемент не буде видно на екрані. Натомість ви можете вказати властивості width/height у класі вузла, як продемонстровано на цьому кроці.

Вибір вузлів

Крім того, розширення пропонують різні можливості, як-от можливість вибору вузлів користувачем.

ts
AreaExtensions.selectableNodes(area, AreaExtensions.selector(), { accumulating: AreaExtensions.accumulateOnCtrl() });

Для отримання додаткової інформації перегляньте гайд Вибір.

Порядок вузлів

Якщо ваш додаток дозволяє вибирати вузли, користувачі можуть захотіти переглядати вибрані вузли без будь-яких візуальних перешкод. Для полегшення цього передбачено додаткове розширення, яке автоматично виводить вибраний вузол на передній план.

ts
AreaExtensions.simpleNodesOrder(area);

Перегляньте повний результат на сторінці прикладу Базовий редактор.