|
|
@@ -0,0 +1,165 @@
|
|
|
+import { useMemo } from 'react';
|
|
|
+
|
|
|
+import { createMinimapPlugin } from '@flowgram.ai/minimap-plugin';
|
|
|
+import { createFreeSnapPlugin } from '@flowgram.ai/free-snap-plugin';
|
|
|
+import {
|
|
|
+ FreeLayoutProps,
|
|
|
+ WorkflowNodeProps,
|
|
|
+ WorkflowNodeRenderer,
|
|
|
+ Field,
|
|
|
+ useNodeRender,
|
|
|
+ FlowNodeRegistry,
|
|
|
+ WorkflowJSON,
|
|
|
+} from '@flowgram.ai/free-layout-editor';
|
|
|
+
|
|
|
+import { DEFAULT_DEMO_REGISTRY } from '../node-registries';
|
|
|
+import { DEFAULT_INITIAL_DATA } from '../initial-data';
|
|
|
+
|
|
|
+interface EditorProps {
|
|
|
+ registries: FlowNodeRegistry[];
|
|
|
+ initialData: WorkflowJSON;
|
|
|
+}
|
|
|
+
|
|
|
+export const useEditorProps = ({
|
|
|
+ registries = [DEFAULT_DEMO_REGISTRY],
|
|
|
+ initialData = DEFAULT_INITIAL_DATA,
|
|
|
+}: EditorProps) =>
|
|
|
+ useMemo<FreeLayoutProps>(
|
|
|
+ () => ({
|
|
|
+ /**
|
|
|
+ * Whether to enable the background
|
|
|
+ */
|
|
|
+ background: true,
|
|
|
+ /**
|
|
|
+ * Whether it is read-only or not, the node cannot be dragged in read-only mode
|
|
|
+ */
|
|
|
+ readonly: false,
|
|
|
+ /**
|
|
|
+ * Initial data
|
|
|
+ * 初始化数据
|
|
|
+ */
|
|
|
+ initialData,
|
|
|
+ /**
|
|
|
+ * Node registries
|
|
|
+ * 节点注册
|
|
|
+ */
|
|
|
+ nodeRegistries: registries,
|
|
|
+ /**
|
|
|
+ * Get the default node registry, which will be merged with the 'nodeRegistries'
|
|
|
+ * 提供默认的节点注册,这个会和 nodeRegistries 做合并
|
|
|
+ */
|
|
|
+ getNodeDefaultRegistry(type) {
|
|
|
+ return {
|
|
|
+ type,
|
|
|
+ meta: {
|
|
|
+ defaultExpanded: true,
|
|
|
+ },
|
|
|
+ formMeta: {
|
|
|
+ /**
|
|
|
+ * Render form
|
|
|
+ */
|
|
|
+ render: () => (
|
|
|
+ <>
|
|
|
+ <Field<string> name="title">
|
|
|
+ {({ field }) => <div className="demo-free-node-title">{field.value}</div>}
|
|
|
+ </Field>
|
|
|
+ <div className="demo-free-node-content">
|
|
|
+ <Field<string> name="content">
|
|
|
+ <input />
|
|
|
+ </Field>
|
|
|
+ </div>
|
|
|
+ </>
|
|
|
+ ),
|
|
|
+ },
|
|
|
+ };
|
|
|
+ },
|
|
|
+ materials: {
|
|
|
+ /**
|
|
|
+ * Render Node
|
|
|
+ */
|
|
|
+ renderDefaultNode: (props: WorkflowNodeProps) => {
|
|
|
+ const { form } = useNodeRender();
|
|
|
+ return (
|
|
|
+ <WorkflowNodeRenderer className="demo-free-node" node={props.node}>
|
|
|
+ {form?.render()}
|
|
|
+ </WorkflowNodeRenderer>
|
|
|
+ );
|
|
|
+ },
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ * Content change
|
|
|
+ */
|
|
|
+ onContentChange(ctx, event) {
|
|
|
+ // console.log('Auto Save: ', event, ctx.document.toJSON());
|
|
|
+ },
|
|
|
+ // /**
|
|
|
+ // * Node engine enable, you can configure formMeta in the FlowNodeRegistry
|
|
|
+ // */
|
|
|
+ nodeEngine: {
|
|
|
+ enable: true,
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ * Redo/Undo enable
|
|
|
+ */
|
|
|
+ history: {
|
|
|
+ enable: true,
|
|
|
+ enableChangeNode: true, // Listen Node engine data change
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ * Playground init
|
|
|
+ */
|
|
|
+ onInit: (ctx) => {},
|
|
|
+ /**
|
|
|
+ * Playground render
|
|
|
+ */
|
|
|
+ onAllLayersRendered(ctx) {
|
|
|
+ // Fitview
|
|
|
+ ctx.document.fitView(false);
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ * Playground dispose
|
|
|
+ */
|
|
|
+ onDispose() {
|
|
|
+ console.log('---- Playground Dispose ----');
|
|
|
+ },
|
|
|
+ plugins: () => [
|
|
|
+ /**
|
|
|
+ * Minimap plugin
|
|
|
+ * 缩略图插件
|
|
|
+ */
|
|
|
+ createMinimapPlugin({
|
|
|
+ disableLayer: true,
|
|
|
+ canvasStyle: {
|
|
|
+ canvasWidth: 182,
|
|
|
+ canvasHeight: 102,
|
|
|
+ canvasPadding: 50,
|
|
|
+ canvasBackground: 'rgba(245, 245, 245, 1)',
|
|
|
+ canvasBorderRadius: 10,
|
|
|
+ viewportBackground: 'rgba(235, 235, 235, 1)',
|
|
|
+ viewportBorderRadius: 4,
|
|
|
+ viewportBorderColor: 'rgba(201, 201, 201, 1)',
|
|
|
+ viewportBorderWidth: 1,
|
|
|
+ viewportBorderDashLength: 2,
|
|
|
+ nodeColor: 'rgba(255, 255, 255, 1)',
|
|
|
+ nodeBorderRadius: 2,
|
|
|
+ nodeBorderWidth: 0.145,
|
|
|
+ nodeBorderColor: 'rgba(6, 7, 9, 0.10)',
|
|
|
+ overlayColor: 'rgba(255, 255, 255, 0)',
|
|
|
+ },
|
|
|
+ inactiveDebounceTime: 1,
|
|
|
+ }),
|
|
|
+ /**
|
|
|
+ * Snap plugin
|
|
|
+ * 自动对齐及辅助线插件
|
|
|
+ */
|
|
|
+ createFreeSnapPlugin({
|
|
|
+ edgeColor: '#00B2B2',
|
|
|
+ alignColor: '#00B2B2',
|
|
|
+ edgeLineWidth: 1,
|
|
|
+ alignLineWidth: 1,
|
|
|
+ alignCrossWidth: 8,
|
|
|
+ }),
|
|
|
+ ],
|
|
|
+ }),
|
|
|
+ []
|
|
|
+ );
|