mirror of
https://gitee.com/ByteDance/flowgram.ai.git
synced 2025-07-07 17:43:29 +08:00
3147 lines
62 KiB
Plaintext
3147 lines
62 KiB
Plaintext
---
|
||
url: /guide/introduction.md
|
||
---
|
||
|
||
#
|
||
|
||
FlowGram 是一套基于节点编辑的流程搭建引擎,帮助开发者快速创建固定布局或自由连线布局模式的流程,并提供一套交互的最佳实践,
|
||
很适合有明确输入和输出的可视化工作流。
|
||
|
||
在 AI 如火如荼的当下,我们也会更专注于如何让流程赋能 AI,为此特意加上 AI 后缀。
|
||
|
||
官方 Demo#
|
||
|
||
交互体验#
|
||
|
||
提供一套交互的最佳实践,让操作流程更加丝滑
|
||
|
||
线上应用#
|
||
|
||
|
||
|
||
---
|
||
url: /examples/index.md
|
||
---
|
||
|
||
|
||
|
||
|
||
---
|
||
url: /examples/fixed-layout/fixed-layout-simple.md
|
||
---
|
||
|
||
#
|
||
|
||
安装#
|
||
|
||
源码#
|
||
|
||
https://github.com/bytedance/flowgram.ai/tree/main/apps/demo-fixed-layout-simple
|
||
|
||
|
||
|
||
---
|
||
url: /examples/fixed-layout/fixed-composite-nodes.md
|
||
---
|
||
|
||
#
|
||
|
||
安装#
|
||
|
||
源码#
|
||
|
||
* jsonData:
|
||
https://github.com/bytedance/flowgram.ai/tree/main/apps/demo-fixed-layout-sim
|
||
ple/src/data
|
||
* nodeRegistries:
|
||
https://github.com/bytedance/flowgram.ai/tree/main/packages/canvas-engine/fix
|
||
ed-layout-core/src/activities
|
||
|
||
|
||
|
||
---
|
||
url: /examples/fixed-layout/fixed-feature-overview.md
|
||
---
|
||
|
||
#
|
||
|
||
安装#
|
||
|
||
源码#
|
||
|
||
https://github.com/bytedance/flowgram.ai/tree/main/apps/demo-fixed-layout
|
||
|
||
功能介绍#
|
||
|
||
|
||
|
||
---
|
||
url: /examples/free-layout/free-layout-simple.md
|
||
---
|
||
|
||
#
|
||
|
||
功能介绍#
|
||
|
||
Free Layout 是 Flowgram.ai 提供的自由布局编辑器组件,允许用户创建和编辑流程图、工作流和各种节点连接图表。核心功能包括:
|
||
|
||
* 节点自由拖拽与定位
|
||
* 节点连接与边缘管理
|
||
* 可配置的节点注册与自定义渲染
|
||
* 内置撤销/重做历史记录
|
||
* 支持插件扩展(如缩略图、自动对齐等)
|
||
|
||
从零构建自由布局编辑器#
|
||
|
||
本节将带你从零开始构建一个自由布局编辑器应用,完整演示如何使用 @flowgram.ai/free-layout-editor 包构建一个可交互的流程编辑器。
|
||
|
||
1. 环境准备#
|
||
|
||
首先,我们需要创建一个新的项目:
|
||
|
||
2. 项目结构#
|
||
|
||
创建完成后,项目结构如下:
|
||
|
||
3. 开发流程#
|
||
|
||
步骤一:定义初始数据#
|
||
|
||
首先,我们需要定义画布的初始数据结构,包括节点和连线:
|
||
|
||
步骤二:注册节点类型#
|
||
|
||
接下来,我们需要定义不同类型节点的行为和外观:
|
||
|
||
步骤三:创建编辑器配置#
|
||
|
||
使用 React hook 封装编辑器配置:
|
||
|
||
步骤四:创建节点添加面板#
|
||
|
||
步骤五:创建工具栏和缩略图#
|
||
|
||
步骤六:组装编辑器主组件#
|
||
|
||
步骤七:创建应用入口#
|
||
|
||
步骤八:添加样式#
|
||
|
||
4. 运行项目#
|
||
|
||
完成上述步骤后,你可以运行项目查看效果:
|
||
|
||
项目将在本地启动,通常访问 http://localhost:3000 即可看到效果。
|
||
|
||
核心概念#
|
||
|
||
1. 数据结构#
|
||
|
||
Free Layout 使用标准化的数据结构来描述节点和连接:
|
||
|
||
2. 节点注册#
|
||
|
||
使用 nodeRegistries 定义不同类型节点的行为和外观:
|
||
|
||
3. 编辑器组件#
|
||
|
||
4. 核心钩子函数#
|
||
|
||
在组件中可以使用多种钩子函数获取和操作编辑器:
|
||
|
||
5. 插件扩展#
|
||
|
||
Free Layout 支持通过插件机制扩展功能:
|
||
|
||
安装#
|
||
|
||
源码#
|
||
|
||
https://github.com/bytedance/flowgram.ai/tree/main/apps/demo-free-layout-simple
|
||
|
||
|
||
|
||
---
|
||
url: /examples/free-layout/free-feature-overview.md
|
||
---
|
||
|
||
#
|
||
|
||
安装#
|
||
|
||
源码#
|
||
|
||
https://github.com/bytedance/flowgram.ai/tree/main/apps/demo-free-layout
|
||
|
||
功能介绍#
|
||
|
||
|
||
|
||
---
|
||
url: /examples/node-form/basic.md
|
||
---
|
||
|
||
#
|
||
|
||
|
||
|
||
---
|
||
url: /examples/node-form/effect.md
|
||
---
|
||
|
||
#
|
||
|
||
以下例子展示了表单副作用的配置方式。举了两个个例子,行为描述如下
|
||
|
||
1. Basic effect(基础例子):当表单项值变更时,控制台会打印表单当前值。
|
||
2. Control other fields (控制其他表单项的值):当前表单项数据变更时要同时改变另一个表单项的值。
|
||
|
||
|
||
|
||
---
|
||
url: /examples/node-form/array.md
|
||
---
|
||
|
||
#
|
||
|
||
以下例子展示了数组的基本用法,包含:
|
||
|
||
* 基本写法(渲染、增删)。
|
||
* 如何对数组每项配置校验逻辑。 此处的校验规则为每项最大长度不超过8个英文字符。
|
||
* 如何对数组每项配置副作用。 此处的副作用为每项在初始化时控制台输出 ${name} value init to ${value}, 值变更时输出
|
||
${name} value changed to ${value}
|
||
* 数组项如何做交换。
|
||
|
||
|
||
|
||
---
|
||
url: /examples/node-form/dynamic.md
|
||
---
|
||
|
||
#
|
||
|
||
当前例子展示了如何通过 deps 字段来声明表单项之间的联动更新关系。
|
||
|
||
例子说明:当 Country 有值时才会显示 City 字段。
|
||
|
||
你也可以将form.getValueIn('country') 作为 city Field 下组件的入参,来控制组件内的行为,
|
||
如筛选当前country下的cities。
|
||
|
||
|
||
|
||
---
|
||
url: /api/common-apis.md
|
||
---
|
||
|
||
#
|
||
|
||
FlowDocument (自动化布局文档数据)#
|
||
|
||
WorkflowDocument (自由连线布局文档数据) 继承自 FlowDocument#
|
||
|
||
FlowNodeEntity(节点)#
|
||
|
||
Playground (画布)#
|
||
|
||
SelectionService (选择器)#
|
||
|
||
|
||
|
||
---
|
||
url: /api/index.md
|
||
---
|
||
|
||
|
||
|
||
|
||
---
|
||
url: /api/plugins.md
|
||
---
|
||
|
||
这里是官网 api 配置,demo 用。
|
||
|
||
|
||
|
||
---
|
||
url: /api/plugins/config-basic.md
|
||
---
|
||
|
||
#
|
||
|
||
|
||
root#
|
||
|
||
* Type: string
|
||
* Default: docs
|
||
|
||
Specifies the document root directory. For example:
|
||
|
||
|
||
|
||
This config supports both relative and absolute paths, with relative paths being
|
||
relative to the current working directory(cwd).
|
||
|
||
Of course, in addition to specifying the document root directory through the
|
||
config file, you can also specify it through command line parameters, such as:
|
||
|
||
|
||
|
||
|
||
base#
|
||
|
||
* Type: string
|
||
* Default: /
|
||
|
||
Deployment base path. For example, if you plan to deploy your site to
|
||
https://foo.github.io/bar/, then you should set base to "/bar/":
|
||
|
||
|
||
|
||
|
||
title#
|
||
|
||
* Type: string
|
||
* Default: "Rspress"
|
||
|
||
Site title. This parameter will be used as the title of the HTML page. For
|
||
example:
|
||
|
||
|
||
|
||
|
||
description#
|
||
|
||
* Type: string
|
||
* Default: ""
|
||
|
||
Site description. This will be used as the description of the HTML page. For
|
||
example:
|
||
|
||
|
||
|
||
|
||
icon#
|
||
|
||
* Type: string
|
||
* Default: ""
|
||
|
||
Site icon. This path will be used as the icon path for the HTML page. For
|
||
example:
|
||
|
||
|
||
|
||
The framework will find your icon in the public directory, of course you can
|
||
also set it to a CDN address.
|
||
|
||
|
||
logo#
|
||
|
||
* Type: string | { dark: string; light: string }
|
||
* Default: ""
|
||
|
||
Site logo. This path will be used as the logo path in the upper left corner of
|
||
the navbar. For example:
|
||
|
||
|
||
|
||
The framework will find your icon in the public directory, you can also set it
|
||
to a CDN address.
|
||
|
||
Of course you can set different logos for dark/light mode:
|
||
|
||
|
||
|
||
|
||
logoText#
|
||
|
||
* Type: string
|
||
* Default: ""
|
||
|
||
Site logo Text. This text will be used as the logo text in the upper left corner
|
||
of the navbar. For example:
|
||
|
||
|
||
|
||
|
||
outDir#
|
||
|
||
* Type: string
|
||
* Default: doc_build
|
||
|
||
Custom output directory for built sites. for example:
|
||
|
||
|
||
|
||
|
||
locales#
|
||
|
||
* Type: Locale[]
|
||
|
||
|
||
|
||
I18n config of the site. for example:
|
||
|
||
|
||
|
||
|
||
head#
|
||
|
||
* Type: string | [string, Record<string, string>] | (route) => string |
|
||
[string, Record<string, string>] | undefined
|
||
* Can be appended per page via frontmatter
|
||
|
||
Additional elements to render in the <head> tag in the page HTML.
|
||
|
||
|
||
|
||
|
||
mediumZoom#
|
||
|
||
* Type: boolean | { selector?: string }
|
||
* Default: true
|
||
|
||
Whether to enable the image zoom function. It is enabled by default, you can
|
||
disable it by setting mediumZoom to false.
|
||
|
||
> The bottom layer is implemented using the medium-zoom library.
|
||
|
||
Example usage:
|
||
|
||
|
||
|
||
|
||
search#
|
||
|
||
* Type: { searchHooks: string; versioned: boolean; }
|
||
|
||
|
||
searchHooks#
|
||
|
||
You can add search runtime hooks logic through the searchHooks parameter, for
|
||
example:
|
||
|
||
|
||
|
||
For specific hook logic, you can read Customize Search Functions.
|
||
|
||
|
||
versioned#
|
||
|
||
If you are using multiVersion, the versioned parameter allows you to create a
|
||
separate search index for each version of your documentation. When enabled, the
|
||
search will only query the index corresponding to the currently selected
|
||
version.
|
||
|
||
|
||
|
||
|
||
globalUIComponents#
|
||
|
||
* Type: (string | [string, object])[]
|
||
* Default: []
|
||
|
||
You can register global UI components through the globalUIComponents parameter,
|
||
for example:
|
||
|
||
|
||
|
||
The item of globalUIComponents can be a string, which is the path of the
|
||
component file, or an array, the first item is the path of the component file,
|
||
and the second item is the component props, for example:
|
||
|
||
|
||
|
||
|
||
multiVersion#
|
||
|
||
* Type: { default: string; versions: string[] }
|
||
|
||
You can enable multi-version support through the multiVersion parameter, for
|
||
example:
|
||
|
||
|
||
|
||
The default parameter is the default version, and the versions parameter is the
|
||
version list.
|
||
|
||
|
||
route#
|
||
|
||
* Type: Object
|
||
|
||
Custom route config.
|
||
|
||
|
||
route.include#
|
||
|
||
* Type: string[]
|
||
* Default: []
|
||
|
||
Add some extra files in the route. By default, only the files in the document
|
||
root directory will be included in the route. If you want to add some extra
|
||
files to the route, you can use this option. For example:
|
||
|
||
|
||
|
||
> Note: The strings in the array support glob patterns, the glob expression
|
||
> should be based on the root directory of the document, with the corresponding
|
||
> extensions suffix.
|
||
|
||
NOTE
|
||
|
||
We recommend using addPages hook in a custom Rspress plugin to add some
|
||
additional files to the route, so that the page route and file path/content can
|
||
be specified more flexibly and reasonably.
|
||
|
||
|
||
route.exclude#
|
||
|
||
* Type: string[]
|
||
* Default: []
|
||
|
||
Exclude some files from the route. For example:
|
||
|
||
|
||
|
||
> Note: The strings in the array support glob patterns, the glob expression
|
||
> should be based on the root directory of the document.
|
||
|
||
|
||
route.extensions#
|
||
|
||
* Type: string[]
|
||
* Default: []
|
||
|
||
The extensions of the files that will be included in the route. By default,
|
||
Rspress will include all 'js', 'jsx', 'ts', 'tsx', 'md', 'mdx' files in the
|
||
route. If you want to customize the extensions, you can use this option. For
|
||
example:
|
||
|
||
|
||
|
||
|
||
route.cleanUrls#
|
||
|
||
* Type: Boolean
|
||
* Default: false
|
||
|
||
Generate url without suffix when cleanUrls is true for shorter url link.
|
||
|
||
|
||
|
||
|
||
ssg#
|
||
|
||
* Type: boolean | { strict?: boolean }
|
||
* Default: true
|
||
|
||
Determines whether to enable Static Site Generation. It is enabled by default,
|
||
but you can disable it by setting ssg to false.
|
||
|
||
|
||
|
||
If SSG fails, it will fallback to CSR by default. You can set ssg to { strict:
|
||
true } to strictly require SSG to succeed, otherwise an error will be thrown.
|
||
|
||
|
||
|
||
|
||
replaceRules#
|
||
|
||
* Type: { search: string | RegExp; replace: string; }[]
|
||
* Default: []
|
||
|
||
You can set text replacement rules for the entire site through replaceRules. The
|
||
rules will apply to everything including _meta.json files, frontmatter
|
||
configurations, and document content and titles.
|
||
|
||
|
||
|
||
|
||
---
|
||
url: /api/plugins/config-build.md
|
||
---
|
||
|
||
#
|
||
|
||
|
||
builderConfig#
|
||
|
||
* Type: RsbuildConfig
|
||
|
||
Used to customize the configurations of Rsbuild. For detailed configurations,
|
||
please refer to Rsbuild - Config.
|
||
|
||
* Example: Use resolve.alias to configure path aliases:
|
||
|
||
|
||
|
||
* Example: Use tools.rspack to modify the Rspack configuration, such as
|
||
registering a webpack or Rspack plugin:
|
||
|
||
|
||
|
||
WARNING
|
||
|
||
If you want to modify the output directory, please use outDir.
|
||
|
||
|
||
builderPlugins#
|
||
|
||
* Type: RsbuildPlugin[]
|
||
|
||
Used to register Rsbuild plugins.
|
||
|
||
You can use the rich plugins of Rsbuild in the Rspress project to quickly extend
|
||
the building capabilities.
|
||
|
||
* Example: Support Vue SFC through @rsbuild/plugin-vue
|
||
|
||
|
||
|
||
* Example: Add Google analytics through rsbuild-plugin-google-analytics
|
||
|
||
|
||
|
||
* Example: Add Open Graph meta tags through rsbuild-plugin-open-graph
|
||
|
||
|
||
|
||
You can also override the built-in plugins @rsbuild/plugin-react,
|
||
@rsbuild/plugin-sass and @rsbuild/plugin-less, and customize relevant plugin
|
||
options.
|
||
|
||
* Example: Modify related options of built-in @rsbuild/plugin-less plugin
|
||
|
||
|
||
|
||
|
||
Default Config#
|
||
|
||
If you need to view the default Rspack or Rsbuild configs, you can add the
|
||
DEBUG=rsbuild parameter when running the rspress dev or rspress build command:
|
||
|
||
|
||
|
||
After execution, the rsbuild.config.js file is created in the doc_build
|
||
directory, which contains the complete builderConfig.
|
||
|
||
> Please refer to Rsbuild - Debug Mode for more information on how to debug the
|
||
> Rsbuild.
|
||
|
||
|
||
markdown#
|
||
|
||
* Type: Object
|
||
|
||
Configure MDX-related compilation abilities.
|
||
|
||
|
||
markdown.remarkPlugins#
|
||
|
||
* Type: Array
|
||
* Default: []
|
||
|
||
Configure the remark plugins. for example:
|
||
|
||
|
||
|
||
|
||
markdown.rehypePlugins#
|
||
|
||
* Type: Array
|
||
|
||
Configure the rehype plugin. for example:
|
||
|
||
|
||
|
||
|
||
markdown.checkDeadLinks#
|
||
|
||
* Type: boolean
|
||
* Default: false
|
||
|
||
Whether to check for dead links. for example:
|
||
|
||
|
||
|
||
After enabling this config, the framework will check the links in the document
|
||
based on the conventional routing table. If there is an unreachable link, the
|
||
build will throw an error and exit.
|
||
|
||
|
||
markdown.mdxRs#
|
||
|
||
* Type: boolean | { include: (filepath: string) => boolean }
|
||
* Default: true
|
||
|
||
|
||
markdown.showLineNumbers#
|
||
|
||
* Type: boolean
|
||
|
||
Whether to display the line number of the code block. Defaults to false.
|
||
|
||
|
||
markdown.defaultWrapCode#
|
||
|
||
* Type: boolean
|
||
|
||
Whether to enable long code line wrapping display by default. Defaults to false.
|
||
|
||
|
||
markdown.globalComponents#
|
||
|
||
* Type: string[]
|
||
|
||
Register component to the global scope, which will make it automatically
|
||
available in every MDX file, without any import statements.For example:
|
||
|
||
|
||
|
||
Then you can use the Alert component in any MDX file:
|
||
|
||
|
||
|
||
Danger
|
||
|
||
Please set markdown.mdxRs to false when configuring globalComponents, otherwise
|
||
the global components will not take effect.
|
||
|
||
|
||
markdown.highlightLanguages#
|
||
|
||
* Type: [string, string][]
|
||
* Default:
|
||
|
||
|
||
|
||
Rspress supports automatic import of highlighted languages and makes some
|
||
language aliases by default.
|
||
|
||
* By default, it is implemented based on Prism.js. You can also switch to Shiki
|
||
through @rspress/plugin-shiki.
|
||
* The default configuration alias languages include js, jsx, ts, tsx, xml, md,
|
||
mdx.
|
||
|
||
You can also extend these default aliases, such as:
|
||
|
||
|
||
|
||
The alias of each language is configured in the format of [string, string]. The
|
||
former is the alias of the language, and the latter is the full name of the
|
||
language. You can go to File List to view the full names of all supported
|
||
languages.
|
||
|
||
|
||
---
|
||
url: /api/plugins/config-frontmatter.md
|
||
---
|
||
|
||
#
|
||
|
||
|
||
title#
|
||
|
||
* Type: string
|
||
|
||
The title of the page. By default, the page's h1 heading will be used as the
|
||
title of the HTML document. But if you want to use a different title, you can
|
||
use Front Matter to specify the title of the page. For example:
|
||
|
||
|
||
|
||
|
||
description#
|
||
|
||
* Type: string
|
||
|
||
A custom description for the page. For example:
|
||
|
||
|
||
|
||
|
||
pageType#
|
||
|
||
* Type: 'home' | 'doc' | 'custom' | 'blank' | '404'
|
||
* Default: 'doc'
|
||
|
||
The type of the page. By default, the page type is doc. But if you want to use a
|
||
different page type, you can use the Front Matter field pageType to specify the
|
||
page type. E.g:
|
||
|
||
|
||
|
||
The meaning of each pageType config is as follows:
|
||
|
||
|
||
titleSuffix#
|
||
|
||
* Type: string
|
||
|
||
Set the suffix of the page title. When titleSuffix is not set, the site's title
|
||
is used as the suffix by default.
|
||
|
||
|
||
|
||
The default separator between the title and the suffix is -, you can also use |
|
||
for separation:
|
||
|
||
|
||
|
||
|
||
head#
|
||
|
||
* Type: [string, Record<string, string>][]
|
||
|
||
Specify extra head tags to be injected for the current page. Will be appended
|
||
after head tags injected by site-level config.
|
||
|
||
For example, you can use these headers to specify custom meta tags for Open
|
||
Graph.
|
||
|
||
|
||
|
||
Note
|
||
|
||
Make sure to correctly define the header tag names and their attribute names.
|
||
|
||
For tags and attribute names that contain a hyphen (-), use the camelCase
|
||
format. For example, http-equiv="refresh" should be defined as httpEquiv:
|
||
refresh.
|
||
|
||
This is because under the hood, headers are handled by React and
|
||
react-helmet-async.
|
||
|
||
|
||
hero#
|
||
|
||
* Type: Object
|
||
|
||
The hero config for the home page. It has the following types:
|
||
|
||
|
||
|
||
For example, you can use the following Front Matter to specify a page's hero
|
||
config:
|
||
|
||
|
||
|
||
When setting hero.text, you can use the | symbol in YAML to manually control
|
||
line breaks:
|
||
|
||
|
||
|
||
Or you can use HTML to specify the hero config for the page:
|
||
|
||
|
||
|
||
|
||
features#
|
||
|
||
* Type: Array
|
||
* Default: []
|
||
|
||
features config of the home page. It has the following types:
|
||
|
||
|
||
|
||
For example, you could use the following to specify the features configuration
|
||
for the home page:
|
||
|
||
|
||
|
||
|
||
sidebar#
|
||
|
||
Whether to show the sidebar on the left. By default, the doc page will display
|
||
the sidebar on the left. If you want to hide the sidebar on the left, you can
|
||
use the following Front Matter config:
|
||
|
||
|
||
|
||
|
||
outline#
|
||
|
||
Whether to display the outline column on the right. By default, the doc page
|
||
displays the outline column on the right. You can hide the outline column with
|
||
the following config:
|
||
|
||
|
||
|
||
|
||
footer#
|
||
|
||
Whether to display the components at the bottom of the document (such as
|
||
previous/next page). By default, the doc page will display the footer at the
|
||
bottom. You can hide the footer with the following config:
|
||
|
||
|
||
|
||
|
||
navbar#
|
||
|
||
Whether to hide the top navigation bar. You can hide the top nav bar with the
|
||
following config:
|
||
|
||
|
||
|
||
|
||
overviewHeaders#
|
||
|
||
* Type: number[]
|
||
* Default: [2]
|
||
|
||
The headers shown in the overview page. By default, the displayed header is h2.
|
||
But if you want to display different headers, you can specify it using the
|
||
overviewHeaders Front Matter field. For example:
|
||
|
||
|
||
|
||
Or
|
||
|
||
|
||
|
||
|
||
context#
|
||
|
||
* Type: string
|
||
|
||
After configuration, the data-context attribute will be added to the DOM node
|
||
when the sidebar is generated, and the value is the configured value.
|
||
|
||
|
||
|
||
|
||
|
||
The DOM structure of the final generated sidebar is abbreviated as follows:
|
||
|
||
|
||
|
||
|
||
---
|
||
url: /api/plugins/config-theme.md
|
||
---
|
||
|
||
#
|
||
|
||
Theme config is located under themeConfig in the doc param. For example:
|
||
|
||
|
||
|
||
|
||
nav#
|
||
|
||
* Type: Array
|
||
* Default: []
|
||
|
||
The nav configuration is an array of NavItem with the following types:
|
||
|
||
|
||
|
||
activeMatch is used to match the current route, when the route matches the
|
||
activeMatch rule, the nav item will be highlighted. By default, activeMatch is
|
||
the link of the nav item.
|
||
|
||
For example:
|
||
|
||
|
||
|
||
Of course, multi-level menus can also be configured in the nav array with the
|
||
following types:
|
||
|
||
|
||
|
||
For example the following configuration:
|
||
|
||
|
||
|
||
|
||
sidebar#
|
||
|
||
* Type: Object
|
||
|
||
The sidebar of the website. The config is an object with the following types:
|
||
|
||
|
||
|
||
For example:
|
||
|
||
|
||
|
||
|
||
footer#
|
||
|
||
* Type: Object
|
||
* Default: {}
|
||
|
||
The footer of the home page.
|
||
|
||
The footer config is an object of Footer, which has the following types:
|
||
|
||
|
||
|
||
message is a string that can contain HTML content. This string will be inserted
|
||
into the footer using dangerouslySetInnerHTML, allowing you to pass in HTML
|
||
template tags to design your footer.
|
||
|
||
For example:
|
||
|
||
|
||
|
||
|
||
outlineTitle#
|
||
|
||
* Type: string
|
||
* Default: 'ON THIS PAGE'
|
||
|
||
Configure the title of the outline in the outline panel.
|
||
|
||
For example:
|
||
|
||
|
||
|
||
|
||
lastUpdated#
|
||
|
||
* Type: boolean
|
||
* Default: false
|
||
|
||
Whether to display the last update time, it is not displayed by default.
|
||
|
||
For example:
|
||
|
||
|
||
|
||
|
||
lastUpdatedText#
|
||
|
||
* Type: string
|
||
* Default: Last Updated
|
||
|
||
The text of the last update time.
|
||
|
||
For example:
|
||
|
||
|
||
|
||
|
||
prevPageText#
|
||
|
||
* Type: string
|
||
* Default: Previous Page
|
||
|
||
The text of the previous page. for example:
|
||
|
||
|
||
|
||
|
||
searchPlaceholderText#
|
||
|
||
* Type: string
|
||
* Default: Search Docs
|
||
|
||
The placeholder text of the search box. For example:
|
||
|
||
|
||
|
||
|
||
searchNoResultsText#
|
||
|
||
* Type: string
|
||
* Default: No results for
|
||
|
||
The text of no search result. For example:
|
||
|
||
|
||
|
||
|
||
searchSuggestedQueryText#
|
||
|
||
* Type: string
|
||
* Default: Please try again with a different keyword
|
||
|
||
The text of suggested query text when no search result. For example:
|
||
|
||
|
||
|
||
|
||
overview#
|
||
|
||
* Type: Object
|
||
|
||
The config of overview page/component. The config is an object with the
|
||
following types:
|
||
|
||
|
||
|
||
For example:
|
||
|
||
|
||
|
||
|
||
socialLinks#
|
||
|
||
* Type: Array
|
||
* Default: []
|
||
|
||
You can add related links through the following config, such as github links, x
|
||
links, etc. Related links support four modes: link mode text mode image mode dom
|
||
mode, for example:
|
||
|
||
|
||
|
||
* When in link mode, click the icon to jump to the link.
|
||
* When in text mode, when the mouse moves over the icon, a pop-up box will be
|
||
displayed, and the content of the pop-up box is the entered text
|
||
* When in the img mode, moving the mouse over the icon will display a bullet
|
||
box, and the content of the bullet box is the specified picture. It should be
|
||
noted that the picture needs to be placed in the public directory.
|
||
* When in dom mode, html to render can be passed directly into the content
|
||
field. Use '' for wrapping
|
||
|
||
Related links support the following types of images, which can be selected
|
||
through the icon attribute:
|
||
|
||
|
||
|
||
If you need to customize the icon, you can pass in an object with svg attribute,
|
||
and the value of svg is the content of the custom icon, for example:
|
||
|
||
|
||
|
||
|
||
nextPageText#
|
||
|
||
* Type: string
|
||
* Default: Next Page
|
||
|
||
Text for the next page. for example:
|
||
|
||
|
||
|
||
|
||
locales#
|
||
|
||
* Type: Array<LocaleConfig>
|
||
* Default: undefined
|
||
|
||
I18n config. This config is an array, and every item of it is LocaleConfig, and
|
||
the types are as follows:
|
||
|
||
|
||
|
||
LocaleConfig contains many of the same configuration options as the theme
|
||
config, but the former will have a higher priority.
|
||
|
||
|
||
darkMode#
|
||
|
||
* Type: boolean
|
||
* Default: true
|
||
|
||
Whether a Dark/Light mode toggle button appears. for example:
|
||
|
||
|
||
|
||
You can also specify the default theme mode through inject global variable into
|
||
html template, for example:
|
||
|
||
|
||
|
||
|
||
hideNavbar#
|
||
|
||
* Type: "always" | "auto" | "never"
|
||
* Default: never
|
||
|
||
Control the behavior of the hidden navigation bar. By default, the navigation
|
||
bar will always display. You can set it to auto to automatically hide when the
|
||
page scrolls down, or set it to always to hidden it all the time.
|
||
|
||
For example:
|
||
|
||
|
||
|
||
|
||
enableContentAnimation#
|
||
|
||
* Type: boolean
|
||
* Default: false
|
||
|
||
Whether there is animation effect when switching between pages. It is
|
||
implemented with View Transition API. For example:
|
||
|
||
> The animation is not configurable for now.
|
||
|
||
|
||
|
||
|
||
enableAppearanceAnimation#
|
||
|
||
* Type: boolean
|
||
* Default: false
|
||
|
||
Whether there is animation effect when switching between light and dark theme.
|
||
It is implemented with View Transition API. For example:
|
||
|
||
> The animation is not configurable for now.
|
||
|
||
|
||
|
||
|
||
search#
|
||
|
||
* Type: boolean
|
||
* Default: true
|
||
|
||
Whether to display the search box. For example:
|
||
|
||
|
||
|
||
|
||
sourceCodeText#
|
||
|
||
* Type: string
|
||
* Default: Source
|
||
|
||
The text of the source code button. For example:
|
||
|
||
|
||
|
||
|
||
enableScrollToTop#
|
||
|
||
* Type: boolean
|
||
* Default: false
|
||
|
||
Enable scroll to top button on documentation. For example:
|
||
|
||
|
||
|
||
|
||
localeRedirect#
|
||
|
||
* Type: 'auto' | 'never'
|
||
* Default: 'auto'
|
||
|
||
Whether to redirect to the locale closest to window.navigator.language when the
|
||
user visits the site, the default is auto, which means that the user will be
|
||
redirected on the first visit. If you set it to never, the user will not be
|
||
redirected. For example:
|
||
|
||
|
||
|
||
|
||
---
|
||
url: /api/core/flow-document.md
|
||
---
|
||
|
||
#
|
||
|
||
流程数据文档 (固定布局), 存储流程的所有节点数据
|
||
|
||
> API Detail
|
||
|
||
DANGER
|
||
|
||
对节点的操作最好通过 ctx.operation 进行操作, 这样才能绑定到 redo/undo
|
||
|
||
root#
|
||
|
||
获取画布的根节点,所有节点都挂在根节点下边
|
||
|
||
originTree#
|
||
|
||
画布真实的节点树
|
||
|
||
renderTree#
|
||
|
||
画布渲染时的节点树,为了提升性能,渲染的树会随着节点分支折叠而变化,并非真实的树
|
||
|
||
getAllNodes#
|
||
|
||
获取所有节点数据
|
||
|
||
getNode#
|
||
|
||
通过指定 id 获取节点
|
||
|
||
getNodeRegistry#
|
||
|
||
获取节点的定义, 节点定义可以根据业务自己扩展配置项
|
||
|
||
fromJSON/toJSON#
|
||
|
||
导入和导出数据
|
||
|
||
registerFlowNodes#
|
||
|
||
注册节点的配置项目, 支持继承
|
||
|
||
addNode#
|
||
|
||
添加节点
|
||
|
||
addFromNode#
|
||
|
||
添加到指定节点的后边
|
||
|
||
addBlock#
|
||
|
||
为指定节点添加分支节点
|
||
|
||
removeNode#
|
||
|
||
删除节点
|
||
|
||
onNodeCreate/onNodeUpdate/onNodeDispose#
|
||
|
||
节点创建/更新/销毁事件, 返回事件的注销函数
|
||
|
||
traverse#
|
||
|
||
从指定节点遍历所有子节点, 默认根节点
|
||
|
||
toString#
|
||
|
||
返回节点结构的字符串快照
|
||
|
||
|
||
|
||
---
|
||
url: /api/core/flow-node-entity.md
|
||
---
|
||
|
||
#
|
||
|
||
节点实体,WorkflowNodeEntity 为节点别名用于自由布局节点, 节点实体采用 ECS 架构, 为 Entity
|
||
|
||
> API Detail
|
||
|
||
Properties#
|
||
|
||
* id: string 节点 id
|
||
* flowNodeType: string | number 节点类型
|
||
* version number 节点版本,可以用于判断节点状态是否更新
|
||
|
||
Accessors#
|
||
|
||
* document: FlowDocument | WorkflowDocument 文档链接
|
||
|
||
* bounds: Rectangle 获取节点的 x,y,width,height, 等价于 transform.bounds
|
||
|
||
* blocks: FlowNodeEntity\[] 获取子节点, 包含折叠的子节点, 等价于 collapsedChildren
|
||
|
||
* collapsedChildren: FlowNodeEntity\[] 获取子节点, 包含折叠的子节点
|
||
|
||
* allCollapsedChildren: FlowNodeEntity\[] 获取所有子节点,包括所有折叠的子节点
|
||
|
||
* children: FlowNodeEntity\[] 获取子节点, 不包含折叠的子节点
|
||
|
||
* pre: FlowNodeEntity | undefined 获取上一个节点
|
||
|
||
* next: FlowNodeEntity | undefined 获取下一个节点
|
||
|
||
* parent: FlowNodeEntity | undefined 获取父节点
|
||
|
||
* originParent: FlowNodeEntity | undefined 获取原始父节点, 这个用于固定布局分支的第一个节点(orderIcon)
|
||
找到整个虚拟分支
|
||
|
||
* allChildren: FlowNodeEntity\[] 获取所有子节点, 不包含折叠的子节点
|
||
|
||
* transform: FlowNodeTransformData 获取节点的 transform 矩阵数据
|
||
|
||
* renderData: FlowNodeRenderData 获取节点的渲染数据, 包含渲染状态等
|
||
|
||
Methods#
|
||
|
||
getExtInfo#
|
||
|
||
获取节点的扩展信息, 可以通过 updateExtInfo 更新扩展信息
|
||
|
||
updateExtInfo#
|
||
|
||
更新扩展数据, 更新不会记录到 redo/undo, 如果需要记录,请实现 history 服务
|
||
|
||
getNodeRegistry#
|
||
|
||
获取节点注册器, 等价于 ctx.document.getNodeRegistry(node.flowNodeType)
|
||
|
||
getData#
|
||
|
||
等价于 ECS 架构 里获取 Entity 的 Component
|
||
|
||
addData#
|
||
|
||
等价于 ECS 架构 里添加 Entity 的 Component
|
||
|
||
getService#
|
||
|
||
节点访问 IOC 服务
|
||
|
||
dispose#
|
||
|
||
节点从画布中销毁
|
||
|
||
onDispose#
|
||
|
||
节点销毁事件
|
||
|
||
toJSON#
|
||
|
||
导出节点数据
|
||
|
||
节点数据基本结构:
|
||
|
||
* id: string 节点唯一标识, 必须保证唯一
|
||
* meta: object 节点的 ui 配置信息,如自由布局的 position 信息放这里
|
||
* type: string | number 节点类型,会和 nodeRegistries 中的 type 对应
|
||
* data: object 节点表单数据, 业务可自定义
|
||
* blocks: array 节点的分支, 采用 block 更贴近 Gramming
|
||
|
||
|
||
|
||
---
|
||
url: /api/core/workflow-document.md
|
||
---
|
||
|
||
#
|
||
|
||
自由布局文档数据,继承自 FlowDocument
|
||
|
||
> API Detail
|
||
|
||
TIP
|
||
|
||
由于历史原因, 带 Workflow 前缀的都代表自由布局
|
||
|
||
linesManager#
|
||
|
||
自由布局线条管理,见 WorkflowLinesManager
|
||
|
||
createWorkflowNodeByType#
|
||
|
||
根据节点类型创建自由布局节点
|
||
|
||
onContentChange#
|
||
|
||
监听自由布局画布数据变化
|
||
|
||
|
||
|
||
---
|
||
url: /api/core/workflow-lines-manager.md
|
||
---
|
||
|
||
#
|
||
|
||
自由布局线条管理, 目前挂在自由布局 document 下边
|
||
|
||
> API Detail
|
||
|
||
getAllLines#
|
||
|
||
获取所有线条的实体
|
||
|
||
createLine#
|
||
|
||
创建线条
|
||
|
||
toJSON#
|
||
|
||
导出线条数据
|
||
|
||
onAvailableLinesChange#
|
||
|
||
监听所有线条的连线变化
|
||
|
||
|
||
|
||
---
|
||
url: /api/core/workflow-line-entity.md
|
||
---
|
||
|
||
#
|
||
|
||
自由布局线条实体
|
||
|
||
> API Detail
|
||
|
||
|
||
|
||
---
|
||
url: /api/core/playground.md
|
||
---
|
||
|
||
#
|
||
|
||
画布实例
|
||
|
||
> API Detail
|
||
|
||
|
||
|
||
|
||
config#
|
||
|
||
画布配置, 提供 zoom、scroll 等状态
|
||
|
||
> API Detail
|
||
|
||
|
||
Properties#
|
||
|
||
* zoom number 当前缩放比例
|
||
|
||
* scrollData { scrollX: number, scrollY: number } 当前滚动位置
|
||
|
||
* readonlyOrDisabled 画布是否为 readonly 或 disabled 状态
|
||
|
||
* readonly
|
||
|
||
* disabled
|
||
|
||
|
||
fitView#
|
||
|
||
节点适应画布窗口, 需要传入节点的 bounds
|
||
|
||
|
||
|
||
|
||
scrollToView#
|
||
|
||
指定节点位置并滚动到画布可见区域, 如果位置已经在可见区域则不会滚动,除非加上 scrollToCenter 强制滚动
|
||
|
||
|
||
|
||
|
||
zoomin#
|
||
|
||
放大画布
|
||
|
||
|
||
zoomout#
|
||
|
||
缩小画布
|
||
|
||
|
||
getPoseFromMouseEvent#
|
||
|
||
将浏览器鼠标位置转成画布坐标系
|
||
|
||
|
||
|
||
|
||
scroll#
|
||
|
||
滚动画布, 需要传入滚动位置, 以及是否平滑滚动, 滚动时间
|
||
|
||
|
||
|
||
|
||
getViewport#
|
||
|
||
获取当前画布的视窗大小
|
||
|
||
|
||
|
||
|
||
---
|
||
url: /api/hooks/use-client-context.md
|
||
---
|
||
|
||
#
|
||
|
||
提供在 react 内部访问画布的上下文, 目前固定布局和 自由布局有一定区别
|
||
|
||
固定布局#
|
||
|
||
* Return: FixedLayoutPluginContext
|
||
|
||
自由布局#
|
||
|
||
* Return: FreeLayoutPluginContext
|
||
|
||
|
||
|
||
---
|
||
url: /api/hooks/use-node-render.md
|
||
---
|
||
|
||
#
|
||
|
||
提供节点渲染相关的方法, 返回结果的 form 等价于 getNodeForm
|
||
|
||
固定布局#
|
||
|
||
* Return: NodeRenderReturnType
|
||
|
||
自由布局#
|
||
|
||
* Return: NodeRenderReturnType
|
||
|
||
|
||
|
||
---
|
||
url: /api/hooks/use-playground-tools.md
|
||
---
|
||
|
||
#
|
||
|
||
画布工具方法
|
||
|
||
固定布局#
|
||
|
||
* Return: PlaygroundTools
|
||
|
||
自由布局#
|
||
|
||
* Return: PlaygroundTools
|
||
|
||
|
||
|
||
---
|
||
url: /api/hooks/use-refresh.md
|
||
---
|
||
|
||
#
|
||
|
||
Source Code#
|
||
|
||
Usage#
|
||
|
||
|
||
|
||
---
|
||
url: /api/hooks/use-service.md
|
||
---
|
||
|
||
#
|
||
|
||
获取底层 IOC 的所有单例模块
|
||
|
||
自定义 Service#
|
||
|
||
|
||
|
||
---
|
||
url: /api/components/editor-renderer.md
|
||
---
|
||
|
||
#
|
||
|
||
画布渲染组件,需要 配合 FixedLayoutEditorProvider 或 FreeLayoutEditorProvider 使用
|
||
|
||
|
||
|
||
---
|
||
url: /api/components/fixed-layout-editor-provider.md
|
||
---
|
||
|
||
#
|
||
|
||
固定布局画布配置器,支持 ref
|
||
|
||
|
||
|
||
---
|
||
url: /api/components/fixed-layout-editor.md
|
||
---
|
||
|
||
#
|
||
|
||
固定布局画布, 等价于 FixedLayoutEditorProvider 和 EditorRenderer 的组合
|
||
|
||
|
||
|
||
---
|
||
url: /api/components/free-layout-editor-provider.md
|
||
---
|
||
|
||
#
|
||
|
||
自由布局画布配置器,支持 ref
|
||
|
||
|
||
|
||
---
|
||
url: /api/components/free-layout-editor.md
|
||
---
|
||
|
||
#
|
||
|
||
自由布局画布, 等价于 FreeLayoutEditorProvider 和 EditorRenderer 的组合
|
||
|
||
|
||
|
||
---
|
||
url: /api/components/workflow-node-renderer.md
|
||
---
|
||
|
||
#
|
||
|
||
自由布局节点容器
|
||
|
||
Usage#
|
||
|
||
|
||
|
||
---
|
||
url: /api/services/clipboard-service.md
|
||
---
|
||
|
||
#
|
||
|
||
剪贴板服务
|
||
|
||
> API Detail
|
||
|
||
|
||
|
||
---
|
||
url: /api/services/command-service.md
|
||
---
|
||
|
||
#
|
||
|
||
指令服务,需要和 Shortcuts 一起使用
|
||
|
||
> API Detail
|
||
|
||
|
||
|
||
---
|
||
url: /api/services/flow-operation-service.md
|
||
---
|
||
|
||
#
|
||
|
||
节点操作服务, 目前用于固定布局,自由布局现阶段可通过 WorkflowDocument 直接操作, 后续也会抽象出 operation
|
||
|
||
> API Detail
|
||
|
||
Interface#
|
||
|
||
|
||
|
||
---
|
||
url: /api/services/history-service.md
|
||
---
|
||
|
||
HistoryService#
|
||
|
||
> API Detail
|
||
|
||
Redo/Undo#
|
||
|
||
渲染历史记录#
|
||
|
||
|
||
|
||
---
|
||
url: /api/services/selection-service.md
|
||
---
|
||
|
||
#
|
||
|
||
用于控制选择的节点
|
||
|
||
> API Detail
|
||
|
||
Usage#
|
||
|
||
|
||
|
||
---
|
||
url: /api/utils/disposable-collection.md
|
||
---
|
||
|
||
#
|
||
|
||
Usage#
|
||
|
||
Source Code#
|
||
|
||
https://github.com/bytedance/flowgram.ai/blob/main/packages/common/utils/src/dis
|
||
posable.ts
|
||
|
||
|
||
|
||
---
|
||
url: /api/utils/disposable.md
|
||
---
|
||
|
||
#
|
||
|
||
Interface#
|
||
|
||
Source Code#
|
||
|
||
https://github.com/bytedance/flowgram.ai/blob/main/packages/common/utils/src/dis
|
||
posable.ts
|
||
|
||
|
||
|
||
---
|
||
url: /api/utils/emitter.md
|
||
---
|
||
|
||
#
|
||
|
||
事件模块
|
||
|
||
Usage#
|
||
|
||
Source Code#
|
||
|
||
https://github.com/bytedance/flowgram.ai/blob/main/packages/common/utils/src/eve
|
||
nt.ts
|
||
|
||
|
||
|
||
---
|
||
url: /api/utils/get-node-form.md
|
||
---
|
||
|
||
#
|
||
|
||
获取节点的表单能力,需要开启 节点引擎才能使用
|
||
|
||
> API Detail
|
||
|
||
Usage#
|
||
|
||
Return Inteface#
|
||
|
||
|
||
|
||
---
|
||
url: /guide/advanced/custom-plugin.md
|
||
---
|
||
|
||
#
|
||
|
||
插件的生命周期说明#
|
||
|
||
创建插件#
|
||
|
||
添加插件#
|
||
|
||
|
||
|
||
---
|
||
url: /guide/advanced/custom-service.md
|
||
---
|
||
|
||
#
|
||
|
||
业务中需要抽象出单例服务便于插件化管理
|
||
|
||
|
||
|
||
---
|
||
url: /guide/advanced/fixed-layout/composite-nodes.md
|
||
---
|
||
|
||
#
|
||
|
||
复合节点由多个节点组合,并支持自定义线条,如 分支节点、Loop 节点、TryCatch 节点:
|
||
|
||
使用#
|
||
|
||
内置的复合节点#
|
||
|
||
|
||
|
||
---
|
||
url: /guide/advanced/fixed-layout/load.md
|
||
---
|
||
|
||
#
|
||
|
||
画布的数据通过 FlowDocument 来存储
|
||
|
||
画布数据格式#
|
||
|
||
画布文档数据采用树形结构,支持嵌套
|
||
|
||
文档数据基本结构:
|
||
|
||
* nodes array 节点列表, 支持嵌套
|
||
|
||
节点数据基本结构:
|
||
|
||
* id: string 节点唯一标识, 必须保证唯一
|
||
* meta: object 节点的 ui 配置信息,如自由布局的 position 信息放这里
|
||
* type: string | number 节点类型,会和 nodeRegistries 中的 type 对应
|
||
* data: object 节点表单数据
|
||
* blocks: array 节点的分支, 采用 block 更贴近 Gramming
|
||
|
||
加载#
|
||
|
||
* 通过 initialData 加载
|
||
|
||
* 通过 ref 动态加载
|
||
|
||
* 动态 reload 数据
|
||
|
||
监听变化并自动保存#
|
||
|
||
|
||
|
||
---
|
||
url: /guide/advanced/fixed-layout/node.md
|
||
---
|
||
|
||
#
|
||
|
||
节点通过 FlowNodeEntity 定义
|
||
|
||
节点数据#
|
||
|
||
通过 node.toJSON() 可以获取
|
||
|
||
基本结构:
|
||
|
||
* id: string 节点唯一标识, 必须保证唯一
|
||
* meta: object 节点的 ui 配置信息,如自由布局的 position 信息放这里
|
||
* type: string | number 节点类型,会和 nodeRegistries 中的 type 对应
|
||
* data: object 节点表单数据, 业务可自定义
|
||
* blocks: array 节点的分支, 采用 block 更贴近 Gramming
|
||
|
||
节点定义#
|
||
|
||
声明节点可以用于确定节点的类型及渲染方式
|
||
|
||
当前渲染节点获取#
|
||
|
||
通过 useNodeRender 获取节点相关方法
|
||
|
||
创建节点#
|
||
|
||
通过 FlowOperationService 创建
|
||
|
||
* 添加节点
|
||
|
||
* 在指定节点之后添加
|
||
|
||
* 添加分支节点 (用于条件分支)
|
||
|
||
删除节点#
|
||
|
||
更新节点 data 数据#
|
||
|
||
* 通过 useNodeRender 或 getNodeForm 获取节点的 data 数据
|
||
|
||
* 通过 Field 更新表单数据, 详细见 表单的使用
|
||
|
||
更新节点的 extInfo 数据#
|
||
|
||
extInfo 用于存储 一些 ui 状态, 如果未开启节点引擎,节点的 data 数据会默认存到 extInfo 里
|
||
|
||
|
||
|
||
---
|
||
url: /guide/advanced/form-materials.md
|
||
---
|
||
|
||
#
|
||
|
||
如何使用?#
|
||
|
||
通过包引用使用#
|
||
|
||
官方表单物料可以直接通过包引用使用:
|
||
|
||
通过 CLI 添加物料源代码使用#
|
||
|
||
如果业务对组件有定制诉求(如:更改文案、样式、业务逻辑),推荐 通过 CLI 将物料源代码添加到项目中进行定制:
|
||
|
||
运行后 CLI 会提示用户选择要添加到项目中的物料:
|
||
|
||
使用者也可以直接在 CLI 中添加指定物料的源代码:
|
||
|
||
CLI 运行成功后,相关物料会自动添加到当前项目下的 src/form-materials 目录下
|
||
|
||
注意事项
|
||
|
||
1. 官方物料目前底层基于 Semi Design 实现,业务如果有底层组件库的诉求,可以通过 CLI 复制源码进行替换
|
||
2. 一些物料会依赖一些第三方 npm 库,这些库会在 CLI 运行时自动安装
|
||
3. 一些物料会依赖另外一些官方物料,这些被依赖的物料源代码在 CLI 运行时会一起被添加到项目中去
|
||
|
||
当前支持的 Component 物料#
|
||
|
||
TypeSelector#
|
||
|
||
VariableSelector#
|
||
|
||
JsonSchemaEditor#
|
||
|
||
DynamicValueInput#
|
||
|
||
ConditionRow#
|
||
|
||
当前支持的 Effect 物料#
|
||
|
||
provideBatchInput#
|
||
|
||
autoRenameRef#
|
||
|
||
|
||
|
||
---
|
||
url: /guide/advanced/form.md
|
||
---
|
||
|
||
#
|
||
|
||
|
||
术语#
|
||
|
||
|
||
快速开始#
|
||
|
||
|
||
开启节点引擎#
|
||
|
||
> API Detail
|
||
|
||
|
||
|
||
|
||
配置表单#
|
||
|
||
formMeta 是节点表单唯一配置入口,配置在每个节点的NodeRegistry 上。
|
||
|
||
> node-registries.ts
|
||
|
||
|
||
|
||
> 表单写法的基础例子
|
||
|
||
|
||
渲染表单#
|
||
|
||
> base-node.tsx
|
||
|
||
|
||
|
||
|
||
核心概念#
|
||
|
||
|
||
FormMeta#
|
||
|
||
在 NodeRegistry 中,我们通过formMeta 来配置节点表单, 它遵循以下API。
|
||
|
||
> FormMeta API
|
||
|
||
这里特别说明, 节点表单与通用表单有一个很大的区别,它的数据逻辑(如校验、数据变更后的副作用等)需要在表单不渲染的情况下依然生效,我们称
|
||
。所以这些数据逻辑需要配置在formMeta 中的非render 字段中,保证不渲染情况下节点引擎也可以调用到这些逻辑,
|
||
而通用表单引擎(如react-hook-form)则没有这个限制, 校验可以直接写在react组件中。
|
||
|
||
|
||
FormMeta.render (渲染)#
|
||
|
||
render 字段用于配置表单的渲染逻辑
|
||
|
||
render: (props: FormRenderProps<any>) => React.ReactElement;
|
||
|
||
> FormRenderProps
|
||
|
||
返回的 react 组件可使用以下表单组件和模型:
|
||
|
||
Field (组件)#
|
||
|
||
Field 是表单字段的 React 高阶组件,封装了表单字段的通用逻辑,如数据与状态的注入,组件的刷新等。其核心必填参数为 name,
|
||
用于声明表单项的路径,在一个表单中具有唯一性。
|
||
|
||
> Field Props API
|
||
|
||
Field 的渲染部分,支持三种写法,如下:
|
||
|
||
|
||
|
||
|
||
|
||
> FieldRenderProps API
|
||
|
||
Field (模型)#
|
||
|
||
Field 实例通常通过render props 传入(如上例子),或通过 useCurrentField hook
|
||
获取。它包含表单字段在渲染层面的常见API。 注意: Field 是一个渲染模型,仅提供一般组件需要的API, 如 value onChange onFocus
|
||
onBlur,如果是数据相关的API 请使用 Form 模型实例,如 form.setValueIn(name, value) 设置某字段的值。
|
||
|
||
> Field 模型 API
|
||
|
||
FieldArray (组件)#
|
||
|
||
FieldArray 是数组类型字段的 React 高阶组件,封装了数组类型字段的通用逻辑,如数据与状态的注入,组件的刷新,以及数组项的遍历等。其核心必填参数为
|
||
name, 用于声明该表单项的路径,在一个表单中具有唯一性。
|
||
|
||
FieldArray 的基础用法可以参照以下例子:
|
||
|
||
> 数组例子
|
||
|
||
FieldArray (模型)#
|
||
|
||
FieldArray 继承于 Field ,是数组类型字段在渲染层的模型,除了包含渲染层的常见API,还包含数组的基本操作如 FieldArray.map,
|
||
FieldArray.remove, FieldArray.append 等。API 的使用方法也可见上述数组例子。
|
||
|
||
> FieldArray 模型 API
|
||
|
||
Form(组件)#
|
||
|
||
Form 组件是表单的最外层高阶组件,上述 Field FieldArray 等能力仅在该高阶组件下可以使用。节点表单的渲染已经将<Form />
|
||
封装到了引擎内部,所以用户无需关注,可以直接在render 返回的 react 组件中直接使用
|
||
Field。但如果用户需要独立使用表单引擎,或者在节点之外独立再渲染一次表单,需要自行在表单内容外包上Form组件。
|
||
|
||
Form(模型)#
|
||
|
||
Form 实例可通过render 函数的入参获得, 也可通过 hook useForm 获取,见例子。它是表单核心模型门面,用户可以通过Form
|
||
实例操作表单数据、监听变更、触发校验等。
|
||
|
||
> Form 模型 API
|
||
|
||
|
||
校验#
|
||
|
||
基于FormMeta章节中提到的"数据与渲染分离"概念,校验逻辑需配置在 FormMeta 全局, 并通过路径匹配方式声明校验逻辑所作用的表单项,如下例子。
|
||
|
||
路径支持模糊匹配,见路径章节。
|
||
|
||
|
||
|
||
校验时机#
|
||
|
||
validateTrigger 建议配置 ValidateTrigger.onChange 即数据变更时校验,如果配置
|
||
ValidateTrigger.onBlur, 校验只会在组件blur事件触发时触发。那么当节点表单不渲染的情况下,就算是数据变更了,也不会触发校验。
|
||
|
||
主动触发校验#
|
||
|
||
1. 主动触发整个表单的校验
|
||
|
||
|
||
|
||
2. 主动触发单个表单项校验
|
||
|
||
|
||
|
||
name 不传则默认获取当前 <Field /> 标签下的 Field 的 validate, 通过传 name 可获取 <Form /> 下任意 Field。
|
||
|
||
|
||
路径#
|
||
|
||
1. 表单路径以.为层级分隔符, 如 a.b.c 指向数据 {a:{b:{c:1}}} 下的 1
|
||
2. 路径支持模糊匹配,在校验和副作用配置中会使用到。如下例子。通常在数组场景中使用较多。
|
||
|
||
|
||
副作用 (effect)#
|
||
|
||
副作用是节点表单特有的概念,指在节点数据发生变更时需要执行的副作用。同样,遵循 "数据与渲染分离" 的原则,副作用和校验相似,也配置在 FormMeta 全局。
|
||
|
||
* 通过 key value 形式配置,key 表示表单项路径匹配规则,支持模糊匹配,value 为作用在该路径上的effect。
|
||
|
||
* value 为数组,即支持一个表单项有多个effect。
|
||
|
||
|
||
|
||
|
||
|
||
Effect 相关 API
|
||
|
||
副作用时机#
|
||
|
||
|
||
联动#
|
||
|
||
> 联动例子
|
||
|
||
|
||
hooks#
|
||
|
||
|
||
节点表单内#
|
||
|
||
以下hook 可在节点表单内部使用
|
||
|
||
useCurrentField#
|
||
|
||
() => Field
|
||
|
||
该 hook 需要在Field 标签内部使用
|
||
|
||
|
||
|
||
> Field 模型 API
|
||
|
||
useCurrentFieldState#
|
||
|
||
() => FieldState
|
||
|
||
该 hook 需要在Field 标签内部使用
|
||
|
||
|
||
|
||
> FieldState API
|
||
|
||
useFieldValidate#
|
||
|
||
(name?: FieldName) => () => Promise<void>
|
||
|
||
如果需要主动触发字段的校验,可以使用该hook 获取到 Field 的 validate 函数。
|
||
|
||
name 为 Field 的路径,不传则默认获取当前 <Field /> 下的validate
|
||
|
||
|
||
|
||
useForm#
|
||
|
||
() => Form
|
||
|
||
用于获取 Form 实例。
|
||
|
||
注意,该hook 在 render 函数第一层不生效,仅在 render 函数内的 react 组件内部才可使用。render 函数的入参中已经传入了
|
||
form: Form, 可以直接使用。
|
||
|
||
1. 在 render 函数第一层直接使用 props.form
|
||
|
||
|
||
|
||
2. 在组件内部可使用 useForm
|
||
|
||
|
||
|
||
useWatch#
|
||
|
||
<TValue = FieldValue>(name: FieldName) => TValue
|
||
|
||
该 hook 和上述 useForm 相似, 在 render 函数返回组件的第一层不生效,仅在封装过的组件内部可用。如果需要在 render
|
||
根级别使用,可以对 render 返回的内容做一层组件封装。
|
||
|
||
|
||
|
||
|
||
节点表单外#
|
||
|
||
以下 hook 用于在节点表单外部,如画布全局、相邻节点上需要去监听某个节点表单的数据或状态。通常需要传入 node: FlowNodeEntity 作为参数
|
||
|
||
useWatchFormValues#
|
||
|
||
监听 node 内整个表单的值
|
||
|
||
<TFormValues = any>(node: FlowNodeEntity) => TFormValues | undefined
|
||
|
||
|
||
|
||
useWatchFormValueIn#
|
||
|
||
监听 node 内某个表单项的值
|
||
|
||
<TValue = any>(node: FlowNodeEntity,name: string) => TFormValues | undefined
|
||
|
||
|
||
|
||
useWatchFormState#
|
||
|
||
监听 node 内表单的状态
|
||
|
||
(node: FlowNodeEntity) => FormState | undefined
|
||
|
||
|
||
|
||
useWatchFormErrors#
|
||
|
||
监听 node 内表单的 Errors
|
||
|
||
(node: FlowNodeEntity) => Errors | undefined
|
||
|
||
|
||
|
||
useWatchFormWarnings#
|
||
|
||
监听 node 内表单的 Warnings
|
||
|
||
(node: FlowNodeEntity) => Warnings | undefined
|
||
|
||
|
||
|
||
|
||
---
|
||
url: /guide/advanced/free-layout/line.md
|
||
---
|
||
|
||
#
|
||
|
||
* WorkflowLinesManager 管理所有的线条
|
||
|
||
* WorkflowNodeLinesData 节点上连接的线条管理
|
||
|
||
* WorkflowLineEntity 线条实体
|
||
|
||
获取所有线条的实体#
|
||
|
||
创建/删除线条#
|
||
|
||
导出线条数据#
|
||
|
||
线条基本结构:
|
||
|
||
* sourceNodeID: string 开始节点 id
|
||
* targetNodeID: string 目标节点 id
|
||
* sourcePortID?: string | number 开始端口 id, 缺省则采用开始节点的默认端口
|
||
* targetPortID?: string | number 目标端口 id, 缺省则采用目标节点的默认端口
|
||
|
||
获取当前节点的输入/输出节点或线条#
|
||
|
||
线条配置#
|
||
|
||
我们提供丰富的线条配置参数, 给 FreeLayoutEditorProvider, 详细见 FreeLayoutProps
|
||
|
||
1.自定义颜色#
|
||
|
||
2.让单个输出端口只能连一条线#
|
||
|
||
3.连接到空白地方添加节点#
|
||
|
||
代码见自由布局最佳实践
|
||
|
||
在线条上添加 Label#
|
||
|
||
代码见自由布局最佳实践
|
||
|
||
节点监听自身的连线变化并刷新#
|
||
|
||
监听所有线条的连线变化#
|
||
|
||
这个场景用于当希望在外部组件监听线条连接情况
|
||
|
||
|
||
|
||
---
|
||
url: /guide/advanced/free-layout/load.md
|
||
---
|
||
|
||
#
|
||
|
||
画布的数据通过 WorkflowDocument 来存储
|
||
|
||
画布数据#
|
||
|
||
文档数据基本结构:
|
||
|
||
* nodes array 节点列表, 支持嵌套
|
||
* edges array 边列表
|
||
|
||
节点数据基本结构:
|
||
|
||
* id: string 节点唯一标识, 必须保证唯一
|
||
* meta: object 节点的 ui 配置信息,如自由布局的 position 信息放这里
|
||
* type: string | number 节点类型,会和 nodeRegistries 中的 type 对应
|
||
* data: object 节点表单数据, 业务可自定义
|
||
* blocks: array 节点的分支, 采用 block 更贴近 Gramming, 目前会存子画布的节点
|
||
* edges: array 子画布的边数据
|
||
|
||
边数据基本结构:
|
||
|
||
* sourceNodeID: string 开始节点 id
|
||
* targetNodeID: string 目标节点 id
|
||
* sourcePortID?: string | number 开始端口 id, 缺省则采用开始节点的默认端口
|
||
* targetPortID?: string | number 目标端口 id, 缺省则采用目标节点的默认端口
|
||
|
||
加载#
|
||
|
||
* 通过 initialData 加载
|
||
|
||
* 通过 ref 动态加载
|
||
|
||
* 动态 reload 所有数据
|
||
|
||
监听变化并自动保存#
|
||
|
||
|
||
|
||
---
|
||
url: /guide/advanced/free-layout/node.md
|
||
---
|
||
|
||
#
|
||
|
||
节点通过 FlowNodeEntity 定义
|
||
|
||
节点数据#
|
||
|
||
通过 node.toJSON() 可以获取
|
||
|
||
基本结构:
|
||
|
||
* id: string 节点唯一标识, 必须保证唯一
|
||
* meta: object 节点的 ui 配置信息,如自由布局的 position 信息放这里
|
||
* type: string | number 节点类型,会和 nodeRegistries 中的 type 对应
|
||
* data: object 节点表单数据, 业务可自定义
|
||
* blocks: array 节点的分支, 采用 block 更贴近 Gramming 自由布局布局场景会用在子画布的子节点
|
||
* edges: array 子画布的边数据
|
||
|
||
节点定义#
|
||
|
||
在自由布局场景,节点定义用于声明节点的初始化位置/大小,端口,表单渲染等, 详细见 声明节点
|
||
|
||
当前渲染节点获取#
|
||
|
||
通过 useNodeRender 获取节点相关方法
|
||
|
||
创建节点#
|
||
|
||
* 通过 WorkflowDocument 创建
|
||
|
||
* 通过 WorkflowDragService 创建, 见自由布局基础用法
|
||
|
||
删除节点#
|
||
|
||
通过 node.dispose 删除节点
|
||
|
||
更新节点 data 数据#
|
||
|
||
* 通过 useNodeRender 或 getNodeForm 获取节点的 data 数据
|
||
|
||
* 通过 Field 更新表单数据, 详细见 表单的使用
|
||
|
||
更新节点的 extInfo 数据#
|
||
|
||
extInfo 用于存储 一些 ui 状态, 如果未开启节点引擎,节点的 data 数据会默认存到 extInfo 里
|
||
|
||
|
||
|
||
---
|
||
url: /guide/advanced/free-layout/port.md
|
||
---
|
||
|
||
#
|
||
|
||
* WorkflowNodePortsData 管理节点的所有端口信息
|
||
|
||
* WorkflowPortEntity 端口实例
|
||
|
||
* WorkflowPortRender 端口渲染组件
|
||
|
||
|
||
定义端口#
|
||
|
||
* 静态端口
|
||
|
||
节点声明添加 defaultPorts , 如 { type: 'input' }, 则会在节点左侧加入输入端口
|
||
|
||
|
||
|
||
* 动态端口
|
||
|
||
节点声明添加 dynamicPorts , 当设置为 true 则会到节点dom 上寻找 data-port-id 和 data-port-type 属性的
|
||
dom 作为端口
|
||
|
||
|
||
|
||
|
||
|
||
|
||
端口渲染#
|
||
|
||
端口最终通过 WorkflowPortRender 组件渲染,支持自定义 style, 或者业务基于源码重新实现该组件, 参考 自由布局最佳实践 - 节点渲染
|
||
|
||
|
||
|
||
|
||
获取端口数据#
|
||
|
||
|
||
|
||
|
||
---
|
||
url: /guide/advanced/free-layout/sub-canvas.md
|
||
---
|
||
|
||
#
|
||
|
||
详细代码见 自由布局最佳实践
|
||
|
||
添加子画布插件#
|
||
|
||
定义子画布节点#
|
||
|
||
|
||
|
||
---
|
||
url: /guide/advanced/history.md
|
||
---
|
||
|
||
#
|
||
|
||
Undo/Redo 是 FlowGram.AI 的一个插件,在 @flowgram.ai/fixed-layout-editor 和
|
||
@flowgram.ai/free-layout-editor 两种模式的编辑器中均有提供该功能。
|
||
|
||
1. 快速开始#
|
||
|
||
> Demo Detail
|
||
|
||
1.1. 开启 history#
|
||
|
||
使用 Undo/Redo 功能前需要先引入编辑器,以固定布局编辑器为例。
|
||
|
||
1. package.json 添加依赖
|
||
|
||
开启之后将获得以下能力:
|
||
|
||
1.2. 关闭 history#
|
||
|
||
如果某些系统触发的数据变更不希望被undo redo监听到,可以主动关掉 历史服务 操作完数据再重新启动
|
||
|
||
1.3. Undo/Redo 调用#
|
||
|
||
一般 Undo/Redo 会在界面上提供两个按钮入口,点击了能触发 Undo 和 Redo,按钮本身需要有是否可以 Undo/Redo 的状态。
|
||
|
||
2. 功能扩展#
|
||
|
||
2.1. 操作注册#
|
||
|
||
操作通过 operationMetas 去注册操作
|
||
|
||
OperationMeta 核心定义如下
|
||
|
||
* type 是操作的唯一标识
|
||
* inverse 是一个函数,该函数返回当前操作的逆操作
|
||
* apply 是操作被触发的时候执行的逻辑
|
||
|
||
假设我要做增删节点支持 Undo/Redo 的功能,我就需要添加两个操作
|
||
|
||
2.2. 操作合并#
|
||
|
||
operationMeta 支持 shouldMerge 来自定义合并策略,如果频繁触发的操作可以进行合并
|
||
|
||
shouldMerge 返回
|
||
|
||
* 返回 false 代表不合并
|
||
* 返回 true 代表合并进一个操作栈元素
|
||
* 返回 Operation 代表合并成一个操作
|
||
|
||
以下示例是一个合并 500ms 内对同一个字段编辑进行合并
|
||
|
||
2.3. 操作执行#
|
||
|
||
1. 单操作执行
|
||
|
||
通过 pushOperation 触发, 如下示例使用方在业务中触发刚刚定义的操作
|
||
|
||
2. 批量执行 通过 transact 调用的函数中所有执行的操作都会被合并进一个栈元素, undo/redo 的时候会被一起执行
|
||
如下是实现了一个批量删除的例子:
|
||
|
||
2.4. 撤销重做#
|
||
|
||
1. 撤销重做 撤销执行 history.undo 方法 重做执行 history.redo 方法
|
||
|
||
2. 监听撤销重做 监听 undoRedoService.onChange 的 onChange 事件即可 如下是一个 undo/redo
|
||
触发后路由对应操作的uri(选中对应节点或表单项)
|
||
|
||
2.5. 操作历史#
|
||
|
||
1. 查看刷新 可以通过 HistoryStack.items 获得历史记录, 通过监听 HistoryStack.onChange 事件来刷新界面
|
||
|
||
2. 持久化 持久化是通过 history-storage 插件实现
|
||
|
||
* databaseName: 数据库名称
|
||
* resourceStorageLimit: 资源存储限制数量
|
||
|
||
引入 @flowgram.ai/history-storage 包后,可使用该插件
|
||
|
||
通过 useStorageHistoryItems 查询数据库列表
|
||
|
||
3. API 列表#
|
||
|
||
3.1. OperationMeta#
|
||
|
||
操作元数据,用以定义一个操作
|
||
|
||
3.2. Operation#
|
||
|
||
操作数据,通过 type 和 OperationMeta 关联
|
||
|
||
3.3. OperationService#
|
||
|
||
onApply 想监听某个触发的操作可以使用onApply
|
||
|
||
3.4. HistoryService#
|
||
|
||
History 模块核心 API 暴露的Service
|
||
|
||
3.5. UndoRedoService#
|
||
|
||
管理 UndoRedo 栈的服务
|
||
|
||
3.6. HistoryStack#
|
||
|
||
历史栈,监听所有 push undo redo 操作,并记录到栈里面
|
||
|
||
3.7. HistoryDatabase#
|
||
|
||
持久化数据库操作
|
||
|
||
|
||
|
||
---
|
||
url: /guide/advanced/minimap.md
|
||
---
|
||
|
||
#
|
||
|
||
EditorProps#
|
||
|
||
缩略图组件#
|
||
|
||
|
||
|
||
---
|
||
url: /guide/advanced/shortcuts.md
|
||
---
|
||
|
||
#
|
||
|
||
自定义快捷键#
|
||
|
||
通过 CommandService 调用快捷键#
|
||
|
||
|
||
|
||
---
|
||
url: /guide/advanced/variable/basic.md
|
||
---
|
||
|
||
#
|
||
|
||
业务背景#
|
||
|
||
在 Workflow 编排中,节点与节点之间需要传递信息。为了实现这一点,我们使用变量来存储和管理这些信息。
|
||
|
||
一个变量由三个主要部分组成:
|
||
|
||
1. 唯一标识符:变量的名字,用于区分不同的变量,以便在程序中可以准确地引用和使用它。如:userName 或 totalAmount。
|
||
2. 值:变量存储的数据。值可以是多种类型,比如数字(如 42)、字符串(如 "Hello!")、布尔值(如 true)等。
|
||
3. 类型:变量可以存储的数据种类。类型决定了变量可以接受什么样的值。例如,一个变量可以是整数、浮点数、字符串或布尔值等。
|
||
|
||
下面是一个流程编排的例子:WebSearch 节点获取到知识,通过 natural\_language\_desc 传递到 LLM 节点进行分析
|
||
|
||
什么是变量引擎?#
|
||
|
||
变量引擎是 Flowgram 提供的一个可选内置功能,可以帮助 Workflow 设计时更高效地实现变量信息编排。它可以实现以下功能:
|
||
|
||
开启变量引擎#
|
||
|
||
> API Detail
|
||
|
||
|
||
|
||
---
|
||
url: /guide/advanced/variable/variable-consume.md
|
||
---
|
||
|
||
#
|
||
|
||
在节点内获取变量树#
|
||
|
||
获取变量列表#
|
||
|
||
获取 Object 类型变量的下钻#
|
||
|
||
获取 Array 类型变量的下钻#
|
||
|
||
直接使用 VariableSelector 官方物料#
|
||
|
||
详见: 官方表单物料
|
||
|
||
VariableSelector 组件用于选择单个变量
|
||
|
||
通过包引用使用:
|
||
|
||
通过 CLI 复制源代码使用:
|
||
|
||
|
||
|
||
---
|
||
url: /guide/advanced/variable/variable-output.md
|
||
---
|
||
|
||
#
|
||
|
||
输出节点变量#
|
||
|
||
FlowNodeVariableData 输出变量#
|
||
|
||
Flowgram 基于 ECS (Entity-Component-System) 来实现节点信息的管理。
|
||
|
||
其中 FlowNodeVariableData 是节点 FlowNodeEntity 上的一个 Component,专门用于处理节点上输出的 变量信息。
|
||
|
||
下面的 Demo 展示了:如何拿到 FlowNodeVariableData, 并且通过 FlowNodeVariableData 实现在节点上输出变量
|
||
|
||
详见: > Demo Detail
|
||
|
||
一个节点设置多个输出变量#
|
||
|
||
更多用法,详见:Class: FlowNodeVariableData
|
||
|
||
表单副作用设置输出变量#
|
||
|
||
输出全局变量#
|
||
|
||
获取全局变量作用域#
|
||
|
||
全局作用域可以在 Plugin 中通过 ctx 获取:
|
||
|
||
也可以在画布中的 React 组件内,通过 useService 获取全局作用域:
|
||
|
||
全局作用域输出变量#
|
||
|
||
GlobalScope 输出变量的 API 和 FlowNodeVariableData 类似:
|
||
|
||
详见:Class: GlobalScope
|
||
|
||
|
||
|
||
---
|
||
url: /guide/advanced/without-form.md
|
||
---
|
||
|
||
#
|
||
|
||
当节点引擎不开启,节点的 data 数据会存在 node.getExtInfo 中, 如下
|
||
|
||
|
||
|
||
---
|
||
url: /guide/concepts/canvas-engine.md
|
||
---
|
||
|
||
#
|
||
|
||
Playground#
|
||
|
||
画布引擎底层会提供一套自己的坐标系, 主要由 Playground 驱动
|
||
|
||
Layer#
|
||
|
||
P.S.
|
||
|
||
* 渲染层在底层建立了一套自己的坐标系,基于这个坐标系实现模拟滚动、缩放等逻辑,在算viewport时候节点也需要转换到该坐标系上
|
||
|
||
* 渲染按画布被拆分成多个层 (Layer),分层设计是基于ECS的数据切割思想,不同 Layer 只监听自己想要的数据,独立渲染不干扰,Layer
|
||
可以理解为ECS的 System,即最终Entity数据消费的地方
|
||
|
||
* Layer 实现了类mobx的observer响应式动态依赖收集,数据更新会触发 autorun或render
|
||
|
||
* Layer 生命周期
|
||
|
||
Layer的定位其实和 Unity 游戏引擎 提供的 MonoBehaviour 类似, Unity
|
||
游戏引擎的脚本扩展都是基于这个,可以认为是最核心的设计,底层也是基于 C# 提供的反射 (Reflection) 能力的依赖注入
|
||
|
||
* Layer 的响应式更新
|
||
|
||
FlowNodeEntity#
|
||
|
||
* 节点是一颗树, 包含子节点 (blocks) 和父亲节点, 节点采用 ECS 架构
|
||
|
||
FlowNodeTransformData 节点的位置及大小数据#
|
||
|
||
FlowNodeRenderData 节点内容渲染数据#
|
||
|
||
FlowDocument#
|
||
|
||
|
||
|
||
---
|
||
url: /guide/concepts/ecs.md
|
||
---
|
||
|
||
#
|
||
|
||
为什么需要 ECS#
|
||
|
||
ECS (Entity-Component-System)
|
||
|
||
适合解耦大的数据对象,常用于游戏,游戏的每个角色(Entity)数据都非常庞大,需要拆分成如物理引擎相关数据、皮肤相关、角色属性等 (多个
|
||
Component),供不同的子系统(System)消费。流程的数据结构复杂,很适合用ECS做拆解
|
||
|
||
方案对比#
|
||
|
||
我们对比两个数据方案:
|
||
|
||
1. ReduxStore 方案#
|
||
|
||
优点:
|
||
|
||
* 中心化数据管理使用简单
|
||
|
||
缺点:
|
||
|
||
* 中心化数据管理无法精确更新,带来性能瓶颈
|
||
* 扩展性差,节点新增一个数据,都耦合到一个 大JSON 里
|
||
|
||
2. ECS 方案#
|
||
|
||
备注:
|
||
|
||
* NodeData 对应的是 ECS - Component
|
||
* Layer 对应 ECS - System
|
||
|
||
优点:
|
||
|
||
* 节点数据拆开来单独控制渲染,性能可做到精确更新
|
||
* 扩展性强,新增一个节点数据,则新增一个 XXXData + XXXLayer
|
||
|
||
缺点:
|
||
|
||
* 有一定学习成本
|
||
|
||
|
||
|
||
---
|
||
url: /guide/concepts/index.md
|
||
---
|
||
|
||
#
|
||
|
||
* CanvasEngine:画布引擎负责绘制“点-线”构成的图, 保障大规模节点时的流畅性
|
||
* NodeEngine: 节点引擎提供 渲染、校验、数据修改等表单能力
|
||
* VariableEngine: 变量引擎引入作用域模型, 抽象各业务场景的变量
|
||
* Material: 物料库包含默认 ICON 等 UI, 业务接入后可覆盖扩展
|
||
|
||
|
||
|
||
---
|
||
url: /guide/concepts/ioc.md
|
||
---
|
||
|
||
#
|
||
|
||
为什么需要 IOC#
|
||
|
||
几个概念
|
||
|
||
* 控制反转: Inversion of Control,
|
||
是面向对象中的一种设计原则,可以用来降低代码模块之间的耦合度,其中最常见的方式叫做依赖注入(Dependency Injection,简称DI)
|
||
* 领域逻辑:Domain Logic,也可以叫 业务逻辑(Business Logic),这些业务逻辑与特定的产品功能相关
|
||
* 面向切面编程:AOP (Aspect-Oriented Programming),最核心的设计原则是将软件系统拆分为公用逻辑 (横切,有贯穿的意味) 和
|
||
领域逻辑 (纵切)的多个个方面 (Aspect),横切部分可以被所有的 纵切 部分 “按需消费”
|
||
|
||
回答这个问题之前先了解切面编程,切面编程目的是将领域逻辑的粒度拆的更细,横切部分可被纵切 “按需消费” ,横切和纵切的连接也叫 织入 (Weaving),而
|
||
IOC 就是扮演 Weaving 注入到纵切的角色
|
||
|
||
理想的切面编程
|
||
|
||
IOC是切面编程的一种手段,引入后,底层模块可以以接口形式暴露给外部注册,带来的好处:
|
||
|
||
* 实现微内核 + 插件化的设计,实现插件的可插拔按需消费
|
||
* 可以让包拆得更干净,实现 feature 式的拆包
|
||
|
||
|
||
|
||
---
|
||
url: /guide/concepts/node-engine.md
|
||
---
|
||
|
||
#
|
||
|
||
节点引擎 NodeEngine
|
||
是一个流程节点逻辑的书写框架,让业务专注于业务自身的渲染与数据逻辑,无需关注画布以及节点间联动的底层api。与此同时,节点引擎沉淀了最佳的节点书写范式,帮助业务
|
||
解决流程业务中可能遇到的各种问题, 如数据逻辑与渲染耦合等。
|
||
节点引擎是可选启用的。如果你不存在以下这些复杂的节点逻辑,可以选择不启用节点引擎,自己维护节点数据与渲染。复杂节点逻辑如:1)节点不渲染也能校验或触发数据副作用
|
||
;2)节点间联动丰富;3)redo/undo; 等等。
|
||
|
||
基础概念#
|
||
|
||
FlowNodeEntity 流程节点模型。
|
||
|
||
FlowNodeRegistry 流程节点的静态配置。
|
||
|
||
FormMeta 节点引擎的静态配置。 配置在 FlowNodeRegistry 中的 formMeta 字段。
|
||
|
||
Form 节点引擎中的表单。它维护节点的数据并提供渲染、校验、副作用等能力。他的模型 FormModel 提供节点数据的访问和修改及触发校验等能力。
|
||
|
||
Field 节点表单中的某个渲染字段。注意, Form 已经提供了数据层的逻辑,Field 更多是一个渲染层的模型,它尽在表单字段渲染后才存在。
|
||
|
||
validate 表单校验。通常有对单个字段的校验也有整体表单校验。
|
||
|
||
effect 表单数据的副作用。通常指在表单数据发生一些事件时要触发特定逻辑。
|
||
如在某字段的数据变更时要同步一些信息到某个store,这个可以被称为一个effect。
|
||
|
||
FormPlugin 表单插件。可以配置在formMeta 中,插件可以对表单进行一系列深度操作。如变量插件。
|
||
|
||
|
||
|
||
---
|
||
url: /guide/concepts/reactflow.md
|
||
---
|
||
|
||
#
|
||
|
||
Reactflow 是很优秀的开源项目,架构及代码清晰,但偏流程渲染引擎的底层架构
|
||
(Node、Edge、Handle),需要在上层开发大量功能才能适配复杂场景(如 固定布局,需要对数据建模写布局算法), 高级功能收费。
|
||
|
||
相比 Reactflow,FlowGram 的目标是提供流程编辑一整套开箱即用的解决方案。
|
||
|
||
* 下边是 Reactflow 官方提供的 pro 收费能力
|
||
|
||
付费功能 FLOWGRAM 是否支持 未来计划支持
|
||
分组 支持\
|
||
redo/undo 支持\
|
||
copy/paste 支持\
|
||
HelpLines 辅助线 支持\
|
||
自定义节点及形状 支持\
|
||
自定义线条 支持\
|
||
AutoLayout,自动布局整理 支持\
|
||
ForceLayout,节点排斥效果 不支持 No
|
||
Expand/Collapse 支持\
|
||
Collaborative 多人协同 不支持 Yes
|
||
WorkflowBuilder 相当于固定布局完整案例 支持
|
||
|
||
* Reactflow 事件都是绑定在原子化的 dom 节点上,且内置,交互定制成本高,需要理解它的源码才能深度开发,如下,在画布缩放很小时候无法选到点位
|
||
|
||
|
||
|
||
---
|
||
url: /guide/concepts/variable-engine.md
|
||
---
|
||
|
||
#
|
||
|
||
整体设计#
|
||
|
||
架构分层#
|
||
|
||
架构分层
|
||
|
||
变量引擎设计上遵循 DIP(依赖反转)原则,按照 代码稳定性、抽象层次 以及和 业务的远近 分为三层:
|
||
|
||
* 变量抽象层:变量架构中抽象层次最高,代码也最为稳定的部分
|
||
* 变量实现层:变量架构中变动较大,不同业务之间通常存在调整的部分
|
||
* 变量业务层:变量架构中提供给业务的 Facade ,与画布引擎、节点引擎联动的部分
|
||
|
||
术语表#
|
||
|
||
🌟 作用域(Scope)#
|
||
|
||
⭐️⭐️⭐️ 定义:
|
||
|
||
一种约定的空间,空间内 通过 AST 来描述变量声明和消费情况
|
||
|
||
* 约定的空间:空间是什么,完全由业务定义
|
||
* 在低代码设计态中,可以是一个节点、一个组件、一个右侧面板...
|
||
* 在一段代码中,可以是一行 Statement、一段代码块、一个函数、一个文件...
|
||
|
||
作用域的空间是什么?可以由不同的业务来划定。
|
||
|
||
🌟 抽象语法树(AST)#
|
||
|
||
定义:
|
||
|
||
⭐️⭐️⭐️ 一种协议,通过树的形式,组合 AST 节点,实现对变量信息的显式/隐式 CRUD
|
||
|
||
* AST 节点:AST 中可响应式的协议节点
|
||
* 显式 CRUD,如:业务显示设定一个变量的变量类型
|
||
* 隐式 CRUD,如:业务声明一个变量,变量会根据其初始化参数自动推导变量类型
|
||
|
||
作用域里面的变量、类型、表达式、结构体 等等变量信息... 本质上都是 AST 节点的组合
|
||
|
||
* 变量 -> VariableDeclaration 节点
|
||
* 表达式 -> Expression 节点
|
||
* 类型 -> TypeNode 节点
|
||
* 结构体 -> StructDeclaration 节点
|
||
|
||
参考链接:https://ts-ast-viewer.com/
|
||
|
||
变量(Variable)#
|
||
|
||
定义:
|
||
|
||
一种用于声明新变量的 AST 节点,通过唯一标识符 指向一个 在特定集合范围内变动的值
|
||
|
||
* 在特定集合范围内变动的值:变量的值必须在 变量类型 描述的范围内
|
||
* 唯一标识符:变量必须有一个唯一的 Key 值
|
||
|
||
JavaScript中的变量,唯一 Key + 指向一个变动的值
|
||
|
||
变量类型(Variable Type)#
|
||
|
||
定义:
|
||
|
||
⭐️⭐️⭐️ 一种 AST 节点,用于约束一个变量,被约束的变量值只能在预先设定的集合范围内变动
|
||
|
||
* 一个变量可以绑定一个变量类型
|
||
|
||
变量引擎的形象理解#
|
||
|
||
想像这样一个变量引擎的世界:
|
||
|
||
* 通过一个个 作用域 来划定出一个个 国家
|
||
* 每个国家包含三大公民:声明、类型、表达式
|
||
* 国家与国家之间通过 作用域链 来实现交流
|
||
|
||
|
||
|
||
---
|
||
url: /guide/contact-us.md
|
||
---
|
||
|
||
#
|
||
|
||
* Issues: Issues
|
||
* Discord: https://discord.gg/SwDWdrgA9f
|
||
* Lark: 通过 注册飞书 并扫描下边的二维码加入飞书群
|
||
|
||
|
||
|
||
---
|
||
url: /guide/getting-started/create-fixed-layout-simple.md
|
||
---
|
||
|
||
#
|
||
|
||
本案例可通过 npx @flowgram.ai/create-app@latest fixed-layout-simple 安装,完整代码及效果见:
|
||
|
||
文件结构:
|
||
|
||
1. 画布入口#
|
||
|
||
* FixedLayoutEditorProvider: 画布配置器, 内部会生成 react-context 供子组件消费
|
||
* EditorRenderer: 为最终渲染的画布,可以包装在其他组件下边方便定制画布位置
|
||
|
||
2. 配置画布#
|
||
|
||
画布配置采用声明式,提供 数据、渲染、事件、插件相关配置
|
||
|
||
3. 配置数据#
|
||
|
||
画布文档数据采用树形结构,支持嵌套
|
||
|
||
文档数据基本结构:
|
||
|
||
* nodes array 节点列表, 支持嵌套
|
||
|
||
节点数据基本结构:
|
||
|
||
* id: string 节点唯一标识, 必须保证唯一
|
||
* meta: object 节点的 ui 配置信息,如自由布局的 position 信息放这里
|
||
* type: string | number 节点类型,会和 nodeRegistries 中的 type 对应
|
||
* data: object 节点表单数据
|
||
* blocks: array 节点的分支, 采用 block 更贴近 Gramming
|
||
|
||
4. 声明节点#
|
||
|
||
声明节点可以用于确定节点的类型及渲染方式
|
||
|
||
5. 渲染节点#
|
||
|
||
渲染节点用于添加样式、事件及表单渲染的位置
|
||
|
||
6. 添加工具#
|
||
|
||
工具主要用于控制画布缩放等操作, 工具汇总在 usePlaygroundTools 中, 而 useClientContext 用于获取画布的上下文,
|
||
里边包含画布的核心模块如 history
|
||
|
||
7. 效果#
|
||
|
||
|
||
|
||
---
|
||
url: /guide/getting-started/create-free-layout-simple.md
|
||
---
|
||
|
||
#
|
||
|
||
本案例可通过 npx @flowgram.ai/create-app@latest free-layout-simple 安装,完整代码及效果见:
|
||
|
||
文件结构:
|
||
|
||
1. 画布入口#
|
||
|
||
* FreeLayoutEditorProvider: 画布配置器, 内部会生成 react-context 供子组件消费
|
||
* EditorRenderer: 为最终渲染的画布,可以包装在其他组件下边方便定制画布位置
|
||
|
||
2. 配置画布#
|
||
|
||
画布配置采用声明式,提供 数据、渲染、事件、插件相关配置
|
||
|
||
3. 配置数据#
|
||
|
||
画布文档数据采用树形结构,支持嵌套
|
||
|
||
文档数据基本结构:
|
||
|
||
* nodes array 节点列表, 支持嵌套
|
||
* edges array 边列表
|
||
|
||
节点数据基本结构:
|
||
|
||
* id: string 节点唯一标识, 必须保证唯一
|
||
* meta: object 节点的 ui 配置信息,如自由布局的 position 信息放这里
|
||
* type: string | number 节点类型,会和 nodeRegistries 中的 type 对应
|
||
* data: object 节点表单数据, 业务可自定义
|
||
* blocks: array 节点的分支, 采用 block 更贴近 Gramming, 目前会存子画布的节点
|
||
* edges: array 子画布的边数据
|
||
|
||
边数据基本结构:
|
||
|
||
* sourceNodeID: string 开始节点 id
|
||
* targetNodeID: string 目标节点 id
|
||
* sourcePortID?: string | number 开始端口 id, 缺省则采用开始节点的默认端口
|
||
* targetPortID?: string | number 目标端口 id, 缺省则采用目标节点的默认端口
|
||
|
||
4. 声明节点#
|
||
|
||
声明节点可以用于确定节点的类型及渲染方式
|
||
|
||
5. 渲染节点#
|
||
|
||
渲染节点用于添加样式、事件及表单渲染的位置
|
||
|
||
6. 添加工具#
|
||
|
||
工具主要用于控制画布缩放等操作, 工具汇总在 usePlaygroundTools 中, 而 useClientContext 用于获取画布的上下文,
|
||
里边包含画布的核心模块如 history
|
||
|
||
7. 效果#
|
||
|
||
|
||
|
||
---
|
||
url: /guide/getting-started/install.md
|
||
---
|
||
|
||
#
|
||
|
||
通过 npx 安装#
|
||
|
||
通过 npm 安装#
|
||
|
||
|
||
|
||
---
|
||
url: /guide/question.md
|
||
---
|
||
|
||
#
|
||
|
||
运行报报错#
|
||
|
||
如何修改节点的数据#
|
||
|
||
是否支持 vue#
|
||
|
||
#
|
||
|
||
|
||
|
||
---
|
||
url: /index.md
|
||
---
|
||
|
||
|
||
|