From 443252a643a43e0748f7e290dd61ea48bc3d1bff Mon Sep 17 00:00:00 2001 From: chenos Date: Tue, 24 Jun 2025 10:32:14 +0800 Subject: [PATCH] fix: improve code --- .../flow-engine/src/resources/apiResource.ts | 2 +- .../src/client/CodeEditor.tsx | 28 ++++++++++++---- .../src/client/LowcodeBlockFlowModel.tsx | 32 +++++++++++++------ 3 files changed, 44 insertions(+), 18 deletions(-) diff --git a/packages/core/flow-engine/src/resources/apiResource.ts b/packages/core/flow-engine/src/resources/apiResource.ts index 62bda8cad7..3472a8a026 100644 --- a/packages/core/flow-engine/src/resources/apiResource.ts +++ b/packages/core/flow-engine/src/resources/apiResource.ts @@ -85,7 +85,7 @@ export class APIResource extends FlowResource { url: this.getURL(), ...this.getRefreshRequestOptions(), }); - this.setData(data?.data); + this.setData(data); } protected getRefreshRequestOptions() { diff --git a/packages/plugins/@nocobase/plugin-block-lowcode/src/client/CodeEditor.tsx b/packages/plugins/@nocobase/plugin-block-lowcode/src/client/CodeEditor.tsx index cc9fe7220b..1e076145e8 100644 --- a/packages/plugins/@nocobase/plugin-block-lowcode/src/client/CodeEditor.tsx +++ b/packages/plugins/@nocobase/plugin-block-lowcode/src/client/CodeEditor.tsx @@ -7,40 +7,54 @@ * For more information, please refer to: https://www.nocobase.com/agreement. */ -import React, { useRef, useEffect } from 'react'; import { connect, mapProps } from '@formily/react'; +import React, { useEffect, useRef } from 'react'; // CodeMirror imports -import { EditorView, basicSetup } from 'codemirror'; -import { javascript } from '@codemirror/lang-javascript'; -import { oneDark } from '@codemirror/theme-one-dark'; -import { EditorState } from '@codemirror/state'; import { autocompletion, CompletionContext, CompletionResult } from '@codemirror/autocomplete'; +import { javascript } from '@codemirror/lang-javascript'; import { lintGutter } from '@codemirror/lint'; +import { EditorState } from '@codemirror/state'; +import { oneDark } from '@codemirror/theme-one-dark'; +import { basicSetup, EditorView } from 'codemirror'; import { createJavaScriptLinter } from './linter'; // 自定义自动补全函数 const createCustomCompletion = () => { const contextVariables = [ + { + label: 'getModelById', + type: 'function', + info: 'Get a model instance by its UID', + detail: '(uid: string) => FlowModel | null', + boost: 101, + }, { label: 'element', type: 'variable', info: 'The DOM element to render into', detail: 'HTMLElement', - boost: 99, + boost: 100, }, { label: 'ctx', type: 'variable', info: 'Flow context object', detail: 'FlowContext', - boost: 98, + boost: 99, }, { label: 'model', type: 'variable', info: 'Current model instance', detail: 'FlowModel', + boost: 98, + }, + { + label: 'resource', + type: 'variable', + info: 'Current resource instance', + detail: 'APIResource', boost: 97, }, { diff --git a/packages/plugins/@nocobase/plugin-block-lowcode/src/client/LowcodeBlockFlowModel.tsx b/packages/plugins/@nocobase/plugin-block-lowcode/src/client/LowcodeBlockFlowModel.tsx index 4f3a6c5302..2e52033c56 100644 --- a/packages/plugins/@nocobase/plugin-block-lowcode/src/client/LowcodeBlockFlowModel.tsx +++ b/packages/plugins/@nocobase/plugin-block-lowcode/src/client/LowcodeBlockFlowModel.tsx @@ -9,7 +9,7 @@ import { BlockModel } from '@nocobase/client'; import { APIResource } from '@nocobase/flow-engine'; -import { Card, Spin } from 'antd'; +import { Card, Skeleton, Spin } from 'antd'; import React, { createRef } from 'react'; import { CodeEditor } from './CodeEditor'; @@ -30,13 +30,9 @@ export class LowcodeBlockFlowModel extends BlockModel { return ( - {loading && ( -
- -
Loading lowcode component...
-
- )} -
+ +
+ ); } @@ -98,6 +94,9 @@ LowcodeBlockFlowModel.registerFlow({ steps: { setMainResource: { handler(ctx) { + if (ctx.model.resource) { + return; + } ctx.model.resource = new APIResource(); ctx.model.resource.setAPIClient(ctx.globals.api); }, @@ -199,17 +198,30 @@ element.innerHTML = \` }); }; + const getModelById = (uid: string) => { + return ctx.globals.flowEngine.getModel(uid); + }; + // Create a safe execution context for the code (as async function) // Wrap user code in an async function const wrappedCode = ` - return (async function(element, ctx, model, requirejs, requireAsync, loadCSS) { + return (async function(element, ctx, model, resource, requirejs, requireAsync, loadCSS, getModelById) { ${params.code} }).apply(this, arguments); `; const executionFunction = new Function(wrappedCode); // Execute the code - await executionFunction(element, ctx, ctx.model, requirejs, requireAsync, loadCSS); + await executionFunction( + element, + ctx, + ctx.model, + ctx.model.resource, + requirejs, + requireAsync, + loadCSS, + getModelById, + ); ctx.model.setProps('loading', false); } catch (error: any) {