Node tree builder for Apifornia project
npm install --save flow-builder-three
import FlowBuilderThree from 'flow-builder-three';
const fbt = new FlowBuilderThree(eventEmitter)
fbt.run().then( () => {
fbt.node.add(nodeData);
});
.run(): Promise<any>
запустить построение сцены
Методы API, расположенные в этом разделе относятся к управлению нодами
.node.add(nodeData: TNodeData, options?: {windowScreenPosition?: TPosition2D}): Promise<string>
добавить ноду на сцену
- nodeData - данные ноды
- options: { windowScreenPosition - (необязательное) позиция ноды в координатах страницы, это свойство перезаписывает свойство "position" в nodeData }
.node.remove(id: string): Promise<string>
удалить ноду со сцены
- id - идентификатор ноды
.node.rename(id: string, name: string): Promise<string>
переименовать ноду
- id - идентификатор ноды
- name - новое имя ноды
.node.addPorts(nodeId: string, data: { direction: 'input' | 'output'; data: TPortData }[]): Promise<string>
добавить порты к ноде
- nodeId - идентификатор ноды
- data.direction - направление порта
- data.data - данные порта
.node.removePorts(nodeId: string, portIds: string[]): Promise<string>
удалить порты из ноды
- nodeId - идентификатор ноды
- portIds - идентификаторы удаляемых портов
.node.changeConvertStatus(id: string, newStatus: 'local' | 'master' | 'instance'): Promise<string>
измененить convertStatus ноды
- id - идентификатор ноды
- newStatus - новый статус
.node.execute(id: string): Promise<string>
запустить выполнение ноды
- id - идентификатор ноды
.node.stop(id: string): Promise<string>
остановить выполнение ноды
- id - идентификатор ноды
.node.setAsStart(id: string): Promise<string>
установить ноду как стартовую
- id - идентификатор ноды
.node.move(nodeId: string, position: { x: number; y: number }): void
переместить ноду в пространстве
- nodeId - идентификатор ноды
- position.x - позиция по x
- position.y - позиция по y
.node.collapsePorts(id: string): Promise<string>
свернуть все порты ноды, аналогично нажатию на треугольник в ноде
- id - идентификатор ноды
.node.expandPorts(id: string): Promise<string>
развернуть все порты в ноду, аналогично нажатию на треугольник в ноде
- id - идентификатор ноды
.node.showError(nodeId: string, errorData: { code: string; message: string }[]): Promise<string>
показать КНОПКУ ошибки в ноде
- nodeId - идентификатор ноды
- errorData.code - код ошибки
- errorData.message - текст ошибки
.node.hideError(nodeId: string): Promise<string>
скрыть кнопку ошибки в ноде, само окно ошибки так же исчезает
- nodeId - идентификатор ноды
.node.setIndicators(data: { nodeId: string; indicator: string }[]): Promise<string>
установить новые индикаторы для нод
- data.nodeId - идентификатор ноды
- data.indicator - новый индикатор ноды
.node.setPortsIndexes(data: { nodeId: string; data: { portId: string; index: number }[] }[]): Promise<string>
установить порядковые номера для портов нод
- data.nodeId - идентификатор ноды
- data.data.portId - идентификатор порта
- data.data.index - порядковый номер
Методы API, расположенные в этом разделе относятся управлению сединениями между нодами
.connection.add(linePath: TLinePath): Promise<string>
соединенить ноды линией
- linePath - объект, описывающий откуда и куда идёт соединение
.connection.remove(linePath: TLinePath): Promise<string>
удалить содинение между нодами
- linePath - объект описывающий откуда и куда идёт соединение
включить индикатор маркера линии
.connection.showMarkerIndicator(linePath: TLinePath): Promise<string>
- linePath - объект описывающий откуда и куда идёт соединение
выключить индикатор маркера линии
.connection.hideMarkerIndicator(linePath: TLinePath): Promise<string>
- linePath - объект описывающий откуда и куда идёт соединение
Методы API, расположенные в этом разделе относятся к управлению сценой.
.scene.moveCameraToNode(id: string): Promise<string>
переместить камеру к указанной ноде
- id - идентификатор ноды
.scene.resetAll(): Promise<string>
сбросить всю сцену. Ноды, соединения и т.д. удаляются, камера встаёт в первоначальное положение
.scene.resetCamera(): Promise<string>
сбросить сбросить настройки камеры.
.scene.cameraToCenter(): Promise<string>
центрировать камеру
.scene.zoomIn(value?: number | 'max'): Promise<string>
приблизить камеру
- value - любое положительное число или 'max'(максимальное приближение), если значение отсутствует, то шаг приближения равен 1
.scene.zoomOut(value?: number | 'max'): Promise<string>
отдалить камеру
- value - любое положительное число или 'max'(максимальное отдаление), если значение отсутствует, то шаг отдаления равен 1
Методы API, расположенные в этом разделе относятся к подключаемым пользователям.
.alien.add(data: TAlienData): Promise<string>
зарегистрировать нового пользователя для коллаборационного взаимодействия
- data - данные пользователя
.alien.remove(alienId: string): Promise<string>
удалить подключенного пользователя
- alienId - идентификатор пользователя
.alien.movePointer(alienId: string, position: { x: number; y: number }): void
переместить курсор подключенного пользователя в сцене
- alienId - идентификатор пользователя
- position.x - позиция по x
- position.y - позиция по y
.alien.selectNodes(alienId: string, nodeIds: string[]): Promise<string>
выделить ноду пользователем
- alienId - идентификатор пользователя
- nodeIds - список идентификаторов нод, которые надо выделить
.alien.deselectNodes(alienId: string, nodeIds: string[]): Promise<string>
снять выделение с ноды, выделенной ранее подключаемым пользователем
- alienId - идентификатор пользователя
- nodeIds - список идентификаторов нод, с которых надо снять выделение
.alien.selectLines(alienId: string, lineIds: string[]): Promise<string>
выделить линию подключаемым пользователем
- alienId - идентификатор пользователя
- lineIds - список идентификаторов линий, которые нужно выделить
.alien.deselectLines(alienId: string, lineIds: string[]): Promise<string>
снять выделение линии, выделенной ранее подключаемым пользователем
- alienId - идентификатор пользователя
- lineIds - список идентификаторов линий, которые нужно удалить
События генерируемые EventEmitter'ом.
const fbt = new FlowBuilderThree(eventEmitter)
eventEmitter.emit('addConnection', data);
.emit('nodeSelect', data: TNodeData)
нода выделена
- data - данные ноды
.emit('nodeMultipleSelect', data: TNodeData[])
нода(одна или несколько) выделены мультиселектом
- data - массив данных ноды
.emit('nodeDeselect', data: TNodeData[])
снятие выделения с нод, выделенных текущим юзером
- data - массив данных ноды
.emit('nodeMove', data: TNodeData)
нода перемещена, срабатывает по окончании перемещения
- data - данные ноды
.emit('nodeRemove', data: TNodeData)
нода удалена
- data - данные ноды
.emit('nodeExecute', data: TNodeData)
нода запущена
- data - данные ноды
.emit('nodeRename', data: TNodeData)
нода переименована
- data - данные ноды
.emit('openNodeCredentials', data: TNodeData)
нажата кнопка меню ноды Credentials
- data - данные ноды
.emit('changeStartNode', data: TNodeData)
нода установлена как стартовая
- data - данные ноды, которая стала стартовой
.emit('groupNodes', ids: string[])
активирован хоткей(CTRL+G/CMD+G) группировки нод
- ids - список идентификаторов выделенных нод, подлежащих группировке
.emit('jumpInsideNode', data: { nodeId: string })
активирован двойной клик по ноде
- data.nodeId - идентификатор ноды, на которой вызвано событие двойного клика
события относящиеся к линиям
.emit('addConnection', data: TLineEmitData)
добавлено соединение
- data - данные о соединениях линии
.emit('removeConnection', data: TLineEmitData)
удалено соединение
- data - данные о соединении линии
.emit('linesSelect', data: TLineEmitData)
линия выделена
- data - данные о соединении линии
.emit('lineMultipleSelect', data: TLineEmitData[])
линия выделена c помощью области выделения
- data - массив данных о соединении линии
.emit('lineDeselect', data: TLineEmitData[])
выделение с линии снято
- data - массив данных о соединении линии
события относящиеся к вотчпоинту
.emit('watchPointSelect', data: TWatchPointEmitData)
вотчпоинт выделен
- data - данные генерируемые для событий вотчпоинта
.emit('watchPointDeselect', data: TWatchPointEmitData)
выделение снято с вотчпоинта
- data - данные генерируемые для событий вотчпоинта
.emit('watchPointMove', data: TWatchPointEmitData)
вотчпоинт сдвинут, событие срабатывается по окончании перемещения
- data - данные генерируемые для событий вотчпоинта
.emit('watchPointShow', data: TWatchPointEmitData)
вотчпоинт отображается на экране
- data - данные генерируемые для событий вотчпоинта
.emit('watchPointHide', data: TWatchPointEmitData)
вотчпоинт скрыт
- data - данные генерируемые для событий вотчпоинта
.emit('watchPointResize', data: TWatchPointEmitData)
размер вотчпоинта был изменён, вызывается по окончании изменения
- data - данные генерируемые для событий вотчпоинта
.emit('watchPointCopyButton', data: TWatchPointEmitData)
кнопка Copy была нажата
- data - данные генерируемые для событий вотчпоинта
.emit('watchPointSaveButton', data: TWatchPointEmitData)
кнопка Save была нажата
- data - данные генерируемые для событий вотчпоинта
.emit('pointerMove', data: { position: { x: number, y: number } })
отправка положения курсора текущего юзера
- data.position - позиция курсора в координатах сцены
.emit('undo')
срабатывает при нажатии пользователем CTRL+Z/CMD-Z
.emit('redo')
срабатывает при нажатии пользователем CTRL+SHIFT+Z/CMD+SHIFT+Z
type TPosition2D {
x: number;
y: number;
}
данные ноды
interface TNodeData {
id: string; //идентификатор ноды
staticUid: string; //постоянный идентификатор ноды
name: string; //имя ноды
indicator: string; //индикатор ноды
isStartNode: boolean; //флаг устанавливает ноду как стартовую
logo: {
url: string; //ссылка на изображение
};
tagline: string; //слоган
inputs: TPortData[]; //список входных портов
outputs: TPortData[]; //список выходных портов
position: { //положение ноды в пространстве
x: number;
y: number;
};
width: number | null; //ширина ноды в условных единицах сцены
isPortsCollapsed: boolean; //флаг сворачивания всех портов
isInputPortsCollapsed: boolean; //флаг сворачивания входных портов
isOutputPortsCollapsed: boolean; //флаг сворачивания выходных портов
isSelected: boolean; //флаг выделенности ноды
}
путь линии, описание того откуда и куда должна идти линия
interface TLinePath {
output: { //откуда начинается соединение
nodeStaticUid: string; //статический идентификатор ноды
portId: string //идентификатор порта
};
input: { //куда идёт соединение
nodeStaticUid: string; //статический идентификатор ноды
portId: string //идентификатор порта
};
}
данные порта
interface TPortData {
id: string; //идентификатор порта
index: number; //порядковый номер порта для сортировки портов внутри ноды
name: string; //имя порта
type: TFlowDataTypes; //тип получаемой/передаваемой информации через порт
}
типы данных передаваемых через порты
type TFlowDataTypes = 'null' | 'boolean' | 'number' | 'string' | 'image' | 'images' | 'table' | 'json';
данные подключеного пользователя
type TAlienData = {
id: string; //идентификатор пользователя
color: string; //цвет пользователя в формате '#FF0000'
name: string; //имя пользователя
};
Данные вотчпоинта передаваемые эмиттером при возникновении различных событий
type WatchPointEmitData = {
nodeOut: TNodeData; //данные исходящей ноды
nodeIn: TNodeData; //данные входящей ноды
portOut: TPortData; //данные исходящего порта
portIn: TPortData; //данные входящего порта
selected: boolean; //флаг выбран ли вотчпоинт
visible: boolean; //видимость вотчпоинта
width: number; //ширина вотчпоинта
height: number; //высота вотчпоинта
position: { //позиция вотчпоинта в координатах сцены
x: number;
y: number;
};
data: TFlowData; //данные передаваемые через соединение
};
Данные соединения линии
type TLineEmitData = {
nodeOut: TNodeData; //данные ноды из которой идёт соединение
nodeIn: TNodeData; //данные ноды в которую идёт соединение
portOut: TPortData; //данные порта из которого идёт соединение
portIn: TPortData; //данные порта в который идёт соединение
};
данные передаваемые через соединение
type TFlowData =
| TFlowRaw
| TFlowSignal
| TFlowNull
| TFlowBoolean
| TFlowNumber
| TFlowString
| TFlowImage
| TFlowImages
| TFlowTable
| TFlowJSON
Данные передаваемые через порт типа Raw
interface TFlowRaw {
type: 'raw';
data: string;
isOverride: boolean;
}
Данные передаваемые через порт типа SIGNAL
interface TFlowSignal {
type: 'signal';
data: string;
}
Данные передаваемые через порт типа NULL
interface TFlowNull {
type: 'null';
data: string;
isOverride: boolean;
}
Данные передаваемые через порт типа BOOLEAN
interface TFlowBoolean {
type: 'boolean';
data: 'true' | 'false';
isOverride: boolean;
}
Данные передаваемые через порт типа NUMBER
interface TFlowNumber {
type: 'number';
data: string;
isOverride: boolean;
}
Данные передаваемые через порт типа STRING
interface TFlowString {
type: 'string';
data: string;
isOverride: boolean;
}
Данные передаваемые через порт типа IMAGE
interface TFlowImage {
type: 'image';
data: string;
isOverride: boolean;
}
Данные передаваемые через порт типа IMAGES
interface TFlowImages {
type: 'images';
data: { id: string; url: string }[];
isOverride: boolean;
}
Данные передаваемые через порт типа TABLE
interface TFlowTable {
type: 'table';
data: { [key: string]: string }[];
isOverride: boolean;
}
Данные передаваемые через порт типа JSON
interface TFlowJSON {
type: 'json';
fileName: string;
data: string;
isOverride: boolean;
}