npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@katonic/flow-builder

v0.1.4

Published

English | [简体中文](https://github.com/bytedance/flow-builder/blob/main/README.zh-CN.md)

Downloads

11

Readme

Introduction

English | 简体中文

A highly customizable streaming flow builder. The registration ability can flexibly customize your nodes, different types of node display and form, etc.

| demo1 | demo2 | | ------------------------------- | ------------------------------- |

Try it out

https://bytedance.github.io/flow-builder

Github

https://github.com/bytedance/flow-builder

Installation

yarn add react-flow-builder

or

npm install react-flow-builder

Usage

// index.tsx
import React, { useState, useContext } from 'react';
import FlowBuilder, {
  NodeContext,
  INode,
  IRegisterNode,
} from '@katonic/flow-builder';

import './index.css';

const StartNodeDisplay: React.FC = () => {
  const node = useContext(NodeContext);
  return <div className="start-node">{node.name}</div>;
};

const EndNodeDisplay: React.FC = () => {
  const node = useContext(NodeContext);
  return <div className="end-node">{node.name}</div>;
};

const OtherNodeDisplay: React.FC = () => {
  const node = useContext(NodeContext);
  return <div className="other-node">{node.name}</div>;
};

const ConditionNodeDisplay: React.FC = () => {
  const node = useContext(NodeContext);
  return <div className="condition-node">{node.name}</div>;
};

const registerNodes: IRegisterNode[] = [
  {
    type: 'start',
    name: 'start node',
    displayComponent: StartNodeDisplay,
    isStart: true,
  },
  {
    type: 'end',
    name: 'end node',
    displayComponent: EndNodeDisplay,
    isEnd: true,
  },
  {
    type: 'node',
    name: 'other node',
    displayComponent: OtherNodeDisplay,
  },
  {
    type: 'condition',
    name: 'condition node',
    displayComponent: ConditionNodeDisplay,
  },
  {
    type: 'branch',
    name: 'branch node',
    conditionNodeType: 'condition',
  },
];

const Demo = () => {
  const [nodes, setNodes] = useState<INode[]>([]);

  const handleChange = (nodes: INode[]) => {
    console.log('nodes change', nodes);
    setNodes(nodes);
  };

  return (
    <FlowBuilder
      nodes={nodes}
      onChange={handleChange}
      registerNodes={registerNodes}
    />
  );
};

export default Demo;

// index.css
.start-node, .end-node {
  height: 64px;
  width: 64px;
  border-radius: 50%;
  line-height: 64px;
  color: #fff;
  text-align: center;
}

.start-node {
  background-color: #338aff;
}

.end-node {
  background-color: #666;
}

.other-node, .condition-node {
  width: 224px;
  border-radius: 4px;
  color: #666;
  background: #fff;
  box-shadow: 0 0 8px rgba(0, 0, 0, 0.08);
}

.other-node {
  height: 118px;
  padding: 16px;
  display: flex;
  flex-direction: column;
}

.condition-node {
  height: 44px;
  padding: 12px 16px;
}

API

FlowBuilder

| Property | Description | Type | Required | Default | Version | | :------------------------ | :-------------------------------------------------- | :--------------------------------------------------------------------------- | :------- | :--------- | :------ | | backgroundColor | The color of background | string | | #F7F7F7 | | | className | The class name of the container | string | | - | | draggable | drag and drop | boolean | | false | 1.0.0 | | DragComponent | custom drag component | React.FC<DragComponent> | | - | 1.0.0 | | DropComponent | custom drop component | React.FC<DropComponent> | | - | 1.0.0 | | createUuid | custom node uuid | (type?: string) => string | | - | 2.0.0 | | DrawerComponent | Drawer component | React.FC<DrawerComponent> | | - | 2.0.0 | | PopoverComponent | Popover component | React.FC<PopoverComponent> | | - | 2.0.0 | | PopconfirmComponent | Popconfirm component | React.FC<PopconfirmComponent> | | - | 2.0.0 | | drawerProps | Extra props of DrawerComponent | any | | - | | | drawerVisibleWhenAddNode | Drawer visible when add node | boolean | | false | | | historyTool | undo and redo | boolean | HistoryToolConfig | | false | | layout | Use vertical or horizontal layout | vertical | horizontal | | vertical | | | lineColor | The color of line | string | | #999999 | | | nodes | The nodes of FlowBuilder | Node[] | ✓ | - | | | readonly | Readonly mode, cannot add, remove, configure. | boolean | | false | | | registerNodes | The registered nodes | RegisterNode[] | ✓ | - | | | registerRemoteNodes | The registered remote nodes | RegisterRemoteNode[] | | - | 1.3.0 | | showPracticalBranchNode | - | boolean | | false | 1.1.0 | | showPracticalBranchRemove | - | boolean | | false | 1.1.0 | | sortable | Condition nodes can be dragged and sorted in branch | boolean | | false | 1.4.0 | | sortableAnchor | Anchor for start dragging 序 | ReactNode | | - | 1.4.0 | | spaceX | Horizontal spacing between nodes | number | | 16 | | | spaceY | Vertical spacing between nodes | number | | 16 | | zoomTool | zoom | boolean | ZoomToolConfig | | false | | | onChange | Callback function for when the data change | (nodes: Node[], changeEvent: string, nodeChanged?: INode) => void | ✓ | - | | | onHistoryChange | | (undoDisabled: boolean, redoDisabled: boolean) => void | | - | | | onZoomChange | | (outDisabled: boolean, value: number, inDisabled: boolean) => void | | - | | | showArrow | Show arrow | boolean | | false | 1.4.5 | | arrowIcon | The icon of the arrow | ReactNode | | - | 1.4.5 | | onAddNodeSuccess | Called when add node success | (type: string, node: INode) => void | | - | 1.4.9 | | onDropNodeSuccess | Called when drop node success | (type: string, node: INode) => void | | - | 1.4.9 | | onRemoveNodeSuccess | Called when remove node success | (node: INode) => void | | - | 2.2.0 | | allowStartConfig | Allow start node config | boolean | | - | 2.1.0 | | allowEndConfig | Allow end node config | boolean | | - | 2.1.0 | | scrollByDrag | Scroll by mouse dragging | boolean | | - | 2.6.0 |

HistoryToolConfig

| Property | Description | Type | Default | | :------- | :---------- | :-------- | :------ | | hidden | | boolean | false | | max | | number | 10 |

ZoomToolConfig

| Property | Description | Type | Default | | :----------- | :---------- | :-------- | :------ | | hidden | | boolean | false | | initialValue | | number | 100 | | min | | number | 10 | | max | | number | 200 | | step | | number | 10 |

DragComponent

| Property | Description | Type | Version | | :---------- | :--------------------------------------------------------------------------------------------------------------------------------- | :--------------------------- | :------ | | onDragStart | The dragStart event of the custom drag component needs to call this method to set the dragged type( dragType in BuilderContext ) | (nodeType: string) => void | 1.0.0 | | onDragEnd | The dragEnd event of the custom drag component needs to call this method to clear the dragged type( dragType in BuilderContext ) | () => void | 1.0.0 |

DropComponent

| Property | Description | Type | Version | | :------- | :--------------------------------------------------------------------------------------------- | :----------- | :------ | | onDrop | The drop event of the custom drop component needs to call this method to add the new node type | () => void | 1.0.0 |

DrawerComponent

| Property | Description | Type | Version | | :----------------- | :--------------------------------------------------------------- | :------------------------------ | :------ | | visible | You can judge the boolean value of selectedNode by yourself. | any | 2.0.0 | | onClose | You can also call closeDrawer by yourself. | any | 2.0.0 | | children | | any | 2.0.0 | | title | | any | 2.0.0 | | width | | any | 2.0.0 | | destroyOnClose | | any | 2.0.0 | | maskClosable | | any | 2.0.0 | | configComponentRef | | React.MutableRefObject<any> | 2.5.0 |

PopoverComponent

| Property | Description | Type | Version | | :---------------- | :---------- | :---- | :------ | | visible | | any | 2.0.0 | | onVisibleChange | | any | 2.0.0 | | children | | any | 2.0.0 | | overlayClassName | | any | 2.0.0 | | placement | | any | 2.0.0 | | trigger | | any | 2.0.0 | | content | | any | 2.0.0 | | getPopupContainer | | any | 2.0.0 |

PopconfirmComponent

| Property | Description | Type | Version | | :---------------- | :----------------------------------------- | :---- | :------ | | title | | any | 2.0.0 | | onConfirm | You can also call removeNode yourself. | any | 2.0.0 | | children | | any | 2.0.0 | | getPopupContainer | | any | 2.0.0 |

FlowBuilderInstance

| Name | Description | Type | Version | | :---------- | :------------- | :------------------------------------------------------------------------------ | :------ | | add | add node | (node: INode, newNodeType: string) => void | (newNodeType: string) => void | | history | undo, redo | (type: 'undo' \| 'redo') => void | | remove | remove noded | (nodes: INode \| INode[] = useContext(NodeContext)) => void | | zoom | zoom | (type: 'out' \| 'in' \| number) => void | | closeDrawer | close drawer | () => void | | context | BuilderContext | BuilderContext | 1.3.5 |

Formatter

| Name | Description | Type | | :------------- | :---------------------- | :---------------------------------------------------------------------- | | buildFlatNodes | Translate to flat nodes | (params: {registerNodes: IRegisterNode[], nodes: INode[]}) => INode[] | | buildTreeNodes | Translate to tree nodes | (params: {nodes: INode[]}) => INode[] | | createUuid | Create uuid | (prefix?: string) => string |

RegisterNode

| Property | Description | Type | Required | Default | Version | | :------------------------ | :------------------------------------------------------------------------------------------------------------------------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | :------- | :-------------------------------- | :------ | | addableComponent | | React.FC<AddableComponent> | | - | | addableNodeTypes | The list of nodes that can be added below the node | string[] | | - | | addIcon | The icon in addable node list (There are already some default icons) | ReactNode | | - | | addConditionIcon | The icon of the branch node when adding a condition (The default icon already exists) | ReactNode | | - | 1.3.3 | | className | The class name of node | string | | - | 1.3.4 | | conditionMaxNum | The max number of condition node | number | | - | | conditionNodeType | The type of condition node | string | | - | | configComponent | The Component of configuring node form | React.FC<ConfigComponent> | React.ForwardRefExoticComponent<ConfigComponent & React.RefAttributes<any>> | | - | | configTitle | The drawer title of configuring node | string \| ((node: INode, nodes: INode[]) => string) | | - | | customRemove | Custom remove button | boolean | | false | | displayComponent | The Component of displaying node | React.FC<DisplayComponent> | | - | | initialNodeData | the initial data when add new node | Record<string, any> | | - | | isStart | Is start node | boolean | | false | | isEnd | Is end node | boolean | | false | | isLoop | Is loop node | boolean | | false | 1.4.6 | | name | The name of node | string | ✓ | - | | removeConfirmTitle | The confirmation information before deleting the node. The title of Popconfirm | string | ReactNode | | Are you sure to remove this node? | | showPracticalBranchNode | - | boolean | | false | 1.1.0 | | showPracticalBranchRemove | - | boolean | | false | 1.1.0 | | type | The type of node, promise start is start node type and end is end node type | string | ✓ | - |

RegisterRemoteNode

| Property | Description | Type | Required | Default | Version | | :------- | :------------- | :------- | :------- | :------ | :------ | | url | remote url | string | ✓ | - | 1.3.0 | | cssUrl | remote css url | string | | - | 1.3.0 |

DisplayComponent

| Property | Description | Type | | :------- | :---------------------------------------------------------------- | :----------------------------------- | | node | The all information of node (NodeContext is recommended since V1) | Node | | nodes | (BuilderContext is recommended since V1) | Node[] | | readonly | (BuilderContext is recommended since V1) | boolean | | remove | Remove node (useAction is recommended since V1) | (nodes?: INode \| INode[]) => void |

ConfigComponent

| Property | Description | Type | | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------- | | cancel | Called on cancel, used to close the drawer (useDrawer is recommended since V1) | () => void | | node | The all information of node (NodeContext is recommended since V1) | Node | | nodes | (BuilderContext is recommended since V1) | Node[] | | save | Called on save node data (automatically close the drawer, no need to call cancel). FlowBuilder will set the validateStatusError property according to the second param (useDrawer is recommended since V1) | (values: any, validateStatusError?: boolean) => void |

AddableComponent

| Property | Description | Type | | :------- | :---------------------------------------------------------------- | :----------------------- | | add | | (type: string) => void | | node | The all information of node (NodeContext is recommended since V1) | Node | | nodes | (BuilderContext is recommended since V1) | Node[] |

Node

| Property | Description | Type | | :------------------ | :------------------------------------------------------------------------------------------------------------------------------ | :-------------- | | children | The condition nodes array of branch node, or the next flow of condition node | Node[] | | configuring | Whether configuring of node. The display Component can highlight the node according to this property | boolean | | data | The data of node | any | | id | The unique id of node | string | | name | The name of node. Same as the name of the registered node | string | | path | The full path in FlowBuilder | string[] | | type | The type of node. Same as the type of the registered node | string | | validateStatusError | The Component of configuring node form validate failed. The display Component can highlight the node according to this property | boolean |

Context

Added since V1

In the context of FlowBuilder the following contexts can be used

BuilderContext

Contains props and state. The following is the state:

| Property | Description | Type | | :-------------------------- | :------------------------------------- | :----------------------------------- | | zoomValue | current zoom value | number | | setZoomValue | set zoomValue | (zoomValue: number) => void | | historyRecords | history nodes records | INode[][] | | setHistoryRecords | set historyRecords | (records: INode[][]) => void | | activeHistoryRecordIndex | current index in history nodes records | number | | setActiveHistoryRecordIndex | set activeHistoryRecordIndex | (index: number) => void | | selectedNode | current selecred node | INode \| undefined | | setSelectedNode | set selectedNode | (node: INode \| undefined) => void | | drawerTitle | the title of Drawer | string | | setDrawerTitle | set drawerTitle | (title: string) => void | | dragType | dragged node type | string | | setDragType | set dragType | (type: string) => void |

NodeContext

Get the data of the node where it is used. For details Node

Hooks

Added since V1

In the context of FlowBuilder the following hooks can be used

useAction

| Property | Description | Type | Version | | :------------ | :-------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------ | :------ | | clickNode | click node | (node: INode = useContext(NodeContext)) => void | | addNode | add one node. (Get the current node through NodeContext when there is no node property) | (node: INode, newNodeType: string) => void | (newNodeType: string) => void | | addNodeInLoop | add one node in loop node. | (newNodeType: string) => void | 1.4.6 | | removeNode | remove one node or more nodes. | (targetNode: INode \| INode[] = useContext(NodeContext)) => void |

useDrawer

| Property | Description | Type | | :---------- | :------------------------------------------------------------------------------------------ | :----------------------------------------------------- | | closeDrawer | close Drawer and clear selectedNode | () => void | | saveDrawer | save the content in Drawer (same as the save method in ConfigComponent) | (values: any, validateStatusError?: boolean) => void |

useZoom

| Property | Description | Type | | :------- | :----------------------------------------------------------------------------------------- | :---------------------------------------- | | minZoom | minimum zoom value | number | | maxZoom | maximum zoom value | number | | zoom | change zoom value (same as the zoom method in FlowBuilderInstance) | (type: 'out' \| 'in' \| number) => void |

useHistory

| Property | Description | Type | | :---------- | :------------------------------------------------------------------------------------- | :-------------------------------------------------------------- | | maxLength | Maximum length of history nodes records | number | | pushHistory | add history nodes record | (record?: INode[] = useContext(BuilderContext).nodes) => void | | history | undo, redo (same as the history method in FlowBuilderInstance) | (type: 'undo' \| 'redo') => void |

useSort

| Property | Description | Type | Version | | :------- | :--------------- | :------------------------------------------------ | :------ | | backward | sort to backward | (node: INode = useContext(NodeContext)) => void | 1.4.3 | | forward | sort to forward | (node: INode = useContext(NodeContext)) => void | 1.4.3 | | end | sort to end | (node: INode = useContext(NodeContext)) => void | 1.4.3 | | start | sort to start | (node: INode = useContext(NodeContext)) => void | 1.4.3 |